]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVE/EveBase/AliEveEventManager.cxx
Repairing leak in AliEveFMDLoader.
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveEventManager.cxx
index 2409073ada00093b22959a9fa67023f39e00b9c3..3e7eae11067bcf28bd30cb7e647c3b88f0d3116e 100644 (file)
@@ -10,6 +10,8 @@
 #include "AliEveEventManager.h"
 #include "AliEveEventSelector.h"
 #include "AliEveMacroExecutor.h"
+#include "AliEveConfigManager.h"
+#include "AliEveVSDCreator.h"
 
 #include <THashList.h>
 #include <TEveElement.h>
 #include <TMap.h>
 
 #ifdef ZMQ
-#include <AliNetMessage.h>
-#include <AliSocket.h>
+#include "AliStorageEventManager.h"
 #endif
 
+using std::cout;
+using std::endl;
 //==============================================================================
 //==============================================================================
 // AliEveEventManager
@@ -120,66 +123,8 @@ Bool_t   AliEveEventManager::fgUniformField = kFALSE;
 AliEveEventManager* AliEveEventManager::fgMaster  = 0;
 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
 
-zmq::context_t* AliEveEventManager::fgSubContext=0;
-AliSocket* AliEveEventManager::fgSubSock=0;
-
-bool AliEveEventManager::ConnectToServer(const char* host, int port)
-{
-
-#ifdef ZMQ
-       // make a zeromq socket
-         fgSubContext = new zmq::context_t(1);
-    fgSubSock = new AliSocket(&*fgSubContext, ZMQ_SUB);
-    fgSubSock->Subscribe("");
-    fgSubSock->Connect(Form("%s:%d", host, port) );
-#else
-       fgSubContext=0;
-       fgSubSock =0;
-#endif
-       
-  return true;
-}
-
-void AliEveEventManager::InitInternals()
-{
-    // Initialize internal members.
-
-    static const TEveException kEH("AliEveEventManager::InitInternals ");
-
-    if (fgCurrent != 0)
-    {
-        throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
-    }
-
-    if (fgMaster == 0)
-    {
-        fgMaster = this;
-    }
-
-    fgCurrent = this;
-
-    fAutoLoadTimer = new TTimer;
-    fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
-    fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
-
-    fExecutor = new AliEveMacroExecutor;
-
-    fTransients = new TEveElementList("Transients", "Transient per-event elements.");
-    fTransients->IncDenyDestroy();
-    gEve->AddToListTree(fTransients, kFALSE);
-
-    fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
-    fTransientLists->IncDenyDestroy();
-    gEve->AddToListTree(fTransientLists, kFALSE);
-
-    fPEventSelector = new AliEveEventSelector(this);
-
-    fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
-}
-
 AliEveEventManager::AliEveEventManager(const TString& name, Int_t ev) :
     TEveEventManager(name, ""),
-
     fEventId(-1),
     fRunLoader (0),
     fESDFile   (0), fESDTree (0), fHLTESDTree(0), fESD (0),
@@ -192,10 +137,14 @@ AliEveEventManager::AliEveEventManager(const TString& name, Int_t ev) :
     fExecutor    (0), fTransients(0), fTransientLists(0),
     fPEventSelector(0),
     fSubManagers (0),
-    fAutoLoadTimerRunning(kFALSE)
+    fAutoLoadTimerRunning(kFALSE),
+    fgSubSock(EVENTS_SERVER_SUB),
+    fEventInUse(1),
+    fWritingToEventIndex(0),
+    fIsNewEventAvaliable(false)
 {
     // Constructor with event-id.
-
+               
     InitInternals();
 
     Open();
@@ -203,6 +152,17 @@ AliEveEventManager::AliEveEventManager(const TString& name, Int_t ev) :
     {
         GotoEvent(ev);
     }
+    
+#ifdef ZMQ
+    cout<<"ZMQ FOUND. Starting subscriber thread."<<endl;
+    fEventListenerThread = new TThread("fEventListenerThread",DispatchEventListener,(void*)this);
+    fEventListenerThread->Run();
+    
+    fStorageManagerWatcherThread = new TThread("fStorageManagerWatcherThread",DispatchStorageManagerWatcher,(void*)this);
+    fStorageManagerWatcherThread->Run();
+#else
+    cout<<"NO ZMQ FOUND. Online events not avaliable."<<endl;
+#endif
 }
 
 AliEveEventManager::~AliEveEventManager()
