]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/BASE/util/AliHLTRootSchemaEvolutionComponent.h
disable component statistics for the control task, only inserts the desired control...
[u/mrichter/AliRoot.git] / HLT / BASE / util / AliHLTRootSchemaEvolutionComponent.h
CommitLineData
65106d07 1// -*- Mode: C++ -*-
2// $Id$
3
4#ifndef ALIHLTROOTSCHEMAEVOLUTIONCOMPONENT_H
5#define ALIHLTROOTSCHEMAEVOLUTIONCOMPONENT_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 AliHLTRootSchemaEvolutionComponent.h
11 @author Matthias Richter
12 @date 2009-10-18
13 @brief Handler component for ROOT schema evolution of streamed objects
14*/
15
b64e4d93 16#include "AliHLTCalibrationProcessor.h"
05948425 17#include "TString.h"
a22cde70 18#include <vector>
65106d07 19
20class TObjArray;
a22cde70 21class TObject;
22class TStopwatch;
23class AliHLTMessage;
65106d07 24
25/**
26 * @class AliHLTRootSchemaEvolutionComponent
a22cde70 27 * Collects streamer info for all input objects and produces the corresponding
28 * calibration object for reconstruction of HLT. The component runs with a
29 * configurable rate constraint and skips the processing of known data blocks
30 * for the sake of performance. New data blocks are always processed and added
31 * to the list.
65106d07 32 *
33 * <h2>General properties:</h2>
34 *
35 * Component ID: \b ROOTFileWriter <br>
36 * Library: \b libAliHLTUtil.so <br>
37 * Input Data Types: ::kAliHLTAnyDataType <br>
38 * Output Data Types: none <br>
39 *
40 * <h2>Mandatory arguments:</h2>
41 * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
42 *
43 * <h2>Optional arguments:</h2>
44 * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
b64e4d93 45 * \li -fxs<=[n,off]> <br>
65106d07 46 * push streamer info to FXS, fetched by Shuttle and store in the entry
b64e4d93 47 * HLT/Calib/StreamerInfo <br>
48 * if a scalar greather then 0 is specified the calibration object is
49 * pushed during the event processing with the specified scale down<br>
50 * always pushed on EOR, default on
65106d07 51 * \li -hltout<=[all,first,eor,off]> <br>
52 * push streamer info to output, the streamer info is stored in the
53 * events in all, the first, and/or the EOR.
a22cde70 54 * \li -file=filename <br>
05948425 55 * write to file at EOR
a22cde70 56 * \li -rate=hz <br>
57 * required processing rate in Hz, default 2000Hz
65106d07 58 *
59 * <h2>Configuration:</h2>
60 * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
61 * Configuration by component arguments.
62 *
63 * <h2>Default CDB entries:</h2>
64 * The component loads no CDB entries.
65 *
66 * <h2>Performance:</h2>
67 * The component does not process any event data.
68 *
69 * <h2>Memory consumption:</h2>
70 * The component does not process any event data.
71 *
72 * <h2>Output size:</h2>
73 * Depending on the mode.
74 *
75 * @ingroup alihlt_util_components
76 */
b64e4d93 77class AliHLTRootSchemaEvolutionComponent : public AliHLTCalibrationProcessor
65106d07 78{
79 public:
80 /// standard constructor
81 AliHLTRootSchemaEvolutionComponent();
82 /// destructor
83 virtual ~AliHLTRootSchemaEvolutionComponent();
84
85 /// inherited from AliHLTComponent: return id of the component.
86 virtual const char* GetComponentID() {return "ROOTSchemaEvolutionComponent";};
87 /// inherited from AliHLTComponent: input data types
88 virtual void GetInputDataTypes(AliHLTComponentDataTypeList&);
89 /// inherited from AliHLTComponent: output data types
90 virtual AliHLTComponentDataType GetOutputDataType();
91 /// inherited from AliHLTComponent: output data size
92 virtual void GetOutputDataSize(unsigned long&, double&);
93
94 /// inherited from AliHLTComponent: spawn function, create an instance.
95 virtual AliHLTComponent* Spawn() {return new AliHLTRootSchemaEvolutionComponent;}
96
97 enum {
98 /// push streamer info to the HLTOUT for the first event
99 kHLTOUTatFirstEvent = 0x1,
100 /// push streamer info to the HLTOUT for all events
101 kHLTOUTatAllEvents = 0x2,
102 /// push streamer info to the HLTOUT at EOR, this has no relevance
103 /// for reconstruction as it is too late and just in one raw file,
104 /// but it allows archival at the end of the run
105 kHLTOUTatEOR = 0x4,
106 /// push streamer info to FXS
107 kFXS = 0x100,
108 };
109
110 /// Update the array of known streamer infos from a list of infos
111 /// Checks whether the provided infos are already there in the present version
112 /// and adds if it is a new info.
113 int UpdateStreamerInfos(const TList* list, TObjArray* infos) const;
114
9ddb0769 115 /// merge streamer info entries from source array to target array
116 /// add all existing infos if not existing in the current one, or having
117 /// different class version
118 /// return 1 if target array has been changed
119 static int MergeStreamerInfo(TObjArray* tgt, const TObjArray* src);
120
a22cde70 121 class AliHLTDataBlockItem
122 {
123 public:
124 AliHLTDataBlockItem(AliHLTComponentDataType dt=kAliHLTVoidDataType,
125 AliHLTUInt32_t spec=kAliHLTVoidDataSpec);
126 ~AliHLTDataBlockItem();
127
128 /// extract data block to root object, and update performance parameters
129 /// object needs to be deleted externally
130 TObject* Extract(const AliHLTComponentBlockData* bd);
131
132 /// stream object and update performance parameters
133 int Stream(TObject* obj, AliHLTMessage& msg);
134
135 bool IsObject() const {return fIsObject;}
136 bool operator==(AliHLTDataBlockItem& i) const {return fDt==i.fDt && fSpecification==i.fSpecification;}
137 bool operator==(AliHLTComponentDataType dt) const {return fDt==dt;}
138 bool operator==(AliHLTUInt32_t spec) const {return fSpecification==spec;}
139 int operator+(AliHLTDataBlockItem& b) const;
140 operator const AliHLTComponentDataType&() const {return fDt;}
141 AliHLTUInt32_t GetSpecification() const {return fSpecification;}
142
143 /// average extraction time in usec
144 AliHLTUInt32_t GetExtractionTime() const {return fNofExtractions>0?fExtractionTimeUsec/fNofExtractions:0;}
145 /// average streaming time in usec
146 AliHLTUInt32_t GetStreamingTime() const {return fNofStreamings>0?fStreamingTimeUsec/fNofStreamings:0;}
147 /// average total time in usec
148 AliHLTUInt32_t GetTotalTime() const {return GetExtractionTime() + GetStreamingTime();}
149
150 /// print status
151 void Print(const char* option) const;
152
a22cde70 153 private:
154 /// data type of the block
155 AliHLTComponentDataType fDt; //! transient
156 /// specification of the block
157 AliHLTUInt32_t fSpecification; //! transient
158 /// flag for TObject
159 bool fIsObject; //! transient
160
161 /// number of extractions
162 AliHLTUInt32_t fNofExtractions; //! transient
163 /// object extraction time in usec
164 AliHLTUInt32_t fExtractionTimeUsec; //! transient
165 /// timestamp of last extraction in usec
166 AliHLTUInt32_t fLastExtraction; //! transient
167 /// number of streamings
168 AliHLTUInt32_t fNofStreamings; //! transient
169 /// object streaming time in usec
170 AliHLTUInt32_t fStreamingTimeUsec; //! transient
171 /// timestamp of last streaming in usec
172 AliHLTUInt32_t fLastStreaming; // !transient
173 };
174
175 /// find item in the list
176 AliHLTDataBlockItem* FindItem(AliHLTComponentDataType dt,
177 AliHLTUInt32_t spec);
178
65106d07 179 protected:
b64e4d93 180 /// inherited from AliHLTCalibrationProcessor: custom initialization
181 int InitCalibration();
182 /// inherited from AliHLTCalibrationProcessor: custom argument scan
183 /// the AliHLTCalibrationProcessor so far does not use the base class
184 /// methods for argument scan.
185 int ScanArgument( int argc, const char** argv ) {
186 int result=ScanConfigurationArgument(argc, argv); return result>0?result-1:result;
187 }
188 /// inherited from AliHLTCalibrationProcessor: cleanup
189 int DeinitCalibration();
190
191 /// inherited from AliHLTCalibrationProcessor processing
192 virtual int ProcessCalibration( const AliHLTComponentEventData& evtData,
193 AliHLTComponentTriggerData& trigData );
65106d07 194
b64e4d93 195 using AliHLTCalibrationProcessor::ProcessCalibration;
196
197 /// inherited from AliHLTCalibrationProcessor processing
198 int ShipDataToFXS( const AliHLTComponentEventData& evtData,
199 AliHLTComponentTriggerData& trigData);
200
201 using AliHLTCalibrationProcessor::ShipDataToFXS;
65106d07 202
203 /**
204 * Inherited from AliHLTComponent
205 * Scan one argument and adjacent parameters.
206 * @return number of scanned parameters, neg. error code if failed
207 */
208 virtual int ScanConfigurationArgument(int argc, const char** argv);
209
210 void SetBits(AliHLTUInt32_t b) {fFlags|=b;}
211 void ClearBits(AliHLTUInt32_t b) {fFlags&=~b;}
212 bool TestBits(AliHLTUInt32_t b) {return (fFlags&b) != 0;}
05948425 213 int WriteToFile(const char* filename, const TObjArray* infos) const;
65106d07 214
215private:
216 /** copy constructor prohibited */
217 AliHLTRootSchemaEvolutionComponent(const AliHLTRootSchemaEvolutionComponent&);
218 /** assignment operator prohibited */
219 AliHLTRootSchemaEvolutionComponent& operator=(const AliHLTRootSchemaEvolutionComponent&);
220
a22cde70 221 vector<AliHLTDataBlockItem> fList; //! list of block properties
222
65106d07 223 AliHLTUInt32_t fFlags; //! property flags
224
225 TObjArray* fpStreamerInfos; //! array of streamer infos
a22cde70 226 TStopwatch* fpEventTimer; //! stopwatch for event processing
227 TStopwatch* fpCycleTimer; //! stopwatch for event cycle
228 AliHLTUInt32_t fMaxEventTime; //! required maximum processing time in usec
65106d07 229
230 AliHLTUInt32_t fFXSPrescaler; //! prescalar for the publishing to FXS
231
05948425 232 TString fFileName; //! file name for dump at EOR
233
65106d07 234 static const char* fgkConfigurationObject; //! configuration object
a22cde70 235 static const AliHLTUInt32_t fgkTimeScale; //! timescale base
65106d07 236
a22cde70 237 ClassDef(AliHLTRootSchemaEvolutionComponent, 0) // ROOT schema evolution component
65106d07 238};
239#endif