make loader more tolerant to missing files
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveTRDLoader.cxx
index 7eab750..62d98eb 100644 (file)
@@ -9,39 +9,32 @@
 
 #include "AliEveTRDLoader.h"
 #include "AliEveTRDModuleImp.h"
+#include "EveBase/AliEveEventManager.h"
 
 #include <TEveManager.h>
 #include <TEveGValuators.h>
 
+#include "TGeoManager.h"
 #include "TSystem.h"
 #include "TFile.h"
 #include "TTree.h"
-#include "TString.h"
 #include "TObjString.h"
 #include "TObjArray.h"
+#include "TClonesArray.h"
 
 #include <TGLabel.h>
 #include <TGButton.h>
 #include <TGTextEntry.h>
-#include <TGNumberEntry.h>
 #include <TGFileDialog.h>
-#include <TGListTree.h>
-#include <TGToolTip.h>
 
 #include "AliLog.h"
 #include "AliCDBManager.h"
 
-#include "AliTRDv1.h"
 #include "AliTRDhit.h"
 #include "AliTRDcluster.h"
-#include "AliTRDmcmTracklet.h"
 #include "AliTRDdigitsManager.h"
 #include "AliTRDgeometry.h"
 
-#include <algorithm>
-
-class AliTRDdataArrayI;
-
 ClassImp(AliEveTRDLoader)
 ClassImp(AliEveTRDLoaderEditor)
 
@@ -51,48 +44,36 @@ ClassImp(AliEveTRDLoaderEditor)
 
 
 //______________________________________________________________________________
-AliEveTRDLoader::AliEveTRDLoader(const Text_t* n, const Text_t* t) :
-  TEveElementList(n, t),
-  fLoadHits     (kFALSE), fLoadDigits (kFALSE),
-  fLoadClusters (kFALSE), fLoadTracks (kFALSE),
-  fSM           (-1),     fStack      (-1),     fLy(-1),
-  fFilename     (""),     fDir        ("."),
-  fEvent        (-1),
-  fTRD          (0x0),
-  fGeo          (new AliTRDgeometry())
+AliEveTRDLoader::AliEveTRDLoader(const Text_t* n, const Text_t* t) : TEveElementList(n, t)
+  ,fDataType(0)
+  ,fSM(-1)
+  ,fStack(-1)
+  ,fLy(-1)
+  ,fEvent(-1)
+  ,fGeo(0x0)
+  ,fFilename("")
+  ,fDir(".")
 {
-  AliCDBManager *fCDBManager=AliCDBManager::Instance();
-  fCDBManager->SetDefaultStorage("local://$ALICE_ROOT");
-  fCDBManager->SetRun(0);
-}
+  // Constructor.
 
-//______________________________________________________________________________
-AliEveTRDLoader::~AliEveTRDLoader()
-{
-  // if(fChambers) {fChambers->clear(); delete fChambers;}
+  AliEveEventManager::AssertGeometry();
+
+  fGeo = new AliTRDgeometry();
+  //fGeo->CreateClusterMatrixArray();
 }
 
 //______________________________________________________________________________
-template<class T>
-class ID
-{
-public:
-  ID( int value ) : id(value) {}
-  bool operator()(const T &t) const {
-    return ((dynamic_cast<AliEveTRDModule*>(t))->GetID() == id);
-  }
-private:
-  const int id;
-};
-
 void AliEveTRDLoader::AddChambers(int sm, int stk, int ly)
 {
-  Int_t ism_start = (sm == -1) ?  0 : sm;
-  Int_t ism_stop  = (sm == -1) ? 18 : sm+1;
-  Int_t istk_start= (stk == -1)?  0 : stk;
-  Int_t istk_stop = (stk == -1)?  5 : stk+1;
-  Int_t ily_start = (ly == -1) ?  0 : ly;
-  Int_t ily_stop  = (ly == -1) ?  6 : ly+1;
+  // Add specified chambers.
+
+  fSM=sm; fStack=stk; fLy=ly;
+  Int_t ismStart = (sm == -1) ?  0 : sm;
+  Int_t ismStop  = (sm == -1) ? 18 : sm+1;
+  Int_t istkStart= (stk == -1)?  0 : stk;
+  Int_t istkStop = (stk == -1)?  5 : stk+1;
+  Int_t ilyStart = (ly == -1) ?  0 : ly;
+  Int_t ilyStop  = (ly == -1) ?  6 : ly+1;
 
   List_i ichmb;
   ichmb = fChildren.begin();
@@ -101,36 +82,31 @@ void AliEveTRDLoader::AddChambers(int sm, int stk, int ly)
     ichmb++;
   }
 
