3 // Author: C. Loizides <loizides@ikf.uni-frankfurt.de>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliHLTTPCRootTypes.h"
7 #include "AliHLTTPCLogging.h"
8 #include "AliHLTTPCTransform.h"
9 #include "AliHLTTPCMemHandler.h"
10 #include "AliHLTTPCDigitData.h"
12 #include "AliRawReaderRoot.h"
13 #include "AliRawReaderDate.h"
15 #include "AliHLTTPCDDLTPCRawStream.h"
16 #include "AliHLTTPCDDLRawReaderFile.h"
18 #include "AliHLTTPCDDLDataFileHandler.h"
24 /** \class AliHLTTPCDDLDataFileHandler
26 //_____________________________________________________________
27 // AliHLTTPCDDLDataFileHandler
29 // This class does converts from the DDL format of offline
30 // into the memory I/O handling of the HLT binary files.
32 // Examples: see ddl2binary in exa and the general
33 // AliHLTTPCMemHandler class description
38 ClassImp(AliHLTTPCDDLDataFileHandler)
40 AliHLTTPCDDLDataFileHandler::AliHLTTPCDDLDataFileHandler()
42 // default constructor
47 AliHLTTPCDDLDataFileHandler::~AliHLTTPCDDLDataFileHandler()
53 void AliHLTTPCDDLDataFileHandler::FreeAll()
55 // frees all heap memory
56 if(fReader) delete fReader;
58 if(fTPCStream) delete fTPCStream;
64 Bool_t AliHLTTPCDDLDataFileHandler::SetReaderInput(AliRawEvent *rawevent)
66 // sets the input of the reader
69 if(fReader) delete fReader;
70 fReader=new AliRawReaderRoot(rawevent);
71 if(fTPCStream) delete fTPCStream;
72 fTPCStream=new AliTPCRawStream(fReader);
77 Bool_t AliHLTTPCDDLDataFileHandler::SetReaderInput(Char_t *name,Int_t event)
79 // sets the input of the reader
81 if(fReader) delete fReader;
82 if(fTPCStream) delete fTPCStream;
85 fReader=new AliRawReaderRoot(name,event);
88 fReader=new AliRawReaderDate((void *)name);
90 fTPCStream=new AliTPCRawStream(fReader);
95 Bool_t AliHLTTPCDDLDataFileHandler::SetReaderInput(Char_t *name, Bool_t add)
97 // sets the input of the reader
99 LOG(AliHLTTPCLog::kError,"AliHLTTPCDDLDataFileHandler::SetReaderInput","File Open")
100 <<"Reader ptr is already in use"<<ENDLOG;
104 fReader=new AliHLTTPCDDLRawReaderFile(name,add);
105 fTPCStream=new AliHLTTPCDDLTPCRawStream(fReader);
109 Bool_t AliHLTTPCDDLDataFileHandler::SetReaderInput(AliHLTTPCDDLRawReaderFile *rf)
111 // sets the input of the reader
113 LOG(AliHLTTPCLog::kError,"AliHLTTPCRawDataFileHandler::SetReaderInput","File Open")
114 <<"Reader ptr is already in use, delete it first"<<ENDLOG;
118 //Open the raw data file with given file.
120 fTPCStream=new AliHLTTPCDDLTPCRawStream(fReader);
126 void AliHLTTPCDDLDataFileHandler::CloseReaderInput()
128 // closes the input of the reader
130 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCRawDataFileHandler::CloseReaderInput","File Close")
131 <<"Nothing to Close"<<ENDLOG;
142 Bool_t AliHLTTPCDDLDataFileHandler::IsDigit(Int_t /*i*/) const
150 AliHLTTPCDigitRowData * AliHLTTPCDDLDataFileHandler::DDLData2Memory(UInt_t &nrow,Int_t event)
152 // transfers the DDL data to the memory
154 if((fEvent>=0)&&(event!=fEvent)){
156 if(fReader) delete fReader;
157 if(fTPCStream) delete fTPCStream;
158 fReader=new AliRawReaderRoot(fFilename,event);
159 fTPCStream=new AliTPCRawStream(fReader);
162 AliHLTTPCDigitRowData *data = 0;
166 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCDDLDataFileHandler::DDLData2Memory","File")
167 <<"No Input avalible: no object AliHLTTPCDDLRawReaderFile"<<ENDLOG;
171 Int_t nrows=fRowMax-fRowMin+1;
173 Int_t * ndigits = new Int_t[nrows];
174 UShort_t ***charges=new UShort_t**[nrows];
175 for(Int_t r=fRowMin;r<=fRowMax;r++){
176 Int_t lrow=r-fRowMin;
177 charges[lrow]=new UShort_t*[AliHLTTPCTransform::GetNPads(r)];
178 for(Int_t k=0;k<AliHLTTPCTransform::GetNPads(r);k++){
179 charges[lrow][k]=new UShort_t[AliHLTTPCTransform::GetNTimeBins()];
180 for(Int_t j=0;j<AliHLTTPCTransform::GetNTimeBins();j++) charges[lrow][k][j]=0;
184 Int_t ddlsToSearch=0;
185 Int_t ddls[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
186 Int_t ddlid=-1,lddlid=-1;
187 for(Int_t r=fRowMin;r<=fRowMax;r++){
188 ndigits[r-fRowMin] = 0; //now digits on row
190 Int_t patch=AliHLTTPCTransform::GetPatch(r);
192 AliHLTTPCTransform::Slice2Sector(fSlice,r,sector,row);
194 if(sector<36) //taken from AliTPCBuffer160.cxx
195 ddlid=sector*2+patch;
197 ddlid=70+(sector-36)*4+patch;
199 if((lddlid!=ddlid-1)&&(r==30)){ //dont forget the split row on the last ddl
200 ddls[ddlsToSearch++]=ddlid-1;
204 if((lddlid==-1)||(ddlid!=lddlid)){
205 ddls[ddlsToSearch++]=ddlid;
208 if((r==90)||(r==139)){ //dont forget the split row on the next ddl
209 ddls[ddlsToSearch++]=ddlid+1;
214 // for(Int_t i=0;i<ddlsToSearch;i++) cout << ddls[i] <<endl;
216 if(ddls[0]>ddls[ddlsToSearch-1]) {
217 Int_t tempddl = ddls[0];
218 ddls[0] = ddls[ddlsToSearch-1];
219 ddls[ddlsToSearch-1] = tempddl;
223 fReader->Select(0,ddls[0],ddls[ddlsToSearch-1]);
226 fTPCStream->SetDDLID(ddls[i]); //ddl to read out
228 Int_t zerosup = AliHLTTPCTransform::GetZeroSup();
229 Int_t adcsat = AliHLTTPCTransform::GetADCSat();
233 while (fTPCStream->Next()){
235 if(fTPCStream->IsNewSector() || fTPCStream->IsNewRow()) {
236 Int_t sector=fTPCStream->GetSector();
237 Int_t row=fTPCStream->GetRow();
238 AliHLTTPCTransform::Sector2Slice(slice,srow,sector,row);
240 LOG(AliHLTTPCLog::kError,"AliHLTTPCDDLDataFileHandler::DDLDigits2Memory","Slice")
241 <<AliHLTTPCLog::kDec<<"Found slice "<<slice<<", expected "<<fSlice<<ENDLOG;
247 //test row criteria (patch boundaries)
248 if((srow<fRowMin)||(srow>fRowMax))continue;
250 Int_t pad=fTPCStream->GetPad();
251 if(fTPCStream->IsNewPad()) {
252 if((pad<0)||(pad>=AliHLTTPCTransform::GetNPads(srow))){
253 LOG(AliHLTTPCLog::kError,"AliHLTTPCDDLDataFileHandler::DDLDigits2Memory","Pad")
254 <<AliHLTTPCLog::kDec<<"Pad value out of bounds "<<pad<<" "
255 <<AliHLTTPCTransform::GetNPads(srow)<<ENDLOG;
260 Int_t time=fTPCStream->GetTime();
261 if((time<0)||(time>=AliHLTTPCTransform::GetNTimeBins())){
262 LOG(AliHLTTPCLog::kError,"AliHLTTPCDDLDataFileHandler::DDLDigits2Memory","Time")
263 <<AliHLTTPCLog::kDec<<"Time out of bounds "<<time<<" "
264 <<AliHLTTPCTransform::GetNTimeBins()<<ENDLOG;
269 UShort_t dig=fTPCStream->GetSignal();
270 if(dig <= zerosup) continue;
271 if(dig >= adcsat) dig = adcsat;
273 ndigits[lrow]++; //for this row only
274 ndigitcount++; //total number of digits to be published
276 charges[lrow][pad][time]=dig;
279 Int_t size = sizeof(AliHLTTPCDigitData)*ndigitcount
280 + nrows*sizeof(AliHLTTPCDigitRowData);
282 LOG(AliHLTTPCLog::kDebug,"AliHLTTPCDDLDataFileHandler::DDLDigits2Memory","Digits")
283 <<AliHLTTPCLog::kDec<<"Found "<<ndigitcount<<" Digits"<<ENDLOG;
285 data=(AliHLTTPCDigitRowData*) Allocate(size);
286 nrow = (UInt_t)nrows;
287 AliHLTTPCDigitRowData *tempPt = data;
289 for(Int_t r=fRowMin;r<=fRowMax;r++){
290 Int_t lrow=r-fRowMin;
292 tempPt->fNDigit = ndigits[lrow];
295 for(Int_t pad=0;pad<AliHLTTPCTransform::GetNPads(r);pad++){
296 for(Int_t time=0;time<AliHLTTPCTransform::GetNTimeBins();time++){
297 UShort_t dig=charges[lrow][pad][time];
300 if(localcount >= ndigits[lrow])
301 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCDDLDataFileHandler::DDLDigits2Binary","Memory")
302 <<AliHLTTPCLog::kDec<<"Mismatch: localcount "<<localcount<<" ndigits "
303 <<ndigits[lrow]<<ENDLOG;
306 tempPt->fDigitData[localcount].fCharge=dig;
307 tempPt->fDigitData[localcount].fPad=pad;
308 tempPt->fDigitData[localcount].fTime=time;
310 tempPt->fDigitData[localcount].fTrackID[0] = 0;
311 tempPt->fDigitData[localcount].fTrackID[1] = 0;
312 tempPt->fDigitData[localcount].fTrackID[2] = 0;
318 if(localcount != ndigits[lrow])
319 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCDDLDataFileHandler::DDLDigits2Binary","Memory")
320 <<AliHLTTPCLog::kDec<<"Mismatch: localcount "<<localcount<<" ndigits "
321 <<ndigits[lrow]<<ENDLOG;
324 Byte_t *tmp = (Byte_t*)tempPt;
325 Int_t size = sizeof(AliHLTTPCDigitRowData)
326 + ndigits[lrow]*sizeof(AliHLTTPCDigitData);
328 tempPt = (AliHLTTPCDigitRowData*)tmp;
331 //delete charge array
332 for(Int_t r=fRowMin;r<=fRowMax;r++){
333 Int_t lrow=r-fRowMin;
334 for(Int_t k=0;k<AliHLTTPCTransform::GetNPads(r);k++)
335 delete charges[lrow][k];
336 delete charges[lrow];
344 AliHLTTPCDigitRowData * AliHLTTPCDDLDataFileHandler::DDLData2Memory(UInt_t &nrow,Int_t event)
346 // transfers the DDL data to the memory
348 if((fEvent>=0)&&(event!=fEvent)){
350 if(fReader) delete fReader;
351 if(fTPCStream) delete fTPCStream;
352 fReader=new AliRawReaderRoot(fFilename,event);
353 fTPCStream=new AliTPCRawStream(fReader);
356 AliHLTTPCDigitRowData *data = 0;
360 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCDDLDataFileHandler::DDLData2Memory","File")
361 <<"No Input avalible: no object AliHLTTPCDDLRawReaderFile"<<ENDLOG;
365 Int_t nrows=fRowMax-fRowMin+1;
367 Int_t ddlsToSearch=0;
368 Int_t ddls[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
369 Int_t ddlid=-1,lddlid=-1;
370 for(Int_t r=fRowMin;r<=fRowMax;r++){
372 Int_t patch=AliHLTTPCTransform::GetPatch(r);
374 AliHLTTPCTransform::Slice2Sector(fSlice,r,sector,row);
376 if(sector<36) //taken from AliTPCBuffer160.cxx
377 ddlid=sector*2+patch;
379 ddlid=70+(sector-36)*4+patch;
381 if((lddlid==-1)||(ddlid!=lddlid)){
382 ddls[ddlsToSearch++]=ddlid;
387 // for(Int_t i=0;i<ddlsToSearch;i++) cout << ddls[i] <<endl;
391 fReader->Select(0,ddls[0],ddls[ddlsToSearch-1]);
394 fTPCStream->SetDDLID(ddls[i]); //ddl to read out
397 nrow = (UInt_t)nrows;
403 Bool_t AliHLTTPCDDLDataFileHandler::DDLData2CompBinary(Int_t event)
405 // transfers the DDL data to the memory and converts it
409 AliHLTTPCDigitRowData *digits=0;
410 digits = DDLData2Memory(ndigits,event);
411 out = Memory2CompBinary(ndigits,digits);