]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/TPCLib/tracking-ca/AliHLTTPCCAGlobalMergerComponent.cxx
bug fix: reconstruction crash when the output buffer size exceed
[u/mrichter/AliRoot.git] / HLT / TPCLib / tracking-ca / AliHLTTPCCAGlobalMergerComponent.cxx
CommitLineData
e1f2d1c3 1// **************************************************************************
fbb9b71b 2// This file is property of and copyright by the ALICE HLT Project *
e1f2d1c3 3// ALICE Experiment at CERN, All rights reserved. *
4// *
5// Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
6// Ivan Kisel <kisel@kip.uni-heidelberg.de> *
7// Matthias Kretz <kretz@kde.org> *
8// for The ALICE HLT Project. *
9// *
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// *
18//***************************************************************************
19
20
21/** @file AliHLTTPCCAGlobalMergerComponent.cxx
22 @author Matthias Kretz
23 @date
24 @brief HLT TPC CA global merger component.
25*/
26
27#if __GNUC__>= 3
28using namespace std;
29#endif
30
31#include "AliHLTTPCCAGlobalMergerComponent.h"
32#include "AliHLTTPCCAMergerOutput.h"
33#include "AliHLTTPCTransform.h"
34#include "AliHLTTPCCAMerger.h"
35#include "AliHLTTPCVertex.h"
36#include "AliHLTTPCVertexData.h"
37#include "AliHLTTPCTrackSegmentData.h"
38#include "AliHLTTPCTrack.h"
39#include "AliHLTTPCTrackArray.h"
40#include "AliHLTTPCTrackletDataFormat.h"
41#include "AliHLTTPCCADef.h"
42#include "AliHLTTPCDefinitions.h"
43#include "AliHLTTPCCATrackConvertor.h"
5f8cb375 44#include "AliHLTTPCCASliceOutput.h"
e1f2d1c3 45
46#include "AliCDBEntry.h"
47#include "AliCDBManager.h"
48#include "TObjString.h"
49#include "TObjArray.h"
be7c7c2b 50#include "AliHLTExternalTrackParam.h"
e1f2d1c3 51
52#include <climits>
53#include <cstdlib>
54#include <cerrno>
55
56
57// ROOT macro for the implementation of ROOT specific class methods
58ClassImp( AliHLTTPCCAGlobalMergerComponent )
59
60
e1f2d1c3 61AliHLTTPCCAGlobalMergerComponent::AliHLTTPCCAGlobalMergerComponent()
f0fb467d 62 : fGlobalMerger( 0 ), fSolenoidBz( 0 ), fClusterErrorCorrectionY(0), fClusterErrorCorrectionZ(0)
e1f2d1c3 63{
64 // see header file for class documentation
65}
66
67// Public functions to implement AliHLTComponent's interface.
68// These functions are required for the registration process
69
70const char *AliHLTTPCCAGlobalMergerComponent::GetComponentID()
71{
72 // see header file for class documentation
73 return "TPCCAGlobalMerger";
74}
75
76void AliHLTTPCCAGlobalMergerComponent::GetInputDataTypes( AliHLTComponentDataTypeList &list )
77{
78 // see header file for class documentation
79 list.clear();
80 list.push_back( AliHLTTPCCADefinitions::fgkTrackletsDataType );
81 //list.push_back( AliHLTTPCDefinitions::fgkTrackSegmentsDataType );
82 //list.push_back( AliHLTTPCDefinitions::fgkVertexDataType );
83}
84
85AliHLTComponentDataType AliHLTTPCCAGlobalMergerComponent::GetOutputDataType()
86{
87 // see header file for class documentation
be7c7c2b 88 //return AliHLTTPCDefinitions::fgkTracksDataType; // old
89 return kAliHLTDataTypeTrack|kAliHLTDataOriginTPC;
e1f2d1c3 90}
91
92void AliHLTTPCCAGlobalMergerComponent::GetOutputDataSize( unsigned long &constBase, double &inputMultiplier )
93{
94 // see header file for class documentation
95 // XXX TODO: Find more realistic values.
96 constBase = 0;
97 inputMultiplier = 1.0;
98}
99
100AliHLTComponent *AliHLTTPCCAGlobalMergerComponent::Spawn()
101{
102 // see header file for class documentation
103 return new AliHLTTPCCAGlobalMergerComponent;
104}
105
17d6eada 106
107
108
109void AliHLTTPCCAGlobalMergerComponent::SetDefaultConfiguration()
110{
c26cae51 111 // Set default configuration for the CA merger component
17d6eada 112 // Some parameters can be later overwritten from the OCDB
113
a8714ffa 114 fSolenoidBz = -5.00668;
f0fb467d 115 fClusterErrorCorrectionY = 0;
116 fClusterErrorCorrectionZ = 1.1;
17d6eada 117}
118
119int AliHLTTPCCAGlobalMergerComponent::ReadConfigurationString( const char* arguments )
120{
121 // Set configuration parameters for the CA merger component from the string
122
123 int iResult = 0;
124 if ( !arguments ) return iResult;
c26cae51 125
17d6eada 126 TString allArgs = arguments;
127 TString argument;
128 int bMissingParam = 0;
129
130 TObjArray* pTokens = allArgs.Tokenize( " " );
131
132 int nArgs = pTokens ? pTokens->GetEntries() : 0;
c26cae51 133
17d6eada 134 for ( int i = 0; i < nArgs; i++ ) {
135 argument = ( ( TObjString* )pTokens->At( i ) )->GetString();
136 if ( argument.IsNull() ) continue;
c26cae51 137
17d6eada 138 if ( argument.CompareTo( "-solenoidBz" ) == 0 ) {
139 if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
75970b8d 140 HLTWarning("argument -solenoidBz is deprecated, magnetic field set up globally (%f)", GetBz());
17d6eada 141 continue;
c26cae51 142 }
17d6eada 143
f0fb467d 144 if ( argument.CompareTo( "-errorCorrectionY" ) == 0 ) {
145 if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
146 fClusterErrorCorrectionY = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
147 HLTInfo( "Cluster Y error correction factor set to: %f", fClusterErrorCorrectionY );
148 continue;
149 }
150
151 if ( argument.CompareTo( "-errorCorrectionZ" ) == 0 ) {
152 if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
153 fClusterErrorCorrectionZ = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
154 HLTInfo( "Cluster Z error correction factor set to: %f", fClusterErrorCorrectionZ );
155 continue;
156 }
157
17d6eada 158 HLTError( "Unknown option \"%s\"", argument.Data() );
159 iResult = -EINVAL;
160 }
161 delete pTokens;
162
163 if ( bMissingParam ) {
164 HLTError( "Specifier missed for parameter \"%s\"", argument.Data() );
165 iResult = -EINVAL;
166 }
c26cae51 167
17d6eada 168 return iResult;
169}
170
171
172int AliHLTTPCCAGlobalMergerComponent::ReadCDBEntry( const char* cdbEntry, const char* chainId )
e1f2d1c3 173{
174 // see header file for class documentation
17d6eada 175
c26cae51 176 const char* defaultNotify = "";
17d6eada 177
c26cae51 178 if ( !cdbEntry ) {
179 cdbEntry = "HLT/ConfigTPC/TPCCAGlobalMerger";
180 defaultNotify = " (default)";
17d6eada 181 chainId = 0;
e1f2d1c3 182 }
183
c26cae51 184 HLTInfo( "configure from entry \"%s\"%s, chain id %s", cdbEntry, defaultNotify, ( chainId != NULL && chainId[0] != 0 ) ? chainId : "<none>" );
185 AliCDBEntry *pEntry = AliCDBManager::Instance()->Get( cdbEntry );//,GetRunNo());
e1f2d1c3 186
c26cae51 187 if ( !pEntry ) {
188 HLTError( "cannot fetch object \"%s\" from CDB", cdbEntry );
189 return -EINVAL;
17d6eada 190 }
191
c26cae51 192 TObjString* pString = dynamic_cast<TObjString*>( pEntry->GetObject() );
17d6eada 193
c26cae51 194 if ( !pString ) {
195 HLTError( "configuration object \"%s\" has wrong type, required TObjString", cdbEntry );
196 return -EINVAL;
17d6eada 197 }
198
c26cae51 199 HLTInfo( "received configuration object string: \"%s\"", pString->GetString().Data() );
17d6eada 200
201 return ReadConfigurationString( pString->GetString().Data() );
202}
203
204
205
206int AliHLTTPCCAGlobalMergerComponent::Configure( const char* cdbEntry, const char* chainId, const char *commandLine )
207{
c26cae51 208 // Configure the component
209 // There are few levels of configuration,
17d6eada 210 // parameters which are set on one step can be overwritten on the next step
c26cae51 211
17d6eada 212 //* read hard-coded values
213
c26cae51 214 SetDefaultConfiguration();
17d6eada 215
216 //* read the default CDB entry
c26cae51 217
17d6eada 218 int iResult1 = ReadCDBEntry( NULL, chainId );
c26cae51 219
17d6eada 220 //* read magnetic field
c26cae51 221
75970b8d 222 int iResult2 = true;//ReadCDBEntry( kAliHLTCDBSolenoidBz, chainId );
223 fSolenoidBz = GetBz();
c26cae51 224
17d6eada 225 //* read the actual CDB entry if required
c26cae51 226
227 int iResult3 = ( cdbEntry ) ? ReadCDBEntry( cdbEntry, chainId ) : 0;
228
17d6eada 229 //* read extra parameters from input (if they are)
230
231 int iResult4 = 0;
c26cae51 232
233 if ( commandLine && commandLine[0] != '\0' ) {
234 HLTInfo( "received configuration string from HLT framework: \"%s\"", commandLine );
235 iResult4 = ReadConfigurationString( commandLine );
17d6eada 236 }
237
c26cae51 238
17d6eada 239 // Initialize the merger
e1f2d1c3 240
241 AliHLTTPCCAParam param;
fbb9b71b 242
e1f2d1c3 243 {
244 // get gemetry
fbb9b71b 245 int iSec = 0;
246 float inRmin = 83.65;
247 float outRmax = 247.7;
248 float plusZmin = 0.0529937;
249 float plusZmax = 249.778;
250 float minusZmin = -249.645;
251 float minusZmax = -0.0799937;
252 float dalpha = 0.349066;
253 float alpha = 0.174533 + dalpha * iSec;
254 bool zPlus = ( iSec < 18 );
255 float zMin = zPlus ? plusZmin : minusZmin;
256 float zMax = zPlus ? plusZmax : minusZmax;
257 int nRows = AliHLTTPCTransform::GetNRows();
258 float padPitch = 0.4;
259 float sigmaZ = 0.228808;
260 float *rowX = new float [nRows];
261 for ( int irow = 0; irow < nRows; irow++ ) {
e1f2d1c3 262 rowX[irow] = AliHLTTPCTransform::Row2X( irow );
263 }
fbb9b71b 264
e1f2d1c3 265 param.Initialize( iSec, nRows, rowX, alpha, dalpha,
fbb9b71b 266 inRmin, outRmax, zMin, zMax, padPitch, sigmaZ, fSolenoidBz );
f0fb467d 267
268 if( fClusterErrorCorrectionY>1.e-4 ) param.SetClusterError2CorrectionY( fClusterErrorCorrectionY*fClusterErrorCorrectionY );
269 if( fClusterErrorCorrectionZ>1.e-4 ) param.SetClusterError2CorrectionZ( fClusterErrorCorrectionZ*fClusterErrorCorrectionZ );
270 param.Update();
271
e1f2d1c3 272 delete[] rowX;
273 }
c26cae51 274
e1f2d1c3 275
276 fGlobalMerger->SetSliceParam( param );
277
c26cae51 278 return iResult1 ? iResult1 : ( iResult2 ? iResult2 : ( iResult3 ? iResult3 : iResult4 ) );
17d6eada 279}
280
281
282
283
284int AliHLTTPCCAGlobalMergerComponent::DoInit( int argc, const char** argv )
285{
286 // see header file for class documentation
c26cae51 287
17d6eada 288 if ( fGlobalMerger ) {
289 return EINPROGRESS;
290 }
291
292 fGlobalMerger = new AliHLTTPCCAMerger();
e1f2d1c3 293
fbb9b71b 294 TString arguments = "";
295 for ( int i = 0; i < argc; i++ ) {
fbb9b71b 296 if ( !arguments.IsNull() ) arguments += " ";
17d6eada 297 arguments += argv[i];
e1f2d1c3 298 }
c26cae51 299
300 return Configure( NULL, NULL, arguments.Data() );
e1f2d1c3 301}
302
17d6eada 303int AliHLTTPCCAGlobalMergerComponent::Reconfigure( const char* cdbEntry, const char* chainId )
c26cae51 304{
305 // Reconfigure the component from OCDB
17d6eada 306
307 return Configure( cdbEntry, chainId, NULL );
308}
309
310
311
e1f2d1c3 312int AliHLTTPCCAGlobalMergerComponent::DoDeinit()
313{
314 // see header file for class documentation
315 delete fGlobalMerger;
316 fGlobalMerger = 0;
317
318 return 0;
319}
320
321int AliHLTTPCCAGlobalMergerComponent::DoEvent( const AliHLTComponentEventData &evtData,
fbb9b71b 322 const AliHLTComponentBlockData *blocks, AliHLTComponentTriggerData &/*trigData*/,
e1f2d1c3 323 AliHLTUInt8_t *outputPtr, AliHLTUInt32_t &size, AliHLTComponentBlockDataList &outputBlocks )
324{
325 // see header file for class documentation
326 int iResult = 0;
fbb9b71b 327 unsigned int maxBufferSize = size;
e1f2d1c3 328
329 size = 0;
330
331 if ( !outputPtr ) {
fbb9b71b 332 return -ENOSPC;
e1f2d1c3 333 }
334 if ( !IsDataEvent() ) {
335 return 0;
336 }
337
338 fGlobalMerger->Clear();
339
340 const AliHLTComponentBlockData *const blocksEnd = blocks + evtData.fBlockCnt;
341 for ( const AliHLTComponentBlockData *block = blocks; block < blocksEnd; ++block ) {
342 if ( block->fDataType != AliHLTTPCCADefinitions::fgkTrackletsDataType ) {
343 continue;
344 }
345
346 int slice = AliHLTTPCDefinitions::GetMinSliceNr( *block );
347 if ( slice < 0 || slice >= AliHLTTPCTransform::GetNSlice() ) {
348 HLTError( "invalid slice number %d extracted from specification 0x%08lx, skipping block of type %s",
fbb9b71b 349 slice, block->fSpecification, DataType2Text( block->fDataType ).c_str() );
e1f2d1c3 350 // just remember the error, if there are other valid blocks ignore the error, return code otherwise
351 iResult = -EBADF;
352 continue;
353 }
354
355 if ( slice != AliHLTTPCDefinitions::GetMaxSliceNr( *block ) ) {
356 // the code was not written for/ never used with multiple slices in one data block/ specification
fbb9b71b 357 HLTWarning( "specification 0x%08lx indicates multiple slices in data block %s: never used before, please audit the code",
358 block->fSpecification, DataType2Text( block->fDataType ).c_str() );
e1f2d1c3 359 }
5f8cb375 360 AliHLTTPCCASliceOutput *sliceOut = reinterpret_cast<AliHLTTPCCASliceOutput *>( block->fPtr );
361 sliceOut->SetPointers();
362 fGlobalMerger->SetSliceData( slice, sliceOut );
d4594e7d 363
364 /*char filename[256];
365 sprintf(filename, "debug%d.out", slice);
366 FILE* fp = fopen(filename, "w+b");
367 if (fp == NULL) printf("Error!!!\n");
368 fwrite(sliceOut, 1, sliceOut->EstimateSize(sliceOut->NTracks(), sliceOut->NTrackClusters()), fp);
369 fclose(fp);*/
e1f2d1c3 370 }
371 fGlobalMerger->Reconstruct();
372
373 const AliHLTTPCCAMergerOutput *mergerOutput = fGlobalMerger->Output();
374
375
376 // Fill output tracks
377
fbb9b71b 378 unsigned int mySize = 0;
be7c7c2b 379 {
380 AliHLTTracksData* outPtr = ( AliHLTTracksData* )( outputPtr );
381
382 AliHLTExternalTrackParam* currOutTrack = outPtr->fTracklets;
383
384 mySize = ( ( AliHLTUInt8_t * )currOutTrack ) - ( ( AliHLTUInt8_t * )outputPtr );
385
386 outPtr->fCount = 0;
387
388 int nTracks = mergerOutput->NTracks();
389
390 for ( int itr = 0; itr < nTracks; itr++ ) {
391
392 // convert AliHLTTPCCAMergedTrack to AliHLTTrack
393
394 const AliHLTTPCCAMergedTrack &track = mergerOutput->Track( itr );
395
396 unsigned int dSize = sizeof( AliHLTExternalTrackParam ) + track.NClusters() * sizeof( unsigned int );
397
398 if ( mySize + dSize > maxBufferSize ) {
399 HLTWarning( "Output buffer size exceed (buffer size %d, current size %d), %d tracks are not stored", maxBufferSize, mySize, nTracks - itr + 1 );
400 iResult = -ENOSPC;
401 break;
402 }
e1f2d1c3 403
be7c7c2b 404 // first convert to AliExternalTrackParam
405
406 AliExternalTrackParam tp, tpEnd;
407 AliHLTTPCCATrackConvertor::GetExtParam( track.InnerParam(), tp, track.InnerAlpha() );
408 AliHLTTPCCATrackConvertor::GetExtParam( track.OuterParam(), tpEnd, track.OuterAlpha() );
409
56ae3a7f 410 // normalize the angle to +-Pi
411
412 currOutTrack->fAlpha = tp.GetAlpha() - CAMath::Nint(tp.GetAlpha()/CAMath::TwoPi())*CAMath::TwoPi();
be7c7c2b 413 currOutTrack->fX = tp.GetX();
414 currOutTrack->fY = tp.GetY();
415 currOutTrack->fZ = tp.GetZ();
416 {
417 float sinA = TMath::Sin( track.OuterAlpha() - track.InnerAlpha());
418 float cosA = TMath::Cos( track.OuterAlpha() - track.InnerAlpha());
419 currOutTrack->fLastX = tpEnd.GetX()*cosA - tpEnd.GetY()*sinA;
420 currOutTrack->fLastY = tpEnd.GetX()*sinA + tpEnd.GetY()*cosA;
421 currOutTrack->fLastZ = tpEnd.GetZ();
422 }
423 currOutTrack->fq1Pt = tp.GetSigned1Pt();
424 currOutTrack->fSinPsi = tp.GetSnp();
425 currOutTrack->fTgl = tp.GetTgl();
426 for( int i=0; i<15; i++ ) currOutTrack->fC[i] = tp.GetCovariance()[i];
427 currOutTrack->fTrackID = itr;
428 currOutTrack->fFlags = 0;
429 currOutTrack->fNPoints = track.NClusters();
430 for ( int i = 0; i < track.NClusters(); i++ ) currOutTrack->fPointIDs[i] = mergerOutput->ClusterId( track.FirstClusterRef() + i );
431
432 currOutTrack = ( AliHLTExternalTrackParam* )( (( Byte_t * )currOutTrack) + dSize );
433 mySize += dSize;
434 outPtr->fCount++;
435 }
436
437
438 AliHLTComponentBlockData resultData;
439 FillBlockData( resultData );
440 resultData.fOffset = 0;
441 resultData.fSize = mySize;
442 resultData.fDataType = kAliHLTDataTypeTrack|kAliHLTDataOriginTPC;
443 resultData.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( 0, 35, 0, 5 );
444 outputBlocks.push_back( resultData );
445 size = resultData.fSize;
446 }
447
448 HLTInfo( "CAGlobalMerger:: output %d tracks", mergerOutput->NTracks() );
449
450
451 /* old format
e1f2d1c3 452 {
453 // check if there was enough space in the output buffer
454
fbb9b71b 455 int nTracks = mergerOutput->NTracks();
e1f2d1c3 456
457 AliHLTTPCTrackArray array( nTracks );
458
fbb9b71b 459 int nClusters = 0;
460 for ( int itr = 0; itr < nTracks; itr++ ) {
461
e1f2d1c3 462 // convert AliHLTTPCCAMergedTrack to AliHLTTPCTrack
463
464 const AliHLTTPCCAMergedTrack &track = mergerOutput->Track( itr );
91794c67 465
e1f2d1c3 466 AliHLTTPCTrack out;
467
c26cae51 468 // first convert to AliExternalTrackParam
e1f2d1c3 469
470 AliExternalTrackParam tp, tpEnd;
fbb9b71b 471 AliHLTTPCCATrackConvertor::GetExtParam( track.InnerParam(), tp, 0 );
472 AliHLTTPCCATrackConvertor::GetExtParam( track.OuterParam(), tpEnd, 0 );
e1f2d1c3 473
474 // set parameters, with rotation to global coordinates
fbb9b71b 475
476 out.SetCharge( ( int ) tp.GetSign() );
477 out.SetPt( TMath::Abs( tp.GetSignedPt() ) );
478 out.SetPsi( fmod( TMath::ASin( tp.GetSnp() ) + track.InnerAlpha() , 2*TMath::Pi() ) );
e1f2d1c3 479 out.SetTgl( tp.GetTgl() );
480 {
fbb9b71b 481 float sinA = TMath::Sin( track.InnerAlpha() );
482 float cosA = TMath::Cos( track.InnerAlpha() );
483
484 out.SetFirstPoint( tp.GetX()*cosA - tp.GetY()*sinA,
485 tp.GetX()*sinA + tp.GetY()*cosA,
486 tp.GetZ() );
e1f2d1c3 487 }
fbb9b71b 488
e1f2d1c3 489 {
fbb9b71b 490 float sinA = TMath::Sin( track.OuterAlpha() );
491 float cosA = TMath::Cos( track.OuterAlpha() );
492
493 out.SetLastPoint( tpEnd.GetX()*cosA - tpEnd.GetY()*sinA,
494 tpEnd.GetX()*sinA + tpEnd.GetY()*cosA,
495 tpEnd.GetZ() );
e1f2d1c3 496 }
497
498 // set parameter errors w/o rotation, as it is done in AliHLTTPCTrackArray
499
fbb9b71b 500 out.SetY0err( tp.GetSigmaY2() );
501 out.SetZ0err( tp.GetSigmaZ2() );
c26cae51 502 out.SetPterr( tp.GetSigma1Pt2() );
061d3f2d 503 out.SetPsierr( tp.GetSigmaSnp2() );
fbb9b71b 504 out.SetTglerr( tp.GetSigmaTgl2() );
505
e1f2d1c3 506 // set cluster ID's
507
fbb9b71b 508 unsigned int hitID[1000];
6de2bc40 509 for ( int i = 0; i < track.NClusters(); i++ ) hitID[i] = mergerOutput->ClusterId( track.FirstClusterRef() + i );
e1f2d1c3 510
511 out.SetNHits( track.NClusters() );
512 out.SetHits( track.NClusters(), hitID );
fbb9b71b 513
514 out.SetSector( -1 );
e1f2d1c3 515 out.CalculateHelix();
fbb9b71b 516 if ( !out.CheckConsistency() ) *( array.NextTrack() ) = out;
517 nClusters += track.NClusters();
e1f2d1c3 518 }
519
fbb9b71b 520
521 if ( sizeof( AliHLTTPCTrackletData ) + nTracks*sizeof( AliHLTTPCTrackSegmentData ) + nClusters*sizeof( unsigned int )
522 > maxBufferSize ) {
e1f2d1c3 523 iResult = -ENOSPC;
524 } else {
fbb9b71b 525 AliHLTTPCTrackletData *outPtr = ( AliHLTTPCTrackletData* )( outputPtr );
526 unsigned int nOutTracks = 0;
e1f2d1c3 527 mySize = array.WriteTracks( nOutTracks, outPtr->fTracklets );
fbb9b71b 528 mySize += sizeof( AliHLTTPCTrackletData );
e1f2d1c3 529 outPtr->fTrackletCnt = nOutTracks;
530 }
531 }
fbb9b71b 532
e1f2d1c3 533 AliHLTComponentBlockData resultData;
534 FillBlockData( resultData );
535 resultData.fOffset = 0;
536 resultData.fSize = mySize;
537 resultData.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( 0, 35, 0, 5 );
538 outputBlocks.push_back( resultData );
539 size = resultData.fSize;
e1f2d1c3 540
7be9b0d7 541 HLTInfo( "CAGlobalMerger:: output %d tracks", mergerOutput->NTracks() );
542 */
e1f2d1c3 543 return iResult;
544}
545