]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/tracking-ca/AliHLTTPCCATrackerComponent.cxx
Obsolete tracker output removed
[u/mrichter/AliRoot.git] / HLT / TPCLib / tracking-ca / AliHLTTPCCATrackerComponent.cxx
index 6d7c1c1558caa80c970dd61218b6229bb9f1d2b9..488f016867be82287e8b743442ae21dae622014c 100644 (file)
@@ -1,21 +1,23 @@
 // @(#) $Id$
-/**************************************************************************
- * This file is property of and copyright by the ALICE HLT Project        * 
- * ALICE Experiment at CERN, All rights reserved.                         *
- *                                                                        *
- * Primary Authors: Jochen Thaeder <thaeder@kip.uni-heidelberg.de>        *
- *                  Ivan Kisel <kisel@kip.uni-heidelberg.de>              *
- *                  for The ALICE HLT Project.                            *
- *                                                                        *
- * Permission to use, copy, modify and distribute this software and its   *
- * documentation strictly for non-commercial purposes is hereby granted   *
- * without fee, provided that the above copyright notice appears in all   *
- * copies and that both the copyright notice and this permission notice   *
- * appear in the supporting documentation. The authors make no claims     *
- * about the suitability of this software for any purpose. It is          *
- * provided "as is" without express or implied warranty.                  *
- **************************************************************************/
+// **************************************************************************
+// This file is property of and copyright by the ALICE HLT Project          *
+// ALICE Experiment at CERN, All rights reserved.                           *
+//                                                                          *
+// Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
+//                  Ivan Kisel <kisel@kip.uni-heidelberg.de>                *
+//                  for The ALICE HLT Project.                              *
+//                                                                          *
+// Permission to use, copy, modify and distribute this software and its     *
+// documentation strictly for non-commercial purposes is hereby granted     *
+// without fee, provided that the above copyright notice appears in all     *
+// copies and that both the copyright notice and this permission notice     *
+// appear in the supporting documentation. The authors make no claims       *
+// about the suitability of this software for any purpose. It is            *
+// provided "as is" without express or implied warranty.                    *
+//                                                                          *
+//***************************************************************************
+
+
 ///////////////////////////////////////////////////////////////////////////////
 //                                                                           //
 // a TPC tracker processing component for the HLT based on CA by Ivan Kisel  //
@@ -28,30 +30,47 @@ using namespace std;
 
 #include "AliHLTTPCCATrackerComponent.h"
 #include "AliHLTTPCTransform.h"
-#include "AliHLTTPCCATracker.h"
-#include "AliHLTTPCCAHit.h"
-#include "AliHLTTPCCAOutTrack.h"
+#include "AliHLTTPCCATrackerFramework.h"
+#include "AliHLTTPCCAParam.h"
+#include "AliHLTTPCCATrackConvertor.h"
+#include "AliHLTArray.h"
 
 #include "AliHLTTPCSpacePointData.h"
 #include "AliHLTTPCClusterDataFormat.h"
+#include "AliHLTTPCCACompressedInputData.h"
 #include "AliHLTTPCTransform.h"
 #include "AliHLTTPCTrackSegmentData.h"
 #include "AliHLTTPCTrackArray.h"
 #include "AliHLTTPCTrackletDataFormat.h"
 #include "AliHLTTPCDefinitions.h"
+#include "AliExternalTrackParam.h"
 #include "TStopwatch.h"
 #include "TMath.h"
+#include "AliCDBEntry.h"
+#include "AliCDBManager.h"
+#include "TObjString.h"
+#include "TObjArray.h"
+#include "AliHLTTPCCASliceOutput.h"
+#include "AliHLTTPCCAClusterData.h"
 
+const AliHLTComponentDataType AliHLTTPCCADefinitions::fgkTrackletsDataType = AliHLTComponentDataTypeInitializer( "CATRACKL", kAliHLTDataOriginTPC );
 
-// this is a global object used for automatic component registration, do not use this
-AliHLTTPCCATrackerComponent gAliHLTTPCCATrackerComponent;
-
-ClassImp(AliHLTTPCCATrackerComponent)
+/** ROOT macro for the implementation of ROOT specific class methods */
+ClassImp( AliHLTTPCCATrackerComponent )
 
 AliHLTTPCCATrackerComponent::AliHLTTPCCATrackerComponent()
-  :
-  fTracker(NULL),
-  fBField(0)
+    :
+    fTracker( NULL ),
+    fSolenoidBz( 0 ),
+    fMinNTrackClusters( 0 ),
+    fClusterZCut( 500. ),
+    fNeighboursSearchArea( 0 ), 
+    fClusterErrorCorrectionY(0), 
+    fClusterErrorCorrectionZ(0),
+    fFullTime( 0 ),
+    fRecoTime( 0 ),
+    fNEvents( 0 ),    
+    fAllowGPU( 0)
 {
   // see header file for class documentation
   // or
@@ -60,26 +79,36 @@ AliHLTTPCCATrackerComponent::AliHLTTPCCATrackerComponent()
   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
 }
 
-AliHLTTPCCATrackerComponent::AliHLTTPCCATrackerComponent(const AliHLTTPCCATrackerComponent&)
-  :
-  fTracker(NULL),
-  fBField(0)
+AliHLTTPCCATrackerComponent::AliHLTTPCCATrackerComponent( const AliHLTTPCCATrackerComponent& )
+    :
+    AliHLTProcessor(),
+    fTracker( NULL ),
+    fSolenoidBz( 0 ),
+    fMinNTrackClusters( 30 ),
+    fClusterZCut( 500. ),
+    fNeighboursSearchArea(0),
+    fClusterErrorCorrectionY(0), 
+    fClusterErrorCorrectionZ(0),
+    fFullTime( 0 ),
+    fRecoTime( 0 ),
+    fNEvents( 0 ),
+    fAllowGPU( 0)
 {
   // see header file for class documentation
-  HLTFatal("copy constructor untested");
+  HLTFatal( "copy constructor untested" );
 }
 
