]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TRD/AliHLTTRDTrackerV1Component.cxx
HLTqadm
[u/mrichter/AliRoot.git] / HLT / TRD / AliHLTTRDTrackerV1Component.cxx
index 204fba649fdacebf73838585edf108d5a8451558..b1d3c5c6920d231e8839cedd87ab46b523c14bdb 100644 (file)
@@ -1,42 +1,41 @@
-// $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. */
-
-#if __GNUC__ >= 3
-using namespace std;
-#endif
+    @brief  A TRDTrackerV1 processing component for the HLT.
+*/
 
 #include "AliHLTTRDTrackerV1Component.h"
 #include "AliHLTTRDDefinitions.h"
-#include "AliHLTTRDCluster.h"
 #include "AliHLTTRDTrack.h"
+#include "AliHLTTRDUtils.h"
+#include "AliHLTTRDCluster.h"
 
 #include "TFile.h"
 #include "TChain.h"
 
 #include "AliGeomManager.h"
 #include "AliCDBManager.h"
+#include "AliCDBStorage.h"
+#include "AliCDBEntry.h"
 #include "AliESDEvent.h"
-#include "AliMagF.h"
 #include "AliESDfriend.h"
 
 #include "AliTRDcalibDB.h"
@@ -48,31 +47,43 @@ 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
+using namespace std;
+
+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");
+}
 
-ClassImp(AliHLTTRDTrackerV1Component);
-    
 AliHLTTRDTrackerV1Component::AliHLTTRDTrackerV1Component():
   AliHLTProcessor(),
-  fOutputPercentage(100), // By default we copy to the output exactly what we got as input  
-  fStrorageDBpath("local://$ALICE_ROOT"),
-  fCDB(NULL),
-  fGeometryFileName(""),
-  fUseHLTClusters(kFALSE),
-  fUseHLTTracks(kFALSE),
+  fOutputPercentage(100), // By default we copy to the output exactly what we got as input 
   fTracker(NULL),
   fRecoParam(NULL),
-  fReconstructor(NULL)
+  fReconstructor(NULL),
+  fESD(NULL),
+  fClusterArray(NULL),
+  fRecoParamType(-1),
+  fNtimeBins(-1),
+  fPIDmethod(1),
+  fgeometryFileName(""),
+  fHLTflag(kTRUE),
+  fOutputV1Tracks(kTRUE),
+  fHighLevelOutput(kFALSE),
+  fEmulateHLTTracks(kFALSE),
+  fImproveTracklets(kFALSE)
 {
   // Default constructor
 
-  fGeometryFileName = getenv("ALICE_ROOT");
-  fGeometryFileName += "/HLT/TRD/geometry.root";
 }
 
 AliHLTTRDTrackerV1Component::~AliHLTTRDTrackerV1Component()
@@ -90,20 +101,30 @@ 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 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;
+  if(sizeof(AliHLTTRDClustersArray::cluster_type) == sizeof(AliHLTTRDCluster)) inputMultiplier *= 28.0/8;
 }
 
 // Spawn function, return new instance of this class
@@ -112,329 +133,40 @@ AliHLTComponent* AliHLTTRDTrackerV1Component::Spawn()
   return new AliHLTTRDTrackerV1Component;
 };
 
-/**
- * Convert AliTRDtrackV1 to AliHLTTRDTrack 
- * Add HLTTrack to the output, defined by pointer
- * Fill block desctiptors 
- * Return size of the added to ouput objects
- */
-//============================================================================
-AliHLTUInt32_t AliHLTTRDTrackerV1Component::AddToOutput(TClonesArray* inTrackArray, AliHLTUInt8_t* output)
-{
-  cout << "\nWriting tracks to the Memory\n ============= \n";
-  AliTRDtrackV1* track = 0;
-  AliHLTUInt32_t addedSize = 0;
-  AliHLTUInt8_t *iterPtr = output;
-  AliHLTTRDTrack * outPtr = (AliHLTTRDTrack*)iterPtr;
-  
-  if (inTrackArray){
-    Int_t nbTracks  = inTrackArray->GetEntries();
-    for (Int_t iTrack = 0; iTrack<nbTracks; iTrack++){
-      AliHLTUInt32_t trackSize=0;
-      
-      track = dynamic_cast<AliTRDtrackV1*>(inTrackArray->At(iTrack));
-      //track->Print();
-      
-      AliHLTTRDTrack *hltTrack = new (outPtr) AliHLTTRDTrack(track);
-      trackSize = hltTrack->GetSize();
-      addedSize += trackSize;
-      HLTDebug("addedSize %i, trackSize %i", addedSize, trackSize);
-      
-      iterPtr += trackSize;
-      outPtr = (AliHLTTRDTrack*)iterPtr;
-    }
-  }
-  return addedSize;
-  
-}
 
 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_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
