3 /**************************************************************************
4 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
6 * Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
7 * Timm Steinbeck <timm@kip.uni-heidelberg.de> *
8 * Jochen Thaeder <thaeder@kip.uni-heidelberg.de> *
9 * for The ALICE Off-line 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 //
23 // useable for packed data or unpacked data //
25 ///////////////////////////////////////////////////////////////////////////////
32 #include "AliHLTTPCClusterFinderComponent.h"
33 #include "AliHLTTPCDigitReaderPacked.h"
34 #include "AliHLTTPCDigitReaderUnpacked.h"
35 #include "AliHLTTPCClusterFinder.h"
36 #include "AliHLTTPCSpacePointData.h"
37 #include "AliHLTTPCRawDataFormat.h"
38 #include "AliHLTTPCClusterDataFormat.h"
39 #include "AliHLTTPCTransform.h"
43 // this is a global object used for automatic component registration, do not use this
44 AliHLTTPCClusterFinderComponent gAliHLTTPCClusterFinderComponentPacked(true);
45 AliHLTTPCClusterFinderComponent gAliHLTTPCClusterFinderComponentUnpacked(false);
47 ClassImp(AliHLTTPCClusterFinderComponent)
49 AliHLTTPCClusterFinderComponent::AliHLTTPCClusterFinderComponent(bool packed)
51 // use fPackedSwitch = true for packed inputtype "gkDDLPackedRawDataType"
52 // use fPackedSwitch = false for unpacked inputtype "gkUnpackedRawDataType"
53 fPackedSwitch = packed;
55 fClusterFinder = NULL;
57 fReaderUnpacked = NULL;
58 fClusterDeconv = true;
63 AliHLTTPCClusterFinderComponent::~AliHLTTPCClusterFinderComponent()
67 // Public functions to implement AliHLTComponent's interface.
68 // These functions are required for the registration process
70 const char* AliHLTTPCClusterFinderComponent::GetComponentID()
72 if (fPackedSwitch) return "TPCClusterFinderPacked";
73 else return "TPCClusterFinderUnpacked";
76 void AliHLTTPCClusterFinderComponent::GetInputDataTypes( vector<AliHLTComponent_DataType>& list)
79 if (fPackedSwitch) list.push_back( AliHLTTPCDefinitions::gkDDLPackedRawDataType );
80 else list.push_back( AliHLTTPCDefinitions::gkUnpackedRawDataType );
84 AliHLTComponent_DataType AliHLTTPCClusterFinderComponent::GetOutputDataType()
86 return AliHLTTPCDefinitions::gkClustersDataType;
89 void AliHLTTPCClusterFinderComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
91 // XXX TODO: Find more realistic values.
93 if (fPackedSwitch) inputMultiplier = (6 * 0.4);
94 else inputMultiplier = 0.4;
97 AliHLTComponent* AliHLTTPCClusterFinderComponent::Spawn()
99 return new AliHLTTPCClusterFinderComponent(fPackedSwitch);
102 int AliHLTTPCClusterFinderComponent::DoInit( int argc, const char** argv )
104 if ( fClusterFinder )
107 fClusterFinder = new AliHLTTPCClusterFinder();
110 fReaderPacked = new AliHLTTPCDigitReaderPacked();
111 fClusterFinder->SetReader(fReaderPacked);
114 fReaderUnpacked = new AliHLTTPCDigitReaderUnpacked();
115 fClusterFinder->SetReader(fReaderUnpacked);
118 // Variables to setup the Clusterfinder
119 fClusterDeconv = true;
120 fXYClusterError = -1;
126 if ( !strcmp( argv[i], "pp-run" ) ){
127 fClusterDeconv = false;
132 Logging(kHLTLogError, "HLT::TPCClusterFinder::DoInit", "Unknown Option", "Unknown option '%s'", argv[i] );
137 fClusterFinder->SetDeconv( fClusterDeconv );
138 fClusterFinder->SetXYError( fXYClusterError );
139 fClusterFinder->SetZError( fZClusterError );
140 if ( (fXYClusterError>0) && (fZClusterError>0) )
141 fClusterFinder->SetCalcErr( false );
146 int AliHLTTPCClusterFinderComponent::DoDeinit()
149 if ( fClusterFinder )
150 delete fClusterFinder;
151 fClusterFinder = NULL;
153 if ( fReaderUnpacked )
154 delete fReaderUnpacked;
155 fReaderUnpacked = NULL;
158 delete fReaderPacked;
159 fReaderPacked = NULL;
164 int AliHLTTPCClusterFinderComponent::DoEvent( const AliHLTComponent_EventData& evtData,
165 const AliHLTComponent_BlockData* blocks,
166 AliHLTComponent_TriggerData& trigData, AliHLTUInt8_t* outputPtr,
167 AliHLTUInt32_t& size,
168 vector<AliHLTComponent_BlockData>& outputBlocks )
170 // == init iter (pointer to datablock)
171 const AliHLTComponent_BlockData* iter = NULL;
174 // == OUTdatatype pointer
175 AliHLTTPCClusterData* outPtr;
177 AliHLTUInt8_t* outBPtr;
178 UInt_t offset, mysize, nSize, tSize = 0;
181 outPtr = (AliHLTTPCClusterData*)outBPtr;
183 Int_t slice, patch, row[2];
184 unsigned long maxPoints, realPoints = 0;
186 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
194 char tmp1[14], tmp2[14];
195 DataType2Text( iter->fDataType, tmp1 );
196 DataType2Text( AliHLTTPCDefinitions::gkDDLPackedRawDataType, tmp2 );
197 Logging( kHLTLogDebug, "HLT::TPCClusterFinder::DoEvent", "Event received",
198 "Event 0x%08LX (%Lu) received datatype: %s - required datatype: %s",
199 evtData.fEventID, evtData.fEventID, tmp1, tmp2 );
201 if ( iter->fDataType != AliHLTTPCDefinitions::gkDDLPackedRawDataType ) continue;
205 char tmp1[14], tmp2[14];
206 DataType2Text( iter->fDataType, tmp1 );
207 DataType2Text( AliHLTTPCDefinitions::gkUnpackedRawDataType, tmp2 );
208 Logging( kHLTLogDebug, "HLT::TPCClusterFinder::DoEvent", "Event received",
209 "Event 0x%08LX (%Lu) received datatype: %s - required datatype: %s",
210 evtData.fEventID, evtData.fEventID, tmp1, tmp2 );
212 if ( iter->fDataType != AliHLTTPCDefinitions::gkUnpackedRawDataType ) continue;
216 slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter );
217 patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
218 row[0] = AliHLTTPCTransform::GetFirstRow( patch );
219 row[1] = AliHLTTPCTransform::GetLastRow( patch );
221 Logging( kHLTLogDebug, "HLT::TPCClusterFinder::DoEvent", "Input Spacepoints",
222 "Input: Number of spacepoints: %lu Slice/Patch/RowMin/RowMax: %d/%d/%d/%d.",
223 realPoints, slice, patch, row[0], row[1] );
225 outPtr = (AliHLTTPCClusterData*)outBPtr;
227 maxPoints = (size-tSize-sizeof(AliHLTTPCClusterData))/sizeof(AliHLTTPCSpacePointData);
229 fClusterFinder->InitSlice( slice, patch, row[0], row[1], maxPoints );
230 fClusterFinder->SetOutputArray( outPtr->fSpacePoints );
231 fClusterFinder->Read(iter->fPtr, iter->fSize );
232 fClusterFinder->ProcessDigits();
233 realPoints = fClusterFinder->GetNumberOfClusters();
235 Logging( kHLTLogDebug, "HLT::TPCClusterFinder::DoEvent", "Spacepoints",
236 "Number of spacepoints found: %lu.", realPoints );
238 outPtr->fSpacePointCnt = realPoints;
239 nSize = sizeof(AliHLTTPCSpacePointData)*realPoints;
240 mysize += nSize+sizeof(AliHLTTPCClusterData);
242 Logging( kHLTLogDebug, "HLT::TPCClusterFinder::DoEvent", "Input Spacepoints",
243 "Number of spacepoints: %lu Slice/Patch/RowMin/RowMax: %d/%d/%d/%d.",
244 realPoints, slice, patch, row[0], row[1] );
247 AliHLTComponent_BlockData bd;
251 bd.fSpecification = iter->fSpecification;
252 //AliHLTSubEventDescriptor::FillBlockAttributes( bd.fAttributes );
253 outputBlocks.push_back( bd );
257 outPtr = (AliHLTTPCClusterData*)outBPtr;
261 Logging( kHLTLogFatal, "HLT::TPCClusterFinder::DoEvent", "Too much data",
262 "Data written over allowed buffer. Amount written: %lu, allowed amount: %lu.",