]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/tracking-ca/AliHLTTPCCATrackerComponent.cxx
GPU update from David Rohr
[u/mrichter/AliRoot.git] / HLT / TPCLib / tracking-ca / AliHLTTPCCATrackerComponent.cxx
index d996cec4d62e6eb8ca628606010f29c3b0ae3eb1..799e32a298ca7f8b3ee9239ad00b833d365e1aa4 100644 (file)
@@ -30,7 +30,7 @@ using namespace std;
 
 #include "AliHLTTPCCATrackerComponent.h"
 #include "AliHLTTPCTransform.h"
-#include "AliHLTTPCCATracker.h"
+#include "AliHLTTPCCATrackerFramework.h"
 #include "AliHLTTPCCAOutTrack.h"
 #include "AliHLTTPCCAParam.h"
 #include "AliHLTTPCCATrackConvertor.h"
@@ -38,6 +38,7 @@ using namespace std;
 
 #include "AliHLTTPCSpacePointData.h"
 #include "AliHLTTPCClusterDataFormat.h"
+#include "AliHLTTPCCACompressedInputData.h"
 #include "AliHLTTPCTransform.h"
 #include "AliHLTTPCTrackSegmentData.h"
 #include "AliHLTTPCTrackArray.h"
@@ -64,6 +65,9 @@ AliHLTTPCCATrackerComponent::AliHLTTPCCATrackerComponent()
     fSolenoidBz( 0 ),
     fMinNTrackClusters( 0 ),
     fClusterZCut( 500. ),
+    fNeighboursSearchArea( 0 ), 
+    fClusterErrorCorrectionY(0), 
+    fClusterErrorCorrectionZ(0),
     fFullTime( 0 ),
     fRecoTime( 0 ),
     fNEvents( 0 ),
