d6d0ce8b594c4ad81e6d05c5e3c2049ffa5ca7aa
[u/mrichter/AliRoot.git] / HLT / BASE / util / AliHLTDataGenerator.h
1 // -*- Mode: C++ -*-
2 // @(#) $Id$
3
4 #ifndef ALIHLTDATAGENERATOR_H
5 #define ALIHLTDATAGENERATOR_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   AliHLTDataGenerator.h
11     @author Matthias Richter
12     @date   
13     @brief  An HLT file publishing (data source) component.
14     @note   The class is used in Offline (AliRoot) context
15 */
16
17 #include "AliHLTDataSource.h"
18
19 /**
20  * @class AliHLTDataGenerator
21  * An HLT data source component to produce random data.
22  *
23  * Component ID: \b DataGenerator <br>
24  * Library: \b libAliHLTUtil.
25  *
26  * Mandatory arguments: <br>
27  * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formating -->
28  * \li -datatype     <i> datatype   dataorigin </i> <br>
29  *      data type ID and origin, e.g. <tt>-datatype 'CLUSTERS' 'TPC ' </tt>
30  * \li -dataspec     <i> specification </i> <br>
31  *      data specification treated as decimal number or hex number if
32  *      prepended by '0x'
33  * \li -minsize      <i> size </i> <br>
34  *      the minimum size of the data to be produced
35  * \li -maxsize      <i> size </i> <br>
36  *      the maximum size of the data to be produced, default = minsize
37  *
38  * Optional arguments:<br>
39  * \li -disisor <i> m </i> <br>
40  *      a disisor to shrink the size after \em modulo events
41  * \li -offset <i> m </i> <br>
42  *      an offset to subtract from the size after \em modulo events
43  * \li -modulo <i> n </i> <br>
44  *      size manipulated by the disisor or subtractor after \em n events
45  *
46  * The component produces data blocks of random content and random size in the
47  * range of [\em minsize , \em maxsize ]. The size arguments can contain 'k' or
48  * 'M' to indicate kByte or MByte.
49  * @ingroup alihlt_component
50  */
51 class AliHLTDataGenerator : public AliHLTDataSource  {
52  public:
53   /** standard constructor */
54   AliHLTDataGenerator();
55   /** destructor */
56   virtual ~AliHLTDataGenerator();
57
58   const char* GetComponentID();
59   AliHLTComponentDataType GetOutputDataType();
60   int GetOutputDataTypes(vector<AliHLTComponentDataType>& /*tgtList*/);
61   void GetOutputDataSize( unsigned long& constBase, double& inputMultiplier );
62   AliHLTComponent* Spawn();
63
64  protected:
65   /**
66    * Init method.
67    */
68   int DoInit( int argc, const char** argv );
69
70   /**
71    * Deinit method.
72    */
73   int DoDeinit();
74
75   /**
76    * Data processing method for the component.
77    * @param evtData       event data structure
78    * @param trigData      trigger data structure
79    * @param outputPtr     pointer to target buffer
80    * @param size          <i>input</i>: size of target buffer
81    *                      <i>output</i>:size of produced data
82    * @param outputBlocks  list to receive output block descriptors
83    * @return
84    */
85   int GetEvent( const AliHLTComponentEventData& evtData,
86                         AliHLTComponentTriggerData& trigData,
87                         AliHLTUInt8_t* outputPtr, 
88                         AliHLTUInt32_t& size,
89                         vector<AliHLTComponentBlockData>& outputBlocks );
90
91   /**
92    * Scan one argument and adjacent parameters.
93    * Can be overloaded by child classes in order to add additional arguments
94    * beyond the standard arguments of the file publisher. The method is called
95    * whenever a non-standard argument is recognized.
96    * @param argc           size of the argument array
97    * @param argv           agument array for component initialization
98    * @return number of processed members of the argv <br>
99    *         -EINVAL unknown argument <br>
100    *         -EPROTO parameter for argument missing <br>
101    */
102   virtual int ScanArgument(int argc, const char** argv);
103
104  protected:
105   /**
106    * Scan a size argument.
107    * The argument is expected to be an integer, which can be suffixed by 'k'
108    * or 'M' in order to indicate the base, kByte or MByte.
109    * @param size      target to store the size
110    * @param arg       the argument to scan
111    */
112   int ScanSizeArgument(AliHLTUInt32_t &size, const char* arg);
113
114  private:
115   /** prohibit copy constructor */
116   AliHLTDataGenerator(const AliHLTDataGenerator&);
117   /** prohibit assignment operator */
118   AliHLTDataGenerator& operator=(const AliHLTDataGenerator&);
119
120   /** data type */
121   AliHLTComponentDataType fDataType;                                //! transient
122
123   /** specification */
124   AliHLTUInt32_t fSpecification;                                    //! transient
125
126   /** the original size size */
127   AliHLTUInt32_t fSize;                                             //! transient
128
129   /** the manipulated size */
130   AliHLTUInt32_t fCurrSize;                                         //! transient
131
132   /** range */
133   AliHLTUInt32_t fRange;                                            //! transient
134
135   /** divisor */
136   AliHLTUInt32_t fDivisor;                                          //! transient
137
138   /** subtractor */
139   AliHLTUInt32_t fSubtractor;                                       //! transient
140
141   /** modulo for size manipulation */
142   AliHLTUInt32_t fModulo;                                           //! transient
143
144   ClassDef(AliHLTDataGenerator, 0)
145 };
146 #endif