Line data Source code
1 : //-*- Mode: C++ -*-
2 : // $Id$
3 :
4 : #ifndef ALIHLTTPCCLUSTERFINDERCOMPONENT_H
5 : #define ALIHLTTPCCLUSTERFINDERCOMPONENT_H
6 :
7 : //* This file is property of and copyright by the ALICE HLT Project *
8 : //* ALICE Experiment at CERN, All rights reserved. *
9 : //* See cxx source for full Copyright notice *
10 :
11 : /// @file AliHLTTPCClusterFinderComponent.h
12 : /// @author Timm Steinbeck, Matthias Richter, Kenneth Aamodt
13 : /// @date
14 : /// @brief The TPC cluster finder component.
15 : ///
16 :
17 : #include "AliHLTProcessor.h"
18 : #include "AliHLTComponentBenchmark.h"
19 :
20 : class AliHLTTPCClusterFinder;
21 : class AliHLTTPCDigitReader;
22 : class AliTPCTransform;
23 :
24 : /**
25 : * @class AliHLTTPCClusterFinderComponent
26 : * Implementation of the cluster finder component.
27 : * The component implements the interface methods of the @ref AliHLTProcessor.
28 : * The actual cluster finding algorithm is implemented in @ref AliHLTTPCClusterFinder.
29 : * Two components are registered, TPCClusterFinderUnpacked is for reading the HLT
30 : * internal digit data format used in the simulation. TPCClusterFinder32Bit uses
31 : * the AliHLTTPCDigitReader for raw data. After a phase of different decoder/raw stream
32 : * implementations the CF for raw data is using the default offline raw stream for
33 : * the 32bit RCU format AliAltroRawStreamV3, which also has a fall back to the 40bit
34 : * AliAltroRawStream if the old RCU format is detected.
35 : *
36 : * The clusterfinder is now using the AliTPCTransform instead of the AliHLTTPCTransform for
37 : * transformations from row, pad time -> x,y,z.
38 : *
39 : * <h2>General properties:</h2>
40 : *
41 : * Component ID: \b TPCClusterFinderUnpacked and TPCClusterFinder32Bit <br>
42 : * Library: \b libAliHLTTPC
43 : * Input Data Types: @ref kAliHLTDataTypeDDLRaw <br>
44 : * Output Data Types: @ref AliHLTTPCDefinitions::fgkClustersDataType and/or kAliHLTDataTypeHwAddr16 <br>
45 : *
46 : *
47 : * Mandatory arguments: <br>
48 : * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
49 : *
50 : * Optional arguments: <br>
51 : * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
52 : * \li -deconvolute-time <br>
53 : * Turns on deconvolution in the time direction.
54 : * \li -deconvolute-pad <br>
55 : * Turns on deconvolution in the pad direction.
56 : * \li -timebins <br>
57 : * Sets the number of timebins (446 for simulated data, and 1024 for real data) Default:1024
58 : * \li -first-timebin <br>
59 : * First timebin taken into consideration when reading the data.
60 : * \li -last-timebin <br>
61 : * Last timebin taken into consideration when reading the data.
62 : * \li -sorted <br>
63 : * Switch off unsorted reading of data. Equivalent to the old argument unsorted 0.
64 : * \li -active-pads <br>
65 : * Switch off unsorted reading of data. Equivalent to the old argument unsorted 0.
66 : * \li -occupancy-limit <br>
67 : * Set the occupancy limit for the sorted clusterfinding.
68 : *
69 : *
70 : * Obsolete arguments: <br>
71 : * \li occupancy-limit <br>
72 : * \li rawreadermode <br>
73 : * \li pp-run <br>
74 : * \li adc-threshold <br>
75 : * \li oldrcuformat <br>
76 : * \li unsorted <br>
77 : * \li nsigma-threshold <br>
78 : *
79 : * <h2>Default CDB entries:</h2>
80 : * The component has these default CDB entries
81 : * \li <tt>GRP/GRP/Data</tt>.
82 : * \li <tt>TPC/Calib/PadTime0</tt>.
83 : * \li <tt>TPC/Calib/Parameters</tt>.
84 : * \li <tt>TPC/Calib/TimeDrift</tt>.
85 : * \li <tt>TPC/Calib/Temperature</tt>.
86 : *
87 : * TODO: pad by pad gain calibration also has to be added to the clusterfinder
88 : *
89 : * And it also needs these below to avoid warnings during initialization and update of calibDB
90 : * \li <tt>TPC/Calib/PadGainFactor</tt>.
91 : * \li <tt>TPC/Calib/TimeGain</tt>.
92 : * \li <tt>TPC/Calib/GainFactorDedx</tt>.
93 : * \li <tt>TPC/Calib/PadNoise</tt>.
94 : * \li <tt>TPC/Calib/Pedestals</tt>.
95 : * \li <tt>TPC/Calib/ClusterParam</tt>.
96 : * \li <tt>TPC/Calib/AltroConfig</tt>.
97 : * \li <tt>TPC/Calib/Pulser</tt>.
98 : * \li <tt>TPC/Calib/CE</tt>.
99 : * \li <tt>TPC/Calib/Raw</tt>.
100 : * \li <tt>TPC/Calib/QA</tt>.
101 : * \li <tt>TPC/Calib/Mapping</tt>.
102 : * \li <tt>TPC/Calib/Goofie</tt>.
103 : * \li <tt>TPC/Calib/HighVoltage</tt>.
104 : * \li <tt>TPC/Calib/Ref</tt>.
105 : *
106 : * These entries are used by the AliTPCTransform class to correct for T0, drift and ExB.
107 : * @ingroup alihlt_tpc_components
108 : */
109 : class AliHLTTPCClusterFinderComponent : public AliHLTProcessor
110 : {
111 : public:
112 : /**
113 : * Defines for the cluster finder type.
114 : * The cluster finders can work on different formats of input data,
115 : * the AliHLTTPCDigitReader interface provides a transparent way to
116 : * read the data.
117 : */
118 : enum {
119 : // deprecated option for offline AliAltroRawStream
120 : kClusterFinderPacked,
121 : // Unpacked data of format AliHLTTPCUnpackedRawData */
122 : kClusterFinderUnpacked,
123 : // deprecated option for AliAltroDecoder
124 : kClusterFinderDecoder,
125 : // real data, offline altro decoder 32 bit format*/
126 : kClusterFinder32Bit
127 : };
128 :
129 : /**
130 : * constructor
131 : * @param mode input type see e.g. @ref kClusterFinderUnpacked
132 : */
133 : AliHLTTPCClusterFinderComponent(int mode);
134 : /** destructor */
135 : virtual ~AliHLTTPCClusterFinderComponent();
136 :
137 : // Public functions to implement AliHLTComponent's interface.
138 : // These functions are required for the registration process
139 :
140 : /** interface function, see AliHLTComponent for description */
141 : const char* GetComponentID();
142 : /** interface function, see AliHLTComponent for description */
143 : void GetInputDataTypes( vector<AliHLTComponentDataType>& list);
144 : /** interface function, see AliHLTComponent for description */
145 : AliHLTComponentDataType GetOutputDataType();
146 : /** interface function, see AliHLTComponent for description */
147 : int GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList);
148 : /** interface function, see AliHLTComponent for description */
149 : virtual void GetOutputDataSize( unsigned long& constBase, double& inputMultiplier );
150 : /** interface function, see AliHLTComponent for description */
151 : AliHLTComponent* Spawn();
152 : /** interface function, see @ref AliHLTComponent for description */
153 : void GetOCDBObjectDescription( TMap* const targetMap);
154 :
155 : protected:
156 :
157 : // Protected functions to implement AliHLTComponent's interface.
158 : // These functions provide initialization as well as the actual processing
159 : // capabilities of the component.
160 :
161 : int DoInit( int argc, const char** argv );
162 : int DoDeinit();
163 : int DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
164 : AliHLTComponentTriggerData& trigData, AliHLTUInt8_t* outputPtr,
165 : AliHLTUInt32_t& size, vector<AliHLTComponentBlockData>& outputBlocks );
166 : int Configure(const char* arguments);
167 : int ScanConfigurationArgument(int argc, const char** argv);
168 : int Reconfigure(const char* cdbEntry, const char* chainId);
169 :
170 : using AliHLTProcessor::DoEvent;
171 :
172 : private:
173 : /** standard constructor prohibited */
174 : AliHLTTPCClusterFinderComponent();
175 : /** copy constructor prohibited */
176 : AliHLTTPCClusterFinderComponent(const AliHLTTPCClusterFinderComponent&);
177 : /** assignment operator prohibited */
178 : AliHLTTPCClusterFinderComponent& operator=(const AliHLTTPCClusterFinderComponent&);
179 : /** the cluster finder object */
180 : AliHLTTPCClusterFinder* fClusterFinder; //!transient
181 : /** the reader object for data decoding */
182 : AliHLTTPCDigitReader* fReader; //!transient
183 :
184 : /** flag to deconvolute in time direction */
185 : Bool_t fDeconvTime; //!transient
186 : /** the object to set the time stamp */
187 : AliTPCTransform *fTS; //!transient
188 :
189 : /** flag to deconvolute in pad direction */
190 : Bool_t fDeconvPad; //!transient
191 : /** flag to switch on/off deconvolution in pad and time directions (used by sorted clusterfinding method) */
192 : bool fClusterDeconv; //!transient
193 : /** Error in xy of cluster */
194 : float fXYClusterError; //!transient
195 : /** Error in Z direction of cluster */
196 : float fZClusterError; //!transient
197 : /**
198 : * switch to indicated the reader
199 : * use fModeSwitch = 0 for packed inputtype "gkDDLPackedRawDataType"
200 : * use fModeSwitch = 1 for unpacked inputtype "gkUnpackedRawDataType"
201 : * use fModeSwitch = 2 for packed inputtype "gkDDLPackedRawDataType" with new digit reader
202 : * use fModeSwitch = 3 for packed inputtype "gkDDLPackedRawDataType" with 32bit digit reader
203 : */
204 : Int_t fModeSwitch; // see above
205 :
206 : /*
207 : * Reads the data the new unsorted way if true
208 : *
209 : */
210 : Int_t fUnsorted; //!transient
211 :
212 : /*
213 : * Patch number to be read, currently given as component argument,
214 : * will be changed later.
215 : */
216 : Int_t fPatch; //!transient
217 :
218 : /*
219 : * Switch to specify if one ship out a list of active pads (pads conected to a cluster).
220 : */
221 : Int_t fGetActivePads; //!transient
222 :
223 : /** First timebin taken into account when reading the data */
224 : Int_t fFirstTimeBin; //!transient
225 :
226 : /** Last timebin taken in to account when reading the data */
227 : Int_t fLastTimeBin; //!transient
228 :
229 : Bool_t fDoMC; // flag to provide MC labels
230 : Bool_t fReleaseMemory; // flag to release the memory after each event
231 : Bool_t fPublishRawClusters; // publish raw clusters in addition
232 : AliHLTComponentBenchmark fBenchmark; // benchmark
233 :
234 6 : ClassDef(AliHLTTPCClusterFinderComponent, 0)
235 :
236 : };
237 : #endif
|