AliEveEventManager
authormtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 16 Oct 2008 10:04:47 +0000 (10:04 +0000)
committermtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 16 Oct 2008 10:04:47 +0000 (10:04 +0000)
------------------
Implement management of dependent event-managers and their invocation
when moving to a next event.

embed_init.C
------------
New macro showing how to run event-emedding visualization.

display.C, alieve_init.C, visscan_init.C
----------------------------------------
CINT has problems when converting "raw-strings" to const TString&
arguments. Make dummy TString variables for the time being (reported
to Axel).

EVE/EveBase/AliEveEventManager.cxx
EVE/EveBase/AliEveEventManager.h
EVE/macros/alieve_init.C
EVE/macros/display.C
EVE/macros/embed_init.C [new file with mode: 0644]
EVE/macros/visscan_init.C

index 9510e36..4c533f1 100644 (file)
@@ -93,8 +93,8 @@ void AliEveEventManager::InitInternals()
   fExecutor = new AliEveMacroExecutor;
 }
 
-AliEveEventManager::AliEveEventManager() :
-  TEveEventManager(),
+AliEveEventManager::AliEveEventManager(const TString& name) :
+  TEveEventManager(name),
 
   fPath      ( ), fEventId (-1),
   fRunLoader (0),
@@ -113,8 +113,8 @@ AliEveEventManager::AliEveEventManager() :
   InitInternals();
 }
 
-AliEveEventManager::AliEveEventManager(const TString& path, Int_t ev) :
-  TEveEventManager("AliEVE AliEveEventManager"),
+AliEveEventManager::AliEveEventManager(const TString& name, const TString& path, Int_t ev) :
+  TEveEventManager(name, path),
 
   fPath   (path), fEventId(-1),
   fRunLoader (0),
@@ -143,14 +143,12 @@ AliEveEventManager::~AliEveEventManager()
 {
   // Destructor.
 
+  delete fSubManagers;
+
   if (fIsOpen)
   {
     Close();
   }
-
-  // Somewhat unclear what to do here.
-  // In principle should wipe event data and deregister from
-  // TEveManager.
 }
 
 /******************************************************************************/
@@ -209,7 +207,7 @@ void AliEveEventManager::Open()
   }
 
   gSystem->ExpandPathName(fPath);
-  // The following magick is required for ESDriends to be loaded properly
+  // The following magick is required for ESDfriends to be loaded properly
   // from non-current directory.
   if (fPath.IsNull() || fPath == ".")
   {
@@ -305,7 +303,7 @@ void AliEveEventManager::Open()
   // Is AccessPathName check ok for xrootd / alien? Yes, not for http.
   if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
   {
-    fRunLoader = AliRunLoader::Open(gaPath);
+    fRunLoader = AliRunLoader::Open(gaPath, GetName());
     if (fRunLoader)
     {
       TString alicePath = fPath + "/";
@@ -390,6 +388,7 @@ void AliEveEventManager::Open()
     }
   }
 
+  if (this == fgMaster)
   {
     AliCDBManager* cdb = AliCDBManager::Instance();
     if (cdb->IsDefaultStorageSet() == kTRUE)
@@ -406,8 +405,6 @@ void AliEveEventManager::Open()
     cdb->SetRun(runNo);
   }
 
-  SetName(Form("Event %d", fEventId));
-  SetTitle(fPath);
   fIsOpen = kTRUE;
 }
 
@@ -434,8 +431,8 @@ void AliEveEventManager::SetEvent(AliRunLoader *runLoader, AliRawReader *rawRead
 
   SetTitle("Online event in memory");
   SetName ("Online Event");
-
   ElementChanged();
+
   AfterNewEventLoaded();
 
   if (fAutoLoad) StartAutoLoadTimer();
@@ -608,8 +605,11 @@ void AliEveEventManager::GotoEvent(Int_t event)
 
   fHasEvent = kTRUE;
   fEventId  = event;
-  SetName(Form("Event %d", fEventId));
-  ElementChanged();
+  if (this == fgMaster)
+  {
+    SetName(Form("Event %d", fEventId));
+    ElementChanged();
+  }
 
   AfterNewEventLoaded();
 }