-AliHLTTPCCATrackerComponent& AliHLTTPCCATrackerComponent::operator=(const AliHLTTPCCATrackerComponent&)
+AliHLTTPCCATrackerComponent& AliHLTTPCCATrackerComponent::operator=( const AliHLTTPCCATrackerComponent& )
 {
   // see header file for class documentation
-  HLTFatal("assignment operator untested");
+  HLTFatal( "assignment operator untested" );
   return *this;
 }
 
 AliHLTTPCCATrackerComponent::~AliHLTTPCCATrackerComponent()
 {
   // see header file for class documentation
-  delete fTracker;
+  if (fTracker) delete fTracker;
 }
 
 //
@@ -87,465 +116,646 @@ AliHLTTPCCATrackerComponent::~AliHLTTPCCATrackerComponent()
 // These functions are required for the registration process
 //
 
-const char* AliHLTTPCCATrackerComponent::GetComponentID() 
+const char* AliHLTTPCCATrackerComponent::GetComponentID()
 {
   // see header file for class documentation
   return "TPCCATracker";
 }
 
-void AliHLTTPCCATrackerComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list
+void AliHLTTPCCATrackerComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list )
 {
   // see header file for class documentation
   list.clear();
   list.push_back( AliHLTTPCDefinitions::fgkClustersDataType );
+  list.push_back( AliHLTTPCCADefinitions::fgkCompressedInputDataType );
 }
 
-AliHLTComponentDataType AliHLTTPCCATrackerComponent::GetOutputDataType() 
+AliHLTComponentDataType AliHLTTPCCATrackerComponent::GetOutputDataType()
 {
   // see header file for class documentation
-  return AliHLTTPCDefinitions::fgkTrackSegmentsDataType;
+  return AliHLTTPCCADefinitions::fgkTrackletsDataType;
 }
 
-void AliHLTTPCCATrackerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier ) 
+void AliHLTTPCCATrackerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
 {
   // define guess for the output data size
   constBase = 200;       // minimum size
-  inputMultiplier = 0.5; // size relative to input 
+  inputMultiplier = 3.; // size relative to input
 }
 
-AliHLTComponent* AliHLTTPCCATrackerComponent::Spawn() 
+AliHLTComponent* AliHLTTPCCATrackerComponent::Spawn()
 {
   // see header file for class documentation
   return new AliHLTTPCCATrackerComponent;
 }
 
-int AliHLTTPCCATrackerComponent::DoInit( int argc, const char** argv )
+void AliHLTTPCCATrackerComponent::SetDefaultConfiguration()
 {
-  // Initialize the CA tracker component 
-  //
-  // arguments could be:
-  // bfield - the magnetic field value
-  //
+  // Set default configuration for the CA tracker component
+  // Some parameters can be later overwritten from the OCDB
+
+  fSolenoidBz = -5.00668;
+  fMinNTrackClusters = 0;
+  fClusterZCut = 500.;
+  fNeighboursSearchArea = 0;
+  fClusterErrorCorrectionY = 0;
+  fClusterErrorCorrectionZ = 0;
+  fFullTime = 0;
+  fRecoTime = 0;
+  fNEvents = 0;
+}
 