@@ -83,6 +87,9 @@ AliHLTTPCCATrackerComponent::AliHLTTPCCATrackerComponent( const AliHLTTPCCATrack
     fSolenoidBz( 0 ),
     fMinNTrackClusters( 30 ),
     fClusterZCut( 500. ),
+    fNeighboursSearchArea(0),
+    fClusterErrorCorrectionY(0), 
+    fClusterErrorCorrectionZ(0),
     fFullTime( 0 ),
     fRecoTime( 0 ),
     fNEvents( 0 ),
@@ -102,7 +109,7 @@ AliHLTTPCCATrackerComponent& AliHLTTPCCATrackerComponent::operator=( const AliHL
 AliHLTTPCCATrackerComponent::~AliHLTTPCCATrackerComponent()
 {
   // see header file for class documentation
-  delete fTracker;
+  if (fTracker) delete fTracker;
 }
 
 //
@@ -121,6 +128,7 @@ void AliHLTTPCCATrackerComponent::GetInputDataTypes( vector<AliHLTComponentDataT
   // see header file for class documentation
   list.clear();
   list.push_back( AliHLTTPCDefinitions::fgkClustersDataType );
+  list.push_back( AliHLTTPCCADefinitions::fgkCompressedInputDataType );
 }
 
 AliHLTComponentDataType AliHLTTPCCATrackerComponent::GetOutputDataType()
@@ -134,7 +142,7 @@ void AliHLTTPCCATrackerComponent::GetOutputDataSize( unsigned long& constBase, d
 {
   // 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()
@@ -145,12 +153,15 @@ AliHLTComponent* AliHLTTPCCATrackerComponent::Spawn()
 
 void AliHLTTPCCATrackerComponent::SetDefaultConfiguration()
 {
-  // Set default configuration for the CA tracker component 
+  // Set default configuration for the CA tracker component
   // Some parameters can be later overwritten from the OCDB
 
-  fSolenoidBz = 5.;
+  fSolenoidBz = -5.00668;
   fMinNTrackClusters = 0;
   fClusterZCut = 500.;
+  fNeighboursSearchArea = 0;
+  fClusterErrorCorrectionY = 0;
+  fClusterErrorCorrectionZ = 0;
   fOutputTRAKSEGS = 0;
   fFullTime = 0;
   fRecoTime = 0;
@@ -163,7 +174,7 @@ int AliHLTTPCCATrackerComponent::ReadConfigurationString(  const char* arguments
 
   int iResult = 0;
   if ( !arguments ) return iResult;
-  
+
   TString allArgs = arguments;
   TString argument;
   int bMissingParam = 0;
@@ -171,17 +182,17 @@ int AliHLTTPCCATrackerComponent::ReadConfigurationString(  const char* arguments
   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;
       fSolenoidBz = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
       HLTInfo( "Magnetic Field set to: %f", fSolenoidBz );
       continue;
-    }  
+    }
 
     if ( argument.CompareTo( "-minNClustersOnTrack" ) == 0 ) {
       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
@@ -189,20 +200,41 @@ int AliHLTTPCCATrackerComponent::ReadConfigurationString(  const char* arguments
       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( "-outputTRAKSEGS" ) == 0 ) {
+   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( "-outputTRAKSEGS" ) == 0 ) {
       fOutputTRAKSEGS = 1;
       HLTInfo( "The special output type \"TRAKSEGS\" is set" );
       continue;
-    } 
-    
+    }
+
     HLTError( "Unknown option \"%s\"", argument.Data() );
     iResult = -EINVAL;
   }
@@ -212,7 +244,7 @@ int AliHLTTPCCATrackerComponent::ReadConfigurationString(  const char* arguments
     HLTError( "Specifier missed for parameter \"%s\"", argument.Data() );
     iResult = -EINVAL;
   }
-  
+
   return iResult;
 }
 
@@ -221,30 +253,30 @@ int AliHLTTPCCATrackerComponent::ReadCDBEntry( const char* cdbEntry, const char*
 {
   // see header file for class documentation
 
-  const char* defaultNotify="";
+  const char* defaultNotify = "";
 
-  if (!cdbEntry) {
-    cdbEntry="HLT/ConfigTPC/TPCCATracker";
-    defaultNotify=" (default)";
+  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());
+  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;    
+  if ( !pEntry ) {
+    HLTError( "cannot fetch object \"%s\" from CDB", cdbEntry );
+    return -EINVAL;
   }
 
-  TObjString* pString=dynamic_cast<TObjString*>(pEntry->GetObject());
+  TObjString* pString = dynamic_cast<TObjString*>( pEntry->GetObject() );
 
-  if( !pString ) {
-    HLTError("configuration object \"%s\" has wrong type, required TObjString", cdbEntry);
-    return -EINVAL;        
+  if ( !pString ) {
+    HLTError( "configuration object \"%s\" has wrong type, required TObjString", cdbEntry );
+    return -EINVAL;
   }
 
-  HLTInfo("received configuration object string: \"%s\"", pString->GetString().Data());
+  HLTInfo( "received configuration object string: \"%s\"", pString->GetString().Data() );
 
   return  ReadConfigurationString( pString->GetString().Data() );
 }
@@ -252,38 +284,38 @@ int AliHLTTPCCATrackerComponent::ReadCDBEntry( const char* cdbEntry, const char*
 
 int AliHLTTPCCATrackerComponent::Configure( const char* cdbEntry, const char* chainId, const char *commandLine )
 {
-  // Configure the component 
-  // There are few levels of configuration, 
+  // 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(); 
+  SetDefaultConfiguration();
 
   //* read the default CDB entry
-  
+
   int iResult1 = ReadCDBEntry( NULL, chainId );
-  
+
   //* read magnetic field
-  
-  int iResult2 = ReadCDBEntry( kAliHLTCDBSolenoidBz, chainId ); 
-  
+
+  int iResult2 = ReadCDBEntry( kAliHLTCDBSolenoidBz, chainId );
+
   //* read the actual CDB entry if required
-  
-  int iResult3 = ( cdbEntry ) ? ReadCDBEntry( cdbEntry, chainId ) :0; 
-  
+
+  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 ); 
+
+  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 ) );
+
+  return iResult1 ? iResult1 : ( iResult2 ? iResult2 : ( iResult3 ? iResult3 : iResult4 ) );
 }
 
 
@@ -293,23 +325,25 @@ int AliHLTTPCCATrackerComponent::DoInit( int argc, const char** argv )
   // Configure the CA tracker component
 
   if ( fTracker ) return EINPROGRESS;
-  
-  fTracker = new AliHLTTPCCATracker();
+
+
+  //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() );
+
+  return Configure( NULL, NULL, arguments.Data() );
 }
 
 
 int AliHLTTPCCATrackerComponent::DoDeinit()
 {
   // see header file for class documentation
-  delete fTracker;
+  if (fTracker) delete fTracker;
   fTracker = NULL;
   return 0;
 }
@@ -365,10 +399,11 @@ int AliHLTTPCCATrackerComponent::DoEvent
 
   const AliHLTComponentBlockData* iter = NULL;
   unsigned long ndx;
-  AliHLTTPCClusterData* inPtrSP;
 
   // 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> slices;
@@ -378,9 +413,13 @@ int AliHLTTPCCATrackerComponent::DoEvent
 
     for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ ) {
       iter = blocks + ndx;
-      if ( iter->fDataType != AliHLTTPCDefinitions::fgkClustersDataType ) continue;
+      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 found = 0;
       slCntIter = sliceCnts.begin();
@@ -396,296 +435,432 @@ int AliHLTTPCCATrackerComponent::DoEvent
       } else *slCntIter++;
     }
 
