Changes from Svein Lindal
authorjthaeder <jthaeder@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 23 Nov 2009 02:25:06 +0000 (02:25 +0000)
committerjthaeder <jthaeder@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 23 Nov 2009 02:25:06 +0000 (02:25 +0000)
-Added asynchroneous readout,
-Added triggerdecision check,
-Added dump to file button
-Added Made HOMERreader TObject
-Updated macros

16 files changed:
EVE/EveHLT/AliEveHOMERManager.cxx
EVE/EveHLT/AliEveHOMERManager.h
EVE/EveHLT/AliEveHOMERManagerEditor.cxx
EVE/EveHLT/AliEveHOMERManagerEditor.h
EVE/hlt-macros/hlt_esd_tracks.C [new file with mode: 0644]
EVE/hlt-macros/hlt_structs.C
EVE/hlt-macros/onlineDisplay.C
EVE/hlt-macros/rootlogon.C
HLT/BASE/AliHLTHOMERBlockDesc.h
HLT/BASE/AliHLTHOMERLibManager.cxx
HLT/BASE/AliHLTHOMERManager.cxx
HLT/BASE/AliHLTHOMERManager.h
HLT/BASE/AliHLTHOMERProxyHandler.cxx
HLT/BASE/AliHLTHOMERProxyHandler.h
HLT/BASE/HOMER/AliHLTHOMERReader.cxx
HLT/BASE/HOMER/AliHLTHOMERReader.h

index 55c02e8ce3b44b9a455696187e626a9f981fc1e1..f32963518aae89c2584163d6d6276df29deebc4e 100644 (file)
@@ -8,9 +8,9 @@
 
 
 /** @file   AliEveHOMERManager.cxx
-    @author Jochen Thaeder
+    @author Jochen Thaeder and Svein Lindal
     @date
-    @brief  Manger for HOMER in offline
+    @brief  Manager for HOMER online
 */
 
 #if __GNUC__>= 3
 #endif
 
 #include "unistd.h"
-
+//#include "TIter.h"
 #include "AliEveHOMERManager.h"
-
+#include "AliHLTHOMERBlockDesc.h"
+//#include <TEveElementList.h>
+#include "AliHLTHOMERManager.h"
+#include "AliHLTTriggerDecision.h"
 
 ClassImp(AliEveHOMERManager)
   
@@ -32,12 +35,15 @@ ClassImp(AliEveHOMERManager)
   
 //##################################################################################
 AliEveHOMERManager::AliEveHOMERManager() :
