49#include <nlohmann/json.hpp> 
   86REveManager::REveManager()
 
   88     fExcHandler(nullptr), fVizDB(nullptr), fVizDBReplace(
kTRUE), fVizDBUpdate(
kTRUE), fGeometries(nullptr),
 
   89     fGeometryAliases(nullptr),
 
   97      throw eh + 
"There can be only one REve!";
 
  160   fWebWindow->SetDefaultPage(
"file:rootui5sys/eve7/index.html");
 
  166   fWebWindow->SetUserArgs(
Form(
"{ GLViewer: \"%s\", DblClick: \"%s\", HTimeout: %d, TableRowHeight: %d }", 
gl_viewer,
 
  174                            [
this](
unsigned connid, 
const std::string &arg) { 
WindowData(connid, arg); },
 
 
  244   printf(
"REveManager::RegisterRedraw3D() obsolete\n");
 
 
  253   printf(
"REveManager::DoRedraw3D() obsolete\n");
 
 
  261   printf(
"REveManager::FullRedraw3D() obsolete\n");
 
 
  282   if (parent == 
nullptr) {
 
 
  328      throw eh + 
"ElementId map is full.";
 
 
  350   nlohmann::json 
msg = {};
 
  351   msg[
"content"] = 
"BrowseElement";
 
 
  363   if (
el->fImpliedSelected > 0) {
 
  366         sel->RemoveImpliedSelectedReferencesTo(
el);
 
  369      if (
el->fImpliedSelected != 0)
 
  370         Error(
"REveManager::PreDeleteElement", 
"ImpliedSelected not zero (%d) after cleanup of selections.",
 
  371               el->fImpliedSelected);
 
  375   if (
el->fElementId != 0) {
 
  378         if (it->second == 
el) {
 
  382            Error(
"PreDeleteElement", 
"element ptr in ElementIdMap does not match the argument element.");
 
  384         Error(
"PreDeleteElement", 
"element id %u was not registered in ElementIdMap.", 
el->fElementId);
 
  386      Error(
"PreDeleteElement", 
"element with 0 ElementId passed in.");
 
 
  415               el->SetVizModel(model);
 
  417                  el->CopyVizParams(model);
 
  418                  el->PropagateVizParamsToProjecteds();
 
 
  493      Error(
"SaveVizDB", 
"filename does not match required format '(.+)\\.\\w+'.");
 
  500   std::ofstream out(
exp_filename, std::ios::out | std::ios::trunc);
 
  501   out << 
"void " << re[1] << 
"()\n";
 
  503   out << 
"   REveManager::Create();\n";
 
 
  545         Warning(
"REveManager::GetGeometry", 
"TGeoManager is locked ... unlocking it.");
 
  549         throw eh + 
"TGeoManager::Import() failed for '" + 
exp_filename + 
"'.";
 
  565            while ((vol = (
TGeoVolume *)next()) != 
nullptr) {
 
 
  591      throw eh + 
"geometry alias '" + 
alias + 
"' not registered.";
 
 
  641   gROOT->ResetClassSaved();
 
 
  703      std::function<void()> 
foo_;
 
 
  746   printf(
"connection established %u\n", connid);
 
  754   printf(
"\nEVEMNG ............. streaming the world scene.\n");
 
  766      if (!
scene->GetMandatory())
 
  769      scene->AddSubscriber(std::make_unique<REveClient>(connid, 
fWebWindow));
 
  770      printf(
"\nEVEMNG ............. streaming scene %s [%s]\n", 
scene->GetCTitle(), 
scene->GetCName());
 
  773      scene->StreamElements();
 
  775      printf(
"   sending json, len = %d\n", (
int)
scene->fOutputJson.size());
 
  778      if (
scene->fTotalBinarySize > 0) {
 
  779         printf(
"   sending binary, len = %d\n", 
scene->fTotalBinarySize);
 
  782         printf(
"   NOT sending binary, len = %d\n", 
scene->fTotalBinarySize);
 
 
  797      if (i->fId == connid) {
 
  804      printf(
"error, connection not found!");
 
  806      printf(
"connection closed %u\n", connid);
 
  810         scene->RemoveSubscriber(connid);
 
 
  838      if (conn.fId == connid) {
 
  846      R__LOG_ERROR(
REveLog()) << 
"Internal error - no connection with id " << connid << 
" found";
 
  851   if (arg.compare(
"__REveDoneChanges") == 0)
 
  857         if (conn.fId == connid) {
 
  877   nlohmann::json 
cj = nlohmann::json::parse(arg);
 
  879      ::Info(
"REveManager::WindowData", 
"MIR test %s\n", 
cj.dump().c_str());
 
  881   std::string cmd = 
cj[
"mir"];
 
  882   int id = 
cj[
"fElementId"];
 
  883   std::string 
ctype = 
cj[
"class"];
 
 
  897      std::cout  << 
"Warning, REveManager::ScheduleMIR(). queue size " << 
fMIRqueue.size() << std::endl;
 
 
  910      ::Info(
"REveManager::ExecuteCommand", 
"MIR cmd %s", 
mir->fCmd.c_str());
 
  914      if ( ! 
el) 
throw eh + 
"Element with id " + 
mir->fId + 
" not found";
 
  916      static const std::regex 
cmd_re(
"^(\\w[\\w\\d]*)\\(\\s*(.*)\\s*\\)\\s*;?\\s*$", std::regex::optimize);
 
  920         throw eh + 
"Command string parse error: '" + 
mir->fCmd + 
"'.";
 
  922      static const TClass *
elem_cls = TClass::GetClass<REX::REveElement>();
 
  926         throw eh + 
"Class '" + 
mir->fCtype + 
"' not found.";
 
  930         throw eh + 
"Dynamic cast from REveElement to '" + 
mir->fCtype + 
"' failed.";
 
  932      std::string tag(
mir->fCtype + 
"::" + 
m.str(1));
 
  933      std::shared_ptr<TMethodCall> 
mc;
 
  944            throw eh + 
"Can not find TMethod matching '" + 
m.str(1) + 
"'.";
 
  945         mc = std::make_shared<TMethodCall>(
meth);
 
  959   } 
catch (std::exception &
e) {
 
 
  982   nlohmann::json 
jobj = {};
 
  983   jobj[
"content"] = 
"BeginChanges";
 
  996   jobj[
"content"] = 
"EndChanges";
 
 1000      constexpr static std::array<const char *, numLevels> 
sTag{
 
 1001        {
"{unset-error-level please report}", 
"FATAL", 
"Error", 
"Warning", 
"Info", 
"Debug"}};
 
 1003      jobj[
"log"] = nlohmann::json::array();
 
 1004      std::stringstream 
strm;
 
 1006         nlohmann::json item = {};
 
 1007         item[
"lvl"] = 
entry.fLevel;
 
 1011         if (!
entry.fLocation.fFuncName.empty())
 
 1012            strm << 
" " << 
entry.fLocation.fFuncName;
 
 1014         item[
"msg"] = 
strm.str();
 
 1015         jobj[
"log"].push_back(item);
 
 
 1028#if defined(R__LINUX) 
 1071            scene->RemoveSubscriber(
mir->fConnId);
 
 1077            scene->StreamElements();
 
 1079            if (
scene->fTotalBinarySize > 0)
 
 
 1096      std::cout << 
"Disconnect scee " << 
sinfo->GetScene()->GetName();
 
 
 1106      std::cout << 
"Connect scene " << 
sinfo->GetScene()->GetName();
 
 
 1197#if defined(_MSC_VER) 
 
 1248      Info(
"Handle", 
"Exception %s", 
ex->what());
 
 
thread_local MIR_TL_Data_t gMIRData
 
thread_local std::vector< RLogEntry > gEveLogEntries
 
#define R__LOG_ERROR(...)
 
static void update(gsl_integration_workspace *workspace, double a1, double b1, double area1, double error1, double a2, double b2, double area2, double error2)
 
R__EXTERN TApplication * gApplication
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
 
void DefaultErrorHandler(Int_t level, Bool_t abort_bool, const char *location, const char *msg)
The default error handler function.
 
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
 
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
 
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
 
ErrorHandlerFunc_t SetErrorHandler(ErrorHandlerFunc_t newhandler)
Set an errorhandler function. Returns the old handler.
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t sel
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize id
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
 
R__EXTERN TGeoManager * gGeoManager
 
R__EXTERN TGeoIdentity * gGeoIdentity
 
R__EXTERN TVirtualMutex * gInterpreterMutex
 
#define R__LOCKGUARD_CLING(mutex)
 
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
 
R__EXTERN TVirtualMutex * gSystemMutex
 
R__EXTERN TSystem * gSystem
 
#define R__LOCKGUARD2(mutex)
 
void DecDenyDestroy()
Decreases the deny-destroy count of the element.
 
virtual void AddElement(REveElement *el)
Add el to the list of children.
 
virtual Bool_t SetRnrChildren(Bool_t rnr)
Set render state of this element's children, i.e.
 
virtual void DestroyElements()
Destroy all children of this element.
 
REveElement * FirstChild() const
Returns the first child element or 0 if the list is empty.
 
void IncDenyDestroy()
Increases the deny-destroy count of the element.
 
void SetChildClass(TClass *c)
 
virtual void RemoveElement(REveElement *el)
Remove el from the list of children.
 
REveException Exception-type thrown by Eve classes.
 
bool Emit(const RLogEntry &entry) override
Utility to stream loggs to client.
 
EStatus Handle(std::exception &exc) override
Handle exceptions deriving from REveException.
 
std::condition_variable fCV
 
void DisconnectEveViewer(REveViewer *)
 
void ScheduleMIR(const std::string &cmd, ElementId_t i, const std::string &ctype, unsigned connid)
 
void ClearROOTClassSaved()
Work-around uber ugly hack used in SavePrimitive and co.
 
ElementId_t fMaxElementIds
 
std::shared_ptr< ROOT::RWebWindow > fWebWindow
 
void RegisterGeometryAlias(const TString &alias, const TString &filename)
Register 'name' as an alias for geometry file 'filename'.
 
void PreDeleteElement(REveElement *element)
Called from REveElement prior to its destruction so the framework components (like object editor) can...
 
void ExecuteMIR(std::shared_ptr< MIR > mir)
 
ElementId_t fNumElementIds
 
REveSceneList * GetScenes() const
 
std::thread fMIRExecThread
 
void ClearAllSelections()
Clear all selection objects.
 
RExceptionHandler * fExcHandler
exception handler
 
REveSelection * fSelection
 
void AssignElementId(REveElement *element)
Assign a unique ElementId to given element.
 
TGeoManager * GetDefaultGeometry()
Get the default geometry.
 
static void ExecuteInMainThread(std::function< void()> func)
 
void GetServerStatus(REveServerStatus &)
 
void SetDefaultHtmlPage(const std::string &path)
Set content of default window HTML page.
 
void AddLocation(const std::string &name, const std::string &path)
Register new directory to THttpServer.
 
void Send(unsigned connid, const std::string &data)
 
bool ClientConnectionsFree() const
 
static void Terminate()
Properly terminate global REveManager.
 
REveElement * FindElementById(ElementId_t id) const
Lookup ElementId in element map and return corresponding REveElement*.
 
void SaveVizDB(const TString &filename)
Save visualization-parameter database to file filename.
 
TGeoManager * GetGeometryByAlias(const TString &alias)
Get geometry with given alias.
 
std::unordered_map< ElementId_t, REveElement * > fElementIdMap
 
static REveManager * Create()
If global REveManager* REX::gEve is not set initialize it.
 
std::unordered_map< std::string, std::shared_ptr< TMethodCall > > fMethCallMap
 
void WindowConnect(unsigned connid)
Process new connection from web window.
 
std::vector< Conn > fConnList
 
void AllowMultipleRemoteConnections(bool loopBack=true, bool useAuthKey=true)
Utility function to allow remote RWebWindow connections.
 
REveElement * FindVizDBEntry(const TString &tag)
Find a visualization-parameter database entry corresponding to tag.
 
ElementId_t fLastElementId
 
TGeoManager * GetGeometry(const TString &filename)
Get geometry with given filename.
 
void ConnectEveViewer(REveViewer *)
 
static void ErrorHandler(Int_t level, Bool_t abort, const char *location, const char *msg)
 
REveSelection * fHighlight
 
std::queue< std::shared_ptr< MIR > > fMIRqueue
 
REveViewerList * fViewers
 
void LoadVizDB(const TString &filename, Bool_t replace, Bool_t update)
Load visualization-parameter database from file filename.
 
void DoRedraw3D()
Perform 3D redraw of scenes and viewers whose contents has changed.
 
void SendBinary(unsigned connid, const void *data, std::size_t len)
 
void AddElement(REveElement *element, REveElement *parent=nullptr)
Add an element.
 
void SetClientVersion(const std::string &version)
Set client version, used as prefix in scripts URL When changed, web browser will reload all related J...
 
void AddGlobalElement(REveElement *element, REveElement *parent=nullptr)
Add a global element, i.e.
 
void Redraw3D(Bool_t resetCameras=kFALSE, Bool_t dropLogicals=kFALSE)
 
void SceneSubscriberWaitingResponse(unsigned cinnId)
 
REveScene * SpawnNewScene(const char *name, const char *title="")
Create a new scene.
 
REveServerStatus fServerStatus
 
void RemoveElement(REveElement *element, REveElement *parent)
Remove element from parent.
 
virtual ~REveManager()
Destructor.
 
void WindowDisconnect(unsigned connid)
Process disconnect of web window.
 
void FullRedraw3D(Bool_t resetCameras=kFALSE, Bool_t dropLogicals=kFALSE)
Perform 3D redraw of all scenes and viewers.
 
REveElement * fSelectionList
 
REveViewer * SpawnNewViewer(const char *name, const char *title="")
Create a new GL viewer.
 
Bool_t InsertVizDBEntry(const TString &tag, REveElement *model, Bool_t replace, Bool_t update)
Insert a new visualization-parameter database entry.
 
void StreamSceneChangesToJson()
 
REveViewer * GetDefaultViewer() const
Get the default viewer.
 
REveScene * GetWorld() const
 
void BrowseElement(ElementId_t id)
Activate EVE browser (summary view) for specified element id.
 
void WindowData(unsigned connid, const std::string &arg)
Process data from web window.
 
void Show(const RWebDisplayArgs &args="")
Show eve manager in specified browser.
 
REveSceneInfo Scene in a viewer.
 
void DestroyScenes()
Destroy all scenes and their contents.
 
void AcceptChanges(bool)
Set accept changes flag on all scenes.
 
void AddSubscriber(std::unique_ptr< REveClient > &&sub)
 
void StreamRepresentationChanges()
Prepare data for sending element changes.
 
void SendChangesToSubscribers()
 
void BeginAcceptingChanges()
 
void EndAcceptingChanges()
 
void RemoveSubscriber(unsigned int)
 
REveSelection Container for selected and highlighted elements.
 
void SetIsHighlight(bool m)
 
static void Macro(const char *mac)
Execute macro 'mac'. Do not reload the macro.
 
REveViewerList List of Viewers providing common operations on REveViewer collections.
 
void AddElement(REveElement *el) override
Call base-class implementation.
 
REveViewer Reve representation of TGLViewer.
 
A diagnostic that can be emitted by the RLogManager.
 
Holds different arguments for starting browser with RWebDisplayHandle::Display() method.
 
static std::shared_ptr< RWebWindow > Create()
Create new RWebWindow Using default RWebWindowsManager.
 
static bool EmbedFileDialog(const std::shared_ptr< RWebWindow > &window, unsigned connid, const std::string &args)
Create dialog instance to use as embedded dialog inside provided widget Loads libROOTBrowserv7 and tr...
 
static bool IsFileDialogMessage(const std::string &msg)
Check if this could be the message send by client to start new file dialog If returns true,...
 
static void SetLoopbackMode(bool on=true)
Set loopback mode for THttpServer used for web widgets By default is on.
 
virtual void Terminate(Int_t status=0)
Terminate the application by call TSystem::Exit() unless application has been told to return from Run...
 
virtual Color_t GetLineColor() const
Return the line color.
 
TClass instances represent classes, structs and namespaces in the ROOT type system.
 
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
 
The color creation and management class.
 
virtual void GetRGB(Float_t &r, Float_t &g, Float_t &b) const
 
static Int_t GetColor(const char *hexcolor)
Static method returning color number for color specified by hex color string of form: "#rrggbb",...
 
static void SetColorThreshold(Float_t t)
This method specifies the color threshold used by GetColor to retrieve a color.
 
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
 
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
 
An identity transformation.
 
The manager class for any TGeo geometry.
 
static void UnlockGeometry()
Unlock current geometry.
 
TObjArray * GetListOfVolumes() const
 
TObjArray * GetListOfMatrices() const
 
static Bool_t IsLocked()
Check lock state.
 
static TGeoManager * Import(const char *filename, const char *name="", Option_t *option="")
static function Import a geometry from a gdml or ROOT file
 
static void LockGeometry()
Lock current geometry so that no other geometry can be imported.
 
TGeoVolume * GetTopVolume() const
 
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
 
void VisibleDaughters(Bool_t vis=kTRUE)
set visibility for daughters
 
void SetLineColor(Color_t lcolor) override
Set the line color.
 
TMap implements an associative array of (key,value) pairs using a THashTable for efficient retrieval ...
 
void Add(TObject *obj) override
This function may not be used (but we need to provide it since it is a pure virtual in TCollection).
 
virtual void SetOwnerKeyValue(Bool_t ownkeys=kTRUE, Bool_t ownvals=kTRUE)
Set ownership for keys and values.
 
TObject * FindObject(const char *keyname) const override
Check if a (key,value) pair exists with keyname as name of the key.
 
TObject * GetValue(const char *keyname) const
Returns a pointer to the value associated with keyname as name of the key.
 
Each ROOT class (see TClass) has a linked list of methods.
 
TObject * At(Int_t idx) const override
 
Collectable string class.
 
Mother of all ROOT objects.
 
Wrapper for PCRE library (Perl Compatible Regular Expressions).
 
Class used by TMap to store (key,value) pairs.
 
void SetValue(TObject *val)
 
const char * Data() const
 
void Beep(Int_t freq=-1, Int_t duration=-1, Bool_t setDefault=kFALSE)
Beep for duration milliseconds with a tone of frequency freq.
 
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
 
virtual int GetPid()
Get process id.
 
virtual void AddTimer(TTimer *t)
Add timer to list of system timers.
 
virtual int GetProcInfo(ProcInfo_t *info) const
Returns cpu and memory used by this process into the ProcInfo_t structure.
 
virtual TTimer * RemoveTimer(TTimer *t)
Remove timer from list of system timers.
 
Handles synchronous and a-synchronous timer events.
 
R__EXTERN REveManager * gEve
 
@ kDebug
Debug information; only useful for developers; can have added verbosity up to 255-kDebug.
 
RLogChannel & REveLog()
Log channel for Eve diagnostics.
 
std::vector< REveScene * > removedWatch
 
std::vector< REveScene * > addedWatch
 
std::time_t fTLastDisconnect
 
std::time_t fTLastConnect