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 AliHLTTPCSliceTrackerComponent.cxx
21 @author Timm Steinbeck, Matthias Richter
23 @brief The TPC conformal mapping tracker component.
31 #include "AliHLTTPCSliceTrackerComponent.h"
32 #include "AliHLTTPCTransform.h"
33 #include "AliHLTTPCConfMapper.h"
34 #include "AliHLTTPCVertex.h"
35 #include "AliHLTTPCVertexData.h"
36 #include "AliHLTTPCClusterDataFormat.h"
37 #include "AliHLTTPCTransform.h"
38 #include "AliHLTTPCTrackSegmentData.h"
39 #include "AliHLTTPCTrackArray.h"
40 #include "AliHLTTPCTrackletDataFormat.h"
41 #include "AliHLTTPCInterMerger.h"
42 #include "AliHLTTPCMemHandler.h"
43 #include "AliHLTTPCDefinitions.h"
44 #include "AliHLTCommonCDBEntries.h"
46 #include "TObjString.h"
47 #include "TObjArray.h"
48 #include "AliCDBEntry.h"
49 #include "AliCDBManager.h"
50 //#include "AliHLTTPC.h"
54 /** ROOT macro for the implementation of ROOT specific class methods */
55 ClassImp(AliHLTTPCSliceTrackerComponent)
57 AliHLTTPCSliceTrackerComponent::AliHLTTPCSliceTrackerComponent()
66 fnonvertextracking(kFALSE),
67 fmainvertextracking(kTRUE),
85 // see header file for class documentation
87 // refer to README to build package
89 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
94 AliHLTTPCSliceTrackerComponent::~AliHLTTPCSliceTrackerComponent()
96 // see header file for class documentation
99 // Public functions to implement AliHLTComponent's interface.
100 // These functions are required for the registration process
102 const char* AliHLTTPCSliceTrackerComponent::GetComponentID()
104 // see header file for class documentation
106 return "TPCSliceTracker";
109 void AliHLTTPCSliceTrackerComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list)
111 // see header file for class documentation
113 list.push_back( AliHLTTPCDefinitions::fgkClustersDataType );
114 list.push_back( AliHLTTPCDefinitions::fgkVertexDataType );
117 AliHLTComponentDataType AliHLTTPCSliceTrackerComponent::GetOutputDataType()
119 // see header file for class documentation
120 return AliHLTTPCDefinitions::fgkTrackSegmentsDataType;
123 void AliHLTTPCSliceTrackerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
125 // see header file for class documentation
126 // XXX TODO: Find more realistic values.
131 AliHLTComponent* AliHLTTPCSliceTrackerComponent::Spawn()
133 // see header file for class documentation
134 return new AliHLTTPCSliceTrackerComponent;
137 void AliHLTTPCSliceTrackerComponent::SetTrackerParam(Int_t phiSegments, Int_t etaSegments,
138 Int_t trackletlength, Int_t tracklength,
139 Int_t rowscopetracklet, Int_t rowscopetrack,
140 Double_t minPtFit, Double_t maxangle,
141 Double_t goodDist, Double_t hitChi2Cut,
142 Double_t goodHitChi2, Double_t trackChi2Cut,
143 Int_t maxdist, Double_t maxphi,Double_t maxeta)
145 // see header file for class documentation
146 //fTracker->SetClusterFinderParam( fXYClusterError, fZClusterError, kTRUE ); // ??
147 //Set parameters input to the tracker
148 //If no arguments are given, default parameters will be used
150 fTracker->SetNSegments(phiSegments,etaSegments);
151 fTracker->SetMaxDca(minPtFit);
152 // fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
154 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::SetTrackerParam", "Tracking", "==============================" );
156 if ( fmainvertextracking == kTRUE && fnonvertextracking == kFALSE){
157 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,kTRUE);
158 fTracker->SetTrackletCuts(maxangle,goodDist,kTRUE);
160 fTracker->MainVertexSettings( trackletlength, tracklength, rowscopetracklet, rowscopetrack, maxphi, maxeta);
161 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::SetTrackerParam", "Tracking", "MAINVERTEXTRACKING" );
163 else if ( fmainvertextracking == kTRUE && fnonvertextracking == kTRUE){
164 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,kTRUE);
165 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,kFALSE);
166 fTracker->SetTrackletCuts(maxangle,goodDist,kTRUE);
167 fTracker->SetTrackletCuts(maxangle,goodDist,kFALSE);
169 fTracker->MainVertexSettings( trackletlength, tracklength, rowscopetracklet, rowscopetrack, maxphi, maxeta);
170 fTracker->NonVertexSettings( trackletlength, tracklength, rowscopetracklet, rowscopetrack);
171 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::SetTrackerParam", "Tracking", "MAINVERTEXTRACKING - NONVERTEXTRACKING" );
173 else if ( fmainvertextracking == kFALSE && fnonvertextracking == kTRUE){
174 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,kFALSE);
175 fTracker->SetTrackletCuts(maxangle,goodDist,kFALSE);
177 fTracker->NonVertexSettings( trackletlength, tracklength, rowscopetracklet, rowscopetrack);
178 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::SetTrackerParam", "Tracking", "NONVERTEXTRACKING" );
181 //fTracker->SetParamDone(true);
182 /* Matthias 13.12.2006
183 * the global variable AliHLTTPCS::fgDoVertexFit has never been used so far
184 * and has always been kTRUE.
185 * In order to remove the AliHLTTPC class (which is the old steering class for
186 * HLT (TPC) tracking) from the compilation, this function can not be activated
187 * again. We have to think about a more elegant way to specify the parameters
188 * anyway. The following line was surely for some testing, but was never active
189 * in a tested release.
191 //AliHLTTPC::SetVertexFit( kFALSE );
193 fTracker->InitVolumes();
197 void AliHLTTPCSliceTrackerComponent::SetTrackerParam( Bool_t doPP, Bool_t doPbPb, Int_t multiplicity,
198 Double_t bField, Int_t etasegment, Double_t hitchi2cut,
199 Int_t rowscopetracklet, Int_t rowscopetrack,
200 Int_t trackletlength, Int_t tracklength )
202 // see header file for class documentation
203 AliHLTTPCTransform::SetBField( bField );
204 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoInit", "BField", "Setting b field to %f T\n", bField );
208 //tracker->SetClusterFinderParam(xyerror,zerror,kTRUE); // ??
210 SetTrackerParam( 50, 100, 3, 60,
213 5, 50, 50, 0.1, 0.1);
217 int mults[] = { 1000, 2000, 4000, 8000 };
221 int multDist, tmpMultDist;
222 if ( multiplicity>mults[closestMult] )
223 multDist = multiplicity-mults[closestMult];
225 multDist = mults[closestMult]-multiplicity;
226 for ( i = 1; i < multCount; i++ )
228 if ( multiplicity>mults[i] )
229 tmpMultDist = multiplicity-mults[i];
231 tmpMultDist = mults[i]-multiplicity;
232 if ( tmpMultDist < multDist )
235 multDist = tmpMultDist;
239 double bfs[] = { 0.2, 0.4 };
242 double bfDist, tmpBFDist;
243 if ( bField>bfs[closestBf] )
244 bfDist = bField-bfs[closestBf];
246 bfDist = bfs[closestBf]-bField;
247 for ( i = 1; i < bfCount; i++ )
250 tmpBFDist = bField-bfs[i];
252 tmpBFDist = bfs[i]-bField;
253 if ( tmpBFDist < bfDist )
260 switch ( closestMult )
266 SetTrackerParam( 50, 100, 3, 10,
269 5, 50, 50, 0.1, 0.1);
272 SetTrackerParam( 50, 100, 3, 10,
275 5, 50, 50, 0.1, 0.1);
283 SetTrackerParam( 50, 100, 3, 10,
286 5, 20, 50, 0.1, 0.1);
289 SetTrackerParam( 50, 100, 3, 10,
292 5, 20, 50, 0.1, 0.1);
300 SetTrackerParam( 50, 100, 3, 10,
303 5, 10 , 50, 0.1, 0.1);
306 SetTrackerParam( 50, 100, 3, 10,
309 5, 10, 50, 0.1, 0.1);
317 SetTrackerParam( 50, 100, 3, 10,
323 SetTrackerParam( 50, 100, 3, 10,
331 // Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoInit", "BField", "Setting b field to %f\n", bfs[closestBf] );
332 // AliHLTTPCTransform::SetBField( bfs[closestBf] );
333 // AliHLTTPCTransform::SetBField( bField );
334 // Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoInit", "BField", "Setting b field to %f\n", bField );
338 SetTrackerParam( 50, etasegment, trackletlength, tracklength,
339 rowscopetracklet, rowscopetrack,
340 0, 0.1745, 5, hitchi2cut,
341 5, 50, 50, 0.1, 0.1);
345 int AliHLTTPCSliceTrackerComponent::DoInit( int argc, const char** argv )
347 // see header file for class documentation
348 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoInit", "DoInit", "DoInit()" );
350 if ( fTracker || fVertex )
352 fTracker = new AliHLTTPCConfMapper();
353 fVertex = new AliHLTTPCVertex();
356 fDoNonVertex = false;
357 fMultiplicity = 4000;
378 TString configuration="";
380 for (int i=0; i<argc && iResult>=0; i++) {
382 if (!configuration.IsNull()) configuration+=" ";
383 configuration+=argument;
386 if (!configuration.IsNull()) {
387 iResult=Configure(configuration.Data());
389 iResult=Reconfigure(NULL, NULL);
395 int AliHLTTPCSliceTrackerComponent::DoDeinit()
397 // see header file for class documentation
405 delete fpInterMerger;
411 int AliHLTTPCSliceTrackerComponent::DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
412 AliHLTComponentTriggerData& /*trigData*/, AliHLTUInt8_t* outputPtr,
413 AliHLTUInt32_t& size, AliHLTComponentBlockDataList& outputBlocks )
415 // see header file for class documentation
417 AliHLTUInt32_t capacity=size;
420 if ( evtData.fBlockCnt<=0 )
422 Logging( kHLTLogWarning, "HLT::TPCSliceTracker::DoEvent", "DoEvent", "no blocks in event" );
425 const AliHLTComponentBlockData* iter = NULL;
427 AliHLTTPCClusterData* inPtrSP;
428 AliHLTTPCVertexData* inPtrV = NULL;
429 const AliHLTComponentBlockData* vertexIter=NULL;
430 AliHLTTPCTrackletData* outPtr;
431 AliHLTUInt8_t* outBPtr;
432 AliHLTUInt32_t vSize = 0;
433 UInt_t offset=0, mysize, tSize = 0;
435 Int_t slice=-1, patch=-1, row[2];
436 Int_t minPatch=INT_MAX, maxPatch = 0;
438 std::vector<Int_t> slices;
439 std::vector<Int_t>::iterator slIter, slEnd;
440 std::vector<unsigned> sliceCnts;
441 std::vector<unsigned>::iterator slCntIter;
442 Int_t vertexSlice=-1;
444 // Find min/max rows used in total and find and read out vertex if it is present
445 // also determine correct slice number, if multiple slice numbers are present in event
446 // (which should not happen in the first place) we use the one that occurs the most times
450 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
454 bool bIsClusterDataBlock=false;
455 bool bIsVertexDataBlock=false;
456 if(!(bIsClusterDataBlock=(iter->fDataType==AliHLTTPCDefinitions::fgkClustersDataType)) &&
457 !(bIsVertexDataBlock=(iter->fDataType==AliHLTTPCDefinitions::fgkVertexDataType))){
461 slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter );
462 if (slice<0 || slice>=AliHLTTPCTransform::GetNSlice()) {
463 HLTError("invalid slice number %d extracted from specification 0x%08lx, skipping block of type %s",
464 slice, iter->fSpecification, DataType2Text(iter->fDataType).c_str());
465 // just remember the error, if there are other valid blocks ignore the
466 // error, return code otherwise
470 if (slice!=AliHLTTPCDefinitions::GetMaxSliceNr( *iter )) {
471 // the code was not written for/ never used with multiple slices
472 // in one data block/ specification
473 HLTWarning("specification 0x%08lx indicates multiple slices in data block %s: never used before, please audit the code",
474 iter->fSpecification, DataType2Text(iter->fDataType).c_str());
477 slIter = slices.begin();
478 slEnd = slices.end();
479 slCntIter = sliceCnts.begin();
480 while ( slIter != slEnd )
482 if ( *slIter == slice )
492 slices.insert( slices.end(), slice );
493 sliceCnts.insert( sliceCnts.end(), 1 );
498 if (bIsVertexDataBlock)
500 inPtrV = (AliHLTTPCVertexData*)(iter->fPtr);
503 fVertex->Read( inPtrV );
506 if (bIsClusterDataBlock)
508 patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
509 if ( minPatch>patch )
512 row[0] = AliHLTTPCTransform::GetFirstRow( patch );
514 if ( maxPatch<patch )
517 row[1] = AliHLTTPCTransform::GetLastRow( patch );
522 // Determine slice number to really use.
523 if ( slices.size()>1 )
525 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
526 "Multiple slice numbers found in event 0x%08lX (%lu). Determining maximum occuring slice number...",
527 evtData.fEventID, evtData.fEventID );
528 unsigned maxCntSlice=0;
529 slIter = slices.begin();
530 slEnd = slices.end();
531 slCntIter = sliceCnts.begin();
532 while ( slIter != slEnd )
534 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
535 "Slice %lu found %lu times.", *slIter, *slCntIter );
536 if ( maxCntSlice<*slCntIter )
538 maxCntSlice = *slCntIter;
544 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
545 "Using slice %lu.", slice );
547 else if ( slices.size()>0 )
549 slice = *(slices.begin());
553 // there is no sense in running the tracker without input, do not send an
554 // empty output block
560 if ( vertexSlice != slice )
562 // multiple vertex blocks in event and we used the wrong one...
564 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
567 if ( iter->fDataType == AliHLTTPCDefinitions::fgkVertexDataType && slice==AliHLTTPCDefinitions::GetMinSliceNr( *iter ) )
569 inPtrV = (AliHLTTPCVertexData*)(iter->fPtr);
572 fVertex->Read( inPtrV );
578 fTracker->InitSector( slice, row, fEta );
579 fTracker->SetVertex(fVertex);
582 std::vector<unsigned long> patchIndices;
583 std::vector<unsigned long>::iterator pIter, pEnd;
584 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
588 if ( iter->fDataType == AliHLTTPCDefinitions::fgkClustersDataType && slice==AliHLTTPCDefinitions::GetMinSliceNr( *iter ) )
590 patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
591 pIter = patchIndices.begin();
592 pEnd = patchIndices.end();
593 while ( pIter!=pEnd && AliHLTTPCDefinitions::GetMinSliceNr( blocks[*pIter] ) < patch )
595 patchIndices.insert( pIter, ndx );
598 pIter = patchIndices.begin();
599 pEnd = patchIndices.end();
600 while ( pIter!=pEnd )
605 patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
606 inPtrSP = (AliHLTTPCClusterData*)(iter->fPtr);
608 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Reading hits",
609 "Reading hits for slice %d - patch %d", slice, patch );
610 fTracker->ReadHits( inPtrSP->fSpacePointCnt, inPtrSP->fSpacePoints );
615 if ( fmainvertextracking == kTRUE && fnonvertextracking == kFALSE){
616 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Tracking", " ---MAINVERTEXTRACKING---");
617 fTracker->MainVertexTrackingA();
618 fTracker->MainVertexTrackingB();
619 fTracker->FillTracks();
621 else if ( fmainvertextracking == kTRUE && fnonvertextracking == kTRUE){
622 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Tracking", " ---MAINVERTEXTRACKING---");
623 fTracker->MainVertexTrackingA();
624 fTracker->MainVertexTrackingB();
625 fTracker->FillTracks();
626 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Tracking", " ---NONVERTEXTRACKING---");
627 fTracker->NonVertexTracking();
629 else if ( fmainvertextracking == kFALSE && fnonvertextracking == kTRUE){
630 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Tracking", " ---NONVERTEXTRACKING---");
631 fTracker->NonVertexTracking();
632 fTracker->FillTracks();
637 AliHLTTPCMemHandler memory;
638 AliHLTTPCTrackSegmentData *trackdata0 =
639 (AliHLTTPCTrackSegmentData *) memory.Allocate(fTracker->GetTracks());
640 memory.TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
641 fpInterMerger->Reset();
642 fpInterMerger->Init(row,patch);
643 fpInterMerger->FillTracks(ntracks0,trackdata0);
644 fpInterMerger->Merge();
647 AliHLTTPCTrackArray* pArray=fTracker->GetTracks();
648 if (pArray->GetOutSize()+sizeof(AliHLTTPCTrackletData)<=capacity) {
649 outPtr = (AliHLTTPCTrackletData*)(outBPtr);
650 mysize = pArray->WriteTracks( ntracks0, outPtr->fTracklets );
651 outPtr->fTrackletCnt = ntracks0;
653 Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Tracks",
654 "Input: Number of tracks: %lu Slice/MinPatch/MaxPatch/RowMin/RowMax: %lu/%lu/%lu/%lu/%lu.",
655 ntracks0, slice, minPatch, maxPatch, row[0], row[1] );
659 AliHLTComponentBlockData bd;
662 bd.fSize = mysize+sizeof(AliHLTTPCTrackletData);
663 bd.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( slice, slice, minPatch, maxPatch );
664 outputBlocks.push_back( bd );
672 #ifdef FORWARD_VERTEX_BLOCK
675 // Copy the descriptor block for the vertex information.
677 outputBlocks.push_back( bd );
679 #endif // FORWARD_VERTEX_BLOCK
685 int AliHLTTPCSliceTrackerComponent::Configure(const char* arguments)
687 // see header file for class documentation
689 if (!arguments) return iResult;
691 TString allArgs=arguments;
694 Bool_t bDoMerger=kTRUE;
696 TObjArray* pTokens=allArgs.Tokenize(" ");
698 for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
699 argument=((TObjString*)pTokens->At(i))->GetString();
700 if (argument.IsNull()) continue;
702 if (argument.CompareTo("-disable-merger")==0) {
703 HLTInfo("Disabled Inter Merger");
707 else if (argument.CompareTo("-pp-run")==0) {
708 HLTInfo("Using Trackparameters for pp-run");
712 else if (argument.CompareTo("-PbPb-run")==0) {
713 HLTInfo("Using Trackparameters for Pb-Pb-run");
717 else if (argument.CompareTo("-nonvertextracking")==0) {
718 HLTInfo("Doing Nonvertex Tracking");
719 fnonvertextracking = kTRUE;
722 else if (argument.CompareTo("-mainvertextrackingoff")==0) {
723 HLTInfo("Mainvertex Tracking off");
724 fmainvertextracking = kFALSE;
727 else if (argument.CompareTo("-multiplicity")==0) {
728 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
729 HLTInfo("Multiplicity set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
730 fMultiplicity=((TObjString*)pTokens->At(i))->GetString().Atoi();
733 else if (argument.CompareTo("-bfield")==0) {
734 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
735 HLTInfo("Magnetic Field set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
736 fBField=((TObjString*)pTokens->At(i))->GetString().Atof();
739 else if (argument.CompareTo("-etarange")==0) {
740 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
741 HLTInfo("Etarange set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
742 fEta[1]=((TObjString*)pTokens->At(i))->GetString().Atof();
745 else if (argument.CompareTo("-etasegment")==0) {
746 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
747 HLTInfo("Number of Etasegment: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
748 fEtasegment=((TObjString*)pTokens->At(i))->GetString().Atoi();
751 else if (argument.CompareTo("-chi2cut")==0) {
752 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
753 HLTInfo("chi2cut set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
754 fHitChi2Cut=((TObjString*)pTokens->At(i))->GetString().Atof();
757 else if (argument.CompareTo("-rowscopetracklet")==0) {
758 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
759 HLTInfo("Number of row to look for next cluster for tracklet: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
760 fRowscopetracklet=((TObjString*)pTokens->At(i))->GetString().Atoi();
763 else if (argument.CompareTo("-rowscopetrack")==0) {
764 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
765 HLTInfo("Number of row to look for next cluster for track: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
766 fRowscopetrack=((TObjString*)pTokens->At(i))->GetString().Atoi();
769 else if (argument.CompareTo("-trackletlength")==0) {
770 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
771 HLTInfo("Minimum number of clusters on a Tracklet: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
772 fTrackletlength=((TObjString*)pTokens->At(i))->GetString().Atoi();
775 else if (argument.CompareTo("-tracklength")==0) {
776 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
777 HLTInfo("Minimum number of clusters on a Track: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
778 fTracklength=((TObjString*)pTokens->At(i))->GetString().Atoi();
781 else if (argument.CompareTo("-clusterZ")==0) {
782 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
783 HLTInfo("Minimum number of clusters on a Track: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
784 fTracker->SetClusterCutZ(((TObjString*)pTokens->At(i))->GetString().Atoi());
788 HLTError("unknown argument %s", argument.Data());
796 HLTError("missing parameter for argument %s", argument.Data());
800 // parameter for B=0 T
802 fnonvertextracking = kTRUE;
803 fmainvertextracking = kFALSE;
807 fpInterMerger = new AliHLTTPCInterMerger();
809 fpInterMerger = NULL;
811 SetTrackerParam(fDoPP,fDoPbPb,fMultiplicity,fBField,fEtasegment,fHitChi2Cut,fRowscopetracklet,fRowscopetrack,fTrackletlength,fTracklength);
816 int AliHLTTPCSliceTrackerComponent::Reconfigure(const char* cdbEntry, const char* chainId)
818 // see header file for class documentation
820 const char* path="HLT/ConfigTPC/SliceTrackerComponent";
821 const char* defaultNotify="";
824 defaultNotify=" (default)";
827 HLTInfo("reconfigure from entry %s%s, chain id %s", path, defaultNotify,(chainId!=NULL && chainId[0]!=0)?chainId:"<none>");
828 AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(path/*,GetRunNo()*/);
830 TObjString* pString=dynamic_cast<TObjString*>(pEntry->GetObject());
832 HLTInfo("received configuration object string: \'%s\'", pString->GetString().Data());
833 iResult=Configure(pString->GetString().Data());
835 HLTError("configuration object \"%s\" has wrong type, required TObjString", path);
838 HLTError("can not fetch object \"%s\" from CDB", path);
842 const char* pathBField=kAliHLTCDBSolenoidBz;
845 HLTInfo("reconfigure B-Field from entry %s, chain id %s", path,(chainId!=NULL && chainId[0]!=0)?chainId:"<none>");
846 AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(pathBField/*,GetRunNo()*/);
848 TObjString* pString=dynamic_cast<TObjString*>(pEntry->GetObject());
850 HLTInfo("received configuration object string: \'%s\'", pString->GetString().Data());
851 iResult=Configure(pString->GetString().Data());
853 HLTError("configuration object \"%s\" has wrong type, required TObjString", path);
856 HLTError("can not fetch object \"%s\" from CDB", path);
863 void AliHLTTPCSliceTrackerComponent::SetTrackerParam1()
865 // see header file for class documentation
866 SetTrackerParam( 10, 20, 5, 10, 2,2,
868 50, 100, 50, 0.1, 0.1);