-  if ( fTracker ) return EINPROGRESS;
-  
-  fTracker = new AliHLTTPCCATracker();
-  
-  // read command line
-
-  int i = 0;
-  char* cpErr;
-  while ( i < argc ){
-    if ( !strcmp( argv[i], "bfield" ) ){
-      if ( i+1 >= argc )
-       {
-         Logging( kHLTLogError, "HLT::TPCCATracker::DoInit", "Missing B-field", "Missing B-field specifier." );
-         return ENOTSUP;
-       }
-      fBField = strtod( argv[i+1], &cpErr );
-      if ( *cpErr )
-       {
-         Logging( kHLTLogError, "HLT::TPCCATracker::DoInit", "Missing multiplicity", "Cannot convert B-field specifier '%s'.", argv[i+1] );
-         return EINVAL;
-       }
-
-      Logging( kHLTLogDebug, "HLT::TPCCATracker::DoInit", "Reading command line",
-              "Magnetic field value is set to %f kG", fBField );
-
-      i += 2;
+int AliHLTTPCCATrackerComponent::ReadConfigurationString(  const char* arguments )
+{
+  // Set configuration parameters for the CA tracker component from the string
+
+  int iResult = 0;
+  if ( !arguments ) return iResult;
+
+  TString allArgs = arguments;
+  TString argument;
+  int bMissingParam = 0;
+
+  TObjArray* pTokens = allArgs.Tokenize( " " );
+
+  int nArgs =  pTokens ? pTokens->GetEntries() : 0;
+
+  for ( int i = 0; i < nArgs; i++ ) {
+    argument = ( ( TObjString* )pTokens->At( i ) )->GetString();
+    if ( argument.IsNull() ) continue;
+
+    if ( argument.CompareTo( "-solenoidBz" ) == 0 ) {
+      if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
+      HLTWarning("argument -solenoidBz is deprecated, magnetic field set up globally (%f)", GetBz());
       continue;
     }
-    
-    Logging(kHLTLogError, "HLT::TPCCATracker::DoInit", "Unknown Option", "Unknown option '%s'", argv[i] );
-    return EINVAL;
+
+    if ( argument.CompareTo( "-minNClustersOnTrack" ) == 0 ) {
+      if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
+      fMinNTrackClusters = ( ( TObjString* )pTokens->At( i ) )->GetString().Atoi();
+      HLTInfo( "minNClustersOnTrack set to: %d", fMinNTrackClusters );
+      continue;
+    }
+
+    if ( argument.CompareTo( "-clusterZCut" ) == 0 ) {
+      if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
+      fClusterZCut = TMath::Abs( ( ( TObjString* )pTokens->At( i ) )->GetString().Atof() );
+      HLTInfo( "ClusterZCut set to: %f", fClusterZCut );
+      continue;
+    }
+   if ( argument.CompareTo( "-neighboursSearchArea" ) == 0 ) {
+      if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
+      fNeighboursSearchArea = TMath::Abs( ( ( TObjString* )pTokens->At( i ) )->GetString().Atof() );
+      HLTInfo( "NeighboursSearchArea set to: %f", fNeighboursSearchArea );
+      continue;
+    }
+
+   if ( argument.CompareTo( "-errorCorrectionY" ) == 0 ) {
+     if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
+     fClusterErrorCorrectionY = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
+     HLTInfo( "Cluster Y error correction factor set to: %f", fClusterErrorCorrectionY );
+     continue;
+   }
+   
+   if ( argument.CompareTo( "-errorCorrectionZ" ) == 0 ) {
+     if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
+     fClusterErrorCorrectionZ = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
+     HLTInfo( "Cluster Z error correction factor set to: %f", fClusterErrorCorrectionZ );
+     continue;
+   }
+
+    if (argument.CompareTo( "-allowGPU" ) == 0) {
+      fAllowGPU = 1;
+      HLTImportant( "Will try to run tracker on GPU" );
+      continue;
+    }
+
+    HLTError( "Unknown option \"%s\"", argument.Data() );
+    iResult = -EINVAL;
   }
-  
-  return 0;
+  delete pTokens;
+
+  if ( bMissingParam ) {
+    HLTError( "Specifier missed for parameter \"%s\"", argument.Data() );
+    iResult = -EINVAL;
+  }
+
+  return iResult;
+}
+
+
+int AliHLTTPCCATrackerComponent::ReadCDBEntry( const char* cdbEntry, const char* chainId )
+{
+  // see header file for class documentation
+
+  const char* defaultNotify = "";
+
+  if ( !cdbEntry ) {
+    cdbEntry = "HLT/ConfigTPC/TPCCATracker";
+    defaultNotify = " (default)";
+    chainId = 0;
+  }
+
+  HLTInfo( "configure from entry \"%s\"%s, chain id %s", cdbEntry, defaultNotify, ( chainId != NULL && chainId[0] != 0 ) ? chainId : "<none>" );
+  AliCDBEntry *pEntry = AliCDBManager::Instance()->Get( cdbEntry );//,GetRunNo());
+
+  if ( !pEntry ) {
+    HLTError( "cannot fetch object \"%s\" from CDB", cdbEntry );
+    return -EINVAL;
+  }
+
+  TObjString* pString = dynamic_cast<TObjString*>( pEntry->GetObject() );
+
+  if ( !pString ) {
+    HLTError( "configuration object \"%s\" has wrong type, required TObjString", cdbEntry );
+    return -EINVAL;
+  }
+
+  HLTInfo( "received configuration object string: \"%s\"", pString->GetString().Data() );
+
+  return  ReadConfigurationString( pString->GetString().Data() );
+}
+
+
+int AliHLTTPCCATrackerComponent::Configure( const char* cdbEntry, const char* chainId, const char *commandLine )
+{
+  // Configure the component
+  // There are few levels of configuration,
+  // parameters which are set on one step can be overwritten on the next step
+
+  //* read hard-coded values
+
+  SetDefaultConfiguration();
+
+  //* read the default CDB entry
+
+  int iResult1 = ReadCDBEntry( NULL, chainId );
+
+  //* read magnetic field
+
+  int iResult2 = 0; //ReadCDBEntry( kAliHLTCDBSolenoidBz, chainId );
+  fSolenoidBz = GetBz();
+
+  //* read the actual CDB entry if required
+
+  int iResult3 = ( cdbEntry ) ? ReadCDBEntry( cdbEntry, chainId ) : 0;
+
+  //* read extra parameters from input (if they are)
+
+  int iResult4 = 0;
+
+  if ( commandLine && commandLine[0] != '\0' ) {
+    HLTInfo( "received configuration string from HLT framework: \"%s\"", commandLine );
+    iResult4 = ReadConfigurationString( commandLine );
+  }
+
+  // Initialise the tracker here
+
+  return iResult1 ? iResult1 : ( iResult2 ? iResult2 : ( iResult3 ? iResult3 : iResult4 ) );
 }
 
+
+
+int AliHLTTPCCATrackerComponent::DoInit( int argc, const char** argv )
+{
+  // Configure the CA tracker component
+
+  if ( fTracker ) return EINPROGRESS;
+
+
+  //fTracker = new AliHLTTPCCATrackerFramework();
+  //Do not initialize the TrackerFramework here since the CUDA framework is thread local and DoInit is called from different thread than DoEvent
+
+  TString arguments = "";
+  for ( int i = 0; i < argc; i++ ) {
+    if ( !arguments.IsNull() ) arguments += " ";
+    arguments += argv[i];
+  }
+
+  return Configure( NULL, NULL, arguments.Data() );
+}
+
+
 int AliHLTTPCCATrackerComponent::DoDeinit()
 {
   // see header file for class documentation
-  if ( fTracker ) delete fTracker;
-  fTracker = NULL;  
+  if (fTracker) delete fTracker;
+  fTracker = NULL;
   return 0;
 }
 
+
+
+int AliHLTTPCCATrackerComponent::Reconfigure( const char* cdbEntry, const char* chainId )
+{
+  // Reconfigure the component from OCDB .
+
+  return Configure( cdbEntry, chainId, NULL );
+}
+
+
+bool AliHLTTPCCATrackerComponent::CompareClusters( AliHLTTPCSpacePointData *a, AliHLTTPCSpacePointData *b )
+{
+  //* Comparison function for sort clusters
+
+  if ( a->fPadRow < b->fPadRow ) return 1;
+  if ( a->fPadRow > b->fPadRow ) return 0;
+  return ( a->fZ < b->fZ );
+}
+
+
+
 int AliHLTTPCCATrackerComponent::DoEvent
-( 
- const AliHLTComponentEventData& evtData, 
- const AliHLTComponentBlockData* blocks, 
- AliHLTComponentTriggerData& trigData, 
- AliHLTUInt8_t* outputPtr, 
- AliHLTUInt32_t& size, 
- vector<AliHLTComponentBlockData>& outputBlocks )
+(
+  const AliHLTComponentEventData& evtData,
+  const AliHLTComponentBlockData* blocks,
+  AliHLTComponentTriggerData& /*trigData*/,
+  AliHLTUInt8_t* outputPtr,
+  AliHLTUInt32_t& size,
 vector<AliHLTComponentBlockData>& outputBlocks )
 {
+  //* process event
 
-  AliHLTUInt32_t MaxBufferSize = size;
+  AliHLTUInt32_t maxBufferSize = size;
   size = 0; // output size
 
+  if ( GetFirstInputBlock( kAliHLTDataTypeSOR ) || GetFirstInputBlock( kAliHLTDataTypeEOR ) ) {
+    return 0;
+  }
+
   TStopwatch timer;
 
   // Event reconstruction in one TPC slice with CA Tracker
 
-  Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "DoEvent", "DoEvent()" );
-  if ( evtData.fBlockCnt<=0 )
-    {
-      Logging( kHLTLogWarning, "HLT::TPCCATracker::DoEvent", "DoEvent", "no blocks in event" );
-      return 0;
-    }
-  
+  //Logging( kHLTLogWarning, "HLT::TPCCATracker::DoEvent", "DoEvent", "CA::DoEvent()" );
+  if ( evtData.fBlockCnt <= 0 ) {
+    HLTWarning( "no blocks in event" );
+    return 0;
+  }
+
   const AliHLTComponentBlockData* iter = NULL;
   unsigned long ndx;
-  AliHLTTPCClusterData* inPtrSP; 
-  // Determine the slice number 
-  
-  Int_t slice=-1;
+
+  // Determine the slice number
+
+  //Find min and max slice number with now slice missing in between (for default output)
+  int minslice = -1, maxslice = -1;
+  int slice = -1;
   {
-    std::vector<Int_t> slices;
-    std::vector<Int_t>::iterator slIter;
+    std::vector<int> slices;
+    std::vector<int>::iterator slIter;
     std::vector<unsigned> sliceCnts;
     std::vector<unsigned>::iterator slCntIter;
-  
-    for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ ){
-      iter = blocks+ndx;
-      if ( iter->fDataType != AliHLTTPCDefinitions::fgkClustersDataType ) continue;
+
+    for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ ) {
+      iter = blocks + ndx;
+      if ( iter->fDataType != AliHLTTPCDefinitions::fgkClustersDataType
+          && iter->fDataType != AliHLTTPCCADefinitions::fgkCompressedInputDataType
+          ) continue;
 
       slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter );
+         if (slice < minslice || minslice == -1) minslice = slice;
+         if (slice > maxslice) maxslice = slice;
 
-      Bool_t found = 0;
+      bool found = 0;
       slCntIter = sliceCnts.begin();
-      for( slIter = slices.begin(); slIter!=slices.end(); slIter++, slCntIter++ ){
-       if ( *slIter == slice ){
-         found = kTRUE;
-         break;
-       }
+      for ( slIter = slices.begin(); slIter != slices.end(); slIter++, slCntIter++ ) {
+        if ( *slIter == slice ) {
+          found = kTRUE;
+          break;
+        }
       }
-      if ( !found ){
-       slices.push_back( slice );
-       sliceCnts.push_back( 1 );
-      } else *slCntIter++;     
+      if ( !found ) {
+        slices.push_back( slice );
+        sliceCnts.push_back( 1 );
+      } else (*slCntIter)++;
     }
-  
-    
-    // Determine slice number to really use.
-    if ( slices.size()>1 )
+
+         if ( slices.size() == 0 ) {
+               HLTWarning( "no slices found in event" );
+               return 0;
+         }
+
+
+    // Determine slice number to really use. (for obsolete output)
+    if ( slices.size() > 1 ) {
+      Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
+               "Multiple slice numbers found in event 0x%08lX (%lu). Determining maximum occuring slice number...",
+               evtData.fEventID, evtData.fEventID );
+      unsigned maxCntSlice = 0;
+      slCntIter = sliceCnts.begin();
+      for ( slIter = slices.begin(); slIter != slices.end(); slIter++, slCntIter++ ) {
+        Logging( kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
+                 "Slice %lu found %lu times.", *slIter, *slCntIter );
+      }
+    } else if ( slices.size() > 0 ) {
+      slice = *( slices.begin() );
+    }
+
+
+    for (int islice = minslice;islice <= maxslice;islice++)
       {
-       Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
-                "Multiple slice numbers found in event 0x%08lX (%lu). Determining maximum occuring slice number...",
-                evtData.fEventID, evtData.fEventID );
-       unsigned maxCntSlice=0;
-       slCntIter = sliceCnts.begin();
-       for( slIter = slices.begin(); slIter != slices.end(); slIter++, slCntIter++ )
+       bool found = false;
+       for(slIter = slices.begin(); slIter != slices.end();slIter++)
          {
-           Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
-                    "Slice %lu found %lu times.", *slIter, *slCntIter );
-           if ( maxCntSlice<*slCntIter )
+           if (*slIter == islice)
              {
-               maxCntSlice = *slCntIter;
-               slice = *slIter;
+               found = true;
+               break;
              }
          }
