3 //*************************************************************************
4 // This file is property of and copyright by the ALICE HLT Project *
5 // ALICE Experiment at CERN, All rights reserved. *
7 // Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8 // Timm Steinbeck <timm@kip.uni-heidelberg.de> *
9 // Jochen Thaeder <thaeder@kip.uni-heidelberg.de> *
10 // for The ALICE HLT Project. *
12 // Permission to use, copy, modify and distribute this software and its *
13 // documentation strictly for non-commercial purposes is hereby granted *
14 // without fee, provided that the above copyright notice appears in all *
15 // copies and that both the copyright notice and this permission notice *
16 // appear in the supporting documentation. The authors make no claims *
17 // about the suitability of this software for any purpose. It is *
18 // provided "as is" without express or implied warranty. *
19 //*************************************************************************/
21 /** @file AliHLTTPCDigitReaderPacked.cxx
22 @author Timm Steinbeck, Jochen Thaeder, Matthias Richter, Kenneth Aamodt
24 @brief A digit reader implementation for simulated, packed TPC 'raw' data.
31 #include "AliHLTTPCDigitReaderPacked.h"
33 #include "AliTPCRawStream.h"
34 #include "AliRawReaderMemory.h"
35 #include "AliRawDataHeader.h"
37 //#if ENABLE_PAD_SORTING
38 #include "AliHLTTPCTransform.h"
39 //#endif // ENABLE_PAD_SORTING
40 #include "AliHLTStdIncludes.h"
42 ClassImp(AliHLTTPCDigitReaderPacked)
44 AliHLTTPCDigitReaderPacked::AliHLTTPCDigitReaderPacked()
46 fRawMemoryReader(NULL),
48 //#if ENABLE_PAD_SORTING
58 //#endif // ENABLE_PAD_SORTING
61 fNextChannelFlag(kFALSE),
64 fRawMemoryReader = new AliRawReaderMemory;
66 fTPCRawStream = new AliTPCRawStream( fRawMemoryReader );
68 //#if ENABLE_PAD_SORTING
69 // get max number of rows
70 for (Int_t ii=0; ii < 6; ii++)
71 if (AliHLTTPCTransform::GetNRows(ii) > fNMaxRows)
72 fNMaxRows = AliHLTTPCTransform::GetNRows(ii);
74 // get max number of pads
75 for (Int_t ii=0; ii < AliHLTTPCTransform::GetNRows();ii++ )
76 if (AliHLTTPCTransform::GetNPads(ii) > fNMaxPads)
77 fNMaxPads = AliHLTTPCTransform::GetNPads(ii);
79 // get max number of bins
80 fNTimeBins = AliHLTTPCTransform::GetNTimeBins();
82 HLTDebug("Array Borders ||| MAXPAD=%d ||| MAXROW=%d ||| MAXBIN=%d ||| MAXMUL=%d",
83 fNMaxPads, fNMaxRows, fNTimeBins, fNTimeBins*fNMaxRows*fNMaxPads);
86 fData = new Int_t[ fNMaxRows*fNMaxPads*fNTimeBins ];
87 //#endif // ENABLE_PAD_SORTING
90 AliHLTTPCDigitReaderPacked::~AliHLTTPCDigitReaderPacked(){
91 if ( fRawMemoryReader )
92 delete fRawMemoryReader;
93 fRawMemoryReader = NULL;
97 //#if ENABLE_PAD_SORTING
101 //#endif // ENABLE_PAD_SORTING
104 Int_t AliHLTTPCDigitReaderPacked::InitBlock(void* ptr,ULong_t size, Int_t patch, Int_t slice)
107 fRawMemoryReader->SetMemory( reinterpret_cast<UChar_t*>( ptr ), size );
111 //get DDL ID in order to tell the memory reader which slice/patch to use
114 DDLid = 768 + 2*slice + patch;
116 DDLid = 840 + 4*slice + patch-2;
118 fRawMemoryReader->SetEquipmentID(DDLid);
119 //fRawMemoryReader->SetEquipmentID(1);
120 fRawMemoryReader->RewindEvents();
121 fRawMemoryReader->NextEvent();
124 //#if ENABLE_PAD_SORTING
130 Int_t firstrow=AliHLTTPCTransform::GetFirstRow(patch);
131 Int_t lastrow=AliHLTTPCTransform::GetLastRow(patch);
132 fNRows = lastrow - firstrow + 1;
135 if (patch > 1) offset = AliHLTTPCTransform::GetFirstRow( 2 );
137 fRowOffset = firstrow - offset;
141 // Init array with -1
142 memset( fData, 0xFF, sizeof(Int_t)*(fNMaxRows*fNMaxPads*fNTimeBins) );
144 // read data and fill in array
145 while( fTPCRawStream->Next()){
147 Int_t row = fTPCRawStream->GetRow();
148 Int_t pad = fTPCRawStream->GetPad();
149 Int_t bin = fTPCRawStream->GetTime();
151 if ( row < firstrow || row > lastrow || pad > AliHLTTPCTransform::GetNPads(row + offset) || bin > fNTimeBins){
152 HLTFatal("Index out of Range Probably wrong patch! %d - %d", slice, patch);
153 if ( row < firstrow || row > lastrow )
154 HLTFatal("Row out of Range %d < %d < %d",firstrow, row, lastrow);
155 if ( pad > AliHLTTPCTransform::GetNPads(row + offset) )
156 HLTFatal("Pad out of Range %d < %d < %d",pad, AliHLTTPCTransform::GetNPads(row + offset));
157 if ( bin > fNTimeBins )
158 HLTFatal("Bin out of Range %d < %d < %d",bin, fNTimeBins);
161 if ((row-fRowOffset)*fNMaxPads*fNTimeBins+ pad*fNTimeBins + bin >= fNMaxRows*fNMaxPads*fNTimeBins ) {
162 HLTFatal("Index out of array range PAD=%d ||| ROW=%d ||| BIN=%d ||| OFFSET=%d ||| ROWOFFSET=%d", pad, row, bin, offset, fRowOffset);
166 fData[ (row-fRowOffset)*fNMaxPads*fNTimeBins+ pad*fNTimeBins + bin ] = fTPCRawStream->GetSignal() ;
170 //#endif // ENABLE_PAD_SORTING
175 Bool_t AliHLTTPCDigitReaderPacked::NextSignal(){
176 Bool_t readvalue = kTRUE;
178 if(!fUnsorted){//added for test
179 //#if ENABLE_PAD_SORTING
182 if (fCurrentBin >= fNTimeBins){
186 if (fCurrentPad >=fNMaxPads){
190 if (fCurrentRow >= fNMaxRows){
197 if (fCurrentRow*fNMaxPads*fNTimeBins+ fCurrentPad*fNTimeBins + fCurrentBin >= fNMaxRows*fNMaxPads*fNTimeBins ) {
198 HLTFatal("Overflow: row=%d pad=%d bin=%d", fCurrentRow, fCurrentPad, fCurrentBin);
203 if (fData[ fCurrentRow*fNMaxPads*fNTimeBins + fCurrentPad*fNTimeBins + fCurrentBin ] != -1) break;
206 else{//added for test
207 //#else // !ENABLE_PAD_SORTING
208 readvalue = fTPCRawStream->Next();
210 //#endif // ENABLE_PAD_SORTING
215 Int_t AliHLTTPCDigitReaderPacked::GetRow(){
216 /*#if ENABLE_PAD_SORTING
217 return (fCurrentRow + fRowOffset);
218 #else // !ENABLE_PAD_SORTING
219 return (Int_t) fTPCRawStream->GetRow();
220 #endif // ENABLE_PAD_SORTING
223 return (fCurrentRow + fRowOffset);
227 return (Int_t) fTPCRawStream->GetRow()-AliHLTTPCTransform::GetFirstRow(fCurrentPatch)+AliHLTTPCTransform::GetFirstRow(2);
230 return (Int_t) fTPCRawStream->GetRow()-AliHLTTPCTransform::GetFirstRow(fCurrentPatch);
235 int AliHLTTPCDigitReaderPacked::GetPad(){
236 /*#if ENABLE_PAD_SORTING
238 #else // !ENABLE_PAD_SORTING
239 return fTPCRawStream->GetPad();
240 #endif // ENABLE_PAD_SORTING
246 return fTPCRawStream->GetPad();
250 AliHLTUInt32_t AliHLTTPCDigitReaderPacked::GetAltroBlockHWaddr() const
252 return fTPCRawStream->GetHWAddress();
255 Int_t AliHLTTPCDigitReaderPacked::GetSignal(){
257 #if ENABLE_PAD_SORTING
258 return fData[ fCurrentRow*fNMaxPads*fNTimeBins+ fCurrentPad*fNTimeBins + fCurrentBin ];
259 #else // !ENABLE_PAD_SORTING
260 return fTPCRawStream->GetSignal();
261 #endif // ENABLE_PAD_SORTING
264 return fData[ fCurrentRow*fNMaxPads*fNTimeBins+ fCurrentPad*fNTimeBins + fCurrentBin ];
267 return fTPCRawStream->GetSignal();
271 Int_t AliHLTTPCDigitReaderPacked::GetTime(){
273 #if ENABLE_PAD_SORTING
275 #else // !ENABLE_PAD_SORTING
276 return fTPCRawStream->GetTime();
277 #endif // ENABLE_PAD_SORTING
283 if((Int_t)(fTPCRawStream->GetTime()-fDataBunch.size()+1)>0 &&(Int_t)(fTPCRawStream->GetTime()-fDataBunch.size()+1)<=AliHLTTPCTransform::GetNTimeBins()){
284 return fTPCRawStream->GetTime()-fDataBunch.size()+1;
287 HLTDebug("Timebin is out of range: %d",fTPCRawStream->GetTime()-fDataBunch.size()+1);
293 Int_t AliHLTTPCDigitReaderPacked::GetTimeOfUnsortedSignal(){
294 return fTPCRawStream->GetTime();
297 bool AliHLTTPCDigitReaderPacked::NextChannel(){
299 if(fNextChannelFlag==kFALSE){
300 if(!NextSignal()){//if there are no more signals
313 int AliHLTTPCDigitReaderPacked::NextBunch(){
316 //adding the first signal (will always be the leftover from either NextChannel call or Previous bunch)
317 fDataBunch.push_back(GetSignal());
320 Bool_t continueLoop=kTRUE;
321 AliHLTUInt32_t prevHWAddress=GetAltroBlockHWaddr();
322 Int_t prevTime=GetTimeOfUnsortedSignal();
325 if(GetAltroBlockHWaddr()==prevHWAddress){//check if there is a change in channel(new row and pad)
326 if(prevTime==GetTimeOfUnsortedSignal()+1){//if true means that we have consecutive signals
327 prevTime=GetTimeOfUnsortedSignal();
328 fDataBunch.push_back(GetSignal());
330 else{//end of bunch but not of channel
335 iResult=0;//end of bunch
337 fNextChannelFlag=kTRUE;
342 fNextChannelFlag=kFALSE;
343 if(fDataBunch.size()>0){//we reached end of data in total, but we still have a bunch
347 }while(continueLoop);
353 int AliHLTTPCDigitReaderPacked::GetBunchSize(){
354 return fDataBunch.size();
357 const UInt_t* AliHLTTPCDigitReaderPacked::GetSignals()
359 // see header file for class documentation
360 return &fDataBunch[0];