@@ -227,6 +187,116 @@ AliEveEventManager::~AliEveEventManager()
     //delete fExecutor;
 }
 
+void AliEveEventManager::GetNextEvent()
+{
+#ifdef ZMQ
+    AliStorageEventManager *eventManager =
+    AliStorageEventManager::GetEventManagerInstance();
+    eventManager->CreateSocket(EVENTS_SERVER_SUB);
+    
+    fCurrentEvent[0]=0;
+    fCurrentEvent[1]=0;
+    fCurrentTree[0]=0;
+    fCurrentTree[1]=0;
+    AliESDEvent *tmpEvent = NULL;
+    TTree *tmpTree = NULL;
+    
+    while(1)
+    {
+        //if(tmpEvent){delete tmpEvent;tmpEvent=0;}
+        tmpEvent = eventManager->GetEvent(EVENTS_SERVER_SUB,-1,&tmpTree);
+        
+        if(tmpEvent)
+        {
+            if(tmpEvent->GetRunNumber()>=0)
+            {
+                fMutex.Lock();
+                if(fEventInUse == 0){fWritingToEventIndex = 1;}
+                else if(fEventInUse == 1){fWritingToEventIndex = 0;}
+                cout<<"Writing to:"<<fWritingToEventIndex<<endl;
+                if(fCurrentEvent[fWritingToEventIndex])
+                {
+                    cout<<"DELETING:"<<fCurrentEvent[fWritingToEventIndex]<<endl;
+                    delete fCurrentEvent[fWritingToEventIndex];
+                    fCurrentEvent[fWritingToEventIndex]=0;
+                    delete fCurrentTree[fWritingToEventIndex];
+                }
+                fCurrentEvent[fWritingToEventIndex] = tmpEvent;
+                fCurrentTree[fWritingToEventIndex] = tmpTree;
+                fIsNewEventAvaliable = true;
+                fMutex.UnLock();
+            }
+        }
+    }
+#endif
+}
+
+void AliEveEventManager::CheckStorageStatus()
+{
+#ifdef ZMQ
+    AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
+    configManager->ConnectEventManagerSignals();
+    
+    AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
+    eventManager->CreateSocket(CLIENT_COMMUNICATION_REQ);
+    
+    struct clientRequestStruct *request = new struct clientRequestStruct;
+    request->messageType = REQUEST_CONNECTION;
+    
+    while (1)
+    {
+        if(eventManager->Send(request,CLIENT_COMMUNICATION_REQ,5000))
+        {
+            StorageManagerOk();
+            long response = eventManager->GetLong(CLIENT_COMMUNICATION_REQ);
+        }
+        else
+        {
+            StorageManagerDown();
+            cout<<"WARNING -- Storage Manager is DOWN!!"<<endl;
+        }
+        sleep(1);
+    }
+#endif
+}
+
+void AliEveEventManager::InitInternals()
+{
+    // Initialize internal members.
+    
+    static const TEveException kEH("AliEveEventManager::InitInternals ");
+    
+    if (fgCurrent != 0)
+    {
+        throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
+    }
+    
+    if (fgMaster == 0)
+    {
+        fgMaster = this;
+    }
+    
+    fgCurrent = this;
+    
+    fAutoLoadTimer = new TTimer;
+    fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
+    fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
+    
+    fExecutor = new AliEveMacroExecutor;
+    
+    fTransients = new TEveElementList("Transients", "Transient per-event elements.");
+    fTransients->IncDenyDestroy();
+    gEve->AddToListTree(fTransients, kFALSE);
+    
+    fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
+    fTransientLists->IncDenyDestroy();
+    gEve->AddToListTree(fTransientLists, kFALSE);
+    
+    fPEventSelector = new AliEveEventSelector(this);
+    
+    fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
+}
+
 /******************************************************************************/
 
 void AliEveEventManager::SetESDFileName(const TString& esd, EVisibleESDTrees shown)
