]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/TPCLib/AliHLTTPCGlobalMergerComponent.cxx
added cutoff parameter in z direction to ignore clusters of large z (Gaute)
[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
b09247a2 36#include <climits>
71d7c760 37#include "AliHLTTPCGlobalMergerComponent.h"
7bcd6cad 38//#include "AliHLTTPCTransform.h"
a6c02c85 39#include "AliHLTTPCGlobalMerger.h"
40#include "AliHLTTPCVertex.h"
41#include "AliHLTTPCVertexData.h"
42#include "AliHLTTPCTrackSegmentData.h"
43#include "AliHLTTPCTrackArray.h"
71d7c760 44#include "AliHLTTPCTrackletDataFormat.h"
7bcd6cad 45//#include "AliHLTTPCSpacePointData.h"
46//#include "AliHLTTPCClusterDataFormat.h"
96bda103 47#include "AliHLTTPCDefinitions.h"
e67b0680 48#include <cstdlib>
49#include <cerrno>
71d7c760 50
672f8b8c 51/** ROOT macro for the implementation of ROOT specific class methods */
e67b0680 52ClassImp(AliHLTTPCGlobalMergerComponent);
71d7c760 53
54AliHLTTPCGlobalMergerComponent::AliHLTTPCGlobalMergerComponent()
96bda103 55 :
56 fGlobalMerger(NULL),
57 fVertex(NULL)
58{
59 // see header file for class documentation
60 // or
61 // refer to README to build package
62 // or
63 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
64}
65
71d7c760 66AliHLTTPCGlobalMergerComponent::~AliHLTTPCGlobalMergerComponent()
96bda103 67{
68 // see header file for class documentation
69}
71d7c760 70
71// Public functions to implement AliHLTComponent's interface.
72// These functions are required for the registration process
73
74const char* AliHLTTPCGlobalMergerComponent::GetComponentID()
e67b0680 75{
96bda103 76 // see header file for class documentation
e67b0680 77 return "TPCGlobalMerger";
78}
71d7c760 79
7bcd6cad 80void AliHLTTPCGlobalMergerComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list)
e67b0680 81{
96bda103 82 // see header file for class documentation
e67b0680 83 list.clear();
84 list.push_back( AliHLTTPCDefinitions::fgkTrackSegmentsDataType );
85 list.push_back( AliHLTTPCDefinitions::fgkVertexDataType );
86}
71d7c760 87
8ede8717 88AliHLTComponentDataType AliHLTTPCGlobalMergerComponent::GetOutputDataType()
e67b0680 89{
96bda103 90 // see header file for class documentation
e67b0680 91 return AliHLTTPCDefinitions::fgkTracksDataType;
92}
71d7c760 93
94void AliHLTTPCGlobalMergerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
e67b0680 95{
96bda103 96 // see header file for class documentation
e67b0680 97 // XXX TODO: Find more realistic values.
98 constBase = 0;
99 inputMultiplier = 1.0;
100}
71d7c760 101
102AliHLTComponent* AliHLTTPCGlobalMergerComponent::Spawn()
e67b0680 103{
96bda103 104 // see header file for class documentation
e67b0680 105 return new AliHLTTPCGlobalMergerComponent;
106}
71d7c760 107
108void AliHLTTPCGlobalMergerComponent::SetMergerParameters(Double_t maxy,Double_t maxz,Double_t maxkappa,Double_t maxpsi,Double_t maxtgl)
e67b0680 109{
96bda103 110 // see header file for class documentation
e67b0680 111 fGlobalMerger->SetParameter( maxy, maxz, maxkappa, maxpsi, maxtgl );
112}
71d7c760 113
5d2abf3b 114int AliHLTTPCGlobalMergerComponent::DoInit( int /*argc*/, const char** /*argv*/ )
e67b0680 115{
96bda103 116 // see header file for class documentation
e67b0680 117 if ( fGlobalMerger || fVertex )
118 return EINPROGRESS;
119 fGlobalMerger = new AliHLTTPCGlobalMerger();
120 fVertex = new AliHLTTPCVertex();
121 SetMergerParameters();
122 return 0;
123}
71d7c760 124
125int AliHLTTPCGlobalMergerComponent::DoDeinit()
e67b0680 126{
96bda103 127 // see header file for class documentation
e67b0680 128 if ( fGlobalMerger )
129 delete fGlobalMerger;
130 fGlobalMerger = NULL;
131 if ( fVertex )
132 delete fVertex;
133 fVertex = NULL;
134 return 0;
135}
71d7c760 136
8ede8717 137int AliHLTTPCGlobalMergerComponent::DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
5d2abf3b 138 AliHLTComponentTriggerData& /*trigData*/, AliHLTUInt8_t* outputPtr,
7bcd6cad 139 AliHLTUInt32_t& size, AliHLTComponentBlockDataList& outputBlocks )
e67b0680 140{
96bda103 141 // see header file for class documentation
8ba9a9ee 142 int iResult=0;
e67b0680 143 const AliHLTComponentBlockData* iter = NULL;
144 const AliHLTComponentBlockData* lastVertexBlock = NULL;
145 unsigned long ndx;
146
147 std::vector<SliceData> slices;
148 std::vector<SliceData>::iterator sdIter, sdEnd;
149 int minSlice = INT_MAX, maxSlice = 0;
150 bool found;
151 AliHLTTPCTrackletData* inPtr;
152 AliHLTTPCTrackletData* outPtr;
153 UInt_t tSize = 0;
154 Int_t slice=0;
155
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++ )
159 {
160 iter = blocks+ndx;
161 slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter );
162 found=false;
163 sdIter = slices.begin();
164 sdEnd = slices.end();
165 while ( sdIter != sdEnd )
71d7c760 166 {
e67b0680 167 if ( sdIter->fSlice > slice || sdIter->fSlice == slice )
168 break;
169 sdIter++;
170 }
171 if ( sdIter==sdEnd || sdIter->fSlice>slice )
172 {
173 if ( sdIter == sdEnd )
174 maxSlice = slice;
175 if ( sdIter==slices.begin() )
176 minSlice = slice;
177 SliceData sd;
178 sd.fSlice = slice;
179 sd.fVertexBlock = NULL;
180 sd.fVertexBlockIndex = 0;
181 sd.fTrackletBlock = NULL;
182 sd.fTrackletBlockIndex = 0;
183 sdIter = slices.insert( sdIter, sd );
184 }
185 if ( sdIter->fSlice == slice )
186 {
187 if ( iter->fDataType == AliHLTTPCDefinitions::fgkTrackSegmentsDataType )
71d7c760 188 {
e67b0680 189 if ( !sdIter->fTrackletBlock )
190 {
191 sdIter->fTrackletBlock = iter;
192 sdIter->fTrackletBlockIndex = ndx;
193 }
194 else
195 {
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 );
199 }
71d7c760 200 }
e67b0680 201 if ( iter->fDataType == AliHLTTPCDefinitions::fgkVertexDataType )
71d7c760 202 {
e67b0680 203 lastVertexBlock = iter;
204 if ( !sdIter->fVertexBlock )
71d7c760 205 {
e67b0680 206 sdIter->fVertexBlock = iter;
207 sdIter->fVertexBlockIndex = ndx;
71d7c760 208 }
e67b0680 209 else
71d7c760 210 {
e67b0680 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 );
71d7c760 214 }
215 }
216 }
e67b0680 217 }
71d7c760 218
e67b0680 219 //fGlobalMerger->Setup( minSlice, maxSlice );
220 fGlobalMerger->Setup( 0, 35 );
71d7c760 221
e67b0680 222 if ( !lastVertexBlock )
223 {
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 );
226 fVertex->SetZero();
227 }
228 else
229 fVertex->Read( (AliHLTTPCVertexData*)( lastVertexBlock->fPtr ) );
230
231 // Add all tracks into the merger
232 sdIter = slices.begin();
233 sdEnd = slices.end();
234 int lastSlice = -1;
235 while ( sdIter != sdEnd )
236 {
237 if ( sdIter->fVertexBlock )
71d7c760 238 {
e67b0680 239 fVertex->Read( (AliHLTTPCVertexData*)( sdIter->fVertexBlock->fPtr ) );
240 fGlobalMerger->SetVertex( fVertex );
71d7c760 241 }
e67b0680 242 for ( int slNr=lastSlice+1; slNr<=sdIter->fSlice; slNr++ )
243 fGlobalMerger->InitSlice( slNr );
244 if ( sdIter->fTrackletBlock )
71d7c760 245 {
e67b0680 246 inPtr = (AliHLTTPCTrackletData*)( sdIter->fTrackletBlock->fPtr );
247 if ( !inPtr )
71d7c760 248 {
e67b0680 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 );
71d7c760 251 }
e67b0680 252 else
71d7c760 253 {
e67b0680 254 //fGlobalMerger->InitSlice( sdIter->fSlice );
255 fGlobalMerger->FillTracks( inPtr->fTrackletCnt, inPtr->fTracklets );
256 }
71d7c760 257 }
e67b0680 258 lastSlice = sdIter->fSlice;
259 sdIter++;
260 }
261 for ( int slNr=lastSlice+1; slNr<=35; slNr++ )
262 fGlobalMerger->InitSlice( slNr );
db16520a 263
71d7c760 264
e67b0680 265 // Now we can really merge
266 fGlobalMerger->Merge();
267 fGlobalMerger->AddAllTracks();
71d7c760 268
8ba9a9ee 269 // check if there was enough space in the output buffer
270 UInt_t ntracks0=fGlobalMerger->GetOutTracks()->GetNTracks();
271 if (outputPtr==NULL || (sizeof(AliHLTTPCTrackletData)+ntracks0*sizeof(AliHLTTPCTrackSegmentData)>size)) {
272 iResult=-ENOSPC;
273 } else {
e67b0680 274 outPtr = (AliHLTTPCTrackletData*)(outputPtr);
71d7c760 275
e67b0680 276 tSize = fGlobalMerger->GetOutTracks()->WriteTracks( ntracks0, outPtr->fTracklets );
277 outPtr->fTrackletCnt = ntracks0;
71d7c760 278
e67b0680 279 tSize += sizeof(AliHLTTPCTrackletData);
71d7c760 280
e67b0680 281 AliHLTComponentBlockData bd;
282 FillBlockData( bd );
283 bd.fOffset = 0;
284 bd.fSize = tSize;
285 bd.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( minSlice, maxSlice, 0, 5 );
286 outputBlocks.push_back( bd );
8ba9a9ee 287 }
71d7c760 288
e67b0680 289 size = tSize;
8ba9a9ee 290 return iResult;
e67b0680 291}
71d7c760 292
293