+         if ( slices.size() == 0 ) {
+               HLTWarning( "no slices found in event" );
+               return 0;
+         }
+
 
-    // Determine slice number to really use.
+    // Determine slice number to really use. (for obsolete output)
     if ( slices.size() > 1 ) {
-      Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
+               Logging( fOutputTRAKSEGS ? kHLTLogError : 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( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
+        Logging( fOutputTRAKSEGS ? kHLTLogError : kHLTLogDebug, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
                  "Slice %lu found %lu times.", *slIter, *slCntIter );
-        if ( maxCntSlice < *slCntIter ) {
+        if ( fOutputTRAKSEGS && maxCntSlice < *slCntIter ) {
           maxCntSlice = *slCntIter;
           slice = *slIter;
         }
       }
-      Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
+      if (fOutputTRAKSEGS)
+      {
+           Logging( kHLTLogError, "HLT::TPCSliceTracker::DoEvent", "Multiple slices found in event",
                "Using slice %lu.", slice );
+       }
     } else if ( slices.size() > 0 ) {
       slice = *( slices.begin() );
     }
-  }
-
-  if ( slice < 0 ) {
-    HLTWarning( "no slices found in event" );
-    return 0;
-  }
 
 
-  // Initialize the tracker
+         if (fOutputTRAKSEGS)
+         {
+                 minslice = maxslice = slice;
+         }
+         else
+         {
+                 for (int islice = minslice;islice <= maxslice;islice++)
+                 {
+                         bool found = false;
+                         for(slIter = slices.begin(); slIter != slices.end();slIter++)
+                         {
+                                 if (*slIter == islice)
+                                 {
+                                         found = true;
+                                         break;
+                                 }
+                         }
+                         if (!found)
+                         {
+                                 maxslice = islice - 1;
+                                 break;
+                         }
+                 }
+        }
+  }
 
+  if ( !fTracker ) fTracker = new AliHLTTPCCATrackerFramework;
 
+  int slicecount = maxslice + 1 - minslice;
+  if (slicecount > fTracker->MaxSliceCount())
   {
-    if ( !fTracker ) fTracker = new AliHLTTPCCATracker;
-    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 );
-    param.Update();
-    fTracker->Initialize( param );
-    delete[] rowX;
+       maxslice = minslice + (slicecount = fTracker->MaxSliceCount());
   }
+  int nClustersTotalSum = 0;
+  AliHLTTPCCAClusterData* clusterData = new AliHLTTPCCAClusterData[slicecount];
 
 
   // min and max patch numbers and row numbers
-
-  int row[2] = {0, 0};
-  int minPatch = 100, maxPatch = -1;
-
-  // total n Hits
-
-  int nClustersTotal = 0;
-
-  // sort patches
-
-  std::vector<unsigned long> patchIndices;
-
-  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 );
-    nClustersTotal += inPtrSP->fSpacePointCnt;
-    int 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 );
+  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;
   }
 
