]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/BASE/AliHLTScalars.h
Update master to aliroot
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTScalars.h
CommitLineData
9cb24db9 1//-*- Mode: C++ -*-
63a7ee27 2// $Id$
9cb24db9 3#ifndef AliHLTSCALARS_H
4#define AliHLTSCALARS_H
5/* This file is property of and copyright by the ALICE HLT Project *
6 * ALICE Experiment at CERN, All rights reserved. *
7 * See cxx source for full Copyright notice */
8
9/// @file AliHLTScalars.h
10/// @author Artur Szostak <artursz@iafrica.com>
11/// @date 28 Sep 2010
12/// @brief Declares the a base class for named scalar values.
13
14#include "TObject.h"
15#include "TNamed.h"
9cb24db9 16#include "TClonesArray.h"
17#include "THashTable.h"
18
19/**
20 * @class AliHLTScalars
21 * @brief Container for named scalar values.
22 *
23 * This class contains a list of named scalars for an event as summary information.
24 * These can be used by the trigger components to perform event selection or used
25 * for monitoring purposes.
26 *
27 * \ingroup alihlt_base
28 */
29class AliHLTScalars : public TObject
30{
31public:
32 /**
33 * This class stores a single scalar value and name.
34 */
35 class AliScalar : public TNamed
36 {
37 public:
38 /// Default constructor
39 AliScalar() : TNamed(), fValue(0) {}
40
41 /// Constructor to set the initial value.
42 AliScalar(const char* name, const char* description, Double_t value) :
43 TNamed(name, description), fValue(value)
44 {}
45
46 /// Default destructor
47 virtual ~AliScalar() {}
48
49 /// Inherited from TObject. Compares two scalar names.
50 virtual Int_t Compare(const TObject *obj) const
51 {
52 return fName.CompareTo(obj->GetName());
53 }
54
55 /// Inherited from TObject. Returns true.
56 virtual Bool_t IsSortable() const { return kTRUE; }
57
58 /**
59 * Inherited from TObject.
60 * Returns true if the names of the scalars are the same.
61 */
62 virtual Bool_t IsEqual(const TObject *obj) const
63 {
64 return fName == obj->GetName();
65 }
66
67 /// Resets the scalar value to zero.
68 virtual void Clear(Option_t* /*option*/ = "") { fValue = 0; }
69
70 /// Inherited from TObject. Performs a deep copy.
71 virtual void Copy(TObject& object) const;
72
73 /// Returns the value of the scalar.
74 Double_t Value() const { return fValue; }
75
76 /// Sets a new value for the scalar.
77 void Value(Double_t value) { fValue = value; }
78
79 /**
80 * Increments the scalar by a value of 'count'.
81 * \param count The number to increment the scalar by. The default is 1.
82 */
83 void Increment(UInt_t count = 1) { fValue += count; }
84
85 /// Returns the name of the scalar.
86 const char* Name() const { return fName.Data(); }
87
88 /// Returns the description string for the scalar.
89 const char* Description() const { return fTitle.Data(); }
90
91 /// Checks if two scalar objects are identical.
92 bool operator == (const AliScalar& x) const
93 {
94 return fValue == x.fValue and fName == x.fName and fTitle == x.fTitle;
95 }
96
97 /// Checks if two scalar objects are not identical.
98 bool operator != (const AliScalar& x) const
99 {
100 return not (this->operator == (x));
101 }
102
103 /// Typecast operator for returning the value directly.
ffc740d4 104 operator Double_t () const { return fValue; }
9cb24db9 105
106 private:
107 Double_t fValue; // The scalar's value.
108
109 ClassDef(AliScalar, 1); // HLT scalar value.
110 };
111
112 /// Default constructor.
113 AliHLTScalars();
114
115 /// The copy constructor performs a deep copy.
116 AliHLTScalars(const AliHLTScalars& obj);
117
118 /// Default destructor.
119 virtual ~AliHLTScalars();
120
faf00b0d 121 /// Needed by schema evolution
122 const TClonesArray* GetScalars() const { return &fScalars; }
123
9cb24db9 124 /**
125 * Adds a new scalar to the end of the scalars list.
126 * If the scalar already exists then its values are updated instead.
127 * \param name The name of the scalar.
128 * \param description A short description of the scalar.
129 * \param value The value of the new scalar.
130 * \returns true if the scalar already exists and false otherwise.
131 */
132 virtual bool Add(const char* name, const char* description = NULL, Double_t value = 0);
133
134 /**
135 * Removes a named scalar from the scalars list.
136 * \param name The name of the scalar to remove.
137 * \returns true if the scalar existed and false otherwise.
138 * \note The scalars list is compressed so this method will be slow.
139 * In addition, scalar positions will change if not removing from the end.
140 */
141 virtual bool Remove(const char* name);
142
143 /// Checks to see if the named scalar exists.
144 bool Exists(const char* name) const { return fMap.FindObject(name) != NULL; }
145
146 /**
147 * Fetches the specified scalar object.
148 * \param name The name of the scalar object.
149 * \returns the found scalar object, otherwise an empty sentinel object with
150 * zeros. One can tell it is a sentinel because the name will be empty.
151 */
152 const AliScalar& GetScalar(const char* name) const;
153
154 /**
155 * Fetches the specified scalar object for editing.
156 * \param name The name of the scalar object.
157 * \returns the found scalar object. If the scalar does not already
158 * exist then a new one is created and returned.
159 */
160 AliScalar& GetScalar(const char* name);
161
162 /// Returns the number of scalar values.
163 UInt_t NumberOfScalars() const { return UInt_t(fScalars.GetEntriesFast()); }
164
165 // Note: the following GetScalarN methods do not use the same name as
166 // GetScalar above because the parameter type would unfortunately be
167 // ambiguous to an ISO c++ compiler.
168
169 /**
170 * Fetches the n'th scalar object.
171 * \param n The number of the scalar object.
172 * \returns the found scalar object, otherwise an empty sentinel object with
173 * zeros. One can tell it is a sentinel because the name will be empty.
174 */
175 const AliScalar& GetScalarN(UInt_t n) const;
176
177 /**
178 * Fetches the n'th scalar object for editing.
179 * \param n The number of the scalar object.
180 * \returns the found scalar object. If the scalar does not already
181 * exist then a new one is created and returned.
182 */
183 AliScalar& GetScalarN(UInt_t n);
184
185 /// Resets all scalar values to zero.
5df17fc7 186 virtual void Reset();
9cb24db9 187
188 /**
189 * Removes all the scalars from the internal array.
190 * \param option This is passed onto the internal Delete method.
191 */
192 virtual void Clear(Option_t* option = "");
193
194 /// Inherited form TObject. Performs a deep copy.
195 virtual void Copy(TObject& object) const;
196
197 /// Finds the scalar object by name.
198 virtual TObject* FindObject(const char* name) const
199 {
200 return fMap.FindObject(name);
201 }
202
203 /// Finds the scalar object with the same name as obj->GetName().
204 virtual TObject* FindObject(const TObject* obj) const
205 {
206 return fMap.FindObject(obj->GetName());
207 }
208
209 /**
210 * Inherited from TObject, this prints the contents of all the scalars.
211 * \param option Can be "compact", which will just print all the values on one line.
212 */
213 virtual void Print(Option_t* option = "") const;
214
215 /**
216 * The assignment operator performs a deep copy.
217 */
218 AliHLTScalars& operator = (const AliHLTScalars& obj);
219
220 /// Returns the n'th scalar or a zero sentinel if n is out of range.
221 const AliScalar& operator [] (UInt_t n) const { return GetScalarN(n); }
222
223 /// Returns the n'th scalar for editing. A new scalar is created if n is out of range.
224 AliScalar& operator [] (UInt_t n) { return GetScalarN(n); }
225
226 /// Returns the named scalar or a zero sentinel if no such scalar is found.
227 const AliScalar& operator [] (const TString& name) const { return GetScalar(name.Data()); }
228
ffc740d4 229 /// Returns the named scalar for editing. A new scalar is created if the named scalar is not found.
9cb24db9 230 AliScalar& operator [] (const TString& name) { return GetScalar(name.Data()); }
231
232 /**
233 * Inherited from TObject.
234 * Returns true if the names of the two sets of scalars are the same.
235 * \note The actual values are not checked. Use the comparison operator for that.
236 */
237 virtual Bool_t IsEqual(const TObject *obj) const;
238
239 /**
240 * Comparison operator to check if two sets of scalars have the same values.
241 * \note The description strings are not checked so they could be different
242 * and the order of the scalars does not matter either.
243 */
244 bool operator == (const AliHLTScalars& obj) const;
245
246 /**
247 * Comparison operator to check if two sets of scalars are different.
248 * \note The description strings are not checked, only the values are.
249 * In addition, the order of the scalars does not matter.
250 */
251 bool operator != (const AliHLTScalars& obj) const
252 {
253 return not (this->operator == (obj));
254 }
255
256protected:
257
258 /**
259 * Constructor that can be used by deriving classes to overload the class stored
260 * in the fScalars TClonesArray.
261 * \param cl The class to use in the fScalars as passed to the TClonesArray constructor.
262 * \param initSize The initial approximate number of elements in fScalars. (Default = 128).
5df17fc7 263 * \note The class used in <i>cl</i> must derive from AliHLTScalars::AliScalar.
9cb24db9 264 */
265 AliHLTScalars(const TClass* cl, Int_t initSize = 128);
266
5df17fc7 267 /**
268 * This method creates a new scalar object in the fScalars TClonesArray.
269 * \param i Location of the new object to construct in the TClonesArray.
270 * \param name The name of the new scalar.
271 * \param description The description of the new scalar.
272 * \param value The value of the new scalar.
273 * \returns the pointer to the new object created.
274 * \note This method must be overridden by classes inheriting from this class if
275 * the protected AliHLTScalars(const TClass*, Int_t) constructor is used to
276 * change the class stored in the fScalars TClonesArray.
277 * One should use the method ScalarForConstructor to get the location where
278 * the new scalar object will be constructed.
279 */
280 virtual AliScalar* NewScalar(UInt_t i, const char* name, const char* description, Double_t value);
281
282 /**
283 * Returns a pointer to the memory where a new scalar object should be constructed.
284 * \param i The position of the new object.
285 */
286 TObject*& ScalarForConstructor(UInt_t i) { return fScalars[Int_t(i)]; }
287
288 /**
289 * This method should return an empty sentinel object to mark that a scalar was
290 * not found in the list.
291 * \note This method must be overridden by classes inheriting from this class if
292 * the protected AliHLTScalars(const TClass*, Int_t) constructor is used to
293 * change the class stored in the fScalars TClonesArray.
294 */
295 virtual const AliScalar& Sentinel() const;
296
297 /**
298 * This is an internal Add method which can be faster to use than the public Add method
299 * directly for classes derived from AliHLTScalars.
9bb806cd 300 * \param [out] scalar This gets filled with the pointer of the new scalar created or
5df17fc7 301 * the existing one found.
9bb806cd 302 * \param [in] name The name of the scalar.
303 * \param [in] description A short description of the scalar.
304 * \param [in] value The value of the new scalar.
5df17fc7 305 * \returns true if the scalar already exists and false otherwise.
306 */
307 bool Add(AliScalar*& scalar, const char* name, const char* description, Double_t value);
308
309 /**
310 * Utility method for classes deriving from AliHLTScalars to fetch the i'th scalar
311 * from the TClonesArray without checking that the index is valid.
312 * \param i The index number of the scalar to fetch.
313 */
314 AliScalar* ScalarUncheckedAt(UInt_t i) const { return static_cast<AliScalar*>(fScalars.UncheckedAt(Int_t(i))); }
315
9cb24db9 316private:
317
318 TClonesArray fScalars; // List of scalar objects.
319 THashTable fMap; //! Hash table of pointers to the scalars for fast lookup.
320
321 ClassDef(AliHLTScalars, 1); // Set of HLT scalars.
322};
323
324#endif // AliHLTSCALARS_H