@@ -866,24 +866,53 @@ TGeoManager* AliEveEventManager::AssertGeometry()
 
 //------------------------------------------------------------------------------
 
-void AliEveEventManager::AddDependentManager(const TString& /*path*/)
+AliEveEventManager* AliEveEventManager::AddDependentManager(const TString& name, const TString& path)
 {
   // Create and attach a dependent event-manager.
+  // It is not added into eve list tree.
 
   static const TEveException kEH("AliEveEventManager::AddDependentManager ");
 
-  ::Error(kEH, "Not implemented.");
-
   if (fgMaster == 0)
     throw(kEH + "Master event-manager must be instantiated first.");
 
   if (fgMaster->fSubManagers == 0)
+  {
     fgMaster->fSubManagers = new TList;
+    fgMaster->fSubManagers->SetOwner(kTRUE);
+  }
 
-  // fgCurrent = 0;
-  // construct
-  // insert fgCurrent
-  // fgCurrent = fgMaster;
+  AliEveEventManager* new_mgr = 0;
+  fgCurrent = 0;
+  try
+  {
+    new_mgr = new AliEveEventManager(name, path, fgMaster->fEventId);
+    fgMaster->fSubManagers->Add(new_mgr);
+  }
+  catch (TEveException& exc)
+  {
+    ::Error(kEH, "Creation of new event-manager failed: '%s'.", exc.Data());
+  }
+  fgCurrent = fgMaster;
+
+  return new_mgr;
+}
+
+AliEveEventManager* AliEveEventManager::GetDependentManager(const TString& name)
+{
+  // Get a dependant manager by name.
+  // This will not change the current manager, use helper class
+  // AliEveEventManager::CurrentChanger for that.
+
+  static const TEveException kEH("AliEveEventManager::GetDependentManager ");
+
+  if (fgMaster == 0)
+    throw(kEH + "Master event-manager must be instantiated first.");
+
+  if (fgMaster->fSubManagers == 0)
+    return 0;
+
+  return dynamic_cast<AliEveEventManager*>(fgMaster->fSubManagers->FindObject(name));
 }
 
 AliEveEventManager* AliEveEventManager::GetMaster()
@@ -1056,12 +1085,35 @@ void AliEveEventManager::AfterNewEventLoaded()
   //
   // Virtual from TEveEventManager.
 
+  static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
+
   if (fExecutor)
     fExecutor->ExecMacros();
 
   TEveEventManager::AfterNewEventLoaded();
 
   NewEventLoaded();
+
+  if (this == fgMaster && fSubManagers != 0)
+  {
+    TIter next(fSubManagers);
+    while ((fgCurrent = dynamic_cast<AliEveEventManager*>(next())) != 0)
+    {
+      // gEve->SetCurrentEvent(fgCurrent);
+      try
+      {
+       fgCurrent->GotoEvent(fEventId);
+      }
+      catch (TEveException& exc)
+      {
+       // !!! Should somehow tag / disable / remove it?
+       Error(kEH, "Getting event %d for sub-event-manager '%s' failed: '%s'.",
+             fEventId, fgCurrent->GetName(), exc.Data());
+      }
+    }
+    fgCurrent = fgMaster;
+    // gEve->SetCurrentEvent(fgMaster);
+  }
 }
 
 void AliEveEventManager::NewEventLoaded()
index b9cc5b9..160fdef 100644 (file)
@@ -46,8 +46,8 @@ public:
   static void SetCdbUri     (const TString& cdb);
   static void SetAssertElements(Bool_t assertRunloader, Bool_t assertEsd, Bool_t assertRaw);
 
-  AliEveEventManager();
-  AliEveEventManager(const TString& path, Int_t ev=0);
+  AliEveEventManager(const TString& name="Event");
+  AliEveEventManager(const TString& name, const TString& path, Int_t ev=0);
   virtual ~AliEveEventManager();
 
   virtual void  Open();