@@ -288,7 +358,6 @@ void AliEveEventManager::SetRawFileName(const TString& raw)
 void AliEveEventManager::SetCdbUri(const TString& cdb)
 {
     // Set path to CDB, there is no default.
-
     if ( ! cdb.IsNull()) fgCdbUri = cdb;
 }
 
@@ -465,11 +534,15 @@ void AliEveEventManager::Open()
     }
 
     // Open RunLoader from galice.root
+//    fgGAliceFileName = "/Users/Jerus/galice.root"; // temp
+    
     TFile *gafile = TFile::Open(fgGAliceFileName);
+    cout<<"Opening galice"<<endl;
     if (gafile)
     {
         gafile->Close();
         delete gafile;
+        cout<<"SETTING RUN LOADER in Open()"<<endl;
         fRunLoader = AliRunLoader::Open(fgGAliceFileName, GetName());
         if (fRunLoader)
         {
@@ -591,8 +664,10 @@ void AliEveEventManager::Open()
     }
 
     // Initialize OCDB ... only in master event-manager
+
                InitOCDB(runNo);
 
+
     fIsOpen = kTRUE;
 }
 
@@ -624,7 +699,7 @@ void AliEveEventManager::InitOCDB(int runNo)
                 cdb->SetDefaultStorage("MC", "Full");
             else if (fgCdbUri == "local://") {
                 fgCdbUri = Form("local://%s/OCDB", gSystem->Getenv("ALICE_ROOT"));
-                cdb->SetDefaultStorage(fgCdbUri);
+               cdb->SetDefaultStorage(fgCdbUri);
             } else
                 cdb->SetDefaultStorage(fgCdbUri);
 
@@ -938,6 +1013,16 @@ void AliEveEventManager::Timeout()
     Emit("Timeout()");
 }
 