-  Bool_t bHLTMode = kTRUE, bWriteClusters = kFALSE;
-  
-  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 %lu %%", 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], "-cdb" ) == 0)
-       {
-         if ( i+1 >= argc )
-           {
-             HLTError( "Missing -cdb argument");
-             return ENOTSUP;         
-           }
-         fStrorageDBpath = argv[i+1];
-         HLTInfo("DB storage is %s", fStrorageDBpath.c_str() );          
-         i += 2;
-         
-       }      
-
-      else if ( strcmp( argv[i], "-geometry" ) == 0)
-       {
-         if ( i+1 >= argc )
-           {
-             HLTError("Missing -geometry argument");
-             return ENOTSUP;         
-           }
-         fGeometryFileName = argv[i+1];
-         HLTInfo("GeomFile storage is %s", 
-                 fGeometryFileName.c_str() );    
-         i += 2;
-         
-       }      
+  int iResult=0;
 
-      // 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], "-writeClusters" ) == 0)
-       {
-         bWriteClusters = kTRUE;
-         HLTDebug("input clusters are expected to be in a TTree.");
-         i++;
-       }
-      else if ( strcmp( argv[i], "-offlineMode" ) == 0)
-       {
-         bHLTMode=kFALSE;
-         HLTDebug("Using standard offline tracking.");
-         i++;
-       }
-      else if ( strcmp( argv[i], "-useHLTClusters" ) == 0)
-       {
-         fUseHLTClusters = kTRUE;
-         i++;
-         HLTInfo("expecting AliHLTCluster as input");
-       }
-      else if ( strcmp( argv[i], "-useHLTTracks" ) == 0)
-       {
-         fUseHLTTracks = kTRUE;
-         i++;
-         HLTInfo("Using AliHLTTrack to pass data further in the chain");
-       }
-      else {
-       HLTError("Unknown option '%s'", argv[i] );
-       return EINVAL;
-      }
-      
-    }
-
-  // THE "REAL" INIT COMES HERE
-  // offline condition data base
-  fCDB = AliCDBManager::Instance();
-  if (!fCDB)
-    {
-      HLTError("Could not get CDB instance", "fCDB 0x%x", fCDB);
-      return -1;
-    }
-  else
-    {
-      fCDB->SetRun(0); // THIS HAS TO BE RETRIEVED !!!
-      fCDB->SetDefaultStorage(fStrorageDBpath.c_str());
-      HLTDebug("CDB instance", "fCDB 0x%x", fCDB);
-    }
-
-  // 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.");
-      }
-  }
-  else {
-    HLTError("Magnetic field is already set and locked, cannot redefine it." );
+  fReconstructor = new AliTRDReconstructor();
+  HLTDebug("TRDReconstructor at 0x%x", fReconstructor);
+  fESD = new AliHLTTRDESDEvent();
+  fESD->CreateStdContent();
+
+  TString configuration="";
+  TString argument="";
+  for (int i=0; i<argc && iResult>=0; i++) {
+    argument=argv[i];
+    if (!configuration.IsNull()) configuration+=" ";
+    configuration+=argument;
   }
 
-  // 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 (iRecoParamType == 1)
-    {
-      fRecoParam = AliTRDrecoParam::GetHighFluxParam();
-      HLTDebug("High flux params init.");
-    }
-  
-  if (iRecoParamType == 2)
-    {
-      fRecoParam = AliTRDrecoParam::GetCosmicTestParam();
-      HLTDebug("Cosmic Test params init.");
-    }
+  if (!configuration.IsNull()) {
+    iResult=Configure(configuration.Data());
+  } else {
+    iResult=Reconfigure(NULL, NULL);
+  }
 
-  if (fRecoParam == 0)
-    {
-      HLTError("No reco params initialized. Sniffing big trouble!");
-      return -1;
-    }
+  if(iResult<0) return iResult;
 
-  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";
-  
-  fReconstructor->SetOption(recoOptions.Data());
-  HLTDebug("Reconstructor options are: %s",recoOptions.Data());
-  
-  if((AliGeomManager::GetGeometry()) == NULL){
-    
-    if ( TFile::Open(fGeometryFileName.c_str())) {
-      AliGeomManager::LoadGeometry(fGeometryFileName.c_str());
-    }
-    else {
-      HLTError("Cannot load geometry from file %s",fGeometryFileName.c_str());
-      return EINVAL;
-    }
-  }
-  else
-    HLTInfo("Geometry Already Loaded");
-  
-  // create the tracker
   fTracker = new AliTRDtrackerV1();
-  fTracker->SetReconstructor(fReconstructor);
   HLTDebug("TRDTracker at 0x%x", fTracker);
+  fTracker->SetReconstructor(fReconstructor);
 
-  if (fTracker == 0)
-    {
-      HLTError("Unable to create the tracker!");
-      return -1;
-    }
+  fClusterArray = new TClonesArray("AliTRDcluster"); // would be nice to allocate memory for all clusters here.
 
-  return 0;
+  return iResult;
 }
 
 int AliHLTTRDTrackerV1Component::DoDeinit()
