]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TRD/AliHLTTRDTrackerV1Component.cxx
style modifications (Markus)
[u/mrichter/AliRoot.git] / HLT / TRD / AliHLTTRDTrackerV1Component.cxx
index fa7d9077a568d9ecf441c180d73c9c4d6af67e19..293ec6ae84c3e2626eaf556cfbbfee6c4fe443b7 100644 (file)
@@ -1,25 +1,26 @@
-// $Id: AliHLTTRDTrackerV1Component.cxx 23618 2008-01-29 13:07:38Z hristov $
-
-/**************************************************************************
- * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
- *                                                                        *
- * Authors: Matthias Richter <Matthias.Richter@ift.uib.no>                *
- *          Timm Steinbeck <timm@kip.uni-heidelberg.de>                   *
- *          for The ALICE Off-line 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.                  *
- **************************************************************************/
+// $Id$
+
+//**************************************************************************
+//* This file is property of and copyright by the ALICE HLT Project        * 
+//* ALICE Experiment at CERN, All rights reserved.                         *
+//*                                                                        *
+//* Primary Authors:                                                       *
+//*                  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.                  *
+//**************************************************************************
 
 /** @file   AliHLTTRDTrackerV1Component.cxx
-    @author Timm Steinbeck, Matthias Richter
+    @author Theodor Rascanu
     @date   
-    @brief  A TRDTrackerV1 processing component for the HLT. */
+    @brief  A TRDTrackerV1 processing component for the HLT.
+*/
 
 #if __GNUC__ >= 3
 using namespace std;
@@ -27,7 +28,6 @@ using namespace std;
 
 #include "AliHLTTRDTrackerV1Component.h"
 #include "AliHLTTRDDefinitions.h"
-#include "AliHLTTRDCluster.h"
 #include "AliHLTTRDTrack.h"
 #include "AliHLTTRDUtils.h"
 
@@ -37,8 +37,8 @@ using namespace std;
 #include "AliGeomManager.h"
 #include "AliCDBManager.h"
 #include "AliCDBStorage.h"
+#include "AliCDBEntry.h"
 #include "AliESDEvent.h"
-#include "AliMagF.h"
 #include "AliESDfriend.h"
 
 #include "AliTRDcalibDB.h"
@@ -50,22 +50,38 @@ using namespace std;
 #include <cerrno>
 #include <string>
 
-#ifdef HAVE_VALGRIND_CALLGRIND_H
-#include <valgrind/callgrind.h>
-#else
-#define CALLGRIND_START_INSTRUMENTATION do { } while (0)
-#define CALLGRIND_STOP_INSTRUMENTATION do { } while (0)
-#endif
-
 ClassImp(AliHLTTRDTrackerV1Component)
-    
+
+void AliHLTTRDTrackerV1Component::AliHLTTRDESDEvent::CreateStdContent()
+{
+  TClonesArray* tracksArray = new TClonesArray("AliESDtrack",0);
+  tracksArray->SetName(AliESDEvent::fgkESDListName[AliESDEvent::kTracks]);
+  AddObject(tracksArray);
+  GetStdContent();
+}
+
+void AliHLTTRDTrackerV1Component::AliHLTTRDESDEvent::Streamer(TBuffer &/*R__b*/)
+{
+  AliFatal("class is for internal us only and not for streaming");
+}
+
 AliHLTTRDTrackerV1Component::AliHLTTRDTrackerV1Component():
   AliHLTProcessor(),
   fOutputPercentage(100), // By default we copy to the output exactly what we got as input 
   fTracker(NULL),
   fRecoParam(NULL),
   fReconstructor(NULL),
