]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/global/AliHLTVertexFinderBase.h
Update master to aliroot
[u/mrichter/AliRoot.git] / HLT / global / AliHLTVertexFinderBase.h
CommitLineData
f078d002 1//-*- Mode: C++ -*-
2// $Id$
3#ifndef ALIHLTVERTEXFINDERBASE_H
4#define ALIHLTVERTEXFINDERBASE_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 AliHLTVertexFinderBase.h
10/// @author Timur Pocheptsov
11/// @date 2010-12-26
12/// @brief Base class for vertex finder components
13///
14
15
16#include <vector>
17#include <map>
18
19#include "TString.h"
20
21#include "AliHLTProcessor.h"
22#include "AliHLTDataTypes.h"
23#include "AliKFParticle.h"
24
25
26//Auxiliary base class, used by primary and V0 vertex finders.
27//It defines a nested type AliHLTTrackInfo and some
28//functions to read tracks from input blocks -
29//this is usefull for both vertexers.
30//This class has to inherit AliHLTProcessor to be able
31//to call member functions from AliHLTComponent.
32//This class is not for end user, it's just a
33//common base for vertex finders.
34
35class AliESDEvent;
36class AliKFVertex;
37
38class AliHLTVertexFinderBase : public AliHLTProcessor
39{
40protected:
41
42 class AliHLTTrackInfo
43 {
44 public:
45 AliHLTTrackInfo()
46 : fID(0),
47 fParticle(),
48 fPrimUsed(false),
49 fPrimDeviation(0.)
50 {
51 }
52
53 AliHLTTrackInfo(int id, const AliVTrack& track,
54 int pid, bool primUsed, double dev)
55 : fID(id),
56 fParticle(track, pid),
57 fPrimUsed(primUsed),
58 fPrimDeviation(dev)
59 {
60 }
61
62 //Check AliKFParticle parameters and covariance matrix.
63 bool IsKFFinite()const;
64
65 //Track ID taken from input track, just an index in some "collection".
66 int fID;
67
68 AliKFParticle fParticle; //Corresponding to track KFParticle.
69 bool fPrimUsed; //Particle was used for primary vertex fit.
70 double fPrimDeviation; //Primary deviation.
71 };
72
73 //These data types are
74 //used in FillESD functions,
75 //they also used in vertex finders
76 //(v0 finder uses primary finder's block).
77 struct PrimaryFinderBlock
78 {
79 int fFitTracksFlag;
80 int fNPrimaryTracks;
81 int fMinPrimID;
82 int fMaxPrimID;
83 int fPrimTrackIds[1];
84 };
85
86 struct V0FinderBlock
87 {
88 int fNV0s;
89 int fV0s[1];
90 };
91
92protected:
93
94 //Compiler-generated def ctor will call vector's def
95 //ctor for member, but still, compiler wants mem-init-list.
96 AliHLTVertexFinderBase() : fTrackInfos()
97 {
98 }
99
100 //Read tracks from AliESDEvent
101 //into fTrackInfos.
102 //IMPORTANT: fTrackInfos is not
103 //cleared here before filling,
104 //tracks are appended to the end.
105 //A user (derived class)
106 //has to clear it, if needed.
bf0b4a59 107 void ReadESDTracks(int posPID, int negPID);
108 void ReadESDTracks(AliESDEvent* esd, int posPID, int negPID);
f078d002 109 //Read HLT tracks produced by ITS
110 //or TPC (somewhere else?).
111 //IMPORTANT: fTrackInfos is not
112 //cleared here before filling,
113 //tracks are appended to the end.
bf0b4a59 114 void ReadHLTTracks(const AliHLTComponentDataType& blockType, int posPID, int negPID);
f078d002 115
116public:
117 //Produce output for ESD collector from primary and v0 finders' outputs.
118 static void FillESD(AliESDEvent* esd, AliKFVertex* primVtx, const void* primData,
119 const void* v0Data);
120
121protected:
122
123 typedef std::vector<AliHLTTrackInfo> TrackInfoVector_t;
124 typedef TrackInfoVector_t::size_type VectorSize_t;
125
126 TrackInfoVector_t fTrackInfos;
127
128 ClassDef(AliHLTVertexFinderBase, 0);
129};
130
131namespace AliHLTUtility
132{
133
134//Small utility to automate command line parsing.
135//Command line consists of commands and parameters.
136//Currently, parameters can be of type int, double,
137//bool (so, command with one parameter of built-in type)
138//or CompoundType (this is for more complex
139//expressions like -command param1 param2 param3).
140//If SetParameter failes, it MUST throw std::runtime_error
141//with description. CmdLineParser will convert this
142//exception into negative integer and will compose
143//error message.
144
145class CompoundType
146{
147public:
148 virtual ~CompoundType()
149 {
150 }
151
152 virtual unsigned SetParameter(unsigned argc, const char** argv, unsigned currPos) = 0;
153};
154
155//Parameter for a command. If the type is CompoundType, it's up to CompoundType
156//to do all parsing. If it's int, double, bool - checks are done here:
157//1. Check if parameter was set already (user specified the same command more than
158// once - this is an error).
159//2. Check if parameter for command was specified.
160//3. Parameter has correct value: 0 or 1 for bool and
161// for int or double non-empty constraint is satisfied
162//
163//Object of type Parameter holds a pointer to real object of type int, bool, double
164//(or CompoundType) and this real objects are updated
165//from command line parameters, using SetParameter function.
166
167class Parameter
168{
169public:
170 enum Constraint
171 {
172 none,
173 positive,
174 nonNegative
175 //Something else.
176 };
177
178 Parameter();
179 Parameter(bool* b);
180 Parameter(int* i, Constraint c);
181 Parameter(double* d, Constraint c);
182 Parameter(CompoundType* cp);
183
184 //Returns number of argv elements processed, starting from
185 //currPos.
186 unsigned SetParameter(unsigned argc, const char** argv, unsigned currPos);
187
188private:
189 //If any constraint was set:
190 void CheckConstraint();
191 //
192 void SetConstraintChecker();
193
194 bool fWasSet; //Parameter was set already.
195 Constraint fConstraint; //Constraint on parameter.
196
197 bool* fBool; //Real object to set of type bool.
198 int* fInt; //Real object to set of type int.
199 double* fDouble; //Real object to set of type double.
200 CompoundType* fCompound; //"Object" to set of complex type.
201
202 void (*fConstraintChecker)(const Parameter& param); //Constraint checker.
203
204 static void CheckPositive(const Parameter& param);
205 static void CheckNonNegative(const Parameter& param);
206 //Something else.
207
208 //Compiler generated dtor, copy-ctor and copy-assignment operators are ok.
209};
210
211//CmdLineParser parses char** argv, which constains commands and
212//options for these commands.
213//Returns the number of processed argv elements.
214
215class CmdLineParser
216{
217public:
218
219 CmdLineParser() : fParameters(), fIgnored(), fError()
220 {
221 }
222
223 void Add(const TString& cmd, bool* b);
224 void Add(const TString& cmd, int* i, Parameter::Constraint c = Parameter::none);
225 void Add(const TString& cmd, double* d, Parameter::Constraint c = Parameter::none);
226 void Add(const TString& cmd, CompoundType* ct);
227
228 //Skip -command nParams * params
229 void IgnoreCommand(const TString& cmd, unsigned nParams);
230
231 int Parse(unsigned argc, const char** argv, unsigned currPos);
232
233 const TString& GetError()const
234 {
235 return fError;
236 }
237
238private:
239
240 typedef std::map<TString, Parameter> ParameterMap_t;
241 typedef ParameterMap_t::iterator MapIter_t;
242 typedef std::map<TString, unsigned> SkipMap_t;
243 typedef SkipMap_t::const_iterator SkipMapIter_t;
244
245 //Map of commands and it's parameters.
246 ParameterMap_t fParameters;
247 //These commands and its parameters (if any) will be skipped.
248 SkipMap_t fIgnored;
249
250 TString fError; //Error message describing parsing errors.
251};
252
253}
254
255#endif