-       Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
-                "Using slice %lu.", slice );
-      }
-    else if ( slices.size()>0 )
-      {
-       slice = *(slices.begin());
+       if (!found)
+         {
+           maxslice = islice - 1;
+           break;
+         }
       }
   }
-  
-  if( slice<0 ){
-    Logging( kHLTLogWarning, "HLT::TPCCATracker::DoEvent", "DoEvent", "no slices found in event" );
-    return 0;
-  }
-
 
-  // Initialize the tracker
+  if ( !fTracker ) fTracker = new AliHLTTPCCATrackerFramework(fAllowGPU);
 
-  Double_t Bz = fBField;
-  
+  int slicecount = maxslice + 1 - minslice;
+  if (slicecount > fTracker->MaxSliceCount())
   {
-    if( !fTracker ) fTracker = new AliHLTTPCCATracker;
-    Int_t iSec = slice;
-    Double_t inRmin = 83.65; 
-    Double_t inRmax = 133.3;
-    Double_t outRmin = 133.5; 
-    Double_t outRmax = 247.7;
-    Double_t plusZmin = 0.0529937; 
-    Double_t plusZmax = 249.778; 
-    Double_t minusZmin = -249.645; 
-    Double_t minusZmax = -0.0799937; 
-    Double_t dalpha = 0.349066;
-    Double_t alpha = 0.174533 + dalpha*iSec;
-    
-    Bool_t zPlus = (iSec<18 );
-    Double_t zMin =  zPlus ?plusZmin :minusZmin;
-    Double_t zMax =  zPlus ?plusZmax :minusZmax;
-    //TPCZmin = -249.645, ZMax = 249.778    
-    Double_t rMin =  inRmin;
-    Double_t rMax =  outRmax;
-    Int_t NRows = AliHLTTPCTransform::GetNRows();
-        
-    Double_t padPitch = 0.4;
-    Double_t sigmaZ = 0.228808;
-    
-     Double_t rowX[NRows];
-    for( Int_t irow=0; irow<NRows; irow++){
-      rowX[irow] = AliHLTTPCTransform::Row2X( irow );
-    }     
-     
-    AliHLTTPCCAParam param;
-    param.Initialize( iSec, NRows, rowX, alpha, dalpha,
-                     inRmin, outRmax, zMin, zMax, padPitch, sigmaZ, Bz );
-    param.YErrorCorrection() = 1;
-    param.ZErrorCorrection() = 2;
-
-    fTracker->Initialize( param ); 
-
+       maxslice = minslice + (slicecount = fTracker->MaxSliceCount()) - 1;
   }