@@ -443,13 +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.
-  fReconstructor->SetClusters(0x0);
+  // double deleting, since we delete TClonesArray by ourself.
+  //fReconstructor->SetClusters(0x0);
   delete fReconstructor;
-  fReconstructor = 0x0;
+  fReconstructor = NULL;
+  delete fESD;
+  fESD = NULL;
   
   AliTRDcalibDB::Terminate();
 
@@ -464,28 +202,18 @@ int AliHLTTRDTrackerV1Component::DoEvent( const AliHLTComponentEventData& evtDat
                                          vector<AliHLTComponent_BlockData>& outputBlocks )
 {
   // Process an event
-  Bool_t bWriteClusters = fReconstructor->IsWritingClusters();
 
-  HLTDebug("NofBlocks %lu", evtData.fBlockCnt );
+  HLTDebug("NofBlocks %i", evtData.fBlockCnt );
   
   AliHLTUInt32_t totalSize = 0, offset = 0;
-  AliHLTUInt32_t dBlockSpecification = 0;
 
-  vector<AliHLTComponent_DataType> expectedDataTypes;
-  GetInputDataTypes(expectedDataTypes);
-  if (evtData.fEventID == 1)
-    CALLGRIND_START_INSTRUMENTATION();
+  AliHLTComponentDataType expectedDataType = AliHLTTRDDefinitions::fgkClusterDataType;
   for ( unsigned long iBlock = 0; iBlock < evtData.fBlockCnt; iBlock++ ) 
     {
       const AliHLTComponentBlockData &block = blocks[iBlock];
-      offset = totalSize;
       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,
@@ -493,33 +221,105 @@ int AliHLTTRDTrackerV1Component::DoEvent( const AliHLTComponentEventData& evtDat
                    DataType2Text(inputDataType).c_str());
          continue;
        }
-      else 
-       HLTDebug("We get the right data type: Block # %i/%i; Event 0x%08LX (%Lu) Received datatype: %s",
-                   iBlock, evtData.fBlockCnt-1,
-                   evtData.fEventID, evtData.fEventID, 
-                   DataType2Text(inputDataType).c_str());
-      
-      
-      TTree *clusterTree = 0x0;
-      TClonesArray* clusterArray = 0x0;
-      ReadAndLoadClusters(clusterTree, clusterArray, &block);
+      else {
+       HLTDebug("We get the right data type: Block # %i/%i; Event 0x%08LX (%Lu) Received datatype: %s; Block Size: %i",
+                iBlock, evtData.fBlockCnt-1,
+                evtData.fEventID, evtData.fEventID, 
+                DataType2Text(inputDataType).c_str(),
+                block.fSize);
+      }
+
+#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 < %f; 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;
+      trdTracks = fTracker->GetListOfTracks();
       
-      // maybe it is not so smart to create it each event? clear is enough ?
-      AliESDEvent *esd = new AliESDEvent();
-      esd->CreateStdContent();
-      fTracker->Clusters2Tracks(esd);
-
-      //here transport the esd tracks further
-      Int_t nTracks = esd->GetNumberOfTracks();
-      Int_t nTRDTracks = esd->GetNumberOfTrdTracks();
-      HLTInfo("Number of tracks  == %d == Number of TRD tracks %d", nTracks, nTRDTracks);  
-
-      TClonesArray* trdTracks = fTracker->GetListOfTracks();
-   
-      if (trdTracks)
-       totalSize += TransportTracks(trdTracks, outputPtr, outputBlocks, offset, dBlockSpecification);
-      else 
-       HLTDebug("Bad array trdTracks = 0x%x", trdTracks);
+      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);
+       AliHLTUInt32_t addedSize = AliHLTTRDUtils::AddESDToOutput(fESD, outputPtr+offset);
+       totalSize += addedSize;
+         
+       // Fill block 
+       AliHLTComponentBlockData bd;
+       FillBlockData( bd );
+       //bd.fPtr = outputPtr;
+       bd.fOffset = offset;
+       bd.fSize = addedSize;
+       bd.fSpecification = block.fSpecification;
+       bd.fDataType = kAliHLTDataTypeTrack | kAliHLTDataOriginTRD;
+       outputBlocks.push_back( bd );
+       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 (fOutputV1Tracks && trdTracks){
+         HLTDebug("We have an output array: pointer to trdTracks = 0x%x, nbEntries = %i", trdTracks, trdTracks->GetEntriesFast());
+         
+         addedSize = AliHLTTRDUtils::AddTracksToOutput(trdTracks, outputPtr+offset, fNtimeBins);
+         totalSize += addedSize;
+         
+         // Fill block 
+         FillBlockData( bd );
+         //bd.fPtr = outputPtr;
+         bd.fOffset = offset;
+         bd.fSize = addedSize;
+         bd.fSpecification = block.fSpecification;
+         bd.fDataType = AliHLTTRDDefinitions::fgkTracksDataType;
+         outputBlocks.push_back( bd );
+         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;
+       }
+      }
+
       HLTDebug("totalSize: %i", totalSize);
       
 //       if ( totalSize > allocSize )
