3 // Author: C. Loizides <loizides@ikf.uni-frankfurt.de>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliL3StandardIncludes.h"
8 #include "AliL3RootTypes.h"
9 #include "AliL3Logging.h"
10 #include "AliL3Transform.h"
11 #include "AliL3MemHandler.h"
12 #include "AliL3DigitData.h"
14 #include "AliRawReaderRoot.h"
15 #include "AliRawReaderDate.h"
17 #include "AliL3DDLTPCRawStream.h"
18 #include "AliL3DDLRawReaderFile.h"
20 #include "AliL3DDLDataFileHandler.h"
26 /** \class AliL3DDLDataFileHandler
28 //_____________________________________________________________
29 // AliL3DDLDataFileHandler
31 // This class does converts from the DDL format of offline
32 // into the memory I/O handling of the HLT binary files.
34 // Examples: see ddl2binary in exa and the general
35 // AliL3MemHandler class description
40 ClassImp(AliL3DDLDataFileHandler)
42 AliL3DDLDataFileHandler::AliL3DDLDataFileHandler()
44 // default constructor
49 AliL3DDLDataFileHandler::~AliL3DDLDataFileHandler()
55 void AliL3DDLDataFileHandler::FreeAll()
57 // frees all heap memory
58 if(fReader) delete fReader;
60 if(fTPCStream) delete fTPCStream;
66 Bool_t AliL3DDLDataFileHandler::SetReaderInput(AliRawEvent *rawevent)
68 // sets the input of the reader
71 if(fReader) delete fReader;
72 fReader=new AliRawReaderRoot(rawevent);
73 if(fTPCStream) delete fTPCStream;
74 fTPCStream=new AliTPCRawStream(fReader);
79 Bool_t AliL3DDLDataFileHandler::SetReaderInput(Char_t *name,Int_t event)
81 // sets the input of the reader
83 if(fReader) delete fReader;
84 if(fTPCStream) delete fTPCStream;
87 fReader=new AliRawReaderRoot(name,event);
90 fReader=new AliRawReaderDate((void *)name);
92 fTPCStream=new AliTPCRawStream(fReader);
97 Bool_t AliL3DDLDataFileHandler::SetReaderInput(Char_t *name, Bool_t add)
99 // sets the input of the reader
101 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::SetReaderInput","File Open")
102 <<"Reader ptr is already in use"<<ENDLOG;
106 fReader=new AliL3DDLRawReaderFile(name,add);
107 fTPCStream=new AliL3DDLTPCRawStream(fReader);
111 Bool_t AliL3DDLDataFileHandler::SetReaderInput(AliL3DDLRawReaderFile *rf)
113 // sets the input of the reader
115 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetReaderInput","File Open")
116 <<"Reader ptr is already in use, delete it first"<<ENDLOG;
120 //Open the raw data file with given file.
122 fTPCStream=new AliL3DDLTPCRawStream(fReader);
128 void AliL3DDLDataFileHandler::CloseReaderInput()
130 // closes the input of the reader
132 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::CloseReaderInput","File Close")
133 <<"Nothing to Close"<<ENDLOG;
144 Bool_t AliL3DDLDataFileHandler::IsDigit(Int_t /*i*/) const
152 AliL3DigitRowData * AliL3DDLDataFileHandler::DDLData2Memory(UInt_t &nrow,Int_t event)
154 // transfers the DDL data to the memory
156 if((fEvent>=0)&&(event!=fEvent)){
158 if(fReader) delete fReader;
159 if(fTPCStream) delete fTPCStream;
160 fReader=new AliRawReaderRoot(fFilename,event);
161 fTPCStream=new AliTPCRawStream(fReader);
164 AliL3DigitRowData *data = 0;
168 LOG(AliL3Log::kWarning,"AliL3DDLDataFileHandler::DDLData2Memory","File")
169 <<"No Input avalible: no object AliL3DDLRawReaderFile"<<ENDLOG;
173 Int_t nrows=fRowMax-fRowMin+1;
175 Int_t * ndigits = new Int_t[nrows];
176 UShort_t ***charges=new UShort_t**[nrows];
177 for(Int_t r=fRowMin;r<=fRowMax;r++){
178 Int_t lrow=r-fRowMin;
179 charges[lrow]=new UShort_t*[AliL3Transform::GetNPads(r)];
180 for(Int_t k=0;k<AliL3Transform::GetNPads(r);k++){
181 charges[lrow][k]=new UShort_t[AliL3Transform::GetNTimeBins()];
182 for(Int_t j=0;j<AliL3Transform::GetNTimeBins();j++) charges[lrow][k][j]=0;
186 Int_t ddlsToSearch=0;
187 Int_t ddls[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
188 Int_t ddlid=-1,lddlid=-1;
189 for(Int_t r=fRowMin;r<=fRowMax;r++){
190 ndigits[r-fRowMin] = 0; //now digits on row
192 Int_t patch=AliL3Transform::GetPatch(r);
194 AliL3Transform::Slice2Sector(fSlice,r,sector,row);
196 if(sector<36) //taken from AliTPCBuffer160.cxx
197 ddlid=sector*2+patch;
199 ddlid=70+(sector-36)*4+patch;
201 if((lddlid!=ddlid-1)&&(r==30)){ //dont forget the split row on the last ddl
202 ddls[ddlsToSearch++]=ddlid-1;
206 if((lddlid==-1)||(ddlid!=lddlid)){
207 ddls[ddlsToSearch++]=ddlid;
210 if((r==90)||(r==139)){ //dont forget the split row on the next ddl
211 ddls[ddlsToSearch++]=ddlid+1;
216 // for(Int_t i=0;i<ddlsToSearch;i++) cout << ddls[i] <<endl;
218 if(ddls[0]>ddls[ddlsToSearch-1]) {
219 Int_t tempddl = ddls[0];
220 ddls[0] = ddls[ddlsToSearch-1];
221 ddls[ddlsToSearch-1] = tempddl;
225 fReader->Select(0,ddls[0],ddls[ddlsToSearch-1]);
228 fTPCStream->SetDDLID(ddls[i]); //ddl to read out
230 Int_t zerosup = AliL3Transform::GetZeroSup();
231 Int_t adcsat = AliL3Transform::GetADCSat();
235 while (fTPCStream->Next()){
237 if(fTPCStream->IsNewSector() || fTPCStream->IsNewRow()) {
238 Int_t sector=fTPCStream->GetSector();
239 Int_t row=fTPCStream->GetRow();
240 AliL3Transform::Sector2Slice(slice,srow,sector,row);
242 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Slice")
243 <<AliL3Log::kDec<<"Found slice "<<slice<<", expected "<<fSlice<<ENDLOG;
249 //test row criteria (patch boundaries)
250 if((srow<fRowMin)||(srow>fRowMax))continue;
252 Int_t pad=fTPCStream->GetPad();
253 if(fTPCStream->IsNewPad()) {
254 if((pad<0)||(pad>=AliL3Transform::GetNPads(srow))){
255 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Pad")
256 <<AliL3Log::kDec<<"Pad value out of bounds "<<pad<<" "
257 <<AliL3Transform::GetNPads(srow)<<ENDLOG;
262 Int_t time=fTPCStream->GetTime();
263 if((time<0)||(time>=AliL3Transform::GetNTimeBins())){
264 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Time")
265 <<AliL3Log::kDec<<"Time out of bounds "<<time<<" "
266 <<AliL3Transform::GetNTimeBins()<<ENDLOG;
271 UShort_t dig=fTPCStream->GetSignal();
272 if(dig <= zerosup) continue;
273 if(dig >= adcsat) dig = adcsat;
275 ndigits[lrow]++; //for this row only
276 ndigitcount++; //total number of digits to be published
278 charges[lrow][pad][time]=dig;
281 Int_t size = sizeof(AliL3DigitData)*ndigitcount
282 + nrows*sizeof(AliL3DigitRowData);
284 LOG(AliL3Log::kDebug,"AliL3DDLDataFileHandler::DDLDigits2Memory","Digits")
285 <<AliL3Log::kDec<<"Found "<<ndigitcount<<" Digits"<<ENDLOG;
287 data=(AliL3DigitRowData*) Allocate(size);
288 nrow = (UInt_t)nrows;
289 AliL3DigitRowData *tempPt = data;
291 for(Int_t r=fRowMin;r<=fRowMax;r++){
292 Int_t lrow=r-fRowMin;
294 tempPt->fNDigit = ndigits[lrow];
297 for(Int_t pad=0;pad<AliL3Transform::GetNPads(r);pad++){
298 for(Int_t time=0;time<AliL3Transform::GetNTimeBins();time++){
299 UShort_t dig=charges[lrow][pad][time];
302 if(localcount >= ndigits[lrow])
303 LOG(AliL3Log::kFatal,"AliL3DDLDataFileHandler::DDLDigits2Binary","Memory")
304 <<AliL3Log::kDec<<"Mismatch: localcount "<<localcount<<" ndigits "
305 <<ndigits[lrow]<<ENDLOG;
308 tempPt->fDigitData[localcount].fCharge=dig;
309 tempPt->fDigitData[localcount].fPad=pad;
310 tempPt->fDigitData[localcount].fTime=time;
312 tempPt->fDigitData[localcount].fTrackID[0] = 0;
313 tempPt->fDigitData[localcount].fTrackID[1] = 0;
314 tempPt->fDigitData[localcount].fTrackID[2] = 0;
320 if(localcount != ndigits[lrow])
321 LOG(AliL3Log::kFatal,"AliL3DDLDataFileHandler::DDLDigits2Binary","Memory")
322 <<AliL3Log::kDec<<"Mismatch: localcount "<<localcount<<" ndigits "
323 <<ndigits[lrow]<<ENDLOG;
326 Byte_t *tmp = (Byte_t*)tempPt;
327 Int_t size = sizeof(AliL3DigitRowData)
328 + ndigits[lrow]*sizeof(AliL3DigitData);
330 tempPt = (AliL3DigitRowData*)tmp;
333 //delete charge array
334 for(Int_t r=fRowMin;r<=fRowMax;r++){
335 Int_t lrow=r-fRowMin;
336 for(Int_t k=0;k<AliL3Transform::GetNPads(r);k++)
337 delete charges[lrow][k];
338 delete charges[lrow];
346 AliL3DigitRowData * AliL3DDLDataFileHandler::DDLData2Memory(UInt_t &nrow,Int_t event)
348 // transfers the DDL data to the memory
350 if((fEvent>=0)&&(event!=fEvent)){
352 if(fReader) delete fReader;
353 if(fTPCStream) delete fTPCStream;
354 fReader=new AliRawReaderRoot(fFilename,event);
355 fTPCStream=new AliTPCRawStream(fReader);
358 AliL3DigitRowData *data = 0;
362 LOG(AliL3Log::kWarning,"AliL3DDLDataFileHandler::DDLData2Memory","File")
363 <<"No Input avalible: no object AliL3DDLRawReaderFile"<<ENDLOG;
367 Int_t nrows=fRowMax-fRowMin+1;
369 Int_t ddlsToSearch=0;
370 Int_t ddls[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
371 Int_t ddlid=-1,lddlid=-1;
372 for(Int_t r=fRowMin;r<=fRowMax;r++){
374 Int_t patch=AliL3Transform::GetPatch(r);
376 AliL3Transform::Slice2Sector(fSlice,r,sector,row);
378 if(sector<36) //taken from AliTPCBuffer160.cxx
379 ddlid=sector*2+patch;
381 ddlid=70+(sector-36)*4+patch;
383 if((lddlid==-1)||(ddlid!=lddlid)){
384 ddls[ddlsToSearch++]=ddlid;
389 // for(Int_t i=0;i<ddlsToSearch;i++) cout << ddls[i] <<endl;
393 fReader->Select(0,ddls[0],ddls[ddlsToSearch-1]);
396 fTPCStream->SetDDLID(ddls[i]); //ddl to read out
399 nrow = (UInt_t)nrows;
405 Bool_t AliL3DDLDataFileHandler::DDLData2CompBinary(Int_t event)
407 // transfers the DDL data to the memory and converts it
411 AliL3DigitRowData *digits=0;
412 digits = DDLData2Memory(ndigits,event);
413 out = Memory2CompBinary(ndigits,digits);