]>
Commit | Line | Data |
---|---|---|
a4c1f5dd | 1 | // -*- Mode: C++ -*- |
2 | // $Id$ | |
3 | ||
4 | #ifndef ALIHLTGLOBALHISTOCOMPONENT_H | |
5 | #define ALIHLTGLOBALHISTOCOMPONENT_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 AliHLTGlobalHistoComponent.h | |
11 | /// @author Matthias Richter | |
12 | /// @date 2010-09-16 | |
13 | /// @brief A histogramming component for global ESD properties based | |
14 | /// on the AliHLTTTreeProcessor | |
15 | ||
16 | #include "AliHLTTTreeProcessor.h" | |
e7f3baeb | 17 | #include "TObjString.h" |
18 | #include "TObjArray.h" | |
a4c1f5dd | 19 | #include <string> |
20 | #include <map> | |
21 | #include <vector> | |
22 | ||
23 | /** | |
24 | * @class AliHLTGlobalHistoComponent | |
25 | * | |
26 | * <h2>General properties:</h2> | |
27 | * | |
28 | * Component ID: \b GlobalHisto <br> | |
29 | * Library: \b libAliHLTGlobal.so <br> | |
30 | * Input Data Types: ::kAliHLTAnyDataType <br> | |
31 | * Output Data Types: none <br> | |
32 | * | |
33 | * <h2>Mandatory arguments:</h2> | |
34 | * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting --> | |
35 | * | |
36 | * <h2>Optional arguments:</h2> | |
37 | * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting --> | |
38 | * | |
39 | * <h2>Configuration:</h2> | |
40 | * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting --> | |
41 | * Configuration by component arguments. | |
42 | * | |
43 | * <h2>Default CDB entries:</h2> | |
44 | * The component loads no CDB entries. | |
45 | * | |
46 | * <h2>Performance:</h2> | |
47 | * The component does not process any event data. | |
48 | * | |
49 | * <h2>Memory consumption:</h2> | |
50 | * The component does not process any event data. | |
51 | * | |
52 | * <h2>Output size:</h2> | |
53 | * Depending on the mode. | |
54 | * | |
55 | * @ingroup alihlt_util_components | |
56 | */ | |
57 | class AliHLTGlobalHistoComponent : public AliHLTTTreeProcessor | |
58 | { | |
59 | public: | |
60 | /// standard constructor | |
61 | AliHLTGlobalHistoComponent(); | |
62 | /// destructor | |
63 | virtual ~AliHLTGlobalHistoComponent(); | |
64 | ||
65 | /// inherited from AliHLTComponent: return id of the component. | |
66 | virtual const char* GetComponentID() {return "GlobalHisto";}; | |
67 | /// inherited from AliHLTComponent: input data types | |
68 | virtual void GetInputDataTypes(AliHLTComponentDataTypeList&); | |
af747e4b | 69 | |
70 | ||
71 | /// interface function, see AliHLTComponent for description | |
72 | AliHLTComponentDataType GetOutputDataType(); | |
73 | ||
74 | ||
a4c1f5dd | 75 | /// inherited from AliHLTComponent: spawn function, create an instance. |
76 | virtual AliHLTComponent* Spawn() {return new AliHLTGlobalHistoComponent;} | |
77 | ||
78 | void FillHistogramDefinitions(); | |
79 | ||
80 | /// @class AliHLTGlobalHistoVariables | |
81 | /// container for the tree branch variables | |
e7f3baeb | 82 | template <typename T> |
a4c1f5dd | 83 | class AliHLTGlobalHistoVariables { |
84 | public: | |
e7f3baeb | 85 | AliHLTGlobalHistoVariables() : fCapacity(0), fArrays(), fCount(), fKeys() {} |
86 | AliHLTGlobalHistoVariables(const AliHLTGlobalHistoVariables& src) : fCapacity(0), fArrays(), fCount(), fKeys() {} | |
87 | ~AliHLTGlobalHistoVariables() {Reset();} | |
a4c1f5dd | 88 | |
89 | /// init the arrays | |
e7f3baeb | 90 | int Init(int capacity, const char* names) |
91 | { | |
92 | /// init the arrays | |
93 | int iResult=0; | |
94 | TString initializer(names); | |
95 | TObjArray* pTokens=initializer.Tokenize(" "); | |
96 | fCapacity=capacity; | |
97 | if (pTokens) { | |
98 | int entries=pTokens->GetEntriesFast(); | |
99 | fArrays.resize(entries); | |
100 | fCount.resize(entries); | |
101 | for (int i=0; i<entries; i++) { | |
102 | fKeys[pTokens->At(i)->GetName()]=i; | |
103 | fArrays[i]=new T[fCapacity]; | |
104 | } | |
105 | delete pTokens; | |
106 | } | |
107 | if (fArrays.size()!=fCount.size() || | |
108 | fArrays.size()!=fKeys.size()) { | |
109 | return -EFAULT; | |
110 | } | |
111 | ||
112 | ResetCount(); | |
113 | return iResult; | |
114 | } | |
a4c1f5dd | 115 | |
116 | /// capacity for every key | |
117 | int Capacity() const {return fCapacity;} | |
118 | /// number of variables | |
119 | int Variables() const {return fArrays.size();} | |
120 | ||
121 | /// fill variable at index | |
e7f3baeb | 122 | int Fill(unsigned index, T value) |
123 | { | |
124 | if (index>=fArrays.size() || index>=fCount.size()) return -ENOENT; | |
125 | if (fCount[index]>=fCapacity) return -ENOSPC; | |
126 | ||
127 | (fArrays[index])[fCount[index]++]=value; | |
128 | return fCount[index]; | |
129 | } | |
130 | ||
a4c1f5dd | 131 | /// fill variable at key |
e7f3baeb | 132 | int Fill(const char* key, T value) |
133 | { | |
134 | int index=FindKey(key); | |
135 | if (index<0) return -ENOENT; | |
136 | return Fill(index, value); | |
137 | } | |
138 | ||
a4c1f5dd | 139 | /// get array at key |
e7f3baeb | 140 | T* GetArray(const char* key) |
141 | { | |
142 | int index=FindKey(key); if (index<0) return NULL; | |
143 | if ((unsigned)index>=fArrays.size()) return NULL; | |
144 | return fArrays[index]; | |
145 | } | |
146 | ||
a4c1f5dd | 147 | /// get the key of an array |
e7f3baeb | 148 | const char* GetKey(int index) const |
149 | { | |
150 | for (map<string, int>::const_iterator element=fKeys.begin(); element!=fKeys.end(); element++) { | |
151 | if (element->second==index) return element->first.c_str(); | |
152 | } | |
153 | return NULL; | |
154 | } | |
a4c1f5dd | 155 | |
156 | /// reset and cleanup arrays | |
e7f3baeb | 157 | int Reset() |
158 | { | |
159 | for (unsigned i=0; i<fArrays.size(); i++) {delete fArrays[i];} | |
160 | fArrays.clear(); fCount.clear(); fKeys.clear(); | |
161 | return 0; | |
162 | } | |
a4c1f5dd | 163 | |
164 | /// reset the fill counts | |
e7f3baeb | 165 | int ResetCount() |
166 | { | |
167 | for (vector<int>::iterator element=fCount.begin(); element!=fCount.end(); element++) *element=0; | |
168 | return 0; | |
169 | } | |
170 | ||
171 | char GetType() const {AliHLTGlobalHistoVariablesType type(T&); return type.GetType();} | |
a4c1f5dd | 172 | |
173 | private: | |
e7f3baeb | 174 | int FindKey(const char* key) const |
175 | { | |
176 | map<string, int>::const_iterator element=fKeys.find(key); | |
177 | if (element==fKeys.end()) return -ENOENT; | |
178 | return element->second; | |
179 | } | |
180 | ||
181 | /// internal helper class to get the type of the template | |
182 | class AliHLTGlobalHistoVariablesType { | |
183 | public: | |
184 | AliHLTGlobalHistoVariablesType(float&) : fType('f') {} | |
185 | AliHLTGlobalHistoVariablesType(int&) : fType('i') {} | |
186 | char GetType() const {return fType;} | |
187 | private: | |
188 | char fType; //! | |
189 | }; | |
a4c1f5dd | 190 | |
191 | /// capacity of all arrays | |
192 | int fCapacity; //! | |
193 | /// pointers of arrays | |
e7f3baeb | 194 | vector<T*> fArrays; //! |
a4c1f5dd | 195 | /// fill count for arrays |
196 | vector<int> fCount; //! | |
197 | /// map of keys | |
198 | map<string,int> fKeys; //! | |
199 | }; | |
200 | ||
201 | protected: | |
202 | /// inherited from AliHLTTTreeProcessor: create the tree instance and all branches | |
203 | TTree* CreateTree(int argc, const char** argv); | |
204 | /// inherited from AliHLTTTreeProcessor: process input blocks and fill tree | |
205 | int FillTree(TTree* pTree, const AliHLTComponentEventData& evtData, | |
206 | AliHLTComponentTriggerData& trigData ); | |
207 | /// dtOrigin for PushBack. | |
208 | AliHLTComponentDataType GetOriginDataType() const; | |
a4c1f5dd | 209 | |
210 | int ResetVariables(); | |
54da0d34 | 211 | |
a4c1f5dd | 212 | private: |
213 | /// copy constructor prohibited | |
214 | AliHLTGlobalHistoComponent(const AliHLTGlobalHistoComponent&); | |
215 | /// assignment operator prohibited | |
216 | AliHLTGlobalHistoComponent& operator=(const AliHLTGlobalHistoComponent&); | |
7a37a034 | 217 | |
a4c1f5dd | 218 | /// the event number, tree filling variable |
219 | int fEvent; //! | |
220 | /// track count, tree filling variable | |
221 | int fNofTracks; //! | |
1b89b93a | 222 | /// V0 count, tree filling variable |
223 | int fNofV0s; //! | |
1c1af02a | 224 | /// UPC pair count (=1), tree filling variable |
225 | int fNofUPCpairs; //! | |
1b89b93a | 226 | /// contributors count, tree filling variable |
227 | int fNofContributors; //! | |
228 | /// x coordinate of vertex | |
54da0d34 | 229 | float fVertexX; //! |
230 | /// y coordinate of vertex | |
231 | float fVertexY; //! | |
232 | /// z coordinate of vertex | |
233 | float fVertexZ; //! | |
1b89b93a | 234 | /// vertex status, found or not |
235 | bool fVertexStatus; //! | |
54da0d34 | 236 | |
a4c1f5dd | 237 | /// filling arrays for track parameters |
e7f3baeb | 238 | AliHLTGlobalHistoVariables<float> fTrackVariables; //! |
239 | AliHLTGlobalHistoVariables<int> fTrackVariablesInt; //! | |
7a37a034 | 240 | |
241 | /// filling arrays for V0 parameters | |
242 | AliHLTGlobalHistoVariables<float> fV0Variables; //! | |
1c1af02a | 243 | |
244 | /// filling arrays for UPC parameters | |
245 | AliHLTGlobalHistoVariables<float> fUPCVariables; //! | |
54da0d34 | 246 | |
7a37a034 | 247 | |
248 | Double_t fGammaCuts[8]; // cuts for gammas | |
249 | Double_t fKsCuts[8]; // cuts for Ks | |
250 | Double_t fLambdaCuts[8]; // cuts for Lambdas | |
251 | Double_t fAPCuts[8]; // cuts for Armenteros-Podolanski plot | |
252 | ||
253 | Int_t fNEvents; // n of processed events | |
254 | Int_t fNGammas; // n found total | |
255 | Int_t fNKShorts; // n found total | |
256 | Int_t fNLambdas; // n found total | |
257 | Int_t fNPi0s; // n found total | |
258 | ||
a4c1f5dd | 259 | ClassDef(AliHLTGlobalHistoComponent, 0) // HLT Global Histogram component |
260 | }; | |
261 | #endif |