@@ -531,143 +331,328 @@ int AliHLTTRDTrackerV1Component::DoEvent( const AliHLTComponentEventData& evtDat
 
       //here we are deleting clusters (but not the TClonesArray itself)
       fTracker->UnloadClusters();
-
-      AliTRDReconstructor::SetClusters(0x0);
-      delete esd;
-      if (bWriteClusters)
-       delete clusterTree;
-      else{
-       //clusterArray->Delete();
-       delete clusterArray;
-      }
+      //AliTRDReconstructor::SetClusters(0x0);
+      fClusterArray->Delete();
       
     }
+      
   size = totalSize;
   HLTDebug("Event is done. size written to the output is %i", size);
-  //  CALLGRIND_STOP_INSTRUMENTATION();
   return 0;
 }
 
-
-/**
- * ReadClusters from the component input and load them to the tracker
- */
-//============================================================================
-void AliHLTTRDTrackerV1Component::ReadAndLoadClusters(TTree *inClusterTree, 
-                                                     TClonesArray *inClusterArray, const AliHLTComponentBlockData *inBlock)
-{
-  Bool_t bWriteClusters = fReconstructor->IsWritingClusters();
-  const AliHLTComponentBlockData &block = *inBlock;
-
-
-  TObject *tobjin = 0x0;
-  int ibForce = 0; // almost obsolet
-
-  if (bWriteClusters){
-    tobjin = (TObject *)GetFirstInputObject( AliHLTTRDDefinitions::fgkClusterDataType, "TTree", ibForce);
-    HLTDebug("1stBLOCK; Pointer = 0x%x", tobjin);
-    inClusterTree = (TTree*)tobjin;
-    if (inClusterTree)
-      {
-       HLTDebug("CLUSTERS; Pointer to TTree = 0x%x Name = %s", inClusterTree, inClusterTree->GetName());
-       HLTDebug("TTree of clusters: nbEntries = %i", inClusterTree->GetEntriesFast());
-       fTracker->LoadClusters(inClusterTree);
+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
-      {
-       HLTError("First Input Block is not a TTree 0x%x", tobjin);
+      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;
   }
-  else if (fUseHLTClusters)
-    {
-      inClusterArray = new TClonesArray("AliTRDcluster"); // would be nice to allocate memory for all clusters here.
-      ReadClusters(inClusterArray, block.fPtr, block.fSize);
-      HLTDebug("TClonesArray of clusters: nbEntries = %i", inClusterArray->GetEntriesFast());
-      fTracker->LoadClusters(inClusterArray);
+  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());
     }
-  else
-    {
-      tobjin = (TObject *)GetFirstInputObject( AliHLTTRDDefinitions::fgkClusterDataType, "TClonesArray", ibForce);
-      HLTDebug("1stBLOCK; Pointer = 0x%x", tobjin);
-      inClusterArray = (TClonesArray*)tobjin;
-      if (inClusterArray)
+    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){
+#ifndef HAVE_NOT_ALITRD_RECOPARAM_r41621
+      if(fHLTflag){
+       HLTInfo("Low flux HLT params init.");
+       fRecoParam = AliTRDrecoParam::GetLowFluxHLTParam();
+      }else
+#endif
        {
-         HLTDebug("CLUSTERS; Pointer to TClonesArray = 0x%x Name = %s", inClusterArray, inClusterArray->GetName());
-         HLTDebug("TClonesArray of clusters: nbEntries = %i", inClusterArray->GetEntriesFast());
-         fTracker->LoadClusters(inClusterArray);
+         HLTInfo("Low flux params init.");
+         fRecoParam = AliTRDrecoParam::GetLowFluxParam();
        }
-      else
+    }
+    if(fRecoParamType == 1){
+#ifndef HAVE_NOT_ALITRD_RECOPARAM_r41621
+      if(fHLTflag){
+       HLTInfo("High flux HLT params init.");
+       fRecoParam = AliTRDrecoParam::GetHighFluxHLTParam();
+      }else
+#endif
        {
-         HLTError("First Input Block not a TClonesArray 0x%x", tobjin);
+         HLTInfo("High flux params init.");
+         fRecoParam = AliTRDrecoParam::GetHighFluxParam();
        }
     }
-}
+    if(fRecoParamType == 2){
+      HLTInfo("Cosmic Test params init.");
+      fRecoParam = AliTRDrecoParam::GetCosmicTestParam();
+    }
+  }
 
