#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
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),
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();
{
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()
//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)
void AliEveEventManager::SetCdbUri(const TString& cdb)
{
// Set path to CDB, there is no default.
-
if ( ! cdb.IsNull()) fgCdbUri = cdb;
}
}
// 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)
{
}
// Initialize OCDB ... only in master event-manager
+
InitOCDB(runNo);
+
fIsOpen = kTRUE;
}
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);
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.
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()
}
}
+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
return fgRecoParam;
}
-AliSocket* AliEveEventManager::AssertSubscriber()
-{
- return fgSubSock;
-}
-
Bool_t AliEveEventManager::InitRecoParam()
{
// This is mostly a reap-off from reconstruction
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();
}
//------------------------------------------------------------------------------
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()");
+}
//------------------------------------------------------------------------------