722523af8c5727f4110243332f76ebc391ebf7f0
[u/mrichter/AliRoot.git] / HLT / sim / AliHLTOUTComponent.h
1 //-*- Mode: C++ -*-
2 // $Id$
3
4 #ifndef ALIHLTOUTCOMPONENT_H
5 #define ALIHLTOUTCOMPONENT_H
6 //* This file is property of and copyright by the ALICE HLT Project        * 
7 //* ALICE Experiment at CERN, All rights reserved.                         *
8 //* See cxx source for full Copyright notice                               *
9
10 //  @file   AliHLTOUTComponent.h
11 //  @author Matthias Richter
12 //  @date   
13 //  @brief  The HLTOUT data sink component similar to HLTOUT nodes.
14 //  @note   Used in the AliRoot environment only.
15
16 // see class description below
17 // or
18 // refer to README to build package
19 // or
20 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
21
22 #include "AliHLTOfflineDataSink.h"
23
24 class AliHLTHOMERLibManager;
25 class AliHLTMonitoringWriter;
26 class TFile;
27 class TTree;
28 typedef vector<AliHLTMonitoringWriter*> AliHLTMonitoringWriterPVector;
29
30 /**
31  * @class AliHLTOUTComponent
32  * The HLTOUT data sink component which models the behavior of the HLTOUT
33  * nodes of the HLT cluster.
34  * <h2>General properties:</h2>
35  * The HLTOUT component is attached at the end of a chain. It stores all input
36  * block in the HOMER format, distributed over a number of DDL link. The data
37  * is stored in a digit file or in raw ddl files.
38  *
39  * Component ID: \b HLTOUT <br>
40  * Library: \b libHLTrec.so     <br>
41  * Input Data Types: @ref kAliHLTAnyDataType <br>
42  * Output Data Types: none (offline data sink) <br>
43  *
44  * <h2>Mandatory arguments:</h2>
45  * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
46  *
47  * <h2>Optional arguments:</h2>
48  * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
49  * \li -links      <i> n   </i> <br>
50  *      number of output ddl links
51  * \li -digitfile  <i> name   </i> <br>
52  *
53  * <h2>Configuration:</h2>
54  * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
55  * none
56  *
57  * <h2>Default CDB entries:</h2>
58  * none
59  *
60  * <h2>Performance:</h2>
61  * The component does not any event data processing.
62  *
63  * <h2>Memory consumption:</h2>
64  * The component does not any event data processing.
65  *
66  * <h2>Output size:</h2>
67  * The component is an offline sink component and has no output data.
68  *
69  * The component can be used to write data in the same format as
70  * the HLTOUT on the real HLT. In case of AliRoot simulation, the
71  * component is automatically added to the chain if the specified
72  * chains have output data. By that means, the HLT output is added
73  * to the simulation.
74  *
75  * @ingroup alihlt_aliroot_simulation
76  */
77 class AliHLTOUTComponent : public AliHLTOfflineDataSink  {
78  public:
79   /** standard constructor */
80   AliHLTOUTComponent();
81   /** destructor */
82   virtual ~AliHLTOUTComponent();
83
84   const char* GetComponentID();
85   void GetInputDataTypes( vector<AliHLTComponentDataType>& list);
86   AliHLTComponent* Spawn();
87
88   /**
89    * Enable global options valid for all instances of the component
90    * @param options   bit field
91    */
92   static void SetGlobalOption(unsigned int options);
93
94   /**
95    * Disable global options valid for all instances of the component
96    * @param options   bit field
97    */
98   static void ClearGlobalOption(unsigned int options);
99
100   enum {
101     /** write the raw files of the HLT links */
102     kWriteRawFiles = 0x1,
103     /** write the digit file */
104     kWriteDigits = 0x2
105   };
106
107  protected:
108   /**
109    * Init method.
110    */
111   int DoInit( int argc, const char** argv );
112
113   /// inherited from AliHLTComponent,  component specific argument scan
114   int ScanConfigurationArgument(int argc, const char** argv);
115
116   /**
117    * Deinit method.
118    */
119   int DoDeinit();
120
121   /**
122    * Data processing method for the component.
123    * The function can be overloaded by other file writer components.
124    * @param evtData       event data structure
125    * @param blocks        input data block descriptors
126    * @param trigData      trigger data structure
127    */
128   int DumpEvent( const AliHLTComponentEventData& evtData,
129                  const AliHLTComponentBlockData* blocks, 
130                  AliHLTComponentTriggerData& trigData );
131
132   using AliHLTDataSink::DumpEvent;
133
134   /**
135    * Fill ESD for one event.
136    * @param eventNo       event No. \em Note: this is an internal enumeration of the
137    *                      processed events.
138    * @param runLoader     the AliRoot runloader
139    * @param esd           an AliESDEvent instance
140    * @return neg. error code if failed 
141    */
142   int FillESD(int eventNo, AliRunLoader* runLoader, AliESDEvent* esd);
143
144  private:
145   /** copy constructor prohibited */
146   AliHLTOUTComponent(const AliHLTOUTComponent&);
147   /** assignment operator prohibited */
148   AliHLTOUTComponent& operator=(const AliHLTOUTComponent&);
149
150   int ShuffleWriters(AliHLTMonitoringWriterPVector &list, AliHLTUInt32_t size);
151
152   /**
153    * Fill the output buffer and allocate if neccessary.
154    * Assemble ouput buffer with Common Data Header, HLT header and data from the
155    * writer. Works on the same buffer witch is allocated once and eventually
156    * grown in order to avoid frequent allocs/deallocs.   
157    * @param eventNo    number of the event
158    * @param pWriter    [IN]  the HOMER writer
159    * @param pBuffer    [OUT] target to receive the pointer to buffer
160    * @return size of the buffer
161    */
162   int FillOutputBuffer(int eventNo, AliHLTMonitoringWriter* pWriter, const AliHLTUInt8_t* &pBuffer);
163
164   /**
165    * Write data for a DDL link.
166    * @param hltddl     Number of DDL link within the range of HLT
167    * @param pBuffer    buffer to write
168    * @param bufferSize size of the buffer
169    */
170   int WriteDigitArray(int hltddl, const AliHLTUInt8_t* pBuffer, unsigned int bufferSize);
171
172   /**
173    * Write the digits for one DDL
174    * @param eventNo    number of the event
175    * @param runLoader  AliRoot run loader instance
176    * @return neg. error if failed
177    */
178   int WriteDigits(int eventNo, AliRunLoader* runLoader);
179
180   /**
181    * Write the raw file for one DDL
182    * @param eventNo    number of the event
183    * @param runLoader  AliRoot run loader instance
184    * @param hltddl     Number of DDL link within the range of HLT
185    * @param pBuffer    buffer to write
186    * @param size       size of the buffer
187    * @return neg. error if failed
188    */
189   int WriteRawFile(int eventNo, AliRunLoader* runLoader, int hltddl, const AliHLTUInt8_t* pBuffer, unsigned int size);
190
191   /** list of HOMER writers */
192   AliHLTMonitoringWriterPVector fWriters; //!transient
193
194   /** number of DDLs used*/
195   int fNofDDLs; //!transient
196
197   /** equipment ID of first HLT DDL */
198   int fIdFirstDDL; //!transient
199
200   /** output buffer, allocated once in order to avoid frequent alloc/dealloc */
201   vector<AliHLTUInt8_t> fBuffer; //!transient
202
203   /** instance of the HOMER library manager */
204   AliHLTHOMERLibManager* fpLibManager; // !transient
205
206   /** global options for all instances */
207   static int fgOptions; //! transient
208
209   /** digit file name */
210   TString fDigitFileName; //! transient
211
212   /** the root file for the HLT 'digit' output */
213   TFile* fpDigitFile; //!transient
214
215   /** the tree for the HLT 'digit' output */
216   TTree* fpDigitTree; //!transient
217
218   /** array of TArrayC output buffers and branches */
219   TArrayC** fppDigitArrays; //!transient
220
221   /** Id of HOMER writer kept from previous event */
222   int fReservedWriter; //!transient
223
224   /** Data size kept in the internal buffer */
225   int fReservedData; //!transient
226
227   ClassDef(AliHLTOUTComponent, 4)
228 };
229 #endif