+  int nClustersTotalSum = 0;
+  AliHLTTPCCAClusterData* clusterData = new AliHLTTPCCAClusterData[slicecount];
 
-    
-  // min and max patch numbers and row numbers
-
-  Int_t row[2] = {0,0};
-  Int_t minPatch=INT_MAX, maxPatch = -1;
 
-  // total n Hits
+  // min and max patch numbers and row numbers
+  int* slicerow = new int[slicecount * 2];
+  int* sliceminPatch = new int[slicecount];
+  int* slicemaxPatch = new int[slicecount];
+  memset(slicerow, 0, slicecount * 2 * sizeof(int));
+  for (int i = 0;i < slicecount;i++)
+  {
+         sliceminPatch[i] = 100;
+         slicemaxPatch[i] = -1;
+  }
 
-  Int_t nHitsTotal = 0;
+  //Prepare everything for all slices
 
-  // sort patches
+  for (int islice = 0;islice < slicecount;islice++)
+  {
+         slice = minslice + islice;
 
-  std::vector<unsigned long> patchIndices;
+         // Initialize the tracker slice
+         {
+               int iSec = slice;
+               float inRmin = 83.65;
+               //    float inRmax = 133.3;
+               //    float outRmin = 133.5;
+               float outRmax = 247.7;
+               float plusZmin = 0.0529937;
+               float plusZmax = 249.778;
+               float minusZmin = -249.645;
+               float minusZmax = -0.0799937;
+               float dalpha = 0.349066;
+               float alpha = 0.174533 + dalpha * iSec;
+
+               bool zPlus = ( iSec < 18 );
+               float zMin =  zPlus ? plusZmin : minusZmin;
+               float zMax =  zPlus ? plusZmax : minusZmax;
+               //TPCZmin = -249.645, ZMax = 249.778
+               //    float rMin =  inRmin;
+               //    float rMax =  outRmax;
+               int nRows = AliHLTTPCTransform::GetNRows();
+
+               float padPitch = 0.4;
+               float sigmaZ = 0.228808;
+
+               float *rowX = new float [nRows];
+               for ( int irow = 0; irow < nRows; irow++ ) {
+                 rowX[irow] = AliHLTTPCTransform::Row2X( irow );
+               }
+
+               AliHLTTPCCAParam param;
+
+               param.Initialize( iSec, nRows, rowX, alpha, dalpha,
+                                                 inRmin, outRmax, zMin, zMax, padPitch, sigmaZ, fSolenoidBz );
+               param.SetHitPickUpFactor( 2 );
+               if( fNeighboursSearchArea>0 ) param.SetNeighboursSearchArea( fNeighboursSearchArea );
+               if( fClusterErrorCorrectionY>1.e-4 ) param.SetClusterError2CorrectionY( fClusterErrorCorrectionY*fClusterErrorCorrectionY );
+               if( fClusterErrorCorrectionZ>1.e-4 ) param.SetClusterError2CorrectionZ( fClusterErrorCorrectionZ*fClusterErrorCorrectionZ );
+               param.Update();
+               fTracker->InitializeSliceParam( slice, param );
+               delete[] rowX;
+         }
 
-  for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ ){
-    iter = blocks+ndx;      
-    if( iter->fDataType != AliHLTTPCDefinitions::fgkClustersDataType ) continue;
-    if( slice!=AliHLTTPCDefinitions::GetMinSliceNr( *iter ) ) continue;
-    inPtrSP = (AliHLTTPCClusterData*)(iter->fPtr);
-    nHitsTotal+=inPtrSP->fSpacePointCnt;
-    Int_t patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
-    if ( minPatch>patch ){
-      minPatch = patch;
-      row[0] = AliHLTTPCTransform::GetFirstRow( patch );
-    }
-    if ( maxPatch<patch ){
-      maxPatch = patch;
-      row[1] = AliHLTTPCTransform::GetLastRow( patch );
-    }
-    std::vector<unsigned long>::iterator pIter = patchIndices.begin(); 
-    while( pIter!=patchIndices.end() && AliHLTTPCDefinitions::GetMinPatchNr( blocks[*pIter] ) < patch ){
-      pIter++;
-    }
-    patchIndices.insert( pIter, ndx );
-  }
-           
+         // total n Hits
+         int nClustersTotal = 0;
+
+         // sort patches
+         std::vector<unsigned long> patchIndices;
+
+         for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ ) {
+               iter = blocks + ndx;
+               if ( slice != AliHLTTPCDefinitions::GetMinSliceNr( *iter ) ) continue;
+               if ( iter->fDataType == AliHLTTPCDefinitions::fgkClustersDataType ){
+                 AliHLTTPCClusterData* inPtrSP = ( AliHLTTPCClusterData* )( iter->fPtr );
+                 nClustersTotal += inPtrSP->fSpacePointCnt;
+               } 
+               else if ( iter->fDataType == AliHLTTPCCADefinitions::fgkCompressedInputDataType){
+                 const AliHLTUInt8_t * inPtr =  (const AliHLTUInt8_t *)iter->fPtr;
+                 while( inPtr< ((const AliHLTUInt8_t *) iter->fPtr) + iter->fSize ){
+                   AliHLTTPCCACompressedClusterRow *row = (AliHLTTPCCACompressedClusterRow*)inPtr;
+                   nClustersTotal+= row->fNClusters;     
+                   inPtr = (const AliHLTUInt8_t *)(row->fClusters+row->fNClusters);
+                 }
+               }
+               else continue;
+
+               int patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
+               if ( sliceminPatch[islice] > patch ) {
+                 sliceminPatch[islice] = patch;
+                 slicerow[2 * islice + 0] = AliHLTTPCTransform::GetFirstRow( patch );
+               }
+               if ( slicemaxPatch[islice] < patch ) {
+                 slicemaxPatch[islice] = patch;
+                 slicerow[2 * islice + 1] = AliHLTTPCTransform::GetLastRow( patch );
+               }
+               std::vector<unsigned long>::iterator pIter = patchIndices.begin();
+               while ( pIter != patchIndices.end() && AliHLTTPCDefinitions::GetMinPatchNr( blocks[*pIter] ) < patch ) {
+                 pIter++;
+               }
+               patchIndices.insert( pIter, ndx );
+         }
 