-  AliHLTHOMERManager(), 
-  TEveElementList("Homer Manager"),
-  fSrcList(NULL),
-  fRetryCount(1),
-  fRetrySleeptime(10) {
-  // see header file for class documentation
+AliHLTHOMERManager(), 
+     TEveElementList("Homer Manager"),
+     fSrcList(NULL),
+     fRetryCount(1),
+     fRetrySleeptime(10000)
+{
+  
+// see header file for class documentation
   // or
   // refer to README to build package
   // or
@@ -99,10 +105,10 @@ Int_t AliEveHOMERManager::CreateEveSourcesListLoop() {
       break;
     
     else if (iResult == 1) {
-      HLTWarning( Form("Couldn't find active services, sleeping %d s", fRetryCount) ) ;
+      HLTWarning( Form("Couldn't find active services, sleeping %d s before making attempt %d out of %d", fRetrySleeptime, retry, fRetryCount) ) ;
     }   
     else if (iResult == 2) {
-      HLTWarning( Form("Services List empty, sleeping %d s", fRetryCount) ) ;
+      HLTWarning( Form("Services List empty, sleeping %d s", fRetrySleeptime) ) ;
     }
     else {
       HLTError( Form("Other problem ... \n") ); 
@@ -128,3 +134,4 @@ Int_t AliEveHOMERManager::ConnectEVEtoHOMER( TString detector ) {
   
   return ConnectHOMER(detector);
 }
+
index ec900f749c521f5e55bb008401dc77dd70b86639..5245e996b4826d6a1c9d55a99d08ef69dc88199d 100644 (file)
     from AliHLTHOMERManager, with small additions for alieve interface
 */
 #include <AliHLTHOMERManager.h>
-#include <TEveEventManager.h>
+//\#include <TEveElementList.h>
 #include "AliEveHOMERSourceList.h"
+#include "TString.h"
+class TEveElementList;
 
-
-class AliEveHOMERManager : public AliHLTHOMERManager, public TEveElementList
+class AliEveHOMERManager : public TEveElementList, public AliHLTHOMERManager
 {
 public:
 
@@ -58,6 +59,8 @@ public:
   
   Int_t ConnectEVEtoHOMER(TString detector="ALL");
 
+  //  Int_t CheckTriggerDecision(TString triggers="ALL");
+
   void SetRetryCount(Int_t count, Int_t sleeptime) { fRetryCount = count; fRetrySleeptime = sleeptime; }
 
   ///////////////////////////////////////////////////////////////////////////////////
index 61b08b87a41618a84c47ea0a9b08874939497098..aba15800972b69c97fe7d1e1b84aa4f617a4a182 100644 (file)
@@ -19,6 +19,7 @@
 #include <TGNumberEntry.h>
 #include <TGColorSelect.h>
 #include <TGDoubleSlider.h>
+#include <TGComboBox.h>
 
 //______________________________________________________________________________
 // AliEveHOMERManagerEditor
@@ -28,15 +29,21 @@ ClassImp(AliEveHOMERManagerEditor)
 
 AliEveHOMERManagerEditor::AliEveHOMERManagerEditor(const TGWindow *p, Int_t width, Int_t height,
             UInt_t options, Pixel_t back) :
-  TGedFrame(p, width, height, options | kVerticalFrame, back),
+  
+TGedFrame(p, width, height, options | kVerticalFrame, back),
   fM(0),
-  fButtonConnect(0),
+//  fButtonSaveBlockList(0),
   fButtonNextEvent(0),
   fButtonNavigateBack(0),
   fButtonNavigateFwd(0),
+  fBoxTriggerSelector(0),
+  fButtonEventLoopText(0),
+//  fBoxEventLoopSpeed(0),
   fButtonEventLoop(0),
-  fEventLoopStarted(kFALSE) {
-
+  
+ fEventLoopStarted(kFALSE) 
+{
+  
   MakeTitle("AliEveHOMERManager");
 
   // Create widgets
@@ -44,9 +51,14 @@ AliEveHOMERManagerEditor::AliEveHOMERManagerEditor(const TGWindow *p, Int_t widt
   // AddFrame(fXYZZ, new TGLayoutHints(...));
   // fXYZZ->Connect("SignalName()", "AliEveHOMERManagerEditor", this, "DoXYZZ()");
 
-  fButtonConnect = new TGTextButton(this, "  Connect to HLT  ");
-  AddFrame(fButtonConnect); //, new TGLayoutHints(...));
-  fButtonConnect->Connect("Clicked()", "AliEveHOMERManagerEditor", this, "ConnectToHLT()");
+//   fButtonConnect = new TGTextButton(this, "  Connect to HLT  ");
+//   AddFrame(fButtonConnect); //, new TGLayoutHints(...));
+//   fButtonConnect->Connect("Clicked()", "AliEveHOMERManagerEditor", this, "ConnectToHLT()");
+
+  fButtonWriteToFile = new TGTextButton(this, " Write to file  ");
+  AddFrame(fButtonWriteToFile); //, new TGLayoutHints(...));
+  fButtonWriteToFile->Connect("Clicked()", "AliEveHOMERManagerEditor", this, "WriteBlockListToFile()");
+
 
   fButtonNextEvent = new TGTextButton(this, "  NextEvent  ");
   AddFrame(fButtonNextEvent); //, new TGLayoutHints(...));
@@ -60,6 +72,20 @@ AliEveHOMERManagerEditor::AliEveHOMERManagerEditor(const TGWindow *p, Int_t widt
   AddFrame(fButtonNavigateFwd); //, new TGLayoutHints(...));
   fButtonNavigateFwd->Connect("Clicked()", "AliEveHOMERManagerEditor", this, "NavigateFwd()");
 
+  fBoxTriggerSelector = new TGComboBox(this, "Select Trigger");
+  fBoxTriggerSelector->AddEntry("HLT Global Trigger", 0);
+  fBoxTriggerSelector->AddEntry("Barrel multiplicity trigger", 1);
+  fBoxTriggerSelector->AddEntry("PHOS Geometry trigger", 2);
+  fBoxTriggerSelector->AddEntry("No trigger selection", 3);
+  fBoxTriggerSelector->Connect("Selected(Int_t)","AliEveHOMERManagerEditor", this, "SetTriggerString(int)");
+  fBoxTriggerSelector->SetWidth(150);
+  fBoxTriggerSelector->SetHeight(25);
+  AddFrame(fBoxTriggerSelector);
+
+  fButtonEventLoopText = new TGTextButton(this, "  Loop Events  ");
+  AddFrame(fButtonEventLoopText); //, new TGLayoutHints(...));
+  fButtonEventLoopText->Connect("Clicked()", "AliEveHOMERManagerEditor", this, "EventLoop()");
+
   fButtonEventLoop = new TGPictureButton(this, gClient->GetPicture("$ALICE_ROOT/EVE/hlt-macros/HLT-logo.png"));
   AddFrame(fButtonEventLoop); //, new TGLayoutHints(...));
   fButtonEventLoop->Connect("Clicked()", "AliEveHOMERManagerEditor", this, "EventLoop()");
@@ -76,23 +102,46 @@ void AliEveHOMERManagerEditor::SetModel(TObject* obj) {
 
 /******************************************************************************/
 
-void AliEveHOMERManagerEditor::ConnectToHLT() {
-  // Connects to HOMER sources -> to HLT.
+// void AliEveHOMERManagerEditor::ConnectToHLT() {
+//   // Connects to HOMER sources -> to HLT.
   
-  fM->ConnectEVEtoHOMER();
-}
+//   fM->ConnectEVEtoHOMER();
+// }
 
 void AliEveHOMERManagerEditor::NextEvent() {
   // call next event from macro
 
-  if ( fM->NextEvent() )
+  Int_t iResult = 0;
+    if ( fM->NextEvent() )
     return;
 
+
+//   if ( iResult = fM->CheckTriggerDecision(fTriggerString) ) {
+    
+//     if(iResult == 1) {
+    
+//       fM->NextEvent();
+//       return;
+    
+//     } else if (iResult == 2) {
+    
+//       HLTError(Form("No trigger decision found in event"));
+//       return;
+//     }
+//   } 
+    
   gROOT->ProcessLineFast("processEvent();");
 
   return;
 }
 
+void AliEveHOMERManagerEditor::WriteBlockListToFile() {
+  
+  
+  gROOT->ProcessLineFast("writeToFile();");
+
+}
+
 void AliEveHOMERManagerEditor::NavigateFwd() {
   // navigate forward
   
@@ -123,10 +172,28 @@ void AliEveHOMERManagerEditor::EventLoop() {
   if ( !fEventLoopStarted ) {
     gROOT->ProcessLineFast("loopEvent();");
     fEventLoopStarted = kTRUE;
+    fButtonEventLoopText->SetText(" Stop Loop ");
   }
   else {
     gROOT->ProcessLineFast("stopLoopEvent();");
     fEventLoopStarted = kFALSE;
+    fButtonEventLoopText->SetText(" Loop Events ");
+  }
+}
+
+void AliEveHOMERManagerEditor::SetTriggerString(int id) {
+
+  if (id < 0 || id > 4) {
+    return;
   }
+  
+  TString tsa[4] = {"HLTGlobalTrigger", 
+                   "BarrelMultiplicityTrigger", 
+                   "PHOSgeomTrigger",
+                   "ALL"};
+   
+  fM->SetTriggerString(tsa[id]);
+    
 }
 
index f4265369cfcb075b84bd29b8da3afc5a332070b9..177cc9d1d1056a70004a75e9281132c91a6f4188 100644 (file)
@@ -17,7 +17,7 @@ class TGTextButton;
 class TGNumberEntry;
 class TGColorSelect;
 class TGPictureButton;
-
+class TGComboBox;
 class AliEveHOMERManager;
 
 class AliEveHOMERManagerEditor : public TGedFrame
@@ -30,22 +30,28 @@ public:
   virtual void SetModel(TObject* obj);
 
   // Declare callback/slot methods
-  void ConnectToHLT();
+  //void ConnectToHLT();
   void NextEvent();
   void EventLoop();
 
   void NavigateBack();
   void NavigateFwd();
-
+  void SetTriggerString(int id);
+  void WriteBlockListToFile();
 protected:
-  AliEveHOMERManager  *fM; // Model object.
 
-  TGTextButton     *fButtonConnect;      // Button to connect to HOMER.
-  TGTextButton     *fButtonNextEvent;    // Button to call next Even
+  AliEveHOMERManager  *fM; // Model object.
+  
+  //  TGTextButton     *fButtonConnect; // Button to connect to HOMER.
+  TGTextButton     *fButtonWriteToFile; // Button to write block list to file
+  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.
+  TGComboBox       *fBoxTriggerSelector; // Drop down menu to select trigger criteria.
+  TGTextButton     *fButtonEventLoopText; //Text button to start / stop event loop.
+  //TGComboBox       *fBoxEventLoopSpeed; // Drop down menu to set the speed of the loop.
+  TGPictureButton  *fButtonEventLoop; // Picture button to start/stop event loop, HLT LOGO.
+  
 
 private:
   AliEveHOMERManagerEditor(const AliEveHOMERManagerEditor&);            // Not implemented
diff --git a/EVE/hlt-macros/hlt_esd_tracks.C b/EVE/hlt-macros/hlt_esd_tracks.C
new file mode 100644 (file)
index 0000000..255bd75
--- /dev/null
@@ -0,0 +1,169 @@
+// $Id: esd_tracks.C 35148 2009-10-01 11:21:06Z mtadel $
+// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
+
+/**************************************************************************
+ * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
+ * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
+ * full copyright notice.                                                 *
+ **************************************************************************/
+
+#if !defined(__CINT__) || defined(__MAKECINT__)
+
+#include "TString.h"
+#include "TMath.h"
+#include "TGListTree.h"
+#include "TEveVSDStructs.h"
+#include "TEveManager.h"
+#include "TEveTrackPropagator.h"
+
+#include "AliESDEvent.h"
+#include "AliESDtrackCuts.h"
+#include "AliESDtrack.h"
+#include "AliExternalTrackParam.h"
+
+#include "EVE/EveBase/AliEveTrack.h"
+#include "EVE/EveBase/AliEveMagField.h"
+#include "EVE/EveBase/AliEveEventManager.h"
+
+#include "AliHLTTPCCATrackParam.h"
+#include "AliHLTTPCCATrackConvertor.h"
+
+#endif
+
+AliEveTrack* hlt_esd_make_track(AliESDtrack *at, TEveTrackList* cont)
+{
+  // Make a standard track representation and put it into given container.
+
+  // Choose which parameters to use a track's starting point.
+  // If gkFixFailedITSExtr is TRUE (FALSE by default) and
+  // if ITS refit failed, take track parameters at inner TPC radius.
+
+  const double kCLight = 0.000299792458;
+  double bz = - kCLight*10.*( cont->GetPropagator()->GetMagField(0,0,0).fZ);
+
+  Bool_t innerTaken = kFALSE;
+  if ( ! at->IsOn(AliESDtrack::kITSrefit) && g_esd_tracks_use_ip_on_failed_its_refit)
+  {
+    //tp = at->GetInnerParam();
+    innerTaken = kTRUE;
+  }
+
+  // Add inner/outer track parameters as path-marks.
+
+  Double_t     pbuf[3], vbuf[3];
+
+  AliExternalTrackParam trackParam = *at;
+
+  // take parameters constrained to vertex (if they are)
+
+  if( at->GetConstrainedParam() ){
+    trackParam = *at->GetConstrainedParam();
+  }
+  else if( at->GetInnerParam() ){
+    trackParam = *(at->GetInnerParam());
+  }
+
+  TEveRecTrack rt;
+  {
+    rt.fLabel  = at->GetLabel();
+    rt.fIndex  = (Int_t) at->GetID();
+    rt.fStatus = (Int_t) at->GetStatus();
+    rt.fSign   = (Int_t) trackParam.GetSign();  
+    trackParam.GetXYZ(vbuf);
+    trackParam.GetPxPyPz(pbuf);    
+    rt.fV.Set(vbuf);
+    rt.fP.Set(pbuf);
+    Double_t ep = at->GetP(), mc = at->GetMass();
+    rt.fBeta = ep/TMath::Sqrt(ep*ep + mc*mc);
+  }
+
+  AliEveTrack* track = new AliEveTrack(&rt, cont->GetPropagator());
+  track->SetAttLineAttMarker(cont);
+  track->SetName(Form("AliEveTrack %d", at->GetID()));
+  track->SetElementTitle(esd_track_title(at));
+  track->SetSourceObject(at);
+
+
+  // Set reference points along the trajectory
+  // and the last point
+
+  { 
+    TEvePathMark startPoint(TEvePathMark::kReference);
+    trackParam.GetXYZ(vbuf);
+    trackParam.GetPxPyPz(pbuf);    
+    startPoint.fV.Set(vbuf);
+    startPoint.fP.Set(pbuf);
+    rt.fV.Set(vbuf);
+    rt.fP.Set(pbuf);
+    Double_t ep = at->GetP(), mc = at->GetMass();
+    rt.fBeta = ep/TMath::Sqrt(ep*ep + mc*mc);
+
+    track->AddPathMark( startPoint );    
+  }
+
+
+  if( at->GetTPCPoints(2)>80 ){
+  
+    //
+    // use AliHLTTPCCATrackParam propagator 
+    // since AliExternalTrackParam:PropagateTo()
+    // has an offset at big distances
+    //
+    
+    AliHLTTPCCATrackParam t;
+    AliHLTTPCCATrackConvertor::SetExtParam( t, trackParam );
+    
+    Double_t x0 = trackParam.GetX();
+    Double_t dx = at->GetTPCPoints(2) - x0;
+    
+    //
+    // set a reference at the half of trajectory for better drawing
+    //
+    
+    for( double dxx=dx/2; TMath::Abs(dxx)>=1.; dxx*=.9 ){
+      if( !t.TransportToX(x0+dxx, bz, .99 ) ) continue;
+      AliHLTTPCCATrackConvertor::GetExtParam( t, trackParam, trackParam.GetAlpha() ); 
+      trackParam.GetXYZ(vbuf);
+      trackParam.GetPxPyPz(pbuf);
+      TEvePathMark midPoint(TEvePathMark::kReference);
+      midPoint.fV.Set(vbuf);
+      midPoint.fP.Set(pbuf);    
+      track->AddPathMark( midPoint );
+      break;
+    }
+    
+    //
+    // Set a reference at the end of the trajectory
+    // and a "decay point", to let the event display know where the track ends
+    //
+    
+    for( ; TMath::Abs(dx)>=1.; dx*=.9 ){
+      if( !t.TransportToX(x0+dx, bz, .99 ) ) continue;
+      AliHLTTPCCATrackConvertor::GetExtParam( t, trackParam, trackParam.GetAlpha() ); 
+      trackParam.GetXYZ(vbuf);
+      trackParam.GetPxPyPz(pbuf);
+      TEvePathMark endPoint(TEvePathMark::kReference);
+      TEvePathMark decPoint(TEvePathMark::kDecay);
+      endPoint.fV.Set(vbuf);
+      endPoint.fP.Set(pbuf);
+      decPoint.fV.Set(vbuf);
+      decPoint.fP.Set(pbuf);
+      track->AddPathMark( endPoint );
+      track->AddPathMark( decPoint );
+      break;
+    }  
+  }
+
+  if (at->IsOn(AliESDtrack::kTPCrefit))
+  {
+    if ( ! innerTaken)
+    {
+      esd_track_add_param(track, at->GetInnerParam());
+    }
+    esd_track_add_param(track, at->GetOuterParam());
+  }
+
+
+  return track;
+}
+
index 89e85f58cffb523230fa1ee46a127a0482502688..4d3e01883d34d7eedee7406114d1a094b7936951 100644 (file)
@@ -94,35 +94,35 @@ struct AliHLTTPCClusterData {
 // };
 
 // --------------------------------------------------------------------
-struct AliHLTPHOSDigitDataStruct {
-  /** The x coordinate */
-  Float_t fX;
+// struct AliHLTPHOSDigitDataStruct {
+//   /** The x coordinate */
+//   Float_t fX;
 
-  /** The x coordinate */
-  Float_t fZ;
+//   /** The x coordinate */
+//   Float_t fZ;
 
-  /** The module number */
-  Int_t fModule;
+//   /** The module number */
+//   Int_t fModule;
 
-  /** The amplitude in ADC counts */
-  Float_t fAmplitude;
+//   /** The amplitude in ADC counts */
+//   Float_t fAmplitude;
 
-  /** The time in sample count */ 
-  Float_t fTime;
+//   /** The time in sample count */ 
+//   Float_t fTime;
 
-  /* The energy in GeV */
-  Float_t fEnergy;
+//   /* The energy in GeV */
+//   Float_t fEnergy;
 
-  /** The gain */
-  Int_t fGain;
+//   /** The gain */
+//   Int_t fGain;
   
-  /** The crazyness */
-  Int_t fCrazyness; 
+//   /** The crazyness */
+//   Int_t fCrazyness; 
 
-  /**  The baseline */
-  Float_t fBaseline;
+//   /**  The baseline */
+//   Float_t fBaseline;
 
-};
+// };
 
 // --------------------------------------------------------------------
 // --                            MUON                                --
index 1c9ff85ecf44b3443e2a80852d72c3b0501dff7b..1c8bbe50bafeec064d64435a414dbced9b77e8e5 100644 (file)
 #include "TEveBoxSet.h"
 #include "TEveTrans.h"
 #include "TEveRGBAPalette.h"
-
+#include "TLine.h"
+#include "TEveStraightLineSet.h"
+#include "TGeoNode.h"
+#include "TGeoManager.h"
+#include "TGLOverlayButton.h"
 //****************** AliRoot ***************************************
 #include "AliESDEvent.h"
 #include "AliCDBManager.h"
 #include "AliHLTTriggerDecision.h"
 #include "AliHLTGlobalTriggerDecision.h"
 #include "AliHLTTPCCATrackParam.h"
-#include "AliHLTCaloClusterDataStruct.h"
-#include "AliHLTCaloClusterReader.h"
+
 
 //****************** AliRoot/MUON **********************************
 #include "AliMUONCalibrationData.h"
 #include "AliMUONVCalibParam.h"
 #include "AliMUONGeometryTransformer.h"
 #include "AliMUONGeometryDetElement.h"
+#include "AliMUONConstants.h"
 
 #include "AliMpCDB.h"
 #include "AliMpDDLStore.h"
 //****************** AliRoot/TRD ***********************************
 #include "AliHLTTRDCluster.h"
 #include "AliTRDcluster.h"
+#include "AliTRDCalibraVdriftLinearFit.h"
 
-//#####################AliRoot PHOS ##################################3
-#include "AliPHOSGeometry.h"
 
+
+
+//#################### AliRoot EMCAL ###################################3
+#include "AliHLTCaloClusterDataStruct.h"
+#include "AliHLTCaloClusterReader.h"
+
+#include "HLT/CALO/AliHLTCaloChannelDataHeaderStruct.h"
+#include "HLT/CALO/AliHLTCaloChannelDataStruct.h"
+
+
+//#####################AliRoot PHOS ##################################
+#include "AliPHOSGeometry.h"
+#include "HLT/PHOS/AliHLTPHOSDigitDataStruct.h"
+#include  "AliHLTPHOSChannelDataHeaderStruct.h"
+#include  "AliHLTPHOSChannelDataStruct.h"
 //****************** Macros ****************************************
 #include "hlt_structs.C"
 #include "hlt_alieve_init.C"
 #include "geom_gentle_hlt.C"
 #include "alice-macros/esd_tracks.C"
+#include "hlt_esd_tracks.C"
+//#include "alieve_vizdb.C"
 
 #endif
 
@@ -123,6 +143,21 @@ class AliHLTHOMERBlockDesc;
 
 class TEveViewer;
 
+// 
+class caloCell :  public TObject 
+{
+
+public :
+
+  AliHLTPHOSChannelDataStruct phosStruct;
+
+private :
+  ClassDef(caloCell, 1);
+
+};
+
+
+
 // -----------------------------------------------------------------
 // --                       Geometry / Scenes                     --
 // -----------------------------------------------------------------
@@ -181,7 +216,9 @@ TEvePointSetArray*                        gTRDColClusters    = 0;
 TEvePointSet*                             gTPCClusters       = 0;
 TEvePointSetArray*                        gTPCColClusters    = 0;
 TEveBoxSet*                               gPHOSBoxSet[5]     = {0, 0, 0, 0, 0}; 
+TEveBoxSet*                               gEMCALBoxSet[13]   = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 TEvePointSet*                             gMUONClusters      = 0;
+TEveStraightLineSet*                      gMUONTracks        = 0;
 
 // -- Text output members
 TEveText*                                 gHLTText           = 0;
@@ -192,6 +229,12 @@ TEveTrackList*                            gTPCTrack          = 0;
 // -- Canvas for histograms
 TCanvas*                                  gTRDCanvas         = 0;
 TCanvas*                                  gTPCCanvas         = 0;
+TCanvas*                               gTRDCalibCanvas=0;
+TCanvas *                                              gTRDEORCanvas=0;
+TCanvas *                                 gVertexCanvas = 0;
+
+// -- vertex ----
+Int_t                                      gVertexHistoCount = 0;
 
 // -- TRD --
 Int_t                                     gTRDHistoCount     = 0;
@@ -207,9 +250,16 @@ TH1F*                                     gTPCQMaxOverCharge = 0;
 // -- PHOS --
 TEveElementList*                          gPHOSElementList   = 0;
 
+// -- EMCAL
+TEveElementList*                          gEMCALElementList  = 0;
+TGeoNode                                  *gEMCALNode = 0;
+
 // --- Flag if eventloop is running
 Bool_t                                    gEventLoopStarted = kFALSE;
 
+
+//Container for gGeoManager till it is broken
+TGeoManager *fGeoManager = 0;
 // -----------------------------------------------------------------
 // --                          Methods                            --
 // -----------------------------------------------------------------
@@ -222,6 +272,8 @@ Int_t processEvent();
 
 Int_t processPHOSClusters( AliHLTHOMERBlockDesc* block);
 
+Int_t processEMCALClusters( AliHLTHOMERBlockDesc* block);
+
 Int_t processEsdTracks( AliHLTHOMERBlockDesc* block, TEveTrackList* cont );
 
 Int_t processHLTRDLST( AliHLTHOMERBlockDesc* block );
@@ -234,12 +286,21 @@ Int_t processTRDClusters( AliHLTHOMERBlockDesc * block, TEvePointSet *cont, TEve
 
 Int_t processTRDHistograms (AliHLTHOMERBlockDesc * block, TCanvas * canvas );
 
+Int_t processVertexHistograms  (AliHLTHOMERBlockDesc * block, TCanvas * canvas );
+
+Int_t processTRDCalibHistograms(AliHLTHOMERBlockDesc *block, TCanvas *canvas);
+
 Int_t processMUONClusters( AliHLTHOMERBlockDesc* block);
 
+Int_t processMUONTracks( AliHLTHOMERBlockDesc* block);
+
 Int_t processITSClusters(AliHLTHOMERBlockDesc* block, TEvePointSet* cont);
 
 Int_t processITSHist(AliHLTHOMERBlockDesc* block);
 
+void writeToFile();
+
+
 // #################################################################
 // #################################################################
 // #################################################################
@@ -255,12 +316,12 @@ void onlineDisplay(Bool_t TPCMode = kTRUE, Bool_t MUONMode = kFALSE, Bool_t TRDM
   AliGeomManager::LoadGeometry();
 
   // Get the pointer to gGeoManager before it's broken (bug in alieve)
-  TGeoManager *gm = gGeoManager;
+  fGeoManager = gGeoManager;
 
   // -- Create new hM object
   // -------------------------
   gHomerManager = new AliEveHOMERManager();
-  gHomerManager->SetRetryCount(50,5);
+  gHomerManager->SetRetryCount(1000,15);
 
   Int_t iResult = gHomerManager->Initialize();
   if (iResult) { 
@@ -291,7 +352,7 @@ void onlineDisplay(Bool_t TPCMode = kTRUE, Bool_t MUONMode = kFALSE, Bool_t TRDM
 
   // -- Reset gGeoManager to the original pointer
   // ----------------------------------------------
-  gGeoManager = gm;
+  gGeoManager = fGeoManager;
   gPHOSGeom = AliPHOSGeometry::GetInstance("IHEP", "IHEP");
 
   // -- Finalize Eve
@@ -310,11 +371,22 @@ void onlineDisplay(Bool_t TPCMode = kTRUE, Bool_t MUONMode = kFALSE, Bool_t TRDM
   }    
 
   g_esd_tracks_true_field = kFALSE;
+
 }
 
 // -------------------------------------------------------------------------
 Int_t initializeEveViewer( Bool_t TPCMode, Bool_t MUONMode, Bool_t TRDMode) {
   
+  //=============================================================================
+  // Visualization database
+  //============================================================================
+
+  TEveUtil::AssertMacro("VizDB_scan.C");
+  
+  //  alieve_vizdb();
+  
+
+
   //==============================================================================
   // -- Geometry, scenes, projections and viewers
   //==============================================================================
@@ -335,6 +407,14 @@ Int_t initializeEveViewer( Bool_t TPCMode, Bool_t MUONMode, Bool_t TRDMode) {
   gGeomGentleRhoZ = geom_gentle_rhoz(); gGeomGentleRhoZ->IncDenyDestroy();
   gGeomGentleTRD  = geom_gentle_trd();
 
+  gGeoManager = fGeoManager;
+
+  gEMCALNode = gGeoManager->GetTopVolume()->FindNode("XEN1_1");
+
+  TEveGeoTopNode* emcal_re = new TEveGeoTopNode(gGeoManager, gEMCALNode);
+  gEve->AddGlobalElement(emcal_re);
+  gEve->Redraw3D();
+
   if (gShowMUON) 
     gGeomGentleMUON = geom_gentle_muon(kFALSE);
   
@@ -403,6 +483,9 @@ Int_t initializeEveViewer( Bool_t TPCMode, Bool_t MUONMode, Bool_t TRDMode) {
   g3DView->AddScene(gEve->GetGlobalScene());
   g3DView->AddScene(gEve->GetEventScene());
 
+
+
   pack = pack->NewSlot()->MakePack();
   pack->SetShowTitleBar(kFALSE);
   pack->NewSlot()->MakeCurrent();
@@ -417,6 +500,24 @@ Int_t initializeEveViewer( Bool_t TPCMode, Bool_t MUONMode, Bool_t TRDMode) {
   gRhoZView->AddScene(gRhoZGeomScene);
   gRhoZView->AddScene(gRhoZEventScene);
 
+
+   
+  //Add HLT Text to windows
+  TGLOverlayButton *ob1 = new TGLOverlayButton(g3DView->GetGLViewer(),  "HLT", 0, 20, 110, 60);
+  ob1->SetAlphaValues(0.8, 0.8);
+  cout << "color" << ob1->GetBackColor() << endl;
+  //ob1->SetBackColor(8421631);
+  ob1->SetBackColor(10492431);
+  TGLOverlayButton *ob2 = new TGLOverlayButton(g3DView->GetGLViewer(),  "ALICE", 0, 0, 110, 20);
+  ob2->SetAlphaValues(0.8, 0.8);
+  ob1->SetBackColor(0.2);
+  TGLOverlayButton *ob3 = new TGLOverlayButton(gEve->GetDefaultGLViewer(),  "HLT", 0, 20, 110, 60);
+  ob3->SetAlphaValues(0.8, 0.8);
+  TGLOverlayButton *ob4 = new TGLOverlayButton(gEve->GetDefaultGLViewer(),  "ALICE", 0, 0, 110, 20);
+  ob4->SetAlphaValues(0.8, 0.8);
+
+
   // -- List of Viewers
   // --------------------
 
@@ -505,6 +606,18 @@ Int_t initializeEveViewer( Bool_t TPCMode, Bool_t MUONMode, Bool_t TRDMode) {
     gTRDCanvas = new TCanvas("canvasTRD","canvasTRD", 600, 400);
     gTRDCanvas->Divide(3,2);
     slot->StopEmbedding("TRD histograms");
+    
+    slot=TEveWindow::CreateWindowInTab(browser->GetTabRight());
+    slot->StartEmbedding();
+    gTRDCalibCanvas=new TCanvas("CalibCanvasTRD","CalibCanvasTRD",600,400);
+    gTRDCalibCanvas->Divide(2,2);
+    slot->StopEmbedding("TRD Calibration Histograms");
+
+     slot=TEveWindow::CreateWindowInTab(browser->GetTabRight());
+    slot->StartEmbedding();
+    gTRDEORCanvas=new TCanvas("CalibEORTRD","CalibCEORTRD",600,400);
+    gTRDEORCanvas->Divide(3,2);
+    slot->StopEmbedding("TRD EOR Histograms");
   }
   else if(TPCMode){
     slot = TEveWindow::CreateWindowInTab(browser->GetTabRight());
@@ -517,6 +630,16 @@ Int_t initializeEveViewer( Bool_t TPCMode, Bool_t MUONMode, Bool_t TRDMode) {
     slot->StopEmbedding("TPC histograms");
   }
 
+  
+  slot = TEveWindow::CreateWindowInTab(browser->GetTabRight());
+  slot->StartEmbedding();
+  
+  gVertexCanvas = new TCanvas("canvasVertex","canvasVertex", 600, 400);
+  slot->StopEmbedding("Vertex Histograms");
+
+
+
+
   //==============================================================================
   // -- Additional GUI components
   //==============================================================================
@@ -528,15 +651,27 @@ Int_t initializeEveViewer( Bool_t TPCMode, Bool_t MUONMode, Bool_t TRDMode) {
                                 "are placed here when the main-frame is closed.");
   gEve->GetWindowManager()->SetDefaultContainer(storeTab);
   
+  
+
   return 0;
 }
 
 // -----------------------------------------------------------------
 void nextEvent() {
 
-  if ( gHomerManager->NextEvent() )
-    return;
-  
+  if ( gHomerManager->NextEvent() ) {
+    if (gEventLoopStarted) {
+      cout << "HomerManager failed getting next event, trying to reconnect" << endl;
+
+      gHomerManager->DisconnectHOMER();
+      gHomerManager->ConnectEVEtoHOMER();
+      nextEvent();
+   
+    } else {
+      return;
+    }
+  }
+
   processEvent();
 }
 
@@ -552,10 +687,26 @@ Int_t processEvent() {
   // -- Reset
   //==============================================================================
 
+
+
+
   if ( gTRDCanvas ) {
     gTRDCanvas->Clear();
     gTRDCanvas->Divide(3,2);
   }
+  if(gTRDCalibCanvas){
+       gTRDCalibCanvas->Clear();
+       gTRDCalibCanvas->Divide(2,2);
+ }
+  if(gTRDEORCanvas){
+       gTRDEORCanvas->Clear();
+       gTRDEORCanvas->Divide(3,2);
+ }
+
+  if(gVertexCanvas) {
+    gVertexCanvas->Clear();
+    gVertexCanvas->Divide(2,2);
+  }
 
   if ( gTPCTrack )     gTPCTrack->DestroyElements();
 
@@ -565,11 +716,21 @@ Int_t processEvent() {
   if ( gTPCClusters )  gTPCClusters->Reset();
   if ( gTRDClusters )  gTRDClusters->Reset();
   if ( gMUONClusters ) gMUONClusters->Reset();
+  if ( gMUONTracks ){
+    gMUONTracks->Destroy();
+    gMUONTracks = 0x0;
+  }
 
   if ( gPHOSBoxSet[1] )
     for(int im = 0; im < 5; im++)
       gPHOSBoxSet[im]->Reset();   
 
+  if ( gEMCALElementList)
+    for(int i = 0; i < 12; i++) {
+      gEMCALBoxSet[i]->Reset();
+    }
+  
+
   if ( gTPCColClusters )
     for (Int_t ii = 0; ii <= gTPCBins+1; ++ii) 
       gTPCColClusters->GetBin(ii)->Reset();
@@ -579,17 +740,21 @@ Int_t processEvent() {
       gTRDColClusters->GetBin(ii)->Reset();
 
   gTRDHistoCount = 0;
+  gVertexHistoCount = 0;
+  
 
   //==============================================================================
   // -- Process Blocks
   //==============================================================================
 
   if ( gHomerManager->GetBlockList() == NULL) {
-    printf ("No BlockList ... ");
+    printf ("onlineDisplay:   No BlockList ... ");
+       cout << endl;
     return -1;
   }
   if (gHomerManager->GetBlockList()->IsEmpty() ) {
-    printf ("No Blocks in list ... ");
+    printf ("onlineDisplay:    No Blocks in list ... ");
+       cout<<endl;
     return -2;
   }
 
@@ -600,7 +765,7 @@ Int_t processEvent() {
   // ------------------------------------------
   while ((block = (AliHLTHOMERBlockDesc*)next())) {
         
-#if DEBUG
+#if 1 //DEBUG
     printf( "------------------- xxxxxxxxxxxxxxx ----------------------\n");
     printf( "Detector           : %s\n", block->GetDetector().Data() );
     printf( "Datatype           : %s\n", block->GetDataType().Data() );
@@ -649,8 +814,9 @@ Int_t processEvent() {
       
       // -- Process TPC Clusters
       if ( ! block->GetDataType().CompareTo("CLUSTERS") ) {
-       if(!gTPCClusters){
+       if(!gTPCClusters){        
          gTPCClusters = new TEvePointSet("TPC Clusters");
+         //gTPCClusters->ApplyVizTag("TPC Clusters");
          gTPCClusters->SetMainColor(kRed);
          gTPCClusters->SetMarkerStyle((Style_t)kFullDotSmall);
          gEve->AddElement(gTPCClusters);
@@ -664,6 +830,7 @@ Int_t processEvent() {
          gTPCColClusters->InitBins("Cluster Charge", gTPCBins, 0., gTPCBins*20.);
 
          const Int_t nCol = TColor::GetNumberOfColors();
+         
          for (Int_t ii = 0; ii < gTPCBins+1; ++ii)
            gTPCColClusters->GetBin(ii)->SetMainColor(TColor::GetColorPalette(ii * nCol / (gTPCBins+2)));
          
@@ -716,8 +883,17 @@ Int_t processEvent() {
       else if ( block->GetDataType().CompareTo("ROOTHIST") == 0 ) {
        iResult = processTRDHistograms( block, gTRDCanvas );     
        if ( gTRDCanvas) gTRDCanvas->Update();
+     }
+     
+       else if(block->GetDataType().CompareTo("CALIBRAH")==0){
+       iResult=processTRDCalibHistograms(block,gTRDCalibCanvas);
+       if(gTRDCalibCanvas)gTRDCalibCanvas->Update();
+      }
+  
+      else if(block->GetDataType().CompareTo("CALIBEOR")==0){
+       iResult=processTRDCalibHistograms(block,gTRDEORCanvas);
+       if(gTRDEORCanvas)gTRDEORCanvas->Update();
       }
-
     } // else if ( ! block->GetDetector().CompareTo("TRD") ) {
     
     // ++ MUON BLOCK
@@ -737,6 +913,19 @@ Int_t processEvent() {
        processMUONClusters( block );
        gMUONClusters->ElementChanged();
        
+      }else if(block->GetDataType().CompareTo("MANTRACK") == 0){
+       
+       if ( !gMUONTracks ) {
+         gMUONTracks = new TEveStraightLineSet("MUON Tracks");
+         gMUONTracks->SetMainColor(kRed);
+         gMUONTracks->SetLineWidth(3);
+         gEve->AddElement(gMUONTracks);
+       }
+
+       processMUONTracks( block );
+       gMUONTracks->ElementChanged();
+
+
       } 
     } // else if ( ! block->GetDetector().CompareTo("MUON") && gShowMUON ) {
 
@@ -754,6 +943,13 @@ Int_t processEvent() {
        
        processITSClusters( block , gSPDClusters);
        gSPDClusters->ElementChanged();
+      
+      } else if ( block->GetDataType().CompareTo("ROOTHIST") == 0 ) {
+
+       // -- Process Vertex Histos
+         cout << "processvertexhistorgrams"<<endl;
+         processVertexHistograms( block , gVertexCanvas);
+         gVertexCanvas->Update();
       } 
     } // else if ( ! block->GetDetector().CompareTo("ISPD") ){
 
@@ -804,7 +1000,8 @@ Int_t processEvent() {
     else if ( ! block->GetDetector().CompareTo("PHOS") ) {
 
       // -- Process Digits
-      if ( block->GetDataType().CompareTo("DIGITTYP") == 0 ) {
+      //if ( block->GetDataType().CompareTo("DIGITTYP") == 0 ) { 
+      if ( block->GetDataType().CompareTo("CHANNELT") == 0 ) {
        
        if( !gPHOSElementList ){
          gPHOSElementList = new TEveElementList("PHOS Cells");
@@ -816,12 +1013,14 @@ Int_t processEvent() {
          // -- Create boxsets
          for(int im = 0; im < 5; im++) {
          
-           TEveRGBAPalette* pal = new TEveRGBAPalette(40,120);
+           TEveRGBAPalette* pal = new TEveRGBAPalette(0,120);
+           pal->SetLimits(-0.1, 1024);
            gPHOSBoxSet[im] = new TEveBoxSet(Form("Cells Module %d" , im));
            gPHOSBoxSet[im]->SetPalette(pal);
            gPHOSBoxSet[im]->Reset(TEveBoxSet::kBT_AABox, kFALSE, 64);
            gPHOSBoxSet[im]->SetOwnIds(kTRUE);
            
+
            gPHOSGeom->GetModuleCenter(center, "CPV", im+1);
            angle = gPHOSGeom->GetPHOSAngle(im+1)*TMath::Pi()/180;
          
@@ -843,15 +1042,191 @@ Int_t processEvent() {
 
     } // else if ( ! block->GetDetector().CompareTo("PHOS") ){
 
+    else if ( ! block->GetDetector().CompareTo("EMCAL") ){
+      if ( block->GetDataType().CompareTo("CHANNELT") == 0 ) {
+       
+       cout << "EMCAL, setting up digits display"<<endl;
+       
+       if( !gEMCALElementList ){
+         
+         
+         gEMCALElementList = new TEveElementList("EMCAL Cells");
+         gEMCALElementList->SetTitle("Tooltip");
+         gEve->AddElement(gEMCALElementList);
+         
+         
+         gStyle->SetPalette(1, 0);
+         TEveRGBAPalette* pal = new TEveRGBAPalette(0, 512);
+         pal->SetLimits(0, 1024);
+         
+         
+         for (Int_t sm=0; sm<12; ++sm) {
+             
+           TEveBoxSet* q = new TEveBoxSet(Form("SM %d", sm+1));
+           q->SetOwnIds(kTRUE);
+           
+           q->Reset(TEveBoxSet::kBT_AABox, kFALSE, 64);
+           q->RefMainTrans().SetFrom(*gEMCALNode->GetDaughter(sm)->GetMatrix());
+           q->SetPalette(pal);
+           
+           gEve->AddElement(q, gEMCALElementList);
+           gEMCALBoxSet[sm] = q;
+         }
+       }
+       
+       
+       cout << "Processing emcal digits" << endl;
+       iResult = processEMCALClusters( block );
+       
+       for(int sm = 0; sm < 12; sm++) {
+         gEMCALBoxSet[sm]->ElementChanged();
+       }
+       
+       
+      }
+      
+    } // "EMCAL" blocks end
+
     // ---------------------------------------------------------
   } // while ((block = (AliHLTHOMERBlockDesc*)next())) {
 
+
+  //============================================================================
+  //   Reading out the histograms
+  //===========================================================================
+  TIter anext(gHomerManager->GetAsyncBlockList());
+  cout << gHomerManager->GetAsyncBlockList()->GetSize() << endl;
+  cout << "Asynced it"<<endl;
+  while ( (block = (AliHLTHOMERBlockDesc*)anext()) ) {
+
+#if 1 //DEBUG
+    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
+
+
+
+    // ++ ISPD BLOCK
+    // +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+    if ( ! block->GetDetector().CompareTo("ISPD") ){
+      if ( block->GetDataType().CompareTo("ROOTHIST") == 0 ) {
+      
+       // -- Process Vertex Histos
+       cout << "processvertexhistorgrams"<<endl;
+       processVertexHistograms( block , gVertexCanvas);
+       gVertexCanvas->Update();
+      } 
+    }
+  
+
+    // ++ PHOS BLOCK
+    // +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+    else if ( ! block->GetDetector().CompareTo("PHOS") ) {
+
+      // -- Process Digits
+      //if ( block->GetDataType().CompareTo("DIGITTYP") == 0 ) { 
+      if ( block->GetDataType().CompareTo("CHANNELT") == 0 ) {
+       
+       if( !gPHOSElementList ){
+         gPHOSElementList = new TEveElementList("PHOS Cells");
+         gEve->AddElement(gPHOSElementList);
+         
+         TVector3 center;
+         Float_t angle;
+         
+         // -- Create boxsets
+         for(int im = 0; im < 5; im++) {
+         
+           TEveRGBAPalette* pal = new TEveRGBAPalette(0,120);
+           pal->SetLimits(-0.1, 1024);
+           gPHOSBoxSet[im] = new TEveBoxSet(Form("Cells Module %d" , im));
+           gPHOSBoxSet[im]->SetPalette(pal);
+           gPHOSBoxSet[im]->Reset(TEveBoxSet::kBT_AABox, kFALSE, 64);
+           gPHOSBoxSet[im]->SetOwnIds(kTRUE);
+           
+
+           gPHOSGeom->GetModuleCenter(center, "CPV", im+1);
+           angle = gPHOSGeom->GetPHOSAngle(im+1)*TMath::Pi()/180;
+         
+           gPHOSBoxSet[im]->RefitPlex();
+           TEveTrans& t = gPHOSBoxSet[im]->RefMainTrans();
+           t.SetupRotation(1, 2, angle );
+           t.SetPos(center.X(), center.Y(), center.Z());
+           
+           gPHOSElementList->AddElement(gPHOSBoxSet[im]);
+         }
+       } // for(int im = 0; im < 5; im++) {
+       
+       iResult = processPHOSClusters( block );
+       
+       for(int im = 0; im < 5; im++)
+         gPHOSBoxSet[im]->ElementChanged();
+
+      } // if ( block->GetDataType().CompareTo("DIGITTYP") == 0 ) {
+
+    } // else if ( ! block->GetDetector().CompareTo("PHOS") ){
+
+    else if ( ! block->GetDetector().CompareTo("EMCA") ){
+      if ( block->GetDataType().CompareTo("CHANNELT") == 0 ) {
+       
+       cout << "EMCAL, setting up digits display"<<endl;
+       
+       if( !gEMCALElementList ){
+         
+         
+         gEMCALElementList = new TEveElementList("EMCAL Cells");
+         gEMCALElementList->SetTitle("Tooltip");
+         gEve->AddElement(gEMCALElementList);
+         
+         
+         gStyle->SetPalette(1, 0);
+         TEveRGBAPalette* pal = new TEveRGBAPalette(0, 512);
+         pal->SetLimits(0, 1024);
+         
+         
+         for (Int_t sm=0; sm<12; ++sm) {
+             
+           TEveBoxSet* q = new TEveBoxSet(Form("SM %d", sm+1));
+           q->SetOwnIds(kTRUE);
+           
+           q->Reset(TEveBoxSet::kBT_AABox, kFALSE, 64);
+           q->RefMainTrans().SetFrom(*gEMCALNode->GetDaughter(sm)->GetMatrix());
+           q->SetPalette(pal);
+           
+           gEve->AddElement(q, gEMCALElementList);
+           gEMCALBoxSet[sm] = q;
+         }
+       }
+       
+       
+       cout << "Processing emcal digits" << endl;
+       iResult = processEMCALClusters( block );
+       
+       for(int sm = 0; sm < 12; sm++) {
+         gEMCALBoxSet[sm]->ElementChanged();
+       }
+       
+       
+      }
+      
+    } // "EMCAL" blocks end
+
+
+
+
+  }
+
   //==============================================================================
   // -- Update Objects
   //==============================================================================
 
   // -- TPC Histograms
   if ( gTPCCanvas && gTPCCharge && gTPCQMax) {
+
     gTPCCanvas->Clear();    
     gTPCCanvas->Divide(1,3);
 
@@ -878,6 +1253,12 @@ Int_t processEvent() {
     for(int im = 0; im < 5; im++)
       gPHOSBoxSet[im]->ResetBBox();      
 
+  if ( gEMCALElementList )
+    for(int sm = 0; sm < 12; sm++) 
+      gEMCALBoxSet[sm]->ResetBBox();
+    
+  
+
   //==============================================================================
   // -- Set EventID in Window Title  
   // -- Update Objects
@@ -953,15 +1334,19 @@ Int_t processROOTTOBJ(AliHLTHOMERBlockDesc* block, TEveText* /*et*/) {
 // -----------------------------------------------------------------
 Int_t processEsdTracks( AliHLTHOMERBlockDesc* block, TEveTrackList* cont ) {
 
+  cout << "Adding tracks" << endl;
+
   AliESDEvent* esd = (AliESDEvent *) (block->GetTObject());
   esd->GetStdContent();
 
   esd_track_propagator_setup(cont->GetPropagator(),0.1*esd->GetMagneticField(), 520);
 
-  printf( "Number of ESD Tracks : %d \n", esd->GetNumberOfTracks());
+  //  printf( "Number of ESD Tracks : %d \n", esd->GetNumberOfTracks());
 
   for (Int_t iter = 0; iter < esd->GetNumberOfTracks(); ++iter) {
-    AliEveTrack* track = dynamic_cast<AliEveTrack*>(esd_make_track(esd->GetTrack(iter), cont));
+    cout << "track" << endl;
+    //AliEveTrack* track = dynamic_cast<AliEveTrack*>(esd_make_track(esd->GetTrack(iter), cont));
+    AliEveTrack* track = dynamic_cast<AliEveTrack*>(hlt_esd_make_track(esd->GetTrack(iter), cont));
     cont->AddElement(track);
   }
   
@@ -971,49 +1356,119 @@ Int_t processEsdTracks( AliHLTHOMERBlockDesc* block, TEveTrackList* cont ) {
   return 0;
 }
 
-
 // -----------------------------------------------------------------
-// Int_t processPHOSClusters(AliHLTHOMERBlockDesc* block) {
+Int_t processPHOSClusters(AliHLTHOMERBlockDesc* block) {
 
-//    AliHLTCaloClusterHeaderStruct *hd = reinterpret_cast<AliHLTCaloClusterHeaderStruct*> (block->GetData());
-//    AliHLTCaloClusterReader * cReader = new AliHLTCaloClusterReader();
-//    cReader->SetMemory(hd);
-   
-//    AliHLTCaloClusterDataStruct* cd = 0;
+  
+  
+  cout << "PHOS PHOS"<<endl;
+  
+  AliHLTPHOSChannelDataHeaderStruct *chh = reinterpret_cast<AliHLTPHOSChannelDataHeaderStruct*> (block->GetData());
+  
+
+  AliHLTPHOSChannelDataStruct *chd = reinterpret_cast<AliHLTPHOSChannelDataStruct*>(chh+1);
+
+  for(UInt_t i = 0; i < chh->fNChannels; i++, chd++) {
+    
+    Int_t gain = (chd->fChannelID >> 12)&0x1;    
+    Int_t module = (chd->fChannelID >> 13)&0x1f;
+    module = 4 -module;
    
-//    while( (cd = cReader->NextCluster()) ){
 
-//      cout << cd->fEnergy << endl;
-     
-//      Float_t e = cd->fEnergy;
-//      Float_t x = cd->fGlobalPos[0];
-//      Float_t y = cd->fGlobalPos[1];
-//      Float_t z = cd->fGlobalPos[2];
+    if(gain == 0)
+      
+      {
+       Float_t x = (static_cast<Float_t>(chd->fChannelID&0x3f) - 32)* 2.2;
+       Float_t z = (static_cast<Float_t>((chd->fChannelID >> 6)&0x3f) - 28) * 2.2;
+       //      gPHOSBoxSet[ds->fModule]->AddBox(ds->fLocX, 0, ds->fLocZ, 2.2, ds->fEnergy*20, 2.2);
+       gPHOSBoxSet[module]->AddBox(x, 0, z, 2.2, chd->fEnergy/15, 2.2);
+       gPHOSBoxSet[module]->DigitValue(static_cast<Int_t>(chd->fEnergy));
+       
+       caloCell *cs = new caloCell();
+       cs->phosStruct = *chd;
+       gPHOSBoxSet[module]->DigitId(cs);
+      }
 
-     
-//      gPHOSBoxSet->AddBox(x, y, z, 2.2, e*10, 2.2);
-     
-//    }
+
+
+  }
+
+  return 0;
+}
+
+// // -----------------------------------------------------------------
+// Int_t processPHOSClusters(AliHLTHOMERBlockDesc* block) {
+
+//   AliHLTPHOSDigitHeaderStruct *dh = reinterpret_cast<AliHLTPHOSDigitHeaderStruct*> (block->GetData());
+//   //UInt_t nClusters = block->GetSize()/sizeof(AliHLTPHOSDigitDataStruct);
+    
+//     UInt_t nDigits = dh->fNDigits;
+
+//     AliHLTPHOSDigitDataStruct *ds = reinterpret_cast<AliHLTPHOSDigitDataStruct*>(reinterpret_cast<UChar_t*>(dh)+sizeof(AliHLTPHOSDigitHeaderStruct));
+
+//   for(UInt_t i = 0; i < nDigits; i++, ds++) {
+//     gPHOSBoxSet[ds->fModule]->AddBox(ds->fLocX, 0, ds->fLocZ, 2.2, ds->fEnergy*20, 2.2);
+//     gPHOSBoxSet[ds->fModule]->DigitValue(static_cast<Int_t>(ds->fEnergy*100));
+//   }
 
 //   return 0;
 // }
 
 
 
+
+
+
+
+
+
 // -----------------------------------------------------------------
-Int_t processPHOSClusters(AliHLTHOMERBlockDesc* block) {
+Int_t processEMCALClusters(AliHLTHOMERBlockDesc* block) {
 
-  AliHLTPHOSDigitDataStruct *ds = reinterpret_cast<AliHLTPHOSDigitDataStruct*> (block->GetData());
-    UInt_t nClusters = block->GetSize()/sizeof(AliHLTPHOSDigitDataStruct);
+  AliHLTCaloChannelDataHeaderStruct *dhs = reinterpret_cast<AliHLTCaloChannelDataHeaderStruct*> (block->GetData());
+  Short_t nC = dhs->fNChannels;
+  AliHLTUInt8_t *ui = reinterpret_cast<AliHLTUInt8_t*>(dhs) + sizeof(AliHLTCaloChannelDataHeaderStruct);
+  AliHLTCaloChannelDataStruct *ds = reinterpret_cast<AliHLTCaloChannelDataStruct*>(ui);
+  
+  UShort_t fX =0;
+  UShort_t fZ =0;
+  UShort_t fGain =0;
+  UShort_t fModuleId =0;
+  
 
-  for(UInt_t i = 0; i < nClusters; i++, ds++) {
-    gPHOSBoxSet[ds->fModule]->AddBox(ds->fX, 0, ds->fZ, 2.2, ds->fEnergy*20, 2.2);
-    gPHOSBoxSet[ds->fModule]->DigitValue(static_cast<Int_t>(ds->fEnergy*100));
-  }
 
+  for(Short_t s = 0; s < nC; s++ ) {
+  
+
+
+    //    cout << nC << " "<< s << endl;
+    //cout << ds->fEnergy << " " << ds->fChannelID<<endl;
+    
+
+    
+    fX = ds->fChannelID&0x3f;
+    fZ = (ds->fChannelID >> 6)&0x3f;
+    fGain = (ds->fChannelID >> 12)&0x1;
+    fModuleId  = (ds->fChannelID >> 13)&0x1f;
+    
+    //    cout << fX << " " << fZ << " " << fGain << " " << fModuleId <<endl;
+   
+    if ( ( fModuleId > -1 && fModuleId < 12 ) ) {
+      gEMCALBoxSet[fModuleId]->AddBox(10, fX*6-12*6, fZ*6-24*6, ds->fEnergy/4, 6, 6);
+      gEMCALBoxSet[fModuleId]->DigitValue(static_cast<Int_t>(ds->fEnergy));
+    } 
+    ds++;
+  
+}
+  
+
+    
   return 0;
 }
 
+
+
+
 // -----------------------------------------------------------------
 Int_t processITSClusters(AliHLTHOMERBlockDesc* block, TEvePointSet* cont) {
 
@@ -1120,10 +1575,10 @@ Int_t processMUONClusters(AliHLTHOMERBlockDesc* block) {
       const AliHLTMUONRecHitStruct* hit = &trigrec->fHit[0];
       for(AliHLTUInt32_t ch = 0; ch < 4; ch++)
        {
-         cout << setw(10) << left << ch + 11 << setw(0);
-         cout << setw(13) << left << hit->fX << setw(0);
-         cout << setw(13) << left << hit->fY << setw(0);
-         cout << hit->fZ << setw(0) << endl;
+//       cout << setw(10) << left << ch + 11 << setw(0);
+//       cout << setw(13) << left << hit->fX << setw(0);
+//       cout << setw(13) << left << hit->fY << setw(0);
+//       cout << hit->fZ << setw(0) << endl;
          if(hit->fX!=0.0 && hit->fY!=0.0 && hit->fZ!=0.0)
            gMUONClusters->SetNextPoint(hit->fX,hit->fY,hit->fZ);
          hit++;
@@ -1135,6 +1590,59 @@ Int_t processMUONClusters(AliHLTHOMERBlockDesc* block) {
   return iResult;
 }
 
+// -----------------------------------------------------------------
+Int_t processMUONTracks(AliHLTHOMERBlockDesc* block) {
+  
+  Int_t iResult = 0;
+  
+  unsigned long size = block->GetSize();
+  Int_t * buffer = (Int_t *)block->GetData();
+  AliHLTMUONRecHitStruct hit1,hit2;
+  hit1.fX = hit1.fY = hit1.fZ = hit2.fX = hit2.fY = hit2.fZ = 0;
+  Int_t ch1=0, ch2=0;
+  Float_t x0=0.0,y0=0.0,z0=0.0;
+  Float_t x3=0.0,y3=0.0,z3=0.0;
+  if(block->GetDataType().CompareTo("MANTRACK") == 0){  
+    AliHLTMUONMansoTracksBlockReader mantrackblock(buffer, size);
+    const AliHLTMUONMansoTrackStruct* mtrack = mantrackblock.GetArray();
+    for(AliHLTUInt32_t ientry = 0; ientry < mantrackblock.Nentries(); ientry++){
+      const AliHLTMUONRecHitStruct* hit = &mtrack->fHit[0];
+      for(AliHLTUInt32_t ch = 0; ch < 4; ch++){
+       // cout << setw(10) << left << ch + 7 << setw(0);
+       // cout << setw(13) << left << hit->fX << setw(0);
+       // cout << setw(13) << left << hit->fY << setw(0);
+       // cout << hit->fZ << setw(0) << endl;
+       if(hit->fZ != 0.0){
+         if(ch==0 || ch==1){
+           hit1 = *hit; ch1 = ch+6;
+         }else{
+           hit2 = *hit; ch2 = ch+6;
+         }
+       }
+       hit++;
+      }// trig chamber loop
+      // printf("ch : %d, (X,Y,Z) : (%f,%f,%f)\n",ch1,hit1.fX,hit1.fY,hit1.fZ);
+      // printf("ch : %d, (X,Y,Z) : (%f,%f,%f)\n",ch2,hit2.fX,hit2.fY,hit2.fZ);
+      // meminfo();
+      z3 = AliMUONConstants::DefaultChamberZ(ch2+4);
+      y3 =  hit1.fY - (hit1.fZ-z3)*(hit1.fY - hit2.fY)/(hit1.fZ - hit2.fZ) ;
+      x3 =  hit1.fX - (hit1.fZ-z3)*(hit1.fX - hit2.fX)/(hit1.fZ - hit2.fZ) ;
+
+      z0 = AliMUONConstants::DefaultChamberZ(ch1);
+      y0 =  hit1.fY - (hit1.fZ-z0)*(hit1.fY - hit2.fY)/(hit1.fZ - hit2.fZ) ;
+      x0 =  hit1.fX - (hit1.fZ-z0)*(hit1.fX - hit2.fX)/(hit1.fZ - hit2.fZ) ;
+      
+
+      gMUONTracks->AddLine(x0,y0,z0,x3,y3,z3);
+      mtrack++;
+    }
+    cout<<"NofManso Tracks : "<<mantrackblock.Nentries()<<endl;
+  }
+  
+  return iResult;
+
+}
+
  
 // -----------------------------------------------------------------
 Int_t processTRDClusters(AliHLTHOMERBlockDesc* block, TEvePointSet *cont, TEvePointSetArray *contCol) {
@@ -1210,8 +1718,106 @@ Int_t processTRDHistograms(AliHLTHOMERBlockDesc* block, TCanvas * canvas) {
   return iResult;
 }
 
+
+// -----------------------------------------------------------------
+Int_t processVertexHistograms(AliHLTHOMERBlockDesc* block, TCanvas * canvas) {
+
+  Int_t iResult = 0;
+  cout << gVertexHistoCount<<endl;
+
+  if ( ! block->GetClassName().CompareTo("TH1F")) {
+    cout << "TH1F"<<endl;
+    TH1F* histo = reinterpret_cast<TH1F*>(block->GetTObject());
+    ++gVertexHistoCount;
+  
+    canvas->cd(gVertexHistoCount);
+    histo->Draw();
+//     pad->SetGridy();
+//     pad->SetGridx();
+
+  }  else if ( ! block->GetClassName().CompareTo("TH2F")) {
+    cout << "TH2F"<<endl;
+    TH2F *hista = reinterpret_cast<TH2F*>(block->GetTObject());
+    if (hista) {
+      
+      ++gVertexHistoCount;
+  
+      canvas->cd(gVertexHistoCount);
+      hista->Draw();
+    }
+  }
+  canvas->cd();
+
+  cout << "done with histos"<< endl;
+  return iResult;
+
+
+}
+
+//*-------------------------------------------------------------------------------------- 
+Int_t processTRDCalibHistograms(AliHLTHOMERBlockDesc* block, TCanvas * canvas) {
+  Int_t iResult = 0;
+
+  TObjArray *HistArray=(TObjArray*)block->GetTObject();
+  Int_t nCalibHistos=HistArray->GetEntriesFast();
+  for(Int_t CalibHistoCount=0;CalibHistoCount<nCalibHistos;CalibHistoCount++){
+    canvas->cd(CalibHistoCount+1);
+    
+    if(HistArray->At(CalibHistoCount)->InheritsFrom("TH2S")){
+        TH2S *histCalib=(TH2S*)(HistArray->At(CalibHistoCount));
+        histCalib->Draw("colz");
+       }
+     else if(HistArray->At(CalibHistoCount)->InheritsFrom("TH2")){
+      //TH2D *histCalib=dynamic_cast<TH2D*>(HistArray->At(CalibHistoCount));
+      TH2D *histCalib=(TH2D*)(HistArray->At(CalibHistoCount));
+      histCalib->Draw("lego2");
+    }
+    else if(HistArray->At(CalibHistoCount)->InheritsFrom("TH1")){
+      //TH1D *histCalib=dynamic_cast<TH1D*>(HistArray->At(CalibHistoCount));
+      TH1D *histCalib=(TH1D*)(HistArray->At(CalibHistoCount));
+      histCalib->Draw();
+    }
+    else if(HistArray->At(CalibHistoCount)->InheritsFrom("AliTRDCalibraVdriftLinearFit")){
+      //TH2S *histCalib = ((dynamic_cast<AliTRDCalibraVdriftLinearFit*>(HistArray->At(CalibHistoCount)))->GetLinearFitterHisto(10,kTRUE));
+      TH2S *histCalib =(TH2S*)(((AliTRDCalibraVdriftLinearFit*)HistArray->At(CalibHistoCount))->GetLinearFitterHisto(10,kTRUE));
+
+      histCalib->Draw();
+    }
+    
+   
+  }
+ return iResult;
+}
 //****************************************************************************
 
+void writeToFile(){
+
+    cout << "balle " << endl;
+  
+  TList * bList = gHomerManager->GetBlockList();
+  TFile * file = TFile::Open(Form("Event_0x%016X_ITS.root", gHomerManager->GetEventID()), "RECREATE"); 
+  bList->Write("blockList", TObject::kSingleKey);
+  file->Close();
+  
+  bList = gHomerManager->GetAsyncBlockList();
+  TFile * afile = TFile::Open(Form("Event_0x%016X_Async.root", gHomerManager->GetEventID()), "RECREATE"); 
+  bList->Write("blockList", TObject::kSingleKey);
+  afile->Close();
+
+
+//   TIter next(bList);
+  
+//   AliHLTHOMERBlockDesc* block = 0;
+  
+//   // -- Iterate over blocks in the block list
+//   // ------------------------------------------
+//   while ((block = (AliHLTHOMERBlockDesc*)next())) {
+//     cout << "balle " << endl;
+//   }
+  
+}
+
+
 // -----------------------------------------------------------------
 void loopEvent() {
   eventTimer.SetCommand("nextEvent()");
@@ -1242,9 +1848,10 @@ void EventLoopFast() {
   if ( gEventLoopStarted ) {
     loopEventFast();
     gEventLoopStarted = kTRUE;
-  }
-  else {
+  
+  } else {  
     stopLoopEventFast();
     gEventLoopStarted = kFALSE;
+  
   }
 }
index c755d7d53aa0740afd60e6ebf429747b26b33d11..0036b1d1d426cfffbe17328d394883224b22619c 100644 (file)
@@ -39,6 +39,8 @@
   includePath        += "-I${ALICE_ROOT}/MUON ";
   includePath        += "-I${ALICE_ROOT}/MUON/mapping ";
   includePath        += "-I${ALICE_ROOT}/HLT/MUON ";
-  includePath        += "-I${ALICE_ROOT}/HLT/TPCLib/tracking-ca";
+  includePath        += "-I${ALICE_ROOT}/HLT/TPCLib/tracking-ca ";
+  includePath        += "-I${ALICE_ROOT}/PWG0";
+  
   gSystem->SetIncludePath(includePath.Data());
 }
index 718294aa981be798f87d214588377825a9db3a0a..0d0430c4c3e11af42dc7f2698aed651725024635 100644 (file)
@@ -247,7 +247,7 @@ private:
 
   // XXXXXXXXXXXXXXXXXXXXXXXX REMOVE IF NOT NEEDED XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
-  ClassDef( AliHLTHOMERBlockDesc, 0 )
+  ClassDef( AliHLTHOMERBlockDesc, 1 )
 };
 
 #endif
index b2a81f22e69cb963a693e339acf5e2dd161d3bf8..44ddbcce0564f442c8b094a09d24902d5872a7b7 100644 (file)
@@ -80,7 +80,7 @@ AliHLTHOMERReader* AliHLTHOMERLibManager::OpenReader(const char* hostname, unsig
   
   AliHLTHOMERReader* pReader=NULL;
   if (fFctCreateReaderFromTCPPort!=NULL && (pReader=(((AliHLTHOMERReaderCreateFromTCPPort_t)fFctCreateReaderFromTCPPort)(hostname, port)))==NULL) {
-    //HLTError("can not create instance of HOMER reader (function %p)", fFctCreateReaderFromTCPPort);
+    cout <<"can not create instance of HOMER reader from ports" << endl;
   }
   
   return pReader;
@@ -98,6 +98,7 @@ AliHLTHOMERReader* AliHLTHOMERLibManager::OpenReader(unsigned int tcpCnt, const
   AliHLTHOMERReader* pReader=NULL;
   if (fFctCreateReaderFromTCPPorts!=NULL && (pReader=(((AliHLTHOMERReaderCreateFromTCPPorts_t)fFctCreateReaderFromTCPPorts)(tcpCnt, hostnames, ports)))==NULL) {
     //HLTError("can not create instance of HOMER reader (function %p)", fFctCreateReaderFromTCPPorts);
+    cout << "can not create instance of HOMER reader from port"<<endl;
   }
   
   return pReader;
index 0bbc21f7ab890a22d1b518fda9fa4cdba27a4da6..daf4937af22b32ecfa3c79d27cb323ef83f218c0 100644 (file)
-//-*- 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"
-// -- -- -- -- -- -- -- 
-ClassImp(AliHLTHOMERManager)
-
-/*
- * ---------------------------------------------------------------------------------
- *                            Constructor / Destructor
- * ---------------------------------------------------------------------------------
- */
-
-//##################################################################################
-  AliHLTHOMERManager::AliHLTHOMERManager() :
-  fLibManager(new AliHLTHOMERLibManager),
-  fStateHasChanged(kTRUE),
-  fProxyHandler(NULL),
-  fReader(NULL),
-  fSourceList(NULL),
-  fNBlks(0),
-  fEventID(),
-  fCurrentBlk(0),
-  fEventBuffer(NULL),
-  fBufferTopIdx(-1),
-  fBufferLowIdx(-1),
-  fCurrentBufferIdx(-1),
-  fNavigateBufferIdx(-1),
-  fConnected(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 ( fReader )
-      fLibManager->DeleteReader(fReader);
-    delete fLibManager;
-    fLibManager = NULL;
-    fReader = NULL;
-  }
-
-  if ( fProxyHandler != NULL )
-    delete fProxyHandler;
-  fProxyHandler = NULL;
-
-  if ( fSourceList != NULL )
-    delete fSourceList;
-  fSourceList = NULL;
-
-  if ( fEventBuffer ) {
-    fEventBuffer->Clear();
-    delete fEventBuffer;
-  }
-
-}
-
-//##################################################################################
-Int_t AliHLTHOMERManager::Initialize() {
-  // see header file for class documentation
-
-  Int_t iResult = 0;
-
-  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 Event Buffer
-  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 iResult;
-  }
-  
-  // -- If already connected, disconnect before connect
-  if ( IsConnected() )
-    DisconnectHOMER();
-  
-  // -- Create the Readoutlist
-  UShort_t* sourcePorts = new UShort_t [fSourceList->GetEntries()];
-  const char ** sourceHostnames = new const char* [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
-  if ( !fReader )
-    fReader = fLibManager->OpenReader( sourceCount, sourceHostnames, sourcePorts );
-  
-  iResult = fReader->GetConnectionStatus();
-  if ( iResult ) {
-    // -- Connection failed
-
-    UInt_t ndx = fReader->GetErrorConnectionNdx();
-
-    if ( ndx < sourceCount ) {
-      HLTError(Form("Error establishing connection to TCP source %s:%hu: %s (%d)",
-                   sourceHostnames[ndx], sourcePorts[ndx], strerror(iResult), iResult));
-    }
-    else {
-      HLTError(Form("Error establishing connection to unknown source with index %d: %s (%d)",
-                   ndx, strerror(iResult), iResult));
-    }
-
-    if ( fReader )
-      fLibManager->DeleteReader( fReader );
-    fReader = NULL;
-  }
-  else {
-    // -- Connection ok - set reader
-    fConnected = kTRUE;
-
-    HLTInfo(Form("Connection established."));
-  }
-
-  delete[] sourceHostnames;
-  delete[] sourcePorts;
-
-  return iResult;
-}
-
-//##################################################################################
-void AliHLTHOMERManager::DisconnectHOMER(){
-  // see header file for class documentation
-
-  if ( ! IsConnected() )
-    return;
-
-  if ( fReader )
-    fLibManager->DeleteReader( fReader );
-  fReader = 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 ( !fReader || !IsConnected() ) {
-    HLTWarning(Form( "Not connected yet." ));
-    return -1;
-  }
-
-  //  fReader->SetEventRequestAdvanceTime( 20000000 /*timeout in us*/ );
-
-  // -- Read next event data and error handling for HOMER (error codes and empty blocks)
-  while( 1 ) {
-    
-    iResult = fReader->ReadNextEvent( 40000000 /*timeout in us*/);
-
-    if ( iResult == 111 || iResult == 32 || iResult == 6 ) {
-      HLTError(Form("No Connection to source %d: %s (%d)", 
-                   fReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
-      return -iResult;
-    }
-    else if ( iResult == 110 ) {
-      HLTError(Form("Timeout occured, reading event from source %d: %s (%d)", 
-                   fReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
-      return -iResult;
-    }
-    else if ( iResult == 56) {
-      ++iRetryCount;
-
-      if ( iRetryCount >= 20 ) {
-       HLTError(Form("Retry Failed: Error reading event from source %d: %s (%d)", 
-                     fReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
-       return -iResult;
-      }
-      else {
-       HLTError(Form("Retry: Error reading event from source %d: %s (%d)", 
-                     fReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
-       continue;
-      }
-    }
-    else if ( iResult ) {
-      HLTError(Form("General Error reading event from source %d: %s (%d)", 
-                   fReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
-      fConnected = kFALSE;
-      return -iResult;
-    }
-    else {
-      break;
-    }
-  } // while( 1 ) {
-
-  // -- Get blockCnt and eventID
-  fNBlks = static_cast<ULong_t>(fReader->GetBlockCnt());
-  ULong_t eventID = static_cast<ULong64_t>(fReader->GetEventID());  
-  fCurrentBlk = 0;
-
-  HLTInfo(Form("Event 0x%016LX (%Lu) with %lu blocks", eventID,eventID, fNBlks));
-
-#if 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 = fReader->GetBlockDataType(ii);
-    void *tmp21 = tmp2;
-    ULong_t* tmp22 = static_cast<ULong_t*>(tmp21);
-    *tmp22 = fReader->GetBlockDataOrigin(ii);
-    HLTInfo(Form( "Block %lu length: %lu - type: %s - origin: %s - spec 0x%08X",
-                 ii, fReader->GetBlockDataLength(ii), tmp1, tmp2, fReader->GetBlockDataSpec(ii) ));
-  } // end for ( ULong_t ii = 0; ii < fNBlks; ii++ ) {
-#endif
-
-  // -- Create BlockList
-  if ( fNBlks > 0 ) {
-    HLTInfo(Form("Add Block List to buffer"));
-    AddBlockListToBuffer();
-  }
-  else {
-    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
- * ---------------------------------------------------------------------------------
- */
-
-//##################################################################################
-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
-
-  // -- 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] = static_cast<ULong64_t>(fReader->GetEventID());
-
-  // -- 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;
-}
-
-//##################################################################################
-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
- * ---------------------------------------------------------------------------------
- */
-
-//##################################################################################
-void* AliHLTHOMERManager::GetBlk( Int_t ndx ) {
-  // see header file for class documentation
-  // Get pointer to current block in current event
-   
-  if ( !fReader || !IsConnected() ) {
-    HLTError(Form("Not connected yet."));
-    return NULL;
-  }
-  if ( ndx < static_cast<Int_t>(fNBlks) )
-    return  const_cast<void*> (fReader->GetBlockData(ndx));
-  else
-    return NULL;
-}
-
-//##################################################################################
-ULong_t AliHLTHOMERManager::GetBlkSize( Int_t ndx ) {
-  // see header file for class documentation
-   
-  if ( !fReader || !IsConnected() ) {
-    HLTError(Form("Not connected yet."));
-    return 0;
-  }
-  
-  if ( ndx < static_cast<Int_t>(fNBlks) )
-    return static_cast<ULong_t> (fReader->GetBlockDataLength(ndx));
-  else
-    return 0;
-}
-
-//##################################################################################
-TString AliHLTHOMERManager::GetBlkOrigin( Int_t ndx ) {
-  // see header file for class documentation
-
-  TString origin = "";
-
-  // -- Check for Connection
-  if ( !fReader || ! 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>(fReader->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 ( !fReader || ! 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> (fReader->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 ( !fReader || ! 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>(fReader->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;
-}
-
+//-*- 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 %s:alihlt-vobox0.cern.ch:%d cernUser@lxplus.cern.ch -fN'",\r
+                    sourcePorts[idx], sourcePorts[idx]));\r
+      }\r
+      \r
+      // -- Remove reader\r
+      if ( reader )\r
+       fLibManager->DeleteReader( reader );\r
+      reader = NULL;\r
+      \r
+      fReaderList->RemoveLast();\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
+  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
+ *                          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 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
+    // !GetBlkType().CompareTo("CLUSTERS") ) {\r
+    if ( !GetBlkType().CompareTo("ALIESDV0") ) {\r
+      bResult = kTRUE;\r
+      break;\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
index b7bec35ae62fc3d8134b7f4f50fff5f0b686767b..3823bfd525f468f92d5e56b23f90328c487c86c0 100644 (file)
-//-*- 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 10
-
-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); }
-
-  /** 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();
-
-  ///////////////////////////////////////////////////////////////////////////////////
-
-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();
-
-  /** 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; }
-
-  // ----------------------------------------------------
-
-  /** 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 );
-
-  /*
-   * ---------------------------------------------------------------------------------
-   *                            Members - private
-   * ---------------------------------------------------------------------------------
-   */
-
-  /** Proxy Handler to get the list of sources */
-  AliHLTHOMERProxyHandler *fProxyHandler;               //! transient 
-
-  // == connection ==
-
-  /** Pointer to HOMER reader */
-  AliHLTHOMERReader       *fReader;                     //! 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
-
-  // == 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
-
-
-  ClassDef(AliHLTHOMERManager, 1); // Manage connections to HLT data-sources.
-};
-
-#endif
+//-*- 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
index c0ff11e438e1df3e22a1ab11eaf17a6f7a76d0cc..5696f8c1e115d2d801a57e271892344a2af6dd0b 100644 (file)
@@ -114,10 +114,12 @@ const Char_t *AliHLTHOMERProxyHandler::fgkHOMERProxyNode[] = {
   "alihlt-dcs0.cern.ch",
   "alihlt-vobox0.cern.ch",
   "alihlt-gw0.kip.uni-heidelberg.de",
+  "localhost"
   "portal-dcs1.internal", 
   "alihlt-dcs1.cern.ch",
   "alihlt-vobox1.cern.ch",
-  "alihlt-gw1.kip.uni-heidelberg.de"
+  "alihlt-gw1.kip.uni-heidelberg.de",
+  "localhost"
 };
 
 //##################################################################################
@@ -132,9 +134,15 @@ void AliHLTHOMERProxyHandler::IdentifyRealm() {
     fRealm = kACR;
   else if ( hostIP.Contains("129.206.") )
     fRealm = kKIP;
-  else 
+  else  if ( hostIP.Contains("137.138") || 
+            hostIP.Contains("128.141") ||
+            hostIP.Contains("127.0.") 
+            )
     fRealm = kGPN;
-  
+  else {
+    fRealm = kLoc;
+  }
+
   return;
 }
 
index 7e97a8707fcc162cb50ca80286d1f47961e7fb97..c44da758ed4d137051447015bff16f2685073d0d 100644 (file)
@@ -82,11 +82,12 @@ private:
 
   /** Realms */
   enum HOMERRealms_t { 
-    kHLT,            /**< HLT realm */
-    kACR,            /**< ACR realm */
-    kGPN,            /**< GPN realm */
-    kKIP,            /**< KIP realm */
-    kHOMERRealmsMax  /**< Number of enum entries */
+    kHLT,             /**< HLT realm */
+    kACR,             /**< ACR realm */
+    kGPN,             /**< GPN realm */
+    kKIP,             /**< KIP realm */         
+    kLoc,             /**< Local realm. needs ssh tunnel */
+    kHOMERRealmsMax   /**< Number of enum entries */
   };
 
   /** Array of proxy nodes per realm */
index 806b8e433c685e1e84c7ca4d4f06ce34632c46d7..1b6ccf00f1e24b56cf67ac5d59833b04e3d240a6 100644 (file)
@@ -119,6 +119,7 @@ AliHLTHOMERReader::AliHLTHOMERReader()
 AliHLTHOMERReader::AliHLTHOMERReader( const char* hostname, unsigned short port )
   :
   AliHLTMonitoringReader(),
+  TObject(),
   fCurrentEventType(~(homer_uint64)0),
   fCurrentEventID(~(homer_uint64)0),
   fBlockCnt(0),
@@ -156,6 +157,7 @@ AliHLTHOMERReader::AliHLTHOMERReader( const char* hostname, unsigned short port
 AliHLTHOMERReader::AliHLTHOMERReader( unsigned int tcpCnt, const char** hostnames, unsigned short* ports )
   :
   AliHLTMonitoringReader(),
+  TObject(),
   fCurrentEventType(~(homer_uint64)0),
   fCurrentEventID(~(homer_uint64)0),
   fBlockCnt(0),
@@ -194,6 +196,7 @@ AliHLTHOMERReader::AliHLTHOMERReader( unsigned int tcpCnt, const char** hostname
 AliHLTHOMERReader::AliHLTHOMERReader( key_t shmKey, int shmSize )
   :
   AliHLTMonitoringReader(),
+  TObject(),
   fCurrentEventType(~(homer_uint64)0),
   fCurrentEventID(~(homer_uint64)0),
   fBlockCnt(0),
@@ -231,6 +234,7 @@ AliHLTHOMERReader::AliHLTHOMERReader( key_t shmKey, int shmSize )
 AliHLTHOMERReader::AliHLTHOMERReader( unsigned int shmCnt, key_t* shmKeys, int* shmSizes )
   :
   AliHLTMonitoringReader(),
+  TObject(),
   fCurrentEventType(~(homer_uint64)0),
   fCurrentEventID(~(homer_uint64)0),
   fBlockCnt(0),
@@ -270,6 +274,7 @@ AliHLTHOMERReader::AliHLTHOMERReader( unsigned int tcpCnt, const char** hostname
                          unsigned int shmCnt, key_t* shmKeys, int* shmSizes )
   :
   AliHLTMonitoringReader(),
+  TObject(),
   fCurrentEventType(~(homer_uint64)0),
   fCurrentEventID(~(homer_uint64)0),
   fBlockCnt(0),
@@ -318,6 +323,7 @@ AliHLTHOMERReader::AliHLTHOMERReader( unsigned int tcpCnt, const char** hostname
 AliHLTHOMERReader::AliHLTHOMERReader( const void* pBuffer, int size )
   :
   AliHLTMonitoringReader(),
+  TObject(),
   fCurrentEventType(~(homer_uint64)0),
   fCurrentEventID(~(homer_uint64)0),
   fBlockCnt(0),
@@ -786,25 +792,25 @@ int AliHLTHOMERReader::ReadNextEvent( bool useTimeout, unsigned long timeout )
     ReleaseCurrentEvent();
     int ret=0;
     // Trigger all configured data sources
-    for ( unsigned n = 0; n<fDataSourceCnt; n++ )
+    for ( unsigned n = 0; n<fDataSourceCnt; n++ ){
+      if ( fDataSources[n].fType == kTCP )
+       ret = TriggerTCPSource( fDataSources[n], useTimeout, timeout );
+      else if ( fDataSources[n].fType == kShm )
+       ret = TriggerShmSource( fDataSources[n], useTimeout, timeout );
+      if ( ret )
        {
-       if ( fDataSources[n].fType == kTCP )
-           ret = TriggerTCPSource( fDataSources[n], useTimeout, timeout );
-       else if ( fDataSources[n].fType == kShm )
-           ret = TriggerShmSource( fDataSources[n], useTimeout, timeout );
-       if ( ret )
-           {
-           fErrorConnection = n;
-           fConnectionStatus=ret;
-           return fConnectionStatus;
-           }
+         fErrorConnection = n;
+         fConnectionStatus=ret;
+         return fConnectionStatus;
        }
+    }
     // Now read in data from the configured data source
     ret = ReadDataFromTCPSources( fTCPDataSourceCnt, fDataSources, useTimeout, timeout );
+    
     if ( ret )
-       {
+      {
        return ret;
-       }
+      }
     ret = ReadDataFromShmSources( fShmDataSourceCnt, fDataSources+fTCPDataSourceCnt, useTimeout, timeout );
     if ( ret )
        {
index fef3a2c36d117a5331b6f6dd29d6304f7e5c1e4e..1287f715e2fa0ad8b13134ba7d444b7a691c1b0f 100644 (file)
@@ -21,7 +21,7 @@
 #include <sys/ipc.h>
 #include <sys/shm.h>
 #include "AliHLTHOMERData.h"
-
+#include <TObject.h>
 
 
 
@@ -123,7 +123,7 @@ class AliHLTMonitoringReader
 
 
 
-class AliHLTHOMERReader: public AliHLTMonitoringReader
+class AliHLTHOMERReader: public AliHLTMonitoringReader, public TObject 
     {
     public:
 #ifdef USE_ROOT