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 ///////////////////////////////////////////////////////////////////////////////
21 // a TPC sector tracker processing component for the HLT //
23 ///////////////////////////////////////////////////////////////////////////////
29 #include "AliHLTTPCSliceTrackerComponent.h"
30 #include "AliHLTTPCTransform.h"
31 #include "AliHLTTPCConfMapper.h"
32 #include "AliHLTTPCVertex.h"
33 #include "AliHLTTPCSpacePointData.h"
34 #include "AliHLTTPCVertexData.h"
35 #include "AliHLTTPCClusterDataFormat.h"
36 #include "AliHLTTPCTransform.h"
37 #include "AliHLTTPCTrackSegmentData.h"
38 #include "AliHLTTPCTrackArray.h"
39 #include "AliHLTTPCTrackletDataFormat.h"
40 //#include "AliHLTTPC.h"
44 // this is a global object used for automatic component registration, do not use this
45 AliHLTTPCSliceTrackerComponent gAliHLTTPCSliceTrackerComponent;
47 ClassImp(AliHLTTPCSliceTrackerComponent)
49 AliHLTTPCSliceTrackerComponent::AliHLTTPCSliceTrackerComponent()
59 // BEGINN ############################################## MODIFIY JMT
60 fnonvertextracking = kFALSE; // enable NONVERTEX Tracking
61 fmainvertextracking = kTRUE; // enable MAINVERTEX Tracking
62 // END ################################################# MODIFIY JMT
65 AliHLTTPCSliceTrackerComponent::~AliHLTTPCSliceTrackerComponent()
69 // Public functions to implement AliHLTComponent's interface.
70 // These functions are required for the registration process
72 const char* AliHLTTPCSliceTrackerComponent::GetComponentID()
74 return "TPCSliceTracker";
77 void AliHLTTPCSliceTrackerComponent::GetInputDataTypes( vector<AliHLTComponent_DataType>& list)
80 list.push_back( AliHLTTPCDefinitions::gkClustersDataType );
81 list.push_back( AliHLTTPCDefinitions::gkVertexDataType );
84 AliHLTComponent_DataType AliHLTTPCSliceTrackerComponent::GetOutputDataType()
86 return AliHLTTPCDefinitions::gkTrackSegmentsDataType;
89 void AliHLTTPCSliceTrackerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
91 // XXX TODO: Find more realistic values.
93 inputMultiplier = 0.2;
96 AliHLTComponent* AliHLTTPCSliceTrackerComponent::Spawn()
98 return new AliHLTTPCSliceTrackerComponent;
101 void AliHLTTPCSliceTrackerComponent::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
102 Int_t trackletlength, Int_t tracklength,
103 Int_t rowscopetracklet, Int_t rowscopetrack,
104 Double_t min_pt_fit, Double_t maxangle,
105 Double_t goodDist, Double_t hitChi2Cut,
106 Double_t goodHitChi2, Double_t trackChi2Cut,
107 Int_t maxdist, Double_t maxphi,Double_t maxeta, bool vertexConstraints )
109 //fTracker->SetClusterFinderParam( fXYClusterError, fZClusterError, kTRUE ); // ??
110 //Set parameters input to the tracker
111 //If no arguments are given, default parameters will be used
113 fTracker->SetNSegments(phi_segments,eta_segments);
114 fTracker->SetMaxDca(min_pt_fit);
115 // fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
117 // BEGINN ############################################## MODIFIY JMT
119 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::SetTrackerParam", "Tracking", "==============================" );
121 if ( fmainvertextracking == kTRUE && fnonvertextracking == kFALSE){
122 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,kTRUE);
123 fTracker->SetTrackletCuts(maxangle,goodDist,kTRUE);
125 fTracker->MainVertexSettings( trackletlength, tracklength, rowscopetracklet, rowscopetrack, maxphi, maxeta);
126 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::SetTrackerParam", "Tracking", "MAINVERTEXTRACKING" );
128 else if ( fmainvertextracking == kTRUE && fnonvertextracking == kTRUE){
129 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,kTRUE);
130 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,kFALSE);
131 fTracker->SetTrackletCuts(maxangle,goodDist,kTRUE);
132 fTracker->SetTrackletCuts(maxangle,goodDist,kFALSE);
134 fTracker->MainVertexSettings( trackletlength, tracklength, rowscopetracklet, rowscopetrack, maxphi, maxeta);
135 fTracker->NonVertexSettings( trackletlength, tracklength, rowscopetracklet, rowscopetrack);
136 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::SetTrackerParam", "Tracking", "MAINVERTEXTRACKING - NONVERTEXTRACKING" );
138 else if ( fmainvertextracking == kFALSE && fnonvertextracking == kTRUE){
139 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,kFALSE);
140 fTracker->SetTrackletCuts(maxangle,goodDist,kFALSE);
142 fTracker->NonVertexSettings( trackletlength, tracklength, rowscopetracklet, rowscopetrack);
143 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::SetTrackerParam", "Tracking", "NONVERTEXTRACKING" );
146 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,vertexConstraints);
147 fTracker->SetTrackletCuts(maxangle,goodDist,vertexConstraints);
149 if( vertexConstraints )
150 fTracker->MainVertexSettings( trackletlength, tracklength, rowscopetracklet, rowscopetrack, maxphi, maxeta);
152 fTracker->NonVertexSettings( trackletlength, tracklength, rowscopetracklet, rowscopetrack);
154 // END ################################################# MODIFIY JMT
156 //fTracker->SetParamDone(true);
157 /* Matthias 13.12.2006
158 * the global variable AliHLTTPCS::fgDoVertexFit has never been used so far
159 * and has always been kTRUE.
160 * In order to remove the AliHLTTPC class (which is the old steering class for
161 * HLT (TPC) tracking) from the compilation, this function can not be activated
162 * again. We have to think about a more elegant way to specify the parameters
163 * anyway. The following line was surely for some testing, but was never active
164 * in a tested release.
166 //AliHLTTPC::SetVertexFit( kFALSE );
168 fTracker->InitVolumes();
171 void AliHLTTPCSliceTrackerComponent::SetTrackerParam( bool doPP, int multiplicity, double bField )
173 AliHLTTPCTransform::SetBField( bField );
174 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoInit", "BField", "Setting b field to %f T\n", bField );
178 //tracker->SetClusterFinderParam(xyerror,zerror,kTRUE); // ??
179 SetTrackerParam( 50, 100, 3, 10,
182 5, 50, 50, 0.1, 0.1, kTRUE);
186 int mults[] = { 1000, 2000, 4000, 8000 };
190 int multDist, tmpMultDist;
191 if ( multiplicity>mults[closestMult] )
192 multDist = multiplicity-mults[closestMult];
194 multDist = mults[closestMult]-multiplicity;
195 for ( i = 1; i < multCount; i++ )
197 if ( multiplicity>mults[i] )
198 tmpMultDist = multiplicity-mults[i];
200 tmpMultDist = mults[i]-multiplicity;
201 if ( tmpMultDist < multDist )
204 multDist = tmpMultDist;
208 double bfs[] = { 0.2, 0.4 };
211 double bfDist, tmpBFDist;
212 if ( bField>bfs[closestBf] )
213 bfDist = bField-bfs[closestBf];
215 bfDist = bfs[closestBf]-bField;
216 for ( i = 1; i < bfCount; i++ )
219 tmpBFDist = bField-bfs[i];
221 tmpBFDist = bfs[i]-bField;
222 if ( tmpBFDist < bfDist )
229 switch ( closestMult )
235 SetTrackerParam( 50, 100, 3, 10,
238 5, 50, 50, 0.1, 0.1, kTRUE );
241 SetTrackerParam( 50, 100, 3, 10,
244 5, 50, 50, 0.1, 0.1, kTRUE );
252 SetTrackerParam( 50, 100, 3, 10,
255 5, 20, 50, 0.1, 0.1, kTRUE );
258 SetTrackerParam( 50, 100, 3, 10,
261 5, 20, 50, 0.1, 0.1, kTRUE );
269 SetTrackerParam( 50, 100, 3, 10,
272 5, 10 , 50, 0.1, 0.1, kTRUE );
275 SetTrackerParam( 50, 100, 3, 10,
278 5, 10, 50, 0.1, 0.1, kTRUE );
286 SetTrackerParam( 50, 100, 3, 10,
289 5, 5, 50, 0.1, 0.1, kTRUE );
292 SetTrackerParam( 50, 100, 3, 10,
295 5, 5, 50, 0.1, 0.1, kTRUE );
300 // Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoInit", "BField", "Setting b field to %f\n", bfs[closestBf] );
301 // AliHLTTPCTransform::SetBField( bfs[closestBf] );
302 // AliHLTTPCTransform::SetBField( bField );
303 // Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoInit", "BField", "Setting b field to %f\n", bField );
309 int AliHLTTPCSliceTrackerComponent::DoInit( int argc, const char** argv )
311 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoInit", "DoInit", "DoInit()" );
313 if ( fTracker || fVertex )
315 fTracker = new AliHLTTPCConfMapper();
316 fVertex = new AliHLTTPCVertex();
319 fDoNonVertex = false;
320 fMultiplicity = 4000;
328 if ( !strcmp( argv[i], "pp-run" ) )
334 if ( !strcmp( argv[i], "multiplicity" ) )
338 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoInit", "Missing multiplicity", "Missing event multiplicity specifier." );
341 fMultiplicity = strtoul( argv[i+1], &cpErr, 0 );
344 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoInit", "Missing multiplicity", "Cannot convert event multiplicity specifier '%s'.", argv[i+1] );
350 if ( !strcmp( argv[i], "bfield" ) )
354 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoInit", "Missing B-field", "Missing B-field specifier." );
357 fBField = strtod( argv[i+1], &cpErr );
360 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoInit", "Missing multiplicity", "Cannot convert B-field specifier '%s'.", argv[i+1] );
367 // BEGINN ############################################## MODIFIY JMT
368 if ( !strcmp( argv[i], "nonvertextracking" ) ){
369 fnonvertextracking = kTRUE;
374 if ( !strcmp( argv[i], "mainvertextrackingoff" ) ){
375 fmainvertextracking = kFALSE;
380 if ( !strcmp( argv[i], "etarange" ) ){
382 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoInit", "Missing Eta range", "Missing Eta-range specifiers." );
385 fEta[1] = strtod( argv[i+1], &cpErr );
387 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoInit", "Missing Eta range", "Cannot convert Eta-range specifier '%s'.", argv[i+1] );
394 // END ################################################# MODIFIY JMT
395 Logging(kHLTLogError, "HLT::TPCSliceTracker::DoInit", "Unknown Option", "Unknown option '%s'", argv[i] );
398 // #### -B0-CHANGE-START == JMT
400 // parameter for B=0 T
402 fnonvertextracking = kTRUE;
403 fmainvertextracking = kFALSE;
405 // #### -B0-CHANGE-END == JMT
407 SetTrackerParam( fDoPP, fMultiplicity, fBField );
411 int AliHLTTPCSliceTrackerComponent::DoDeinit()
422 int AliHLTTPCSliceTrackerComponent::DoEvent( const AliHLTComponent_EventData& evtData, const AliHLTComponent_BlockData* blocks,
423 AliHLTComponent_TriggerData& trigData, AliHLTUInt8_t* outputPtr,
424 AliHLTUInt32_t& size, vector<AliHLTComponent_BlockData>& outputBlocks )
426 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "DoEvent", "DoEvent()" );
427 if ( evtData.fBlockCnt<=0 )
429 Logging( kHLTLogWarning, "HLT::TPCSliceTracker::DoEvent", "DoEvent", "no blocks in event" );
432 const AliHLTComponent_BlockData* iter = NULL;
434 AliHLTTPCClusterData* inPtrSP;
435 AliHLTTPCVertexData* inPtrV = NULL;
436 const AliHLTComponent_BlockData* vertexIter=NULL;
437 AliHLTTPCTrackletData* outPtr;
438 AliHLTUInt8_t* outBPtr;
439 AliHLTUInt32_t vSize = 0;
440 UInt_t offset=0, mysize, tSize = 0;
442 Int_t slice=-1, patch=-1, row[2];
443 Int_t minPatch=INT_MAX, maxPatch = 0;
445 std::vector<Int_t> slices;
446 std::vector<Int_t>::iterator slIter, slEnd;
447 std::vector<unsigned> sliceCnts;
448 std::vector<unsigned>::iterator slCntIter;
449 Int_t vertexSlice=-1;
451 // Find min/max rows used in total and find and read out vertex if it is present
452 // also determine correct slice number, if multiple slice numbers are present in event
453 // (which should not happen in the first place) we use the one that occurs the most times
457 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
461 slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter );
463 slIter = slices.begin();
464 slEnd = slices.end();
465 slCntIter = sliceCnts.begin();
466 while ( slIter != slEnd )
468 if ( *slIter == slice )
478 slices.insert( slices.end(), slice );
479 sliceCnts.insert( sliceCnts.end(), 1 );
484 if ( iter->fDataType == AliHLTTPCDefinitions::gkVertexDataType )
486 inPtrV = (AliHLTTPCVertexData*)(iter->fPtr);
489 fVertex->Read( inPtrV );
492 if ( iter->fDataType == AliHLTTPCDefinitions::gkClustersDataType )
494 patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
495 if ( minPatch>patch )
498 row[0] = AliHLTTPCTransform::GetFirstRow( patch );
500 if ( maxPatch<patch )
503 row[1] = AliHLTTPCTransform::GetLastRow( patch );
508 // Determine slice number to really use.
509 if ( slices.size()>1 )
511 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
512 "Multiple slice numbers found in event 0x%08lX (%lu). Determining maximum occuring slice number...",
513 evtData.fEventID, evtData.fEventID );
514 unsigned maxCntSlice=0;
515 slIter = slices.begin();
516 slEnd = slices.end();
517 slCntIter = sliceCnts.begin();
518 while ( slIter != slEnd )
520 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
521 "Slice %lu found %lu times.", *slIter, *slCntIter );
522 if ( maxCntSlice<*slCntIter )
524 maxCntSlice = *slCntIter;
530 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
531 "Using slice %lu.", slice );
533 else if ( slices.size()>0 )
535 slice = *(slices.begin());
542 if ( vertexSlice != slice )
544 // multiple vertex blocks in event and we used the wrong one...
546 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
549 if ( iter->fDataType == AliHLTTPCDefinitions::gkVertexDataType && slice==AliHLTTPCDefinitions::GetMinSliceNr( *iter ) )
551 inPtrV = (AliHLTTPCVertexData*)(iter->fPtr);
554 fVertex->Read( inPtrV );
560 fTracker->InitSector( slice, row, fEta );
561 fTracker->SetVertex(fVertex);
564 std::vector<unsigned long> patchIndices;
565 std::vector<unsigned long>::iterator pIter, pEnd;
566 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
570 if ( iter->fDataType == AliHLTTPCDefinitions::gkClustersDataType && slice==AliHLTTPCDefinitions::GetMinSliceNr( *iter ) )
572 patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
573 pIter = patchIndices.begin();
574 pEnd = patchIndices.end();
575 while ( pIter!=pEnd && AliHLTTPCDefinitions::GetMinSliceNr( blocks[*pIter] ) < patch )
577 patchIndices.insert( pIter, ndx );
580 pIter = patchIndices.begin();
581 pEnd = patchIndices.end();
582 while ( pIter!=pEnd )
587 patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
588 inPtrSP = (AliHLTTPCClusterData*)(iter->fPtr);
590 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Reading hits",
591 "Reading hits for slice %d - patch %d", slice, patch );
592 fTracker->ReadHits( inPtrSP->fSpacePointCnt, inPtrSP->fSpacePoints );
596 outPtr = (AliHLTTPCTrackletData*)(outBPtr);
597 // BEGINN ############################################## MODIFIY JMT
599 fTracker->SetPointers();
600 if ( fmainvertextracking == kTRUE && fnonvertextracking == kFALSE){
601 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Tracking", " ---MAINVERTEXTRACKING---");
602 fTracker->MainVertexTracking_a();
603 fTracker->MainVertexTracking_b();
604 fTracker->FillTracks();
606 else if ( fmainvertextracking == kTRUE && fnonvertextracking == kTRUE){
607 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Tracking", " ---MAINVERTEXTRACKING---");
608 fTracker->MainVertexTracking_a();
609 fTracker->MainVertexTracking_b();
610 fTracker->FillTracks();
611 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Tracking", " ---NONVERTEXTRACKING---");
612 fTracker->NonVertexTracking();
614 else if ( fmainvertextracking == kFALSE && fnonvertextracking == kTRUE){
615 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Tracking", " ---NONVERTEXTRACKING---");
616 fTracker->NonVertexTracking();
617 fTracker->FillTracks();
620 fTracker->MainVertexTracking_a();
621 fTracker->MainVertexTracking_b();
622 fTracker->FillTracks();
625 fTracker->NonVertexTracking();//Do a second pass for nonvertex tracks
627 // END ################################################# MODIFIY JMT
628 // XXX Do track merging??
631 mysize = fTracker->GetTracks()->WriteTracks( ntracks0, outPtr->fTracklets );
632 outPtr->fTrackletCnt = ntracks0;
634 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Tracks",
635 "Input: Number of tracks: %lu Slice/MinPatch/MaxPatch/RowMin/RowMax: %lu/%lu/%lu/%lu/%lu.",
636 ntracks0, slice, minPatch, maxPatch, row[0], row[1] );
638 tSize += mysize+sizeof(AliHLTTPCTrackletData);
639 outBPtr += mysize+sizeof(AliHLTTPCTrackletData);
641 AliHLTComponent_BlockData bd;
645 bd.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( slice, slice, minPatch, maxPatch );
646 outputBlocks.push_back( bd );
648 #ifdef FORWARD_VERTEX_BLOCK
651 // Copy the descriptor block for the vertex information.
653 outputBlocks.push_back( bd );
655 #endif // FORWARD_VERTEX_BLOCK