+  //Prepare everything for all slices
 
-  // pass event to CA Tracker
-
-
-  Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Reading hits",
-           "Total %d hits to read for slice %d", nClustersTotal, slice );
-
-
-  AliHLTTPCCAClusterData clusterData;
-  clusterData.StartReading( slice, nClustersTotal );
-
-  for ( std::vector<unsigned long>::iterator pIter = patchIndices.begin(); pIter != patchIndices.end(); pIter++ ) {
-    ndx = *pIter;
-    iter = blocks + ndx;
+  for (int islice = 0;islice < slicecount;islice++)
+  {
+         slice = minslice + islice;
+
+         // 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;
+         }
+
+         // 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
+
+
+         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 );
+         }
+
+         clusterData[islice].FinishReading();
+         nClustersTotalSum += nClustersTotal;
+  }
 
-    int patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
-    inPtrSP = ( AliHLTTPCClusterData* )( iter->fPtr );
+  //Prepare Output
+  AliHLTTPCCASliceOutput::outputControlStruct outputControl;
+  //Set tracker output so tracker does not have to output both formats!
+  outputControl.fObsoleteOutput = fOutputTRAKSEGS;
+  outputControl.fDefaultOutput = !fOutputTRAKSEGS;
 
-    Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Reading hits",
-             "Reading %d hits for slice %d - patch %d", inPtrSP->fSpacePointCnt, slice, patch );
+  //For new output we can write directly to output buffer
+  outputControl.fOutputPtr = fOutputTRAKSEGS ? NULL : (char*) outputPtr;
+  outputControl.fOutputMaxSize = maxBufferSize;
 
-    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.ReadCluster( c->fID, c->fPadRow, c->fX, c->fY, c->fZ, c->fCharge );
-    }
-  }
-
-  clusterData.FinishReading();
+  AliHLTTPCCASliceOutput** sliceOutput = new AliHLTTPCCASliceOutput*[slicecount];
+  memset(sliceOutput, 0, slicecount * sizeof(AliHLTTPCCASliceOutput*));
 
   // reconstruct the event
-
   TStopwatch timerReco;
-
-  fTracker->ReadEvent( &clusterData );
-
-  fTracker->Reconstruct();
-
+  fTracker->SetOutputControl(&outputControl);
+  fTracker->ProcessSlices(minslice, slicecount, clusterData, sliceOutput);
   timerReco.Stop();
-
+  
   int ret = 0;
-
-  Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Reconstruct",
-           "%d tracks found for slice %d", fTracker->NOutTracks(), slice );
-
-
-  // write reconstructed tracks
-
   unsigned int mySize = 0;
-  int ntracks = *fTracker->NOutTracks();
-
-
-  if ( fOutputTRAKSEGS ) {
-
-    AliHLTTPCTrackletData* outPtr = ( AliHLTTPCTrackletData* )( outputPtr );
-
-    AliHLTTPCTrackSegmentData* currOutTracklet = outPtr->fTracklets;
-
-    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());
-
-      if ( t.NHits() < fMinNTrackClusters ) continue;
+  int ntracks = 0;
+  int error = 0;
 
