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 * for The ALICE HLT Project. *
11 * Permission to use, copy, modify and distribute this software and its *
12 * documentation strictly for non-commercial purposes is hereby granted *
13 * without fee, provided that the above copyright notice appears in all *
14 * copies and that both the copyright notice and this permission notice *
15 * appear in the supporting documentation. The authors make no claims *
16 * about the suitability of this software for any purpose. It is *
17 * provided "as is" without express or implied warranty. *
18 **************************************************************************/
20 ///////////////////////////////////////////////////////////////////////////////
22 // a TPC cluster finder processing component for the HLT //
24 // see header file for class documentation //
26 // refer to README to build package //
28 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt //
30 ///////////////////////////////////////////////////////////////////////////////
36 #include "AliHLTTPCRawDataUnpackerComponent.h"
37 #include "AliTPCRawStream.h"
38 #include "AliRawDataHeader.h"
39 #include "AliRawReaderMemory.h"
40 #include "AliHLTTPCDigitData.h"
41 #include "AliHLTTPCTransform.h"
42 #include "AliHLTTPCDefinitions.h"
46 // this is a global object used for automatic component registration, do not use this
47 AliHLTTPCRawDataUnpackerComponent gAliHLTTPCRawDataUnpackerComponent;
49 ClassImp(AliHLTTPCRawDataUnpackerComponent);
51 AliHLTTPCRawDataUnpackerComponent::AliHLTTPCRawDataUnpackerComponent()
53 fRawMemoryReader(NULL),
56 // see header file for class documentation
58 // refer to README to build package
60 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
63 AliHLTTPCRawDataUnpackerComponent::AliHLTTPCRawDataUnpackerComponent(const AliHLTTPCRawDataUnpackerComponent&)
65 fRawMemoryReader(NULL),
68 // see header file for class documentation
71 AliHLTTPCRawDataUnpackerComponent& AliHLTTPCRawDataUnpackerComponent::operator=(const AliHLTTPCRawDataUnpackerComponent&)
73 // see header file for class documentation
77 AliHLTTPCRawDataUnpackerComponent::~AliHLTTPCRawDataUnpackerComponent()
79 // see header file for class documentation
82 // Public functions to implement AliHLTComponent's interface.
83 // These functions are required for the registration process
85 const char* AliHLTTPCRawDataUnpackerComponent::GetComponentID()
87 // see header file for class documentation
88 return "TPCRawDataUnpacker";
91 void AliHLTTPCRawDataUnpackerComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list)
93 // see header file for class documentation
95 list.push_back( AliHLTTPCDefinitions::fgkDDLPackedRawDataType );
98 AliHLTComponentDataType AliHLTTPCRawDataUnpackerComponent::GetOutputDataType()
100 // see header file for class documentation
101 return AliHLTTPCDefinitions::fgkUnpackedRawDataType;
104 void AliHLTTPCRawDataUnpackerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
106 // see header file for class documentation
107 // XXX TODO: Find more realistic values.
109 inputMultiplier = 6.0;
112 AliHLTComponent* AliHLTTPCRawDataUnpackerComponent::Spawn()
114 // see header file for class documentation
115 return new AliHLTTPCRawDataUnpackerComponent;
118 int AliHLTTPCRawDataUnpackerComponent::DoInit( int argc, const char** argv )
120 // see header file for class documentation
121 if ( fRawMemoryReader || fTPCRawStream )
125 // const char* tableFileBaseDir = NULL;
128 // if ( !strcmp( argv[i], "table-dir" ) )
132 // Logging(kHLTLogError, "HLT::TPCRawDataUnpacker::DoInit", "Missing Argument", "Missing -table-dir parameter");
135 // tableFileBaseDir = argv[i+1];
139 Logging(kHLTLogError, "HLT::TPCRawDataUnpacker::DoInit", "Unknown Option", "Unknown option '%s'", argv[i] );
143 // if ( !tableFileBaseDir )
145 // Logging(kHLTLogError, "HLT::TPCRawDataUnpacker::DoInit", "Table file directory missing ",
146 // "Table file base directory has to be set using the -table-dir component parameter." );
150 fRawMemoryReader = new AliRawReaderMemory;
151 //fTPCRawStream = new AliTPCRawStream( fRawMemoryReader, tableFileBaseDir );
152 fTPCRawStream = new AliTPCRawStream( fRawMemoryReader );
157 int AliHLTTPCRawDataUnpackerComponent::DoDeinit()
159 // see header file for class documentation
160 if ( fRawMemoryReader )
161 delete fRawMemoryReader;
162 fRawMemoryReader = NULL;
164 delete fTPCRawStream;
165 fTPCRawStream = NULL;
169 int AliHLTTPCRawDataUnpackerComponent::DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
170 AliHLTComponentTriggerData& trigData, AliHLTUInt8_t* outputPtr,
171 AliHLTUInt32_t& size, vector<AliHLTComponentBlockData>& outputBlocks )
173 // see header file for class documentation
174 const AliHLTComponentBlockData* iter = NULL;
177 AliHLTUInt8_t* outBPtr;
178 AliHLTTPCUnpackedRawData* outPtr;
179 AliHLTTPCDigitRowData* currentRow;
180 AliHLTTPCDigitData* currentDigit;
181 unsigned long long outputSize = 0;
182 unsigned long blockOutputSize = 0;
183 unsigned long rowSize = 0;
184 Int_t slice, patch, rows[2];
186 outPtr = (AliHLTTPCUnpackedRawData*)outputPtr;
187 currentRow = outPtr->fDigits;
188 currentDigit = currentRow->fDigitData;
190 Logging( kHLTLogDebug, "HLT::TPCRawDataUnpackerSubscriber::DoEvent", "Event received",
191 "Event 0x%08LX (%Lu) received with %lu blocks. Output data size: %lu",
192 evtData.fEventID, evtData.fEventID, evtData.fBlockCnt, size);
193 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
196 char tmp1[14], tmp2[14];
197 DataType2Text( iter->fDataType, tmp1 );
198 DataType2Text( AliHLTTPCDefinitions::fgkDDLPackedRawDataType, tmp2 );
199 Logging( kHLTLogDebug, "HLT::TPCRawDataUnpackerSubscriber::DoEvent", "Event received",
200 "Event 0x%08LX (%Lu) received datatype: %s - required datatype: %s",
201 evtData.fEventID, evtData.fEventID, tmp1, tmp2 );
202 if ( iter->fDataType != AliHLTTPCDefinitions::fgkDDLPackedRawDataType )
206 slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter );
207 patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
208 rows[0] = AliHLTTPCTransform::GetFirstRow( patch );
209 rows[1] = AliHLTTPCTransform::GetLastRow( patch );
212 Logging( kHLTLogDebug, "HLT::TPCRawDataUnpackerSubscriber::DoEvent", "Input Raw Packed Data",
213 "Input: Slice/Patch/RowMin/RowMax: %d/%d/%d/%d.",
214 slice, patch, rows[0], rows[1] );
216 fRawMemoryReader->SetMemory( reinterpret_cast<UChar_t*>( iter->fPtr ), iter->fSize );
217 bool readValue = true;
218 readValue = fTPCRawStream->Next();
219 int row = -1, oldRow = -1;
221 if ( patch >= 2 ) // Outer sector, patches 2, 3, 4, 5
222 rowOffset = AliHLTTPCTransform::GetFirstRow( 2 );
226 row = fTPCRawStream->GetRow();
229 if ( oldRow!=-1 && rowSize != sizeof(AliHLTTPCDigitRowData)+currentRow->fNDigit*sizeof(AliHLTTPCDigitData) )
231 Logging( kHLTLogFatal, "HLT::TPCRawDataUnpackerSubscriber::DoEvent", "Size inconsistency",
232 "Size inconsistency for row %d data: %lu != %lu (%lu digits).", oldRow, rowSize,
233 sizeof(AliHLTTPCDigitRowData)+currentRow->fNDigit*sizeof(AliHLTTPCDigitData), currentRow->fNDigit );
236 if ( size < outputSize+sizeof(AliHLTTPCDigitRowData) )
238 Logging( kHLTLogFatal, "HLT::TPCRawDataUnpackerSubscriber::DoEvent", "Too much data",
239 "Output data too big, output memory full. Aborting event 0x%08lX (%lu)" ,
240 evtData.fEventID, evtData.fEventID );
243 currentRow = (AliHLTTPCDigitRowData*)(outBPtr+outputSize);
244 currentDigit = currentRow->fDigitData;
245 currentRow->fRow = row+rowOffset;
246 currentRow->fNDigit = 0;
248 outputSize += sizeof(AliHLTTPCDigitRowData);
249 blockOutputSize += sizeof(AliHLTTPCDigitRowData);
250 rowSize += sizeof(AliHLTTPCDigitRowData);
252 if ( size < outputSize+sizeof(AliHLTTPCDigitData) )
254 Logging( kHLTLogFatal, "HLT::TPCRawDataUnpackerSubscriber::DoEvent", "Too much data",
255 "Output data too big, output memory full. Aborting event 0x%08lX (%lu)" ,
256 evtData.fEventID, evtData.fEventID );
259 currentDigit->fCharge = fTPCRawStream->GetSignal();
260 currentDigit->fPad = fTPCRawStream->GetPad();
261 currentDigit->fTime = fTPCRawStream->GetTime();
262 currentRow->fNDigit++;
264 outputSize += sizeof(AliHLTTPCDigitData);
265 blockOutputSize += sizeof(AliHLTTPCDigitData);
266 rowSize += sizeof(AliHLTTPCDigitData);
267 readValue = fTPCRawStream->Next();
269 if ( oldRow!=-1 && rowSize != sizeof(AliHLTTPCDigitRowData)+currentRow->fNDigit*sizeof(AliHLTTPCDigitData) )
271 Logging( kHLTLogFatal, "HLT::TPCRawDataUnpackerSubscriber::DoEvent", "Size inconsistency",
272 "Size inconsistency for row %d data: %lu != %lu (%lu digits).", oldRow, rowSize,
273 sizeof(AliHLTTPCDigitRowData)+currentRow->fNDigit*sizeof(AliHLTTPCDigitData), currentRow->fNDigit );
276 AliHLTComponentBlockData bd;
278 bd.fOffset = outputSize-blockOutputSize;
279 bd.fSize = blockOutputSize;
280 bd.fSpecification = iter->fSpecification;
281 Logging( kHLTLogDebug, "HLT::TPCRawDataUnpackerSubscriber::DoEvent", "Event received",
282 "Event 0x%08LX (%Lu) output data block %lu of %lu bytes at offset %lu",
283 evtData.fEventID, evtData.fEventID, ndx, blockOutputSize, outputSize-blockOutputSize );
284 //AliHLTSubEventDescriptor::FillBlockAttributes( bd.fAttributes );
285 outputBlocks.push_back( bd );