-  // pass event to CA Tracker
-  
-  fTracker->StartEvent();
 
-  AliHLTTPCCAHit vHits[nHitsTotal]; // CA hit array
-  Double_t vHitStoreX[nHitsTotal];       // hit X coordinates
-  Int_t vHitStoreID[nHitsTotal];            // hit ID's
-  Int_t vHitRowID[nHitsTotal];            // hit ID's
+         // pass event to CA Tracker
+
+
+         Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Reading hits",
+                          "Total %d hits to read for slice %d", nClustersTotal, slice );
+
+
+         clusterData[islice].StartReading( slice, nClustersTotal );
+
+         for ( std::vector<unsigned long>::iterator pIter = patchIndices.begin(); pIter != patchIndices.end(); pIter++ ) {
+               ndx = *pIter;
+               iter = blocks + ndx;
+               int patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
+               int nPatchClust = 0;
+               if ( iter->fDataType == AliHLTTPCDefinitions::fgkClustersDataType ){
+                 AliHLTTPCClusterData* inPtrSP = ( AliHLTTPCClusterData* )( iter->fPtr );
+                 nPatchClust = inPtrSP->fSpacePointCnt;
+                 for ( unsigned int i = 0; i < inPtrSP->fSpacePointCnt; i++ ) {
+                   AliHLTTPCSpacePointData *c = &( inPtrSP->fSpacePoints[i] );
+                   if ( CAMath::Abs( c->fZ ) > fClusterZCut ) continue;
+                   if ( c->fPadRow > 159 ) {
+                     HLTError( "Wrong TPC cluster with row number %d received", c->fPadRow );
+                     continue;
+                   }
+                   clusterData[islice].ReadCluster( c->fID, c->fPadRow, c->fX, c->fY, c->fZ, c->fCharge );
+                 }           
+               } 
+               else if ( iter->fDataType == AliHLTTPCCADefinitions::fgkCompressedInputDataType){
+                 const AliHLTUInt8_t * inPtr = (const AliHLTUInt8_t *)iter->fPtr;
+                 nPatchClust=0;
+                 while( inPtr< ((const AliHLTUInt8_t *)iter->fPtr) + iter->fSize ){
+                   AliHLTTPCCACompressedClusterRow *row = (AliHLTTPCCACompressedClusterRow*)inPtr;
+                   UInt_t id = row->fSlicePatchRowID;
+                   UInt_t jslice = id>>10;       
+                   UInt_t jpatch = (id>>6) & 0x7;
+                   UInt_t jrow   =  id     & 0x3F;     
+                   jrow+= AliHLTTPCTransform::GetFirstRow( jpatch );
+                   Double_t rowX = AliHLTTPCTransform::Row2X( jrow );
+                   //cout<<"Read row: s "<<jslice<<" p "<<jpatch<<" r "<<jrow<<" x "<<row->fX<<" nclu "<<row->fNClusters<<" :"<<endl;
+                   if( jrow > 159 ) {
+                     HLTError( "Wrong TPC cluster with row number %d received", jrow );
+                     continue;
+                   }
+                   for ( unsigned int i = 0; i < row->fNClusters; i++ ) {
+                     AliHLTTPCCACompressedCluster *c = &( row->fClusters[i] );
+                     
+                     UInt_t ix0 = c->fP0 >>24;
+                     UInt_t ix1 = c->fP1 >>24;
+                     Double_t x = (ix1<<8) + ix0;
+                     Double_t y = c->fP0 & 0x00FFFFFF;
+                     Double_t z = c->fP1 & 0x00FFFFFF;
+                     x = (x - 32768.)*1.e-4 + rowX;
+                     y = (y - 8388608.)*1.e-4;
+                     z = (z - 8388608.)*1.e-4;
+                     
+                     UInt_t cluId = nPatchClust + ((jslice&0x7f)<<25)+((jpatch&0x7)<<22);
+                     //cout<<"clu "<<i<<": "<<x<<" "<<y<<" "<<z<<" "<<cluId<<endl;
+                     if ( CAMath::Abs( z ) <= fClusterZCut ){
+                       clusterData[islice].ReadCluster( cluId, jrow, x, y, z, 0 );
+                     }
+                     nPatchClust++;              
+                   }
+                   inPtr = (const AliHLTUInt8_t *)(row->fClusters+row->fNClusters);
+                 }
+               }
+               Logging( kHLTLogInfo, "HLT::TPCCATracker::DoEvent", "Reading hits",
+                        "Read %d hits for slice %d - patch %d", nPatchClust, slice, patch );
+         }
 