-      // calculate output track size
-
-      unsigned int dSize = sizeof( AliHLTTPCTrackSegmentData ) + t.NHits() * sizeof( unsigned int );
-
-      if ( mySize + dSize > maxBufferSize ) {
-        HLTWarning( "Output buffer size exceed (buffer size %d, current size %d), %d tracks are not stored", maxBufferSize, mySize, ntracks - itr + 1 );
-        ret = -ENOSPC;
-        break;
-      }
+  for (int islice = 0;islice < slicecount;islice++)
+  {
+         slice = minslice + islice;
+
+         if (sliceOutput[islice])
+         {
+                 // write reconstructed tracks
 
-      // convert CA track parameters to HLT Track Segment
-
-      int iFirstRow = 1000;
-      int iLastRow = -1;
-      int iFirstHit = fTracker->OutTrackHits()[t.FirstHitRef()];
-      int iLastHit = iFirstHit;
-      for ( int ih = 0; ih < t.NHits(); ih++ ) {
-        int hitID = fTracker->OutTrackHits()[t.FirstHitRef() + ih ];
-        int iRow = clusterData.RowNumber( hitID );
-        if ( iRow < iFirstRow ) {  iFirstRow = iRow; iFirstHit = hitID; }
-        if ( iRow > iLastRow ) { iLastRow = iRow; iLastHit = hitID; }
-      }
+                 if ( fOutputTRAKSEGS ) {
+
+                 Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Reconstruct",
+                                  "%d tracks found for slice %d", sliceOutput[islice]->NOutTracks(), slice );
 
-      AliHLTTPCCATrackParam par = t.StartPoint();
-
-      par.TransportToX( clusterData.X( iFirstHit ), .99 );
-
-      AliExternalTrackParam tp;
-      AliHLTTPCCATrackConvertor::GetExtParam( par, tp, 0 );
-
-      currOutTracklet->fX = tp.GetX();
-      currOutTracklet->fY = tp.GetY();
-      currOutTracklet->fZ = tp.GetZ();
-      currOutTracklet->fCharge = ( int ) tp.GetSign();
-      currOutTracklet->fPt = TMath::Abs( tp.GetSignedPt() );
-      float snp =  tp.GetSnp() ;
-      if ( snp > .999 ) snp = .999;
-      if ( snp < -.999 ) snp = -.999;
-      currOutTracklet->fPsi = TMath::ASin( snp );
-      currOutTracklet->fTgl = tp.GetTgl();
-
-      currOutTracklet->fY0err = tp.GetSigmaY2();
-      currOutTracklet->fZ0err = tp.GetSigmaZ2();
-      float h = -currOutTracklet->fPt * currOutTracklet->fPt;
-      currOutTracklet->fPterr = h * h * tp.GetSigma1Pt2();
-      h = 1. / TMath::Sqrt( 1 - snp * snp );
-      currOutTracklet->fPsierr = h * h * tp.GetSigmaSnp2();
-      currOutTracklet->fTglerr = tp.GetSigmaTgl2();
-
-      if ( par.TransportToX( clusterData.X( iLastHit ), .99 ) ) {
-        currOutTracklet->fLastX = par.GetX();
-        currOutTracklet->fLastY = par.GetY();
-        currOutTracklet->fLastZ = par.GetZ();
-      } else {
-        currOutTracklet->fLastX = clusterData.X( iLastHit );
-        currOutTracklet->fLastY = clusterData.Y( iLastHit );
-        currOutTracklet->fLastZ = clusterData.Z( iLastHit );
-      }
-      //if( currOutTracklet->fLastX<10. ) {
-      //HLTError("CA last point: hitxyz=%f,%f,%f, track=%f,%f,%f, tracklet=%f,%f,%f, nhits=%d",clusterData.X( iLastHit ),clusterData.Y( iLastHit],clusterData.Z( iLastHit],
-      //par.GetX(), par.GetY(),par.GetZ(),currOutTracklet->fLastX,currOutTracklet->fLastY ,currOutTracklet->fLastZ, t.NHits());
-      //}
-#ifdef INCLUDE_TPC_HOUGH
-#ifdef ROWHOUGHPARAMS
-      currOutTracklet->fTrackID = 0;
-      currOutTracklet->fRowRange1 = clusterData.RowNumber( iFirstHit );
-      currOutTracklet->fRowRange2 = clusterData.RowNumber( iLastHit );
-      currOutTracklet->fSector = slice;
-      currOutTracklet->fPID = 211;
-#endif
-#endif // INCLUDE_TPC_HOUGH
+                       ntracks = sliceOutput[islice]->NOutTracks();
+
+                       AliHLTTPCTrackletData* outPtr = ( AliHLTTPCTrackletData* )( outputPtr );
 
+                       AliHLTTPCTrackSegmentData* currOutTracklet = outPtr->fTracklets;
 
-      currOutTracklet->fNPoints = t.NHits();
+                       mySize =   ( ( AliHLTUInt8_t * )currOutTracklet ) -  ( ( AliHLTUInt8_t * )outputPtr );
 
-      for ( int i = 0; i < t.NHits(); i++ ) {
-        currOutTracklet->fPointIDs[i] = clusterData.Id( fTracker->OutTrackHits()[t.FirstHitRef()+i] );
-      }
+                       outPtr->fTrackletCnt = 0;
 
-      currOutTracklet = ( AliHLTTPCTrackSegmentData* )( ( Byte_t * )currOutTracklet + dSize );
-      mySize += dSize;
-      outPtr->fTrackletCnt++;
-    }
+                       for ( int itr = 0; itr < ntracks; itr++ ) {
 
-  } else { // default output type
-
-    mySize = fTracker->Output()->EstimateSize( fTracker->Output()->NTracks(),
-             fTracker->Output()->NTrackClusters() );
-    if ( mySize <= maxBufferSize ) {
-      const AliHLTUInt8_t* outputevent = reinterpret_cast<const AliHLTUInt8_t*>( fTracker->Output() );
-      for ( unsigned int i = 0; i < mySize; i++ ) outputPtr[i] = outputevent[i];
-    } else {
-      HLTWarning( "Output buffer size exceed (buffer size %d, current size %d), tracks are not stored", maxBufferSize, mySize );
-      mySize = 0;
-      ret = -ENOSPC;
-    }
+                         AliHLTTPCCAOutTrack &t = sliceOutput[islice]->OutTracks()[itr];
+
+                         //Logging( kHLTLogDebug, "HLT::TPCCATracker::DoEvent", "Wrtite output","track %d with %d hits", itr, t.NHits());
+
+                         if ( t.NHits() < fMinNTrackClusters ) continue;
+
+                         // calculate output track size
+
+                         unsigned int dSize = sizeof( AliHLTTPCTrackSegmentData ) + t.NHits() * sizeof( unsigned int );
+
+                         if ( mySize + dSize > maxBufferSize ) {
+                               HLTWarning( "Output buffer size exceed (buffer size %d, current size %d), %d tracks are not stored", maxBufferSize, mySize, ntracks - itr + 1 );
+                               ret = -ENOSPC;
+                               error = 1;
+                               break;
+                         }
+
+                         // convert CA track parameters to HLT Track Segment
+
+                         int iFirstRow = 1000;
+                         int iLastRow = -1;
+                         int iFirstHit = sliceOutput[islice]->OutTrackHit(t.FirstHitRef());
+                         int iLastHit = iFirstHit;
+                         for ( int ih = 0; ih < t.NHits(); ih++ ) {
+                               int hitID = sliceOutput[islice]->OutTrackHit(t.FirstHitRef() + ih);
+                               int iRow = clusterData[islice].RowNumber( hitID );
+                               if ( iRow < iFirstRow ) {  iFirstRow = iRow; iFirstHit = hitID; }
+                               if ( iRow > iLastRow ) { iLastRow = iRow; iLastHit = hitID; }
+                         }
+
+                         AliHLTTPCCATrackParam par = t.StartPoint();
+
+                         par.TransportToX( clusterData[islice].X( iFirstHit ), .99 );
+
+                         AliExternalTrackParam tp;
+                         AliHLTTPCCATrackConvertor::GetExtParam( par, tp, 0 );
+
+                         currOutTracklet->fX = tp.GetX();
+                         currOutTracklet->fY = tp.GetY();
+                         currOutTracklet->fZ = tp.GetZ();
+                         currOutTracklet->fCharge = ( int ) tp.GetSign();
+                         currOutTracklet->fPt = TMath::Abs( tp.GetSignedPt() );
+                         float snp =  tp.GetSnp() ;
+                         if ( snp > .999 ) snp = .999;
+                         if ( snp < -.999 ) snp = -.999;
+                         currOutTracklet->fPsi = TMath::ASin( snp );
+                         currOutTracklet->fTgl = tp.GetTgl();
+
+                         currOutTracklet->fY0err = tp.GetSigmaY2();
+                         currOutTracklet->fZ0err = tp.GetSigmaZ2();
+                         float h = -currOutTracklet->fPt * currOutTracklet->fPt;
+                         currOutTracklet->fPterr = h * h * tp.GetSigma1Pt2();
+                         h = 1. / TMath::Sqrt( 1 - snp * snp );
+                         currOutTracklet->fPsierr = h * h * tp.GetSigmaSnp2();
+                         currOutTracklet->fTglerr = tp.GetSigmaTgl2();
+
+                         if ( par.TransportToX( clusterData[islice].X( iLastHit ), .99 ) ) {
+                               currOutTracklet->fLastX = par.GetX();
+                               currOutTracklet->fLastY = par.GetY();
+                               currOutTracklet->fLastZ = par.GetZ();
+                         } else {
+                               currOutTracklet->fLastX = clusterData[islice].X( iLastHit );
+                               currOutTracklet->fLastY = clusterData[islice].Y( iLastHit );
+                               currOutTracklet->fLastZ = clusterData[islice].Z( iLastHit );
+                         }
+                         //if( currOutTracklet->fLastX<10. ) {
+                         //HLTError("CA last point: hitxyz=%f,%f,%f, track=%f,%f,%f, tracklet=%f,%f,%f, nhits=%d",clusterData[islice].X( iLastHit ),clusterData[islice].Y( iLastHit],clusterData[islice].Z( iLastHit],
+                         //par.GetX(), par.GetY(),par.GetZ(),currOutTracklet->fLastX,currOutTracklet->fLastY ,currOutTracklet->fLastZ, t.NHits());
+                         //}
+               #ifdef INCLUDE_TPC_HOUGH
+               #ifdef ROWHOUGHPARAMS
+                         currOutTracklet->fTrackID = 0;
+                         currOutTracklet->fRowRange1 = clusterData[islice].RowNumber( iFirstHit );
+                         currOutTracklet->fRowRange2 = clusterData[islice].RowNumber( iLastHit );
+                         currOutTracklet->fSector = slice;
+                         currOutTracklet->fPID = 211;
+               #endif
+               #endif // INCLUDE_TPC_HOUGH
+
+
+                         currOutTracklet->fNPoints = t.NHits();
+
+                         for ( int i = 0; i < t.NHits(); i++ ) {
+                               currOutTracklet->fPointIDs[i] = clusterData[islice].Id( sliceOutput[islice]->OutTrackHit(t.FirstHitRef()+i) );
+                         }
+
+                         currOutTracklet = ( AliHLTTPCTrackSegmentData* )( ( Byte_t * )currOutTracklet + dSize );
+                         mySize += dSize;
+                         outPtr->fTrackletCnt++;
+                       }
+
+                 } else { // default output type
+
+                 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;
+         }
   }
 