-/**
- * Read cluster to the TClonesArray from the memory 
- */
-//============================================================================
-Int_t AliHLTTRDTrackerV1Component::ReadClusters(TClonesArray *outArray, void* inputPtr, AliHLTUInt32_t size)
-{
-  //HLTDebug("\nReading clusters from the Memory\n ============= \n");
-  AliHLTTRDCluster * curCluster;
-  UInt_t clusterSize = sizeof(AliHLTTRDCluster), curSize = 0;
-  Int_t i=0;
-  
-  curCluster = (AliHLTTRDCluster*) inputPtr;
-  while (curSize + clusterSize <= size)
+  if(!fRecoParam)
     {
-      //  HLTDebug(" fX = %f; fY = %f; fZ = %f", curCluster->fX, curCluster->fY, curCluster->fZ);
-
-      AliTRDcluster* curTRDCluster = new((*outArray)[i]) AliTRDcluster();
-      curCluster->ExportTRDCluster(curTRDCluster);
-      //      HLTDebug(" fX = %f; fY = %f; fZ = %f", curTRDCluster->GetX(), curTRDCluster->GetY(), curTRDCluster->GetZ());
-      curSize += clusterSize; 
-      i++;
-      curCluster++;
-      //cout << " current readed size is " << curSize << "/" << size << endl;
+      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";
   
-  return i;
+  if(fHLTflag)
+    recoOptions += ",hlt";
+
+  HLTDebug("Reconstructor options are: %s",recoOptions.Data());
+  fReconstructor->SetOption(recoOptions.Data());
+
+  return iResult;
 }
-/**
- * Transport tracks to the next component
- * Return Numbers of bytes written to the output
- */
-//============================================================================
-AliHLTUInt32_t AliHLTTRDTrackerV1Component::TransportTracks(TClonesArray *inTracksArray, AliHLTUInt8_t* output,
-                                                   vector<AliHLTComponent_BlockData>& outputBlocks, AliHLTUInt32_t inOffset, AliHLTUInt32_t inSpec)
-{
-  Int_t nbTracks=inTracksArray->GetEntriesFast();
-  if (nbTracks>0)
-    {
-      HLTDebug("We have an output array: pointer to inTracksArray = 0x%x, nbEntries = %i", inTracksArray, nbTracks);
-      if (fUseHLTTracks){
-       // Using low-level interface 
-       // with interface classes
-       AliHLTUInt32_t addedSize = AddToOutput(inTracksArray, output);
-       
-       // Fill block 
-       AliHLTComponentBlockData bd;
-       FillBlockData( bd );
 
-       bd.fPtr = output;
-       bd.fOffset = inOffset;
-       bd.fSize = addedSize;
-       bd.fSpecification = inSpec;
-       bd.fDataType = AliHLTTRDDefinitions::fgkTRDSATracksDataType;
-       outputBlocks.push_back( bd );
-       HLTDebug("BD fPtr 0x%x, fOffset %i, fSize %i, fSpec 0x%x", bd.fPtr, bd.fOffset, bd.fSize, bd.fSpecification);
-       
-       return addedSize;
-      }
-      else{
-       inTracksArray->BypassStreamer(kFALSE);
-       PushBack(inTracksArray, AliHLTTRDDefinitions::fgkTRDSATracksDataType);
-       return 0;
+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 0;
+  }
+
+  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"));
 }