2 // **************************************************************************
3 // This file is property of and copyright by the ALICE HLT Project *
4 // ALICE Experiment at CERN, All rights reserved. *
6 // Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
7 // Ivan Kisel <kisel@kip.uni-heidelberg.de> *
8 // for The ALICE HLT 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. *
18 //***************************************************************************
21 ///////////////////////////////////////////////////////////////////////////////
23 // a TPC tracker processing component for the HLT based on CA by Ivan Kisel //
25 ///////////////////////////////////////////////////////////////////////////////
31 #include "AliHLTTPCCATrackerComponent.h"
32 #include "AliHLTTPCTransform.h"
33 #include "AliHLTTPCCATracker.h"
34 #include "AliHLTTPCCAOutTrack.h"
35 #include "AliHLTTPCCAParam.h"
36 #include "AliHLTTPCCATrackConvertor.h"
38 #include "AliHLTTPCSpacePointData.h"
39 #include "AliHLTTPCClusterDataFormat.h"
40 #include "AliHLTTPCTransform.h"
41 #include "AliHLTTPCTrackSegmentData.h"
42 #include "AliHLTTPCTrackArray.h"
43 #include "AliHLTTPCTrackletDataFormat.h"
44 #include "AliHLTTPCDefinitions.h"
45 #include "AliExternalTrackParam.h"
46 #include "TStopwatch.h"
48 #include "AliCDBEntry.h"
49 #include "AliCDBManager.h"
50 #include "TObjString.h"
51 #include "TObjArray.h"
52 #include "AliHLTTPCCASliceOutput.h"
54 const AliHLTComponentDataType AliHLTTPCCADefinitions::fgkTrackletsDataType = AliHLTComponentDataTypeInitializer( "CATRACKL", kAliHLTDataOriginTPC );
56 /** ROOT macro for the implementation of ROOT specific class methods */
57 ClassImp( AliHLTTPCCATrackerComponent )
59 /** global object for registration
60 * Matthias 2009-01-13 temporarily using the global object approach again.
61 * CA cade had to be disabled because of various compilation problems, so
62 * the global object approach fits better for the moment.
65 AliHLTTPCCATrackerComponent gAliHLTTPCCATrackerComponent;
67 AliHLTTPCCATrackerComponent::AliHLTTPCCATrackerComponent()
71 fMinNTrackClusters( 0 ),
78 // see header file for class documentation
80 // refer to README to build package
82 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
85 AliHLTTPCCATrackerComponent::AliHLTTPCCATrackerComponent( const AliHLTTPCCATrackerComponent& )
90 fMinNTrackClusters( 30 ),
97 // see header file for class documentation
98 HLTFatal( "copy constructor untested" );
101 AliHLTTPCCATrackerComponent& AliHLTTPCCATrackerComponent::operator=( const AliHLTTPCCATrackerComponent& )
103 // see header file for class documentation
104 HLTFatal( "assignment operator untested" );
108 AliHLTTPCCATrackerComponent::~AliHLTTPCCATrackerComponent()
110 // see header file for class documentation
115 // Public functions to implement AliHLTComponent's interface.
116 // These functions are required for the registration process
119 const char* AliHLTTPCCATrackerComponent::GetComponentID()
121 // see header file for class documentation
122 return "TPCCATracker";
125 void AliHLTTPCCATrackerComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list )
127 // see header file for class documentation
129 list.push_back( AliHLTTPCDefinitions::fgkClustersDataType );
132 AliHLTComponentDataType AliHLTTPCCATrackerComponent::GetOutputDataType()
134 // see header file for class documentation
135 if ( fNewOutputType ) return AliHLTTPCCADefinitions::fgkTrackletsDataType;
136 else return AliHLTTPCDefinitions::fgkTrackSegmentsDataType;
139 void AliHLTTPCCATrackerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
141 // define guess for the output data size
142 constBase = 200; // minimum size
143 inputMultiplier = 0.5; // size relative to input
146 AliHLTComponent* AliHLTTPCCATrackerComponent::Spawn()
148 // see header file for class documentation
149 return new AliHLTTPCCATrackerComponent;
152 int AliHLTTPCCATrackerComponent::DoInit( int argc, const char** argv )
154 // Configure the CA tracker component
156 const double kCLight = 0.000299792458;
157 fSolenoidBz = 5.*kCLight;
158 fMinNTrackClusters = 0;
165 if ( fTracker ) return EINPROGRESS;
166 fTracker = new AliHLTTPCCATracker();
170 TString arguments = "";
171 for ( int i = 0; i < argc; i++ ) {
172 TString argument = argv[i];
173 if ( !arguments.IsNull() ) arguments += " ";
174 arguments += argument;
176 if ( !arguments.IsNull() ) {
177 iResult = Configure( arguments.Data() );
179 iResult = Reconfigure( NULL, NULL );
185 int AliHLTTPCCATrackerComponent::DoDeinit()
187 // see header file for class documentation
188 if ( fTracker ) delete fTracker;
193 int AliHLTTPCCATrackerComponent::Reconfigure( const char* /*cdbEntry*/, const char* /*chainId*/ )
195 // see header file for class documentation
197 HLTWarning( "TODO: dummy Reconfigure() method" );
204 const char* path="HLT/ConfigTPC/CATrackerComponent";
205 const char* defaultNotify="";
208 defaultNotify=" (default)";
211 HLTInfo("reconfigure from entry %s%s, chain id %s", path, defaultNotify,(chainId!=NULL && chainId[0]!=0)?chainId:"<none>");
212 AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(path);//,GetRunNo());
214 TObjString* pString=dynamic_cast<TObjString*>(pEntry->GetObject());
216 HLTInfo("received configuration object string: \'%s\'", pString->GetString().Data());
217 iResult=Configure(pString->GetString().Data());
219 HLTError("configuration object \"%s\" has wrong type, required TObjString", path);
222 HLTError("cannot fetch object \"%s\" from CDB", path);
226 const char* pathBField=kAliHLTCDBSolenoidBz;
229 HLTInfo("reconfigure B-Field from entry %s, chain id %s", path,(chainId!=NULL && chainId[0]!=0)?chainId:"<none>");
230 AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(pathBField);//,GetRunNo());
232 TObjString* pString=dynamic_cast<TObjString*>(pEntry->GetObject());
234 HLTInfo("received configuration object string: \'%s\'", pString->GetString().Data());
235 iResult=Configure(pString->GetString().Data());
237 HLTError("configuration object \"%s\" has wrong type, required TObjString", path);
240 HLTError("cannot fetch object \"%s\" from CDB", path);
248 bool AliHLTTPCCATrackerComponent::CompareClusters( AliHLTTPCSpacePointData *a, AliHLTTPCSpacePointData *b )
250 //* Comparison function for sorting clusters
251 if ( a->fPadRow < b->fPadRow ) return 1;
252 if ( a->fPadRow > b->fPadRow ) return 0;
253 return ( a->fZ < b->fZ );
257 int AliHLTTPCCATrackerComponent::Configure( const char* arguments )
261 const double kCLight = 0.000299792458;
264 if ( !arguments ) return iResult;
266 TString allArgs = arguments;
268 int bMissingParam = 0;
270 TObjArray* pTokens = allArgs.Tokenize( " " );
272 int nArgs = pTokens ? pTokens->GetEntries() : 0;
274 for ( int i = 0; i < nArgs; i++ ) {
275 argument = ( ( TObjString* )pTokens->At( i ) )->GetString();
276 if ( argument.IsNull() ) {
277 } else if ( argument.CompareTo( "-solenoidBz" ) == 0 ) {
278 if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
279 fSolenoidBz = kCLight * ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
280 HLTInfo( "Magnetic Field set to: %f", fSolenoidBz );
281 } else if ( argument.CompareTo( "-minNClustersOnTrack" ) == 0 ||
282 argument.CompareTo( "-minNTrackClusters" ) == 0 ) {
283 if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
284 fMinNTrackClusters = ( ( TObjString* )pTokens->At( i ) )->GetString().Atoi();
285 HLTInfo( "minNClustersOnTrack set to: %d", fMinNTrackClusters );
286 } else if ( argument.CompareTo( "-clusterZCut" ) == 0 ) {
287 if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
288 fClusterZCut = TMath::Abs( ( ( TObjString* )pTokens->At( i ) )->GetString().Atof() );
289 HLTInfo( "ClusterZCut set to: %f", fClusterZCut );
290 } else if ( argument.CompareTo( "-newOutputType" ) == 0 ) {
292 HLTInfo( "NewOutputType is set" );
294 HLTError( "Unknown option %s ", argument.Data() );
300 if ( bMissingParam ) {
301 HLTError( "Specifier missed for %s", argument.Data() );
311 int AliHLTTPCCATrackerComponent::DoEvent
313 const AliHLTComponentEventData& evtData,
314 const AliHLTComponentBlockData* blocks,
315 AliHLTComponentTriggerData& /*trigData*/,
316 AliHLTUInt8_t* outputPtr,
317 AliHLTUInt32_t& size,
318 vector<AliHLTComponentBlockData>& outputBlocks )
321 AliHLTUInt32_t maxBufferSize = size;
322 size = 0; // output size
324 if ( GetFirstInputBlock( kAliHLTDataTypeSOR ) || GetFirstInputBlock( kAliHLTDataTypeEOR ) ) {
330 // Event reconstruction in one TPC slice with CA Tracker
332 //Logging( kHLTLogWarning, "HLT::TPCCATracker::DoEvent", "DoEvent", "CA::DoEvent()" );
333 if ( evtData.fBlockCnt <= 0 ) {
334 HLTWarning( "no blocks in event" );
338 const AliHLTComponentBlockData* iter = NULL;
340 AliHLTTPCClusterData* inPtrSP;
342 // Determine the slice number
346 std::vector<int> slices;
347 std::vector<int>::iterator slIter;
348 std::vector<unsigned int> sliceCnts;
349 std::vector<unsigned int>::iterator slCntIter;
351 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ ) {
353 if ( iter->fDataType != AliHLTTPCDefinitions::fgkClustersDataType ) continue;
355 slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter );
358 slCntIter = sliceCnts.begin();
359 for ( slIter = slices.begin(); slIter != slices.end(); slIter++, slCntIter++ ) {
360 if ( *slIter == slice ) {
366 slices.push_back( slice );
367 sliceCnts.push_back( 1 );
372 // Determine slice number to really use.
373 if ( slices.size() > 1 ) {
374 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
375 "Multiple slice numbers found in event 0x%08lX (%lu). Determining maximum occuring slice number...",
376 evtData.fEventID, evtData.fEventID );
377 unsigned int maxCntSlice = 0;
378 slCntIter = sliceCnts.begin();
379 for ( slIter = slices.begin(); slIter != slices.end(); slIter++, slCntIter++ ) {
380 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
381 "Slice %lu found %lu times.", *slIter, *slCntIter );
382 if ( maxCntSlice < *slCntIter ) {
383 maxCntSlice = *slCntIter;
387 Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
388 "Using slice %lu.", slice );
389 } else if ( slices.size() > 0 ) {
390 slice = *( slices.begin() );
395 HLTWarning( "no slices found in event" );
400 // Initialize the tracker
404 if ( !fTracker ) fTracker = new AliHLTTPCCATracker;
406 float inRmin = 83.65;
407 // float inRmax = 133.3;
408 // float outRmin = 133.5;
409 float outRmax = 247.7;
410 float plusZmin = 0.0529937;
411 float plusZmax = 249.778;
412 float minusZmin = -249.645;
413 float minusZmax = -0.0799937;
414 float dalpha = 0.349066;
415 float alpha = 0.174533 + dalpha * iSec;
417 bool zPlus = ( iSec < 18 );
418 float zMin = zPlus ? plusZmin : minusZmin;
419 float zMax = zPlus ? plusZmax : minusZmax;
420 //TPCZmin = -249.645, ZMax = 249.778
421 // float rMin = inRmin;
422 // float rMax = outRmax;
423 int nRows = AliHLTTPCTransform::GetNRows();
425 float padPitch = 0.4;
426 float sigmaZ = 0.228808;
428 float *rowX = new float [nRows];
429 for ( int irow = 0; irow < nRows; irow++ ) {
430 rowX[irow] = AliHLTTPCTransform::Row2X( irow );
433 AliHLTTPCCAParam param;
434 param.Initialize( iSec, nRows, rowX, alpha, dalpha,
435 inRmin, outRmax, zMin, zMax, padPitch, sigmaZ, fSolenoidBz );
436 param.SetHitPickUpFactor( 2 );
438 fTracker->Initialize( param );
443 // min and max patch numbers and row numbers
446 int minPatch = 100, maxPatch = -1;
454 std::vector<unsigned long> patchIndices;
456 for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ ) {
458 if ( iter->fDataType != AliHLTTPCDefinitions::fgkClustersDataType ) continue;
459 if ( slice != AliHLTTPCDefinitions::GetMinSliceNr( *iter ) ) continue;
460 inPtrSP = ( AliHLTTPCClusterData* )( iter->fPtr );
461 nHitsTotal += inPtrSP->fSpacePointCnt;
462 int patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
463 if ( minPatch > patch ) {
465 row[0] = AliHLTTPCTransform::GetFirstRow( patch );
467 if ( maxPatch < patch ) {
469 row[1] = AliHLTTPCTransform::GetLastRow( patch );
471 std::vector<unsigned long>::iterator pIter = patchIndices.begin();
472 while ( pIter != patchIndices.end() && AliHLTTPCDefinitions::GetMinPatchNr( blocks[*pIter] ) < patch ) {
475 patchIndices.insert( pIter, ndx );
479 // pass event to CA Tracker
481 fTracker->StartEvent();
483 Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Reading hits",
484 "Total %d hits to read for slice %d", nHitsTotal, slice );
487 AliHLTTPCSpacePointData** vOrigClusters = new AliHLTTPCSpacePointData* [ nHitsTotal];
491 for ( std::vector<unsigned long>::iterator pIter = patchIndices.begin(); pIter != patchIndices.end(); pIter++ ) {
495 int patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
496 inPtrSP = ( AliHLTTPCClusterData* )( iter->fPtr );
498 Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Reading hits",
499 "Reading %d hits for slice %d - patch %d", inPtrSP->fSpacePointCnt, slice, patch );
501 for ( unsigned int i = 0; i < inPtrSP->fSpacePointCnt; i++ ) {
502 vOrigClusters[nClusters++] = &( inPtrSP->fSpacePoints[i] );
506 // sort clusters since they are not sorted fore some reason
508 sort( vOrigClusters, vOrigClusters + nClusters, CompareClusters );
510 float *vHitStoreX = new float [nHitsTotal]; // hit X coordinates
511 float *vHitStoreY = new float [nHitsTotal]; // hit Y coordinates
512 float *vHitStoreZ = new float [nHitsTotal]; // hit Z coordinates
513 int *vHitStoreIntID = new int [nHitsTotal]; // hit ID's
514 int *vHitStoreID = new int [nHitsTotal]; // hit ID's
515 int *vHitRowID = new int [nHitsTotal]; // hit ID's
521 int rowFirstHits[200];
522 for ( int ir = 0; ir < 200; ir++ ) rowNHits[ir] = 0;
524 for ( int i = 0; i < nClusters; i++ ) {
525 AliHLTTPCSpacePointData* pSP = vOrigClusters[i];
526 if ( oldRow >= 0 && pSP->fPadRow < oldRow )
527 HLTError( "CA: clusters from row %d are readed twice", oldRow );
529 if ( TMath::Abs( pSP->fZ ) > fClusterZCut ) continue;
531 vHitStoreX[nHits] = pSP->fX;
532 vHitStoreY[nHits] = pSP->fY;
533 vHitStoreZ[nHits] = pSP->fZ;
534 vHitStoreIntID[nHits] = nHits;
535 vHitStoreID[nHits] = pSP->fID;
536 vHitRowID[nHits] = pSP->fPadRow;
538 rowNHits[pSP->fPadRow]++;
542 for ( int ir = 0; ir < 200; ir++ ) {
543 rowFirstHits[ir] = firstRowHit;
544 firstRowHit += rowNHits[ir];
547 fTracker->ReadEvent( rowFirstHits, rowNHits, vHitStoreX, vHitStoreY, vHitStoreZ, nHits );
550 if ( vOrigClusters ) delete[] vOrigClusters;
552 // reconstruct the event
554 TStopwatch timerReco;
556 fTracker->Reconstruct();
562 Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Reconstruct",
563 "%d tracks found for slice %d", fTracker->NOutTracks(), slice );
566 // write reconstructed tracks
568 unsigned int mySize = 0;
569 int ntracks = *fTracker->NOutTracks();
572 if ( !fNewOutputType ) {
574 AliHLTTPCTrackletData* outPtr = ( AliHLTTPCTrackletData* )( outputPtr );
576 AliHLTTPCTrackSegmentData* currOutTracklet = outPtr->fTracklets;
578 mySize = ( ( AliHLTUInt8_t * )currOutTracklet ) - ( ( AliHLTUInt8_t * )outputPtr );
580 outPtr->fTrackletCnt = 0;
582 for ( int itr = 0; itr < ntracks; itr++ ) {
584 AliHLTTPCCAOutTrack &t = fTracker->OutTracks()[itr];
586 //Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Wrtite output","track %d with %d hits", itr, t.NHits());
588 if ( t.NHits() < fMinNTrackClusters ) continue;
590 // calculate output track size
592 unsigned int dSize = sizeof( AliHLTTPCTrackSegmentData ) + t.NHits() * sizeof( unsigned int );
594 if ( mySize + dSize > maxBufferSize ) {
595 HLTWarning( "Output buffer size exceed (buffer size %d, current size %d), %d tracks are not stored", maxBufferSize, mySize, ntracks - itr + 1 );
600 // convert CA track parameters to HLT Track Segment
602 int iFirstRow = 1000;
604 int iFirstHit = fTracker->OutTrackHits()[t.FirstHitRef()];
605 int iLastHit = iFirstHit;
606 for ( int ih = 0; ih < t.NHits(); ih++ ) {
607 int hitID = fTracker->OutTrackHits()[t.FirstHitRef() + ih ];
608 int iRow = vHitRowID[hitID];
609 if ( iRow < iFirstRow ) { iFirstRow = iRow; iFirstHit = hitID; }
610 if ( iRow > iLastRow ) { iLastRow = iRow; iLastHit = hitID; }
613 AliHLTTPCCATrackParam par = t.StartPoint();
615 par.TransportToX( vHitStoreX[iFirstHit], .99 );
617 AliExternalTrackParam tp;
618 AliHLTTPCCATrackConvertor::GetExtParam( par, tp, 0 );
620 currOutTracklet->fX = tp.GetX();
621 currOutTracklet->fY = tp.GetY();
622 currOutTracklet->fZ = tp.GetZ();
623 currOutTracklet->fCharge = ( int ) tp.GetSign();
624 currOutTracklet->fPt = TMath::Abs( tp.GetSignedPt() );
625 float snp = tp.GetSnp() ;
626 if ( snp > .999 ) snp = .999;
627 if ( snp < -.999 ) snp = -.999;
628 currOutTracklet->fPsi = TMath::ASin( snp );
629 currOutTracklet->fTgl = tp.GetTgl();
631 currOutTracklet->fY0err = tp.GetSigmaY2();
632 currOutTracklet->fZ0err = tp.GetSigmaZ2();
633 float h = -currOutTracklet->fPt * currOutTracklet->fPt;
634 currOutTracklet->fPterr = h * h * tp.GetSigma1Pt2();
635 h = 1. / TMath::Sqrt( 1 - snp * snp );
636 currOutTracklet->fPsierr = h * h * tp.GetSigmaSnp2();
637 currOutTracklet->fTglerr = tp.GetSigmaTgl2();
639 if ( par.TransportToX( vHitStoreX[iLastHit], .99 ) ) {
640 currOutTracklet->fLastX = par.GetX();
641 currOutTracklet->fLastY = par.GetY();
642 currOutTracklet->fLastZ = par.GetZ();
644 currOutTracklet->fLastX = vHitStoreX[iLastHit];
645 currOutTracklet->fLastY = vHitStoreY[iLastHit];
646 currOutTracklet->fLastZ = vHitStoreZ[iLastHit];
648 //if( currOutTracklet->fLastX<10. ) {
649 //HLTError("CA last point: hitxyz=%f,%f,%f, track=%f,%f,%f, tracklet=%f,%f,%f, nhits=%d",vHitStoreX[iLastHit],vHitStoreY[iLastHit],vHitStoreZ[iLastHit],
650 //par.GetX(), par.GetY(),par.GetZ(),currOutTracklet->fLastX,currOutTracklet->fLastY ,currOutTracklet->fLastZ, t.NHits());
652 #ifdef INCLUDE_TPC_HOUGH
653 #ifdef ROWHOUGHPARAMS
654 currOutTracklet->fTrackID = 0;
655 currOutTracklet->fRowRange1 = vHitRowID[iFirstHit];
656 currOutTracklet->fRowRange2 = vHitRowID[iLastHit];
657 currOutTracklet->fSector = slice;
658 currOutTracklet->fPID = 211;
660 #endif // INCLUDE_TPC_HOUGH
663 currOutTracklet->fNPoints = t.NHits();
665 for ( int i = 0; i < t.NHits(); i++ ) {
666 currOutTracklet->fPointIDs[i] = vHitStoreID[fTracker->OutTrackHits()[t.FirstHitRef()+i]];
669 currOutTracklet = ( AliHLTTPCTrackSegmentData* )( ( Byte_t * )currOutTracklet + dSize );
671 outPtr->fTrackletCnt++;
673 } else { // new output type
675 mySize = fTracker->Output()->EstimateSize( fTracker->Output()->NTracks(),
676 fTracker->Output()->NTrackClusters() );
677 if ( mySize <= maxBufferSize ) {
678 const AliHLTUInt8_t* outputevent = reinterpret_cast<const AliHLTUInt8_t*>( fTracker->Output() );
679 for ( unsigned int i = 0; i < mySize; i++ ) outputPtr[i] = outputevent[i];
681 HLTWarning( "Output buffer size exceed (buffer size %d, current size %d), tracks are not stored", maxBufferSize, mySize );
687 if ( vHitStoreX ) delete[] vHitStoreX;
688 if ( vHitStoreY ) delete[] vHitStoreY;
689 if ( vHitStoreZ ) delete[] vHitStoreZ;
690 if ( vHitStoreIntID ) delete[] vHitStoreIntID;
691 if ( vHitStoreID ) delete[] vHitStoreID;
692 if ( vHitRowID ) delete[] vHitRowID;
695 AliHLTComponentBlockData bd;
699 bd.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( slice, slice, minPatch, maxPatch );
700 outputBlocks.push_back( bd );
706 fFullTime += timer.RealTime();
707 fRecoTime += timerReco.RealTime();
710 // Set log level to "Warning" for on-line system monitoring
711 int hz = ( int ) ( fFullTime > 1.e-10 ? fNEvents / fFullTime : 100000 );
712 int hz1 = ( int ) ( fRecoTime > 1.e-10 ? fNEvents / fRecoTime : 100000 );
713 HLTWarning( "CATracker slice %d: output %d tracks; input %d clusters, patches %d..%d, rows %d..%d; reco time %d/%d Hz",
714 slice, ntracks, nClusters, minPatch, maxPatch, row[0], row[1], hz, hz1 );