-  if ( mySize > 0 ) {
-    AliHLTComponentBlockData bd;
-    FillBlockData( bd );
-    bd.fOffset = 0;
-    bd.fSize = mySize;
-    bd.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( slice, slice, minPatch, maxPatch );
-    bd.fDataType = GetOutputDataType();
-    outputBlocks.push_back( bd );
+  size = 0;
+  if (error == 0)
+  {
+         for (int islice = 0;islice < slicecount;islice++)
+         {
+                 slice = minslice + islice;
+                 if (!fOutputTRAKSEGS) mySize = sliceOutput[islice]->OutputMemorySize();
+                 if (mySize > 0)
+                 {
+                       AliHLTComponentBlockData bd;
+                       FillBlockData( bd );
+                       bd.fOffset = fOutputTRAKSEGS ? 0 : ((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;
+                 }
+         }
   }
-  size = mySize;
+
+  //No longer needed
+  delete[] clusterData;
+  //These are only temporary pointers to the output and no longer needed
+  delete[] sliceOutput;
 
   timer.Stop();
 
@@ -696,8 +871,9 @@ int AliHLTTPCCATrackerComponent::DoEvent
   // 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 );
-  HLTInfo( "CATracker slice %d: output %d tracks;  input %d clusters, patches %d..%d, rows %d..%d; time: full %d / reco %d Hz",
-          slice, ntracks, nClustersTotal, minPatch, maxPatch, row[0], row[1], hz, hz1 );
+  //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 );
 
   return ret;
 }