]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/misc/AliL3DDLDataFileHandler.cxx
Time performance improvements in HLT hough transform and huffman decompression of...
[u/mrichter/AliRoot.git] / HLT / misc / AliL3DDLDataFileHandler.cxx
CommitLineData
240d63be 1// @(#) $Id$
2
3// Author: C. Loizides <loizides@ikf.uni-frankfurt.de>
4//*-- Copyright &copy ALICE HLT Group
5
6#include "AliL3StandardIncludes.h"
7
8#include "AliL3RootTypes.h"
9#include "AliL3Logging.h"
10#include "AliL3Transform.h"
11#include "AliL3MemHandler.h"
12#include "AliL3DigitData.h"
b2a02bce 13#ifdef use_newio
a27af97b 14#include "../RAW/AliRawReaderRoot.h"
045549b7 15#include "../RAW/AliRawReaderDate.h"
b2a02bce 16#else
17#include "AliL3DDLTPCRawStream.h"
18#include "AliL3DDLRawReaderFile.h"
19#endif
240d63be 20#include "AliL3DDLDataFileHandler.h"
21
0bd0c1ef 22#if __GNUC__ == 3
240d63be 23using namespace std;
24#endif
25
26/** \class AliL3DDLDataFileHandler
27<pre>
28//_____________________________________________________________
29// AliL3DDLDataFileHandler
30//
31// This class does converts from the DDL format of offline
32// into the memory I/O handling of the HLT binary files.
33//
34// Examples: see ddl2binary in exa and the general
35// AliL3MemHandler class description
36//
37</pre>
38*/
39
40ClassImp(AliL3DDLDataFileHandler)
41
42AliL3DDLDataFileHandler::AliL3DDLDataFileHandler()
43{
54b54089 44 // default constructor
240d63be 45 fReader=0;
46 fTPCStream=0;
47}
48
49AliL3DDLDataFileHandler::~AliL3DDLDataFileHandler()
50{
54b54089 51 // destructor
240d63be 52 FreeAll();
53}
54
55void AliL3DDLDataFileHandler::FreeAll()
56{
54b54089 57 // frees all heap memory
240d63be 58 if(fReader) delete fReader;
59 if(fTPCStream) delete fTPCStream;
60 fReader = 0;
61 fTPCStream = 0;
62}
63
64
b2a02bce 65#ifdef use_newio
a27af97b 66Bool_t AliL3DDLDataFileHandler::SetReaderInput(Char_t *name,Int_t event)
240d63be 67{
54b54089 68 // sets the input of the reader
a27af97b 69 fEvent=event;
70 if(fReader) delete fReader;
71 if(fTPCStream) delete fTPCStream;
045549b7 72 if(event>=0){
73 fFilename=name;
74 fReader=new AliRawReaderRoot(name,event);
75 } else {
76 fFilename="";
a8ffd46b 77 fReader=new AliRawReaderDate((void *)name);
045549b7 78 }
a27af97b 79 fTPCStream=new AliTPCRawStream(fReader);
240d63be 80
81 return kTRUE;
82}
b2a02bce 83#else
84Bool_t AliL3DDLDataFileHandler::SetReaderInput(Char_t *name, Bool_t add)
85{
54b54089 86 // sets the input of the reader
b2a02bce 87 if(fReader){
88 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::SetReaderInput","File Open")
89 <<"Reader ptr is already in use"<<ENDLOG;
90 return kFALSE;
91 }
92
93 fReader=new AliL3DDLRawReaderFile(name,add);
94 fTPCStream=new AliL3DDLTPCRawStream(fReader);
95
96 return kTRUE;
97}
98Bool_t AliL3DDLDataFileHandler::SetReaderInput(AliL3DDLRawReaderFile *rf)
99{
54b54089 100 // sets the input of the reader
b2a02bce 101 if(fReader){
102 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetReaderInput","File Open")
103 <<"Reader ptr is already in use, delete it first"<<ENDLOG;
104 return kFALSE;
105 }
106
107 //Open the raw data file with given file.
108 fReader = rf;
109 fTPCStream=new AliL3DDLTPCRawStream(fReader);
110
111 return kTRUE;
112}
113#endif
240d63be 114
115void AliL3DDLDataFileHandler::CloseReaderInput()
116{
54b54089 117 // closes the input of the reader
240d63be 118 if(!fReader){
119 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::CloseReaderInput","File Close")
120 <<"Nothing to Close"<<ENDLOG;
121 return;
122 }
123
124 delete fReader;
125 delete fTPCStream;
126 fReader = 0;
127 fTPCStream = 0;
128}
129
b2a02bce 130#ifdef use_newio
54b54089 131Bool_t AliL3DDLDataFileHandler::IsDigit(Int_t /*i*/) const
a27af97b 132{
54b54089 133 // dummy
a27af97b 134 return kTRUE;
135}
b2a02bce 136#endif
a27af97b 137
a8ffd46b 138#ifndef fast_raw
240d63be 139AliL3DigitRowData * AliL3DDLDataFileHandler::DDLData2Memory(UInt_t &nrow,Int_t event)
a27af97b 140{
54b54089 141 // transfers the DDL data to the memory
b2a02bce 142#ifdef use_newio
045549b7 143 if((fEvent>=0)&&(event!=fEvent)){
a27af97b 144 fEvent=event;
145 if(fReader) delete fReader;
146 if(fTPCStream) delete fTPCStream;
147 fReader=new AliRawReaderRoot(fFilename,event);
148 fTPCStream=new AliTPCRawStream(fReader);
149 }
b2a02bce 150#endif
240d63be 151 AliL3DigitRowData *data = 0;
152 nrow=0;
153
154 if(!fReader){
155 LOG(AliL3Log::kWarning,"AliL3DDLDataFileHandler::DDLData2Memory","File")
156 <<"No Input avalible: no object AliL3DDLRawReaderFile"<<ENDLOG;
157 return 0;
158 }
159
160 Int_t nrows=fRowMax-fRowMin+1;
161 Int_t ndigitcount=0;
62bb4b3d 162 Int_t * ndigits = new Int_t[nrows];
240d63be 163 UShort_t ***charges=new UShort_t**[nrows];
164 for(Int_t r=fRowMin;r<=fRowMax;r++){
165 Int_t lrow=r-fRowMin;
166 charges[lrow]=new UShort_t*[AliL3Transform::GetNPads(r)];
167 for(Int_t k=0;k<AliL3Transform::GetNPads(r);k++){
168 charges[lrow][k]=new UShort_t[AliL3Transform::GetNTimeBins()];
169 for(Int_t j=0;j<AliL3Transform::GetNTimeBins();j++) charges[lrow][k][j]=0;
170 }
171 }
a8ffd46b 172
54b54089 173 Int_t ddlsToSearch=0;
240d63be 174 Int_t ddls[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
175 Int_t ddlid=-1,lddlid=-1;
176 for(Int_t r=fRowMin;r<=fRowMax;r++){
177 ndigits[r-fRowMin] = 0; //now digits on row
178
179 Int_t patch=AliL3Transform::GetPatch(r);
180 Int_t sector,row;
181 AliL3Transform::Slice2Sector(fSlice,r,sector,row);
182
183 if(sector<36) //taken from AliTPCBuffer160.cxx
184 ddlid=sector*2+patch;
185 else
186 ddlid=70+(sector-36)*4+patch;
187
188 if((lddlid!=ddlid-1)&&(r==30)){ //dont forget the split row on the last ddl
54b54089 189 ddls[ddlsToSearch++]=ddlid-1;
240d63be 190 lddlid=ddlid-1;
191 }
a8ffd46b 192
240d63be 193 if((lddlid==-1)||(ddlid!=lddlid)){
54b54089 194 ddls[ddlsToSearch++]=ddlid;
240d63be 195 lddlid=ddlid;
196 }
197 if((r==90)||(r==139)){ //dont forget the split row on the next ddl
54b54089 198 ddls[ddlsToSearch++]=ddlid+1;
240d63be 199 lddlid=ddlid+1;
200 }
201 }
240d63be 202
a8ffd46b 203 // for(Int_t i=0;i<ddlsToSearch;i++) cout << ddls[i] <<endl;
204
205 if(ddls[0]>ddls[ddlsToSearch-1]) {
206 Int_t tempddl = ddls[0];
207 ddls[0] = ddls[ddlsToSearch-1];
208 ddls[ddlsToSearch-1] = tempddl;
209 }
b2a02bce 210#ifdef use_newio
a27af97b 211 fReader->Reset();
a8ffd46b 212 fReader->Select(0,ddls[0],ddls[ddlsToSearch-1]);
213 fTPCStream->Reset();
b2a02bce 214#else
215 fTPCStream->SetDDLID(ddls[i]); //ddl to read out
216#endif
a8ffd46b 217 Int_t zerosup = AliL3Transform::GetZeroSup();
218 Int_t adcsat = AliL3Transform::GetADCSat();
219 Int_t slice,srow;
220 Int_t lrow;
a27af97b 221
b2a02bce 222 while (fTPCStream->Next()){
240d63be 223
a8ffd46b 224 if(fTPCStream->IsNewSector() || fTPCStream->IsNewRow()) {
225 Int_t sector=fTPCStream->GetSector();
226 Int_t row=fTPCStream->GetRow();
227 AliL3Transform::Sector2Slice(slice,srow,sector,row);
228 if(slice!=fSlice){
229 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Slice")
230 <<AliL3Log::kDec<<"Found slice "<<slice<<", expected "<<fSlice<<ENDLOG;
231 continue;
232 }
233 lrow=srow-fRowMin;
234 }
240d63be 235
236 //test row criteria (patch boundaries)
240d63be 237 if((srow<fRowMin)||(srow>fRowMax))continue;
240d63be 238
a8ffd46b 239 Int_t pad=fTPCStream->GetPad();
240 if(fTPCStream->IsNewPad()) {
241 if((pad<0)||(pad>=AliL3Transform::GetNPads(srow))){
242 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Pad")
243 <<AliL3Log::kDec<<"Pad value out of bounds "<<pad<<" "
244 <<AliL3Transform::GetNPads(srow)<<ENDLOG;
245 continue;
246 }
240d63be 247 }
a8ffd46b 248
249 Int_t time=fTPCStream->GetTime();
240d63be 250 if((time<0)||(time>=AliL3Transform::GetNTimeBins())){
251 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Time")
252 <<AliL3Log::kDec<<"Time out of bounds "<<time<<" "
253 <<AliL3Transform::GetNTimeBins()<<ENDLOG;
254 continue;
255 }
256
257 //store digit
a8ffd46b 258 UShort_t dig=fTPCStream->GetSignal();
259 if(dig <= zerosup) continue;
260 if(dig >= adcsat) dig = adcsat;
261
240d63be 262 ndigits[lrow]++; //for this row only
263 ndigitcount++; //total number of digits to be published
264
265 charges[lrow][pad][time]=dig;
266 }
a8ffd46b 267
240d63be 268 Int_t size = sizeof(AliL3DigitData)*ndigitcount
269 + nrows*sizeof(AliL3DigitRowData);
270
271 LOG(AliL3Log::kDebug,"AliL3DDLDataFileHandler::DDLDigits2Memory","Digits")
272 <<AliL3Log::kDec<<"Found "<<ndigitcount<<" Digits"<<ENDLOG;
273
274 data=(AliL3DigitRowData*) Allocate(size);
275 nrow = (UInt_t)nrows;
276 AliL3DigitRowData *tempPt = data;
277
278 for(Int_t r=fRowMin;r<=fRowMax;r++){
279 Int_t lrow=r-fRowMin;
280 tempPt->fRow = r;
281 tempPt->fNDigit = ndigits[lrow];
282
283 Int_t localcount=0;
284 for(Int_t pad=0;pad<AliL3Transform::GetNPads(r);pad++){
285 for(Int_t time=0;time<AliL3Transform::GetNTimeBins();time++){
286 UShort_t dig=charges[lrow][pad][time];
287 if(!dig) continue;
288
289 if(localcount >= ndigits[lrow])
290 LOG(AliL3Log::kFatal,"AliL3DDLDataFileHandler::DDLDigits2Binary","Memory")
291 <<AliL3Log::kDec<<"Mismatch: localcount "<<localcount<<" ndigits "
292 <<ndigits[lrow]<<ENDLOG;
293
294
295 tempPt->fDigitData[localcount].fCharge=dig;
296 tempPt->fDigitData[localcount].fPad=pad;
297 tempPt->fDigitData[localcount].fTime=time;
298#ifdef do_mc
299 tempPt->fDigitData[localcount].fTrackID[0] = 0;
300 tempPt->fDigitData[localcount].fTrackID[1] = 0;
301 tempPt->fDigitData[localcount].fTrackID[2] = 0;
302#endif
303 localcount++;
304 }
305 }
306
307 if(localcount != ndigits[lrow])
308 LOG(AliL3Log::kFatal,"AliL3DDLDataFileHandler::DDLDigits2Binary","Memory")
309 <<AliL3Log::kDec<<"Mismatch: localcount "<<localcount<<" ndigits "
310 <<ndigits[lrow]<<ENDLOG;
311
312
313 Byte_t *tmp = (Byte_t*)tempPt;
314 Int_t size = sizeof(AliL3DigitRowData)
315 + ndigits[lrow]*sizeof(AliL3DigitData);
316 tmp += size;
317 tempPt = (AliL3DigitRowData*)tmp;
318 }
319
320 //delete charge array
321 for(Int_t r=fRowMin;r<=fRowMax;r++){
322 Int_t lrow=r-fRowMin;
323 for(Int_t k=0;k<AliL3Transform::GetNPads(r);k++)
324 delete charges[lrow][k];
325 delete charges[lrow];
326 }
327 delete charges;
62bb4b3d 328 delete [] ndigits;
240d63be 329
330 return data;
331}
a8ffd46b 332#else
333AliL3DigitRowData * AliL3DDLDataFileHandler::DDLData2Memory(UInt_t &nrow,Int_t event)
334{
335 // transfers the DDL data to the memory
336#ifdef use_newio
337 if((fEvent>=0)&&(event!=fEvent)){
338 fEvent=event;
339 if(fReader) delete fReader;
340 if(fTPCStream) delete fTPCStream;
341 fReader=new AliRawReaderRoot(fFilename,event);
342 fTPCStream=new AliTPCRawStream(fReader);
343 }
344#endif
345 AliL3DigitRowData *data = 0;
346 nrow=0;
240d63be 347
a8ffd46b 348 if(!fReader){
349 LOG(AliL3Log::kWarning,"AliL3DDLDataFileHandler::DDLData2Memory","File")
350 <<"No Input avalible: no object AliL3DDLRawReaderFile"<<ENDLOG;
351 return 0;
352 }
353
354 Int_t nrows=fRowMax-fRowMin+1;
355
356 Int_t ddlsToSearch=0;
357 Int_t ddls[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
358 Int_t ddlid=-1,lddlid=-1;
359 for(Int_t r=fRowMin;r<=fRowMax;r++){
360
361 Int_t patch=AliL3Transform::GetPatch(r);
362 Int_t sector,row;
363 AliL3Transform::Slice2Sector(fSlice,r,sector,row);
364
365 if(sector<36) //taken from AliTPCBuffer160.cxx
366 ddlid=sector*2+patch;
367 else
368 ddlid=70+(sector-36)*4+patch;
369
370 if((lddlid==-1)||(ddlid!=lddlid)){
371 ddls[ddlsToSearch++]=ddlid;
372 lddlid=ddlid;
373 }
374 }
375
376 // for(Int_t i=0;i<ddlsToSearch;i++) cout << ddls[i] <<endl;
377
378#ifdef use_newio
379 fReader->Reset();
380 fReader->Select(0,ddls[0],ddls[ddlsToSearch-1]);
381 fTPCStream->Reset();
382#else
383 fTPCStream->SetDDLID(ddls[i]); //ddl to read out
384#endif
385
386 nrow = (UInt_t)nrows;
387
388 return data;
389}
390#endif
240d63be 391
392Bool_t AliL3DDLDataFileHandler::DDLData2CompBinary(Int_t event)
393{
54b54089 394 // transfers the DDL data to the memory and converts it
395 // to comp binary
240d63be 396 Bool_t out = kTRUE;
397 UInt_t ndigits=0;
398 AliL3DigitRowData *digits=0;
399 digits = DDLData2Memory(ndigits,event);
400 out = Memory2CompBinary(ndigits,digits);
401 Free();
402 return out;
403}