-  fESD(NULL)
+  fESD(NULL),
+  fClusterArray(NULL),
+  fRecoParamType(-1),
+  fNtimeBins(-1),
+  fPIDmethod(1),
+  fgeometryFileName(""),
+  fHLTflag(kTRUE),
+  fOutputV1Tracks(kTRUE),
+  fHighLevelOutput(kFALSE),
+  fEmulateHLTTracks(kFALSE),
+  fImproveTracklets(kFALSE)
 {
   // Default constructor
 
@@ -86,21 +102,29 @@ void AliHLTTRDTrackerV1Component::GetInputDataTypes( vector<AliHLTComponent_Data
 {
   // Get the list of input data  
   list.clear(); // We do not have any requirements for our input data type(s).
-  list.push_back( AliHLTTRDDefinitions::fgkClusterDataType );
+  list.push_back(AliHLTTRDDefinitions::fgkClusterDataType);
 }
 
-AliHLTComponent_DataType AliHLTTRDTrackerV1Component::GetOutputDataType()
+AliHLTComponentDataType AliHLTTRDTrackerV1Component::GetOutputDataType()
 {
   // Get the output data type
-  //return AliHLTTRDDefinitions::fgkClusterDataType;
-  return  kAliHLTDataTypeTrack | kAliHLTDataOriginTRD;
+  return kAliHLTMultipleDataType;
+}
+
+int AliHLTTRDTrackerV1Component::GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList)
+{
+  // Get the output data types
+  tgtList.clear();
+  tgtList.push_back(kAliHLTDataTypeTrack | kAliHLTDataOriginTRD);
+  tgtList.push_back(AliHLTTRDDefinitions::fgkTracksDataType);
+  return tgtList.size();
 }
 
 void AliHLTTRDTrackerV1Component::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
 {
   // Get the output data size
   constBase = 0;
-  inputMultiplier = ((double)fOutputPercentage)/100.0;
+  inputMultiplier = fOutputV1Tracks ? 2*((double)fOutputPercentage)/100.0 : 0.5*((double)fOutputPercentage)/100.0;
 }
 
 // Spawn function, return new instance of this class
@@ -113,285 +137,36 @@ AliHLTComponent* AliHLTTRDTrackerV1Component::Spawn()
 int AliHLTTRDTrackerV1Component::DoInit( int argc, const char** argv )
 {
   // perform initialization. We check whether our relative output size is specified in the arguments.
-  fOutputPercentage = 100;
-  int i = 0;
-  char* cpErr;
-  
+  int iResult=0;
 
-  Int_t iRecoParamType = -1; // default will be the low flux
-  Int_t iNtimeBins = -1;     // number of time bins for the tracker to use
-  Int_t iMagneticField = -1; // magnetic field: 0==OFF and 1==ON
-  Int_t iPIDmethod = 1;      // 0=LikelyHood(LH) 1=NeuronalNetwork(NN) 2=TruncatedMean(TM)
-  Bool_t bHLTMode = kTRUE, bWriteClusters = kFALSE;
-  string geometryFileName = "";
-  
-  while ( i < argc )
-    {
-      HLTDebug("argv[%d] == %s", i, argv[i] );
-      if ( !strcmp( argv[i], "output_percentage" ) )
-       {
-         if ( i+1>=argc )
-           {
-             HLTError("Missing output_percentage parameter");
-             return ENOTSUP;
-           }
-         HLTDebug("argv[%d+1] == %s", i, argv[i+1] );
-         fOutputPercentage = strtoul( argv[i+1], &cpErr, 0 );
-         if ( *cpErr )
-           {
-             HLTError("Cannot convert output_percentage parameter '%s'", argv[i+1] );
-             return EINVAL;
-           }
-         HLTInfo("Output percentage set to %i %%", fOutputPercentage );
-         i += 2;
-       }
-      else if ( !strcmp( argv[i], "-NTimeBins" ) )
-       {
-         if ( i+1>=argc )
-           {
-             HLTError("Missing -NTimeBins parameter");
-             return ENOTSUP;
-           }
-         HLTDebug("Arguments", "argv[%d+1] == %s", i, argv[i+1] );
-         iNtimeBins = strtoul( argv[i+1], &cpErr, 0 );
-         if ( *cpErr )
-           {
-             HLTError("Wrong Argument. Cannot convert -NTimeBins parameter '%s'", argv[i+1] );
-             return EINVAL;
-           }     
-         i += 2; 
-       }
-      else if ( strcmp( argv[i], "-geometry" ) == 0)
-       {
-         if ( i+1 >= argc )
-           {
-             HLTError("Missing -geometry argument");
-             return ENOTSUP;         
-           }
-         geometryFileName = argv[i+1];
-         HLTInfo("GeomFile storage is %s", 
-                 geometryFileName.c_str() );
-         i += 2;
-       }
-      // the flux parametrizations
-      else if ( strcmp( argv[i], "-lowflux" ) == 0)
-       {
-         iRecoParamType = 0;     
-         HLTDebug("Low flux reco selected.");
-         i++;
-       }
-      else if ( strcmp( argv[i], "-highflux" ) == 0)
-       {
-         iRecoParamType = 1;     
-         HLTDebug("Low flux reco selected.");
-         i++;
-       }
-      else if ( strcmp( argv[i], "-cosmics" ) == 0)
-       {
-         iRecoParamType = 2;     
-         HLTDebug("Cosmic test reco selected.");
-         i++;
-       }
-      else if ( strcmp( argv[i], "-magnetic_field_ON" ) == 0)
-       {
-         iMagneticField = 1;
-         i++;
-       }
-      else if ( strcmp( argv[i], "-magnetic_field_OFF" ) == 0)
-       {
-         iMagneticField = 0;
-         i++;
-       }
-      else if ( strcmp( argv[i], "-offlineMode" ) == 0)
-       {
-         bHLTMode=kFALSE;
-         HLTDebug("Using standard offline tracking.");
-         i++;
-       }
-      else if ( strcmp( argv[i], "-PIDmethod" ) == 0)
-       {
-         if ( i+1 >= argc )
-           {
-             HLTError("Missing -PIDmethod argument");
-             return ENOTSUP;         
-           }
-         if( strcmp(argv[i], "LH") )
-           iPIDmethod=0;
-         else if( strcmp(argv[i], "NN") )
-           iPIDmethod=1;
-         else if( strcmp(argv[i], "TM") )
-           iPIDmethod=2;
-         else {
-           HLTError("Unknown -PIDmethod argument");
-           return ENOTSUP;           
-         }
-         i += 2;
-       }
-
-      else {
-       HLTError("Unknown option '%s'", argv[i] );
-       return EINVAL;
-      }
-      
-    }
+  fReconstructor = new AliTRDReconstructor();
+  HLTDebug("TRDReconstructor at 0x%x", fReconstructor);
+  fESD = new AliHLTTRDESDEvent();
+  fESD->CreateStdContent();
 
-   // THE "REAL" INIT COMES HERE
-   // offline condition data base
-  
-  if(!AliCDBManager::Instance()->IsDefaultStorageSet()){
-    HLTError("DefaultStorage is not Set in CDBManager");
-    return -1;
-  }
-  if(AliCDBManager::Instance()->GetRun()<0){
-    AliCDBManager *cdb = AliCDBManager::Instance();
-    if (cdb)
-      {
-       cdb->SetRun(0);
-       HLTWarning("Setting CDB Runnumber to 0. CDB instance 0x%x", cdb);
-      }
-    else
-      {
-       HLTError("Could not get CDB instance", "cdb 0x%x", cdb);
-       return -1;
-      }
-  }
-  HLTInfo("CDB default storage: %s; RunNo: %i", (AliCDBManager::Instance()->GetDefaultStorage()->GetBaseFolder()).Data(), AliCDBManager::Instance()->GetRun());
-  
-  if(!AliGeomManager::GetGeometry()){
-    if(!TFile::Open(geometryFileName.c_str())){
-      HLTInfo("Loading standard geometry file");
-      AliGeomManager::LoadGeometry();
-    }else{
-      HLTWarning("Loading non-standard geometry file");
-      AliGeomManager::LoadGeometry(geometryFileName.c_str());
-    }
-    if(!AliGeomManager::GetGeometry()){
-      HLTError("Cannot load geometry");
-      return EINVAL;
-    }
-  }
-  else{
-    HLTInfo("Geometry Already Loaded");
+  TString configuration="";
+  TString argument="";
+  for (int i=0; i<argc && iResult>=0; i++) {
+    argument=argv[i];
+    if (!configuration.IsNull()) configuration+=" ";
+    configuration+=argument;
   }
 
-  // check if the N of time bins make sense
-  if (iNtimeBins <= 0)
-    {
-      HLTError("Sorry. Tracker needs number of time bins. At the moment you have to provide it with -NTimeBins <value>. The simulation always had 24 and the real data 30. Take your pick. Make sure the information is correct. Ask offline to implement how to propagate this information into clusters/cluster tree.");
-      return -1;
-    }
-
-  if (iNtimeBins < 24 || iNtimeBins > 30)
-    {
-      HLTWarning("The number of time bins seems to be strange = %d. But okay. Let's try it...", iNtimeBins);
-    }
-
-  HLTDebug("The number of time bins = %d.", iNtimeBins);
-  AliTRDtrackerV1::SetNTimeBins(iNtimeBins);
-
-  // !!!! THIS IS IMPORTANT
-  // init alifield map - temporarly via parameter - should come from a DB or DCS ?
-  // !!!! 
-  if (iMagneticField < 0)
-    {
-      iMagneticField = 0;
-      HLTWarning("No magnetic field switch stated. Use -magnetic_field_ON or -magnetic_field_OFF flag. Defaulting to OFF = NO MAGNETIC FIELD");
-    }
-  
-  if (!TGeoGlobalMagField::Instance()->IsLocked()) {
-    if (iMagneticField == 0)
-      {
-       // magnetic field OFF
-       AliMagF* field = new AliMagF("Maps","Maps",2,0.,0., 10.,AliMagF::k5kGUniform);
-       TGeoGlobalMagField::Instance()->SetField(field);
-       HLTDebug("Magnetic field is OFF.");
-      }
-    
-    if (iMagneticField == 1)
-      {
-       // magnetic field ON
-       AliMagF* field = new AliMagF("Maps","Maps",2,1.,1., 10.,AliMagF::k5kG);
-       TGeoGlobalMagField::Instance()->SetField(field);
-       HLTDebug("Magnetic field is ON.");
-      }
+  if (!configuration.IsNull()) {
+    iResult=Configure(configuration.Data());
+  } else {
+    iResult=Reconfigure(NULL, NULL);
   }
-  else {
-    HLTError("Magnetic field is already set and locked, cannot redefine it." );
-  }
-
-  // reconstruction parameters
-  if (iRecoParamType < 0 || iRecoParamType > 2)
-    {
-      HLTWarning("No reco param selected. Use -lowflux -highflux -cosmics flags. Defaulting to low flux.");
-      iRecoParamType = 0;
-    }
 
-  if (iRecoParamType == 0)
-    {
-      fRecoParam = AliTRDrecoParam::GetLowFluxParam();
-      HLTDebug("Low flux params init.");
-    }
+  if(iResult<0) return iResult;
 
-  if (iRecoParamType == 1)
-    {
-      fRecoParam = AliTRDrecoParam::GetHighFluxParam();
-      HLTDebug("High flux params init.");
-    }
-  
-  if (iRecoParamType == 2)
-    {
-      fRecoParam = AliTRDrecoParam::GetCosmicTestParam();
-      HLTDebug("Cosmic Test params init.");
-    }
-
-  if (fRecoParam == 0)
-    {
-      HLTError("No reco params initialized. Sniffing big trouble!");
-      return -1;
-    }
-
-  fReconstructor = new AliTRDReconstructor();
-  //   fRecoParam->SetChi2Y(.1);
-  //   fRecoParam->SetChi2Z(5.);
-  fReconstructor->SetRecoParam(fRecoParam);
-  // write clusters [cw] = true
-  // track seeding (stand alone tracking) [sa] = true
-  // PID method in reconstruction (NN) [nn] = true
-  // write online tracklets [tw] = false
-  // drift gas [ar] = false
-  // sl_tr_0 = StreamLevel_task_Level
-  //  fReconstructor->SetOption("sa,!cw,hlt,sl_tr_0");
-  TString recoOptions="sa,sl_tr_0";
-  
-  if (bWriteClusters)
-    {
-      recoOptions += ",cw";
-    } 
-  else
-    {
-      recoOptions += ",!cw";
-    }
-  if (bHLTMode)
-    recoOptions += ",hlt";
-
-  switch(iPIDmethod){
-  case 0: recoOptions += ",!nn"; break;
-  case 1: recoOptions += ",nn"; break;
-  case 2: recoOptions += ",!nn"; break;
-  }
-  
-  fReconstructor->SetOption(recoOptions.Data());
-  HLTDebug("Reconstructor options are: %s",recoOptions.Data());
-  
-  // create the tracker
   fTracker = new AliTRDtrackerV1();
   HLTDebug("TRDTracker at 0x%x", fTracker);
   fTracker->SetReconstructor(fReconstructor);
 
-  fESD = new AliESDEvent;
-  fESD->CreateStdContent();
+  fClusterArray = new TClonesArray("AliTRDcluster"); // would be nice to allocate memory for all clusters here.
 
-  return 0;
+  return iResult;
 }
 
 int AliHLTTRDTrackerV1Component::DoDeinit()
@@ -400,15 +175,19 @@ int AliHLTTRDTrackerV1Component::DoDeinit()
 
   fTracker->SetClustersOwner(kFALSE);
   delete fTracker;
-  fTracker = 0x0;
+  fTracker = NULL;
+
+  fClusterArray->Delete();
+  delete fClusterArray;
+  fClusterArray = NULL;
   
   // We need to set clusters in Reconstructor to null to prevent from 
-  // double deleting, since we delete TClonesArray by ourself in DoEvent.
+  // double deleting, since we delete TClonesArray by ourself.
   fReconstructor->SetClusters(0x0);
   delete fReconstructor;
-  fReconstructor = 0x0;
+  fReconstructor = NULL;
   delete fESD;
-  fESD=NULL;
+  fESD = NULL;
   
   AliTRDcalibDB::Terminate();
 
@@ -424,30 +203,17 @@ int AliHLTTRDTrackerV1Component::DoEvent( const AliHLTComponentEventData& evtDat
 {
   // Process an event
 
-  if (evtData.fEventID == 1)
-    CALLGRIND_START_INSTRUMENTATION;
-
   HLTDebug("NofBlocks %i", evtData.fBlockCnt );
   
-  fESD->Reset();
-  //fESD->SetMagneticField(fSolenoidBz);
-
   AliHLTUInt32_t totalSize = 0, offset = 0;
-  AliHLTUInt32_t dBlockSpecification = 0;
 
-  vector<AliHLTComponent_DataType> expectedDataTypes;
-  GetInputDataTypes(expectedDataTypes);
+  AliHLTComponentDataType expectedDataType = AliHLTTRDDefinitions::fgkClusterDataType;
   for ( unsigned long iBlock = 0; iBlock < evtData.fBlockCnt; iBlock++ ) 
     {
       const AliHLTComponentBlockData &block = blocks[iBlock];
       AliHLTComponentDataType inputDataType = block.fDataType;
-      Bool_t correctDataType = kFALSE;
 
-      for(UInt_t i = 0; i < expectedDataTypes.size(); i++){
-       if( expectedDataTypes.at(i) == inputDataType)
-         correctDataType = kTRUE;
-      }
-      if (!correctDataType)
+      if(inputDataType != expectedDataType)
        {
          HLTDebug( "Block # %i/%i; Event 0x%08LX (%Lu) Wrong received datatype: %s - Skipping",
                    iBlock, evtData.fBlockCnt-1,
@@ -462,25 +228,65 @@ int AliHLTTRDTrackerV1Component::DoEvent( const AliHLTComponentEventData& evtDat
                 DataType2Text(inputDataType).c_str(),
                 block.fSize);
       }
-      
-      
-      TClonesArray* clusterArray = new TClonesArray("AliTRDcluster"); // would be nice to allocate memory for all clusters here.
-      AliHLTTRDUtils::ReadClusters(clusterArray, block.fPtr, block.fSize);
-      HLTDebug("TClonesArray of clusters: nbEntries = %i", clusterArray->GetEntriesFast());
-      fTracker->LoadClusters(clusterArray);
+
+#ifndef NDEBUG
+      unsigned long constBase;
+      double inputMultiplier;
+      GetOutputDataSize(constBase,inputMultiplier);
+      if(size<(constBase+block.fSize*inputMultiplier)){
+       HLTWarning("Memory Block given might be too small: %i < %i; Event %Lu", size, constBase+block.fSize*inputMultiplier, evtData.fEventID);
+      }
+#endif      
+
+      fESD->Reset();
+      //fESD->SetMagneticField(GetBz());
+
+      AliHLTTRDUtils::ReadClusters(fClusterArray, block.fPtr, block.fSize, &fNtimeBins);
+      HLTDebug("Reading number of time bins from input block. Setting number of timebins to %d", fNtimeBins);
+      AliTRDtrackerV1::SetNTimeBins(fNtimeBins);
+
+      HLTDebug("TClonesArray of clusters: nbEntries = %i", fClusterArray->GetEntriesFast());
+      fTracker->LoadClusters(fClusterArray);
 
       fTracker->Clusters2Tracks(fESD);
 
       Int_t nTracks = fESD->GetNumberOfTracks();
       HLTInfo("Number of tracks  == %d ==", nTracks);  
 
-      TClonesArray* trdTracks = 0x0;
-      //trdTracks = fTracker->GetListOfTracks();
+      TClonesArray* trdTracks;
+      trdTracks = fTracker->GetListOfTracks();
       
-      AliHLTUInt32_t addedSize=0;
-      if(nTracks>0){
+      if(fHighLevelOutput){
+       if(fEmulateHLTTracks && trdTracks){
+         // TClonesArray* oldArr = trdTracks;
+         trdTracks = new TClonesArray(*trdTracks);
+         AliHLTTRDUtils::EmulateHLTTracks(trdTracks);
+         // if(oldArr->At(0)){
+         //   HLTInfo("Old Track:");
+         //   ((AliTRDtrackV1*)oldArr->At(0))->Print("a");
+         //   HLTInfo("\nNew Track:");
+         //   ((AliTRDtrackV1*)trdTracks->At(0))->Print("a");
+         // }
+       }
+
+       TObjString strg;
+       strg.String() += fNtimeBins;
+       if(trdTracks)
+         PushBack(trdTracks, AliHLTTRDDefinitions::fgkHiLvlTracksDataType, block.fSpecification);
+       else{
+         TClonesArray temp("AliTRDtrackV1");
+         PushBack(&temp, AliHLTTRDDefinitions::fgkHiLvlTracksDataType, block.fSpecification);
+       }
+       PushBack(&strg, AliHLTTRDDefinitions::fgkHiLvlTracksDataType, block.fSpecification);
+
+       if(fEmulateHLTTracks && trdTracks){
+         trdTracks->Delete();
+         delete trdTracks;
+       }
+      }
+      else if(nTracks>0){
        HLTDebug("We have an output ESDEvent: 0x%x with %i tracks", fESD, nTracks);
-       addedSize= AliHLTTRDUtils::AddESDToOutput(fESD, (AliHLTUInt8_t*)(outputPtr+offset));
+       AliHLTUInt32_t addedSize = AliHLTTRDUtils::AddESDToOutput(fESD, outputPtr+offset);
        totalSize += addedSize;
          
        // Fill block 
@@ -489,18 +295,16 @@ int AliHLTTRDTrackerV1Component::DoEvent( const AliHLTComponentEventData& evtDat
        //bd.fPtr = outputPtr;
        bd.fOffset = offset;
        bd.fSize = addedSize;
-       bd.fSpecification = dBlockSpecification;
+       bd.fSpecification = block.fSpecification;
        bd.fDataType = kAliHLTDataTypeTrack | kAliHLTDataOriginTRD;
        outputBlocks.push_back( bd );
-       HLTDebug("BD fPtr 0x%x, fOffset %i, fSize %i, fSpec 0x%x", bd.fPtr, bd.fOffset, bd.fSize, bd.fSpecification);
+       HLTDebug("BD ptr 0x%x, offset %i, size %i, datav1Type %s, spec 0x%x ", bd.fPtr, bd.fOffset, bd.fSize, DataType2Text(bd.fDataType).c_str(), bd.fSpecification);
        offset = totalSize;
 
-       if (trdTracks){
-         //Int_t nbTracks=trdTracks->GetEntriesFast();
-         //if (nbTracks>0){
+       if (fOutputV1Tracks && trdTracks){
          HLTDebug("We have an output array: pointer to trdTracks = 0x%x, nbEntries = %i", trdTracks, trdTracks->GetEntriesFast());
          
-         addedSize = AliHLTTRDUtils::AddTracksToOutput(trdTracks, (AliHLTUInt8_t*)(outputPtr+offset));
+         addedSize = AliHLTTRDUtils::AddTracksToOutput(trdTracks, outputPtr+offset, fNtimeBins);
          totalSize += addedSize;
          
          // Fill block 
@@ -508,21 +312,14 @@ int AliHLTTRDTrackerV1Component::DoEvent( const AliHLTComponentEventData& evtDat
          //bd.fPtr = outputPtr;
          bd.fOffset = offset;
          bd.fSize = addedSize;
-         bd.fSpecification = dBlockSpecification;
-         bd.fDataType = AliHLTTRDDefinitions::fgkTRDSATracksDataType;
+         bd.fSpecification = block.fSpecification;
+         bd.fDataType = AliHLTTRDDefinitions::fgkTracksDataType;
          outputBlocks.push_back( bd );
-         HLTDebug("BD fPtr 0x%x, fOffset %i, fSize %i, fSpec 0x%x", bd.fPtr, bd.fOffset, bd.fSize, bd.fSpecification);
+         HLTDebug("BD ptr 0x%x, offset %i, size %i, dataType %s, spec 0x%x ", bd.fPtr, bd.fOffset, bd.fSize, DataType2Text(bd.fDataType).c_str(), bd.fSpecification);
          offset = totalSize;
        }
       }
-      
-      
-      // if (trdTracks)
-      //       totalSize += TransportTracks(trdTracks, outputPtr, outputBlocks, offset, dBlockSpecification);
-      // else {
-      //         HLTDebug("Bad array trdTracks = 0x%x", trdTracks);
-      // }
-      
+
       HLTDebug("totalSize: %i", totalSize);
       
 //       if ( totalSize > allocSize )
@@ -535,12 +332,311 @@ int AliHLTTRDTrackerV1Component::DoEvent( const AliHLTComponentEventData& evtDat
       //here we are deleting clusters (but not the TClonesArray itself)
       fTracker->UnloadClusters();
       AliTRDReconstructor::SetClusters(0x0);
-      clusterArray->Delete();
-      delete clusterArray;
+      fClusterArray->Delete();
       
-      }
+    }
       
   size = totalSize;
   HLTDebug("Event is done. size written to the output is %i", size);
   return 0;
 }
+
+int AliHLTTRDTrackerV1Component::Configure(const char* arguments){
+  int iResult=0;
+  if (!arguments) return iResult;
+  
+  TString allArgs=arguments;
+  TString argument;
+  int bMissingParam=0;
+
+  TObjArray* pTokens=allArgs.Tokenize(" ");
+  if (pTokens) {
+    for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
+      argument=((TObjString*)pTokens->At(i))->GetString();
+      if (argument.IsNull()) continue;
+      
+      if (argument.CompareTo("output_percentage")==0) {
+       if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+       HLTInfo("Setting output percentage to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+       fOutputPercentage=((TObjString*)pTokens->At(i))->GetString().Atoi();
+       continue;
+      } 
+      else if (argument.CompareTo("-solenoidBz")==0) {
+       if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+       HLTWarning("argument -solenoidBz is deprecated, magnetic field set up globally (%f)", GetBz());
+       continue;
+      } 
+      else if (argument.CompareTo("-geometry")==0) {
+       if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+       HLTInfo("Setting geometry to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+       fgeometryFileName=((TObjString*)pTokens->At(i))->GetString();
+       continue;
+      } 
+      else if (argument.CompareTo("-lowflux")==0) {
+       fRecoParamType = 0;
+       HLTInfo("Low flux reconstruction selected");
+       continue;
+      }
+      else if (argument.CompareTo("-highflux")==0) {
+       fRecoParamType = 1;
+       HLTInfo("High flux reconstruction selected");
+       continue;
+      }
+      else if (argument.CompareTo("-cosmics")==0) {
+       fRecoParamType = 2;
+       HLTInfo("Cosmics reconstruction selected");
+       continue;
+      }
+      else if (argument.CompareTo("-HLTflag")==0) {
+       if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+       TString toCompareTo=((TObjString*)pTokens->At(i))->GetString();
+       if (toCompareTo.CompareTo("yes")==0){
+         HLTInfo("Setting HLTflag to: %s", toCompareTo.Data());
+         fHLTflag=kTRUE;
+       }
+       else if (toCompareTo.CompareTo("no")==0){
+         HLTInfo("Setting HLTflag to: %s", toCompareTo.Data());
+         fHLTflag=kFALSE;
+       }
+       else {
+         HLTError("unknown argument for HLTflag: %s", toCompareTo.Data());
+         iResult=-EINVAL;
+         break;
+       }
+       continue;
+      }
+      else if (argument.CompareTo("-outputV1Tracks")==0) {
+       if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+       TString toCompareTo=((TObjString*)pTokens->At(i))->GetString();
+       if (toCompareTo.CompareTo("yes")==0){
+         HLTInfo("Setting OutputV1Tracks to: %s", toCompareTo.Data());
+         fOutputV1Tracks=kTRUE;
+       }
+       else if (toCompareTo.CompareTo("no")==0){
+         HLTInfo("Setting OutputV1Tracks to: %s", toCompareTo.Data());
+         fOutputV1Tracks=kFALSE;
+       }
+       else {
+         HLTError("unknown argument for OutputV1Tracks: %s", toCompareTo.Data());
+         iResult=-EINVAL;
+         break;
+       }
+       continue;
+      }
+      else if (argument.CompareTo("-highLevelOutput")==0) {
+       if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+       TString toCompareTo=((TObjString*)pTokens->At(i))->GetString();
+       if (toCompareTo.CompareTo("yes")==0){
+         HLTWarning("Setting highLevelOutput to: %s", toCompareTo.Data());
+         fHighLevelOutput=kTRUE;
+       }
+       else if (toCompareTo.CompareTo("no")==0){
+         HLTInfo("Setting highLevelOutput to: %s", toCompareTo.Data());
+         fHighLevelOutput=kFALSE;
+       }
+       else {
+         HLTError("unknown argument for highLevelOutput: %s", toCompareTo.Data());
+         iResult=-EINVAL;
+         break;
+       }
+       continue;
+      }
+      else if (argument.CompareTo("-emulateHLToutput")==0) {
+       if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+       TString toCompareTo=((TObjString*)pTokens->At(i))->GetString();
+       if (toCompareTo.CompareTo("yes")==0){
+         HLTWarning("Setting emulateHLToutput to: %s", toCompareTo.Data());
+         fEmulateHLTTracks=kTRUE;
+       }
+       else if (toCompareTo.CompareTo("no")==0){
+         HLTInfo("Setting emulateHLToutput to: %s", toCompareTo.Data());
+         fEmulateHLTTracks=kFALSE;
+       }
+       else {
+         HLTError("unknown argument for emulateHLToutput: %s", toCompareTo.Data());
+         iResult=-EINVAL;
+         break;
+       }
+       continue;
+      }
+      else if (argument.CompareTo("-PIDmethod")==0) {
+       if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+       TString toCompareTo=((TObjString*)pTokens->At(i))->GetString();
+       if (toCompareTo.CompareTo("LH")==0){
+         HLTInfo("Setting PID method to: %s", toCompareTo.Data());
+         fPIDmethod=0;
+       }
+       else if (toCompareTo.CompareTo("NN")==0){
+         HLTInfo("Setting PID method to: %s", toCompareTo.Data());
+         fPIDmethod=1;
+       }
+       else if (toCompareTo.CompareTo("TM")==0){
+         HLTInfo("Setting PID method to: %s", toCompareTo.Data());
+         fPIDmethod=2;
+       }
+       else {
+         HLTError("unknown argument for PID method: %s", toCompareTo.Data());
+         iResult=-EINVAL;
+         break;
+       }
+       continue;
+      } 
+      
+      else {
+       HLTError("unknown argument: %s", argument.Data());
+       iResult=-EINVAL;
+       break;
+      }
+    }
+    delete pTokens;
+  }
+  if (bMissingParam) {
+    HLTError("missing parameter for argument %s", argument.Data());
+    iResult=-EINVAL;
+  }
+  if(iResult>=0){
+    iResult=SetParams();
+  }
+  return iResult;
+}
+
+int AliHLTTRDTrackerV1Component::SetParams()
+{
+  Int_t iResult=0;
+  if(!AliCDBManager::Instance()->IsDefaultStorageSet()){
+    HLTError("DefaultStorage is not set in CDBManager");
+    return -EINVAL;
+  }
+  if(AliCDBManager::Instance()->GetRun()<0){
+    HLTError("Run Number is not set in CDBManager");
+    return -EINVAL;
+  }
+  HLTInfo("CDB default storage: %s; RunNo: %i", (AliCDBManager::Instance()->GetDefaultStorage()->GetBaseFolder()).Data(), AliCDBManager::Instance()->GetRun());
+
+  if(!AliGeomManager::GetGeometry()){
+    if(fgeometryFileName.CompareTo("")==0 || !TFile::Open(fgeometryFileName.Data())){
+      HLTInfo("Loading standard geometry file");
+      AliGeomManager::LoadGeometry();
+    }else{
+      HLTWarning("Loading NON-standard geometry file");
+      AliGeomManager::LoadGeometry(fgeometryFileName.Data());
+    }
+    if(!AliGeomManager::GetGeometry()){
+      HLTError("Could not load geometry");
+      return -EINVAL;
+    }
+    HLTInfo("Applying Alignment from CDB object");
+    AliGeomManager::ApplyAlignObjsFromCDB("TRD");
+  }
+  else{
+    HLTInfo("Geometry Already Loaded!");
+  }
+  
+  if(fReconstructor->GetRecoParam()){
+    fRecoParam = new AliTRDrecoParam(*fReconstructor->GetRecoParam());
+    HLTInfo("RecoParam already set!");
+  }else{
+    if(fRecoParamType == 0){
+      HLTDebug("Low flux params init.");
+      fRecoParam = AliTRDrecoParam::GetLowFluxParam();
+    }
+    if(fRecoParamType == 1){
+      HLTDebug("High flux params init.");
+      fRecoParam = AliTRDrecoParam::GetHighFluxParam();
+    }
+    if(fRecoParamType == 2){
+      HLTDebug("Cosmic Test params init.");
+      fRecoParam = AliTRDrecoParam::GetCosmicTestParam();
+    }
+  }
+
+  if(!fRecoParam)
+    {
+      HLTError("No reco params initialized. Sniffing big trouble!");
+      return -EINVAL;
+    }
+
+  switch(fPIDmethod){
+  case 0: fRecoParam->SetPIDNeuralNetwork(kFALSE); break;
+  case 1: fRecoParam->SetPIDNeuralNetwork(kTRUE); break;
+  case 2: fRecoParam->SetPIDNeuralNetwork(kFALSE); break;
+  }
+
+  fRecoParam->SetImproveTracklets(fImproveTracklets);
+
+  fRecoParam->SetStreamLevel(AliTRDrecoParam::kTracker, 0);
+  fReconstructor->SetRecoParam(fRecoParam);
+
+  TString recoOptions="sa,!cw";
+  
+  if(fHLTflag)
+    recoOptions += ",hlt";
+
+  HLTDebug("Reconstructor options are: %s",recoOptions.Data());
+  fReconstructor->SetOption(recoOptions.Data());
+
+  return iResult;
+}
+
+int AliHLTTRDTrackerV1Component::Reconfigure(const char* cdbEntry, const char* chainId)
+{
+  // see header file for class documentation
+
+  int iResult=0;
+  const char* path="HLT/ConfigTRD/TrackerV1Component";
+  const char* defaultNotify="";
+  if (cdbEntry) {
+    path=cdbEntry;
+    defaultNotify=" (default)";
+  }
+  if (path) {
+    HLTInfo("reconfigure from entry %s%s, chain id %s", path, defaultNotify,(chainId!=NULL && chainId[0]!=0)?chainId:"<none>");
+    AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(path/*,GetRunNo()*/);
+    if (pEntry) {
+      TObjString* pString=dynamic_cast<TObjString*>(pEntry->GetObject());
+      if (pString) {
+       HLTInfo("received configuration object string: \'%s\'", pString->GetString().Data());
+       iResult=Configure(pString->GetString().Data());
+      } else {
+       HLTError("configuration object \"%s\" has wrong type, required TObjString", path);
+      }
+    } else {
+      HLTError("cannot fetch object \"%s\" from CDB", path);
+    }
+  }
+
+  return iResult;
+
+}
+
+int AliHLTTRDTrackerV1Component::ReadPreprocessorValues(const char* modules)
+{
+  // see header file for class documentation
+  
+  int iResult = 0;
+  TString str(modules);
+  if(str.Contains("HLT") || str.Contains("TRD") || str.Contains("GRP")){
+  
+  }  
+  return iResult;
+}
+
+void AliHLTTRDTrackerV1Component::GetOCDBObjectDescription(TMap* const targetMap){
+  // Get a list of OCDB object description needed for the particular component
+  if (!targetMap) return;
+  targetMap->Add(new TObjString("HLT/ConfigTRD/TrackerV1Component"), new TObjString("component arguments"));
+  targetMap->Add(new TObjString("TRD/Calib/ChamberGainFactor"), new TObjString("gain factor of chambers"));
+  targetMap->Add(new TObjString("TRD/Calib/ChamberT0"), new TObjString("T0 of chambers"));
+  targetMap->Add(new TObjString("TRD/Calib/ChamberVdrift"), new TObjString("drift velocity of chambers"));
+  targetMap->Add(new TObjString("TRD/Calib/DetNoise"), new TObjString("noise of chambers"));
+  targetMap->Add(new TObjString("TRD/Calib/LocalGainFactor"), new TObjString("per pad gain factor"));
+  targetMap->Add(new TObjString("TRD/Calib/LocalT0"), new TObjString("per pad T0"));
+  targetMap->Add(new TObjString("TRD/Calib/LocalVdrift"), new TObjString("per pad drift velocity"));
+  targetMap->Add(new TObjString("TRD/Calib/PadNoise"), new TObjString("per pad noise"));
+  targetMap->Add(new TObjString("TRD/Calib/PadStatus"), new TObjString("pad status"));
+  targetMap->Add(new TObjString("TRD/Calib/PRFWidth"), new TObjString("pad response function"));
+  targetMap->Add(new TObjString("TRD/Calib/ChamberStatus"), new TObjString("status of chambers"));
+  targetMap->Add(new TObjString("TRD/Calib/PIDLQ"), new TObjString("likelyhood PID"));
+  targetMap->Add(new TObjString("TRD/Calib/PIDNN"), new TObjString("neuronal network PID"));
+  targetMap->Add(new TObjString("TRD/Calib/PIDThresholds"), new TObjString("threshold for PID"));
+}