+void AliEveEventManager::PrepareForNewEvent(AliESDEvent *event)
+{      
+       DestroyElements();
+               
+       InitOCDB(event->GetRunNumber());
+                       
+       printf("======================= setting event to %d\n", fEventId);
+       SetEvent(0,0,event,0);
+}
+
 void AliEveEventManager::NextEvent()
 {
     // Loads next event.
@@ -952,65 +1037,59 @@ void AliEveEventManager::NextEvent()
 
     if (fExternalCtrl)
     {
-        // !!! This should really go somewhere else. It is done in GotoEvent(),
-        // so here we should do it in SetEvent().
-          DestroyElements();
-        
-                       #ifdef ZMQ
-                       AliNetMessage *mess;
-                       fgSubSock->Recv(mess);
-        
-        
-                                   AliESDEvent* data = (AliESDEvent*)(mess->ReadObjectAny(AliESDEvent::Class()));
+#ifdef ZMQ
 
-               if (data){
-                   printf("Got DATA:\n");
+      cout<<fIsNewEventAvaliable<<"\t"<<"\t"<<fWritingToEventIndex<<endl;
 
-                   printf("Event Number in File:%d Run:%d ObjectsInList:%d\n", data->GetEventNumberInFile(),  data->GetRunNumber(), data->GetList()->GetEntries());
-                       
-                       TTree* tree= new TTree("esdTree", "esdTree");
-                   data->WriteToTree(tree);
-                   tree-> Fill();
-                   //tree->Write();
-                       
-                       printf("======================= Tree has %d entries\n", tree->GetEntries());
-                       
-                       AliESDEvent* event= new AliESDEvent();
-                                                               event->ReadFromTree(tree);
-                                                       
-                                               tree->GetEntry(0);
-                       
-                       InitOCDB(event->GetRunNumber());
-                       
-                       printf("======================= setting event to %d\n", fEventId);
-                       SetEvent(0,0,event,0);
-                   
-                           delete event;
-                       delete tree;
-                       
-               }
-               else
-                  printf("NO DATA!!!\n");
-                                    
-               delete data; data=0;
-               delete mess; mess=0;
-               #endif
-               
+      if(fIsNewEventAvaliable)
+      {
+        cout<<"new event"<<endl;
+        fMutex.Lock();
+        if(fWritingToEventIndex == 0) fEventInUse = 0;
+        else if(fWritingToEventIndex == 1) fEventInUse = 1;
+        cout<<"Using:"<<fEventInUse<<endl;
+
+        if(fCurrentEvent[fEventInUse])
+        {
+          if(fCurrentEvent[fEventInUse]->GetRunNumber() >= 0)
+          {
+            printf("======================= setting event to %d\n", fEventId);
+
+            DestroyElements();
+            InitOCDB(fCurrentEvent[fEventInUse]->GetRunNumber());
+            SetEvent(0,0,fCurrentEvent[fEventInUse],0);
+          }
+        }
+        fIsNewEventAvaliable = false;
+        fMutex.UnLock();
+      }
+      else{cout<<"No new event is avaliable."<<endl;}
+
+#endif 
     }
     else if ((fESDTree!=0) || (fHLTESDTree!=0))
     {
-        Int_t nextevent=0;
-        if (fPEventSelector->FindNext(nextevent))
-        {
-            GotoEvent(nextevent);
-        }
+      Int_t nextevent=0;
+      if (fPEventSelector->FindNext(nextevent))
+      {
+        GotoEvent(nextevent);
+      }
     }
     else if (fEventId < GetMaxEventId(kTRUE))
     {
-        GotoEvent(fEventId + 1);
+      GotoEvent(fEventId + 1);
     }
     
-     gSystem->ProcessEvents();
+    gSystem->ProcessEvents();
+    
+    /*
+    cout<<"VSD"<<endl;
+    AliEveVSDCreator *vsdCreator = new AliEveVSDCreator();
+    cout<<"contructor called"<<endl;
+    vsdCreator->CreateVSD("myVSD.root");
+    cout<<"PO"<<endl;
+*/
+    //if(fEventListenerThread){delete fEventListenerThread;fEventListenerThread=0;}
 }
 
 void AliEveEventManager::PrevEvent()
@@ -1042,6 +1121,57 @@ void AliEveEventManager::PrevEvent()
     }
 }
 
+void AliEveEventManager::MarkCurrentEvent()
+{
+#ifdef ZMQ
+       struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
+       struct eventStruct mark;
+       mark.runNumber = fESD->GetRunNumber();
+       mark.eventNumber = fESD->GetEventNumberInFile();
+       requestMessage->messageType = REQUEST_MARK_EVENT;
+       requestMessage->event = mark;
+
+       AliStorageEventManager *eventManager =
+               AliStorageEventManager::GetEventManagerInstance();
+       eventManager->CreateSocket(SERVER_COMMUNICATION_REQ);
+
+       /*
+       std::future<bool> unused = std::async([]()
+       {
+               eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
+               bool response =  eventManager->GetBool(SERVER_COMMUNICATION_REQ);
+
+               if(response)
+               {
+               //fStatusLabel->SetText("Event marked");
+               cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
+               }
+               else
+               {
+               //fStatusLabel->SetText("Couldn't mark this event");
+               cout<<"ADMIN PANEL -- Could not matk event"<<endl;
+               }
+       });
+       */
+       
+       eventManager->Send(requestMessage,SERVER_COMMUNICATION_REQ);
+       bool response =  eventManager->GetBool(SERVER_COMMUNICATION_REQ);
+       
+       
+       if(response)
+       {
+               //fStatusLabel->SetText("Event marked");
+               cout<<"ADMIN PANEL -- Event marked succesfully"<<endl;
+       }
+       else
+       {
+               //fStatusLabel->SetText("Couldn't mark this event");
+               cout<<"ADMIN PANEL -- Could not matk event"<<endl;
+       }
+       if(requestMessage){delete requestMessage;}
+#endif
+}
+
 void AliEveEventManager::Close()
 {
     // Close the event data-files and delete ESD, ESDfriend, run-loader
@@ -1295,11 +1425,6 @@ AliRecoParam* AliEveEventManager::AssertRecoParams()
     return fgRecoParam;
 }
 