@@ -86,7 +86,8 @@ public:
 
   static TGeoManager*  AssertGeometry();
 
-  static void AddDependentManager(const TString& path);
+  static AliEveEventManager* AddDependentManager(const TString& name, const TString& path);
+  static AliEveEventManager* GetDependentManager(const TString& name);
 
   static AliEveEventManager* GetMaster();
   static AliEveEventManager* GetCurrent();
index aa6bc3f..93584fa 100644 (file)
@@ -39,7 +39,8 @@ void alieve_init(const Text_t* path   = ".", Int_t event=0,
   if (path != 0)
   {
     Info("alieve_init", "Opening event %d from '%s' ...", event, path);
-    new AliEveEventManager(path, event);
+    TString name("Event"); // CINT has trouble with direct "Event".
+    new AliEveEventManager(name, path, event);
     gEve->AddEvent(AliEveEventManager::GetMaster());
   }
 }
index 28db039..566e466 100644 (file)
@@ -191,7 +191,8 @@ public:
     std::cout << "Opening " << fileName << " (" << dirName << ")" << std::endl;
     
     if (AliEveEventManager::GetMaster()) delete AliEveEventManager::GetMaster();
-    AliEveEventManager::GetMaster() = new AliEveEventManager(dirName.Data(), 0);
+    TString eventName("Event"); // CINT has trouble with direct "Event".
+    AliEveEventManager::GetMaster() = new AliEveEventManager(eventName, dirName, 0);
     gEve->AddEvent(AliEveEventManager::GetMaster());
     
     if (refresh) Refresh();
diff --git a/EVE/macros/embed_init.C b/EVE/macros/embed_init.C
new file mode 100644 (file)
index 0000000..e131252
--- /dev/null
@@ -0,0 +1,57 @@
+void embed_init()
+{
+  TEveUtil::LoadMacro("alieve_init.C");
+  alieve_init("Signal", -1);
+
+  AliEveEventManager::GetMaster()->AddNewEventCommand("main_event()");
+
+  // ------------------------------------------------------------------------
+
+  Info("embed_init", "Opening background event ...");
+  // Need strings as CINT can't properly convert "raw-string" to const TString&.
+  TString name("Background Event");
+  TString path("Background");
+  AliEveEventManager* bkg = AliEveEventManager::AddDependentManager(name, path);
+  bkg->IncDenyDestroy();
+  bkg->AddNewEventCommand("background_event()");
+  gEve->AddToListTree(bkg, kTRUE);
+
+  // ------------------------------------------------------------------------
+
+  TEveUtil::LoadMacro("its_clusters.C+");
+  TEveUtil::LoadMacro("tpc_clusters.C+");
+
+  // ------------------------------------------------------------------------
+
+  TEveBrowser* browser = gEve->GetBrowser();
+
+  browser->StartEmbedding(TRootBrowser::kBottom);
+  new AliEveEventManagerWindow(AliEveEventManager::GetMaster());
+  browser->StopEmbedding("EventCtrl");
+
+  // ------------------------------------------------------------------------
+
+  AliEveEventManager::GetMaster()->GotoEvent(0);
+  gEve->Redraw3D(kTRUE);
+}
+
+void main_event()
+{
+  printf("Main Event - post load\n");
+
+  its_clusters();
+  tpc_clusters();
+}
+
+void background_event()
+{
+  printf("Background Event - post load\n");
+
+  TEvePointSet* c;
+
+  c = its_clusters();
+  c->SetMarkerColor(kOrange);
+
+  c = tpc_clusters();
+  c->SetMarkerColor(kCyan);
+}
index 337789a..ce0eb31 100644 (file)
@@ -80,7 +80,7 @@ void visscan_init()
   TEveBrowser* browser = gEve->GetBrowser();
 
   browser->StartEmbedding(TRootBrowser::kBottom);
-  new AliEveEventManagerWindow;
+  new AliEveEventManagerWindow(AliEveEventManager::GetMaster());
   browser->StopEmbedding("EventCtrl");
 
   // event