-  Int_t nHits = 0;
-  Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Reading hits",
-          "Total %d hits to read for slice %d", nHitsTotal, slice );
-
-  Int_t nClusters=0;
-
-  for( std::vector<unsigned long>::iterator pIter = patchIndices.begin(); pIter!=patchIndices.end(); pIter++ ){
-    ndx = *pIter;
-    iter = blocks+ndx;
-      
-    Int_t patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
-    inPtrSP = (AliHLTTPCClusterData*)(iter->fPtr);
-      
-    Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Reading hits",
-            "Reading %d hits for slice %d - patch %d", inPtrSP->fSpacePointCnt, slice, patch );
-      
-    // Read patch hits, row by row
-
-    Int_t oldRow = -1;
-    Int_t nRowHits = 0;
-    Int_t firstRowHit = 0;
-    for (UInt_t i=0; i<inPtrSP->fSpacePointCnt; i++ ){ 
-      AliHLTTPCSpacePointData* pSP = &(inPtrSP->fSpacePoints[i]);
-
-      if( pSP->fPadRow != oldRow ){
-       if( oldRow>=0 ) fTracker->ReadHitRow( oldRow, vHits+firstRowHit, nRowHits );
-       oldRow = pSP->fPadRow;
-       firstRowHit = nHits;
-       nRowHits = 0;
-      }
-      AliHLTTPCCAHit &h = vHits[nHits];
-      if( TMath::Abs(pSP->fX- fTracker->Rows()[pSP->fPadRow].X() )>1.e-4 ) cout<<"row "<<(Int_t)pSP->fPadRow<<" "<<fTracker->Rows()[pSP->fPadRow].X()-pSP->fX <<endl;
-
-      h.Y() = pSP->fY;
-      h.Z() = pSP->fZ;
-      h.ErrY() = TMath::Sqrt(TMath::Abs(pSP->fSigmaY2));
-      h.ErrZ() = TMath::Sqrt(TMath::Abs(pSP->fSigmaZ2));  
-      if( h.ErrY()<.1 ) h.ErrY() = .1;
-      if( h.ErrZ()<.1 ) h.ErrZ() = .1;
-      if( h.ErrY()>1. ) h.ErrY() = 1.;
-      if( h.ErrZ()>1. ) h.ErrZ() = 1.;
-      h.ID() = nHits;
-      vHitStoreX[nHits] = pSP->fX;
-      vHitStoreID[nHits] = pSP->fID;
-      vHitRowID[nHits] = pSP->fPadRow;
-      nHits++; 
-      nRowHits++;
-      nClusters++;
-    }  
-    if( oldRow>=0 ) fTracker->ReadHitRow( oldRow, vHits+firstRowHit, nRowHits );
+         clusterData[islice].FinishReading();
+         nClustersTotalSum += nClustersTotal;
   }
 
-  // reconstruct the event  
+  //Prepare Output
+  AliHLTTPCCASliceOutput::outputControlStruct outputControl;
+  //Set tracker output so tracker does not have to output both formats!
+  outputControl.fEndOfSpace = 0;
 
-  TStopwatch timerReco;
+  //For new output we can write directly to output buffer
+  outputControl.fOutputPtr =  (char*) outputPtr;
+  outputControl.fOutputMaxSize = maxBufferSize;
 
-  fTracker->Reconstruct();
+  AliHLTTPCCASliceOutput** sliceOutput = new AliHLTTPCCASliceOutput*[slicecount];
+  memset(sliceOutput, 0, slicecount * sizeof(AliHLTTPCCASliceOutput*));
 
+  // reconstruct the event
+  TStopwatch timerReco;
+  fTracker->SetOutputControl(&outputControl);
+  fTracker->ProcessSlices(minslice, slicecount, clusterData, sliceOutput);
   timerReco.Stop();
+  
+  int ret = 0;
+  unsigned int mySize = 0;
+  int ntracks = 0;
+  int error = 0;
 
