* AliHLTHOMERBlockDesc holds now a copy of the data
authorjthaeder <jthaeder@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 3 Sep 2009 22:53:53 +0000 (22:53 +0000)
committerjthaeder <jthaeder@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 3 Sep 2009 22:53:53 +0000 (22:53 +0000)
* Introduced a buffer to save the last $BUFFERSIZE events
* Added navigation throught the buffer
* Updated the HLT logo

EVE/EveHLT/AliEveHOMERManagerEditor.cxx
EVE/EveHLT/AliEveHOMERManagerEditor.h
EVE/hlt-macros/HLT-logo.png
EVE/hlt-macros/onlineDisplay.C
HLT/BASE/AliHLTHOMERBlockDesc.cxx
HLT/BASE/AliHLTHOMERBlockDesc.h
HLT/BASE/AliHLTHOMERManager.cxx
HLT/BASE/AliHLTHOMERManager.h

index 12cd381..61b08b8 100644 (file)
@@ -32,6 +32,8 @@ AliEveHOMERManagerEditor::AliEveHOMERManagerEditor(const TGWindow *p, Int_t widt
   fM(0),
   fButtonConnect(0),
   fButtonNextEvent(0),
+  fButtonNavigateBack(0),
+  fButtonNavigateFwd(0),
   fButtonEventLoop(0),
   fEventLoopStarted(kFALSE) {
 
@@ -50,17 +52,22 @@ AliEveHOMERManagerEditor::AliEveHOMERManagerEditor(const TGWindow *p, Int_t widt
   AddFrame(fButtonNextEvent); //, new TGLayoutHints(...));
   fButtonNextEvent->Connect("Clicked()", "AliEveHOMERManagerEditor", this, "NextEvent()");
 
+  fButtonNavigateBack = new TGTextButton(this, "  Navigate Back  ");
+  AddFrame(fButtonNavigateBack); //, new TGLayoutHints(...));
+  fButtonNavigateBack->Connect("Clicked()", "AliEveHOMERManagerEditor", this, "NavigateBack()");
+
+  fButtonNavigateFwd = new TGTextButton(this, "  Navigate Fwd  ");
+  AddFrame(fButtonNavigateFwd); //, new TGLayoutHints(...));
+  fButtonNavigateFwd->Connect("Clicked()", "AliEveHOMERManagerEditor", this, "NavigateFwd()");
 
   fButtonEventLoop = new TGPictureButton(this, gClient->GetPicture("$ALICE_ROOT/EVE/hlt-macros/HLT-logo.png"));
   AddFrame(fButtonEventLoop); //, new TGLayoutHints(...));
   fButtonEventLoop->Connect("Clicked()", "AliEveHOMERManagerEditor", this, "EventLoop()");
-
 }
 
 /******************************************************************************/
 
-void AliEveHOMERManagerEditor::SetModel(TObject* obj)
-{
+void AliEveHOMERManagerEditor::SetModel(TObject* obj) {
   fM = dynamic_cast<AliEveHOMERManager*>(obj);
 
   // Set values of widgets
@@ -69,30 +76,48 @@ void AliEveHOMERManagerEditor::SetModel(TObject* obj)
 
 /******************************************************************************/
 
-// Implements callback/slot methods
-
-// void AliEveHOMERManagerEditor::DoXYZZ()
-// {
-//   fM->SetXYZZ(fXYZZ->GetValue());
-//   Update();
-// }
-
-void AliEveHOMERManagerEditor::ConnectToHLT()
-{
+void AliEveHOMERManagerEditor::ConnectToHLT() {
   // Connects to HOMER sources -> to HLT.
-
+  
   fM->ConnectEVEtoHOMER();
 }
 
-void AliEveHOMERManagerEditor::NextEvent()
-{
+void AliEveHOMERManagerEditor::NextEvent() {
   // call next event from macro
-  gROOT->ProcessLineFast("nextEvent();");
 
+  if ( fM->NextEvent() )
+    return;
+
+  gROOT->ProcessLineFast("processEvent();");
+
+  return;
 }
 
-void AliEveHOMERManagerEditor::EventLoop()
-{
+void AliEveHOMERManagerEditor::NavigateFwd() {
+  // navigate forward
+  
+  if ( !fEventLoopStarted ) {
+    if ( fM->NavigateEventBufferFwd() == -1 )
+      return;
+
+    gROOT->ProcessLineFast("processEvent();");
+  }
+  return;
+}
+
+void AliEveHOMERManagerEditor::NavigateBack() {
+  // navigate back
+
+  if ( !fEventLoopStarted ) {
+    if ( fM->NavigateEventBufferBack() == -1 )
+      return;
+
+    gROOT->ProcessLineFast("processEvent();");
+  }
+  return;
+}
+
+void AliEveHOMERManagerEditor::EventLoop() {
 
   // Start/stop event loop
   if ( !fEventLoopStarted ) {
@@ -104,3 +129,4 @@ void AliEveHOMERManagerEditor::EventLoop()
     fEventLoopStarted = kFALSE;
   }
 }
+
index 58f12d1..f426536 100644 (file)
@@ -34,13 +34,19 @@ public:
   void NextEvent();
   void EventLoop();
 
+  void NavigateBack();
+  void NavigateFwd();
 
 protected:
   AliEveHOMERManager  *fM; // Model object.
 
-  TGTextButton     *fButtonConnect;   // Button to connect to HOMER.
-  TGTextButton     *fButtonNextEvent; // Button to call next Event
+  TGTextButton     *fButtonConnect;      // Button to connect to HOMER.
+  TGTextButton     *fButtonNextEvent;    // Button to call next Even
+  TGTextButton     *fButtonNavigateBack; // Button to navigate back
+  TGTextButton     *fButtonNavigateFwd;  // Button to navigate fwd
+
   TGPictureButton  *fButtonEventLoop; // Button to start/stop event loop, HLT LOGO.
+
 private:
   AliEveHOMERManagerEditor(const AliEveHOMERManagerEditor&);            // Not implemented
   AliEveHOMERManagerEditor& operator=(const AliEveHOMERManagerEditor&); // Not implemented
index bac96a3..1a85a0c 100644 (file)
Binary files a/EVE/hlt-macros/HLT-logo.png and b/EVE/hlt-macros/HLT-logo.png differ
index aad9738..eb49bc9 100644 (file)
@@ -8,7 +8,6 @@
 // - geom_gentle_muon.C
 // ***************************************************
 
-
 #ifndef __CINT__
 #include "unistd.h"
 #include <TEvePointSet.h>
@@ -87,7 +86,6 @@ TEveText*                                 gHLTText         = 0;
 // -- Tracks members
 TEveTrackList*                            gTPCTrack        = 0;
 
-
 // -- Canvas for histos
 TCanvas*                                  gCanvas          = 0;
 
@@ -97,7 +95,7 @@ TCanvas*                                  gCanvas          = 0;
 
 Int_t initializeEveViewer( Bool_t showExtraGeo );
 
-Int_t nextEvent();
+Int_t processEvent();
 
 //Int_t processPHOSClusters( AliHLTHOMERBlockDesc* block);
 
@@ -116,7 +114,6 @@ Int_t processTPCClusters (AliHLTHOMERBlockDesc * block, TEvePointSet cont );
 // -----------------------------------------------------------------
 void onlineDisplay(Bool_t showMuonGeo=kFALSE) {
 
-
   // -- Loading Geometry
   // ---------------------
   Int_t run = 67179;
@@ -172,11 +169,9 @@ Int_t initializeEveViewer( Bool_t showMuonGeo ) {
   // Geometry, scenes, projections and viewers
   //==============================================================================
 
-
   TEveBrowser         *browser = gEve->GetBrowser();
   browser->ShowCloseTab(kFALSE);
   
-
   // -- Disable extra geometry
   // ---------------------------
   if ( ! showMuonGeo ) {
@@ -377,30 +372,30 @@ Int_t initializeEveViewer( Bool_t showMuonGeo ) {
 }
 
 // -----------------------------------------------------------------
-Int_t nextEvent() {
+Int_t processEvent() {
 
   Int_t iResult = 0;
 
+  cout << "===============" << endl;
+  cout << " PROCESS EVENT " << endl;
+  cout << "===============" << endl;
+
   gStyle->SetPalette(1, 0);
   gEve->DisableRedraw();
 
-  Bool_t enableReDraw = kFALSE;
-
-  // -- Get Next Event from HOMER
-  // ------------------------------
-  if ( ( iResult = gHomerManager->NextEvent()) ){
-    return iResult;
-  }
-
   // -- Reset
   // ----------
   if ( gTPCClusters ) gTPCClusters->Reset();
   if ( gPHOSClusters ) gPHOSClusters->Reset();
   if ( gTPCTrack )    gTPCTrack->DestroyElements();
 
+  if ( gHomerManager == NULL) {
+    printf ("No BlockList ... ");
+    return -1;
+  }
   if (gHomerManager->GetBlockList()->IsEmpty() ) {
     printf ("No Blocks in list ... ");
-    return;
+    return -2;
   }
 
   TIter next(gHomerManager->GetBlockList());
@@ -409,13 +404,15 @@ Int_t nextEvent() {
   // -- Iterate over blocks in the block list
   // ------------------------------------------
   while ((block = (AliHLTHOMERBlockDesc*)next())) {
-    
-    //    printf( "------------------- xxxxxxxxxxxxxxx ----------------------\n");
-    //  printf( "Detector           : %s\n", block->GetDetector().Data() );
-    //  printf( "Datatype           : %s\n", block->GetDataType().Data() );
-    // if (block->IsTObject() )
-    //  printf( "Is TObject of class: %s\n", block->GetClassName().Data() );
-    //    printf( "------------------- xxxxxxxxxxxxxxx ----------------------\n");
+        
+#if 0
+    printf( "------------------- xxxxxxxxxxxxxxx ----------------------\n");
+    printf( "Detector           : %s\n", block->GetDetector().Data() );
+    printf( "Datatype           : %s\n", block->GetDataType().Data() );
+    if (block->IsTObject() )
+      printf( "Is TObject of class: %s\n", block->GetClassName().Data() );
+    printf( "------------------- xxxxxxxxxxxxxxx ----------------------\n");
+#endif
 
     // -- CHECK SOURCE
     // -----------------------------------------------------
@@ -426,15 +423,12 @@ Int_t nextEvent() {
 
       // -- ESDTREE
       if ( ! block->GetDataType().CompareTo("ALIESDV0") ) {
-       cout << "ALIESDV0 ------- ALIESDV0 ------ ALIESDV0" << endl;
-
        if(!gTPCTrack){
          gTPCTrack = new TEveTrackList("ESD Tracks");
          gTPCTrack->SetMainColor(6);
          gEve->AddElement(gTPCTrack);
        }
        iResult = processEsdTracks(block, gTPCTrack);
-       enableReDraw = kTRUE;
       }
       
       // -- Process ROOTObj
@@ -455,9 +449,6 @@ Int_t nextEvent() {
        //cout<<"Readlist"<<endl;
        //processHLTRDLST( block );
       }
-
-    
-      
     } // if ( ! block->GetDetector().CompareTo("HLT") ) {
 
     // ++ TPC BLOCK
@@ -466,7 +457,6 @@ Int_t nextEvent() {
       
       // -- Process TPC Clusters
       if ( ! block->GetDataType().CompareTo("CLUSTERS") ) {
-       cout <<"Processing clusters"<<endl;
        if(!gTPCClusters){
          gTPCClusters = new TEvePointSet("TPC Clusters");
          gTPCClusters->SetMainColor(kRed);
@@ -505,48 +495,39 @@ Int_t nextEvent() {
   if ( gSPDClusters ) gSPDClusters->ResetBBox();
   if ( gTPCTrack ) gTPCTrack->ElementChanged();
 
-  
-#if 0
-  TTimeStamp ts(esd->GetTimeStamp());
-  TString win_title("Eve Main Window -- Timestamp: ");
-  win_title += ts.AsString("s");
-  win_title += "; Event # in ESD file: ";
-  win_title += esd->GetEventNumberInFile();
-  gEve->GetBrowser()->SetWindowName(win_title);
-#endif
+
+  // -- Set EventID in Window Title  
+  // --------------------------------------------
+
+  TString winTitle("Eve Main Window -- Event ID : ");
+  winTitle += Form("0x%016X ", gHomerManager->GetEventID() );
+  gEve->GetBrowser()->SetWindowName(winTitle);
 
   // -- Set Projections
   // --------------------------------------------
-  TEveElement* top = gEve->GetCurrentEvent();
 
   // XXX Primary vertex ... to be retrieved from the ESD
   // Double_t x[3] = { 0, 0, 0 };
 
-
-
   TEveElement* top = gEve->GetCurrentEvent();
 
-  if (gRPhiMgr && top)
-  {
+  if (gRPhiMgr && top) {
     gRPhiEventScene->DestroyElements();
     if (gCenterProjectionsAtPrimaryVertex)
       gRPhiMgr->SetCenter(x[0], x[1], x[2]);
     gRPhiMgr->ImportElements(top, gRPhiEventScene);
   }
-  if (gRhoZMgr && top)
-  {
+  
+  if (gRhoZMgr && top) {
     gRhoZEventScene->DestroyElements();
     if (gCenterProjectionsAtPrimaryVertex)
       gRhoZMgr->SetCenter(x[0], x[1], x[2]);
     gRhoZMgr->ImportElements(top, gRhoZEventScene);
   }
 
-
   // --------------------------------------------
-  //  if (enableReDraw) {
-    gEve->Redraw3D(0,1); // (0, 1)
-    //gEve->DoRedraw3D(); // (0, 1)
-    //}
+
+  gEve->Redraw3D(0,1); // (0, 1)
   gEve->EnableRedraw(); 
 
   return iResult;
@@ -554,7 +535,7 @@ Int_t nextEvent() {
 
 // -----------------------------------------------------------------
 void loopEvent() {
-  eventTimer.SetCommand("nextEvent()");
+  eventTimer.SetCommand("processEvent()");
   eventTimer.Start(6000);
 }
 
@@ -593,12 +574,12 @@ Int_t processROOTTOBJ(AliHLTHOMERBlockDesc* block, TEveText* et) {
   if ( ! block->GetClassName().CompareTo("AliHLTGlobalTriggerDecision") ) {
 
     AliHLTGlobalTriggerDecision *trig = dynamic_cast<AliHLTGlobalTriggerDecision*> block->GetTObject();
-    trig->Print(); 
+    //    trig->Print(); 
     
-    et->SetText("balle");;
+    // et->SetText("balle");;
 
-   //    TEveText* tt = new TEveText("Trigger: Class is known ;-) ");
-    //gEve->AddElement(tt);
+    // TEveText* tt = new TEveText("Trigger: Class is known ;-) ");
+    // gEve->AddElement(tt);
 
   }
   else {
@@ -629,34 +610,25 @@ Int_t processEsdTracks( AliHLTHOMERBlockDesc* block, TEveTrackList* cont ) {
   return 0;
 }
 
-
-
- Int_t processTPCClusters(AliHLTHOMERBlockDesc* block, TEvePointSet *  cont) {
-  
-   Int_t iResult = 0;
+// -----------------------------------------------------------------
+Int_t processTPCClusters(AliHLTHOMERBlockDesc* block, TEvePointSet* cont) {
   
   Int_t   slice = block->GetSubDetector();
   Int_t   patch = block->GetSubSubDetector();
   Float_t phi   = ( slice + 0.5 ) * TMath::Pi() / 9.0;  
   Float_t cos   = TMath::Cos( phi );
   Float_t sin   = TMath::Sin( phi );
-    
-  AliHLTTPCClusterData *cd = (AliHLTTPCClusterData*) block->GetData();
-  UChar_t *data            = (UChar_t*) cd->fSpacePoints;
+  
+  AliHLTTPCClusterData *cd = reinterpret_cast<AliHLTTPCClusterData*> (block->GetData());
+  UChar_t *data            = reinterpret_cast<UChar_t*> (cd->fSpacePoints);
 
-  if ( cd->fSpacePointCnt == 0 ) {
-    printf ("No Clusters found in sector %d patch %d.\n", slice, patch );
-    iResult = -1;
-  } 
-  else {
-    
-    for (Int_t ii = 0; ii < cd->fSpacePointCnt; ++ii, data += sizeof(AliHLTTPCSpacePointData)) {
-      AliHLTTPCSpacePointData *sp = (AliHLTTPCSpacePointData *) data;
-      
+  if ( cd->fSpacePointCnt != 0 ) {
+    for (Int_t iter = 0; iter < cd->fSpacePointCnt; ++iter, data += sizeof(AliHLTTPCSpacePointData)) {
+      AliHLTTPCSpacePointData *sp = reinterpret_cast<AliHLTTPCSpacePointData*> (data);
       cont->SetNextPoint(cos*sp->fX - sin*sp->fY, sin*sp->fX + cos*sp->fY, sp->fZ);
     }
   }
   
-  return iResult;
+  return 0;
 }
  
index 5842b8a..71acd55 100644 (file)
@@ -77,6 +77,9 @@ AliHLTHOMERBlockDesc::~AliHLTHOMERBlockDesc() {
     delete fMessage;
   fMessage = NULL;
 
+  if ( fData )
+    delete [] fData;
+  fData = NULL;
 }
 
 /*
@@ -90,7 +93,9 @@ void AliHLTHOMERBlockDesc::SetBlock( void * data, ULong_t size, TString origin,
                                     TString dataType, ULong_t specification ) {
   // see header file for class documentation
 
-  fData = data;
+  fData = new Char_t[size];
+  memcpy( fData, data, size);
+  
   fSize = size;
   fDetector = origin; 
   fDataType = dataType;
index 151db39..718294a 100644 (file)
@@ -187,7 +187,7 @@ private:
   // ----------------------
 
   /** Pointer to data of the block */
-  void*   fData;                    //! transient
+  Char_t* fData;                    //! transient
              
   /** Size of data */
   ULong_t fSize;                    // see above
index cd6e9a5..5425ff8 100644 (file)
@@ -32,7 +32,7 @@
    using namespace std;
 #endif
 
-#define EVE_DEBUG 1
+#define EVE_DEBUG 0
 
 #include "AliHLTHOMERManager.h"
 // -- -- -- -- -- -- -- 
@@ -55,10 +55,14 @@ ClassImp(AliHLTHOMERManager)
   fProxyHandler(NULL),
   fReader(NULL),
   fSourceList(NULL),
-  fBlockList(NULL),
   fNBlks(0),
-  fEventID(0),
+  fEventID(),
   fCurrentBlk(0),
+  fEventBuffer(NULL),
+  fBufferTopIdx(-1),
+  fBufferLowIdx(-1),
+  fCurrentBufferIdx(-1),
+  fNavigateBufferIdx(-1),
   fConnected(kFALSE) {
   // see header file for class documentation
   // or
@@ -88,9 +92,11 @@ AliHLTHOMERManager::~AliHLTHOMERManager() {
     delete fSourceList;
   fSourceList = NULL;
 
-  if ( fBlockList != NULL )
-    delete fBlockList;
-  fBlockList = NULL;
+  if ( fEventBuffer ) {
+    fEventBuffer->Clear();
+    delete fEventBuffer;
+  }
+
 }
 
 //##################################################################################
@@ -112,6 +118,18 @@ Int_t AliHLTHOMERManager::Initialize() {
     HLTError(Form("Creating of ProxyHandler failed."));
   }
  
+  // -- Initialize Event Buffer
+  if ( !fEventBuffer ) {
+    fEventBuffer = new TClonesArray( "TList", BUFFERSIZE );
+  }
+
+  for ( Int_t idx; idx < BUFFERSIZE; ++idx ) {
+    new ((*fEventBuffer)[idx]) TList();
+    (reinterpret_cast<TList*>((*fEventBuffer)[idx]))->SetOwner(kTRUE);
+
+    fEventID[idx] = 0;
+  }
+
   return iResult;
 }
 
@@ -170,7 +188,7 @@ void AliHLTHOMERManager::SetSourceState( AliHLTHOMERSourceDesc * source, Bool_t
 
 /*
  * ---------------------------------------------------------------------------------
- *                         Connection Handling -oublic
+ *                         Connection Handling - public
  * ---------------------------------------------------------------------------------
  */
 
@@ -344,10 +362,10 @@ Int_t AliHLTHOMERManager::NextEvent(){
 
   // -- Get blockCnt and eventID
   fNBlks = static_cast<ULong_t>(fReader->GetBlockCnt());
-  fEventID = static_cast<ULong64_t>(fReader->GetEventID());
+  ULong_t eventID = static_cast<ULong64_t>(fReader->GetEventID());  
   fCurrentBlk = 0;
 
-  HLTInfo(Form("Event 0x%016LX (%Lu) with %lu blocks", fEventID, fEventID, fNBlks));
+  HLTInfo(Form("Event 0x%016LX (%Lu) with %lu blocks", eventID,eventID, fNBlks));
 
 #if EVE_DEBUG
   // Loop for Debug only
@@ -368,16 +386,57 @@ Int_t AliHLTHOMERManager::NextEvent(){
 
   // -- Create BlockList
   if ( fNBlks > 0 ) {
-    HLTInfo(Form("Create Block List"));
-    CreateBlockList();
+    HLTInfo(Form("Add Block List to buffer"));
+    AddBlockListToBuffer();
   }
   else {
-    HLTWarning(Form("Event 0x%016LX (%Lu) with %lu blocks", fEventID, fEventID, fNBlks));
+    HLTWarning(Form("Event 0x%016LX (%Lu) with %lu blocks", eventID, eventID, fNBlks));
   }
     
   return iResult;
 }
 
+/* ---------------------------------------------------------------------------------
+ *                           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
@@ -437,22 +496,35 @@ void AliHLTHOMERManager::CreateReadoutList( const char** sourceHostnames, UShort
 
 /*
  * ---------------------------------------------------------------------------------
- *                            Event Handling
+ *                          Buffer Handling - private
  * ---------------------------------------------------------------------------------
  */
 
-
 //##################################################################################
-void AliHLTHOMERManager::CreateBlockList() {
+void AliHLTHOMERManager::AddBlockListToBuffer() {
   // see header file for class documentation
 
-  // -- Initialize block list
-  if ( fBlockList != NULL )
-    delete fBlockList;
-  fBlockList = NULL;
+  // -- 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;    
 
-  fBlockList = new TList();
-  fBlockList->SetOwner(kTRUE);
+  // -- Fill EventID
+  fEventID[fBufferTopIdx] = static_cast<ULong64_t>(fReader->GetEventID());
+
+  // -- Clear Buffer slot
+  (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Clear();
 
   GetFirstBlk();
 
@@ -466,23 +538,33 @@ void AliHLTHOMERManager::CreateBlockList() {
     
     // -- Check sources list if block is requested
     if ( CheckIfRequested( block ) ) {
-      fBlockList->Add( block );
+      (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Add( block );
     }
     else {
       // XXX HACK Jochen
-      fBlockList->Add( block );
+      (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->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]);
+}
+
 /*
  * ---------------------------------------------------------------------------------
- *                            BlockHandling
+ *                          Block Handling - private
  * ---------------------------------------------------------------------------------
  */
 
index acf465e..b7bec35 100644 (file)
@@ -17,6 +17,7 @@
 */
 
 
+#include "TClonesArray.h"
 #include "TString.h"
 #include "TList.h"
 
@@ -27,6 +28,8 @@
 
 #include "AliHLTLoggingVariadicFree.h"
 
+#define BUFFERSIZE 10
+
 class AliHLTHOMERLibManager;
 
 /**
@@ -124,11 +127,28 @@ public:
   virtual Int_t NextCycle() { return NextEvent(); }
 
   /** Get event ID */
-  ULong_t GetEventID() { return fEventID; }    // 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); }
+
+  /** 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();
 
-  /** Get pointer to block List */
-  TList* GetBlockList() { return fBlockList; } // Get pointer to block List
-  
   ///////////////////////////////////////////////////////////////////////////////////
 
 protected:
@@ -169,13 +189,18 @@ private:
   Bool_t IsConnected() { return fConnected; }  
   
   /* ---------------------------------------------------------------------------------
-   *                            Event Handling - private
+   *                           Buffer Handling - private
    * ---------------------------------------------------------------------------------
    */
 
-  /** Create a TList of blocks, which have been readout */
-  void CreateBlockList();
+  /** Create and add Block List to Buffer */
+  void AddBlockListToBuffer();
 
+  /** Get pointer to block list in event buffer 
+   *  @return     ptr to buffer, NULL if not present
+   */
+  TList* GetBlockListEventBuffer( Int_t idx );
+    
   /*
    * ---------------------------------------------------------------------------------
    *                            Block Handling - private
@@ -260,41 +285,53 @@ private:
    */
 
   /** Proxy Handler to get the list of sources */
-  AliHLTHOMERProxyHandler *fProxyHandler;            //! transient 
+  AliHLTHOMERProxyHandler *fProxyHandler;               //! transient 
 
   // == connection ==
 
   /** Pointer to HOMER reader */
-  AliHLTHOMERReader* fReader;                        //! transient 
+  AliHLTHOMERReader       *fReader;                     //! transient 
 
   // == sources ==
 
   /** List to HOMER sources */
-  TList    *fSourceList;                             //! transient
-  
-  // == blocks ==
-
-  /** List to HOMER blocks */
-  TList    *fBlockList;                              //! transient
+  TList                   *fSourceList;                 //! transient
 
   // == events ==
 
   /** Number of blockes in current event */
-  ULong_t   fNBlks;                                  //  see above
+  ULong_t                  fNBlks;                      //  see above
 
   /** EventID of current event */
-  ULong64_t fEventID;                                //  see above
+  ULong64_t                fEventID[BUFFERSIZE];                    //  see above
 
   /** Current block in current event */
-  ULong_t   fCurrentBlk;                             //  see above
+  ULong_t                  fCurrentBlk;                 //  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
+  Bool_t        fConnected;                              //  see above
 
 
-  ClassDef(AliHLTHOMERManager, 0); // Manage connections to HLT data-sources.
+  ClassDef(AliHLTHOMERManager, 1); // Manage connections to HLT data-sources.
 };
 
 #endif