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 /** @file AliHLTTPCGlobalMergerComponent.cxx
21 @author Timm Steinbeck, Matthias Richter
23 @brief HLT TPC global merger component.
26 // see header file for class documentation //
28 // refer to README to build package //
30 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt //
36 #include "AliHLTTPCGlobalMergerComponent.h"
37 //#include "AliHLTTPCTransform.h"
38 #include "AliHLTTPCGlobalMerger.h"
39 #include "AliHLTTPCVertex.h"
40 #include "AliHLTTPCVertexData.h"
41 #include "AliHLTTPCTrackSegmentData.h"
42 #include "AliHLTTPCTrackArray.h"
43 #include "AliHLTTPCTrackletDataFormat.h"
44 //#include "AliHLTTPCSpacePointData.h"
45 //#include "AliHLTTPCClusterDataFormat.h"
46 #include "AliHLTTPCDefinitions.h"
50 // this is a global object used for automatic component registration, do not use this
51 AliHLTTPCGlobalMergerComponent gAliHLTTPCGlobalMergerComponent;
53 ClassImp(AliHLTTPCGlobalMergerComponent);
55 AliHLTTPCGlobalMergerComponent::AliHLTTPCGlobalMergerComponent()
60 // see header file for class documentation
62 // refer to README to build package
64 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
67 AliHLTTPCGlobalMergerComponent::~AliHLTTPCGlobalMergerComponent()
69 // see header file for class documentation
72 // Public functions to implement AliHLTComponent's interface.
73 // These functions are required for the registration process
75 const char* AliHLTTPCGlobalMergerComponent::GetComponentID()
77 // see header file for class documentation
78 return "TPCGlobalMerger";
81 void AliHLTTPCGlobalMergerComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list)
83 // see header file for class documentation
85 list.push_back( AliHLTTPCDefinitions::fgkTrackSegmentsDataType );
86 list.push_back( AliHLTTPCDefinitions::fgkVertexDataType );
89 AliHLTComponentDataType AliHLTTPCGlobalMergerComponent::GetOutputDataType()
91 // see header file for class documentation
92 return AliHLTTPCDefinitions::fgkTracksDataType;
95 void AliHLTTPCGlobalMergerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
97 // see header file for class documentation
98 // XXX TODO: Find more realistic values.
100 inputMultiplier = 1.0;
103 AliHLTComponent* AliHLTTPCGlobalMergerComponent::Spawn()
105 // see header file for class documentation
106 return new AliHLTTPCGlobalMergerComponent;
109 void AliHLTTPCGlobalMergerComponent::SetMergerParameters(Double_t maxy,Double_t maxz,Double_t maxkappa,Double_t maxpsi,Double_t maxtgl)
111 // see header file for class documentation
112 fGlobalMerger->SetParameter( maxy, maxz, maxkappa, maxpsi, maxtgl );
115 int AliHLTTPCGlobalMergerComponent::DoInit( int argc, const char** argv )
117 // see header file for class documentation
118 if ( fGlobalMerger || fVertex )
120 fGlobalMerger = new AliHLTTPCGlobalMerger();
121 fVertex = new AliHLTTPCVertex();
122 SetMergerParameters();
126 int AliHLTTPCGlobalMergerComponent::DoDeinit()
128 // see header file for class documentation
130 delete fGlobalMerger;
131 fGlobalMerger = NULL;
138 int AliHLTTPCGlobalMergerComponent::DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
139 AliHLTComponentTriggerData& trigData, AliHLTUInt8_t* outputPtr,
140 AliHLTUInt32_t& size, AliHLTComponentBlockDataList& outputBlocks )
142 // see header file for class documentation
143 const AliHLTComponentBlockData* iter = NULL;
144 const AliHLTComponentBlockData* lastVertexBlock = NULL;
147 std::vector<SliceData> slices;
148 std::vector<SliceData>::iterator sdIter, sdEnd;
149 int minSlice = INT_MAX, maxSlice = 0;
151 AliHLTTPCTrackletData* inPtr;
152 AliHLTTPCTrackletData* outPtr;
156 // Create sorted (by slice number) list of data (tracks and vertex) for each slice present.
157 // also note the min and max slice numbers
158 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
161 slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter );
163 sdIter = slices.begin();
164 sdEnd = slices.end();
165 while ( sdIter != sdEnd )
167 if ( sdIter->fSlice > slice || sdIter->fSlice == slice )
171 if ( sdIter==sdEnd || sdIter->fSlice>slice )
173 if ( sdIter == sdEnd )
175 if ( sdIter==slices.begin() )
179 sd.fVertexBlock = NULL;
180 sd.fVertexBlockIndex = 0;
181 sd.fTrackletBlock = NULL;
182 sd.fTrackletBlockIndex = 0;
183 sdIter = slices.insert( sdIter, sd );
185 if ( sdIter->fSlice == slice )
187 if ( iter->fDataType == AliHLTTPCDefinitions::fgkTrackSegmentsDataType )
189 if ( !sdIter->fTrackletBlock )
191 sdIter->fTrackletBlock = iter;
192 sdIter->fTrackletBlockIndex = ndx;
196 Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "Duplicate track data block",
197 "Duplicate track data block for slice %lu in event 0x%08lX (%lu) - previous block: %lu - new block: %lu.",
198 slice, evtData.fEventID, evtData.fEventID, sdIter->fTrackletBlockIndex, ndx );
201 if ( iter->fDataType == AliHLTTPCDefinitions::fgkVertexDataType )
203 lastVertexBlock = iter;
204 if ( !sdIter->fVertexBlock )
206 sdIter->fVertexBlock = iter;
207 sdIter->fVertexBlockIndex = ndx;
211 Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "Duplicate vertex data block",
212 "Duplicate vertex data block for slice %lu in event 0x%08lX (%lu) - previous block: %lu - new block: %lu.",
213 slice, evtData.fEventID, evtData.fEventID, sdIter->fVertexBlockIndex, ndx );
219 //fGlobalMerger->Setup( minSlice, maxSlice );
220 fGlobalMerger->Setup( 0, 35 );
222 if ( !lastVertexBlock )
224 Logging( kHLTLogInfo, "HLT::GlobalMerger::DoEvent", "No vertex data block",
225 "No vertex data block found for event 0x%08lX (%lu).", evtData.fEventID, evtData.fEventID );
229 fVertex->Read( (AliHLTTPCVertexData*)( lastVertexBlock->fPtr ) );
231 // Add all tracks into the merger
232 sdIter = slices.begin();
233 sdEnd = slices.end();
235 while ( sdIter != sdEnd )
237 if ( sdIter->fVertexBlock )
239 fVertex->Read( (AliHLTTPCVertexData*)( sdIter->fVertexBlock->fPtr ) );
240 fGlobalMerger->SetVertex( fVertex );
242 for ( int slNr=lastSlice+1; slNr<=sdIter->fSlice; slNr++ )
243 fGlobalMerger->InitSlice( slNr );
244 if ( sdIter->fTrackletBlock )
246 inPtr = (AliHLTTPCTrackletData*)( sdIter->fTrackletBlock->fPtr );
249 Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "No track data block",
250 "No track data block found for event 0x%08lX (%lu).", evtData.fEventID, evtData.fEventID );
254 //fGlobalMerger->InitSlice( sdIter->fSlice );
255 fGlobalMerger->FillTracks( inPtr->fTrackletCnt, inPtr->fTracklets );
258 lastSlice = sdIter->fSlice;
261 for ( int slNr=lastSlice+1; slNr<=35; slNr++ )
262 fGlobalMerger->InitSlice( slNr );
265 // Now we can really merge
266 fGlobalMerger->Merge();
267 fGlobalMerger->AddAllTracks();
270 outPtr = (AliHLTTPCTrackletData*)(outputPtr);
272 tSize = fGlobalMerger->GetOutTracks()->WriteTracks( ntracks0, outPtr->fTracklets );
273 outPtr->fTrackletCnt = ntracks0;
275 tSize += sizeof(AliHLTTPCTrackletData);
277 AliHLTComponentBlockData bd;
281 bd.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( minSlice, maxSlice, 0, 5 );
282 outputBlocks.push_back( bd );