-  Int_t ret = 0;
-
-  Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Reconstruct",
-          "%d tracks found for slice %d",fTracker->NOutTracks(), slice);
-
-  // write reconstructed tracks
-
-  AliHLTTPCTrackletData* outPtr = (AliHLTTPCTrackletData*)(outputPtr);
-
-  AliHLTTPCTrackSegmentData* currOutTracklet = outPtr->fTracklets;
-
-  Int_t ntracks = fTracker->NOutTracks();
-
-  UInt_t mySize =   ((AliHLTUInt8_t *)currOutTracklet) -  ((AliHLTUInt8_t *)outputPtr);
-
-  outPtr->fTrackletCnt = 0; 
-
-  for( int itr=0; itr<ntracks; itr++ ){
-    
-    AliHLTTPCCAOutTrack &t = fTracker->OutTracks()[itr];    
-
-    //Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Wrtite output","track %d with %d hits", itr, t.NHits());
-
-    // calculate output track size
-
-    UInt_t dSize = sizeof(AliHLTTPCTrackSegmentData) + t.NHits()*sizeof(UInt_t);
-    
-    if( mySize + dSize > MaxBufferSize ){
-      Logging( kHLTLogWarning, "HLT::TPCCATracker::DoEvent", "Wrtite output","Output buffer size exceed (buffer size %d, current size %d), %d tracks are not stored", MaxBufferSize, mySize, ntracks-itr+1);
+  for (int islice = 0;islice < slicecount;islice++)
+  {
+    if( outputControl.fEndOfSpace ){
+      HLTWarning( "Output buffer size exceed, tracks are not stored" );
       ret = -ENOSPC;
-      break;
+      error = 1;
+      break;     
     }
+    slice = minslice + islice;
     
-    // convert CA track parameters to HLT Track Segment
-
-    Int_t iFirstHit = fTracker->OutTrackHits()[t.FirstHitRef()];
-    Int_t iLastHit = fTracker->OutTrackHits()[t.FirstHitRef()+t.NHits()-1];
-    
-    AliHLTTPCCAHit &firstHit = vHits[iFirstHit];
-    AliHLTTPCCAHit &lastHit = vHits[iLastHit];
-   
-    t.Param().TransportBz(Bz, vHitStoreX[iFirstHit], firstHit.Y(), firstHit.Z() );
-
-    currOutTracklet->fX = t.Param().Par()[0];
-    currOutTracklet->fY = t.Param().Par()[1];
-    currOutTracklet->fZ = t.Param().Par()[2];
-    Double_t qp = t.Param().Par()[6];
-    Double_t p = TMath::Abs(qp)>1.e-5 ?1./TMath::Abs(qp) :1.e5;
-    Double_t ex = t.Param().Par()[3];
-    Double_t ey = t.Param().Par()[4];
-    Double_t ez = t.Param().Par()[5];
-    Double_t et = TMath::Sqrt( ex*ex + ey*ey );
-    
-    currOutTracklet->fCharge = (qp>0) ?+1 :(qp<0 ?-1 :0);
-    currOutTracklet->fPt = p*et;
-
-    Double_t h3 =  TMath::Abs(ex) >1.e-5 ? p*ex/et :0;
-    Double_t h4 =  TMath::Abs(ey) >1.e-5 ? p*ey/et :0;
-    Double_t h5;
-    Double_t h6 =  - currOutTracklet->fCharge * p * currOutTracklet->fPt;
+    if (sliceOutput[islice])
+      {
+       // write reconstructed tracks
+       Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Reconstruct",
+                "%d tracks found for slice %d", sliceOutput[islice]->NTracks(), slice );
+       
+       mySize += sliceOutput[islice]->OutputMemorySize();
+       ntracks += sliceOutput[islice]->NTracks();        
+      }
+    else
+      {
+       HLTWarning( "Output buffer size exceed (buffer size %d, current size %d), tracks are not stored", maxBufferSize, mySize );
+       mySize = 0;
+       ret = -ENOSPC;
+       ntracks = 0;
+       error = 1;
+       break;
+      }
+  }
   
-    currOutTracklet->fPterr = ( h3*h3*t.Param().Cov()[9] + h4*h4*t.Param().Cov()[14] + h6*h6*t.Param().Cov()[27] 
-                               + 2.*(h3*h4*t.Param().Cov()[13]+h3*h6*t.Param().Cov()[24]+h4*h6*t.Param().Cov()[25] )
-                               );    
-    currOutTracklet->fPsi = TMath::ATan2(ey, ex);
-    
-    h3 =  ex/(et*et);
-    h4 = -ey/(et*et);
-    currOutTracklet->fPsierr = h3*h3*t.Param().Cov()[9] + h4*h4*t.Param().Cov()[14] + 2.*h3*h4*t.Param().Cov()[13];
-    
-    currOutTracklet->fTgl = TMath::Abs(et)>1.e-5  ? ez/et :1.e5;
-      
-    if( TMath::Abs(et) >1.e-2 ){
-      h3 = -ez*ex/et/et;
-      h4 = -ez*ey/et/et;
-      h5 = 1.;
-      currOutTracklet->fTglerr =  ( h3*h3*t.Param().Cov()[9] + h4*h4*t.Param().Cov()[14] + h5*h5*t.Param().Cov()[20] 
-                                   + 2.*(h3*h4*t.Param().Cov()[13]+h3*h5*t.Param().Cov()[18]+h4*h5*t.Param().Cov()[19] )
-                                   )/et/et;
-    }else{
-      currOutTracklet->fTglerr =  1.e-2;
-    }
-
-    currOutTracklet->fCharge = -currOutTracklet->fCharge;
-    
-    t.Param().TransportBz(Bz, vHitStoreX[iLastHit], lastHit.Y(), lastHit.Z() );
-     
-    currOutTracklet->fLastX = t.Param().Par()[0];
-    currOutTracklet->fLastY = t.Param().Par()[1];
-    currOutTracklet->fLastZ = t.Param().Par()[2];
-
-#ifdef INCLUDE_TPC_HOUGH
-#ifdef ROWHOUGHPARAMS
-    currOutTracklet->fTrackID = 0;
-    currOutTracklet->fRowRange1 = vHitRowID[iFirstHit];
-    currOutTracklet->fRowRange2 = vHitRowID[iLastHit];
-    currOutTracklet->fSector = slice;
-    currOutTracklet->fPID = 211;
-#endif
-#endif // INCLUDE_TPC_HOUGH
+  size = 0;
+  if (error == 0)
+  {
+    for (int islice = 0;islice < slicecount;islice++)
+      {
+       slice = minslice + islice;
+       mySize = sliceOutput[islice]->OutputMemorySize();
+       if (mySize > 0)
+         {
+           AliHLTComponentBlockData bd;
+           FillBlockData( bd );
+           bd.fOffset = ((char*) sliceOutput[islice] - (char*) outputPtr);
+           bd.fSize = mySize;
+           bd.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( slice, slice, sliceminPatch[islice], slicemaxPatch[islice] );
+           bd.fDataType = GetOutputDataType();
+           outputBlocks.push_back( bd );
+           size += mySize;
+         }
+      }
+  }
 
+  //No longer needed
 
-    currOutTracklet->fNPoints = t.NHits();
+  delete[] clusterData;
+  delete[] sliceOutput;
 
-    for( Int_t i=0; i<t.NHits(); i++ ){
-      currOutTracklet->fPointIDs[i] = vHitStoreID[fTracker->OutTrackHits()[t.FirstHitRef()+i]];
-    }
+  timer.Stop();
 
-    currOutTracklet = (AliHLTTPCTrackSegmentData*)( (Byte_t *)currOutTracklet + dSize );
-    mySize+=dSize;
-    outPtr->fTrackletCnt++; 
-  }
-  
-  
-  AliHLTComponentBlockData bd;
-  FillBlockData( bd );
-  bd.fOffset = 0;
-  bd.fSize = mySize;
-  bd.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( slice, slice, minPatch, maxPatch );      
-  outputBlocks.push_back( bd );
-  
-  size = mySize;
-  
-  timerReco.Stop();
+  fFullTime += timer.RealTime();
+  fRecoTime += timerReco.RealTime();
+  fNEvents++;
 
   // Set log level to "Warning" for on-line system monitoring
+  int hz = ( int ) ( fFullTime > 1.e-10 ? fNEvents / fFullTime : 100000 );
+  int hz1 = ( int ) ( fRecoTime > 1.e-10 ? fNEvents / fRecoTime : 100000 );
+  //Min and Max Patch are taken for first slice processed...
+  HLTInfo( "CATracker slices %d-%d: output %d tracks;  input %d clusters, patches %d..%d, rows %d..%d; time: full %d / reco %d Hz",
+           minslice, maxslice, ntracks, nClustersTotalSum, sliceminPatch[0], slicemaxPatch[0], slicerow[0], slicerow[1], hz, hz1 );
 
-  Logging( kHLTLogWarning, "HLT::TPCCATracker::DoEvent", "Tracks",
-          "CATracker slice %d: output %d tracks;  input %d clusters, patches %d..%d, rows %d..%d; reco time %d/%d us", 
-          slice, ntracks, nClusters, minPatch, maxPatch, row[0], row[1], (Int_t) (timer.RealTime()*1.e6), (Int_t) (timerReco.RealTime()*1.e6) );
+  //No longer needed
 
-  return ret;
+  delete[] slicerow;
+  delete[] sliceminPatch;
+  delete[] slicemaxPatch;
 
+  return ret;
 }
 
-       
+