-  AliEveTRDNode *SM=0x0, *STK=0x0;
-  AliEveTRDChamber *CHMB = 0x0;
+  AliEveTRDNode *lSM=0x0, *lSTK=0x0;
+  AliEveTRDChamber *lCHMB = 0x0;
   int det;
-  for(int ism=ism_start; ism<ism_stop; ism++){
-    ichmb = find_if(fChildren.begin(), fChildren.end(), ID<TEveElement*>(ism));
-    if(ichmb != fChildren.end()){
-      SM = (AliEveTRDNode*)(*ichmb);
-      SM->SetRnrSelf(kTRUE);
-    }else{
-      gEve->AddElement(SM = new AliEveTRDNode("SM", ism), this);
-      SM->FindListTreeItem(gEve->GetListTree())->SetTipText(Form("Supermodule %2d", ism));
+  for (int ism=ismStart; ism<ismStop; ism++){
+    if(!(lSM = (AliEveTRDNode*)FindChild(Form("SM%03d", ism)))){
+      AddElement(lSM = new AliEveTRDNode("SM", ism));
+      lSM->SetElementTitle(Form("Supermodule %2d", ism));
     }
-    for(int istk=istk_start; istk<istk_stop; istk++){
-      ichmb = find_if(SM->begin(), SM->end(), ID<TEveElement*>(istk));
-      if(ichmb != SM->end()){
-        STK = (AliEveTRDNode*)(*ichmb);
-        STK->SetRnrSelf(kTRUE);
-      }else{
-        gEve->AddElement(STK = new AliEveTRDNode("Stack", istk), SM);
-        STK->FindListTreeItem(gEve->GetListTree())->SetTipText(Form("SM %2d Stack %1d", ism, istk));
+    lSM->SetRnrSelf(kTRUE);
+
+    for (int istk=istkStart; istk<istkStop; istk++) {
+      if(!(lSTK = (AliEveTRDNode*)lSM->FindChild("Stack%03d"))){
+        lSM->AddElement(lSTK = new AliEveTRDNode("Stack", istk));
+        lSTK->SetElementTitle(Form("SM %2d Stack %1d", ism, istk));
       }
-      for(int ily=ily_start; ily<ily_stop; ily++){
+      lSTK->SetRnrSelf(kTRUE);
+      
+      for (int ily=ilyStart; ily<ilyStop; ily++) {
         det = fGeo->GetDetector(ily, istk, ism);
-        ichmb = find_if(STK->begin(), STK->end(), ID<TEveElement*>(det));
-        if(ichmb != STK->end()) (*ichmb)->SetRnrSelf(kTRUE);
-        else{
-          gEve->AddElement(CHMB = new AliEveTRDChamber(det), STK);
-          CHMB->SetGeometry(fGeo);
-          CHMB->FindListTreeItem(gEve->GetListTree())->SetTipText(Form("SM %2d Stack %1d Layer %1d", ism, istk, ily));
+        if(!(lCHMB = (AliEveTRDChamber*)lSTK->FindChild(Form("Chmb%03d", det)))){
+          lSTK->AddElement(lCHMB = new AliEveTRDChamber(det));
+          lCHMB->SetGeometry(fGeo);
+          lCHMB->SetElementTitle(Form("SM %2d Stack %1d Layer %1d", ism, istk, ily));
         }
+        lCHMB->SetRnrSelf(kTRUE);
       }
     }
   }
@@ -140,20 +116,22 @@ void AliEveTRDLoader::AddChambers(int sm, int stk, int ly)
 //______________________________________________________________________________
 AliEveTRDChamber* AliEveTRDLoader::GetChamber(int d)
 {
-  List_i ism, istack, ichmb;
-
-  ism = find_if(fChildren.begin(), fChildren.end(), ID<TEveElement*>(fGeo->GetSector(d)));
-  if(ism == fChildren.end()) return 0x0;
-  istack = find_if(((AliEveTRDNode*)(*ism))->begin(), ((AliEveTRDNode*)(*ism))->end(), ID<TEveElement*>(fGeo->GetChamber(d)));
-  if(istack == ((AliEveTRDNode*)(*ism))->end()) return 0x0;
-  ichmb = find_if(((AliEveTRDNode*)(*istack))->begin(), ((AliEveTRDNode*)(*istack))->end(), ID<TEveElement*>(d));
-  if(ichmb == ((AliEveTRDNode*)(*istack))->end()) return 0x0;
-  return dynamic_cast<AliEveTRDChamber*>(*ichmb);
+  // Get given chamber.
+
+  Int_t ism  = fGeo->GetSector(d), 
+        istk = fGeo->GetStack(d); 
+  
+  AliEveTRDNode *node = 0x0;
+  if(!(node = (AliEveTRDNode*)FindChild(Form("SM%03d", ism)))) return 0x0;
+  if(!(node = (AliEveTRDNode*)node->FindChild(Form("Stack%03d", istk)))) return 0x0;
+  return (AliEveTRDChamber*)node->FindChild(Form("Chmb%03d", d));
 }
 
 //______________________________________________________________________________
 Bool_t AliEveTRDLoader::GoToEvent(int ev)
 {
+  // Go to given event.
+
   if(!fChildren.size()){
     AliWarning("Please select first the chamber that you want to monitor from \"Chamber(s) selector\".");
     return kFALSE;
@@ -163,29 +141,47 @@ Bool_t AliEveTRDLoader::GoToEvent(int ev)
 
   Unload();
 
-  TTree *t = 0x0;
-  TFile *f = new TFile(Form("%s/%s", fDir.Data(), fFilename.Data()));
-  if(! f->cd(Form("AliEveEventManager%d", ev))){
-    AliError(Form("Couldn't find event %d in file \"%s/%s\".", ev, fDir.Data(), fFilename.Data()));
-    f->Close(); delete f;
+  TTree *t(NULL); TFile *f(NULL);
+  if(!(f = TFile::Open(Form("%s/%s", fDir.Data(), fFilename.Data())))){
+    AliWarning(Form("File not found \"%s/%s\".", fDir.Data(), fFilename.Data()));
+    return kFALSE;
+  }
+  if(!f->cd(Form("Event%d", ev))){
+    AliError(Form("Event[%d] not found in file \"%s/%s\".", ev, fDir.Data(), fFilename.Data()));
+    f->Close(); //delete f;
     return kFALSE;
   }
 
-  if(fLoadDigits){
-    t = (TTree*)gDirectory->Get("TreeD");
-    if(!t) return kFALSE;
+  if(fDataType&kTRDHits){
+    if(!(t = (TTree*)gDirectory->Get("TreeH"))){
+      AliError(Form("Tree[TreeH] not found for Event[%d].", ev));
+      return kFALSE;
+    }
+    if(!LoadHits(t)) return kFALSE;
+  }
+  if(fDataType&kTRDDigits){
+    if(!(t = (TTree*)gDirectory->Get("TreeD"))){
+      AliError(Form("Tree[TreeD] not found for Event[%d].", ev));
+      return kFALSE;
+    }
     if(!LoadDigits(t)) return kFALSE;
-  } else if(fLoadClusters){
-    t = (TTree*)gDirectory->Get("TreeR");
-    if(!t) return kFALSE;
+  }
+  if(fDataType&kTRDClusters){
+    if(!(t = (TTree*)gDirectory->Get("TreeR"))){
+      AliError(Form("Tree[TreeR] not found for Event[%d].", ev));
+      return kFALSE;
+    }
     if(!LoadClusters(t)) return kFALSE;
-  } else if(fLoadTracks){
-    t = (TTree*)gDirectory->Get("TreeT");
-    if(!t) return kFALSE;
+  }
+  if(fDataType&kTRDTracklets){
+    if(!(t = (TTree*)gDirectory->Get("tracklets"))){
+      AliError(Form("Tree[tracklets] not found for Event[%d].", ev));
+      return kFALSE;
+    }
     if(!LoadTracklets(t)) return kFALSE;
-  } else AliWarning("Please select first the type of data that you want to monitor and then hit the \"Load\" button.");
+  }// else AliWarning("Please select first the type of data that you want to monitor and then hit the \"Load\" button.");
 
-  f->Close(); delete f;
+  f->Close(); //delete f;
 
   gEve->Redraw3D();
 
@@ -193,22 +189,59 @@ Bool_t AliEveTRDLoader::GoToEvent(int ev)
 }
 
 
+//______________________________________________________________________________
+Bool_t AliEveTRDLoader::LoadHits(TTree *tH)
+{
+  // Load hits.
+
+  AliInfo("Loading ...");
+  if(!fChildren.size()) return kFALSE;
+
+  AliEveTRDChamber *chmb = 0x0;
+  TClonesArray *hits = new TClonesArray("AliTRDhit", 100);
+  tH->SetBranchAddress("TRD", &hits);
+  Int_t idx, nhits;
+  for(int iTrack=0; iTrack<tH->GetEntries(); iTrack++){
+    if(!tH->GetEvent(iTrack)) continue;
+    if(!(nhits = hits->GetEntriesFast())) continue;
+
+    idx = 0;
+    while(idx < nhits){
+      Int_t det = ((AliTRDhit*)hits->UncheckedAt(idx))->GetDetector();
+      chmb = GetChamber(det);
+      if(chmb) chmb->LoadHits(hits, idx);
+      else{
+        AliTRDhit *hit = 0x0;
+        while(idx < nhits){
+          hit = (AliTRDhit*)hits->UncheckedAt(idx);
+          if(hit->GetDetector() != det) break;
+          idx++;
+        }
+      }
+    }
+    hits->Delete();
+  }
+  return kTRUE;
+}
+
+
 //______________________________________________________________________________
 Bool_t AliEveTRDLoader::LoadClusters(TTree *tC)
 {
+  // Load clusters.
+
   AliInfo("Loading ...");
-  if(!fChildren.size()) return kTRUE;
+  if(!fChildren.size()) return kFALSE;
 
   TObjArray *clusters = new TObjArray();
   tC->SetBranchAddress("TRDcluster", &clusters);
 
-  AliEveTRDChamber *chmb = 0x0;
-  AliTRDcluster *c=0x0;
-  for(int idet=0; idet<540; idet++){
+  AliEveTRDChamber *chmb(NULL);
+  AliTRDcluster *c(NULL);
+  for(int idet=0; idet<AliTRDgeometry::kNdet; idet++){
     tC->GetEntry(idet);
     if(!clusters->GetEntriesFast()) continue;
-    c = (AliTRDcluster*)clusters->UncheckedAt(0);
-    if(!c) continue;
+    if(!(c = (AliTRDcluster*)clusters->UncheckedAt(0))) continue;
     if((chmb = GetChamber(c->GetDetector()))) chmb->LoadClusters(clusters);
   }
   return kTRUE;
@@ -218,14 +251,16 @@ Bool_t AliEveTRDLoader::LoadClusters(TTree *tC)
 //______________________________________________________________________________
 Bool_t AliEveTRDLoader::LoadDigits(TTree *tD)
 {
+  // Load digits.
+
   AliInfo("Loading ...");
 
-  if(!fChildren.size()) return kTRUE;
+  if(!fChildren.size()) return kFALSE;
 
   AliEveTRDChamber *chmb;
   AliTRDdigitsManager dm;
   dm.ReadDigits(tD);
-  for(int idet=0; idet<540; idet++){
+  for(int idet=0; idet<AliTRDgeometry::kNdet; idet++){
     if(!(chmb=GetChamber(idet))) continue;
     //  digits = dm.GetDigits(idet);
     //  if(!digits) continue;
@@ -237,20 +272,19 @@ Bool_t AliEveTRDLoader::LoadDigits(TTree *tD)
 
 
 //______________________________________________________________________________
-Bool_t AliEveTRDLoader::LoadTracklets(TTree *tT)
+Bool_t AliEveTRDLoader::LoadTracklets(TTree *trklTree)
 {
+  // Load tracklets.
+
   AliInfo("Loading ...");
-  if(!fChildren.size()) return kTRUE;
+  if(!fChildren.size()) return kFALSE;
 
-  TObjArray *tracks = new TObjArray();
-  tT->SetBranchAddress("TRDmcmTracklet",&tracks);
 
   AliEveTRDChamber *chmb = 0x0;
-  AliTRDmcmTracklet *trk=0x0;
+
   for(int idet=0; idet<540; idet++){
-    if(!tT->GetEntry(idet)) continue;
-    if(tracks->GetEntriesFast()) trk = (AliTRDmcmTracklet*)tracks->UncheckedAt(0);
-    if((chmb = GetChamber(trk->GetDetector()))) chmb->LoadTracklets(tracks);
+    if((chmb = GetChamber(idet)))
+      chmb->LoadTracklets(trklTree);
   }
 
   return kTRUE;
@@ -260,79 +294,78 @@ Bool_t AliEveTRDLoader::LoadTracklets(TTree *tT)
 //______________________________________________________________________________
 Bool_t AliEveTRDLoader::Open(const char *filename, const char *dir)
 {
+  // Open given file in given directory.
+
   fFilename = filename;
   fDir = dir;
   Int_t count = 0;
-  count += fLoadDigits ? 1 : 0;
-  count += fLoadClusters ? 1 : 0;
-  count += fLoadTracks ? 1 : 0;
+  count += fDataType&kTRDHits;
+  count += fDataType&kTRDDigits;
+  count += fDataType&kTRDClusters;
+  count += fDataType&kTRDTracklets;
 
   TObjArray *so = fFilename.Tokenize(".");
 
   if(((TObjString*)(*so)[0])->GetString().CompareTo("TRD") != 0){
-    if(!count){
-      AliWarning("Filename didn't fulfill naming conventions. No TRD data will be loaded.");
-      return kFALSE;
-    } else {
-      Warning("Open()", "Filename didn't fulfill naming conventions.");
-      return kTRUE;
-    }
+    AliError("Filename didn't fulfill naming conventions. No TRD data will be loaded.");
+    return kFALSE;
   }
-  if(((TObjString*)(*so)[1])->GetString().CompareTo("Digits") == 0){
-    if(!fLoadDigits) AliWarning("Data type set to DIGITS according to file name. Previous settings with SetDataType() will be discarded.");
-    fLoadDigits = kTRUE;
+
+  if(((TObjString*)(*so)[1])->GetString().CompareTo("Hits") == 0){
+    if(count && !(fDataType&kTRDHits)){ 
+      AliWarning("Data type set to HITS according to file name. Previous settings will be overwritten.");
+      fDataType = 0; 
+    }
+    fDataType|=kTRDHits;
+  } else   if(((TObjString*)(*so)[1])->GetString().CompareTo("Digits") == 0){
+    if(count && !(fDataType&kTRDDigits)){ 
+      AliWarning("Data type set to DIGITS according to file name. Previous settings will be overwritten.");
+      fDataType = 0; 
+    }
+    fDataType|=kTRDDigits;
   } else if(((TObjString*)(*so)[1])->GetString().CompareTo("RecPoints") == 0){
-    if(!fLoadClusters) AliWarning("Data type set to CLUSTERS according to file name. Previous settings with SetDataType() will be discarded.");
-    fLoadClusters = kTRUE;
-  } else if(((TObjString*)(*so)[1])->GetString().CompareTo("Tracks") == 0){
-    if(!fLoadTracks) AliWarning("Data type set to TRACKLETS according to file name. Previous settings with SetDataType() will be discarded.");
-    fLoadTracks = kTRUE;
-  } else if(count){
-    AliWarning("Filename didn't fulfill naming conventions.");
-    return kTRUE;
+    if(count && !(fDataType&kTRDClusters)){ 
+      AliWarning("Data type set to CLUSTERS according to file name. Previous settings will be overwritten.");
+      fDataType = 0; 
+    }
+    fDataType|=kTRDClusters;  
+  } else if(((TObjString*)(*so)[1])->GetString().CompareTo("Tracklets") == 0){
+    if(count && !(fDataType&kTRDTracklets)){ 
+      AliWarning("Data type set to TRACKLETS according to file name. Previous settings will be overwritten.");
+      fDataType = 0; 
+    }
+    fDataType|=kTRDTracklets; 
   } else {
     AliError("Filename didn't fulfill naming conventions. No data will be loaded.");
     return kFALSE;
   }
 
+  SetDataLinked();
   return kTRUE;
 }
 
-
-
 //______________________________________________________________________________
 void AliEveTRDLoader::Paint(Option_t *option)
 {
+  // Paint object.
+
+  AliEveTRDModule *module(NULL);
   List_i ichmb = fChildren.begin();
   while(ichmb != fChildren.end()){
-    (dynamic_cast<AliEveTRDModule*>(*ichmb))->Paint(option);
+    if((module = dynamic_cast<AliEveTRDModule*>(*ichmb))) module->Paint(option);
     ichmb++;
   }
 }
 
-//______________________________________________________________________________
-void AliEveTRDLoader::SetDataType(TRDDataTypes type)
-{
-  fLoadHits     = kFALSE;
-  fLoadDigits   = kFALSE;
-  fLoadClusters = kFALSE;
-  fLoadTracks   = kFALSE;
-  switch(type){
-    case kHits:     fLoadHits = kTRUE; break;
-    case kDigits:   fLoadDigits = kTRUE; break;
-    case kClusters: fLoadClusters = kTRUE; break;
-    case kTracks:   fLoadTracks = kTRUE; break;
-    case kRawRoot: break;
-    case kRawData: break;
-  }
-}
 
 //______________________________________________________________________________
 void AliEveTRDLoader::Unload()
 {
+  // Unload module data.
+
   List_i ichmb = fChildren.begin();
   while(ichmb != fChildren.end()){
-    (dynamic_cast<AliEveTRDModule*>(*ichmb))->Reset();
+    //(dynamic_cast<AliEveTRDModule*>(*ichmb))->Reset();
     ichmb++;
   }
 }
@@ -345,13 +378,15 @@ void AliEveTRDLoader::Unload()
 AliEveTRDLoaderEditor::AliEveTRDLoaderEditor(const TGWindow* p, Int_t width, Int_t height,
                                             UInt_t options, Pixel_t back) :
   TGedFrame(p, width, height, options | kVerticalFrame, back),
-  fM(0), fFile(0), fEvent(0),
+  fM(0), fFile(0), fBrowse(0x0), fEvent(0),
   fSMNumber(0), fStackNumber(0), fPlaneNumber(0)
 {
+  // Constructor.
+
   MakeTitle("AliEveTRDLoader");
 
+  // file browser frame
   Int_t labelW = 42;
-
   TGHorizontalFrame* f = new TGHorizontalFrame(this);
   TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
   TGLabel* l = new TGLabel(g, "File: ");
@@ -363,22 +398,10 @@ AliEveTRDLoaderEditor::AliEveTRDLoaderEditor(const TGWindow* p, Int_t width, Int
   fFile->Connect("DoubleClicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
   f->AddFrame(fFile);
 
-  TGTextButton* openFile = new TGTextButton(f, "Browse");
-  f->AddFrame(openFile);
-  openFile->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
-  AddFrame(f);
-
-
-  fEvent = new TEveGValuator(this, "AliEveEventManager:", 110, 0);
-  fEvent->SetShowSlider(kFALSE);
-  fEvent->SetLabelWidth(labelW);
-  fEvent->SetNELength(6);
-  fEvent->Build();
-  fEvent->SetLimits(-1, 1000);
-  fEvent->SetToolTip("Set event number to be monitored");
-  fEvent->Connect("ValueSet(Double_t)",
-                  "AliEveTRDLoaderEditor", this, "SetEvent(Double_t)");
-  AddFrame(fEvent);
+  fBrowse = new TGTextButton(f, "Browse");
+  f->AddFrame(fBrowse);
+  fBrowse->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
+  AddFrame(f, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,5,5,5,5));
 
 
   // "Chamber(s) selector" group frame
@@ -423,50 +446,71 @@ AliEveTRDLoaderEditor::AliEveTRDLoaderEditor(const TGWindow* p, Int_t width, Int
                            "AliEveTRDLoaderEditor", this, "AddChambers()");
 
   fGroupFrame1974->SetLayoutManager(new TGHorizontalLayout(fGroupFrame1974));
-  AddFrame(fGroupFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
+  AddFrame(fGroupFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,5,5,5,5));
 
 
-  TGTextButton *fTextButton2004 = new TGTextButton(this,"Load");
-  fTextButton2004->SetTextJustify(36);
-  fTextButton2004->Resize(164,22);
-  AddFrame(fTextButton2004, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
-  fTextButton2004->SetToolTipText("Load data according to selection", 400);
-  fTextButton2004->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "Load()");
-}
+  // Event steering frame
+  f = new TGHorizontalFrame(this);
+  TGTextButton *fGoTo = new TGTextButton(f, "GoTo");
+  fGoTo->SetTextJustify(36);
+  fGoTo->Resize(164,22);
+  f->AddFrame(fGoTo, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
+  fGoTo->SetToolTipText("Skip to event", 400);
+  fGoTo->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "GoTo()");
 
-//______________________________________________________________________________
-AliEveTRDLoaderEditor::~AliEveTRDLoaderEditor()
-{}
+  fEvent = new TEveGValuator(f, "Event:", 110, 0);
+  fEvent->SetShowSlider(kFALSE);
+  fEvent->SetLabelWidth(labelW);
+  fEvent->SetNELength(6);
+  fEvent->Build();
+  fEvent->SetLimits(-1, 1000);
+  fEvent->SetToolTip("Set event number to be monitored");
+  fEvent->Connect("ValueSet(Double_t)",
+                  "AliEveTRDLoaderEditor", this, "SetEvent(Double_t)");
+  f->AddFrame(fEvent, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2,2,2,2));
+
+  TGTextButton *fNext = new TGTextButton(f, "Next");
+  fNext->SetTextJustify(36);
+  fNext->Resize(164,22);
+  f->AddFrame(fNext, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
+  fNext->SetToolTipText("Next event", 400);
+  fNext->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "Next()");
+
+  AddFrame(f,new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,5,5,5,5));
+
+}
 
 //______________________________________________________________________________
 void AliEveTRDLoaderEditor::SetModel(TObject* obj)
 {
+  // Set model object.
 
-  fM = dynamic_cast<AliEveTRDLoader*>(obj);
+  if(!(fM = dynamic_cast<AliEveTRDLoader*>(obj))) return;
 
+  fFile->SetEnabled(!fM->IsDataLinked());
   fFile->SetText(gSystem->BaseName(fM->fFilename.Data()));
+  fBrowse->SetEnabled(!fM->IsDataLinked());
 
-  Bool_t kFile = kTRUE;
-  if(fM->fFilename.CompareTo("") == 0) kFile = kFALSE;
-
-  fEvent->SetEnabled(kFile);
+  fEvent->SetEnabled(fM->IsDataLinked());
   fEvent->GetEntry()->SetIntNumber(fM->fEvent);
 
-  fSMNumber->SetEnabled(kFile);
+  fSMNumber->SetEnabled(fM->IsDataLinked());
   fSMNumber->GetEntry()->SetIntNumber(fM->fSM);
 
 
-  fStackNumber->SetEnabled(kFile);
+  fStackNumber->SetEnabled(fM->IsDataLinked());
   fStackNumber->GetEntry()->SetIntNumber(fM->fStack);
 
 
-  fPlaneNumber->SetEnabled(kFile);
+  fPlaneNumber->SetEnabled(fM->IsDataLinked());
   fPlaneNumber->GetEntry()->SetIntNumber(fM->fLy);
 }
 
 //______________________________________________________________________________
 void AliEveTRDLoaderEditor::AddChambers()
 {
+  // Slot to add chambers.
+
   fM->fSM    = (int)fSMNumber->GetEntry()->GetNumber();
   fM->fStack = (int)fStackNumber->GetEntry()->GetNumber();
   fM->fLy    = (int)fPlaneNumber->GetEntry()->GetNumber();
@@ -476,6 +520,8 @@ void AliEveTRDLoaderEditor::AddChambers()
 //______________________________________________________________________________
 void AliEveTRDLoaderEditor::FileOpen()
 {
+  // Slot for opening of file.
+
   TGFileInfo fi;
   fi.fIniDir    = StrDup(gSystem->DirName (fM->fFilename.Data()));
   fi.fFilename  = StrDup(gSystem->BaseName(fM->fFilename.Data()));
@@ -484,15 +530,24 @@ void AliEveTRDLoaderEditor::FileOpen()
   new TGFileDialog(fClient->GetRoot(), gEve->GetMainWindow(), kFDOpen, &fi);
   if (!fi.fFilename) return;
 
-  fFile->SetToolTipText(gSystem->DirName (fi.fFilename));
-  fFile->SetText       (gSystem->BaseName(fi.fFilename));
-
-  fM->Open(gSystem->BaseName(fi.fFilename), gSystem->DirName (fi.fFilename));
+  if(fM->Open(gSystem->BaseName(fi.fFilename), gSystem->DirName (fi.fFilename))){ 
+    fFile->SetToolTipText(gSystem->DirName (fi.fFilename));
+    fFile->SetText       (gSystem->BaseName(fi.fFilename));
+  } else fFile->Clear();
 
   this->SetModel(fM);
 }
 
-void AliEveTRDLoaderEditor::Load()
+void AliEveTRDLoaderEditor::GoTo()
 {
+  // Slot for loading of event.
+
   fM->GoToEvent(fM->fEvent);
 }
+
+void AliEveTRDLoaderEditor::Next()
+{
+  // Slot for loading of event.
+
+  fM->NextEvent();
+}