]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/BASE/util/AliHLTFileWriter.h
Fixing in/out tags in documentation
[u/mrichter/AliRoot.git] / HLT / BASE / util / AliHLTFileWriter.h
CommitLineData
a9c4e244 1// -*- Mode: C++ -*-
4b31e06b 2// $Id$
e74abd18 3
4#ifndef ALIHLTFILEWRITER_H
5#define ALIHLTFILEWRITER_H
6daf06e2 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 *
e74abd18 9
10/** @file AliHLTFileWriter.h
11 @author Matthias Richter
12 @date
13 @brief An HLT file dump (data sink) component.
14*/
15
16#include "AliHLTDataSink.h"
5df0cbb9 17#include <TString.h>
e74abd18 18
4b31e06b 19class AliHLTBlockDataCollection;
20
e74abd18 21/**
22 * @class AliHLTFileWriter
23 * An HLT data sink component which writes data to file(s).
24 *
6daf06e2 25 * <h2>General properties:</h2>
e74abd18 26 *
6daf06e2 27 * Component ID: \b FileWriter <br>
28 * Library: \b libAliHLTUtil.so <br>
a7ad9794 29 * Input Data Types: ::kAliHLTAllDataTypes <br>
6daf06e2 30 * Output Data Types: none <br>
31 *
a7ad9794 32 * \b Note: ::kAliHLTAllDataTypes contains both ::kAliHLTAnyDataType and
33 * ::kAliHLTVoidDataType
6daf06e2 34 *
35 * <h2>Mandatory arguments:</h2>
1ac82ce6 36 * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
e74abd18 37 *
6daf06e2 38 * <h2>Optional arguments:</h2>
1ac82ce6 39 * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
e74abd18 40 * \li -datafile <i> filename </i> <br>
41 * file name base
42 * \li -directory <i> directory </i> <br>
43 * target directory
5ab95e9a 44 * \li -subdir[=pattern] <br>
6daf06e2 45 * create sub dir for each event, the format pattern can contain printf
46 * specifiers to print the event no into the dir name, default is
2cb9ea42 47 * 'event%%03lu' (-subdir w/o additional pattern). The format specifyer
48 * %%lu is automatically added if missing in the pattern. Please note the
49 * \b long int type of the event id <br>
6daf06e2 50 * \b note: the idfmt string is reset since the subdir contains the id
5ab95e9a 51 * \li -idfmt[=pattern] <br>
52 * format specifier for the event id in the file name, <br>
2cb9ea42 53 * default: on, default pattern: '_0x%%08x'
5ab95e9a 54 * \li -specfmt[=pattern] <br>
55 * format specifier for the data specification in the file name <br>
2cb9ea42 56 * default: off, default pattern: '_0x%%08x'
5ab95e9a 57 * \li -blocknofmt[=pattern] <br>
58 * format specifier for the block no in the file name <br>
2cb9ea42 59 * default: on, default pattern: '_0x%%02x'
60 * \li -skip-datatype <br>
61 * do not consider data type when building the file name.
e74abd18 62 * \li -enumerate <br>
63 * don't use the event number but an event counter beginning from 0
64 * \li -concatenate-blocks <br>
65 * concatenate all blocks of one event into one file, this skips
66 * the block no, and the block data type in the file name
67 * \li -concatenate-events <br>
68 * concatenate all events into one file, this skips the event no,
69 * the block no, and the block data type in the file name. Currently,
70 * this implies the -concatenate-blocks option.
a9c4e244 71 * \li -publisher-conf <i>filename</i> <br>
72 * write configuration file for FilePublisher component (AliHLTFilePublisher) <br>
73 * one line per file: -datatype id origin -datafile filename <br>
74 * events separated by -nextevent
6b7f77cf 75 * \li -write-all-events <br>
76 * by default, the file writer ignores all steering events like the
77 * the SOR/EOR events, with this option, all events will be considered
78 * the beginning.
79 * \li -write-all-blocks <br>
80 * by default, the file writer ignores all blocks of origin {PRIV}
81 * (::kAliHLTDataOriginPrivate), with this option, all blocks will
82 * be written. For SOR/EOR events, a short string will be added in
83 * the beginning.
84 * \li -write-all <br>
85 * combines both -write-all-events and -write-all-blocks
4b31e06b 86 * \li -burst-buffer <size> <br>
87 * size of burst buffer, blocks are written to buffer until it is filled
88 * and written in one burst (though to different files according to conf)<br>
89 * \b Note: burst write is currently only supported for mode
90 * -concatenate-events AND -concatenate-blocks (both enabled).
91 * \li -datatype <i> id origin </i> <br>
92 * data block selection by AliHLTBlockDataCollection
93 * \li -origin <i> origin </i> <br>
94 * data block selection by AliHLTBlockDataCollection
95 * \li -typeid <i> id </i> <br>
96 * data block selection by AliHLTBlockDataCollection
97 * \li -dataspec <i> specification </i> <br>
98 * data block selection by AliHLTBlockDataCollection
e74abd18 99 *
6daf06e2 100 * <h2>Configuration:</h2>
101 * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
a7ad9794 102 * Configuration by component arguments.
6daf06e2 103 *
104 * <h2>Default CDB entries:</h2>
105 * The component loads no CDB entries.
106 *
107 * <h2>Performance:</h2>
a7ad9794 108 * The component does not process any event data.
6daf06e2 109 *
110 * <h2>Memory consumption:</h2>
a7ad9794 111 * The component does not process any event data.
6daf06e2 112 *
113 * <h2>Output size:</h2>
a7ad9794 114 * No data published (AliHLTDataSink).
6daf06e2 115 *
116 *
5ab95e9a 117 * By default, file name is built from the basename, the event number, the
118 * block number and the data type in the format:
e74abd18 119 * <pre>
5ab95e9a 120 * basename_eventno_dt
e74abd18 121 * </pre>
122 * If the basename was not given, \em 'event' ist used instead. A file
123 * extension after the last dot is separated from the basename and appended
124 * to the final name.
125 *
5ab95e9a 126 * The naming rule can be changed by the -xxfmt options, which can contain
127 * printf format specifiers in order to print the corresponding variable. E.g.
128 * <pre>
129 * -specfmt append specification
2cb9ea42 130 * -subdir=test store in sub folders
131 * -blocknofmt=_0x%%x format block no in hex
132 * -idfmt=_%%04d print id in 4-digits decimal number
6daf06e2 133 * -idfmt= print no id
5ab95e9a 134 * </pre>
135 *
e74abd18 136 * The class can be used as a base class for file writers. Additional
137 * argument scan can be implemented in @ref ScanArgument which is called
138 * for each unknown argument.
a7ad9794 139 *
140 * @ingroup alihlt_util_components
e74abd18 141 */
142class AliHLTFileWriter : public AliHLTDataSink {
143 public:
144 /** standard constructor */
145 AliHLTFileWriter();
e74abd18 146 /** destructor */
147 virtual ~AliHLTFileWriter();
148
149 virtual const char* GetComponentID();
150 virtual void GetInputDataTypes( vector<AliHLTComponentDataType>& list);
151 virtual AliHLTComponent* Spawn();
152
153 protected:
154 /**
155 * Init method.
156 */
157 int DoInit( int argc, const char** argv );
158
159 /**
160 * Deinit method.
161 */
162 int DoDeinit();
163
164 /**
165 * Init the writer.
166 * The DoInit function is not available for child classes. InitWriter is the
167 * corresponding function for classes derived from AliHLTFileWriter.
168 */
169 virtual int InitWriter();
170
171 /**
79c114b5 172 * Close the writer.
e74abd18 173 * The DoDeinit function is not available for child classes. CloseWriter is the
174 * corresponding function for classes derived from AliHLTFileWriter.
175 */
176 virtual int CloseWriter();
177
178 /**
179 * Data processing method for the component.
180 * The function can be overloaded by other file writer components.
181 * @param evtData event data structure
e74abd18 182 * @param trigData trigger data structure
183 */
184 virtual int DumpEvent( const AliHLTComponentEventData& evtData,
e74abd18 185 AliHLTComponentTriggerData& trigData );
186
a8abc5d5 187 using AliHLTDataSink::DumpEvent;
188
e74abd18 189 /**
190 * Scan one argument and adjacent parameters.
191 * Can be overloaded by child classes in order to add additional arguments
192 * beyond the standard arguments of the file publisher. The method is called
193 * whenever a non-standard argument is recognized. Make sure to return
194 * <tt> -EPROTO </tt> if the argument is not recognized be the child.
195 * @param argc size of the argument array
196 * @param argv agument array for component initialization
197 * @return number of processed members of the argv <br>
198 * -EINVAL unknown argument <br>
199 * -EPROTO parameter for argument missing <br>
200 */
201 virtual int ScanArgument(int argc, const char** argv);
202
203 /**
204 * Build file name from eventID data type and the specified directory and basename.
9bb806cd 205 * @param [in] eventID the ID of the event
206 * @param [in] blockID the ID of the current block
e74abd18 207 * no block string appended if -1
9bb806cd 208 * @param [in] dataType the data type of the data block
e74abd18 209 * no type string appanded if @ref kAliHLTVoidDataType
9bb806cd 210 * @param [in] specification data specification of the block
211 * @param [out] filename string to receive the file name
e74abd18 212 */
5ab95e9a 213 int BuildFileName(const AliHLTEventID_t eventID, const int blockID,
214 const AliHLTComponentDataType& dataType,
215 const AliHLTUInt32_t specification,
216 TString& filename);
e74abd18 217
218 /**
219 * Set a mode flag.
220 * @return current mode flags
221 */
222 int SetMode(Short_t mode);
223
224 /**
225 * Clear a mode flag.
226 * @return current mode flags
227 */
228 int ClearMode(Short_t mode);
229
230 /**
231 * Check a mode flag.
232 * @return 1 if flag is set, 0 if not
233 */
5df0cbb9 234 int CheckMode(Short_t mode) const;
e74abd18 235
626bfcc1 236 /**
237 * Get the currently set file extension.
238 */
239 TString GetExtension() {return fExtension;}
240
241 /**
242 * Set the file extension.
243 */
244 void SetExtension(const char* extension) {fExtension=extension!=NULL?extension:"";}
245
c1292031 246 /**
247 * Get the target directory
248 */
249 TString GetDirectory() {return fDirectory;}
250
e74abd18 251 /**
252 * Working modes of the writer
253 * @internal
254 */
255 enum TWriterMode {
256 /**
257 * flag to indicate whether to write each incoming block to separate files
258 * or all blocks of one event to one file. set = concatenate (one file).
259 */
260 kConcatenateBlocks = 0x1,
261
262 /**
263 * flag to indicate whether to concatenate incoming blocks of the same type
264 * for all events to one file. If also @ref kConcatenateBlocks is set,
265 * or all blocks of all events are written to the same file.
266 */
267 kConcatenateEvents = 0x2,
268
269 /** event enumeration flag */
6b7f77cf 270 kEnumerate = 0x4,
5ab95e9a 271
6b7f77cf 272 /** write all events including steering events */
273 kWriteAllEvents = 0x8,
274
275 /** write all blocks including private ones */
2cb9ea42 276 kWriteAllBlocks = 0x10,
277
278 /** skip the data type information when creating the file name */
279 kSkipDataType = 0x20
e74abd18 280 };
281
4b31e06b 282 /** argument scan concerning block descriptor selections */
283 AliHLTBlockDataCollection* fpBlockDataCollection; //!transient
284
e74abd18 285 private:
5ab95e9a 286 /** copy constructor prohibited */
287 AliHLTFileWriter(const AliHLTFileWriter&);
288 /** assignment operator prohibited */
289 AliHLTFileWriter& operator=(const AliHLTFileWriter&);
290
4b31e06b 291 /**
292 * Set defaults for all internal properties
293 */
294 int SetDefaults();
295
296 /**
297 * Schedule block for writing.
298 * The block is written immediately unless burst mode is activated.
299 * In burst mode, the block is buffered in the burst buffer until it is filled.
300 * Content of the burst buffer is then written in one burst.
301 *
302 * In the first implementation, burst write is only foreseen for the base
303 * file writer.
304 */
305 int ScheduleBlock(int blockno, const AliHLTEventID_t& eventID,
306 const AliHLTComponentBlockData* pDesc);
307
308 /**
309 * Flush burst buffer.
310 */
311 int BurstWrite();
312
313 /**
314 * Write data block;
315 * Build file name from the block attributes and compare with the
316 * lat file name in order to correctly append data or not.
317 */
318 int WriteBlock(int blockno, const AliHLTEventID_t& eventID,
319 const AliHLTComponentBlockData* pDesc);
320
e74abd18 321 /** the basename of the output file */
322 TString fBaseName; // see above
323 /** the extension of the output file */
324 TString fExtension; // see above
325 /** target directory */
326 TString fDirectory; // see above
5ab95e9a 327 /** base name of the event sub directories */
328 TString fSubDirFormat; // see above
329 /** event id format string (when added to file name) */
330 TString fIdFormat; // see above
331 /** specification format string (when added to file name) */
332 TString fSpecFormat; // see above
333 /** format string for block no (when added to file name) */
334 TString fBlcknoFormat; // see above
e1440dab 335 protected:
e74abd18 336 /** enumeration format string */
337 TString fCurrentFileName; // see above
e1440dab 338 private:
e74abd18 339
340 /** mode specifier, see @ref TWriterMode */
341 Short_t fMode; // see above
342
4b31e06b 343 /** burst buffer for postponed data write */
344 AliHLTUInt8_t* fpBurstBuffer; //!transient
345
346 /** size of burst buffer */
347 AliHLTUInt32_t fBurstBufferSize; //!transient
348
349 /** block descriptor list for postponed burst write*/
350 AliHLTComponentBlockDataList fBurstBlocks; //!transient
351
352 /** event ids for the burst blocks */
353 vector<AliHLTEventID_t> fBurstBlockEvents; //!transient
a9c4e244 354
355 /// configuration file of FilePublisher component
356 TString fPublisherConfName; // see above
357 /// current event for FilePublisher configuration
358 int fPublisherConfEvent; // see above
4b31e06b 359
a9c4e244 360 ClassDef(AliHLTFileWriter, 0)
e74abd18 361};
362#endif