]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/TPCLib/AliHLTTPCGlobalMergerComponent.cxx
added 'backwards' mapping: row/pad to channel; code cleanup
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCGlobalMergerComponent.cxx
CommitLineData
71d7c760 1// $Id$
2
3/**************************************************************************
9be2600f 4 * This file is property of and copyright by the ALICE HLT Project *
5 * ALICE Experiment at CERN, All rights reserved. *
71d7c760 6 * *
9be2600f 7 * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8 * Timm Steinbeck <timm@kip.uni-heidelberg.de> *
9 * for The ALICE HLT Project. *
71d7c760 10 * *
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 **************************************************************************/
19
96bda103 20/** @file AliHLTTPCGlobalMergerComponent.cxx
ecefc48a 21 @author Timm Steinbeck, Matthias Richter
22 @date
23 @brief HLT TPC global merger component.
24*/
71d7c760 25
e67b0680 26// see header file for class documentation //
27// or //
28// refer to README to build package //
29// or //
30// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt //
31
32#if __GNUC__>= 3
71d7c760 33using namespace std;
34#endif
35
36#include "AliHLTTPCGlobalMergerComponent.h"
7bcd6cad 37//#include "AliHLTTPCTransform.h"
a6c02c85 38#include "AliHLTTPCGlobalMerger.h"
39#include "AliHLTTPCVertex.h"
40#include "AliHLTTPCVertexData.h"
41#include "AliHLTTPCTrackSegmentData.h"
42#include "AliHLTTPCTrackArray.h"
71d7c760 43#include "AliHLTTPCTrackletDataFormat.h"
7bcd6cad 44//#include "AliHLTTPCSpacePointData.h"
45//#include "AliHLTTPCClusterDataFormat.h"
96bda103 46#include "AliHLTTPCDefinitions.h"
e67b0680 47#include <cstdlib>
48#include <cerrno>
71d7c760 49
672f8b8c 50/** ROOT macro for the implementation of ROOT specific class methods */
e67b0680 51ClassImp(AliHLTTPCGlobalMergerComponent);
71d7c760 52
53AliHLTTPCGlobalMergerComponent::AliHLTTPCGlobalMergerComponent()
96bda103 54 :
55 fGlobalMerger(NULL),
56 fVertex(NULL)
57{
58 // see header file for class documentation
59 // or
60 // refer to README to build package
61 // or
62 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
63}
64
71d7c760 65AliHLTTPCGlobalMergerComponent::~AliHLTTPCGlobalMergerComponent()
96bda103 66{
67 // see header file for class documentation
68}
71d7c760 69
70// Public functions to implement AliHLTComponent's interface.
71// These functions are required for the registration process
72
73const char* AliHLTTPCGlobalMergerComponent::GetComponentID()
e67b0680 74{
96bda103 75 // see header file for class documentation
e67b0680 76 return "TPCGlobalMerger";
77}
71d7c760 78
7bcd6cad 79void AliHLTTPCGlobalMergerComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list)
e67b0680 80{
96bda103 81 // see header file for class documentation
e67b0680 82 list.clear();
83 list.push_back( AliHLTTPCDefinitions::fgkTrackSegmentsDataType );
84 list.push_back( AliHLTTPCDefinitions::fgkVertexDataType );
85}
71d7c760 86
8ede8717 87AliHLTComponentDataType AliHLTTPCGlobalMergerComponent::GetOutputDataType()
e67b0680 88{
96bda103 89 // see header file for class documentation
e67b0680 90 return AliHLTTPCDefinitions::fgkTracksDataType;
91}
71d7c760 92
93void AliHLTTPCGlobalMergerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
e67b0680 94{
96bda103 95 // see header file for class documentation
e67b0680 96 // XXX TODO: Find more realistic values.
97 constBase = 0;
98 inputMultiplier = 1.0;
99}
71d7c760 100
101AliHLTComponent* AliHLTTPCGlobalMergerComponent::Spawn()
e67b0680 102{
96bda103 103 // see header file for class documentation
e67b0680 104 return new AliHLTTPCGlobalMergerComponent;
105}
71d7c760 106
107void AliHLTTPCGlobalMergerComponent::SetMergerParameters(Double_t maxy,Double_t maxz,Double_t maxkappa,Double_t maxpsi,Double_t maxtgl)
e67b0680 108{
96bda103 109 // see header file for class documentation
e67b0680 110 fGlobalMerger->SetParameter( maxy, maxz, maxkappa, maxpsi, maxtgl );
111}
71d7c760 112
5d2abf3b 113int AliHLTTPCGlobalMergerComponent::DoInit( int /*argc*/, const char** /*argv*/ )
e67b0680 114{
96bda103 115 // see header file for class documentation
e67b0680 116 if ( fGlobalMerger || fVertex )
117 return EINPROGRESS;
118 fGlobalMerger = new AliHLTTPCGlobalMerger();
119 fVertex = new AliHLTTPCVertex();
120 SetMergerParameters();
121 return 0;
122}
71d7c760 123
124int AliHLTTPCGlobalMergerComponent::DoDeinit()
e67b0680 125{
96bda103 126 // see header file for class documentation
e67b0680 127 if ( fGlobalMerger )
128 delete fGlobalMerger;
129 fGlobalMerger = NULL;
130 if ( fVertex )
131 delete fVertex;
132 fVertex = NULL;
133 return 0;
134}
71d7c760 135
8ede8717 136int AliHLTTPCGlobalMergerComponent::DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
5d2abf3b 137 AliHLTComponentTriggerData& /*trigData*/, AliHLTUInt8_t* outputPtr,
7bcd6cad 138 AliHLTUInt32_t& size, AliHLTComponentBlockDataList& outputBlocks )
e67b0680 139{
96bda103 140 // see header file for class documentation
e67b0680 141 const AliHLTComponentBlockData* iter = NULL;
142 const AliHLTComponentBlockData* lastVertexBlock = NULL;
143 unsigned long ndx;
144
145 std::vector<SliceData> slices;
146 std::vector<SliceData>::iterator sdIter, sdEnd;
147 int minSlice = INT_MAX, maxSlice = 0;
148 bool found;
149 AliHLTTPCTrackletData* inPtr;
150 AliHLTTPCTrackletData* outPtr;
151 UInt_t tSize = 0;
152 Int_t slice=0;
153
154 // Create sorted (by slice number) list of data (tracks and vertex) for each slice present.
155 // also note the min and max slice numbers
156 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
157 {
158 iter = blocks+ndx;
159 slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter );
160 found=false;
161 sdIter = slices.begin();
162 sdEnd = slices.end();
163 while ( sdIter != sdEnd )
71d7c760 164 {
e67b0680 165 if ( sdIter->fSlice > slice || sdIter->fSlice == slice )
166 break;
167 sdIter++;
168 }
169 if ( sdIter==sdEnd || sdIter->fSlice>slice )
170 {
171 if ( sdIter == sdEnd )
172 maxSlice = slice;
173 if ( sdIter==slices.begin() )
174 minSlice = slice;
175 SliceData sd;
176 sd.fSlice = slice;
177 sd.fVertexBlock = NULL;
178 sd.fVertexBlockIndex = 0;
179 sd.fTrackletBlock = NULL;
180 sd.fTrackletBlockIndex = 0;
181 sdIter = slices.insert( sdIter, sd );
182 }
183 if ( sdIter->fSlice == slice )
184 {
185 if ( iter->fDataType == AliHLTTPCDefinitions::fgkTrackSegmentsDataType )
71d7c760 186 {
e67b0680 187 if ( !sdIter->fTrackletBlock )
188 {
189 sdIter->fTrackletBlock = iter;
190 sdIter->fTrackletBlockIndex = ndx;
191 }
192 else
193 {
194 Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "Duplicate track data block",
195 "Duplicate track data block for slice %lu in event 0x%08lX (%lu) - previous block: %lu - new block: %lu.",
196 slice, evtData.fEventID, evtData.fEventID, sdIter->fTrackletBlockIndex, ndx );
197 }
71d7c760 198 }
e67b0680 199 if ( iter->fDataType == AliHLTTPCDefinitions::fgkVertexDataType )
71d7c760 200 {
e67b0680 201 lastVertexBlock = iter;
202 if ( !sdIter->fVertexBlock )
71d7c760 203 {
e67b0680 204 sdIter->fVertexBlock = iter;
205 sdIter->fVertexBlockIndex = ndx;
71d7c760 206 }
e67b0680 207 else
71d7c760 208 {
e67b0680 209 Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "Duplicate vertex data block",
210 "Duplicate vertex data block for slice %lu in event 0x%08lX (%lu) - previous block: %lu - new block: %lu.",
211 slice, evtData.fEventID, evtData.fEventID, sdIter->fVertexBlockIndex, ndx );
71d7c760 212 }
213 }
214 }
e67b0680 215 }
71d7c760 216
e67b0680 217 //fGlobalMerger->Setup( minSlice, maxSlice );
218 fGlobalMerger->Setup( 0, 35 );
71d7c760 219
e67b0680 220 if ( !lastVertexBlock )
221 {
222 Logging( kHLTLogInfo, "HLT::GlobalMerger::DoEvent", "No vertex data block",
223 "No vertex data block found for event 0x%08lX (%lu).", evtData.fEventID, evtData.fEventID );
224 fVertex->SetZero();
225 }
226 else
227 fVertex->Read( (AliHLTTPCVertexData*)( lastVertexBlock->fPtr ) );
228
229 // Add all tracks into the merger
230 sdIter = slices.begin();
231 sdEnd = slices.end();
232 int lastSlice = -1;
233 while ( sdIter != sdEnd )
234 {
235 if ( sdIter->fVertexBlock )
71d7c760 236 {
e67b0680 237 fVertex->Read( (AliHLTTPCVertexData*)( sdIter->fVertexBlock->fPtr ) );
238 fGlobalMerger->SetVertex( fVertex );
71d7c760 239 }
e67b0680 240 for ( int slNr=lastSlice+1; slNr<=sdIter->fSlice; slNr++ )
241 fGlobalMerger->InitSlice( slNr );
242 if ( sdIter->fTrackletBlock )
71d7c760 243 {
e67b0680 244 inPtr = (AliHLTTPCTrackletData*)( sdIter->fTrackletBlock->fPtr );
245 if ( !inPtr )
71d7c760 246 {
e67b0680 247 Logging( kHLTLogError, "HLT::GlobalMerger::DoEvent", "No track data block",
248 "No track data block found for event 0x%08lX (%lu).", evtData.fEventID, evtData.fEventID );
71d7c760 249 }
e67b0680 250 else
71d7c760 251 {
e67b0680 252 //fGlobalMerger->InitSlice( sdIter->fSlice );
253 fGlobalMerger->FillTracks( inPtr->fTrackletCnt, inPtr->fTracklets );
254 }
71d7c760 255 }
e67b0680 256 lastSlice = sdIter->fSlice;
257 sdIter++;
258 }
259 for ( int slNr=lastSlice+1; slNr<=35; slNr++ )
260 fGlobalMerger->InitSlice( slNr );
db16520a 261
71d7c760 262
e67b0680 263 // Now we can really merge
264 fGlobalMerger->Merge();
265 fGlobalMerger->AddAllTracks();
71d7c760 266
e67b0680 267 UInt_t ntracks0=0;
268 outPtr = (AliHLTTPCTrackletData*)(outputPtr);
71d7c760 269
e67b0680 270 tSize = fGlobalMerger->GetOutTracks()->WriteTracks( ntracks0, outPtr->fTracklets );
271 outPtr->fTrackletCnt = ntracks0;
71d7c760 272
e67b0680 273 tSize += sizeof(AliHLTTPCTrackletData);
71d7c760 274
e67b0680 275 AliHLTComponentBlockData bd;
276 FillBlockData( bd );
277 bd.fOffset = 0;
278 bd.fSize = tSize;
279 bd.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( minSlice, maxSlice, 0, 5 );
280 outputBlocks.push_back( bd );
71d7c760 281
e67b0680 282 size = tSize;
283 return 0;
284}
71d7c760 285
286