changed back to unix style
authorjthaeder <jthaeder@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 30 Nov 2009 20:22:16 +0000 (20:22 +0000)
committerjthaeder <jthaeder@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 30 Nov 2009 20:22:16 +0000 (20:22 +0000)
HLT/BASE/AliHLTHOMERManager.cxx
HLT/BASE/AliHLTHOMERManager.h

index a175ae3..cf6c303 100644 (file)
-//-*- Mode: C++ -*-\r
-// $Id: AliHLTHOMERManager.cxx  $\r
-//**************************************************************************\r
-//* This file is property of and copyright by the ALICE HLT Project        * \r
-//* ALICE Experiment at CERN, All rights reserved.                         *\r
-//*                                                                        *\r
-//* Primary Authors: Jochen Thaeder <thaeder@kip.uni-heidelberg.de>        *\r
-//*                  for The ALICE HLT Project.                            *\r
-//*                                                                        *\r
-//* Permission to use, copy, modify and distribute this software and its   *\r
-//* documentation strictly for non-commercial purposes is hereby granted   *\r
-//* without fee, provided that the above copyright notice appears in all   *\r
-//* copies and that both the copyright notice and this permission notice   *\r
-//* appear in the supporting documentation. The authors make no claims     *\r
-//* about the suitability of this software for any purpose. It is          *\r
-//* provided "as is" without express or implied warranty.                  *\r
-//**************************************************************************\r
-\r
-/** @file   AliHLTHOMERManager.cxx\r
-    @author Jochen Thaeder\r
-    @date\r
-    @brief  Manger for HOMER in aliroot\r
-*/\r
-\r
-// see header file for class documentation\r
-// or\r
-// refer to README to build package\r
-// or\r
-// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt\r
-\r
-#if __GNUC__>= 3\r
-   using namespace std;\r
-#endif\r
-\r
-#define EVE_DEBUG 0\r
-\r
-#include "AliHLTHOMERManager.h"\r
-// -- -- -- -- -- -- -- \r
-#include "AliHLTHOMERLibManager.h"\r
-#include "AliHLTHOMERSourceDesc.h"\r
-#include "AliHLTHOMERBlockDesc.h"\r
-// -- -- -- -- -- -- -- \r
-#include "AliHLTGlobalTriggerDecision.h"\r
-#include "AliHLTTriggerDecision.h"\r
-//---------------------------\r
-\r
-ClassImp(AliHLTHOMERManager)\r
-\r
-/*\r
- * ---------------------------------------------------------------------------------\r
- *                            Constructor / Destructor\r
- * ---------------------------------------------------------------------------------\r
- */\r
-\r
-//##################################################################################\r
-  AliHLTHOMERManager::AliHLTHOMERManager() :\r
-  fLibManager(new AliHLTHOMERLibManager),\r
-  fStateHasChanged(kTRUE),\r
-  fProxyHandler(NULL),\r
-  fCurrentReader(NULL),\r
-  fReaderList(NULL),\r
-  fSourceList(NULL),\r
-  fNBlks(0),\r
-  fEventID(),\r
-  fCurrentBlk(0),\r
-  fAsyncBlockList(NULL),\r
-  fEventBuffer(NULL),\r
-  fBufferTopIdx(-1),\r
-  fBufferLowIdx(-1),\r
-  fCurrentBufferIdx(-1),\r
-  fNavigateBufferIdx(-1),\r
-  fConnected(kFALSE), \r
-  fTriggerString("ALL"), \r
-  fNEventsNotTriggered(0),\r
-  fRetryNextEvent(kFALSE) {\r
-  // see header file for class documentation\r
-  // or\r
-  // refer to README to build package\r
-  // or\r
-  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt\r
-\r
-}\r
-\r
-//##################################################################################\r
-AliHLTHOMERManager::~AliHLTHOMERManager() {\r
-  // see header file for class documentation\r
-\r
-  if ( fLibManager ) {\r
-\r
-    if ( fReaderList ) {\r
-      TIter next(fReaderList);\r
-      TObject * object = NULL;\r
-      while ( ( object = next()) )\r
-       fLibManager->DeleteReader(static_cast<AliHLTHOMERReader*>(object) );\r
-      \r
-      fReaderList->Clear();\r
-      delete fReaderList;\r
-    }\r
-    fReaderList = NULL;   \r
-    \r
-    delete fLibManager;\r
-  } \r
-  fLibManager = NULL;\r
-\r
-  if ( fProxyHandler != NULL )\r
-    delete fProxyHandler;\r
-  fProxyHandler = NULL;\r
-\r
-  if ( fSourceList != NULL )\r
-    delete fSourceList;\r
-  fSourceList = NULL;\r
-\r
-  if ( fEventBuffer ) {\r
-    fEventBuffer->Clear();\r
-    delete fEventBuffer;\r
-  }\r
-  fEventBuffer = NULL;\r
-\r
-  if ( fAsyncBlockList ) {\r
-    fAsyncBlockList->Clear();\r
-    delete fAsyncBlockList;\r
-  }\r
-  fAsyncBlockList = NULL;\r
-}\r
-\r
-//##################################################################################\r
-Int_t AliHLTHOMERManager::Initialize() {\r
-  // see header file for class documentation\r
-\r
-  Int_t iResult = 0;\r
-\r
-  // -- Initialize ProxyHandler\r
-  if ( !fProxyHandler )\r
-    fProxyHandler = new AliHLTHOMERProxyHandler();\r
-  \r
-  if ( fProxyHandler ) {\r
-    iResult = fProxyHandler->Initialize();\r
-    if (iResult)\r
-      HLTError(Form("Initialize of ProxyHandler failed."));\r
-  }\r
-  else {\r
-    iResult = -1;\r
-    HLTError(Form("Creating of ProxyHandler failed."));\r
-  }\r
\r
-  // -- Initialize ReaderList\r
-  //    List ist not owner, as reader have to be created/deleted by the LibManager\r
-  if( !fReaderList )\r
-    fReaderList = new TList();\r
-  \r
-  // -- Initialize asynchronous BlockList\r
-  if( !fAsyncBlockList ) {\r
-    fAsyncBlockList = new TList();\r
-    fAsyncBlockList->SetOwner(kFALSE);\r
-  }\r
-\r
-  // -- Initialize Event Buffer and EventID array\r
-  if ( !fEventBuffer ) {\r
-    fEventBuffer = new TClonesArray( "TList", BUFFERSIZE );\r
-  }\r
-\r
-  for ( Int_t idx = 0; idx < BUFFERSIZE; ++idx ) {\r
-    new ((*fEventBuffer)[idx]) TList( );\r
-    (reinterpret_cast<TList*>((*fEventBuffer)[idx]))->SetOwner(kTRUE);\r
-    \r
-    fEventID[idx] = 0;\r
-  }\r
-\r
-  return iResult;\r
-}\r
-\r
-/*\r
- * ---------------------------------------------------------------------------------\r
- *                                 Source Handling\r
- * ---------------------------------------------------------------------------------\r
- */\r
-\r
-//##################################################################################\r
-Int_t AliHLTHOMERManager::CreateSourcesList() {\r
-  // see header file for class documentation\r
-\r
-  Int_t iResult = 0;\r
-  \r
-  if ( fSourceList != NULL )\r
-    delete fSourceList;\r
-  fSourceList = NULL;\r
-\r
-  fSourceList = new TList();\r
-  fSourceList->SetOwner( kTRUE );\r
-\r
-  iResult = fProxyHandler->FillSourceList( fSourceList );\r
-  if ( iResult < 0 ) {\r
-    HLTWarning(Form("There have been errors, while creating the sources list."));\r
-  }\r
-  else if ( iResult > 0 ) {\r
-    HLTWarning(Form("No active services found."));\r
-  }\r
-  else if ( fSourceList->IsEmpty() ) {\r
-    HLTWarning(Form("No active services in the list."));\r
-    iResult = 2;\r
-  }\r
-  else {\r
-     HLTInfo(Form("New sources list created."));\r
-\r
-    // -- New SourceList has been created \r
-    // --> All Sources are new --> State has changed\r
-    fStateHasChanged = kTRUE;\r
-  }\r
-\r
-  return iResult;\r
-}\r
-\r
-//##################################################################################\r
-void AliHLTHOMERManager::SetSourceState( AliHLTHOMERSourceDesc * source, Bool_t state ) {\r
-  // see header file for class documentation\r
-\r
-  if ( source->IsSelected() != state ) {\r
-    source->SetState( state );\r
-    fStateHasChanged = kTRUE;\r
-  }\r
-\r
-  return;\r
-}\r
-\r
-/*\r
- * ---------------------------------------------------------------------------------\r
- *                         Connection Handling - public\r
- * ---------------------------------------------------------------------------------\r
- */\r
-\r
-//##################################################################################\r
-Int_t AliHLTHOMERManager::ConnectHOMER( TString detector ){\r
-  // see header file for class documentation\r
-\r
-  Int_t iResult = 0;\r
-\r
-  // -- Check if LibManager is present\r
-  if ( ! fLibManager ) {\r
-    HLTError(Form("No LibManager present."));\r
-    return -1;\r
-  }\r
-  \r
-  // -- Check if already connected and state has not changed\r
-  if ( fStateHasChanged == kFALSE && IsConnected() ) {\r
-    HLTInfo(Form("No need for reconnection."));\r
-    return 0;\r
-  }\r
-  \r
-  // -- If already connected, disconnect before connect\r
-  //    or if ReaderList already filled\r
-  if ( IsConnected() || fReaderList->GetSize() != 0 )\r
-    DisconnectHOMER();\r
-  \r
-  // -- Create the Readoutlist\r
-  UShort_t* sourcePorts = new UShort_t [fSourceList->GetEntries()];\r
-  const Char_t ** sourceHostnames = new const Char_t* [fSourceList->GetEntries()];\r
-  UInt_t sourceCount = 0;\r
-\r
-  CreateReadoutList( sourceHostnames, sourcePorts, sourceCount, detector );\r
-  if ( sourceCount == 0 ) {\r
-    HLTError(Form("No sources selected, aborting."));\r
-    return -2;\r
-  }\r
-\r
-  // ***\r
-  // *** Connect to data sources\r
-  // ***\r
-  \r
-  for (UInt_t idx = 0; idx < sourceCount; idx++) {\r
-    \r
-    HLTInfo(Form("Adding source %d as %s : %d", idx, sourceHostnames[idx], sourcePorts[idx]));\r
-    \r
-    fReaderList->Add(dynamic_cast<TObject*>(fLibManager->OpenReader(sourceHostnames[idx], sourcePorts[idx])));\r
-    AliHLTHOMERReader *reader = static_cast<AliHLTHOMERReader*>(fReaderList->Last());\r
-    if ( !reader ) {\r
-      HLTError(Form("Adding reader failed, aborting"));\r
-      return -3;\r
-    }\r
-\r
-    if ( (iResult = reader->GetConnectionStatus()) )  {\r
-\r
-      // -- Connection to source failed\r
-      \r
-      HLTError(Form("Error establishing connection to TCP source %s:%hu: %s (%d)",\r
-                   sourceHostnames[idx], sourcePorts[idx], strerror(iResult), iResult));\r
-\r
-      if( !(TString(sourceHostnames[idx]).CompareTo("localhost")) ) {\r
-       HLTInfo("The failed connection is on localhost. is SSH tunnel up????? ");\r
-       HLTInfo(Form("Do: 'ssh -L %d:alihlt-vobox0.cern.ch:%d cernUser@lxplus.cern.ch -fN'",\r
-                    sourcePorts[idx], sourcePorts[idx]));\r
-      }\r
-      \r
-      // -- Remove reader\r
-      fReaderList->RemoveLast();\r
-\r
-      if ( reader )\r
-       fLibManager->DeleteReader( reader );\r
-      reader = NULL;\r
-      \r
-      HLTInfo(Form("Removed source %d,  %s : %d from sourceList", idx, sourceHostnames[idx], sourcePorts[idx]));\r
-      \r
-    } \r
-    else {\r
-      // -- Connection succeded\r
-      fConnected = kTRUE;\r
-\r
-      HLTInfo(Form("Connection established to source %s on port %d", sourceHostnames[idx], sourcePorts[idx]));\r
-    }\r
-    \r
-  } // for (Int_t idx = 0; idx < sourceCount; idx++) {\r
-  \r
-  delete[] sourceHostnames;\r
-  delete[] sourcePorts;\r
-\r
-  return iResult;\r
-\r
-}\r
-\r
-//##################################################################################\r
-void AliHLTHOMERManager::DisconnectHOMER(){\r
-  // see header file for class documentation\r
-\r
-  if ( ! IsConnected() )\r
-    return;\r
-\r
-  if ( fReaderList && fLibManager ) {\r
-    TIter next(fReaderList);\r
-    TObject * object = NULL;\r
-    while ( ( object = next()) ) \r
-      fLibManager->DeleteReader(static_cast<AliHLTHOMERReader*>(object) );\r
-      \r
-    fReaderList->Clear();\r
-    delete fReaderList;\r
-    fReaderList = NULL;\r
-  }\r
-  \r
-  fStateHasChanged = kTRUE;\r
-  fConnected = kFALSE;\r
-\r
-  HLTInfo(Form("Connection closed."));\r
-\r
-  return;\r
-}\r
-\r
-//##################################################################################\r
-Int_t AliHLTHOMERManager::ReconnectHOMER( TString detector="" ){\r
-  // see header file for class documentation\r
-  \r
-  Int_t iResult = 0;\r
-\r
-  if ( IsConnected() )\r
-    DisconnectHOMER();\r
-\r
-  iResult = ConnectHOMER(detector);\r
-  if ( iResult ) {\r
-    HLTError(Form("Error reconnecting."));\r
-  }\r
-\r
-  return iResult;\r
-}\r
-\r
-/*\r
- * ---------------------------------------------------------------------------------\r
- *                            Event Handling - public\r
- * ---------------------------------------------------------------------------------\r
- */\r
-\r
-//##################################################################################\r
-Int_t AliHLTHOMERManager::NextEvent(){\r
\r
-  // see header file for class documentation\r
-  \r
-\r
-  Int_t iResult = 0;\r
-  Int_t iRetryCount = 0;\r
-  \r
-  if ( !IsConnected() || fStateHasChanged ) \r
-    ConnectHOMER();\r
-  \r
-  if ( !IsConnected() ) {\r
-    HLTWarning(Form( "Not connected yet." ));\r
-    return -1;\r
-  }\r
-\r
-  // -- Reset asyncronous BlockList\r
-  fAsyncBlockList->Clear();\r
-\r
-  // ***\r
-  // *** Loop over all readers and get new event data\r
-  // ***\r
-  \r
-  TIter next(fReaderList);\r
-  TObject * object = NULL;\r
-  \r
-  while( (object = next()) ) {\r
-    \r
-    fCurrentReader = static_cast<AliHLTHOMERReader*>(object);\r
-    \r
-    // -- Read next event data and error handling for HOMER (error codes and empty blocks)\r
-    while ( 1 ) {\r
-      \r
-      iResult = fCurrentReader->ReadNextEvent( 40000000 /*timeout in us*/);\r
-      \r
-      if ( iResult == 111 || iResult == 32 || iResult == 6 ) {\r
-       HLTError(Form("No connection to source %d: %s (%d)", \r
-                     fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));\r
-       break;\r
-      } \r
-      else if ( iResult == 110 ) {\r
-       HLTError(Form("Timeout occured, reading event from source %d: %s (%d)", \r
-                     fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));\r
-       break;\r
-      } \r
-      else if ( iResult == 56 ) {\r
-       ++iRetryCount;\r
-      \r
-       if ( iRetryCount >= 20 ) {\r
-         HLTError(Form("Retry Failed: Error reading event from source %d: %s (%d), returning", \r
-                       fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));\r
-         break;\r
-       } \r
-       else {\r
-         HLTError(Form("Retry: Error reading event from source %d: %s (%d), making another attempt (no %d out of 20)", \r
-                       fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult, iRetryCount));\r
-         //break;\r
-         continue;\r
-       }\r
-      }\r
-      else if ( iResult ) {\r
-       HLTError(Form("General Error reading event from source %d: %s (%d), giving up", \r
-                     fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));\r
-       fConnected = kFALSE;\r
-       break;\r
-      } \r
-      else {\r
-       break;\r
-      }\r
-\r
-    } // while( 1 ) {\r
-    \r
-    \r
-    // -- Check if event could be read\r
-    if ( iResult )\r
-      continue;\r
-\r
-    // -- Handle Blocks from current reader\r
-    iResult = HandleBlocks();\r
-    if ( iResult ) {\r
-      HLTError(Form("Handling of blocks failed."));\r
-    }\r
-\r
-  } // while( (object = next()) ) {\r
-\r
-  // -- Check if NextEvent should be recalled, \r
-  //    to catch the next event with a trigger\r
-  if ( fRetryNextEvent ) {\r
-    usleep(1000000);\r
-    fRetryNextEvent = kFALSE;\r
-    \r
-    HLTInfo(Form("Checked trigger of %d events, without triggering", fNEventsNotTriggered));\r
-    return NextEvent();\r
-  }\r
-  else\r
-    return 0;  \r
-}\r
-\r
-/* ---------------------------------------------------------------------------------\r
- *                           Buffer Handling - public\r
- * ---------------------------------------------------------------------------------\r
- */\r
-\r
-//##################################################################################\r
-Int_t AliHLTHOMERManager::NavigateEventBufferBack() { \r
-  // see header file for class documentation\r
-\r
-  // -- reached the end of the buffer\r
-  if ( fNavigateBufferIdx == fBufferLowIdx )\r
-    return -1;\r
-\r
-  Int_t newIdx = fNavigateBufferIdx - 1;\r
-  if ( newIdx == -1 )\r
-    newIdx = BUFFERSIZE-1;\r
-\r
-  fCurrentBufferIdx = fNavigateBufferIdx = newIdx;\r
-\r
-  return newIdx;\r
-}\r
-\r
-//##################################################################################\r
-Int_t AliHLTHOMERManager::NavigateEventBufferFwd() {\r
-  // see header file for class documentation\r
-\r
-  // -- reached the top of the buffer\r
-  if ( fNavigateBufferIdx == fBufferTopIdx )\r
-    return -1;\r
-\r
-  Int_t newIdx = fNavigateBufferIdx + 1;\r
-  if ( newIdx == BUFFERSIZE )\r
-    newIdx = 0;\r
-  \r
-  fCurrentBufferIdx = fNavigateBufferIdx = newIdx;\r
-\r
-  return newIdx;\r
-}\r
-\r
- ///////////////////////////////////////////////////////////////////////////////////\r
-\r
-/*\r
- * ---------------------------------------------------------------------------------\r
- *                            Connection Handling - private\r
- * ---------------------------------------------------------------------------------\r
- */\r
-\r
-//##################################################################################\r
-void AliHLTHOMERManager::CreateReadoutList( const char** sourceHostnames, UShort_t *sourcePorts, \r
-                                           UInt_t &sourceCount, TString detector ){\r
-  // see header file for class documentation\r
-\r
-  AliHLTHOMERSourceDesc * source= NULL;\r
-\r
-  // -- Read all sources and check if they should be read out\r
-  TIter next( fSourceList );\r
-  while ( ( source = dynamic_cast<AliHLTHOMERSourceDesc*>(next()) ) ) {\r
-\r
-    // -- If detector NO detector name given\r
-    if ( ! detector.CompareTo("ALL") ) {\r
-      // -- Continue if source is not selected\r
-      if ( ! source->IsSelected() )\r
-       continue;\r
-    }\r
-    // -- DetectorName given\r
-    else {\r
-      // -- Continue if detector name doesn't match\r
-      if ( detector.CompareTo(source->GetDetector()) )\r
-       continue;\r
-      else\r
-       source->Select();\r
-    }\r
-    \r
-    Bool_t exists = kFALSE;\r
-    \r
-    // -- Loop over existing entries and check if entry is already in readout list\r
-    for ( UInt_t ii = 0; ii < sourceCount; ii++ ){\r
-      if ( !strcmp( sourceHostnames[ii], source->GetHostname().Data() ) \r
-          && sourcePorts[ii] == source->GetPort() ) {\r
-       exists = kTRUE;\r
-       break;\r
-      }\r
-    }\r
-\r
-    // -- Add new entires to readout list\r
-    if ( ! exists ) {\r
-      sourcePorts[sourceCount] = source->GetPort();\r
-      sourceHostnames[sourceCount] = source->GetHostname().Data();\r
-      sourceCount++;\r
-    }\r
-\r
-  } // while ( ( source = (AliHLTHOMERSourceDesc*)next() ) ) {\r
-\r
-  fStateHasChanged = kFALSE;\r
-\r
-  return;\r
-}\r
-\r
-/*\r
- * ---------------------------------------------------------------------------------\r
- *                          Buffer Handling - private\r
- * ---------------------------------------------------------------------------------\r
- */\r
-\r
-//##################################################################################\r
-void AliHLTHOMERManager::AddBlockListToBuffer() {\r
-  // see header file for class documentation\r
-\r
-  // -- Check if event is already in buffer\r
-  ULong_t eventID = static_cast<ULong64_t>(fCurrentReader->GetEventID());  \r
-  \r
-  if ( fEventID[fBufferTopIdx] == eventID ) {\r
-    HLTInfo(Form("Event 0x%016LX (%Lu) already in buffer.", eventID, eventID));\r
-    return;\r
-  }\r
-\r
-  // -- Check if event should be selected on basis of trigger string\r
-  if( fTriggerString.CompareTo("ALL") ){\r
-    if ( !CheckTriggerDecision() ) {\r
-      HLTInfo(Form("Event 0x%016LX (%Lu) is not triggered by %s.", \r
-                  eventID, eventID, fTriggerString.Data()));\r
-      return;\r
-    }\r
-  }\r
-  else {\r
-    HLTInfo("No trigger selection.");\r
-  }\r
-\r
-  // -- Set Top mark \r
-  ++fBufferTopIdx;\r
-  if ( fBufferTopIdx == BUFFERSIZE )\r
-    fBufferTopIdx = 0;\r
-\r
-  // -- Change the low mark if necessary\r
-  if ( fBufferLowIdx == -1 )\r
-    fBufferLowIdx = 0;\r
-  else if ( fBufferTopIdx == fBufferLowIdx ) {\r
-    ++fBufferLowIdx;\r
-    if ( fBufferLowIdx == BUFFERSIZE )\r
-      fBufferLowIdx = 0;\r
-  }\r
-\r
-  fNavigateBufferIdx = fCurrentBufferIdx = fBufferTopIdx;    \r
-\r
-  // -- Fill EventID\r
-  fEventID[fBufferTopIdx] = eventID;\r
-\r
-  // -- Clear Buffer slot\r
-  (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Clear();\r
-\r
-\r
-  GetFirstBlk();\r
-\r
-  // -- Fill block list\r
-  do {\r
-\r
-    // -- Create new block\r
-    AliHLTHOMERBlockDesc * block = new AliHLTHOMERBlockDesc();\r
-    block->SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),\r
-                    GetBlkType(), GetBlkSpecification() );\r
-    \r
-    // -- Check sources list if block is requested\r
-    if ( CheckIfRequested( block ) ) {\r
-      (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Add( block );\r
-    }\r
-    else {\r
-      // XXX HACK Jochen\r
-      (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Add( block );\r
-      // delete block;\r
-      // block = NULL;\r
-    }\r
\r
-  } while( GetNextBlk() );\r
-\r
-  return;\r
-}\r
-\r
-//##################################################################################\r
-void AliHLTHOMERManager::AddToAsyncBlockList() {\r
-  // see header file for class documentation\r
-\r
-  HLTInfo("Adding blocks to the asynchroneous block list");\r
-\r
-\r
-  GetFirstBlk();\r
-\r
-  // -- Fill block list\r
-  do {\r
-    \r
-\r
-    // -- Create new block\r
-    AliHLTHOMERBlockDesc * block = new AliHLTHOMERBlockDesc();\r
-    block->SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),\r
-                    GetBlkType(), GetBlkSpecification() );\r
-    \r
-    // -- Check sources list if block is requested\r
-    if ( CheckIfRequested( block ) ) \r
-      fAsyncBlockList->Add( block );\r
-    else {\r
-      // XXX HACK Jochen\r
-      fAsyncBlockList->Add( block );\r
-      // delete block;\r
-      // block = NULL;\r
-    }\r
\r
-  } while( GetNextBlk() );\r
-\r
-  return;\r
-}\r
-//##################################################################################\r
-TList* AliHLTHOMERManager::GetBlockListEventBuffer( Int_t idx ) {\r
-  // see header file for class documentation\r
-\r
-  if ( idx == -1 )\r
-    return NULL;\r
-\r
-  return reinterpret_cast<TList*>((*fEventBuffer)[idx]);\r
-\r
-}\r
-\r
-/*\r
- * ---------------------------------------------------------------------------------\r
- *                          Block Handling - private\r
- * ---------------------------------------------------------------------------------\r
- */\r
-\r
-//##################################################################################\r
-Int_t AliHLTHOMERManager::HandleBlocks() {\r
-  // see header file for class documentation\r
-  \r
-  Int_t iResult = 0;\r
-\r
-  // -- Get blockCnt and eventID\r
-  fNBlks = static_cast<ULong_t>(fCurrentReader->GetBlockCnt());\r
-  ULong_t eventID = static_cast<ULong64_t>(fCurrentReader->GetEventID());  \r
-  fCurrentBlk = 0;\r
-\r
-  // -- Check if blocks present\r
-  if ( fNBlks ==  0 ) {\r
-    HLTWarning(Form("Event 0x%016LX (%Lu) with no blocks", eventID, eventID));\r
-    return -1;\r
-  }\r
-\r
-  HLTInfo(Form("Event 0x%016LX (%Lu) with %lu blocks", eventID, eventID, fNBlks));\r
-\r
-#if 1// EVE_DEBUG\r
-  // Loop for Debug only\r
-  for ( ULong_t ii = 0; ii < fNBlks; ii++ ) {\r
-    Char_t tmp1[9], tmp2[5];\r
-    memset( tmp1, 0, 9 );\r
-    memset( tmp2, 0, 5 );\r
-    void *tmp11 = tmp1;\r
-    ULong64_t* tmp12 = static_cast<ULong64_t*>(tmp11);\r
-    *tmp12 = fCurrentReader->GetBlockDataType(ii);\r
-    void *tmp21 = tmp2;\r
-    ULong_t* tmp22 = static_cast<ULong_t*>(tmp21);\r
-    *tmp22 = fCurrentReader->GetBlockDataOrigin(ii);\r
-    HLTInfo(Form( "Block %lu length: %lu - type: %s - origin: %s - spec 0x%08X",\r
-                 ii, fCurrentReader->GetBlockDataLength(ii), tmp1, tmp2, fCurrentReader->GetBlockDataSpec(ii) ));\r
-  } // end for ( ULong_t ii = 0; ii < fNBlks; ii++ ) {\r
-#endif\r
-    \r
-  // -- Check if blocks are from syncronous source\r
-\r
-  if ( IsSyncBlocks() )\r
-    AddBlockListToBuffer();\r
-  else\r
-    AddToAsyncBlockList();\r
-    \r
-  return iResult;\r
-}\r
-\r
-//##################################################################################\r
-Bool_t AliHLTHOMERManager::IsSyncBlocks() {\r
-  // see header file for class documentation\r
-  \r
-  Bool_t bResult = kFALSE;\r
-\r
-  GetFirstBlk();\r
-  \r
-  do {\r
-  \r
-          \r
-    //    if ( !GetBlkType().CompareTo("ALIESDV0") ||\r
-   \r
-    if ( !GetBlkType().CompareTo("ALIESDV0")  ||\r
-        !GetBlkType().CompareTo("CLUSTERS")  ) {\r
-      \r
-      bResult = kTRUE;\r
-      break;\r
-    \r
-    }\r
-    \r
-    if ( !GetBlkType().CompareTo("ROOTTOBJ") ) {\r
-      AliHLTHOMERBlockDesc blockDesc;\r
-      \r
-      blockDesc.SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),\r
-                         GetBlkType(), GetBlkSpecification() );\r
-      if ( !blockDesc.GetClassName().CompareTo("AliHLTGlobalTriggerDecision") ) {\r
-\r
-       bResult = kTRUE;\r
-       break;\r
-      }\r
-    }\r
-\r
-  } while( GetNextBlk() );\r
-\r
-\r
-  return bResult;\r
-}\r
-\r
-//##################################################################################\r
-void* AliHLTHOMERManager::GetBlk( Int_t ndx ) {\r
-  // see header file for class documentation\r
-  // Get pointer to current block in current event\r
-   \r
-  if ( !fCurrentReader || !IsConnected() ) {\r
-    HLTError(Form("Not connected yet."));\r
-    return NULL;\r
-  }\r
-  if ( ndx < static_cast<Int_t>(fNBlks) )\r
-    return  const_cast<void*> (fCurrentReader->GetBlockData(ndx));\r
-  else\r
-    return NULL;\r
-}\r
-\r
-//##################################################################################\r
-ULong_t AliHLTHOMERManager::GetBlkSize( Int_t ndx ) {\r
-  // see header file for class documentation\r
-   \r
-  if ( !fCurrentReader || !IsConnected() ) {\r
-    HLTError(Form("Not connected yet."));\r
-    return 0;\r
-  }\r
-  \r
-  if ( ndx < static_cast<Int_t>(fNBlks) )\r
-    return static_cast<ULong_t> (fCurrentReader->GetBlockDataLength(ndx));\r
-  else\r
-    return 0;\r
-}\r
-\r
-//##################################################################################\r
-TString AliHLTHOMERManager::GetBlkOrigin( Int_t ndx ) {\r
-  // see header file for class documentation\r
-\r
-  TString origin = "";\r
-\r
-  // -- Check for Connection\r
-  if ( !fCurrentReader || ! IsConnected() ) {\r
-    HLTError(Form("Not connected yet."));\r
-    return origin;\r
-  }\r
-\r
-  // -- Check block index\r
-  if ( ndx >= static_cast<Int_t>(fNBlks) ) {\r
-    HLTError(Form("Block index %d out of range.", ndx ));\r
-    return origin;\r
-  }\r
-\r
-  // -- Get origin\r
-  union{\r
-    UInt_t data;\r
-    Char_t array[4];\r
-  } reverseOrigin;\r
-\r
-  reverseOrigin.data = static_cast<UInt_t>(fCurrentReader->GetBlockDataOrigin(ndx));\r
-\r
-  // -- Reverse the order\r
-  for (Int_t ii = 3; ii >= 0; ii-- )\r
-    if ( reverseOrigin.array[ii] != ' ')\r
-      origin.Append( reverseOrigin.array[ii] );\r
-\r
-  origin.Remove( TString::kTrailing, ' ' );\r
-\r
-  return origin;\r
-}\r
-\r
-//##################################################################################\r
-TString AliHLTHOMERManager::GetBlkType( Int_t ndx ) {\r
-  // see header file for class documentation\r
-\r
-  TString type = "";\r
-\r
-  // -- Check for Connection\r
-  if ( !fCurrentReader || ! IsConnected() ) {\r
-    HLTError(Form("Not connected yet."));\r
-    return type;\r
-  }\r
-\r
-  // -- Check block index\r
-  if ( ndx >= static_cast<Int_t>(fNBlks) ) {\r
-    HLTError(Form("Block index %d out of range.", ndx ));\r
-    return type;\r
-  }\r
-\r
-  // -- Get type\r
-  union{\r
-    ULong64_t data;\r
-    Char_t array[8];\r
-  } reverseType;\r
-\r
-  reverseType.data = static_cast<ULong64_t> (fCurrentReader->GetBlockDataType(ndx));\r
-\r
-  // -- Reverse the order\r
-  for (Int_t ii = 7; ii >= 0; ii-- )\r
-    if ( reverseType.array[ii] != ' ')\r
-      type.Append( reverseType.array[ii] );\r
-  \r
-  type.Remove( TString::kTrailing, ' ' );\r
-\r
-  return type;\r
-}\r
-\r
-//##################################################################################\r
-ULong_t AliHLTHOMERManager::GetBlkSpecification( Int_t ndx ) {\r
-  // see header file for class documentation\r
-\r
-  // -- Check for Connection\r
-  if ( !fCurrentReader || ! IsConnected() ) {\r
-    HLTError(Form("Not connected yet."));\r
-    return 0;\r
-  }\r
-\r
-  // -- Check block index\r
-  if ( ndx >= static_cast<Int_t>(fNBlks) ) {\r
-    HLTError(Form("Block index %d out of range.", ndx ));\r
-    return 0;\r
-  }\r
-\r
-  return static_cast<ULong_t>(fCurrentReader->GetBlockDataSpec(ndx));\r
-}\r
-\r
-//##################################################################################\r
-Bool_t AliHLTHOMERManager::CheckIfRequested( AliHLTHOMERBlockDesc * block ) {\r
-  // see header file for class documentation\r
-\r
-  Bool_t requested = kFALSE;\r
-\r
-  AliHLTHOMERSourceDesc * source= NULL;\r
-\r
-  // -- Read all sources and check if they should be read out\r
-  TIter next( fSourceList );\r
-  while ( ( source = dynamic_cast<AliHLTHOMERSourceDesc*>(next()) ) ) {\r
-    \r
-    // -- Check if source is selected\r
-    if ( ! source->IsSelected() )\r
-      continue;\r
-    \r
-    // -- Check if detector matches\r
-    if ( source->GetSourceName().CompareTo( block->GetBlockName() ) )\r
-      continue;\r
-\r
-    requested = kTRUE;\r
-    break;\r
-\r
-  } // while ( ( source = dynamic_cast<AliHLTHOMERSourceDesc*>(next()) ) ) {\r
-  \r
-#if EVE_DEBUG\r
-  if ( requested ) {\r
-    HLTInfo(Form("Block requested : %s", block->GetBlockName().Data())); \r
-  }\r
-  else {\r
-    HLTInfo(Form("Block NOT requested : %s", block->GetBlockName().Data())); \r
-  }\r
-#endif\r
-\r
-  return requested;\r
-}\r
-\r
-/* ---------------------------------------------------------------------------------\r
- *                          Trigger Handling - private\r
- * ---------------------------------------------------------------------------------\r
- */\r
-\r
-//##################################################################################\r
-Bool_t AliHLTHOMERManager::CheckTriggerDecision() {\r
-  // see header file for class documentation\r
-\r
-  Bool_t triggered = kFALSE;\r
-\r
-  if ( !fCurrentReader || !IsConnected() ) {\r
-    HLTError(Form("Not connected yet."));\r
-    return NULL;\r
-  }\r
-\r
-  AliHLTHOMERBlockDesc blockDesc;\r
-\r
-  GetFirstBlk();\r
-  \r
-  // -- Fill block list\r
-  Bool_t foundTriggerBlock = kFALSE;\r
-  \r
-  do {\r
-    if ( (GetBlkType().CompareTo("ROOTTOBJ") == 0) ) {\r
-      blockDesc.SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),\r
-                         GetBlkType(), GetBlkSpecification() );\r
-\r
-      if ( ! blockDesc.GetClassName().CompareTo("AliHLTGlobalTriggerDecision") ) {\r
-\r
-       foundTriggerBlock = kTRUE;\r
-       break;\r
-      }\r
-      \r
-    }\r
-  } while( GetNextBlk() );\r
-  \r
-  if ( !foundTriggerBlock ) {\r
-    HLTError(Form("No trigger decision object found"));\r
-    return kFALSE;\r
-  }\r
-\r
-  // -- Get the global decision object\r
-  AliHLTGlobalTriggerDecision* globalDecision = \r
-    static_cast<AliHLTGlobalTriggerDecision*>(blockDesc.GetTObject());\r
-\r
-  if ( fTriggerString.CompareTo("HLTGlobalTrigger") == 0 ) {\r
-    triggered = globalDecision->EventTriggered();\r
-  } \r
-  else {\r
-    \r
-    for (Int_t idx = 0; idx < globalDecision->NumberOfInputObjects(); idx++) {\r
-       \r
-      const AliHLTTriggerDecision* triggerDecision = \r
-       reinterpret_cast<const AliHLTTriggerDecision*>(globalDecision->InputObject(idx));\r
-    \r
-      if ( !(fTriggerString.CompareTo(triggerDecision->Description())) ) {\r
-       triggered = triggerDecision->EventTriggered();\r
-       break;\r
-      }\r
-    } // for (Int_t idx = 0; idx < globalDecision->NumberOfInputObjects(); idx++) {\r
-  }\r
-\r
-\r
-\r
-  if ( triggered ) {\r
-    fRetryNextEvent = kFALSE;\r
-    fNEventsNotTriggered = 0;\r
-  }\r
-  else {\r
-    fRetryNextEvent = kTRUE;\r
-    ++fNEventsNotTriggered;\r
-  }\r
-\r
-  return triggered;\r
-}\r
+//-*- Mode: C++ -*-
+// $Id: AliHLTHOMERManager.cxx  $
+//**************************************************************************
+//* This file is property of and copyright by the ALICE HLT Project        * 
+//* ALICE Experiment at CERN, All rights reserved.                         *
+//*                                                                        *
+//* Primary Authors: Jochen Thaeder <thaeder@kip.uni-heidelberg.de>        *
+//*                  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   AliHLTHOMERManager.cxx
+    @author Jochen Thaeder
+    @date
+    @brief  Manger for HOMER in aliroot
+*/
+
+// see header file for class documentation
+// or
+// refer to README to build package
+// or
+// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+
+#if __GNUC__>= 3
+   using namespace std;
+#endif
+
+#define EVE_DEBUG 0
+
+#include "AliHLTHOMERManager.h"
+// -- -- -- -- -- -- -- 
+#include "AliHLTHOMERLibManager.h"
+#include "AliHLTHOMERSourceDesc.h"
+#include "AliHLTHOMERBlockDesc.h"
+// -- -- -- -- -- -- -- 
+#include "AliHLTGlobalTriggerDecision.h"
+#include "AliHLTTriggerDecision.h"
+//---------------------------
+
+ClassImp(AliHLTHOMERManager)
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                            Constructor / Destructor
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+  AliHLTHOMERManager::AliHLTHOMERManager() :
+  fLibManager(new AliHLTHOMERLibManager),
+  fStateHasChanged(kTRUE),
+  fProxyHandler(NULL),
+  fCurrentReader(NULL),
+  fReaderList(NULL),
+  fSourceList(NULL),
+  fNBlks(0),
+  fEventID(),
+  fCurrentBlk(0),
+  fAsyncBlockList(NULL),
+  fEventBuffer(NULL),
+  fBufferTopIdx(-1),
+  fBufferLowIdx(-1),
+  fCurrentBufferIdx(-1),
+  fNavigateBufferIdx(-1),
+  fConnected(kFALSE), 
+  fTriggerString("ALL"), 
+  fNEventsNotTriggered(0),
+  fRetryNextEvent(kFALSE) {
+  // see header file for class documentation
+  // or
+  // refer to README to build package
+  // or
+  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+
+}
+
+//##################################################################################
+AliHLTHOMERManager::~AliHLTHOMERManager() {
+  // see header file for class documentation
+
+  if ( fLibManager ) {
+
+    if ( fReaderList ) {
+      TIter next(fReaderList);
+      TObject * object = NULL;
+      while ( ( object = next()) )
+       fLibManager->DeleteReader(static_cast<AliHLTHOMERReader*>(object) );
+      
+      fReaderList->Clear();
+      delete fReaderList;
+    }
+    fReaderList = NULL;   
+    
+    delete fLibManager;
+  } 
+  fLibManager = NULL;
+
+  if ( fProxyHandler != NULL )
+    delete fProxyHandler;
+  fProxyHandler = NULL;
+
+  if ( fSourceList != NULL )
+    delete fSourceList;
+  fSourceList = NULL;
+
+  if ( fEventBuffer ) {
+    fEventBuffer->Clear();
+    delete fEventBuffer;
+  }
+  fEventBuffer = NULL;
+
+  if ( fAsyncBlockList ) {
+    fAsyncBlockList->Clear();
+    delete fAsyncBlockList;
+  }
+  fAsyncBlockList = NULL;
+}
+
+//##################################################################################
+Int_t AliHLTHOMERManager::Initialize() {
+  // see header file for class documentation
+
+  Int_t iResult = 0;
+
+  // -- Initialize ProxyHandler
+  if ( !fProxyHandler )
+    fProxyHandler = new AliHLTHOMERProxyHandler();
+  
+  if ( fProxyHandler ) {
+    iResult = fProxyHandler->Initialize();
+    if (iResult)
+      HLTError(Form("Initialize of ProxyHandler failed."));
+  }
+  else {
+    iResult = -1;
+    HLTError(Form("Creating of ProxyHandler failed."));
+  }
+  // -- Initialize ReaderList
+  //    List ist not owner, as reader have to be created/deleted by the LibManager
+  if( !fReaderList )
+    fReaderList = new TList();
+  
+  // -- Initialize asynchronous BlockList
+  if( !fAsyncBlockList ) {
+    fAsyncBlockList = new TList();
+    fAsyncBlockList->SetOwner(kFALSE);
+  }
+
+  // -- Initialize Event Buffer and EventID array
+  if ( !fEventBuffer ) {
+    fEventBuffer = new TClonesArray( "TList", BUFFERSIZE );
+  }
+
+  for ( Int_t idx = 0; idx < BUFFERSIZE; ++idx ) {
+    new ((*fEventBuffer)[idx]) TList( );
+    (reinterpret_cast<TList*>((*fEventBuffer)[idx]))->SetOwner(kTRUE);
+    
+    fEventID[idx] = 0;
+  }
+
+  return iResult;
+}
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                                 Source Handling
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+Int_t AliHLTHOMERManager::CreateSourcesList() {
+  // see header file for class documentation
+
+  Int_t iResult = 0;
+  
+  if ( fSourceList != NULL )
+    delete fSourceList;
+  fSourceList = NULL;
+
+  fSourceList = new TList();
+  fSourceList->SetOwner( kTRUE );
+
+  iResult = fProxyHandler->FillSourceList( fSourceList );
+  if ( iResult < 0 ) {
+    HLTWarning(Form("There have been errors, while creating the sources list."));
+  }
+  else if ( iResult > 0 ) {
+    HLTWarning(Form("No active services found."));
+  }
+  else if ( fSourceList->IsEmpty() ) {
+    HLTWarning(Form("No active services in the list."));
+    iResult = 2;
+  }
+  else {
+     HLTInfo(Form("New sources list created."));
+
+    // -- New SourceList has been created 
+    // --> All Sources are new --> State has changed
+    fStateHasChanged = kTRUE;
+  }
+
+  return iResult;
+}
+
+//##################################################################################
+void AliHLTHOMERManager::SetSourceState( AliHLTHOMERSourceDesc * source, Bool_t state ) {
+  // see header file for class documentation
+
+  if ( source->IsSelected() != state ) {
+    source->SetState( state );
+    fStateHasChanged = kTRUE;
+  }
+
+  return;
+}
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                         Connection Handling - public
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+Int_t AliHLTHOMERManager::ConnectHOMER( TString detector ){
+  // see header file for class documentation
+
+  Int_t iResult = 0;
+
+  // -- Check if LibManager is present
+  if ( ! fLibManager ) {
+    HLTError(Form("No LibManager present."));
+    return -1;
+  }
+  
+  // -- Check if already connected and state has not changed
+  if ( fStateHasChanged == kFALSE && IsConnected() ) {
+    HLTInfo(Form("No need for reconnection."));
+    return 0;
+  }
+  
+  // -- If already connected, disconnect before connect
+  //    or if ReaderList already filled
+  if ( IsConnected() || fReaderList->GetSize() != 0 )
+    DisconnectHOMER();
+  
+  // -- Create the Readoutlist
+  UShort_t* sourcePorts = new UShort_t [fSourceList->GetEntries()];
+  const Char_t ** sourceHostnames = new const Char_t* [fSourceList->GetEntries()];
+  UInt_t sourceCount = 0;
+
+  CreateReadoutList( sourceHostnames, sourcePorts, sourceCount, detector );
+  if ( sourceCount == 0 ) {
+    HLTError(Form("No sources selected, aborting."));
+    return -2;
+  }
+
+  // ***
+  // *** Connect to data sources
+  // ***
+  
+  for (UInt_t idx = 0; idx < sourceCount; idx++) {
+    
+    HLTInfo(Form("Adding source %d as %s : %d", idx, sourceHostnames[idx], sourcePorts[idx]));
+    
+    fReaderList->Add(dynamic_cast<TObject*>(fLibManager->OpenReader(sourceHostnames[idx], sourcePorts[idx])));
+    AliHLTHOMERReader *reader = static_cast<AliHLTHOMERReader*>(fReaderList->Last());
+    if ( !reader ) {
+      HLTError(Form("Adding reader failed, aborting"));
+      return -3;
+    }
+
+    if ( (iResult = reader->GetConnectionStatus()) )  {
+
+      // -- Connection to source failed
+      
+      HLTError(Form("Error establishing connection to TCP source %s:%hu: %s (%d)",
+                   sourceHostnames[idx], sourcePorts[idx], strerror(iResult), iResult));
+
+      if( !(TString(sourceHostnames[idx]).CompareTo("localhost")) ) {
+       HLTInfo("The failed connection is on localhost. is SSH tunnel up????? ");
+       HLTInfo(Form("Do: 'ssh -L %d:alihlt-vobox0.cern.ch:%d cernUser@lxplus.cern.ch -fN'",
+                    sourcePorts[idx], sourcePorts[idx]));
+      }
+      
+      // -- Remove reader
+      fReaderList->RemoveLast();
+
+      if ( reader )
+       fLibManager->DeleteReader( reader );
+      reader = NULL;
+      
+      HLTInfo(Form("Removed source %d,  %s : %d from sourceList", idx, sourceHostnames[idx], sourcePorts[idx]));
+      
+    } 
+    else {
+      // -- Connection succeded
+      fConnected = kTRUE;
+
+      HLTInfo(Form("Connection established to source %s on port %d", sourceHostnames[idx], sourcePorts[idx]));
+    }
+    
+  } // for (Int_t idx = 0; idx < sourceCount; idx++) {
+  
+  delete[] sourceHostnames;
+  delete[] sourcePorts;
+
+  return iResult;
+
+}
+
+//##################################################################################
+void AliHLTHOMERManager::DisconnectHOMER(){
+  // see header file for class documentation
+
+  if ( ! IsConnected() )
+    return;
+
+  if ( fReaderList && fLibManager ) {
+    TIter next(fReaderList);
+    TObject * object = NULL;
+    while ( ( object = next()) ) 
+      fLibManager->DeleteReader(static_cast<AliHLTHOMERReader*>(object) );
+      
+    fReaderList->Clear();
+    delete fReaderList;
+    fReaderList = NULL;
+  }
+  
+  fStateHasChanged = kTRUE;
+  fConnected = kFALSE;
+
+  HLTInfo(Form("Connection closed."));
+
+  return;
+}
+
+//##################################################################################
+Int_t AliHLTHOMERManager::ReconnectHOMER( TString detector="" ){
+  // see header file for class documentation
+  
+  Int_t iResult = 0;
+
+  if ( IsConnected() )
+    DisconnectHOMER();
+
+  iResult = ConnectHOMER(detector);
+  if ( iResult ) {
+    HLTError(Form("Error reconnecting."));
+  }
+
+  return iResult;
+}
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                            Event Handling - public
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+Int_t AliHLTHOMERManager::NextEvent(){
+  // see header file for class documentation
+  
+
+  Int_t iResult = 0;
+  Int_t iRetryCount = 0;
+  
+  if ( !IsConnected() || fStateHasChanged ) 
+    ConnectHOMER();
+  
+  if ( !IsConnected() ) {
+    HLTWarning(Form( "Not connected yet." ));
+    return -1;
+  }
+
+  // -- Reset asyncronous BlockList
+  fAsyncBlockList->Clear();
+
+  // ***
+  // *** Loop over all readers and get new event data
+  // ***
+  
+  TIter next(fReaderList);
+  TObject * object = NULL;
+  
+  while( (object = next()) ) {
+    
+    fCurrentReader = static_cast<AliHLTHOMERReader*>(object);
+    
+    // -- Read next event data and error handling for HOMER (error codes and empty blocks)
+    while ( 1 ) {
+      
+      iResult = fCurrentReader->ReadNextEvent( 40000000 /*timeout in us*/);
+      
+      if ( iResult == 111 || iResult == 32 || iResult == 6 ) {
+       HLTError(Form("No connection to source %d: %s (%d)", 
+                     fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
+       break;
+      } 
+      else if ( iResult == 110 ) {
+       HLTError(Form("Timeout occured, reading event from source %d: %s (%d)", 
+                     fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
+       break;
+      } 
+      else if ( iResult == 56 ) {
+       ++iRetryCount;
+      
+       if ( iRetryCount >= 20 ) {
+         HLTError(Form("Retry Failed: Error reading event from source %d: %s (%d), returning", 
+                       fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
+         break;
+       } 
+       else {
+         HLTError(Form("Retry: Error reading event from source %d: %s (%d), making another attempt (no %d out of 20)", 
+                       fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult, iRetryCount));
+         //break;
+         continue;
+       }
+      }
+      else if ( iResult ) {
+       HLTError(Form("General Error reading event from source %d: %s (%d), giving up", 
+                     fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
+       fConnected = kFALSE;
+       break;
+      } 
+      else {
+       break;
+      }
+
+    } // while( 1 ) {
+    
+    
+    // -- Check if event could be read
+    if ( iResult )
+      continue;
+
+    // -- Handle Blocks from current reader
+    iResult = HandleBlocks();
+    if ( iResult ) {
+      HLTError(Form("Handling of blocks failed."));
+    }
+
+  } // while( (object = next()) ) {
+
+  // -- Check if NextEvent should be recalled, 
+  //    to catch the next event with a trigger
+  if ( fRetryNextEvent ) {
+    usleep(1000000);
+    fRetryNextEvent = kFALSE;
+    
+    HLTInfo(Form("Checked trigger of %d events, without triggering", fNEventsNotTriggered));
+    return NextEvent();
+  }
+  else
+    return 0;  
+}
+
+/* ---------------------------------------------------------------------------------
+ *                           Buffer Handling - public
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+Int_t AliHLTHOMERManager::NavigateEventBufferBack() { 
+  // see header file for class documentation
+
+  // -- reached the end of the buffer
+  if ( fNavigateBufferIdx == fBufferLowIdx )
+    return -1;
+
+  Int_t newIdx = fNavigateBufferIdx - 1;
+  if ( newIdx == -1 )
+    newIdx = BUFFERSIZE-1;
+
+  fCurrentBufferIdx = fNavigateBufferIdx = newIdx;
+
+  return newIdx;
+}
+
+//##################################################################################
+Int_t AliHLTHOMERManager::NavigateEventBufferFwd() {
+  // see header file for class documentation
+
+  // -- reached the top of the buffer
+  if ( fNavigateBufferIdx == fBufferTopIdx )
+    return -1;
+
+  Int_t newIdx = fNavigateBufferIdx + 1;
+  if ( newIdx == BUFFERSIZE )
+    newIdx = 0;
+  
+  fCurrentBufferIdx = fNavigateBufferIdx = newIdx;
+
+  return newIdx;
+}
+
+ ///////////////////////////////////////////////////////////////////////////////////
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                            Connection Handling - private
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+void AliHLTHOMERManager::CreateReadoutList( const char** sourceHostnames, UShort_t *sourcePorts, 
+                                           UInt_t &sourceCount, TString detector ){
+  // see header file for class documentation
+
+  AliHLTHOMERSourceDesc * source= NULL;
+
+  // -- Read all sources and check if they should be read out
+  TIter next( fSourceList );
+  while ( ( source = dynamic_cast<AliHLTHOMERSourceDesc*>(next()) ) ) {
+
+    // -- If detector NO detector name given
+    if ( ! detector.CompareTo("ALL") ) {
+      // -- Continue if source is not selected
+      if ( ! source->IsSelected() )
+       continue;
+    }
+    // -- DetectorName given
+    else {
+      // -- Continue if detector name doesn't match
+      if ( detector.CompareTo(source->GetDetector()) )
+       continue;
+      else
+       source->Select();
+    }
+    
+    Bool_t exists = kFALSE;
+    
+    // -- Loop over existing entries and check if entry is already in readout list
+    for ( UInt_t ii = 0; ii < sourceCount; ii++ ){
+      if ( !strcmp( sourceHostnames[ii], source->GetHostname().Data() ) 
+          && sourcePorts[ii] == source->GetPort() ) {
+       exists = kTRUE;
+       break;
+      }
+    }
+
+    // -- Add new entires to readout list
+    if ( ! exists ) {
+      sourcePorts[sourceCount] = source->GetPort();
+      sourceHostnames[sourceCount] = source->GetHostname().Data();
+      sourceCount++;
+    }
+
+  } // while ( ( source = (AliHLTHOMERSourceDesc*)next() ) ) {
+
+  fStateHasChanged = kFALSE;
+
+  return;
+}
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                          Buffer Handling - private
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+void AliHLTHOMERManager::AddBlockListToBuffer() {
+  // see header file for class documentation
+
+  // -- Check if event is already in buffer
+  ULong_t eventID = static_cast<ULong64_t>(fCurrentReader->GetEventID());  
+  
+  if ( fEventID[fBufferTopIdx] == eventID ) {
+    HLTInfo(Form("Event 0x%016LX (%Lu) already in buffer.", eventID, eventID));
+    return;
+  }
+
+  // -- Check if event should be selected on basis of trigger string
+  if( fTriggerString.CompareTo("ALL") ){
+    if ( !CheckTriggerDecision() ) {
+      HLTInfo(Form("Event 0x%016LX (%Lu) is not triggered by %s.", 
+                  eventID, eventID, fTriggerString.Data()));
+      return;
+    }
+  }
+  else {
+    HLTInfo("No trigger selection.");
+  }
+
+  // -- Set Top mark 
+  ++fBufferTopIdx;
+  if ( fBufferTopIdx == BUFFERSIZE )
+    fBufferTopIdx = 0;
+
+  // -- Change the low mark if necessary
+  if ( fBufferLowIdx == -1 )
+    fBufferLowIdx = 0;
+  else if ( fBufferTopIdx == fBufferLowIdx ) {
+    ++fBufferLowIdx;
+    if ( fBufferLowIdx == BUFFERSIZE )
+      fBufferLowIdx = 0;
+  }
+
+  fNavigateBufferIdx = fCurrentBufferIdx = fBufferTopIdx;    
+
+  // -- Fill EventID
+  fEventID[fBufferTopIdx] = eventID;
+
+  // -- Clear Buffer slot
+  (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Clear();
+
+
+  GetFirstBlk();
+
+  // -- Fill block list
+  do {
+
+    // -- Create new block
+    AliHLTHOMERBlockDesc * block = new AliHLTHOMERBlockDesc();
+    block->SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
+                    GetBlkType(), GetBlkSpecification() );
+    
+    // -- Check sources list if block is requested
+    if ( CheckIfRequested( block ) ) {
+      (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Add( block );
+    }
+    else {
+      // XXX HACK Jochen
+      (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Add( block );
+      // delete block;
+      // block = NULL;
+    }
+  } while( GetNextBlk() );
+
+  return;
+}
+
+//##################################################################################
+void AliHLTHOMERManager::AddToAsyncBlockList() {
+  // see header file for class documentation
+
+  HLTInfo("Adding blocks to the asynchroneous block list");
+
+
+  GetFirstBlk();
+
+  // -- Fill block list
+  do {
+    
+
+    // -- Create new block
+    AliHLTHOMERBlockDesc * block = new AliHLTHOMERBlockDesc();
+    block->SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
+                    GetBlkType(), GetBlkSpecification() );
+    
+    // -- Check sources list if block is requested
+    if ( CheckIfRequested( block ) ) 
+      fAsyncBlockList->Add( block );
+    else {
+      // XXX HACK Jochen
+      fAsyncBlockList->Add( block );
+      // delete block;
+      // block = NULL;
+    }
+  } while( GetNextBlk() );
+
+  return;
+}
+//##################################################################################
+TList* AliHLTHOMERManager::GetBlockListEventBuffer( Int_t idx ) {
+  // see header file for class documentation
+
+  if ( idx == -1 )
+    return NULL;
+
+  return reinterpret_cast<TList*>((*fEventBuffer)[idx]);
+
+}
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                          Block Handling - private
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+Int_t AliHLTHOMERManager::HandleBlocks() {
+  // see header file for class documentation
+  
+  Int_t iResult = 0;
+
+  // -- Get blockCnt and eventID
+  fNBlks = static_cast<ULong_t>(fCurrentReader->GetBlockCnt());
+  ULong_t eventID = static_cast<ULong64_t>(fCurrentReader->GetEventID());  
+  fCurrentBlk = 0;
+
+  // -- Check if blocks present
+  if ( fNBlks ==  0 ) {
+    HLTWarning(Form("Event 0x%016LX (%Lu) with no blocks", eventID, eventID));
+    return -1;
+  }
+
+  HLTInfo(Form("Event 0x%016LX (%Lu) with %lu blocks", eventID, eventID, fNBlks));
+
+#if 1// EVE_DEBUG
+  // Loop for Debug only
+  for ( ULong_t ii = 0; ii < fNBlks; ii++ ) {
+    Char_t tmp1[9], tmp2[5];
+    memset( tmp1, 0, 9 );
+    memset( tmp2, 0, 5 );
+    void *tmp11 = tmp1;
+    ULong64_t* tmp12 = static_cast<ULong64_t*>(tmp11);
+    *tmp12 = fCurrentReader->GetBlockDataType(ii);
+    void *tmp21 = tmp2;
+    ULong_t* tmp22 = static_cast<ULong_t*>(tmp21);
+    *tmp22 = fCurrentReader->GetBlockDataOrigin(ii);
+    HLTInfo(Form( "Block %lu length: %lu - type: %s - origin: %s - spec 0x%08X",
+                 ii, fCurrentReader->GetBlockDataLength(ii), tmp1, tmp2, fCurrentReader->GetBlockDataSpec(ii) ));
+  } // end for ( ULong_t ii = 0; ii < fNBlks; ii++ ) {
+#endif
+    
+  // -- Check if blocks are from syncronous source
+
+  if ( IsSyncBlocks() )
+    AddBlockListToBuffer();
+  else
+    AddToAsyncBlockList();
+    
+  return iResult;
+}
+
+//##################################################################################
+Bool_t AliHLTHOMERManager::IsSyncBlocks() {
+  // see header file for class documentation
+  
+  Bool_t bResult = kFALSE;
+
+  GetFirstBlk();
+  
+  do {
+  
+          
+    //    if ( !GetBlkType().CompareTo("ALIESDV0") ||
+   
+    if ( !GetBlkType().CompareTo("ALIESDV0")  ||
+        !GetBlkType().CompareTo("CLUSTERS")  ) {
+      
+      bResult = kTRUE;
+      break;
+    
+    }
+    
+    if ( !GetBlkType().CompareTo("ROOTTOBJ") ) {
+      AliHLTHOMERBlockDesc blockDesc;
+      
+      blockDesc.SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
+                         GetBlkType(), GetBlkSpecification() );
+      if ( !blockDesc.GetClassName().CompareTo("AliHLTGlobalTriggerDecision") ) {
+
+       bResult = kTRUE;
+       break;
+      }
+    }
+
+  } while( GetNextBlk() );
+
+
+  return bResult;
+}
+
+//##################################################################################
+void* AliHLTHOMERManager::GetBlk( Int_t ndx ) {
+  // see header file for class documentation
+  // Get pointer to current block in current event
+   
+  if ( !fCurrentReader || !IsConnected() ) {
+    HLTError(Form("Not connected yet."));
+    return NULL;
+  }
+  if ( ndx < static_cast<Int_t>(fNBlks) )
+    return  const_cast<void*> (fCurrentReader->GetBlockData(ndx));
+  else
+    return NULL;
+}
+
+//##################################################################################
+ULong_t AliHLTHOMERManager::GetBlkSize( Int_t ndx ) {
+  // see header file for class documentation
+   
+  if ( !fCurrentReader || !IsConnected() ) {
+    HLTError(Form("Not connected yet."));
+    return 0;
+  }
+  
+  if ( ndx < static_cast<Int_t>(fNBlks) )
+    return static_cast<ULong_t> (fCurrentReader->GetBlockDataLength(ndx));
+  else
+    return 0;
+}
+
+//##################################################################################
+TString AliHLTHOMERManager::GetBlkOrigin( Int_t ndx ) {
+  // see header file for class documentation
+
+  TString origin = "";
+
+  // -- Check for Connection
+  if ( !fCurrentReader || ! IsConnected() ) {
+    HLTError(Form("Not connected yet."));
+    return origin;
+  }
+
+  // -- Check block index
+  if ( ndx >= static_cast<Int_t>(fNBlks) ) {
+    HLTError(Form("Block index %d out of range.", ndx ));
+    return origin;
+  }
+
+  // -- Get origin
+  union{
+    UInt_t data;
+    Char_t array[4];
+  } reverseOrigin;
+
+  reverseOrigin.data = static_cast<UInt_t>(fCurrentReader->GetBlockDataOrigin(ndx));
+
+  // -- Reverse the order
+  for (Int_t ii = 3; ii >= 0; ii-- )
+    if ( reverseOrigin.array[ii] != ' ')
+      origin.Append( reverseOrigin.array[ii] );
+
+  origin.Remove( TString::kTrailing, ' ' );
+
+  return origin;
+}
+
+//##################################################################################
+TString AliHLTHOMERManager::GetBlkType( Int_t ndx ) {
+  // see header file for class documentation
+
+  TString type = "";
+
+  // -- Check for Connection
+  if ( !fCurrentReader || ! IsConnected() ) {
+    HLTError(Form("Not connected yet."));
+    return type;
+  }
+
+  // -- Check block index
+  if ( ndx >= static_cast<Int_t>(fNBlks) ) {
+    HLTError(Form("Block index %d out of range.", ndx ));
+    return type;
+  }
+
+  // -- Get type
+  union{
+    ULong64_t data;
+    Char_t array[8];
+  } reverseType;
+
+  reverseType.data = static_cast<ULong64_t> (fCurrentReader->GetBlockDataType(ndx));
+
+  // -- Reverse the order
+  for (Int_t ii = 7; ii >= 0; ii-- )
+    if ( reverseType.array[ii] != ' ')
+      type.Append( reverseType.array[ii] );
+  
+  type.Remove( TString::kTrailing, ' ' );
+
+  return type;
+}
+
+//##################################################################################
+ULong_t AliHLTHOMERManager::GetBlkSpecification( Int_t ndx ) {
+  // see header file for class documentation
+
+  // -- Check for Connection
+  if ( !fCurrentReader || ! IsConnected() ) {
+    HLTError(Form("Not connected yet."));
+    return 0;
+  }
+
+  // -- Check block index
+  if ( ndx >= static_cast<Int_t>(fNBlks) ) {
+    HLTError(Form("Block index %d out of range.", ndx ));
+    return 0;
+  }
+
+  return static_cast<ULong_t>(fCurrentReader->GetBlockDataSpec(ndx));
+}
+
+//##################################################################################
+Bool_t AliHLTHOMERManager::CheckIfRequested( AliHLTHOMERBlockDesc * block ) {
+  // see header file for class documentation
+
+  Bool_t requested = kFALSE;
+
+  AliHLTHOMERSourceDesc * source= NULL;
+
+  // -- Read all sources and check if they should be read out
+  TIter next( fSourceList );
+  while ( ( source = dynamic_cast<AliHLTHOMERSourceDesc*>(next()) ) ) {
+    
+    // -- Check if source is selected
+    if ( ! source->IsSelected() )
+      continue;
+    
+    // -- Check if detector matches
+    if ( source->GetSourceName().CompareTo( block->GetBlockName() ) )
+      continue;
+
+    requested = kTRUE;
+    break;
+
+  } // while ( ( source = dynamic_cast<AliHLTHOMERSourceDesc*>(next()) ) ) {
+  
+#if EVE_DEBUG
+  if ( requested ) {
+    HLTInfo(Form("Block requested : %s", block->GetBlockName().Data())); 
+  }
+  else {
+    HLTInfo(Form("Block NOT requested : %s", block->GetBlockName().Data())); 
+  }
+#endif
+
+  return requested;
+}
+
+/* ---------------------------------------------------------------------------------
+ *                          Trigger Handling - private
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+Bool_t AliHLTHOMERManager::CheckTriggerDecision() {
+  // see header file for class documentation
+
+  Bool_t triggered = kFALSE;
+
+  if ( !fCurrentReader || !IsConnected() ) {
+    HLTError(Form("Not connected yet."));
+    return NULL;
+  }
+
+  AliHLTHOMERBlockDesc blockDesc;
+
+  GetFirstBlk();
+  
+  // -- Fill block list
+  Bool_t foundTriggerBlock = kFALSE;
+  
+  do {
+    if ( (GetBlkType().CompareTo("ROOTTOBJ") == 0) ) {
+      blockDesc.SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
+                         GetBlkType(), GetBlkSpecification() );
+
+      if ( ! blockDesc.GetClassName().CompareTo("AliHLTGlobalTriggerDecision") ) {
+
+       foundTriggerBlock = kTRUE;
+       break;
+      }
+      
+    }
+  } while( GetNextBlk() );
+  
+  if ( !foundTriggerBlock ) {
+    HLTError(Form("No trigger decision object found"));
+    return kFALSE;
+  }
+
+  // -- Get the global decision object
+  AliHLTGlobalTriggerDecision* globalDecision = 
+    static_cast<AliHLTGlobalTriggerDecision*>(blockDesc.GetTObject());
+
+  if ( fTriggerString.CompareTo("HLTGlobalTrigger") == 0 ) {
+    triggered = globalDecision->EventTriggered();
+  } 
+  else {
+    
+    for (Int_t idx = 0; idx < globalDecision->NumberOfInputObjects(); idx++) {
+       
+      const AliHLTTriggerDecision* triggerDecision = 
+       reinterpret_cast<const AliHLTTriggerDecision*>(globalDecision->InputObject(idx));
+    
+      if ( !(fTriggerString.CompareTo(triggerDecision->Description())) ) {
+       triggered = triggerDecision->EventTriggered();
+       break;
+      }
+    } // for (Int_t idx = 0; idx < globalDecision->NumberOfInputObjects(); idx++) {
+  }
+
+
+
+  if ( triggered ) {
+    fRetryNextEvent = kFALSE;
+    fNEventsNotTriggered = 0;
+  }
+  else {
+    fRetryNextEvent = kTRUE;
+    ++fNEventsNotTriggered;
+  }
+
+  return triggered;
+}
index 3823bfd..fad0d49 100644 (file)
-//-*- Mode: C++ -*-\r
-\r
-// $Id: AliHLTHOMERManager.h $\r
-\r
-#ifndef ALIHLTHOMERMANAGER_H\r
-#define ALIHLTHOMERMANAGER_H\r
-\r
-/* This file is property of and copyright by the ALICE HLT Project        * \r
- * ALICE Experiment at CERN, All rights reserved.                         *\r
- * See cxx source for full Copyright notice     \r
- */\r
-\r
-/** @file   AliHLTHOMERManager.h\r
-    @author Jochen Thaeder\r
-    @date\r
-    @brief  Manager for HOMER in aliroot\r
-*/\r
-\r
-\r
-#include "TClonesArray.h"\r
-#include "TString.h"\r
-#include "TList.h"\r
-\r
-#include "AliHLTHOMERSourceDesc.h"\r
-#include "AliHLTHOMERBlockDesc.h"\r
-#include "AliHLTHOMERReader.h"\r
-#include "AliHLTHOMERProxyHandler.h"\r
-\r
-#include "AliHLTLoggingVariadicFree.h"\r
-\r
-#define BUFFERSIZE 100\r
-\r
-class AliHLTHOMERLibManager;\r
-\r
-/**\r
- * @class AliHLTHOMERManager\r
- * This Class should handle the communication\r
- * from the HLT to aliroot. The HLT sends data via \r
- * the HOMER interface on several TCP ports of nodes \r
- * in the CERN GPN and DCS network.\r
- * All this communication is hidden from the user.\r
- * \r
- * Right now, a xml file ( SCC1 ) is used to get the\r
- * configuration, this will/ has to change to a proxy\r
- * running on dedicated nodes.\r
- *\r
- * @ingroup alihlt_homer\r
- */\r
-\r
-class AliHLTHOMERManager : public AliHLTLogging \r
-{\r
-public:\r
-  \r
-  /*\r
-   * ---------------------------------------------------------------------------------\r
-   *                            Constructor / Destructor\r
-   * ---------------------------------------------------------------------------------\r
-   */\r
-\r
-  /** default constructor */\r
-  AliHLTHOMERManager();\r
-\r
-  /** destructor */\r
-  virtual ~AliHLTHOMERManager();\r
-\r
-  /** Initialize \r
-   *  @return 0 on success, <0 for failure\r
-   */\r
-  Int_t Initialize();\r
-\r
-  /*\r
-   * ---------------------------------------------------------------------------------\r
-   *                            Source Handling - public\r
-   * ---------------------------------------------------------------------------------\r
-   */\r
-\r
-  /** Create Sources List from HOMER-Proxy \r
-   *  @return 0 on success, <0 for failure, 1 for no active service\r
-   */\r
-  virtual Int_t CreateSourcesList();\r
-\r
-  /** Set state of a source \r
-   *  @param source      Pointer to AliHLTHOMERSourceDesc object.\r
-   *  @param state       New (selected/not selected) state.\r
-   */\r
-  void   SetSourceState( AliHLTHOMERSourceDesc* source, Bool_t state);\r
-\r
-  /** Get pointer to source List */\r
-  TList* GetSourceList() { return fSourceList; }\r
-\r
-  /*\r
-   * ---------------------------------------------------------------------------------\r
-   *                            Connection Handling - public\r
-   * ---------------------------------------------------------------------------------\r
-   */\r
-\r
-  /** Connect to HOMER sources, of a certain detector.\r
-   *  which gets created when state has changed \r
-   *  @param detector    Detector to be connected to\r
-   *  @return            0 on success, <0 for failure\r
-   */\r
-  Int_t ConnectHOMER( TString detector="ALL" );\r
-\r
-  /** Disconnect from HOMER sources */\r
-  void  DisconnectHOMER();\r
-\r
-  /** Reconnect from HOMER sources \r
-   *  @param detector    Detector to be connected to\r
-   *  @return            0 on success, <0 for failure\r
-   */\r
-  Int_t ReconnectHOMER( TString detector);\r
-\r
-  /*\r
-   * ---------------------------------------------------------------------------------\r
-   *                            Event Handling - public\r
-   * ---------------------------------------------------------------------------------\r
-   */\r
-\r
-  /** Loads the next Event, after being connected \r
-   *  @return 0 on success, <0 for failure\r
-   */\r
-  virtual Int_t NextEvent();\r
-\r
-  /** Loads the next Cycle, after being connected \r
-   *  @return 0 on success, <0 for failure\r
-   */\r
-  virtual Int_t NextCycle() { return NextEvent(); }\r
-\r
-  /** Get event ID */\r
-  ULong_t GetEventID() { return fEventID[fCurrentBufferIdx]; }\r
-\r
-  /* ---------------------------------------------------------------------------------\r
-   *                           Buffer Handling - public\r
-   * ---------------------------------------------------------------------------------\r
-   */\r
-\r
-  /** Get pointer to last requested BlockList \r
-   *  @return     ptr to buffer, NULL if buffer boundary reached                \r
-   */\r
-  TList* GetBlockList() { return GetBlockListEventBuffer(fCurrentBufferIdx); }\r
-\r
-  /** Get pointer to last asynchrounous BlockList \r
-   *  @return     ptr to buffer, NULL if none present\r
-   */\r
-  TList* GetAsyncBlockList() { \r
-    cout << "Returning asyncblocklist size : " <<\r
-      fAsyncBlockList->GetSize() << endl;\r
-    return fAsyncBlockList; \r
-  }\r
-\r
-  /** Navigate backwards in event buffer \r
-   *  @return      index in buffer, -1 if boundary reached                \r
-   */\r
-  Int_t  NavigateEventBufferBack();\r
-\r
-  /** Navigate forwards in event buffer \r
-   *  @return      index in buffer, -1 if boundary reached                \r
-   */\r
-  Int_t  NavigateEventBufferFwd();\r
-\r
-  /* ---------------------------------------------------------------------------------\r
-   *                          Trigger Handling - public\r
-   * ---------------------------------------------------------------------------------\r
-   */\r
-\r
-  /** Set and get the string used to select triggers \r
-   *  @param triggerString    Trigger selection string\r
-   */\r
-  void SetTriggerString ( TString triggerString ) { fTriggerString = triggerString; }\r
-\r
-  /** Get TriggerString */\r
-  TString GetTriggerString () { return fTriggerString; }\r
-\r
-  ///////////////////////////////////////////////////////////////////////////////////\r
-\r
-protected:\r
-\r
-  /** Dynamic loader manager for the HOMER library */\r
-  AliHLTHOMERLibManager* fLibManager;             //! transient\r
-\r
-  /** Indicates, if a sources have changes, \r
-   *  so that one has to reconnect. */\r
-  Bool_t    fStateHasChanged;                     //  see above\r
-\r
-  ///////////////////////////////////////////////////////////////////////////////////\r
-\r
-private:\r
-\r
-  /** copy constructor prohibited */\r
-  AliHLTHOMERManager(const AliHLTHOMERManager&);\r
-\r
-  /** assignment operator prohibited */\r
-  AliHLTHOMERManager& operator=(const AliHLTHOMERManager&);\r
-\r
-  /*\r
-   * ---------------------------------------------------------------------------------\r
-   *                            Connection Handling - private\r
-   * ---------------------------------------------------------------------------------\r
-   */\r
-\r
-  /** Create a readout list for Hostname and ports \r
-   *  @param socurceHostnames   Array of selected hostnames\r
-   *  @param socurcePorts       Array of selected ports\r
-   *  @param socurceCount       Number of selected hostname:port\r
-   *  @param detector           detector to be selected\r
-   */\r
-  void CreateReadoutList( const char** sourceHostnames, UShort_t* sourcePorts, \r
-                         UInt_t &sourceCount, TString detector );\r
-\r
-  /** Checks if already connected to HOMER sources */\r
-  Bool_t IsConnected() { return fConnected; }  \r
-  \r
-  /* ---------------------------------------------------------------------------------\r
-   *                           Buffer Handling - private\r
-   * ---------------------------------------------------------------------------------\r
-   */\r
-\r
-  /** Create and add Block List to Buffer */\r
-  void AddBlockListToBuffer();\r
-\r
-  /** Add bocks to asynchronous BlockList */\r
-  void AddToAsyncBlockList();\r
-\r
-  /** Get pointer to block list in event buffer \r
-   *  @return     ptr to buffer, NULL if not present\r
-   */\r
-  TList* GetBlockListEventBuffer( Int_t idx );\r
-    \r
-  /*\r
-   * ---------------------------------------------------------------------------------\r
-   *                            Block Handling - private\r
-   * ---------------------------------------------------------------------------------\r
-   */\r
-\r
-  /** Get Number of blocks in current event */\r
-  ULong_t GetNBlks() { return fNBlks; }\r
-\r
-  // ----------------------------------------------------\r
-\r
-  /** Handle Blocks and fill them in event buffer or asyncronous BlockList\r
-   *  @return 0 on success, <0 for failure\r
-   */\r
-  Int_t HandleBlocks();\r
-\r
-  /** Check is block are from syncronous source\r
-   *  @return kTRUE, if asyncronous kFALSE\r
-   */\r
-  Bool_t IsSyncBlocks();\r
-\r
-  // ----------------------------------------------------\r
-\r
-  /** Get pointer to block ndx in current event \r
-   *  @param ndx        Block index\r
-   *  @return           returns pointer to blk, NULL if no block present\r
-   */\r
-  void* GetBlk( Int_t ndx );\r
-\r
-  /** Get pointer to current block in current event */\r
-  void* GetBlk() { return GetBlk(fCurrentBlk); }\r
-\r
-  /** Get first block in current event */\r
-  void* GetFirstBlk() { fCurrentBlk=0; return GetBlk(0); }\r
-\r
-  /** Get next block in current event */\r
-  void* GetNextBlk() { return GetBlk(++fCurrentBlk); }\r
-\r
-  // ----------------------------------------------------\r
-\r
-  /** Get size of block ndx \r
-   *  @param ndx        Block index\r
-   *  @return           returns size blk, 0 otherwise\r
-   */\r
-  ULong_t GetBlkSize( Int_t ndx );\r
-\r
-  /** Get size of current block */ \r
-  ULong_t GetBlkSize() { return GetBlkSize( fCurrentBlk ); }\r
-\r
-  // ---------------------------------------------------- \r
-\r
-  /** Get origin of block ndx \r
-   *  @param ndx        Block index\r
-   *  @return           origin of block\r
-   */\r
-  TString GetBlkOrigin( Int_t ndx );\r
-\r
-  /** Get origin of current block */\r
-  TString GetBlkOrigin(){ return GetBlkOrigin( fCurrentBlk ); }\r
-\r
-  // ----------------------------------------------------\r
-\r
-  /** Get type of block ndx \r
-   *  @param ndx        Block index\r
-   *  @return           type of block\r
-   */\r
-  TString GetBlkType( Int_t ndx ); \r
-\r
-  /** Get type of current block */\r
-  TString GetBlkType() { return GetBlkType( fCurrentBlk ); } \r
-  \r
-  // ----------------------------------------------------\r
-  \r
-  /** Get specification of block ndx \r
-   *  @param ndx        Block index\r
-   *  @return           specification of block\r
-   */\r
-  ULong_t GetBlkSpecification( Int_t ndx );\r
-\r
-  /** Get specification of current block */\r
-  ULong_t GetBlkSpecification() { return GetBlkSpecification( fCurrentBlk ); } \r
-\r
-  // ----------------------------------------------------\r
-\r
-  /** Checks if current Block should was requested \r
-   *  @return           returns kTRUE, if block should was requested\r
-   */\r
-  Bool_t CheckIfRequested( AliHLTHOMERBlockDesc* block );\r
-\r
-  /* ---------------------------------------------------------------------------------\r
-   *                          Trigger Handling - private\r
-   * ---------------------------------------------------------------------------------\r
-   */\r
-  \r
-  /** Loops over the data block from all the readers in the readerlist until\r
-   *    a triggerdecsision has been found\r
-   *    Locates the triggerdecision required by fTriggerString and checks if it triggered \r
-   *  @return           returns kTRUE, if event was triggered, kFALSE otherwise\r
-   */\r
-  Bool_t CheckTriggerDecision();\r
-\r
-  /*\r
-   * ---------------------------------------------------------------------------------\r
-   *                            Members - private\r
-   * ---------------------------------------------------------------------------------\r
-   */\r
-\r
-  /** Proxy Handler to get the list of sources */\r
-  AliHLTHOMERProxyHandler *fProxyHandler;               //! transient \r
-\r
-  // == connection ==\r
-\r
-  /** Pointer to current HOMER reader */\r
-  AliHLTHOMERReader       *fCurrentReader;              //! transient \r
-\r
-  /** List to pointer of HOMER readers */\r
-  TList                   *fReaderList;                 //! transient\r
-\r
-  // == sources ==\r
-\r
-  /** List to HOMER sources */\r
-  TList                   *fSourceList;                 //! transient\r
-\r
-  // == events ==\r
-\r
-  /** Number of blockes in current event */\r
-  ULong_t                  fNBlks;                      //  see above\r
-\r
-  /** EventID of current event */\r
-  ULong64_t                fEventID[BUFFERSIZE];        //  see above\r
-\r
-  /** Current block in current event */\r
-  ULong_t                  fCurrentBlk;                 //  see above\r
-\r
-  // == Asynchronous BlockList ==\r
-\r
-  /** List containing asychronous blocks */\r
-  TList                   *fAsyncBlockList;             //  see above\r
-\r
-  // == event buffer ==\r
-\r
-  /** Event Buffer */\r
-  TClonesArray            *fEventBuffer;                //  see above\r
-\r
-  /** Buffer index to last received event */\r
-  Int_t                    fBufferTopIdx;               //  see above\r
-\r
-  /** Buffer index to last received event */\r
-  Int_t                    fBufferLowIdx;               //  see above\r
-\r
-  /** Buffer index to current event */\r
-  Int_t                    fCurrentBufferIdx;           //  see above\r
-\r
-  /** Navigate index through event buffer */\r
-  Int_t                    fNavigateBufferIdx;          //  see above\r
-  \r
-  // == states ==\r
-  \r
-  /** Shows connection status */\r
-  Bool_t                   fConnected;                  //  see above\r
-\r
-  // == trigger selection ==\r
-\r
-  /** String indicating which trigger should be used to select events */\r
-  TString                  fTriggerString;              //  see above\r
-\r
-  /** Number Events not triggered, before next triggered event is found */\r
-  Int_t                    fNEventsNotTriggered;        //  see above\r
-\r
-  /** Retry reading next event */\r
-  Bool_t                   fRetryNextEvent;             //  see above\r
-\r
-  ClassDef(AliHLTHOMERManager, 1); // Manage connections to HLT data-sources.\r
-};\r
-\r
-#endif\r
+//-*- Mode: C++ -*-
+
+// $Id: AliHLTHOMERManager.h $
+
+#ifndef ALIHLTHOMERMANAGER_H
+#define ALIHLTHOMERMANAGER_H
+
+/* This file is property of and copyright by the ALICE HLT Project        * 
+ * ALICE Experiment at CERN, All rights reserved.                         *
+ * See cxx source for full Copyright notice     
+ */
+
+/** @file   AliHLTHOMERManager.h
+    @author Jochen Thaeder
+    @date
+    @brief  Manager for HOMER in aliroot
+*/
+
+
+#include "TClonesArray.h"
+#include "TString.h"
+#include "TList.h"
+
+#include "AliHLTHOMERSourceDesc.h"
+#include "AliHLTHOMERBlockDesc.h"
+#include "AliHLTHOMERReader.h"
+#include "AliHLTHOMERProxyHandler.h"
+
+#include "AliHLTLoggingVariadicFree.h"
+
+#define BUFFERSIZE 100
+
+class AliHLTHOMERLibManager;
+
+/**
+ * @class AliHLTHOMERManager
+ * This Class should handle the communication
+ * from the HLT to aliroot. The HLT sends data via 
+ * the HOMER interface on several TCP ports of nodes 
+ * in the CERN GPN and DCS network.
+ * All this communication is hidden from the user.
+ * 
+ * Right now, a xml file ( SCC1 ) is used to get the
+ * configuration, this will/ has to change to a proxy
+ * running on dedicated nodes.
+ *
+ * @ingroup alihlt_homer
+ */
+
+class AliHLTHOMERManager : public AliHLTLogging 
+{
+public:
+  
+  /*
+   * ---------------------------------------------------------------------------------
+   *                            Constructor / Destructor
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** default constructor */
+  AliHLTHOMERManager();
+
+  /** destructor */
+  virtual ~AliHLTHOMERManager();
+
+  /** Initialize 
+   *  @return 0 on success, <0 for failure
+   */
+  Int_t Initialize();
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                            Source Handling - public
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Create Sources List from HOMER-Proxy 
+   *  @return 0 on success, <0 for failure, 1 for no active service
+   */
+  virtual Int_t CreateSourcesList();
+
+  /** Set state of a source 
+   *  @param source      Pointer to AliHLTHOMERSourceDesc object.
+   *  @param state       New (selected/not selected) state.
+   */
+  void   SetSourceState( AliHLTHOMERSourceDesc* source, Bool_t state);
+
+  /** Get pointer to source List */
+  TList* GetSourceList() { return fSourceList; }
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                            Connection Handling - public
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Connect to HOMER sources, of a certain detector.
+   *  which gets created when state has changed 
+   *  @param detector    Detector to be connected to
+   *  @return            0 on success, <0 for failure
+   */
+  Int_t ConnectHOMER( TString detector="ALL" );
+
+  /** Disconnect from HOMER sources */
+  void  DisconnectHOMER();
+
+  /** Reconnect from HOMER sources 
+   *  @param detector    Detector to be connected to
+   *  @return            0 on success, <0 for failure
+   */
+  Int_t ReconnectHOMER( TString detector);
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                            Event Handling - public
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Loads the next Event, after being connected 
+   *  @return 0 on success, <0 for failure
+   */
+  virtual Int_t NextEvent();
+
+  /** Loads the next Cycle, after being connected 
+   *  @return 0 on success, <0 for failure
+   */
+  virtual Int_t NextCycle() { return NextEvent(); }
+
+  /** Get event ID */
+  ULong_t GetEventID() { return fEventID[fCurrentBufferIdx]; }
+
+  /* ---------------------------------------------------------------------------------
+   *                           Buffer Handling - public
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Get pointer to last requested BlockList 
+   *  @return     ptr to buffer, NULL if buffer boundary reached                
+   */
+  TList* GetBlockList() { return GetBlockListEventBuffer(fCurrentBufferIdx); }
+
+  /** Get pointer to last asynchrounous BlockList 
+   *  @return     ptr to buffer, NULL if none present
+   */
+  TList* GetAsyncBlockList() { 
+    cout << "Returning asyncblocklist size : " <<
+      fAsyncBlockList->GetSize() << endl;
+    return fAsyncBlockList; 
+  }
+
+  /** Navigate backwards in event buffer 
+   *  @return      index in buffer, -1 if boundary reached                
+   */
+  Int_t  NavigateEventBufferBack();
+
+  /** Navigate forwards in event buffer 
+   *  @return      index in buffer, -1 if boundary reached                
+   */
+  Int_t  NavigateEventBufferFwd();
+
+  /* ---------------------------------------------------------------------------------
+   *                          Trigger Handling - public
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Set and get the string used to select triggers 
+   *  @param triggerString    Trigger selection string
+   */
+  void SetTriggerString ( TString triggerString ) { fTriggerString = triggerString; }
+
+  /** Get TriggerString */
+  TString GetTriggerString () { return fTriggerString; }
+
+  ///////////////////////////////////////////////////////////////////////////////////
+
+protected:
+
+  /** Dynamic loader manager for the HOMER library */
+  AliHLTHOMERLibManager* fLibManager;             //! transient
+
+  /** Indicates, if a sources have changes, 
+   *  so that one has to reconnect. */
+  Bool_t    fStateHasChanged;                     //  see above
+
+  ///////////////////////////////////////////////////////////////////////////////////
+
+private:
+
+  /** copy constructor prohibited */
+  AliHLTHOMERManager(const AliHLTHOMERManager&);
+
+  /** assignment operator prohibited */
+  AliHLTHOMERManager& operator=(const AliHLTHOMERManager&);
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                            Connection Handling - private
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Create a readout list for Hostname and ports 
+   *  @param socurceHostnames   Array of selected hostnames
+   *  @param socurcePorts       Array of selected ports
+   *  @param socurceCount       Number of selected hostname:port
+   *  @param detector           detector to be selected
+   */
+  void CreateReadoutList( const char** sourceHostnames, UShort_t* sourcePorts, 
+                         UInt_t &sourceCount, TString detector );
+
+  /** Checks if already connected to HOMER sources */
+  Bool_t IsConnected() { return fConnected; }  
+  
+  /* ---------------------------------------------------------------------------------
+   *                           Buffer Handling - private
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Create and add Block List to Buffer */
+  void AddBlockListToBuffer();
+
+  /** Add bocks to asynchronous BlockList */
+  void AddToAsyncBlockList();
+
+  /** Get pointer to block list in event buffer 
+   *  @return     ptr to buffer, NULL if not present
+   */
+  TList* GetBlockListEventBuffer( Int_t idx );
+    
+  /*
+   * ---------------------------------------------------------------------------------
+   *                            Block Handling - private
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Get Number of blocks in current event */
+  ULong_t GetNBlks() { return fNBlks; }
+
+  // ----------------------------------------------------
+
+  /** Handle Blocks and fill them in event buffer or asyncronous BlockList
+   *  @return 0 on success, <0 for failure
+   */
+  Int_t HandleBlocks();
+
+  /** Check is block are from syncronous source
+   *  @return kTRUE, if asyncronous kFALSE
+   */
+  Bool_t IsSyncBlocks();
+
+  // ----------------------------------------------------
+
+  /** Get pointer to block ndx in current event 
+   *  @param ndx        Block index
+   *  @return           returns pointer to blk, NULL if no block present
+   */
+  void* GetBlk( Int_t ndx );
+
+  /** Get pointer to current block in current event */
+  void* GetBlk() { return GetBlk(fCurrentBlk); }
+
+  /** Get first block in current event */
+  void* GetFirstBlk() { fCurrentBlk=0; return GetBlk(0); }
+
+  /** Get next block in current event */
+  void* GetNextBlk() { return GetBlk(++fCurrentBlk); }
+
+  // ----------------------------------------------------
+
+  /** Get size of block ndx 
+   *  @param ndx        Block index
+   *  @return           returns size blk, 0 otherwise
+   */
+  ULong_t GetBlkSize( Int_t ndx );
+
+  /** Get size of current block */ 
+  ULong_t GetBlkSize() { return GetBlkSize( fCurrentBlk ); }
+
+  // ---------------------------------------------------- 
+
+  /** Get origin of block ndx 
+   *  @param ndx        Block index
+   *  @return           origin of block
+   */
+  TString GetBlkOrigin( Int_t ndx );
+
+  /** Get origin of current block */
+  TString GetBlkOrigin(){ return GetBlkOrigin( fCurrentBlk ); }
+
+  // ----------------------------------------------------
+
+  /** Get type of block ndx 
+   *  @param ndx        Block index
+   *  @return           type of block
+   */
+  TString GetBlkType( Int_t ndx ); 
+
+  /** Get type of current block */
+  TString GetBlkType() { return GetBlkType( fCurrentBlk ); } 
+  
+  // ----------------------------------------------------
+  
+  /** Get specification of block ndx 
+   *  @param ndx        Block index
+   *  @return           specification of block
+   */
+  ULong_t GetBlkSpecification( Int_t ndx );
+
+  /** Get specification of current block */
+  ULong_t GetBlkSpecification() { return GetBlkSpecification( fCurrentBlk ); } 
+
+  // ----------------------------------------------------
+
+  /** Checks if current Block should was requested 
+   *  @return           returns kTRUE, if block should was requested
+   */
+  Bool_t CheckIfRequested( AliHLTHOMERBlockDesc* block );
+
+  /* ---------------------------------------------------------------------------------
+   *                          Trigger Handling - private
+   * ---------------------------------------------------------------------------------
+   */
+  
+  /** Loops over the data block from all the readers in the readerlist until
+   *    a triggerdecsision has been found
+   *    Locates the triggerdecision required by fTriggerString and checks if it triggered 
+   *  @return           returns kTRUE, if event was triggered, kFALSE otherwise
+   */
+  Bool_t CheckTriggerDecision();
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                            Members - private
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Proxy Handler to get the list of sources */
+  AliHLTHOMERProxyHandler *fProxyHandler;               //! transient 
+
+  // == connection ==
+
+  /** Pointer to current HOMER reader */
+  AliHLTHOMERReader       *fCurrentReader;              //! transient 
+
+  /** List to pointer of HOMER readers */
+  TList                   *fReaderList;                 //! transient
+
+  // == sources ==
+
+  /** List to HOMER sources */
+  TList                   *fSourceList;                 //! transient
+
+  // == events ==
+
+  /** Number of blockes in current event */
+  ULong_t                  fNBlks;                      //  see above
+
+  /** EventID of current event */
+  ULong64_t                fEventID[BUFFERSIZE];        //  see above
+
+  /** Current block in current event */
+  ULong_t                  fCurrentBlk;                 //  see above
+
+  // == Asynchronous BlockList ==
+
+  /** List containing asychronous blocks */
+  TList                   *fAsyncBlockList;             //  see above
+
+  // == event buffer ==
+
+  /** Event Buffer */
+  TClonesArray            *fEventBuffer;                //  see above
+
+  /** Buffer index to last received event */
+  Int_t                    fBufferTopIdx;               //  see above
+
+  /** Buffer index to last received event */
+  Int_t                    fBufferLowIdx;               //  see above
+
+  /** Buffer index to current event */
+  Int_t                    fCurrentBufferIdx;           //  see above
+
+  /** Navigate index through event buffer */
+  Int_t                    fNavigateBufferIdx;          //  see above
+  
+  // == states ==
+  
+  /** Shows connection status */
+  Bool_t                   fConnected;                  //  see above
+
+  // == trigger selection ==
+
+  /** String indicating which trigger should be used to select events */
+  TString                  fTriggerString;              //  see above
+
+  /** Number Events not triggered, before next triggered event is found */
+  Int_t                    fNEventsNotTriggered;        //  see above
+
+  /** Retry reading next event */
+  Bool_t                   fRetryNextEvent;             //  see above
+
+  ClassDef(AliHLTHOMERManager, 1); // Manage connections to HLT data-sources.
+};
+
+#endif