correcting printf format specifiers
[u/mrichter/AliRoot.git] / HLT / comp / AliHLTCOMPHuffmanAltroCalibComponent.cxx
CommitLineData
c2440081 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Authors: Jochen Thaeder <thaeder@kip.uni-heidelberg.de> *
5 * for The ALICE Off-line Project. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/** @file AliHLTCOMPHuffmanAltroCalibComponent.cxx
17 @author Jochen Thaeder
18 @date
19 @brief A calibration component for the Huffman code creation.
20*/
21
22#if __GNUC__>= 3
23using namespace std;
24#endif
25
26#include "AliHLTCOMPHuffmanAltroCalibComponent.h"
27#include "AliHLTCOMPHuffmanAltro.h"
28#include "AliHLTCompDefinitions.h"
29#include "AliHLTStdIncludes.h"
8d53dca2 30#include "AliHLTReadoutList.h"
c2440081 31#include "TFile.h" // necessary for HuffmanData writing
32
33ClassImp(AliHLTCOMPHuffmanAltroCalibComponent)
34
35AliHLTCOMPHuffmanAltroCalibComponent::AliHLTCOMPHuffmanAltroCalibComponent()
36 :
37 fHuffmanCompressor(NULL),
af2ed151 38 fHuffmanData(NULL),
5eefc803 39 fOrigin(kAliHLTVoidDataOrigin),
c2440081 40 fRunNumber(0),
41 fSpecification(0),
42 fTablePath(),
43 fNRCUTrailerWords(0) {
44 // see header file for class documentation
45 // or
46 // refer to README to build package
47 // or
48 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
49}
50
51AliHLTCOMPHuffmanAltroCalibComponent::~AliHLTCOMPHuffmanAltroCalibComponent() {
52 // see header file for class documentation
53}
54
55// Public functions to implement AliHLTComponent's interface.
56// These functions are required for the registration process
57
58const char* AliHLTCOMPHuffmanAltroCalibComponent::GetComponentID() {
59 // see header file for class documentation
60
61 return "COMPHuffmanTrainer";
62}
63
64void AliHLTCOMPHuffmanAltroCalibComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list) {
65 // see header file for class documentation
c2440081 66 list.clear();
67 list.push_back( kAliHLTDataTypeDDLRaw );
68}
69
70AliHLTComponentDataType AliHLTCOMPHuffmanAltroCalibComponent::GetOutputDataType() {
71 // see header file for class documentation
c2440081 72 AliHLTComponentDataType dt=AliHLTCompDefinitions::fgkHuffmanAltroCalDataType;
73 if (!fOrigin.IsNull()) dt=dt|fOrigin.Data();
74 return dt;
bf7a3243 75
c2440081 76}
77
78void AliHLTCOMPHuffmanAltroCalibComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier ) {
79 // see header file for class documentation
c2440081 80 constBase = sizeof(AliHLTCOMPHuffmanData);
81 inputMultiplier = (0.0);
82}
83
84AliHLTComponent* AliHLTCOMPHuffmanAltroCalibComponent::Spawn() {
85 // see header file for class documentation
86
87 return new AliHLTCOMPHuffmanAltroCalibComponent();
88}
89
90
91Int_t AliHLTCOMPHuffmanAltroCalibComponent::ScanArgument( Int_t argc, const char** argv ) {
92 // see header file for class documentation
93
94 Int_t iResult = 0;
95 TString argument = " ";
96 TString parameter = " ";
97
98 if ( !argc )
99 return -EINVAL;
100
101 argument = argv[iResult];
102
103 if ( argument.IsNull() )
104 return -EINVAL;
105
106 // get data origin
107 if ( argument.CompareTo("-origin") == 0 )
108 {
109
110 if ( ++iResult >= argc )
111 {
112 iResult = -EPROTO;
113 }
114 else
115 {
116 fOrigin = argv[1];
117
bf7a3243 118 while(fOrigin.Length() < kAliHLTComponentDataTypefOriginSize)
119 {
120 fOrigin.Append(" ");
121 }
122
c2440081 123 HLTInfo("Origin is set to %s.", fOrigin.Data());
124
125 }
126 }
127
128 else
129 {
130 // get run number
131 if ( argument.CompareTo("-runnumber") == 0 )
132 {
133
134 if ( ++iResult >= argc )
135 {
136 iResult = -EPROTO;
137 }
138 else
139 {
140 parameter = argv[1];
141
142 // get run number
143
144 fRunNumber = atoi(parameter.Data());
145
146 HLTInfo( "Run number is set to %d (Dec) = %X (Hex).", fRunNumber, fRunNumber );
147 }
148 }
149 else
150 {
151 // get data specification
152 if(argument.CompareTo("-dataspec") == 0 )
153 {
154 if ( ++iResult >= argc )
155 {
156 iResult = -EPROTO;
157 }
158 else
159 {
160 // get data specification
161 fSpecification = strtoul( argv[1], NULL, 16);
162
163 HLTInfo( "Specification is set to %d (Dec) = %08X (Hex).", fSpecification, fSpecification );
164 }
165 }
166 // get number of trailer words
167 else
168 {
169
170 if ( argument.CompareTo("-tablepath") == 0)
171 {
172 if ( ++iResult >= argc )
173 {
174 iResult = -EPROTO;
175 }
176 else
177 {
178 // get table path
179 fTablePath = argv[1];
bf7a3243 180 HLTInfo( "Path for Huffman table output is set to %s.", fTablePath.Data() );
c2440081 181 if (!fTablePath.IsNull() && !fTablePath.EndsWith("/"))
bf7a3243 182 fTablePath+="/";
c2440081 183 }
184 }
185
186 else
187 {
188 if ( argument.CompareTo("-trailerwords") == 0 )
189 {
190
191 if ( ++iResult >= argc )
192 {
193 iResult = -EPROTO;
194 }
195 else
196 {
197 parameter = argv[1];
198 if ( parameter.CompareTo("1") == 0 )
199 {
200 fNRCUTrailerWords = 1;
201 HLTInfo( "Number of trailer words is set to 1." );
202 }
203 else if ( parameter.CompareTo("2") == 0 )
204 {
205 fNRCUTrailerWords = 2;
206 HLTInfo( "Number of trailer words is set to 2." );
207 }
208 else if ( parameter.CompareTo("3") == 0 )
209 {
210 fNRCUTrailerWords = 3;
211 HLTInfo( "Number of trailer words is set to 3." );
212 }
213 else
214 {
215 HLTError( "Invalid number of trailerwords: '%s'.", argv[1] );
216 iResult = -EPROTO;
217 }
218 }
219 }
220 else
221 {
222 iResult = -EINVAL;
223 }
224 }
225 }
226 }
227 }
228
229 return iResult;
230}
231
232Int_t AliHLTCOMPHuffmanAltroCalibComponent::InitCalibration() {
233 // see header file for class documentation
234
235 // ** Create a calibration instance to train the Huffman code table
236 if ( fHuffmanCompressor )
237 return EINPROGRESS;
238
239 if ( fHuffmanData )
240 return EINPROGRESS;
241
242 // create a new instance of HuffmanData to write results from training in
243 fHuffmanData = new AliHLTCOMPHuffmanData();
244
245 fHuffmanCompressor = new AliHLTCOMPHuffmanAltro(kTRUE, kTRUE, NULL, fNRCUTrailerWords);
246
247 // initialise new training table
248 fHuffmanCompressor->InitNewTrainingTable();
249
250 return 0;
251}
252
253Int_t AliHLTCOMPHuffmanAltroCalibComponent::DeinitCalibration() {
254 // see header file for class documentation
255
256 if ( fHuffmanCompressor )
257 delete fHuffmanCompressor;
258 fHuffmanCompressor = NULL;
259
260 if ( fHuffmanData )
261 delete fHuffmanData;
262 fHuffmanData = NULL;
263
264 return 0;
265}
266
267/** function to do the calibration */
a2ba9ae9 268Int_t AliHLTCOMPHuffmanAltroCalibComponent::ProcessCalibration( const AliHLTComponentEventData& evtData, AliHLTComponentTriggerData& /*trigData*/ ) {
c2440081 269 // see header file for class documentation
270
a2ba9ae9 271 if (evtData.fEventID==0) {
272 // this is only to avoid missing parameter warning when compiling for non
273 // debug. The parameter is used in the HLTDebug message only.
274 }
275
c2440081 276 const AliHLTComponentBlockData* iter = NULL;
277
278 //AliHLTUInt8_t slice, patch;
279
280 // ** Loop over all input blocks and specify which data format should be read - only select Raw Data
281 iter = GetFirstInputBlock( kAliHLTDataTypeDDLRaw );
c2440081 282
bf7a3243 283 if ( iter != NULL ) do {
284
c2440081 285 // ** Print Debug output which data format was received
286 HLTDebug ( "Event received - Event 0x%08LX (%Lu) received datatype: %s - required datatype: %s",
287 evtData.fEventID, evtData.fEventID, DataType2Text(iter->fDataType).c_str(), DataType2Text(kAliHLTDataTypeDDLRaw).c_str());
288
289
290 TString blockorigin("");
291 blockorigin.Insert(0, iter->fDataType.fOrigin, kAliHLTComponentDataTypefOriginSize);
292
293 if (fOrigin.IsNull())
294 {
295 // if origin is not explicitly set by command line, take origin from data block
296 fOrigin=blockorigin;
297 HLTDebug("Origin of current data block set by block itself is %s.", blockorigin.Data());
298 }
299 else
300 {
bf7a3243 301 // if set origin is not equal to current block origin, printout warning!
c2440081 302 if(fOrigin.CompareTo(blockorigin)!=0) {
303 HLTWarning("Origin %s of current data block does not match origin set by command line argument %s.", blockorigin.Data(), fOrigin.Data());
304 continue;
305 }
306 }
307
308 // ** Get DDL ID in order to tell the memory reader which slice/patch to use
309 //fSlice = AliHLTCompDefinitions::GetMinSliceNr( *iter );
310 //fPatch = AliHLTCompDefinitions::GetMinPatchNr( *iter );
311
312 //HLTDebug ( "Input Raw Data - Slice/Patch: %d/%d.", fSlice, fPatch);
313
314 fHuffmanCompressor->SetInputData(iter->fPtr, iter->fSize);
315
316 // only necessary for output in binary file
317 //fHuffmanCompressor->SetSlice(fSlice);
318 //fHuffmanCompressor->SetPatch(fPatch);
319
320 fHuffmanCompressor->ProcessData();
321
322 // ** Get next input block, with the same specification as defined in GetFirstInputBlock()
323 } while ( (iter = GetNextInputBlock()) != NULL );
324
325 // ** Get output specification
326 // commented out for the moment to read spec in from command line argument
327 //fSpecification = AliHLTCompDefinitions::EncodeDataSpecification( fSlice, fSlice, fPatch, fPatch );
328 //fSpecification = fSlice<<24 | fSlice<<16 | fPatch<<8 | fPatch;
329
330 // ** PushBack data to shared memory ...
331
332 // DATA TYE to DEFINE !!! XXXX
333 PushBack( (TObject*) fHuffmanData, AliHLTCompDefinitions::fgkHuffmanAltroCalDataType|fOrigin.Data(), fSpecification);
334
335 return 0;
336} // Int_t AliHLTCOMPHuffmanAltroCalibComponent::ProcessCalibration( const AliHLTComponentEventData& evtData, AliHLTComponentTriggerData& trigData ) {
337
338
5eefc803 339Int_t AliHLTCOMPHuffmanAltroCalibComponent::ShipDataToFXS( const AliHLTComponentEventData& /*evtData*/, AliHLTComponentTriggerData& /*trigData*/ ) {
c2440081 340 // see header file for class documentation
341
342 // create code from training table
343 fHuffmanCompressor->CreateCodeTable();
344
345 // write code table and occurrence table to HuffmanData instance
346 fHuffmanCompressor->SetHuffmanData(fHuffmanData);
347
348 TString rootfilename;
349 if(fTablePath.IsNull() )
350 {
351 // if there is no explicit table path, take current path
8cfd4eb4 352 rootfilename.Form("huffmanData_%s_%08X_%08X.root", fOrigin.Data(), (unsigned)fRunNumber, (unsigned)fSpecification);
c2440081 353 }
354 else
355 {
8cfd4eb4 356 rootfilename.Form("%shuffmanData_%s_%08X_%08X.root", fTablePath.Data(), fOrigin.Data(), (unsigned)fRunNumber, (unsigned)fSpecification);
c2440081 357 }
358
359 TFile* huffmanrootfile = new TFile(rootfilename, "RECREATE");
360 huffmanrootfile->WriteObject(fHuffmanData,"HuffmanData");
361 huffmanrootfile->Write();
362 huffmanrootfile->Close();
363
364 // ** PushBack data to FXS ...
92272b35 365 // currently specification has to be put in by command line argument!
366 Int_t dataspec = (Int_t) fSpecification;
c2440081 367
92272b35 368 fHuffmanData->SetOCDBSpecifications(fOrigin, dataspec);
8d53dca2 369 static AliHLTReadoutList rdList(AliHLTReadoutList::kTPC);
89413559 370 PushToFXS( (TObject*) fHuffmanData, "TPC", "HuffmanData", &rdList ) ;
c2440081 371
372 return 0;
373} // Int_t AliHLTCOMPHuffmanAltroCalibComponent::ShipDataToFXS( const AliHLTComponentEventData& evtData, AliHLTComponentTriggerData& trigData ) {