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 "../RAW/AliRawReaderRoot.h"
15 #include "../RAW/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()
48 AliL3DDLDataFileHandler::~AliL3DDLDataFileHandler()
53 void AliL3DDLDataFileHandler::FreeAll()
55 if(fReader) delete fReader;
56 if(fTPCStream) delete fTPCStream;
63 Bool_t AliL3DDLDataFileHandler::SetReaderInput(Char_t *name,Int_t event)
66 if(fReader) delete fReader;
67 if(fTPCStream) delete fTPCStream;
70 fReader=new AliRawReaderRoot(name,event);
73 fReader=new AliRawReaderDate(name);
75 fTPCStream=new AliTPCRawStream(fReader);
80 Bool_t AliL3DDLDataFileHandler::SetReaderInput(Char_t *name, Bool_t add)
83 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::SetReaderInput","File Open")
84 <<"Reader ptr is already in use"<<ENDLOG;
88 fReader=new AliL3DDLRawReaderFile(name,add);
89 fTPCStream=new AliL3DDLTPCRawStream(fReader);
93 Bool_t AliL3DDLDataFileHandler::SetReaderInput(AliL3DDLRawReaderFile *rf)
96 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetReaderInput","File Open")
97 <<"Reader ptr is already in use, delete it first"<<ENDLOG;
101 //Open the raw data file with given file.
103 fTPCStream=new AliL3DDLTPCRawStream(fReader);
109 void AliL3DDLDataFileHandler::CloseReaderInput()
112 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::CloseReaderInput","File Close")
113 <<"Nothing to Close"<<ENDLOG;
124 Bool_t AliL3DDLDataFileHandler::IsDigit(Int_t i)
130 AliL3DigitRowData * AliL3DDLDataFileHandler::DDLData2Memory(UInt_t &nrow,Int_t event)
133 if((fEvent>=0)&&(event!=fEvent)){
135 if(fReader) delete fReader;
136 if(fTPCStream) delete fTPCStream;
137 fReader=new AliRawReaderRoot(fFilename,event);
138 fTPCStream=new AliTPCRawStream(fReader);
141 AliL3DigitRowData *data = 0;
145 LOG(AliL3Log::kWarning,"AliL3DDLDataFileHandler::DDLData2Memory","File")
146 <<"No Input avalible: no object AliL3DDLRawReaderFile"<<ENDLOG;
150 Int_t nrows=fRowMax-fRowMin+1;
152 // Int_t ndigits[nrows];
153 Int_t * ndigits = new Int_t[nrows];
154 UShort_t ***charges=new UShort_t**[nrows];
155 for(Int_t r=fRowMin;r<=fRowMax;r++){
156 Int_t lrow=r-fRowMin;
157 charges[lrow]=new UShort_t*[AliL3Transform::GetNPads(r)];
158 for(Int_t k=0;k<AliL3Transform::GetNPads(r);k++){
159 charges[lrow][k]=new UShort_t[AliL3Transform::GetNTimeBins()];
160 for(Int_t j=0;j<AliL3Transform::GetNTimeBins();j++) charges[lrow][k][j]=0;
164 Int_t ddls_to_search=0;
165 Int_t ddls[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
166 Int_t ddlid=-1,lddlid=-1;
167 for(Int_t r=fRowMin;r<=fRowMax;r++){
168 ndigits[r-fRowMin] = 0; //now digits on row
170 Int_t patch=AliL3Transform::GetPatch(r);
172 AliL3Transform::Slice2Sector(fSlice,r,sector,row);
174 if(sector<36) //taken from AliTPCBuffer160.cxx
175 ddlid=sector*2+patch;
177 ddlid=70+(sector-36)*4+patch;
179 if((lddlid!=ddlid-1)&&(r==30)){ //dont forget the split row on the last ddl
180 ddls[ddls_to_search++]=ddlid-1;
183 if((lddlid==-1)||(ddlid!=lddlid)){
184 ddls[ddls_to_search++]=ddlid;
187 if((r==90)||(r==139)){ //dont forget the split row on the next ddl
188 ddls[ddls_to_search++]=ddlid+1;
192 //for(Int_t i=0;i<ddls_to_search;i++) cout << ddls[i] <<endl;
194 for(Int_t i=0;i<ddls_to_search;i++){
197 fReader->Select(0,ddls[i],ddls[i]+1);
199 fTPCStream->SetDDLID(ddls[i]); //ddl to read out
202 while (fTPCStream->Next()){
204 UShort_t dig=fTPCStream->GetSignal();
205 if(dig <= AliL3Transform::GetZeroSup()) continue;
206 if(dig >= AliL3Transform::GetADCSat())
207 dig = AliL3Transform::GetADCSat();
209 Int_t time=fTPCStream->GetTime();
210 Int_t pad=fTPCStream->GetPad();
211 Int_t sector=fTPCStream->GetSector();
212 Int_t row=fTPCStream->GetRow();
215 //test row criteria (patch boundaries)
216 AliL3Transform::Sector2Slice(slice,srow,sector,row);
217 if((srow<fRowMin)||(srow>fRowMax))continue;
219 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Slice")
220 <<AliL3Log::kDec<<"Found slice "<<slice<<", expected "<<fSlice<<ENDLOG;
224 //cut out the inner cone
226 AliL3Transform::Raw2Local(xyz,sector,row,pad,time);
227 if(AliL3Transform::Row2X(srow)<230./250.*fabs(xyz[2]))
228 continue; // why 230???
230 Int_t lrow=srow-fRowMin;
231 if((lrow<0)||lrow>=nrows){
232 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Row")
233 <<AliL3Log::kDec<<"Row value out of bounds "<<lrow<<" "<<nrows<<ENDLOG;
236 if((pad<0)||(pad>=AliL3Transform::GetNPads(srow))){
237 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Pad")
238 <<AliL3Log::kDec<<"Pad value out of bounds "<<pad<<" "
239 <<AliL3Transform::GetNPads(srow)<<ENDLOG;
242 if((time<0)||(time>=AliL3Transform::GetNTimeBins())){
243 LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Time")
244 <<AliL3Log::kDec<<"Time out of bounds "<<time<<" "
245 <<AliL3Transform::GetNTimeBins()<<ENDLOG;
250 ndigits[lrow]++; //for this row only
251 ndigitcount++; //total number of digits to be published
253 charges[lrow][pad][time]=dig;
257 Int_t size = sizeof(AliL3DigitData)*ndigitcount
258 + nrows*sizeof(AliL3DigitRowData);
260 LOG(AliL3Log::kDebug,"AliL3DDLDataFileHandler::DDLDigits2Memory","Digits")
261 <<AliL3Log::kDec<<"Found "<<ndigitcount<<" Digits"<<ENDLOG;
263 data=(AliL3DigitRowData*) Allocate(size);
264 nrow = (UInt_t)nrows;
265 AliL3DigitRowData *tempPt = data;
267 for(Int_t r=fRowMin;r<=fRowMax;r++){
268 Int_t lrow=r-fRowMin;
270 tempPt->fNDigit = ndigits[lrow];
273 for(Int_t pad=0;pad<AliL3Transform::GetNPads(r);pad++){
274 for(Int_t time=0;time<AliL3Transform::GetNTimeBins();time++){
275 UShort_t dig=charges[lrow][pad][time];
278 if(localcount >= ndigits[lrow])
279 LOG(AliL3Log::kFatal,"AliL3DDLDataFileHandler::DDLDigits2Binary","Memory")
280 <<AliL3Log::kDec<<"Mismatch: localcount "<<localcount<<" ndigits "
281 <<ndigits[lrow]<<ENDLOG;
284 tempPt->fDigitData[localcount].fCharge=dig;
285 tempPt->fDigitData[localcount].fPad=pad;
286 tempPt->fDigitData[localcount].fTime=time;
288 tempPt->fDigitData[localcount].fTrackID[0] = 0;
289 tempPt->fDigitData[localcount].fTrackID[1] = 0;
290 tempPt->fDigitData[localcount].fTrackID[2] = 0;
296 if(localcount != ndigits[lrow])
297 LOG(AliL3Log::kFatal,"AliL3DDLDataFileHandler::DDLDigits2Binary","Memory")
298 <<AliL3Log::kDec<<"Mismatch: localcount "<<localcount<<" ndigits "
299 <<ndigits[lrow]<<ENDLOG;
302 Byte_t *tmp = (Byte_t*)tempPt;
303 Int_t size = sizeof(AliL3DigitRowData)
304 + ndigits[lrow]*sizeof(AliL3DigitData);
306 tempPt = (AliL3DigitRowData*)tmp;
309 //delete charge array
310 for(Int_t r=fRowMin;r<=fRowMax;r++){
311 Int_t lrow=r-fRowMin;
312 for(Int_t k=0;k<AliL3Transform::GetNPads(r);k++)
313 delete charges[lrow][k];
314 delete charges[lrow];
323 Bool_t AliL3DDLDataFileHandler::DDLData2CompBinary(Int_t event)
327 AliL3DigitRowData *digits=0;
328 digits = DDLData2Memory(ndigits,event);
329 out = Memory2CompBinary(ndigits,digits);