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 * for The ALICE Off-line Project. *
10 * Permission to use, copy, modify and distribute this software and its *
11 * documentation strictly for non-commercial purposes is hereby granted *
12 * without fee, provided that the above copyright notice appears in all *
13 * copies and that both the copyright notice and this permission notice *
14 * appear in the supporting documentation. The authors make no claims *
15 * about the suitability of this software for any purpose. It is *
16 * provided "as is" without express or implied warranty. *
17 **************************************************************************/
19 /** @file AliHLTTPCGlobalMergerComponent.cxx
20 @author Timm Steinbeck, Matthias Richter
22 @brief HLT TPC global merger component.
29 #include "AliHLTTPCGlobalMergerComponent.h"
30 #include "AliHLTTPCTransform.h"
31 #include "AliHLTTPCGlobalMerger.h"
32 #include "AliHLTTPCVertex.h"
33 #include "AliHLTTPCVertexData.h"
34 #include "AliHLTTPCTrackSegmentData.h"
35 #include "AliHLTTPCTrackArray.h"
36 #include "AliHLTTPCTrackletDataFormat.h"
37 #include "AliHLTTPCSpacePointData.h"
38 #include "AliHLTTPCClusterDataFormat.h"
39 #include "AliHLTTPCDefinitions.h"
43 // this is a global object used for automatic component registration, do not use this
44 AliHLTTPCGlobalMergerComponent gAliHLTTPCGlobalMergerComponent;
46 ClassImp(AliHLTTPCGlobalMergerComponent)
48 AliHLTTPCGlobalMergerComponent::AliHLTTPCGlobalMergerComponent()
53 // see header file for class documentation
55 // refer to README to build package
57 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
60 AliHLTTPCGlobalMergerComponent::AliHLTTPCGlobalMergerComponent(const AliHLTTPCGlobalMergerComponent&)
65 // see header file for class documentation
66 HLTFatal("copy constructor untested");
69 AliHLTTPCGlobalMergerComponent& AliHLTTPCGlobalMergerComponent::operator=(const AliHLTTPCGlobalMergerComponent&)
71 // see header file for class documentation
72 HLTFatal("assignment operator untested");
76 AliHLTTPCGlobalMergerComponent::~AliHLTTPCGlobalMergerComponent()
78 // see header file for class documentation
81 // Public functions to implement AliHLTComponent's interface.
82 // These functions are required for the registration process
84 const char* AliHLTTPCGlobalMergerComponent::GetComponentID()
86 // see header file for class documentation
87 return "TPCGlobalMerger";
90 void AliHLTTPCGlobalMergerComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list)
92 // see header file for class documentation
94 list.push_back( AliHLTTPCDefinitions::fgkTrackSegmentsDataType );
95 list.push_back( AliHLTTPCDefinitions::fgkVertexDataType );
98 AliHLTComponentDataType AliHLTTPCGlobalMergerComponent::GetOutputDataType()
100 // see header file for class documentation
101 return AliHLTTPCDefinitions::fgkTracksDataType;
104 void AliHLTTPCGlobalMergerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
106 // see header file for class documentation
107 // XXX TODO: Find more realistic values.
109 inputMultiplier = 1.0;
112 AliHLTComponent* AliHLTTPCGlobalMergerComponent::Spawn()
114 // see header file for class documentation
115 return new AliHLTTPCGlobalMergerComponent;
118 void AliHLTTPCGlobalMergerComponent::SetMergerParameters(Double_t maxy,Double_t maxz,Double_t maxkappa,Double_t maxpsi,Double_t maxtgl)
120 // see header file for class documentation
121 fGlobalMerger->SetParameter( maxy, maxz, maxkappa, maxpsi, maxtgl );
124 int AliHLTTPCGlobalMergerComponent::DoInit( int argc, const char** argv )
126 // see header file for class documentation
127 if ( fGlobalMerger || fVertex )
129 fGlobalMerger = new AliHLTTPCGlobalMerger();
130 fVertex = new AliHLTTPCVertex();
131 SetMergerParameters();
135 int AliHLTTPCGlobalMergerComponent::DoDeinit()
137 // see header file for class documentation
139 delete fGlobalMerger;
140 fGlobalMerger = NULL;
147 int AliHLTTPCGlobalMergerComponent::DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
148 AliHLTComponentTriggerData& trigData, AliHLTUInt8_t* outputPtr,
149 AliHLTUInt32_t& size, vector<AliHLTComponentBlockData>& outputBlocks )
151 // see header file for class documentation
152 const AliHLTComponentBlockData* iter = NULL;
153 const AliHLTComponentBlockData* lastVertexBlock = NULL;
156 std::vector<SliceData> slices;
157 std::vector<SliceData>::iterator sdIter, sdEnd;
158 int minSlice = INT_MAX, maxSlice = 0;
160 AliHLTTPCTrackletData* inPtr;
161 AliHLTTPCTrackletData* outPtr;
165 // Create sorted (by slice number) list of data (tracks and vertex) for each slice present.
166 // also note the min and max slice numbers
167 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
170 slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter );
172 sdIter = slices.begin();
173 sdEnd = slices.end();
174 while ( sdIter != sdEnd )
176 if ( sdIter->fSlice > slice || sdIter->fSlice == slice )
180 if ( sdIter==sdEnd || sdIter->fSlice>slice )
182 if ( sdIter == sdEnd )
184 if ( sdIter==slices.begin() )
188 sd.fVertexBlock = NULL;
189 sd.fVertexBlockIndex = 0;
190 sd.fTrackletBlock = NULL;
191 sd.fTrackletBlockIndex = 0;
192 sdIter = slices.insert( sdIter, sd );
194 if ( sdIter->fSlice == slice )
196 if ( iter->fDataType == AliHLTTPCDefinitions::fgkTrackSegmentsDataType )
198 if ( !sdIter->fTrackletBlock )
200 sdIter->fTrackletBlock = iter;
201 sdIter->fTrackletBlockIndex = ndx;
205 Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "Duplicate track data block",
206 "Duplicate track data block for slice %lu in event 0x%08lX (%lu) - previous block: %lu - new block: %lu.",
207 slice, evtData.fEventID, evtData.fEventID, sdIter->fTrackletBlockIndex, ndx );
210 if ( iter->fDataType == AliHLTTPCDefinitions::fgkVertexDataType )
212 lastVertexBlock = iter;
213 if ( !sdIter->fVertexBlock )
215 sdIter->fVertexBlock = iter;
216 sdIter->fVertexBlockIndex = ndx;
220 Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "Duplicate vertex data block",
221 "Duplicate vertex data block for slice %lu in event 0x%08lX (%lu) - previous block: %lu - new block: %lu.",
222 slice, evtData.fEventID, evtData.fEventID, sdIter->fVertexBlockIndex, ndx );
228 //fGlobalMerger->Setup( minSlice, maxSlice );
229 fGlobalMerger->Setup( 0, 35 );
231 if ( !lastVertexBlock )
233 Logging( kHLTLogInfo, "HLT::GlobalMerger::DoEvent", "No vertex data block",
234 "No vertex data block found for event 0x%08lX (%lu).", evtData.fEventID, evtData.fEventID );
238 fVertex->Read( (AliHLTTPCVertexData*)( lastVertexBlock->fPtr ) );
240 // Add all tracks into the merger
241 sdIter = slices.begin();
242 sdEnd = slices.end();
244 while ( sdIter != sdEnd )
246 if ( sdIter->fVertexBlock )
248 fVertex->Read( (AliHLTTPCVertexData*)( sdIter->fVertexBlock->fPtr ) );
249 fGlobalMerger->SetVertex( fVertex );
251 for ( int slNr=lastSlice+1; slNr<=sdIter->fSlice; slNr++ )
252 fGlobalMerger->InitSlice( slNr );
253 if ( sdIter->fTrackletBlock )
255 inPtr = (AliHLTTPCTrackletData*)( sdIter->fTrackletBlock->fPtr );
258 Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "No track data block",
259 "No track data block found for event 0x%08lX (%lu).", evtData.fEventID, evtData.fEventID );
263 //fGlobalMerger->InitSlice( sdIter->fSlice );
264 fGlobalMerger->FillTracks( inPtr->fTrackletCnt, inPtr->fTracklets );
267 lastSlice = sdIter->fSlice;
270 for ( int slNr=lastSlice+1; slNr<=35; slNr++ )
271 fGlobalMerger->InitSlice( slNr );
274 // Now we can really merge
275 fGlobalMerger->Merge();
276 fGlobalMerger->AddAllTracks();
279 outPtr = (AliHLTTPCTrackletData*)(outputPtr);
281 tSize = fGlobalMerger->GetOutTracks()->WriteTracks( ntracks0, outPtr->fTracklets );
282 outPtr->fTrackletCnt = ntracks0;
284 tSize += sizeof(AliHLTTPCTrackletData);
286 AliHLTComponentBlockData bd;
290 bd.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( minSlice, maxSlice, 0, 5 );
291 outputBlocks.push_back( bd );