-AliSocket* AliEveEventManager::AssertSubscriber()
-{
-       return fgSubSock;
-}
-
 Bool_t AliEveEventManager::InitRecoParam()
 {
     // This is mostly a reap-off from reconstruction
@@ -1597,23 +1722,23 @@ void AliEveEventManager::StopAutoLoadTimer()
 
 void AliEveEventManager::AutoLoadNextEvent()
 {
-    // Called from auto-load timer, so it has to be public.
-    // Do NOT call it directly.
+       // Called from auto-load timer, so it has to be public.
+       // Do NOT call it directly.
 
-         static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
+       static const TEveException kEH("AliEveEventManager::AutoLoadNextEvent ");
          
-               Info(kEH, "called!");
-
-    if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
-    {
-        Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
-        return;
-    }
-
-    StopAutoLoadTimer();
-    NextEvent();
-    if (fAutoLoad)
-        StartAutoLoadTimer();
+       Info(kEH, "called!");
+
+       if ( ! fAutoLoadTimerRunning || ! fAutoLoadTimer->HasTimedOut())
+       {
+               Warning(kEH, "Called unexpectedly - ignoring the call. Should ONLY be called from an internal timer.");
+               return;
+       }
+
+       StopAutoLoadTimer();
+       NextEvent();
+       if (fAutoLoad)
+               StartAutoLoadTimer();
 }
 
 //------------------------------------------------------------------------------
@@ -1622,62 +1747,65 @@ void AliEveEventManager::AutoLoadNextEvent()
 
 void AliEveEventManager::AfterNewEventLoaded()
 {
-    // Execute registered macros and commands.
-    // At the end emit NewEventLoaded signal.
-    //
-    // Virtual from TEveEventManager.
+  // Execute registered macros and commands.
+  // At the end emit NewEventLoaded signal.
+  //
+  // Virtual from TEveEventManager.
 
-    static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
+  static const TEveException kEH("AliEveEventManager::AfterNewEventLoaded ");
 
   Info(kEH, "------------------!!!------------");
                       
-    NewEventDataLoaded();
-
-    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());
-            }
-              Info(kEH, "------------------!!! while() gEve->SetCurrentEvent() ------------");
-        }
-        fgCurrent = fgMaster;
-        Info(kEH, "------------------!!! while() gEve->SetCurrentEvent(MASTER) ------------");
-        gEve->SetCurrentEvent(fgMaster);
+  NewEventDataLoaded();
+  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());
+      }
+      Info(kEH, "------------------!!! while() gEve->SetCurrentEvent() ------------");
     }
-    
+    fgCurrent = fgMaster;
+    Info(kEH, "------------------!!! while() gEve->SetCurrentEvent(MASTER) ------------");
+    gEve->SetCurrentEvent(fgMaster);
+  }
 }
 
 void AliEveEventManager::NewEventDataLoaded()
 {
     // Emit NewEventDataLoaded signal.
-
     Emit("NewEventDataLoaded()");
 }
-
 void AliEveEventManager::NewEventLoaded()
 {
     // Emit NewEventLoaded signal.
-
     Emit("NewEventLoaded()");
 }
+void AliEveEventManager::StorageManagerOk()
+{
+    // Emit StorageManagerOk signal.
+    Emit("StorageManagerOk()");
+}
+void AliEveEventManager::StorageManagerDown()
+{
+    // Emit StorageManagerOk signal.
+    Emit("StorageManagerDown()");
+}
 
 
 //------------------------------------------------------------------------------