Line data Source code
1 : //-*- Mode: C++ -*-
2 : // $Id$
3 :
4 : #ifndef ALIHLTOUTCOMPONENT_H
5 : #define ALIHLTOUTCOMPONENT_H
6 : //* This file is property of and copyright by the *
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 : #include "AliHLTDataSink.h"
17 :
18 : class AliHLTHOMERLibManager;
19 : class AliHLTMonitoringWriter;
20 : class TFile;
21 : class TTree;
22 : typedef vector<AliHLTMonitoringWriter*> AliHLTMonitoringWriterPVector;
23 :
24 : /**
25 : * @class AliHLTOUTComponent
26 : * The HLTOUT data sink component which models the behavior of the HLTOUT
27 : * nodes of the HLT cluster.
28 : * <h2>General properties:</h2>
29 : * The HLTOUT component is attached at the end of a chain. It stores all input
30 : * block in the HOMER format, distributed over a number of DDL link. The data
31 : * is stored in a digit file or in raw ddl files.
32 : *
33 : * Component ID: \b HLTOUT <br>
34 : * Library: \b libHLTrec.so <br>
35 : * Input Data Types: @ref kAliHLTAnyDataType <br>
36 : * Output Data Types: none (offline data sink) <br>
37 : *
38 : * <h2>Mandatory arguments:</h2>
39 : * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
40 : *
41 : * <h2>Optional arguments:</h2>
42 : * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
43 : * \li -links <i> n </i> <br>
44 : * number of output ddl links
45 : * \li -digitfile <i> name </i> <br>
46 : * name of the digit file to write (default HLT.Digits.root)
47 : * \li -rawout[=on,off] <br>
48 : * switch raw output on/off (default on)
49 : * \li -digitout[=on,off] <br>
50 : * switch digit output on/off (default on)
51 : *
52 : * <h2>Configuration:</h2>
53 : * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
54 : * none
55 : *
56 : * <h2>Default CDB entries:</h2>
57 : * none
58 : *
59 : * <h2>Performance:</h2>
60 : * The component does not any event data processing.
61 : *
62 : * <h2>Memory consumption:</h2>
63 : * The component does not any event data processing.
64 : *
65 : * <h2>Output size:</h2>
66 : * The component is an offline sink component and has no output data.
67 : *
68 : * The component can be used to write data in the same format as
69 : * the HLTOUT on the real HLT. In case of AliRoot simulation, the
70 : * component is automatically added to the chain if the specified
71 : * chains have output data. By that means, the HLT output is added
72 : * to the simulation.
73 : *
74 : * @ingroup alihlt_aliroot_simulation
75 : */
76 : class AliHLTOUTComponent : public AliHLTDataSink {
77 : public:
78 : /// type of the HLTOUT component
79 : enum EType {
80 : kGlobal = 0, // generate according to global flags
81 : kDigits = 1, // generate only digits: ID HLTOUTdigits
82 : kRaw = 2 // generate only raw: ID HLTOUTraw
83 : };
84 : /// constructor for different component types
85 : AliHLTOUTComponent(EType type=kGlobal);
86 : /** destructor */
87 : virtual ~AliHLTOUTComponent();
88 :
89 : const char* GetComponentID();
90 : void GetInputDataTypes( AliHLTComponentDataTypeList& list);
91 : AliHLTComponent* Spawn();
92 :
93 : /**
94 : * Enable global options valid for all instances of the component
95 : * @param options bit field
96 : */
97 : static void SetGlobalOption(unsigned int options);
98 :
99 : /**
100 : * Disable global options valid for all instances of the component
101 : * @param options bit field
102 : */
103 : static void ClearGlobalOption(unsigned int options);
104 :
105 : /**
106 : * Test one of the global options
107 : */
108 : static bool TestGlobalOption(unsigned int option);
109 :
110 : enum {
111 : /** write the raw files of the HLT links */
112 : kWriteRawFiles = 0x1,
113 : /** write the digit file */
114 : kWriteDigits = 0x2
115 : };
116 :
117 : protected:
118 : /**
119 : * Init method.
120 : */
121 : int DoInit( int argc, const char** argv );
122 :
123 : /// inherited from AliHLTComponent, component specific argument scan
124 : int ScanConfigurationArgument(int argc, const char** argv);
125 :
126 : /**
127 : * Deinit method.
128 : */
129 : int DoDeinit();
130 :
131 : /**
132 : * Data processing method for the component.
133 : * The function can be overloaded by other file writer components.
134 : * @param evtData event data structure
135 : * @param blocks input data block descriptors
136 : * @param trigData trigger data structure
137 : */
138 : int DumpEvent( const AliHLTComponentEventData& evtData,
139 : const AliHLTComponentBlockData* blocks,
140 : AliHLTComponentTriggerData& trigData );
141 :
142 : using AliHLTDataSink::DumpEvent;
143 :
144 : /**
145 : * Write the ecoded HLTOUT data to raw and digits files.
146 : * Originally data was written in the FillESD function of the
147 : * AliHLTOfflineInterface. Mainly for the sake of availability of the
148 : * AliLoader. This concept has not turned out to be succesful and the
149 : * development went a slightly different direction with the concept of
150 : * HLTOUT handlers.
151 : * 2010-04-14 change the original FillESD() to Write(), keep the body
152 : * of the function
153 : *
154 : * @param eventNo event No. \em Note: this is an internal enumeration of the
155 : * processed events.
156 : * @param runLoader the AliRoot runloader
157 : * @return neg. error code if failed
158 : */
159 : int Write(int eventNo);
160 :
161 : private:
162 : /** copy constructor prohibited */
163 : AliHLTOUTComponent(const AliHLTOUTComponent&);
164 : /** assignment operator prohibited */
165 : AliHLTOUTComponent& operator=(const AliHLTOUTComponent&);
166 :
167 : int ShuffleWriters(AliHLTMonitoringWriterPVector &list, AliHLTUInt32_t size);
168 :
169 : /**
170 : * Fill the output buffer and allocate if neccessary.
171 : * Assemble ouput buffer with Common Data Header, HLT header and data from the
172 : * writer. Works on the same buffer witch is allocated once and eventually
173 : * grown in order to avoid frequent allocs/deallocs.
174 : * @param eventNo number of the event
175 : * @param pWriter [IN] the HOMER writer
176 : * @param pBuffer [OUT] target to receive the pointer to buffer
177 : * @return size of the buffer
178 : */
179 : int FillOutputBuffer(int eventNo, AliHLTMonitoringWriter* pWriter, const AliHLTUInt8_t* &pBuffer);
180 :
181 : /**
182 : * Write data for a DDL link.
183 : * @param hltddl Number of DDL link within the range of HLT
184 : * @param pBuffer buffer to write
185 : * @param bufferSize size of the buffer
186 : */
187 : int WriteDigitArray(int hltddl, const AliHLTUInt8_t* pBuffer, unsigned int bufferSize);
188 :
189 : /**
190 : * Write the digits for one DDL
191 : * @param eventNo number of the event
192 : * @return neg. error if failed
193 : */
194 : int WriteDigits(int eventNo);
195 :
196 : /**
197 : * Write the raw file for one DDL
198 : * @param eventNo number of the event
199 : * @param hltddl Number of DDL link within the range of HLT
200 : * @param pBuffer buffer to write
201 : * @param size size of the buffer
202 : * @return neg. error if failed
203 : */
204 : int WriteRawFile(int eventNo, int hltddl, const AliHLTUInt8_t* pBuffer, unsigned int size);
205 :
206 : /** list of HOMER writers */
207 : AliHLTMonitoringWriterPVector fWriters; //!transient
208 :
209 : /** number of DDLs used*/
210 : int fNofDDLs; //!transient
211 :
212 : /** equipment ID of first HLT DDL */
213 : int fIdFirstDDL; //!transient
214 :
215 : /** output buffer, allocated once in order to avoid frequent alloc/dealloc */
216 : vector<AliHLTUInt8_t> fBuffer; //!transient
217 :
218 : /** instance of the HOMER library manager */
219 : AliHLTHOMERLibManager* fpLibManager; // !transient
220 :
221 : /** global options for all instances */
222 : static int fgOptions; //! transient
223 :
224 : /// component options set from component type or global options at DoInit
225 : int fOptions; //! transient
226 :
227 : /** digit file name */
228 : TString fDigitFileName; //! transient
229 :
230 : /** the root file for the HLT 'digit' output */
231 : TFile* fpDigitFile; //!transient
232 :
233 : /** the tree for the HLT 'digit' output */
234 : TTree* fpDigitTree; //!transient
235 :
236 : /** array of TArrayC output buffers and branches */
237 : TArrayC** fppDigitArrays; //!transient
238 :
239 : /** Id of HOMER writer kept from previous event */
240 : int fReservedWriter; //!transient
241 :
242 : /** Data size kept in the internal buffer */
243 : int fReservedData; //!transient
244 :
245 : /// type of the component
246 : EType fType; //! type of the component
247 :
248 : /// counter for round robin usage of HLTOUT links
249 : int fRoundRobinCounter; //! counter for round robin usage of HLTOUT links
250 :
251 126 : ClassDef(AliHLTOUTComponent, 0)
252 : };
253 : #endif
|