Logo ROOT   6.16/01
Reference Guide
TROOT.cxx
Go to the documentation of this file.
1// @(#)root/base:$Id$
2// Author: Rene Brun 08/12/94
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12/** \class TROOT
13\ingroup Base
14
15ROOT top level object description.
16
17The TROOT object is the entry point to the ROOT system.
18The single instance of TROOT is accessible via the global gROOT.
19Using the gROOT pointer one has access to basically every object
20created in a ROOT based program. The TROOT object is essentially a
21container of several lists pointing to the main ROOT objects.
22
23The following lists are accessible from gROOT object:
24
25~~~ {.cpp}
26 gROOT->GetListOfClasses
27 gROOT->GetListOfColors
28 gROOT->GetListOfTypes
29 gROOT->GetListOfGlobals
30 gROOT->GetListOfGlobalFunctions
31 gROOT->GetListOfFiles
32 gROOT->GetListOfMappedFiles
33 gROOT->GetListOfSockets
34 gROOT->GetListOfSecContexts
35 gROOT->GetListOfCanvases
36 gROOT->GetListOfStyles
37 gROOT->GetListOfFunctions
38 gROOT->GetListOfSpecials (for example graphical cuts)
39 gROOT->GetListOfGeometries
40 gROOT->GetListOfBrowsers
41 gROOT->GetListOfCleanups
42 gROOT->GetListOfMessageHandlers
43~~~
44
45The TROOT class provides also many useful services:
46 - Get pointer to an object in any of the lists above
47 - Time utilities TROOT::Time
48
49The ROOT object must be created as a static object. An example
50of a main program creating an interactive version is shown below:
51
52### Example of a main program
53
54~~~ {.cpp}
55 #include "TRint.h"
56
57 int main(int argc, char **argv)
58 {
59 TRint *theApp = new TRint("ROOT example", &argc, argv);
60
61 // Init Intrinsics, build all windows, and enter event loop
62 theApp->Run();
63
64 return(0);
65 }
66~~~
67*/
68
69#include <ROOT/RConfig.hxx>
70#include "RConfigure.h"
71#include "RConfigOptions.h"
72#include "RVersion.h"
73#include "RGitCommit.h"
74
75#include <string>
76#include <map>
77#include <stdlib.h>
78#ifdef WIN32
79#include <io.h>
80#include "Windows4Root.h"
81#include <Psapi.h>
82#define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL))
83//#define dlsym(library, function_name) ::GetProcAddress((HMODULE)library, function_name)
84#define dlopen(library_name, flags) ::LoadLibrary(library_name)
85#define dlclose(library) ::FreeLibrary((HMODULE)library)
86char *dlerror() {
87 static char Msg[1000];
88 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
89 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), Msg,
90 sizeof(Msg), NULL);
91 return Msg;
92}
93FARPROC dlsym(void *library, const char *function_name)
94{
95 HMODULE hMods[1024];
96 DWORD cbNeeded;
97 FARPROC address = NULL;
98 unsigned int i;
99 if (library == RTLD_DEFAULT) {
100 if (EnumProcessModules(::GetCurrentProcess(), hMods, sizeof(hMods), &cbNeeded)) {
101 for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {
102 address = ::GetProcAddress((HMODULE)hMods[i], function_name);
103 if (address)
104 return address;
105 }
106 }
107 return address;
108 } else {
109 return ::GetProcAddress((HMODULE)library, function_name);
110 }
111}
112#else
113#include <dlfcn.h>
114#endif
115
116#include "Riostream.h"
117#include "TROOT.h"
118#include "TClass.h"
119#include "TClassEdit.h"
120#include "TClassGenerator.h"
121#include "TDataType.h"
122#include "TDatime.h"
123#include "TStyle.h"
124#include "TObjectTable.h"
125#include "TClassTable.h"
126#include "TSystem.h"
127#include "THashList.h"
128#include "TObjArray.h"
129#include "TEnv.h"
130#include "TError.h"
131#include "TColor.h"
132#include "TGlobal.h"
133#include "TFunction.h"
134#include "TVirtualPad.h"
135#include "TBrowser.h"
136#include "TSystemDirectory.h"
137#include "TApplication.h"
138#include "TInterpreter.h"
139#include "TGuiFactory.h"
140#include "TMessageHandler.h"
141#include "TFolder.h"
142#include "TQObject.h"
143#include "TProcessUUID.h"
144#include "TPluginManager.h"
145#include "TMap.h"
146#include "TObjString.h"
147#include "TVirtualMutex.h"
148#include "TInterpreter.h"
149#include "TListOfTypes.h"
150#include "TListOfDataMembers.h"
151#include "TListOfEnumsWithLock.h"
152#include "TListOfFunctions.h"
154#include "TFunctionTemplate.h"
155#include "ThreadLocalStorage.h"
156#include "TVirtualRWMutex.h"
157
158#include <string>
159namespace std {} using namespace std;
160
161#if defined(R__UNIX)
162#if defined(R__HAS_COCOA)
163#include "TMacOSXSystem.h"
164#include "TUrl.h"
165#else
166#include "TUnixSystem.h"
167#endif
168#elif defined(R__WIN32)
169#include "TWinNTSystem.h"
170#endif
171
172extern "C" void R__SetZipMode(int);
173
175static void *gInterpreterLib = 0;
176
177// Mutex for protection of concurrent gROOT access
180
181// For accessing TThread::Tsd indirectly.
182void **(*gThreadTsd)(void*,Int_t) = 0;
183
184//-------- Names of next three routines are a small homage to CMZ --------------
185////////////////////////////////////////////////////////////////////////////////
186/// Return version id as an integer, i.e. "2.22/04" -> 22204.
187
188static Int_t IVERSQ()
189{
190 Int_t maj, min, cycle;
191 sscanf(ROOT_RELEASE, "%d.%d/%d", &maj, &min, &cycle);
192 return 10000*maj + 100*min + cycle;
193}
194
195////////////////////////////////////////////////////////////////////////////////
196/// Return built date as integer, i.e. "Apr 28 2000" -> 20000428.
197
198static Int_t IDATQQ(const char *date)
199{
200 static const char *months[] = {"Jan","Feb","Mar","Apr","May",
201 "Jun","Jul","Aug","Sep","Oct",
202 "Nov","Dec"};
203
204 char sm[12];
205 Int_t yy, mm=0, dd;
206 sscanf(date, "%s %d %d", sm, &dd, &yy);
207 for (int i = 0; i < 12; i++)
208 if (!strncmp(sm, months[i], 3)) {
209 mm = i+1;
210 break;
211 }
212 return 10000*yy + 100*mm + dd;
213}
214
215////////////////////////////////////////////////////////////////////////////////
216/// Return built time as integer (with min precision), i.e.
217/// "17:32:37" -> 1732.
218
219static Int_t ITIMQQ(const char *time)
220{
221 Int_t hh, mm, ss;
222 sscanf(time, "%d:%d:%d", &hh, &mm, &ss);
223 return 100*hh + mm;
224}
225
226////////////////////////////////////////////////////////////////////////////////
227/// Clean up at program termination before global objects go out of scope.
228
229static void CleanUpROOTAtExit()
230{
231 if (gROOT) {
233
234 if (gROOT->GetListOfFiles())
235 gROOT->GetListOfFiles()->Delete("slow");
236 if (gROOT->GetListOfSockets())
237 gROOT->GetListOfSockets()->Delete();
238 if (gROOT->GetListOfMappedFiles())
239 gROOT->GetListOfMappedFiles()->Delete("slow");
240 if (gROOT->GetListOfClosedObjects())
241 gROOT->GetListOfClosedObjects()->Delete("slow");
242 }
243}
244
245////////////////////////////////////////////////////////////////////////////////
246/// A module and its headers. Intentionally not a copy:
247/// If these strings end up in this struct they are
248/// long lived by definition because they get passed in
249/// before initialization of TCling.
250
251namespace {
252 struct ModuleHeaderInfo_t {
253 ModuleHeaderInfo_t(const char* moduleName,
254 const char** headers,
255 const char** includePaths,
256 const char* payloadCode,
257 const char* fwdDeclCode,
258 void (*triggerFunc)(),
259 const TROOT::FwdDeclArgsToKeepCollection_t& fwdDeclsArgToSkip,
260 const char **classesHeaders,
261 bool hasCxxModule):
262 fModuleName(moduleName),
263 fHeaders(headers),
264 fPayloadCode(payloadCode),
265 fFwdDeclCode(fwdDeclCode),
266 fIncludePaths(includePaths),
267 fTriggerFunc(triggerFunc),
268 fClassesHeaders(classesHeaders),
269 fFwdNargsToKeepColl(fwdDeclsArgToSkip),
270 fHasCxxModule(hasCxxModule) {}
271
272 const char* fModuleName; // module name
273 const char** fHeaders; // 0-terminated array of header files
274 const char* fPayloadCode; // Additional code to be given to cling at library load
275 const char* fFwdDeclCode; // Additional code to let cling know about selected classes and functions
276 const char** fIncludePaths; // 0-terminated array of header files
277 void (*fTriggerFunc)(); // Pointer to the dict initialization used to find the library name
278 const char** fClassesHeaders; // 0-terminated list of classes and related header files
279 const TROOT::FwdDeclArgsToKeepCollection_t fFwdNargsToKeepColl; // Collection of
280 // pairs of template fwd decls and number of
281 bool fHasCxxModule; // Whether this module has a C++ module alongside it.
282 };
283
284 std::vector<ModuleHeaderInfo_t>& GetModuleHeaderInfoBuffer() {
285 static std::vector<ModuleHeaderInfo_t> moduleHeaderInfoBuffer;
286 return moduleHeaderInfoBuffer;
287 }
288}
289
293
294static void at_exit_of_TROOT() {
297}
298
299// This local static object initializes the ROOT system
300namespace ROOT {
301namespace Internal {
302 class TROOTAllocator {
303 // Simple wrapper to separate, time-wise, the call to the
304 // TROOT destructor and the actual free-ing of the memory.
305 //
306 // Since the interpreter implementation (currently TCling) is
307 // loaded via dlopen by libCore, the destruction of its global
308 // variable (i.e. in particular clang's) is scheduled before
309 // those in libCore so we need to schedule the call to the TROOT
310 // destructor before that *but* we want to make sure the memory
311 // stay around until libCore itself is unloaded so that code
312 // using gROOT can 'properly' check for validity.
313 //
314 // The order of loading for is:
315 // libCore.so
316 // libRint.so
317 // ... anything other library hard linked to the executable ...
318 // ... for example libEvent
319 // libCling.so
320 // ... other libraries like libTree for example ....
321 // and the destruction order is (of course) the reverse.
322 // By default the unloading of the dictionary, does use
323 // the service of the interpreter ... which of course
324 // fails if libCling is already unloaded by that information
325 // has not been registered per se.
326 //
327 // To solve this problem, we now schedule the destruction
328 // of the TROOT object to happen _just_ before the
329 // unloading/destruction of libCling so that we can
330 // maximize the amount of clean-up we can do correctly
331 // and we can still allocate the TROOT object's memory
332 // statically.
333 //
334 char fHolder[sizeof(TROOT)];
335 public:
336 TROOTAllocator() {
337 new(&(fHolder[0])) TROOT("root", "The ROOT of EVERYTHING");
338 }
339
340 ~TROOTAllocator() {
341 if (gROOTLocal) {
343 }
344 }
345 };
346
347 // The global gROOT is defined to be a function (ROOT::GetROOT())
348 // which itself is dereferencing a function pointer.
349
350 // Initially this function pointer's value is & GetROOT1 whose role is to
351 // create and initialize the TROOT object itself.
352 // At the very end of the TROOT constructor the value of the function pointer
353 // is switch to & GetROOT2 whose role is to initialize the interpreter.
354
355 // This mechanism was primarily intended to fix the issues with order in which
356 // global TROOT and LLVM globals are initialized. TROOT was initializing
357 // Cling, but Cling could not be used yet due to LLVM globals not being
358 // Initialized yet. The solution is to delay initializing the interpreter in
359 // TROOT till after main() when all LLVM globals are initialized.
360
361 // Technically, the mechanism used actually delay the interpreter
362 // initialization until the first use of gROOT *after* the end of the
363 // TROOT constructor.
364
365 // So to delay until after the start of main, we also made sure that none
366 // of the ROOT code (mostly the dictionary code) used during library loading
367 // is using gROOT (directly or indirectly).
368
369 // In practice, the initialization of the interpreter is now delayed until
370 // the first use gROOT (or gInterpreter) after the start of main (but user
371 // could easily break this by using gROOT in their library initialization
372 // code).
373
374 extern TROOT *gROOTLocal;
375
377 if (gROOTLocal)
378 return gROOTLocal;
379 static TROOTAllocator alloc;
380 return gROOTLocal;
381 }
382
384 static Bool_t initInterpreter = kFALSE;
385 if (!initInterpreter) {
386 initInterpreter = kTRUE;
388 // Load and init threads library
390 }
391 return gROOTLocal;
392 }
393 typedef TROOT *(*GetROOTFun_t)();
394
396
397 static Func_t GetSymInLibImt(const char *funcname)
398 {
399 const static bool loadSuccess = dlsym(RTLD_DEFAULT, "usedToIdentifyRootClingByDlSym")? false : 0 <= gSystem->Load("libImt");
400 if (loadSuccess) {
401 if (auto sym = gSystem->DynFindSymbol(nullptr, funcname)) {
402 return sym;
403 } else {
404 Error("GetSymInLibImt", "Cannot get symbol %s.", funcname);
405 }
406 }
407 return nullptr;
408 }
409
410 //////////////////////////////////////////////////////////////////////////////
411 /// Globally enables the parallel branch processing, which is a case of
412 /// implicit multi-threading (IMT) in ROOT, activating the required locks.
413 /// This IMT use case, implemented in TTree::GetEntry, spawns a task for
414 /// each branch of the tree. Therefore, a task takes care of the reading,
415 /// decompression and deserialisation of a given branch.
417 {
418#ifdef R__USE_IMT
419 if (!IsImplicitMTEnabled())
421 static void (*sym)() = (void(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_EnableParBranchProcessing");
422 if (sym)
423 sym();
424#else
425 ::Warning("EnableParBranchProcessing", "Cannot enable parallel branch processing, please build ROOT with -Dimt=ON");
426#endif
427 }
428
429 //////////////////////////////////////////////////////////////////////////////
430 /// Globally disables the IMT use case of parallel branch processing,
431 /// deactivating the corresponding locks.
433 {
434#ifdef R__USE_IMT
435 static void (*sym)() = (void(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_DisableParBranchProcessing");
436 if (sym)
437 sym();
438#else
439 ::Warning("DisableParBranchProcessing", "Cannot disable parallel branch processing, please build ROOT with -Dimt=ON");
440#endif
441 }
442
443 //////////////////////////////////////////////////////////////////////////////
444 /// Returns true if parallel branch processing is enabled.
446 {
447#ifdef R__USE_IMT
448 static Bool_t (*sym)() = (Bool_t(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_IsParBranchProcessingEnabled");
449 if (sym)
450 return sym();
451 else
452 return kFALSE;
453#else
454 return kFALSE;
455#endif
456 }
457
458 ////////////////////////////////////////////////////////////////////////////////
459 /// Globally enables the parallel tree processing, which is a case of
460 /// implicit multi-threading in ROOT, activating the required locks.
461 /// This IMT use case, implemented in TTreeProcessor::Process, receives a user
462 /// function and applies it to subranges of the tree, which correspond to its
463 /// clusters. Hence, for every cluster, a task is spawned to potentially
464 /// process it in parallel with the other clusters.
466 {
467#ifdef R__USE_IMT
468 if (!IsImplicitMTEnabled())
470 static void (*sym)() = (void(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_EnableParTreeProcessing");
471 if (sym)
472 sym();
473#else
474 ::Warning("EnableParTreeProcessing", "Cannot enable parallel tree processing, please build ROOT with -Dimt=ON");
475#endif
476 }
477
478 //////////////////////////////////////////////////////////////////////////////
479 /// Globally disables the IMT use case of parallel branch processing,
480 /// deactivating the corresponding locks.
482 {
483#ifdef R__USE_IMT
484 static void (*sym)() = (void(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_DisableParTreeProcessing");
485 if (sym)
486 sym();
487#else
488 ::Warning("DisableParTreeProcessing", "Cannot disable parallel tree processing, please build ROOT with -Dimt=ON");
489#endif
490 }
491
492 ////////////////////////////////////////////////////////////////////////////////
493 /// Returns true if parallel tree processing is enabled.
495 {
496#ifdef R__USE_IMT
497 static Bool_t (*sym)() = (Bool_t(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_IsParTreeProcessingEnabled");
498 if (sym)
499 return sym();
500 else
501 return kFALSE;
502#else
503 return kFALSE;
504#endif
505 }
506
507 ////////////////////////////////////////////////////////////////////////////////
508 /// Keeps track of the status of ImplicitMT w/o resorting to the load of
509 /// libImt
511 {
512 static Bool_t isImplicitMTEnabled = kFALSE;
513 return isImplicitMTEnabled;
514 }
515
516} // end of Internal sub namespace
517// back to ROOT namespace
518
520 return (*Internal::gGetROOT)();
521 }
522
523 TString &GetMacroPath() {
524 static TString macroPath;
525 return macroPath;
526 }
527
528 // clang-format off
529 ////////////////////////////////////////////////////////////////////////////////
530 /// Enables the global mutex to make ROOT thread safe/aware.
531 ///
532 /// The following becomes safe:
533 /// - concurrent construction and destruction of TObjects, including the ones registered in ROOT's global lists (e.g. gROOT->GetListOfCleanups(), gROOT->GetListOfFiles())
534 /// - concurrent usage of _different_ ROOT objects from different threads, including ones with global state (e.g. TFile, TTree, TChain) with the exception of graphics classes (e.g. TCanvas)
535 /// - concurrent calls to ROOT's type system classes, e.g. TClass and TEnum
536 /// - concurrent calls to the interpreter through gInterpreter
537 /// - concurrent loading of ROOT plug-ins
538 ///
539 /// In addition, gDirectory, gFile and gPad become a thread-local variable.
540 /// In all threads, gDirectory defaults to gROOT, a singleton which supports thread-safe insertion and deletion of contents.
541 /// gFile and gPad default to nullptr, as it is for single-thread programs.
542 ///
543 /// Note that there is no `DisableThreadSafety()`. ROOT's thread-safety features cannot be disabled once activated.
544 // clang-format on
546 {
547 static void (*sym)() = (void(*)())Internal::GetSymInLibImt("ROOT_TThread_Initialize");
548 if (sym)
549 sym();
550 }
551
552 ////////////////////////////////////////////////////////////////////////////////
553 /// @param[in] numthreads Number of threads to use. If not specified or
554 /// set to zero, the number of threads is automatically
555 /// decided by the implementation. Any other value is
556 /// used as a hint.
557 ///
558 /// ROOT must be built with the compilation flag `imt=ON` for this feature to be available.
559 /// The following objects and methods automatically take advantage of
560 /// multi-threading if a call to `EnableImplicitMT` has been made before usage:
561 ///
562 /// - RDataFrame internally runs the event-loop by parallelizing over clusters of entries
563 /// - TTree::GetEntry reads multiple branches in parallel
564 /// - TTree::FlushBaskets writes multiple baskets to disk in parallel
565 /// - TTreeCacheUnzip decompresses the baskets contained in a TTreeCache in parallel
566 /// - THx::Fit performs in parallel the evaluation of the objective function over the data
567 /// - TMVA::DNN trains the deep neural networks in parallel
568 /// - TMVA::BDT trains the classifier in parallel and multiclass BDTs are evaluated in parallel
569 ///
570 /// EnableImplicitMT calls in turn EnableThreadSafety.
571 /// The 'numthreads' parameter allows to control the number of threads to
572 /// be used by the implicit multi-threading. However, this parameter is just
573 /// a hint for ROOT: it will try to satisfy the request if the execution
574 /// scenario allows it. For example, if ROOT is configured to use an external
575 /// scheduler, setting a value for 'numthreads' might not have any effect.
576 void EnableImplicitMT(UInt_t numthreads)
577 {
578#ifdef R__USE_IMT
580 return;
582 static void (*sym)(UInt_t) = (void(*)(UInt_t))Internal::GetSymInLibImt("ROOT_TImplicitMT_EnableImplicitMT");
583 if (sym)
584 sym(numthreads);
586#else
587 ::Warning("EnableImplicitMT", "Cannot enable implicit multi-threading with %d threads, please build ROOT with -Dimt=ON", numthreads);
588#endif
589 }
590
591 ////////////////////////////////////////////////////////////////////////////////
592 /// Disables the implicit multi-threading in ROOT (see EnableImplicitMT).
594 {
595#ifdef R__USE_IMT
596 static void (*sym)() = (void(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_DisableImplicitMT");
597 if (sym)
598 sym();
600#else
601 ::Warning("DisableImplicitMT", "Cannot disable implicit multi-threading, please build ROOT with -Dimt=ON");
602#endif
603 }
604
605 ////////////////////////////////////////////////////////////////////////////////
606 /// Returns true if the implicit multi-threading in ROOT is enabled.
608 {
610 }
611
612 ////////////////////////////////////////////////////////////////////////////////
613 /// Returns the size of the pool used for implicit multi-threading.
615 {
616#ifdef R__USE_IMT
617 static UInt_t (*sym)() = (UInt_t(*)())Internal::GetSymInLibImt("ROOT_TImplicitMT_GetImplicitMTPoolSize");
618 if (sym)
619 return sym();
620 else
621 return 0;
622#else
623 return 0;
624#endif
625 }
626
627}
628
630
631// Global debug flag (set to > 0 to get debug output).
632// Can be set either via the interpreter (gDebug is exported to CINT),
633// via the rootrc resource "Root.Debug", via the shell environment variable
634// ROOTDEBUG, or via the debugger.
636
637
639
640////////////////////////////////////////////////////////////////////////////////
641/// Default ctor.
642
644 fLineIsProcessing(0), fVersion(0), fVersionInt(0), fVersionCode(0),
645 fVersionDate(0), fVersionTime(0), fBuiltDate(0), fBuiltTime(0),
646 fTimer(0), fApplication(0), fInterpreter(0), fBatch(kTRUE),
647 fIsWebDisplay(kFALSE), fIsWebDisplayBatch(kFALSE), fEditHistograms(kTRUE),
648 fFromPopUp(kTRUE),fMustClean(kTRUE),fReadingObject(kFALSE),fForceStyle(kFALSE),
649 fInterrupt(kFALSE),fEscape(kFALSE),fExecutingMacro(kFALSE),fEditorMode(0),
650 fPrimitive(0),fSelectPad(0),fClasses(0),fTypes(0),fGlobals(0),fGlobalFunctions(0),
651 fClosedObjects(0),fFiles(0),fMappedFiles(0),fSockets(0),fCanvases(0),fStyles(0),fFunctions(0),
652 fTasks(0),fColors(0),fGeometries(0),fBrowsers(0),fSpecials(0),fCleanups(0),
653 fMessageHandlers(0),fStreamerInfo(0),fClassGenerators(0),fSecContexts(0),
654 fProofs(0),fClipboard(0),fDataSets(0),fUUIDs(0),fRootFolder(0),fBrowsables(0),
655 fPluginManager(0)
656{
657}
658
659////////////////////////////////////////////////////////////////////////////////
660/// Initialize the ROOT system. The creation of the TROOT object initializes
661/// the ROOT system. It must be the first ROOT related action that is
662/// performed by a program. The TROOT object must be created on the stack
663/// (can not be called via new since "operator new" is protected). The
664/// TROOT object is either created as a global object (outside the main()
665/// program), or it is one of the first objects created in main().
666/// Make sure that the TROOT object stays in scope for as long as ROOT
667/// related actions are performed. TROOT is a so called singleton so
668/// only one instance of it can be created. The single TROOT object can
669/// always be accessed via the global pointer gROOT.
670/// The name and title arguments can be used to identify the running
671/// application. The initfunc argument can contain an array of
672/// function pointers (last element must be 0). These functions are
673/// executed at the end of the constructor. This way one can easily
674/// extend the ROOT system without adding permanent dependencies
675/// (e.g. the graphics system is initialized via such a function).
676
677TROOT::TROOT(const char *name, const char *title, VoidFuncPtr_t *initfunc)
678 : TDirectory(), fLineIsProcessing(0), fVersion(0), fVersionInt(0), fVersionCode(0),
679 fVersionDate(0), fVersionTime(0), fBuiltDate(0), fBuiltTime(0),
680 fTimer(0), fApplication(0), fInterpreter(0), fBatch(kTRUE),
681 fIsWebDisplay(kFALSE), fIsWebDisplayBatch(kFALSE), fEditHistograms(kTRUE),
682 fFromPopUp(kTRUE),fMustClean(kTRUE),fReadingObject(kFALSE),fForceStyle(kFALSE),
683 fInterrupt(kFALSE),fEscape(kFALSE),fExecutingMacro(kFALSE),fEditorMode(0),
684 fPrimitive(0),fSelectPad(0),fClasses(0),fTypes(0),fGlobals(0),fGlobalFunctions(0),
685 fClosedObjects(0),fFiles(0),fMappedFiles(0),fSockets(0),fCanvases(0),fStyles(0),fFunctions(0),
686 fTasks(0),fColors(0),fGeometries(0),fBrowsers(0),fSpecials(0),fCleanups(0),
687 fMessageHandlers(0),fStreamerInfo(0),fClassGenerators(0),fSecContexts(0),
688 fProofs(0),fClipboard(0),fDataSets(0),fUUIDs(0),fRootFolder(0),fBrowsables(0),
689 fPluginManager(0)
690{
692 //Warning("TROOT", "only one instance of TROOT allowed");
693 return;
694 }
695
697
699 gDirectory = 0;
700
701 SetName(name);
702 SetTitle(title);
703
704 // will be used by global "operator delete" so make sure it is set
705 // before anything is deleted
706 fMappedFiles = 0;
707
708 // create already here, but only initialize it after gEnv has been created
710
711 // Initialize Operating System interface
712 InitSystem();
713
714 // Initialize static directory functions
715 GetRootSys();
716 GetBinDir();
717 GetLibDir();
719 GetEtcDir();
720 GetDataDir();
721 GetDocDir();
722 GetMacroDir();
724 GetSourceDir();
725 GetIconPath();
727
728 gRootDir = GetRootSys().Data();
729
731
732 // Initialize interface to CINT C++ interpreter
733 fVersionInt = 0; // check in TROOT dtor in case TCling fails
734 fClasses = 0; // might be checked via TCling ctor
735 fEnums = 0;
736
737 fConfigOptions = R__CONFIGUREOPTIONS;
738 fConfigFeatures = R__CONFIGUREFEATURES;
744 fBuiltDate = IDATQQ(__DATE__);
745 fBuiltTime = ITIMQQ(__TIME__);
746
747 ReadGitInfo();
748
749 fClasses = new THashTable(800,3); fClasses->UseRWLock();
750 //fIdMap = new IdMap_t;
753
754 // usedToIdentifyRootClingByDlSym is available when TROOT is part of
755 // rootcling.
756 if (!dlsym(RTLD_DEFAULT, "usedToIdentifyRootClingByDlSym")) {
757 // initialize plugin manager early
759#if defined(R__MACOSX) && (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)
760 if (TARGET_OS_IPHONE | TARGET_IPHONE_SIMULATOR) {
761 TEnv plugins(".plugins-ios");
763 }
764#endif
765 }
766
767 TSystemDirectory *workdir = new TSystemDirectory("workdir", gSystem->WorkingDirectory());
768
769 auto setNameLocked = [](TSeqCollection *l, const char *collection_name) {
770 l->SetName(collection_name);
771 l->UseRWLock();
772 return l;
773 };
774
775 fTimer = 0;
776 fApplication = 0;
777 fColors = setNameLocked(new TObjArray(1000), "ListOfColors");
778 fTypes = 0;
779 fGlobals = 0;
781 // fList was created in TDirectory::Build but with different sizing.
782 delete fList;
783 fList = new THashList(1000,3); fList->UseRWLock();
784 fClosedObjects = setNameLocked(new TList, "ClosedFiles");
785 fFiles = setNameLocked(new TList, "Files");
786 fMappedFiles = setNameLocked(new TList, "MappedFiles");
787 fSockets = setNameLocked(new TList, "Sockets");
788 fCanvases = setNameLocked(new TList, "Canvases");
789 fStyles = setNameLocked(new TList, "Styles");
790 fFunctions = setNameLocked(new TList, "Functions");
791 fTasks = setNameLocked(new TList, "Tasks");
792 fGeometries = setNameLocked(new TList, "Geometries");
793 fBrowsers = setNameLocked(new TList, "Browsers");
794 fSpecials = setNameLocked(new TList, "Specials");
795 fBrowsables = (TList*)setNameLocked(new TList, "Browsables");
796 fCleanups = setNameLocked(new THashList, "Cleanups");
797 fMessageHandlers = setNameLocked(new TList, "MessageHandlers");
798 fSecContexts = setNameLocked(new TList, "SecContexts");
799 fProofs = setNameLocked(new TList, "Proofs");
800 fClipboard = setNameLocked(new TList, "Clipboard");
801 fDataSets = setNameLocked(new TList, "DataSets");
803
805 fUUIDs = new TProcessUUID();
806
807 fRootFolder = new TFolder();
808 fRootFolder->SetName("root");
809 fRootFolder->SetTitle("root of all folders");
810 fRootFolder->AddFolder("Classes", "List of Active Classes",fClasses);
811 fRootFolder->AddFolder("Colors", "List of Active Colors",fColors);
812 fRootFolder->AddFolder("MapFiles", "List of MapFiles",fMappedFiles);
813 fRootFolder->AddFolder("Sockets", "List of Socket Connections",fSockets);
814 fRootFolder->AddFolder("Canvases", "List of Canvases",fCanvases);
815 fRootFolder->AddFolder("Styles", "List of Styles",fStyles);
816 fRootFolder->AddFolder("Functions", "List of Functions",fFunctions);
817 fRootFolder->AddFolder("Tasks", "List of Tasks",fTasks);
818 fRootFolder->AddFolder("Geometries","List of Geometries",fGeometries);
819 fRootFolder->AddFolder("Browsers", "List of Browsers",fBrowsers);
820 fRootFolder->AddFolder("Specials", "List of Special Objects",fSpecials);
821 fRootFolder->AddFolder("Handlers", "List of Message Handlers",fMessageHandlers);
822 fRootFolder->AddFolder("Cleanups", "List of RecursiveRemove Collections",fCleanups);
823 fRootFolder->AddFolder("StreamerInfo","List of Active StreamerInfo Classes",fStreamerInfo);
824 fRootFolder->AddFolder("SecContexts","List of Security Contexts",fSecContexts);
825 fRootFolder->AddFolder("PROOF Sessions", "List of PROOF sessions",fProofs);
826 fRootFolder->AddFolder("ROOT Memory","List of Objects in the gROOT Directory",fList);
827 fRootFolder->AddFolder("ROOT Files","List of Connected ROOT Files",fFiles);
828
829 // by default, add the list of files, tasks, canvases and browsers in the Cleanups list
835 // And add TROOT's TDirectory personality
837
843 fEscape = kFALSE;
845 fPrimitive = 0;
846 fSelectPad = 0;
847 fEditorMode = 0;
848 fDefCanvasName = "c1";
850 fLineIsProcessing = 1; // This prevents WIN32 "Windows" thread to pick ROOT objects with mouse
851 gDirectory = this;
852 gPad = 0;
853
854 //set name of graphical cut class for the graphics editor
855 //cannot call SetCutClassName at this point because the TClass of TCutG
856 //is not yet build
857 fCutClassName = "TCutG";
858
859 // Create a default MessageHandler
860 new TMessageHandler((TClass*)0);
861
862 // Create some styles
863 gStyle = 0;
865 SetStyle(gEnv->GetValue("Canvas.Style", "Modern"));
866
867 // Setup default (batch) graphics and GUI environment
870 gGXBatch = new TVirtualX("Batch", "ROOT Interface to batch graphics");
872
873#if defined(R__WIN32)
874 fBatch = kFALSE;
875#elif defined(R__HAS_COCOA)
876 fBatch = kFALSE;
877#else
878 if (gSystem->Getenv("DISPLAY"))
879 fBatch = kFALSE;
880 else
881 fBatch = kTRUE;
882#endif
883
884 int i = 0;
885 while (initfunc && initfunc[i]) {
886 (initfunc[i])();
887 fBatch = kFALSE; // put system in graphics mode (backward compatible)
888 i++;
889 }
890
891 // Set initial/default list of browsable objects
892 fBrowsables->Add(fRootFolder, "root");
893 fBrowsables->Add(fProofs, "PROOF Sessions");
895 fBrowsables->Add(fFiles, "ROOT Files");
896
897 atexit(CleanUpROOTAtExit);
898
900}
901
902////////////////////////////////////////////////////////////////////////////////
903/// Clean up and free resources used by ROOT (files, network sockets,
904/// shared memory segments, etc.).
905
907{
908 using namespace ROOT::Internal;
909
910 if (gROOTLocal == this) {
911
912 // If the interpreter has not yet been initialized, don't bother
914
915 // Mark the object as invalid, so that we can veto some actions
916 // (like autoloading) while we are in the destructor.
918
919 // Turn-off the global mutex to avoid recreating mutexes that have
920 // already been deleted during the destruction phase
921 gGlobalMutex = 0;
922
923 // Return when error occurred in TCling, i.e. when setup file(s) are
924 // out of date
925 if (!fVersionInt) return;
926
927 // ATTENTION!!! Order is important!
928
929#ifdef R__COMPLETE_MEM_TERMINATION
931
932 // FIXME: Causes rootcling to deadlock, debug and uncomment
933 // SafeDelete(fRootFolder);
934
935 fSpecials->Delete(); SafeDelete(fSpecials); // delete special objects : PostScript, Minuit, Html
936#endif
937 fClosedObjects->Delete("slow"); // and closed files
938 fFiles->Delete("slow"); // and files
940 fSecContexts->Delete("slow"); SafeDelete(fSecContexts); // and security contexts
941 fSockets->Delete(); SafeDelete(fSockets); // and sockets
942 fMappedFiles->Delete("slow"); // and mapped files
943 TSeqCollection *tl = fMappedFiles; fMappedFiles = 0; delete tl;
944
946
947 delete fUUIDs;
948 TProcessID::Cleanup(); // and list of ProcessIDs
949
953#ifdef R__COMPLETE_MEM_TERMINATION
955#endif
958
959#ifdef R__COMPLETE_MEM_TERMINATION
964#endif
965
966 // Stop emitting signals
968
970
971#ifdef R__COMPLETE_MEM_TERMINATION
977
978 fCleanups->Clear();
980 delete gClassTable; gClassTable = 0;
981 delete gEnv; gEnv = 0;
982
983 if (fTypes) fTypes->Delete();
985 if (fGlobals) fGlobals->Delete();
989 fEnums.load()->Delete();
990
991 // FIXME: Causes segfault in rootcling, debug and uncomment
992 // fClasses->Delete(); SafeDelete(fClasses); // TClass'es must be deleted last
993#endif
994
995 // Remove shared libraries produced by the TSystem::CompileMacro() call
997
998 // Cleanup system class
999 delete gSystem;
1000
1001 // ROOT-6022:
1002 // if (gInterpreterLib) dlclose(gInterpreterLib);
1003#ifdef R__COMPLETE_MEM_TERMINATION
1004 // On some 'newer' platform (Fedora Core 17+, Ubuntu 12), the
1005 // initialization order is (by default?) is 'wrong' and so we can't
1006 // delete the interpreter now .. because any of the static in the
1007 // interpreter's library have already been deleted.
1008 // On the link line, we must list the most dependent .o file
1009 // and end with the least dependent (LLVM libraries), unfortunately,
1010 // Fedora Core 17+ or Ubuntu 12 will also execute the initialization
1011 // in the same order (hence doing libCore's before LLVM's and
1012 // vice et versa for both the destructor. We worked around the
1013 // initialization order by delay the TROOT creation until first use.
1014 // We can not do the same for destruction as we have no way of knowing
1015 // the last access ...
1016 // So for now, let's avoid delete TCling except in the special build
1017 // checking the completeness of the termination deletion.
1018
1019 // TODO: Should we do more cleanup here than just call delete?
1020 // Segfaults rootcling in some cases, debug and uncomment:
1021 //
1022 // delete fInterpreter;
1023
1025#endif
1026
1027 // llvm::TimingGroup used for measuring the timing relies the destructors.
1028 // In order to make use of this feature we have to call the destructor of
1029 // TCling which will shut down clang, cling and llvm.
1030 // gSystem->Getenv is not available anymore.
1031 if (::getenv("ROOT_CLING_TIMING"))
1032 delete fInterpreter;
1033
1034
1035 // Prints memory stats
1037
1038 gROOTLocal = 0;
1040 }
1041}
1042
1043////////////////////////////////////////////////////////////////////////////////
1044/// Add a class to the list and map of classes.
1045/// This routine is deprecated, use TClass::AddClass directly.
1046
1048{
1049 TClass::AddClass(cl);
1050}
1051
1052////////////////////////////////////////////////////////////////////////////////
1053/// Add a class generator. This generator will be called by TClass::GetClass
1054/// in case its does not find a loaded rootcint dictionary to request the
1055/// creation of a TClass object.
1056
1058{
1059 if (!generator) return;
1060 fClassGenerators->Add(generator);
1061}
1062
1063////////////////////////////////////////////////////////////////////////////////
1064/// Append object to this directory.
1065///
1066/// If replace is true:
1067/// remove any existing objects with the same same (if the name is not "")
1068
1069void TROOT::Append(TObject *obj, Bool_t replace /* = kFALSE */)
1070{
1072 TDirectory::Append(obj,replace);
1073}
1074
1075////////////////////////////////////////////////////////////////////////////////
1076/// Add browsable objects to TBrowser.
1077
1079{
1080 TObject *obj;
1081 TIter next(fBrowsables);
1082
1083 while ((obj = (TObject *) next())) {
1084 const char *opt = next.GetOption();
1085 if (opt && strlen(opt))
1086 b->Add(obj, opt);
1087 else
1088 b->Add(obj, obj->GetName());
1089 }
1090}
1091
1092////////////////////////////////////////////////////////////////////////////////
1093/// return class status bit kClassSaved for class cl
1094/// This function is called by the SavePrimitive functions writing
1095/// the C++ code for an object.
1096
1098{
1099 if (cl == 0) return kFALSE;
1100 if (cl->TestBit(TClass::kClassSaved)) return kTRUE;
1102 return kFALSE;
1103}
1104
1105namespace {
1106 static void R__ListSlowClose(TList *files)
1107 {
1108 // Routine to close a list of files using the 'slow' techniques
1109 // that also for the deletion ot update the list itself.
1110
1111 static TObject harmless;
1112 TObjLink *cursor = files->FirstLink();
1113 while (cursor) {
1114 TDirectory *dir = static_cast<TDirectory*>( cursor->GetObject() );
1115 if (dir) {
1116 // In order for the iterator to stay valid, we must
1117 // prevent the removal of the object (dir) from the list
1118 // (which is done in TFile::Close). We can also can not
1119 // just move to the next iterator since the Close might
1120 // also (indirectly) remove that file.
1121 // So we SetObject to a harmless value, so that 'dir'
1122 // is not seen as part of the list.
1123 // We will later, remove all the object (see files->Clear()
1124 cursor->SetObject(&harmless); // this must not be zero otherwise things go wrong.
1125 // See related comment at the files->Clear("nodelete");
1126 dir->Close("nodelete");
1127 // Put it back
1128 cursor->SetObject(dir);
1129 }
1130 cursor = cursor->Next();
1131 };
1132 // Now were done, clear the list but do not delete the objects as
1133 // they have been moved to the list of closed objects and must be
1134 // deleted from there in order to avoid a double delete from a
1135 // use objects (on the interpreter stack).
1136 files->Clear("nodelete");
1137 }
1138
1139 static void R__ListSlowDeleteContent(TList *files)
1140 {
1141 // Routine to delete the content of list of files using the 'slow' techniques
1142
1143 static TObject harmless;
1144 TObjLink *cursor = files->FirstLink();
1145 while (cursor) {
1146 TDirectory *dir = dynamic_cast<TDirectory*>( cursor->GetObject() );
1147 if (dir) {
1148 // In order for the iterator to stay valid, we must
1149 // prevent the removal of the object (dir) from the list
1150 // (which is done in TFile::Close). We can also can not
1151 // just move to the next iterator since the Close might
1152 // also (indirectly) remove that file.
1153 // So we SetObject to a harmless value, so that 'dir'
1154 // is not seen as part of the list.
1155 // We will later, remove all the object (see files->Clear()
1156 cursor->SetObject(&harmless); // this must not be zero otherwise things go wrong.
1157 // See related comment at the files->Clear("nodelete");
1158 dir->GetList()->Delete("slow");
1159 // Put it back
1160 cursor->SetObject(dir);
1161 }
1162 cursor = cursor->Next();
1163 };
1164 }
1165}
1166
1167////////////////////////////////////////////////////////////////////////////////
1168/// Close any files and sockets that gROOT knows about.
1169/// This can be used to insures that the files and sockets are closed before any library is unloaded!
1170
1172{
1173 if (fFiles && fFiles->First()) {
1174 R__ListSlowClose(static_cast<TList*>(fFiles));
1175 }
1176 // and Close TROOT itself.
1177 Close("slow");
1178 // Now sockets.
1179 if (fSockets && fSockets->First()) {
1180 if (0==fCleanups->FindObject(fSockets) ) {
1183 }
1184 CallFunc_t *socketCloser = gInterpreter->CallFunc_Factory();
1185 Long_t offset = 0;
1186 TClass *socketClass = TClass::GetClass("TSocket");
1187 gInterpreter->CallFunc_SetFuncProto(socketCloser, socketClass->GetClassInfo(), "Close", "", &offset);
1188 if (gInterpreter->CallFunc_IsValid(socketCloser)) {
1189 static TObject harmless;
1190 TObjLink *cursor = static_cast<TList*>(fSockets)->FirstLink();
1191 TList notclosed;
1192 while (cursor) {
1193 TObject *socket = cursor->GetObject();
1194 // In order for the iterator to stay valid, we must
1195 // prevent the removal of the object (dir) from the list
1196 // (which is done in TFile::Close). We can also can not
1197 // just move to the next iterator since the Close might
1198 // also (indirectly) remove that file.
1199 // So we SetObject to a harmless value, so that 'dir'
1200 // is not seen as part of the list.
1201 // We will later, remove all the object (see files->Clear()
1202 cursor->SetObject(&harmless); // this must not be zero otherwise things go wrong.
1203
1204 if (socket->IsA()->InheritsFrom(socketClass)) {
1205 gInterpreter->CallFunc_Exec(socketCloser, ((char*)socket)+offset);
1206 // Put the object in the closed list for later deletion.
1207 socket->SetBit(kMustCleanup);
1208 fClosedObjects->AddLast(socket);
1209 } else {
1210 // Crap ... this is not a socket, likely Proof or something, let's try to find a Close
1211 Long_t other_offset;
1212 CallFunc_t *otherCloser = gInterpreter->CallFunc_Factory();
1213 gInterpreter->CallFunc_SetFuncProto(otherCloser, socket->IsA()->GetClassInfo(), "Close", "", &other_offset);
1214 if (gInterpreter->CallFunc_IsValid(otherCloser)) {
1215 gInterpreter->CallFunc_Exec(otherCloser, ((char*)socket)+other_offset);
1216 // Put the object in the closed list for later deletion.
1217 socket->SetBit(kMustCleanup);
1218 fClosedObjects->AddLast(socket);
1219 } else {
1220 notclosed.AddLast(socket);
1221 }
1222 gInterpreter->CallFunc_Delete(otherCloser);
1223 // Put it back
1224 cursor->SetObject(socket);
1225 }
1226 cursor = cursor->Next();
1227 }
1228 // Now were done, clear the list
1229 fSockets->Clear();
1230 // Read the one we did not close
1231 cursor = notclosed.FirstLink();
1232 while (cursor) {
1233 static_cast<TList*>(fSockets)->AddLast(cursor->GetObject());
1234 cursor = cursor->Next();
1235 }
1236 }
1237 gInterpreter->CallFunc_Delete(socketCloser);
1238 }
1239 if (fMappedFiles && fMappedFiles->First()) {
1240 R__ListSlowClose(static_cast<TList*>(fMappedFiles));
1241 }
1242
1243}
1244
1245////////////////////////////////////////////////////////////////////////////////
1246/// Execute the cleanups necessary at the end of the process, in particular
1247/// those that must be executed before the library start being unloaded.
1248
1250{
1251 // This will not delete the objects 'held' by the TFiles so that
1252 // they can still be 'reacheable' when ResetGlobals is run.
1253 CloseFiles();
1254
1255 if (gInterpreter) {
1256 gInterpreter->ResetGlobals();
1257 }
1258
1259 // Now delete the objects 'held' by the TFiles so that it
1260 // is done before the tear down of the libraries.
1262 R__ListSlowDeleteContent(static_cast<TList*>(fClosedObjects));
1263 }
1264
1265 // Now a set of simpler things to delete. See the same ordering in
1266 // TROOT::~TROOT
1267 fFunctions->Delete();
1269 fBrowsers->Delete();
1270 fCanvases->Delete("slow");
1271 fColors->Delete();
1272 fStyles->Delete();
1273}
1274
1275
1276////////////////////////////////////////////////////////////////////////////////
1277/// Find an object in one Root folder
1278
1280{
1281 Error("FindObject","Not yet implemented");
1282 return 0;
1283}
1284
1285////////////////////////////////////////////////////////////////////////////////
1286/// Returns address of a ROOT object if it exists
1287///
1288/// If name contains at least one "/" the function calls FindObjectany
1289/// else
1290/// This function looks in the following order in the ROOT lists:
1291/// - List of files
1292/// - List of memory mapped files
1293/// - List of functions
1294/// - List of geometries
1295/// - List of canvases
1296/// - List of styles
1297/// - List of specials
1298/// - List of materials in current geometry
1299/// - List of shapes in current geometry
1300/// - List of matrices in current geometry
1301/// - List of Nodes in current geometry
1302/// - Current Directory in memory
1303/// - Current Directory on file
1304
1305TObject *TROOT::FindObject(const char *name) const
1306{
1307 if (name && strstr(name,"/")) return FindObjectAny(name);
1308
1309 TObject *temp = 0;
1310
1311 temp = fFiles->FindObject(name); if (temp) return temp;
1312 temp = fMappedFiles->FindObject(name); if (temp) return temp;
1313 {
1315 temp = fFunctions->FindObject(name);if (temp) return temp;
1316 }
1317 temp = fGeometries->FindObject(name); if (temp) return temp;
1318 temp = fCanvases->FindObject(name); if (temp) return temp;
1319 temp = fStyles->FindObject(name); if (temp) return temp;
1320 {
1322 temp = fSpecials->FindObject(name); if (temp) return temp;
1323 }
1324 TIter next(fGeometries);
1325 TObject *obj;
1326 while ((obj=next())) {
1327 temp = obj->FindObject(name); if (temp) return temp;
1328 }
1329 if (gDirectory) temp = gDirectory->Get(name);
1330 if (temp) return temp;
1331 if (gPad) {
1332 TVirtualPad *canvas = gPad->GetVirtCanvas();
1333 if (fCanvases->FindObject(canvas)) { //this check in case call from TCanvas ctor
1334 temp = canvas->FindObject(name);
1335 if (!temp && canvas != gPad) temp = gPad->FindObject(name);
1336 }
1337 }
1338 return temp;
1339}
1340
1341////////////////////////////////////////////////////////////////////////////////
1342/// Returns address and folder of a ROOT object if it exists
1343///
1344/// This function looks in the following order in the ROOT lists:
1345/// - List of files
1346/// - List of memory mapped files
1347/// - List of functions
1348/// - List of geometries
1349/// - List of canvases
1350/// - List of styles
1351/// - List of specials
1352/// - List of materials in current geometry
1353/// - List of shapes in current geometry
1354/// - List of matrices in current geometry
1355/// - List of Nodes in current geometry
1356/// - Current Directory in memory
1357/// - Current Directory on file
1358
1359TObject *TROOT::FindSpecialObject(const char *name, void *&where)
1360{
1361 TObject *temp = 0;
1362 where = 0;
1363
1364 if (!temp) {
1365 temp = fFiles->FindObject(name);
1366 where = fFiles;
1367 }
1368 if (!temp) {
1369 temp = fMappedFiles->FindObject(name);
1370 where = fMappedFiles;
1371 }
1372 if (!temp) {
1374 temp = fFunctions->FindObject(name);
1375 where = fFunctions;
1376 }
1377 if (!temp) {
1378 temp = fCanvases->FindObject(name);
1379 where = fCanvases;
1380 }
1381 if (!temp) {
1382 temp = fStyles->FindObject(name);
1383 where = fStyles;
1384 }
1385 if (!temp) {
1386 temp = fSpecials->FindObject(name);
1387 where = fSpecials;
1388 }
1389 if (!temp) {
1390 TObject *glast = fGeometries->Last();
1391 if (glast) {where = glast; temp = glast->FindObject(name);}
1392 }
1393 if (!temp && gDirectory) {
1394 temp = gDirectory->Get(name);
1395 where = gDirectory;
1396 }
1397 if (!temp && gPad) {
1398 TVirtualPad *canvas = gPad->GetVirtCanvas();
1399 if (fCanvases->FindObject(canvas)) { //this check in case call from TCanvas ctor
1400 temp = canvas->FindObject(name);
1401 where = canvas;
1402 if (!temp && canvas != gPad) {
1403 temp = gPad->FindObject(name);
1404 where = gPad;
1405 }
1406 }
1407 }
1408 if (!temp) return 0;
1409 if (temp->TestBit(kNotDeleted)) return temp;
1410 return 0;
1411}
1412
1413////////////////////////////////////////////////////////////////////////////////
1414/// Return a pointer to the first object with name starting at //root.
1415/// This function scans the list of all folders.
1416/// if no object found in folders, it scans the memory list of all files.
1417
1419{
1421 if (obj) return obj;
1422 return gDirectory->FindObjectAnyFile(name);
1423}
1424
1425////////////////////////////////////////////////////////////////////////////////
1426/// Scan the memory lists of all files for an object with name
1427
1429{
1431 TDirectory *d;
1432 TIter next(GetListOfFiles());
1433 while ((d = (TDirectory*)next())) {
1434 // Call explicitly TDirectory::FindObject to restrict the search to the
1435 // already in memory object.
1436 TObject *obj = d->TDirectory::FindObject(name);
1437 if (obj) return obj;
1438 }
1439 return 0;
1440}
1441
1442////////////////////////////////////////////////////////////////////////////////
1443/// Returns class name of a ROOT object including CINT globals.
1444
1445const char *TROOT::FindObjectClassName(const char *name) const
1446{
1447 // Search first in the list of "standard" objects
1448 TObject *obj = FindObject(name);
1449 if (obj) return obj->ClassName();
1450
1451 // Is it a global variable?
1452 TGlobal *g = GetGlobal(name);
1453 if (g) return g->GetTypeName();
1454
1455 return 0;
1456}
1457
1458////////////////////////////////////////////////////////////////////////////////
1459/// Return path name of obj somewhere in the //root/... path.
1460/// The function returns the first occurence of the object in the list
1461/// of folders. The returned string points to a static char array in TROOT.
1462/// If this function is called in a loop or recursively, it is the
1463/// user's responsibility to copy this string in their area.
1464
1465const char *TROOT::FindObjectPathName(const TObject *) const
1466{
1467 Error("FindObjectPathName","Not yet implemented");
1468 return "??";
1469}
1470
1471////////////////////////////////////////////////////////////////////////////////
1472/// return a TClass object corresponding to 'name' assuming it is an STL container.
1473/// In particular we looking for possible alternative name (default template
1474/// parameter, typedefs template arguments, typedefed name).
1475
1476TClass *TROOT::FindSTLClass(const char *name, Bool_t load, Bool_t silent) const
1477{
1478 // Example of inputs are
1479 // vector<int> (*)
1480 // vector<Int_t>
1481 // vector<long long>
1482 // vector<Long_64_t> (*)
1483 // vector<int, allocator<int> >
1484 // vector<Int_t, allocator<int> >
1485 //
1486 // One of the possibly expensive operation is the resolving of the typedef
1487 // which can provoke the parsing of the header files (and/or the loading
1488 // of clang pcms information).
1489
1491
1492 // Remove std::, allocator, typedef, add Long64_t, etc. in just one call.
1493 std::string normalized;
1495
1496 TClass *cl = 0;
1497 if (normalized != name) cl = TClass::GetClass(normalized.c_str(),load,silent);
1498
1499 if (load && cl==0) {
1500 // Create an Emulated class for this container.
1501 cl = gInterpreter->GenerateTClass(normalized.c_str(), kTRUE, silent);
1502 }
1503
1504 return cl;
1505}
1506
1507////////////////////////////////////////////////////////////////////////////////
1508/// Return pointer to class with name. Obsolete, use TClass::GetClass directly
1509
1510TClass *TROOT::GetClass(const char *name, Bool_t load, Bool_t silent) const
1511{
1512 return TClass::GetClass(name,load,silent);
1513}
1514
1515
1516////////////////////////////////////////////////////////////////////////////////
1517/// Return pointer to class from its name. Obsolete, use TClass::GetClass directly
1518/// See TClass::GetClass
1519
1520TClass *TROOT::GetClass(const std::type_info& typeinfo, Bool_t load, Bool_t silent) const
1521{
1522 return TClass::GetClass(typeinfo,load,silent);
1523}
1524
1525////////////////////////////////////////////////////////////////////////////////
1526/// Return address of color with index color.
1527
1529{
1531 TObjArray *lcolors = (TObjArray*) GetListOfColors();
1532 if (!lcolors) return 0;
1533 if (color < 0 || color >= lcolors->GetSize()) return 0;
1534 TColor *col = (TColor*)lcolors->At(color);
1535 if (col && col->GetNumber() == color) return col;
1536 TIter next(lcolors);
1537 while ((col = (TColor *) next()))
1538 if (col->GetNumber() == color) return col;
1539
1540 return 0;
1541}
1542
1543////////////////////////////////////////////////////////////////////////////////
1544/// Return a default canvas.
1545
1547{
1548 return (TCanvas*)gROOT->ProcessLine("TCanvas::MakeDefCanvas();");
1549}
1550
1551////////////////////////////////////////////////////////////////////////////////
1552/// Return pointer to type with name.
1553
1554TDataType *TROOT::GetType(const char *name, Bool_t /* load */) const
1555{
1556 return (TDataType*)gROOT->GetListOfTypes()->FindObject(name);
1557}
1558
1559////////////////////////////////////////////////////////////////////////////////
1560/// Return pointer to file with name.
1561
1562TFile *TROOT::GetFile(const char *name) const
1563{
1565 return (TFile*)GetListOfFiles()->FindObject(name);
1566}
1567
1568////////////////////////////////////////////////////////////////////////////////
1569/// Return pointer to style with name
1570
1571TStyle *TROOT::GetStyle(const char *name) const
1572{
1574}
1575
1576////////////////////////////////////////////////////////////////////////////////
1577/// Return pointer to function with name.
1578
1580{
1581 if (name == 0 || name[0] == 0) {
1582 return 0;
1583 }
1584
1585 {
1588 if (f1) return f1;
1589 }
1590
1591 gROOT->ProcessLine("TF1::InitStandardFunctions();");
1592
1594 return fFunctions->FindObject(name);
1595}
1596
1597////////////////////////////////////////////////////////////////////////////////
1598
1600{
1601 if (!gInterpreter) return 0;
1602
1604
1606}
1607
1608////////////////////////////////////////////////////////////////////////////////
1609/// Return pointer to global variable by name. If load is true force
1610/// reading of all currently defined globals from CINT (more expensive).
1611
1612TGlobal *TROOT::GetGlobal(const char *name, Bool_t load) const
1613{
1614 return (TGlobal *)gROOT->GetListOfGlobals(load)->FindObject(name);
1615}
1616
1617////////////////////////////////////////////////////////////////////////////////
1618/// Return pointer to global variable with address addr.
1619
1620TGlobal *TROOT::GetGlobal(const TObject *addr, Bool_t /* load */) const
1621{
1622 if (addr == 0 || ((Long_t)addr) == -1) return 0;
1623
1624 TInterpreter::DeclId_t decl = gInterpreter->GetDataMemberAtAddr(addr);
1625 if (decl) {
1626 TListOfDataMembers *globals = ((TListOfDataMembers*)(gROOT->GetListOfGlobals(kFALSE)));
1627 return (TGlobal*)globals->Get(decl);
1628 }
1629 // If we are actually looking for a global that is held by a global
1630 // pointer (for example gRandom), we need to find a pointer with the
1631 // correct value.
1632 decl = gInterpreter->GetDataMemberWithValue(addr);
1633 if (decl) {
1634 TListOfDataMembers *globals = ((TListOfDataMembers*)(gROOT->GetListOfGlobals(kFALSE)));
1635 return (TGlobal*)globals->Get(decl);
1636 }
1637 return 0;
1638}
1639
1640////////////////////////////////////////////////////////////////////////////////
1641/// Internal routine returning, and creating if necessary, the list
1642/// of global function.
1643
1645{
1647 return fGlobalFunctions;
1648}
1649
1650////////////////////////////////////////////////////////////////////////////////
1651/// Return the collection of functions named "name".
1652
1654{
1655 return ((TListOfFunctions*)fGlobalFunctions)->GetListForObject(name);
1656}
1657
1658////////////////////////////////////////////////////////////////////////////////
1659/// Return pointer to global function by name.
1660/// If params != 0 it will also resolve overloading other it returns the first
1661/// name match.
1662/// If params == 0 and load is true force reading of all currently defined
1663/// global functions from Cling.
1664/// The param string must be of the form: "3189,\"aap\",1.3".
1665
1666TFunction *TROOT::GetGlobalFunction(const char *function, const char *params,
1667 Bool_t load)
1668{
1669 if (!params) {
1672 } else {
1673 if (!fInterpreter)
1674 Fatal("GetGlobalFunction", "fInterpreter not initialized");
1675
1677 TInterpreter::DeclId_t decl = gInterpreter->GetFunctionWithValues(0,
1678 function, params,
1679 false);
1680
1681 if (!decl) return 0;
1682
1683 TFunction *f = GetGlobalFunctions()->Get(decl);
1684 if (f) return f;
1685
1686 Error("GetGlobalFunction",
1687 "\nDid not find matching TFunction <%s> with \"%s\".",
1688 function,params);
1689 return 0;
1690 }
1691}
1692
1693////////////////////////////////////////////////////////////////////////////////
1694/// Return pointer to global function by name. If proto != 0
1695/// it will also resolve overloading. If load is true force reading
1696/// of all currently defined global functions from CINT (more expensive).
1697/// The proto string must be of the form: "int, char*, float".
1698
1700 const char *proto, Bool_t load)
1701{
1702 if (!proto) {
1705 } else {
1706 if (!fInterpreter)
1707 Fatal("GetGlobalFunctionWithPrototype", "fInterpreter not initialized");
1708
1710 TInterpreter::DeclId_t decl = gInterpreter->GetFunctionWithPrototype(0,
1711 function, proto);
1712
1713 if (!decl) return 0;
1714
1715 TFunction *f = GetGlobalFunctions()->Get(decl);
1716 if (f) return f;
1717
1718 Error("GetGlobalFunctionWithPrototype",
1719 "\nDid not find matching TFunction <%s> with \"%s\".",
1720 function,proto);
1721 return 0;
1722 }
1723}
1724
1725////////////////////////////////////////////////////////////////////////////////
1726/// Return pointer to Geometry with name
1727
1729{
1731}
1732
1733////////////////////////////////////////////////////////////////////////////////
1734
1736{
1737 if(!fEnums.load()) {
1739 // Test again just in case, another thread did the work while we were
1740 // waiting.
1741 if (!fEnums.load()) fEnums = new TListOfEnumsWithLock(0);
1742 }
1743 if (load) {
1745 (*fEnums).Load(); // Refresh the list of enums.
1746 }
1747 return fEnums.load();
1748}
1749
1750////////////////////////////////////////////////////////////////////////////////
1751
1753{
1755 if(!fFuncTemplate) {
1757 }
1758 return fFuncTemplate;
1759}
1760
1761////////////////////////////////////////////////////////////////////////////////
1762/// Return list containing the TGlobals currently defined.
1763/// Since globals are created and deleted during execution of the
1764/// program, we need to update the list of globals every time we
1765/// execute this method. However, when calling this function in
1766/// a (tight) loop where no interpreter symbols will be created
1767/// you can set load=kFALSE (default).
1768
1770{
1771 if (!fGlobals) {
1773 // We add to the list the "funcky-fake" globals.
1774
1775 // provide special functor for gROOT, while ROOT::GetROOT() does not return reference
1776 TGlobalMappedFunction::MakeFunctor("gROOT", "TROOT*", ROOT::GetROOT, [] {
1777 ROOT::GetROOT();
1778 return (void *)&ROOT::Internal::gROOTLocal;
1779 });
1780
1782 TGlobalMappedFunction::MakeFunctor("gVirtualX", "TVirtualX*", TVirtualX::Instance);
1784
1785 // Don't let TGlobalMappedFunction delete our globals, now that we take them.
1789 }
1790
1791 if (!fInterpreter)
1792 Fatal("GetListOfGlobals", "fInterpreter not initialized");
1793
1794 if (load) fGlobals->Load();
1795
1796 return fGlobals;
1797}
1798
1799////////////////////////////////////////////////////////////////////////////////
1800/// Return list containing the TFunctions currently defined.
1801/// Since functions are created and deleted during execution of the
1802/// program, we need to update the list of functions every time we
1803/// execute this method. However, when calling this function in
1804/// a (tight) loop where no interpreter symbols will be created
1805/// you can set load=kFALSE (default).
1806
1808{
1810
1811 if (!fGlobalFunctions) {
1813 }
1814
1815 if (!fInterpreter)
1816 Fatal("GetListOfGlobalFunctions", "fInterpreter not initialized");
1817
1818 // A thread that calls with load==true and a thread that calls with load==false
1819 // will conflict here (the load==true will be updating the list while the
1820 // other is reading it). To solve the problem, we could use a read-write lock
1821 // inside the list itself.
1822 if (load) fGlobalFunctions->Load();
1823
1824 return fGlobalFunctions;
1825}
1826
1827////////////////////////////////////////////////////////////////////////////////
1828/// Return a dynamic list giving access to all TDataTypes (typedefs)
1829/// currently defined.
1830///
1831/// The list is populated on demand. Calling
1832/// ~~~ {.cpp}
1833/// gROOT->GetListOfTypes()->FindObject(nameoftype);
1834/// ~~~
1835/// will return the TDataType corresponding to 'nameoftype'. If the
1836/// TDataType is not already in the list itself and the type does exist,
1837/// a new TDataType will be created and added to the list.
1838///
1839/// Calling
1840/// ~~~ {.cpp}
1841/// gROOT->GetListOfTypes()->ls(); // or Print()
1842/// ~~~
1843/// list only the typedefs that have been previously accessed through the
1844/// list (plus the builtins types).
1845
1847{
1848 if (!fInterpreter)
1849 Fatal("GetListOfTypes", "fInterpreter not initialized");
1850
1851 return fTypes;
1852}
1853
1854
1855////////////////////////////////////////////////////////////////////////////////
1856/// Execute command when system has been idle for idleTimeInSec seconds.
1857
1858void TROOT::Idle(UInt_t idleTimeInSec, const char *command)
1859{
1860 if (!fApplication.load())
1862
1863 if (idleTimeInSec <= 0)
1864 (*fApplication).RemoveIdleTimer();
1865 else
1866 (*fApplication).SetIdleTimer(idleTimeInSec, command);
1867}
1868
1869////////////////////////////////////////////////////////////////////////////////
1870/// Check whether className is a known class, and only autoload
1871/// if we can. Helper function for TROOT::IgnoreInclude().
1872
1873static TClass* R__GetClassIfKnown(const char* className)
1874{
1875 // Check whether the class is available for auto-loading first:
1876 const char* libsToLoad = gInterpreter->GetClassSharedLibs(className);
1877 TClass* cla = 0;
1878 if (libsToLoad) {
1879 // trigger autoload, and only create TClass in this case.
1880 return TClass::GetClass(className);
1881 } else if (gROOT->GetListOfClasses()
1882 && (cla = (TClass*)gROOT->GetListOfClasses()->FindObject(className))) {
1883 // cla assigned in if statement
1884 } else if (gClassTable->FindObject(className)) {
1885 return TClass::GetClass(className);
1886 }
1887 return cla;
1888}
1889
1890////////////////////////////////////////////////////////////////////////////////
1891/// Return 1 if the name of the given include file corresponds to a class that
1892/// is known to ROOT, e.g. "TLorentzVector.h" versus TLorentzVector.
1893
1894Int_t TROOT::IgnoreInclude(const char *fname, const char * /*expandedfname*/)
1895{
1896 if (fname == 0) return 0;
1897
1898 TString stem(fname);
1899 // Remove extension if any, ignore files with extension not being .h*
1900 Int_t where = stem.Last('.');
1901 if (where != kNPOS) {
1902 if (stem.EndsWith(".so") || stem.EndsWith(".sl") ||
1903 stem.EndsWith(".dl") || stem.EndsWith(".a") ||
1904 stem.EndsWith(".dll", TString::kIgnoreCase))
1905 return 0;
1906 stem.Remove(where);
1907 }
1908
1909 TString className = gSystem->BaseName(stem);
1910 TClass* cla = R__GetClassIfKnown(className);
1911 if (!cla) {
1912 // Try again with modifications to the file name:
1913 className = stem;
1914 className.ReplaceAll("/", "::");
1915 className.ReplaceAll("\\", "::");
1916 if (className.Contains(":::")) {
1917 // "C:\dir" becomes "C:::dir".
1918 // fname corresponds to whatever is stated after #include and
1919 // a full path name usually means that it's not a regular #include
1920 // but e.g. a ".L", so we can assume that this is not a header of
1921 // a class in a namespace (a global-namespace class would have been
1922 // detected already before).
1923 return 0;
1924 }
1925 cla = R__GetClassIfKnown(className);
1926 }
1927
1928 if (!cla) {
1929 return 0;
1930 }
1931
1932 // cla is valid, check wether it's actually in the header of the same name:
1933 if (cla->GetDeclFileLine() <= 0) return 0; // to a void an error with VisualC++
1934 TString decfile = gSystem->BaseName(cla->GetDeclFileName());
1935 if (decfile != gSystem->BaseName(fname)) {
1936 return 0;
1937 }
1938 return 1;
1939}
1940
1941////////////////////////////////////////////////////////////////////////////////
1942/// Initialize operating system interface.
1943
1945{
1946 if (gSystem == 0) {
1947#if defined(R__UNIX)
1948#if defined(R__HAS_COCOA)
1949 gSystem = new TMacOSXSystem;
1950#else
1951 gSystem = new TUnixSystem;
1952#endif
1953#elif defined(R__WIN32)
1954 gSystem = new TWinNTSystem;
1955#else
1956 gSystem = new TSystem;
1957#endif
1958
1959 if (gSystem->Init())
1960 fprintf(stderr, "Fatal in <TROOT::InitSystem>: can't init operating system layer\n");
1961
1962 if (!gSystem->HomeDirectory()) {
1963 fprintf(stderr, "Fatal in <TROOT::InitSystem>: HOME directory not set\n");
1964 fprintf(stderr, "Fix this by defining the HOME shell variable\n");
1965 }
1966
1967 // read default files
1968 gEnv = new TEnv(".rootrc");
1969
1970 gDebug = gEnv->GetValue("Root.Debug", 0);
1971
1972 if (!gEnv->GetValue("Root.ErrorHandlers", 1))
1974
1975 // The old "Root.ZipMode" had a discrepancy between documentation vs actual meaning.
1976 // Also, a value with the meaning "default" wasn't available. To solved this,
1977 // "Root.ZipMode" was replaced by "Root.CompressionAlgorithm". Warn about usage of
1978 // the old value, if it's set to 0, but silently translate the setting to
1979 // "Root.CompressionAlgorithm" for values > 1.
1980 Int_t oldzipmode = gEnv->GetValue("Root.ZipMode", -1);
1981 if (oldzipmode == 0) {
1982 fprintf(stderr, "Warning in <TROOT::InitSystem>: ignoring old rootrc entry \"Root.ZipMode = 0\"!\n");
1983 } else {
1984 if (oldzipmode == -1 || oldzipmode == 1) {
1985 // Not set or default value, use "default" for "Root.CompressionAlgorithm":
1986 oldzipmode = 0;
1987 }
1988 // else keep the old zipmode (e.g. "3") as "Root.CompressionAlgorithm"
1989 // if "Root.CompressionAlgorithm" isn't set; see below.
1990 }
1991
1992 Int_t zipmode = gEnv->GetValue("Root.CompressionAlgorithm", oldzipmode);
1993 if (zipmode != 0) R__SetZipMode(zipmode);
1994
1995 const char *sdeb;
1996 if ((sdeb = gSystem->Getenv("ROOTDEBUG")))
1997 gDebug = atoi(sdeb);
1998
1999 if (gDebug > 0 && isatty(2))
2000 fprintf(stderr, "Info in <TROOT::InitSystem>: running with gDebug = %d\n", gDebug);
2001
2002 if (gEnv->GetValue("Root.MemStat", 0))
2004 int msize = gEnv->GetValue("Root.MemStat.size", -1);
2005 int mcnt = gEnv->GetValue("Root.MemStat.cnt", -1);
2006 if (msize != -1 || mcnt != -1)
2007 TStorage::EnableStatistics(msize, mcnt);
2008
2009 fgMemCheck = gEnv->GetValue("Root.MemCheck", 0);
2010
2011#if defined(R__HAS_COCOA)
2012 // create and delete a dummy TUrl so that TObjectStat table does not contain
2013 // objects that are deleted after recording is turned-off (in next line),
2014 // like the TUrl::fgSpecialProtocols list entries which are created in the
2015 // TMacOSXSystem ctor.
2016 { TUrl dummy("/dummy"); }
2017#endif
2018 TObject::SetObjectStat(gEnv->GetValue("Root.ObjectStat", 0));
2019 }
2020}
2021
2022////////////////////////////////////////////////////////////////////////////////
2023/// Load and initialize thread library.
2024
2026{
2027 if (gEnv->GetValue("Root.UseThreads", 0) || gEnv->GetValue("Root.EnableThreadSafety", 0)) {
2029 }
2030}
2031
2032////////////////////////////////////////////////////////////////////////////////
2033/// Initialize the interpreter. Should be called only after main(),
2034/// to make sure LLVM/Clang is fully initialized.
2035
2037{
2038 // usedToIdentifyRootClingByDlSym is available when TROOT is part of
2039 // rootcling.
2040 if (!dlsym(RTLD_DEFAULT, "usedToIdentifyRootClingByDlSym")
2041 && !dlsym(RTLD_DEFAULT, "usedToIdentifyStaticRoot")) {
2042 // Make sure no llvm symbols are visible before loading libCling. If they
2043 // exist libCling will use those and not ours, causing havoc in the
2044 // interpreter. Look for an extern "C" symbol to avoid mangling; look for a
2045 // symbol from llvm because clang builds on top, so users would likely
2046 // have also their own llvm symbols when providing their own clang.
2047 void *LLVMEnablePrettyStackTraceAddr = 0;
2048 // Can't use gSystem->DynFindSymbol() because that iterates over all *known*
2049 // libraries which is not the same!
2050 LLVMEnablePrettyStackTraceAddr = dlsym(RTLD_DEFAULT, "LLVMEnablePrettyStackTrace");
2051 // FIXME: When we configure with -Dclingtest=On we intentionally export the symbols. Silence this error.
2052 if (LLVMEnablePrettyStackTraceAddr) {
2053 Error("InitInterpreter()", "LLVM SYMBOLS ARE EXPOSED TO CLING! "
2054 "This will cause problems; please hide them or dlopen() them "
2055 "after the call to TROOT::InitInterpreter()!");
2056 }
2057
2058 char *libRIO = gSystem->DynamicPathName("libRIO");
2059 void *libRIOHandle = dlopen(libRIO, RTLD_NOW|RTLD_GLOBAL);
2060 delete [] libRIO;
2061 if (!libRIOHandle) {
2062 TString err = dlerror();
2063 fprintf(stderr, "Fatal in <TROOT::InitInterpreter>: cannot load library %s\n", err.Data());
2064 exit(1);
2065 }
2066
2067 char *libcling = gSystem->DynamicPathName("libCling");
2068 gInterpreterLib = dlopen(libcling, RTLD_LAZY|RTLD_LOCAL);
2069 delete [] libcling;
2070
2071 if (!gInterpreterLib) {
2072 TString err = dlerror();
2073 fprintf(stderr, "Fatal in <TROOT::InitInterpreter>: cannot load library %s\n", err.Data());
2074 exit(1);
2075 }
2076 dlerror(); // reset error message
2077 } else {
2078 gInterpreterLib = RTLD_DEFAULT;
2079 }
2080 CreateInterpreter_t *CreateInterpreter = (CreateInterpreter_t*) dlsym(gInterpreterLib, "CreateInterpreter");
2081 if (!CreateInterpreter) {
2082 TString err = dlerror();
2083 fprintf(stderr, "Fatal in <TROOT::InitInterpreter>: cannot load symbol %s\n", err.Data());
2084 exit(1);
2085 }
2086 // Schedule the destruction of TROOT.
2087 atexit(at_exit_of_TROOT);
2088
2089 gDestroyInterpreter = (DestroyInterpreter_t*) dlsym(gInterpreterLib, "DestroyInterpreter");
2090 if (!gDestroyInterpreter) {
2091 TString err = dlerror();
2092 fprintf(stderr, "Fatal in <TROOT::InitInterpreter>: cannot load symbol %s\n", err.Data());
2093 exit(1);
2094 }
2095
2096 const char *interpArgs[] = {
2097#ifdef NDEBUG
2098 "-DNDEBUG",
2099#else
2100 "-UNDEBUG",
2101#endif
2102#ifdef DEBUG
2103 "-DDEBUG",
2104#else
2105 "-UDEBUG",
2106#endif
2107#ifdef _DEBUG
2108 "-D_DEBUG",
2109#else
2110 "-U_DEBUG",
2111#endif
2112 nullptr};
2113
2114 fInterpreter = CreateInterpreter(gInterpreterLib, interpArgs);
2115
2118
2119 fgRootInit = kTRUE;
2120
2121 // initialize gClassTable is not already done
2122 if (!gClassTable)
2123 new TClassTable;
2124
2125 // Initialize all registered dictionaries.
2126 for (std::vector<ModuleHeaderInfo_t>::const_iterator
2127 li = GetModuleHeaderInfoBuffer().begin(),
2128 le = GetModuleHeaderInfoBuffer().end(); li != le; ++li) {
2129 // process buffered module registrations
2130 fInterpreter->RegisterModule(li->fModuleName,
2131 li->fHeaders,
2132 li->fIncludePaths,
2133 li->fPayloadCode,
2134 li->fFwdDeclCode,
2135 li->fTriggerFunc,
2136 li->fFwdNargsToKeepColl,
2137 li->fClassesHeaders,
2138 kTRUE /*lateRegistration*/,
2139 li->fHasCxxModule);
2140 }
2141 GetModuleHeaderInfoBuffer().clear();
2142
2144
2145 // Read the rules before enabling the auto loading to not inadvertently
2146 // load the libraries for the classes concerned even-though the user is
2147 // *not* using them.
2148 TClass::ReadRules(); // Read the default customization rules ...
2149
2150 // Enable autoloading
2152}
2153
2154////////////////////////////////////////////////////////////////////////////////
2155/// Helper function used by TClass::GetClass().
2156/// This function attempts to load the dictionary for 'classname'
2157/// either from the TClassTable or from the list of generator.
2158/// If silent is 'true', do not warn about missing dictionary for the class.
2159/// (typically used for class that are used only for transient members)
2160///
2161/// The 'requestedname' is expected to be already normalized.
2162
2163TClass *TROOT::LoadClass(const char *requestedname, Bool_t silent) const
2164{
2165 return TClass::LoadClass(requestedname, silent);
2166}
2167
2168////////////////////////////////////////////////////////////////////////////////
2169/// Check if class "classname" is known to the interpreter (in fact,
2170/// this check is not needed anymore, so classname is ignored). If
2171/// not it will load library "libname". If the library couldn't be found with original
2172/// libname and if the name was not prefixed with lib, try to prefix with "lib" and search again.
2173/// If DynamicPathName still couldn't find the library, return -1.
2174/// If check is true it will only check if libname exists and is
2175/// readable.
2176/// Returns 0 on successful loading, -1 in case libname does not
2177/// exist or in case of error and -2 in case of version mismatch.
2178
2179Int_t TROOT::LoadClass(const char * /*classname*/, const char *libname,
2180 Bool_t check)
2181{
2182 TString lib(libname);
2183
2184 // Check if libname exists in path or not
2185 if (char *path = gSystem->DynamicPathName(lib, kTRUE)) {
2186 // If check == true, only check if it exists and if it's readable
2187 if (check) {
2188 delete [] path;
2189 return 0;
2190 }
2191
2192 // If check == false, try to load the library
2193 else {
2194 int err = gSystem->Load(path, 0, kTRUE);
2195 delete [] path;
2196
2197 // TSystem::Load returns 1 when the library was already loaded, return success in this case.
2198 if (err == 1)
2199 err = 0;
2200 return err;
2201 }
2202 } else {
2203 // This is the branch where libname didn't exist
2204 if (check) {
2205 FileStat_t stat;
2206 if (!gSystem->GetPathInfo(libname, stat) && (R_ISREG(stat.fMode) &&
2208 return 0;
2209 }
2210
2211 // Take care of user who didn't write the whole name
2212 if (!lib.BeginsWith("lib")) {
2213 lib = "lib" + lib;
2214 return LoadClass("", lib.Data(), check);
2215 }
2216 }
2217
2218 // Execution reaches here when library was prefixed with lib, check is false and couldn't find
2219 // the library name.
2220 return -1;
2221}
2222
2223////////////////////////////////////////////////////////////////////////////////
2224/// Return true if the file is local and is (likely) to be a ROOT file
2225
2226Bool_t TROOT::IsRootFile(const char *filename) const
2227{
2228 Bool_t result = kFALSE;
2229 FILE *mayberootfile = fopen(filename,"rb");
2230 if (mayberootfile) {
2231 char header[5];
2232 if (fgets(header,5,mayberootfile)) {
2233 result = strncmp(header,"root",4)==0;
2234 }
2235 fclose(mayberootfile);
2236 }
2237 return result;
2238}
2239
2240////////////////////////////////////////////////////////////////////////////////
2241/// To list all objects of the application.
2242/// Loop on all objects created in the ROOT linked lists.
2243/// Objects may be files and windows or any other object directly
2244/// attached to the ROOT linked list.
2245
2246void TROOT::ls(Option_t *option) const
2247{
2248// TObject::SetDirLevel();
2249// GetList()->R__FOR_EACH(TObject,ls)(option);
2250 TDirectory::ls(option);
2251}
2252
2253////////////////////////////////////////////////////////////////////////////////
2254/// Load a macro in the interpreter's memory. Equivalent to the command line
2255/// command ".L filename". If the filename has "+" or "++" appended
2256/// the macro will be compiled by ACLiC. The filename must have the format:
2257/// [path/]macro.C[+|++[g|O]].
2258/// The possible error codes are defined by TInterpreter::EErrorCode.
2259/// If check is true it will only check if filename exists and is
2260/// readable.
2261/// Returns 0 on successful loading and -1 in case filename does not
2262/// exist or in case of error.
2263
2264Int_t TROOT::LoadMacro(const char *filename, int *error, Bool_t check)
2265{
2266 Int_t err = -1;
2267 Int_t lerr, *terr;
2268 if (error)
2269 terr = error;
2270 else
2271 terr = &lerr;
2272
2273 if (fInterpreter) {
2274 TString aclicMode;
2275 TString arguments;
2276 TString io;
2277 TString fname = gSystem->SplitAclicMode(filename, aclicMode, arguments, io);
2278
2279 if (arguments.Length()) {
2280 Warning("LoadMacro", "argument(%s) ignored in %s", arguments.Data(), GetMacroPath());
2281 }
2282 char *mac = gSystem->Which(GetMacroPath(), fname, kReadPermission);
2283 if (!mac) {
2284 if (!check)
2285 Error("LoadMacro", "macro %s not found in path %s", fname.Data(), GetMacroPath());
2286 *terr = TInterpreter::kFatal;
2287 } else {
2288 err = 0;
2289 if (!check) {
2290 fname = mac;
2291 fname += aclicMode;
2292 fname += io;
2293 gInterpreter->LoadMacro(fname.Data(), (TInterpreter::EErrorCode*)terr);
2294 if (*terr)
2295 err = -1;
2296 }
2297 }
2298 delete [] mac;
2299 }
2300 return err;
2301}
2302
2303////////////////////////////////////////////////////////////////////////////////
2304/// Execute a macro in the interpreter. Equivalent to the command line
2305/// command ".x filename". If the filename has "+" or "++" appended
2306/// the macro will be compiled by ACLiC. The filename must have the format:
2307/// [path/]macro.C[+|++[g|O]][(args)].
2308/// The possible error codes are defined by TInterpreter::EErrorCode.
2309/// If padUpdate is true (default) update the current pad.
2310/// Returns the macro return value.
2311
2312Long_t TROOT::Macro(const char *filename, Int_t *error, Bool_t padUpdate)
2313{
2314 Long_t result = 0;
2315
2316 if (fInterpreter) {
2317 TString aclicMode;
2318 TString arguments;
2319 TString io;
2320 TString fname = gSystem->SplitAclicMode(filename, aclicMode, arguments, io);
2321
2322 char *mac = gSystem->Which(GetMacroPath(), fname, kReadPermission);
2323 if (!mac) {
2324 Error("Macro", "macro %s not found in path %s", fname.Data(), GetMacroPath());
2325 if (error)
2326 *error = TInterpreter::kFatal;
2327 } else {
2328 fname = mac;
2329 fname += aclicMode;
2330 fname += arguments;
2331 fname += io;
2332 result = gInterpreter->ExecuteMacro(fname, (TInterpreter::EErrorCode*)error);
2333 }
2334 delete [] mac;
2335
2336 if (padUpdate && gPad)
2337 gPad->Update();
2338 }
2339
2340 return result;
2341}
2342
2343////////////////////////////////////////////////////////////////////////////////
2344/// Process message id called by obj.
2345
2346void TROOT::Message(Int_t id, const TObject *obj)
2347{
2348 TIter next(fMessageHandlers);
2349 TMessageHandler *mh;
2350 while ((mh = (TMessageHandler*)next())) {
2351 mh->HandleMessage(id,obj);
2352 }
2353}
2354
2355////////////////////////////////////////////////////////////////////////////////
2356/// Process interpreter command via TApplication::ProcessLine().
2357/// On Win32 the line will be processed asynchronously by sending
2358/// it to the CINT interpreter thread. For explicit synchronous processing
2359/// use ProcessLineSync(). On non-Win32 platforms there is no difference
2360/// between ProcessLine() and ProcessLineSync().
2361/// The possible error codes are defined by TInterpreter::EErrorCode. In
2362/// particular, error will equal to TInterpreter::kProcessing until the
2363/// CINT interpreted thread has finished executing the line.
2364/// Returns the result of the command, cast to a Long_t.
2365
2367{
2368 TString sline = line;
2369 sline = sline.Strip(TString::kBoth);
2370
2371 if (!fApplication.load())
2373
2374 return (*fApplication).ProcessLine(sline, kFALSE, error);
2375}
2376
2377////////////////////////////////////////////////////////////////////////////////
2378/// Process interpreter command via TApplication::ProcessLine().
2379/// On Win32 the line will be processed synchronously (i.e. it will
2380/// only return when the CINT interpreter thread has finished executing
2381/// the line). On non-Win32 platforms there is no difference between
2382/// ProcessLine() and ProcessLineSync().
2383/// The possible error codes are defined by TInterpreter::EErrorCode.
2384/// Returns the result of the command, cast to a Long_t.
2385
2387{
2388 TString sline = line;
2389 sline = sline.Strip(TString::kBoth);
2390
2391 if (!fApplication.load())
2393
2394 return (*fApplication).ProcessLine(sline, kTRUE, error);
2395}
2396
2397////////////////////////////////////////////////////////////////////////////////
2398/// Process interpreter command directly via CINT interpreter.
2399/// Only executable statements are allowed (no variable declarations),
2400/// In all other cases use TROOT::ProcessLine().
2401/// The possible error codes are defined by TInterpreter::EErrorCode.
2402
2404{
2405 TString sline = line;
2406 sline = sline.Strip(TString::kBoth);
2407
2408 if (!fApplication.load())
2410
2411 Long_t result = 0;
2412
2413 if (fInterpreter) {
2415 result = gInterpreter->Calc(sline, code);
2416 }
2417
2418 return result;
2419}
2420
2421////////////////////////////////////////////////////////////////////////////////
2422/// Read Git commit information and branch name from the
2423/// etc/gitinfo.txt file.
2424
2426{
2427#ifdef ROOT_GIT_COMMIT
2428 fGitCommit = ROOT_GIT_COMMIT;
2429#endif
2430#ifdef ROOT_GIT_BRANCH
2431 fGitBranch = ROOT_GIT_BRANCH;
2432#endif
2433
2434 TString gitinfo = "gitinfo.txt";
2435 char *filename = gSystem->ConcatFileName(TROOT::GetEtcDir(), gitinfo);
2436
2437 FILE *fp = fopen(filename, "r");
2438 if (fp) {
2439 TString s;
2440 // read branch name
2441 s.Gets(fp);
2442 fGitBranch = s;
2443 // read commit SHA1
2444 s.Gets(fp);
2445 fGitCommit = s;
2446 // read date/time make was run
2447 s.Gets(fp);
2448 fGitDate = s;
2449 fclose(fp);
2450 }
2451 delete [] filename;
2452}
2453
2455 TTHREAD_TLS(Bool_t) fgReadingObject = false;
2456 return fgReadingObject;
2457}
2458
2459////////////////////////////////////////////////////////////////////////////////
2460/// Deprecated (will be removed in next release).
2461
2463{
2464 return GetReadingObject();
2465}
2466
2468{
2469 GetReadingObject() = flag;
2470}
2471
2472
2473////////////////////////////////////////////////////////////////////////////////
2474/// Return date/time make was run.
2475
2477{
2478 if (fGitDate == "") {
2479 Int_t iday,imonth,iyear, ihour, imin;
2480 static const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
2481 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
2482 Int_t idate = gROOT->GetBuiltDate();
2483 Int_t itime = gROOT->GetBuiltTime();
2484 iday = idate%100;
2485 imonth = (idate/100)%100;
2486 iyear = idate/10000;
2487 ihour = itime/100;
2488 imin = itime%100;
2489 fGitDate.Form("%s %02d %4d, %02d:%02d:00", months[imonth-1], iday, iyear, ihour, imin);
2490 }
2491 return fGitDate;
2492}
2493
2494////////////////////////////////////////////////////////////////////////////////
2495/// Recursively remove this object from the list of Cleanups.
2496/// Typically RecursiveRemove is implemented by classes that can contain
2497/// mulitple references to a same object or shared ownership of the object
2498/// with others.
2499
2501{
2503
2505}
2506
2507////////////////////////////////////////////////////////////////////////////////
2508/// Refresh all browsers. Call this method when some command line
2509/// command or script has changed the browser contents. Not needed
2510/// for objects that have the kMustCleanup bit set. Most useful to
2511/// update browsers that show the file system or other objects external
2512/// to the running ROOT session.
2513
2515{
2516 TIter next(GetListOfBrowsers());
2517 TBrowser *b;
2518 while ((b = (TBrowser*) next()))
2519 b->SetRefreshFlag(kTRUE);
2520}
2521////////////////////////////////////////////////////////////////////////////////
2522/// Insure that the files, canvases and sockets are closed.
2523
2524static void CallCloseFiles()
2525{
2527 gROOT->CloseFiles();
2528 }
2529}
2530
2531////////////////////////////////////////////////////////////////////////////////
2532/// Called by static dictionary initialization to register clang modules
2533/// for headers. Calls TCling::RegisterModule() unless gCling
2534/// is NULL, i.e. during startup, where the information is buffered in
2535/// the static GetModuleHeaderInfoBuffer().
2536
2537void TROOT::RegisterModule(const char* modulename,
2538 const char** headers,
2539 const char** includePaths,
2540 const char* payloadCode,
2541 const char* fwdDeclCode,
2542 void (*triggerFunc)(),
2543 const TInterpreter::FwdDeclArgsToKeepCollection_t& fwdDeclsArgToSkip,
2544 const char** classesHeaders,
2545 bool hasCxxModule)
2546{
2547
2548 // First a side track to insure proper end of process behavior.
2549
2550 // Register for each loaded dictionary (and thus for each library),
2551 // that we need to Close the ROOT files as soon as this library
2552 // might start being unloaded after main.
2553 //
2554 // By calling atexit here (rather than directly from within the
2555 // library) we make sure that this is not called if the library is
2556 // 'only' dlclosed.
2557
2558 // On Ubuntu the linker strips the unused libraries. Eventhough
2559 // stressHistogram is explicitly linked against libNet, it is not
2560 // retained and thus is loaded only as needed in the middle part of
2561 // the execution. Concretely this also means that it is loaded
2562 // *after* the construction of the TApplication object and thus
2563 // after the registration (atexit) of the EndOfProcessCleanups
2564 // routine. Consequently, after the end of main, libNet is
2565 // unloaded before EndOfProcessCleanups is called. When
2566 // EndOfProcessCleanups is executed it indirectly needs the TClass
2567 // for TSocket and its search will use resources that have already
2568 // been unloaded (technically the function static in TUnixSystem's
2569 // DynamicPath and the dictionary from libNet).
2570
2571 // Similarly, the ordering (before this commit) was broken in the
2572 // following case:
2573
2574 // TApplication creation (EndOfProcessCleanups registration)
2575 // load UserLibrary
2576 // create TFile
2577 // Append UserObject to TFile
2578
2579 // and after the end of main the order of execution was
2580
2581 // unload UserLibrary
2582 // call EndOfProcessCleanups
2583 // Write the TFile
2584 // attempt to write the user object.
2585 // ....
2586
2587 // where what we need is to have the files closen/written before
2588 // the unloading of the library.
2589
2590 // To solve the problem we now register an atexit function for
2591 // every dictionary thus making sure there is at least one executed
2592 // before the first library tear down after main.
2593
2594 // If atexit is called directly within a library's code, the
2595 // function will called *either* when the library is 'dlclose'd or
2596 // after then end of main (whichever comes first). We do *not*
2597 // want the files to be closed whenever a library is unloaded via
2598 // dlclose. To avoid this, we add the function (CallCloseFiles)
2599 // from the dictionary indirectly (via ROOT::RegisterModule). In
2600 // this case the function will only only be called either when
2601 // libCore is 'dlclose'd or right after the end of main.
2602
2603 atexit(CallCloseFiles);
2604
2605 // Now register with TCling.
2606 if (gCling) {
2607 gCling->RegisterModule(modulename, headers, includePaths, payloadCode, fwdDeclCode, triggerFunc,
2608 fwdDeclsArgToSkip, classesHeaders, false, hasCxxModule);
2609 } else {
2610 GetModuleHeaderInfoBuffer().push_back(ModuleHeaderInfo_t(modulename, headers, includePaths, payloadCode,
2611 fwdDeclCode, triggerFunc, fwdDeclsArgToSkip,
2612 classesHeaders, hasCxxModule));
2613 }
2614}
2615
2616////////////////////////////////////////////////////////////////////////////////
2617/// Remove an object from the in-memory list.
2618/// Since TROOT is global resource, this is lock protected.
2619
2621{
2623 return TDirectory::Remove(obj);
2624}
2625
2626////////////////////////////////////////////////////////////////////////////////
2627/// Remove a class from the list and map of classes.
2628/// This routine is deprecated, use TClass::RemoveClass directly.
2629
2631{
2632 TClass::RemoveClass(oldcl);
2633}
2634
2635////////////////////////////////////////////////////////////////////////////////
2636/// Delete all global interpreter objects created since the last call to Reset
2637///
2638/// If option="a" is set reset to startup context (i.e. unload also
2639/// all loaded files, classes, structs, typedefs, etc.).
2640///
2641/// This function is typically used at the beginning (or end) of an unnamed macro
2642/// to clean the environment.
2643///
2644/// IMPORTANT WARNING:
2645/// Do not use this call from within any function (neither compiled nor
2646/// interpreted. This should only be used from a unnamed macro
2647/// (which starts with a { (curly braces) ). For example, using TROOT::Reset
2648/// from within an interpreted function will lead to the unloading of the
2649/// dictionary and source file, including the one defining the function being
2650/// executed.
2651///
2652
2654{
2655 if (IsExecutingMacro()) return; //True when TMacro::Exec runs
2656 if (fInterpreter) {
2657 if (!strncmp(option, "a", 1)) {
2660 } else
2661 gInterpreter->ResetGlobals();
2662
2663 if (fGlobals) fGlobals->Unload();
2665
2666 SaveContext();
2667 }
2668}
2669
2670////////////////////////////////////////////////////////////////////////////////
2671/// Save the current interpreter context.
2672
2674{
2675 if (fInterpreter)
2676 gInterpreter->SaveGlobalsContext();
2677}
2678
2679////////////////////////////////////////////////////////////////////////////////
2680/// Set the default graphical cut class name for the graphics editor
2681/// By default the graphics editor creates an instance of a class TCutG.
2682/// This function may be called to specify a different class that MUST
2683/// derive from TCutG
2684
2686{
2687 if (!name) {
2688 Error("SetCutClassName","Invalid class name");
2689 return;
2690 }
2692 if (!cl) {
2693 Error("SetCutClassName","Unknown class:%s",name);
2694 return;
2695 }
2696 if (!cl->InheritsFrom("TCutG")) {
2697 Error("SetCutClassName","Class:%s does not derive from TCutG",name);
2698 return;
2699 }
2701}
2702
2703////////////////////////////////////////////////////////////////////////////////
2704/// Set editor mode
2705
2706void TROOT::SetEditorMode(const char *mode)
2707{
2708 fEditorMode = 0;
2709 if (!mode[0]) return;
2710 if (!strcmp(mode,"Arc")) {fEditorMode = kArc; return;}
2711 if (!strcmp(mode,"Line")) {fEditorMode = kLine; return;}
2712 if (!strcmp(mode,"Arrow")) {fEditorMode = kArrow; return;}
2713 if (!strcmp(mode,"Button")) {fEditorMode = kButton; return;}
2714 if (!strcmp(mode,"Diamond")) {fEditorMode = kDiamond; return;}
2715 if (!strcmp(mode,"Ellipse")) {fEditorMode = kEllipse; return;}
2716 if (!strcmp(mode,"Pad")) {fEditorMode = kPad; return;}
2717 if (!strcmp(mode,"Pave")) {fEditorMode = kPave; return;}
2718 if (!strcmp(mode,"PaveLabel")){fEditorMode = kPaveLabel; return;}
2719 if (!strcmp(mode,"PaveText")) {fEditorMode = kPaveText; return;}
2720 if (!strcmp(mode,"PavesText")){fEditorMode = kPavesText; return;}
2721 if (!strcmp(mode,"PolyLine")) {fEditorMode = kPolyLine; return;}
2722 if (!strcmp(mode,"CurlyLine")){fEditorMode = kCurlyLine; return;}
2723 if (!strcmp(mode,"CurlyArc")) {fEditorMode = kCurlyArc; return;}
2724 if (!strcmp(mode,"Text")) {fEditorMode = kText; return;}
2725 if (!strcmp(mode,"Marker")) {fEditorMode = kMarker; return;}
2726 if (!strcmp(mode,"CutG")) {fEditorMode = kCutG; return;}
2727}
2728
2729////////////////////////////////////////////////////////////////////////////////
2730/// Change current style to style with name stylename
2731
2732void TROOT::SetStyle(const char *stylename)
2733{
2734 TString style_name = stylename;
2735
2736 TStyle *style = GetStyle(style_name);
2737 if (style) style->cd();
2738 else Error("SetStyle","Unknown style:%s",style_name.Data());
2739}
2740
2741
2742//-------- Static Member Functions ---------------------------------------------
2743
2744
2745////////////////////////////////////////////////////////////////////////////////
2746/// Decrease the indentation level for ls().
2747
2749{
2750 return --fgDirLevel;
2751}
2752
2753////////////////////////////////////////////////////////////////////////////////
2754///return directory level
2755
2757{
2758 return fgDirLevel;
2759}
2760
2761////////////////////////////////////////////////////////////////////////////////
2762/// Get macro search path. Static utility function.
2763
2765{
2766 TString &macroPath = ROOT::GetMacroPath();
2767
2768 if (macroPath.Length() == 0) {
2769 macroPath = gEnv->GetValue("Root.MacroPath", (char*)0);
2770#if defined(R__WIN32)
2771 macroPath.ReplaceAll("; ", ";");
2772#else
2773 macroPath.ReplaceAll(": ", ":");
2774#endif
2775 if (macroPath.Length() == 0)
2776#if !defined(R__WIN32)
2777 macroPath = ".:" + TROOT::GetMacroDir();
2778#else
2779 macroPath = ".;" + TROOT::GetMacroDir();
2780#endif
2781 }
2782
2783 return macroPath;
2784}
2785
2786////////////////////////////////////////////////////////////////////////////////
2787/// Set or extend the macro search path. Static utility function.
2788/// If newpath=0 or "" reset to value specified in the rootrc file.
2789
2790void TROOT::SetMacroPath(const char *newpath)
2791{
2792 TString &macroPath = ROOT::GetMacroPath();
2793
2794 if (!newpath || !*newpath)
2795 macroPath = "";
2796 else
2797 macroPath = newpath;
2798}
2799
2800////////////////////////////////////////////////////////////////////////////////
2801/// The input parameter `webdisplay` defines where web graphics should be rendered.
2802///
2803/// if `webdisplay` may contains:
2804///
2805/// - "off": turns off the web display and come back to normal graphics in
2806/// interactive mode.
2807/// - "batch": turns the web display in batch mode. It can be prepend with an
2808/// other string which will be considered as the new current web display
2809/// - "nobatch": turns the web display in interactive mode. It can be prepend with an
2810/// other string which will be considered as the new current web display
2811///
2812/// If the option "off" is not set, this method turns the normal graphics to
2813/// "Batch" to avoid the loading of local graphics libraries.
2814
2815void TROOT::SetWebDisplay(const char *webdisplay)
2816{
2817 const char *wd = webdisplay;
2818 if (!wd)
2819 wd = "";
2820
2821 if (!strcmp(wd, "off")) {
2824 fWebDisplay = "";
2825 } else {
2827 if (!strncmp(wd, "batch", 5)) {
2829 wd += 5;
2830 } else if (!strncmp(wd, "nobatch", 7)) {
2832 wd += 7;
2833 } else {
2835 }
2836 fWebDisplay = wd;
2837 }
2838}
2839
2840////////////////////////////////////////////////////////////////////////////////
2841/// Increase the indentation level for ls().
2842
2844{
2845 return ++fgDirLevel;
2846}
2847
2848////////////////////////////////////////////////////////////////////////////////
2849/// Functions used by ls() to indent an object hierarchy.
2850
2852{
2853 for (int i = 0; i < fgDirLevel; i++) std::cout.put(' ');
2854}
2855
2856////////////////////////////////////////////////////////////////////////////////
2857/// Return kTRUE if the TROOT object has been initialized.
2858
2860{
2861 return fgRootInit;
2862}
2863
2864////////////////////////////////////////////////////////////////////////////////
2865/// Return kTRUE if the memory leak checker is on.
2866
2868{
2869 return fgMemCheck;
2870}
2871
2872////////////////////////////////////////////////////////////////////////////////
2873/// Return Indentation level for ls().
2874
2876{
2877 fgDirLevel = level;
2878}
2879
2880////////////////////////////////////////////////////////////////////////////////
2881/// Convert version code to an integer, i.e. 331527 -> 51507.
2882
2884{
2885 return 10000*(code>>16) + 100*((code&65280)>>8) + (code&255);
2886}
2887
2888////////////////////////////////////////////////////////////////////////////////
2889/// Convert version as an integer to version code as used in RVersion.h.
2890
2892{
2893 int a = v/10000;
2894 int b = (v - a*10000)/100;
2895 int c = v - a*10000 - b*100;
2896 return (a << 16) + (b << 8) + c;
2897}
2898
2899////////////////////////////////////////////////////////////////////////////////
2900/// Return ROOT version code as defined in RVersion.h.
2901
2903{
2904 return ROOT_VERSION_CODE;
2905}
2906
2907////////////////////////////////////////////////////////////////////////////////
2908
2910 static const char** extraInterpArgs = 0;
2911 return extraInterpArgs;
2912}
2913
2914////////////////////////////////////////////////////////////////////////////////
2915
2916#ifdef ROOTPREFIX
2917static Bool_t IgnorePrefix() {
2918 static Bool_t ignorePrefix = gSystem->Getenv("ROOTIGNOREPREFIX");
2919 return ignorePrefix;
2920}
2921#endif
2922
2923////////////////////////////////////////////////////////////////////////////////
2924/// Get the rootsys directory in the installation. Static utility function.
2925
2926const TString& TROOT::GetRootSys() {
2927#ifdef ROOTPREFIX
2928 if (IgnorePrefix()) {
2929#endif
2930 static TString rootsys;
2931 if (rootsys.IsNull())
2932 rootsys = gSystem->UnixPathName(gSystem->Getenv("ROOTSYS"));
2933 if (rootsys.IsNull())
2934 rootsys = gRootDir;
2935 return rootsys;
2936#ifdef ROOTPREFIX
2937 } else {
2938 const static TString rootsys = ROOTPREFIX;
2939 return rootsys;
2940 }
2941#endif
2942}
2943
2944////////////////////////////////////////////////////////////////////////////////
2945/// Get the binary directory in the installation. Static utility function.
2946
2947const TString& TROOT::GetBinDir() {
2948#ifdef ROOTBINDIR
2949 if (IgnorePrefix()) {
2950#endif
2951 static TString rootbindir;
2952 if (rootbindir.IsNull()) {
2953 rootbindir = "bin";
2954 gSystem->PrependPathName(GetRootSys(), rootbindir);
2955 }
2956 return rootbindir;
2957#ifdef ROOTBINDIR
2958 } else {
2959 const static TString rootbindir = ROOTBINDIR;
2960 return rootbindir;
2961 }
2962#endif
2963}
2964
2965////////////////////////////////////////////////////////////////////////////////
2966/// Get the library directory in the installation. Static utility function.
2967
2968const TString& TROOT::GetLibDir() {
2969#ifdef ROOTLIBDIR
2970 if (IgnorePrefix()) {
2971#endif
2972 static TString rootlibdir;
2973 if (rootlibdir.IsNull()) {
2974 rootlibdir = "lib";
2975 gSystem->PrependPathName(GetRootSys(), rootlibdir);
2976 }
2977 return rootlibdir;
2978#ifdef ROOTLIBDIR
2979 } else {
2980 const static TString rootlibdir = ROOTLIBDIR;
2981 return rootlibdir;
2982 }
2983#endif
2984}
2985
2986////////////////////////////////////////////////////////////////////////////////
2987/// Get the include directory in the installation. Static utility function.
2988
2989const TString& TROOT::GetIncludeDir() {
2990#ifdef ROOTINCDIR
2991 if (IgnorePrefix()) {
2992#endif
2993 static TString rootincdir;
2994 if (rootincdir.IsNull()) {
2995 rootincdir = "include";
2996 gSystem->PrependPathName(GetRootSys(), rootincdir);
2997 }
2998 return rootincdir;
2999#ifdef ROOTINCDIR
3000 } else {
3001 const static TString rootincdir = ROOTINCDIR;
3002 return rootincdir;
3003 }
3004#endif
3005}
3006
3007////////////////////////////////////////////////////////////////////////////////
3008/// Get the sysconfig directory in the installation. Static utility function.
3009
3010const TString& TROOT::GetEtcDir() {
3011#ifdef ROOTETCDIR
3012 if (IgnorePrefix()) {
3013#endif
3014 static TString rootetcdir;
3015 if (rootetcdir.IsNull()) {
3016 rootetcdir = "etc";
3017 gSystem->PrependPathName(GetRootSys(), rootetcdir);
3018 }
3019 return rootetcdir;
3020#ifdef ROOTETCDIR
3021 } else {
3022 const static TString rootetcdir = ROOTETCDIR;
3023 return rootetcdir;
3024 }
3025#endif
3026}
3027
3028////////////////////////////////////////////////////////////////////////////////
3029/// Get the data directory in the installation. Static utility function.
3030
3031const TString& TROOT::GetDataDir() {
3032#ifdef ROOTDATADIR
3033 if (IgnorePrefix()) {
3034#endif
3035 return GetRootSys();
3036#ifdef ROOTDATADIR
3037 } else {
3038 const static TString rootdatadir = ROOTDATADIR;
3039 return rootdatadir;
3040 }
3041#endif
3042}
3043
3044////////////////////////////////////////////////////////////////////////////////
3045/// Get the documentation directory in the installation. Static utility function.
3046
3047const TString& TROOT::GetDocDir() {
3048#ifdef ROOTDOCDIR
3049 if (IgnorePrefix()) {
3050#endif
3051 return GetRootSys();
3052#ifdef ROOTDOCDIR
3053 } else {
3054 const static TString rootdocdir = ROOTDOCDIR;
3055 return rootdocdir;
3056 }
3057#endif
3058}
3059
3060////////////////////////////////////////////////////////////////////////////////
3061/// Get the macro directory in the installation. Static utility function.
3062
3063const TString& TROOT::GetMacroDir() {
3064#ifdef ROOTMACRODIR
3065 if (IgnorePrefix()) {
3066#endif
3067 static TString rootmacrodir;
3068 if (rootmacrodir.IsNull()) {
3069 rootmacrodir = "macros";
3070 gSystem->PrependPathName(GetRootSys(), rootmacrodir);
3071 }
3072 return rootmacrodir;
3073#ifdef ROOTMACRODIR
3074 } else {
3075 const static TString rootmacrodir = ROOTMACRODIR;
3076 return rootmacrodir;
3077 }
3078#endif
3079}
3080
3081////////////////////////////////////////////////////////////////////////////////
3082/// Get the tutorials directory in the installation. Static utility function.
3083
3084const TString& TROOT::GetTutorialDir() {
3085#ifdef ROOTTUTDIR
3086 if (IgnorePrefix()) {
3087#endif
3088 static TString roottutdir;
3089 if (roottutdir.IsNull()) {
3090 roottutdir = "tutorials";
3091 gSystem->PrependPathName(GetRootSys(), roottutdir);
3092 }
3093 return roottutdir;
3094#ifdef ROOTTUTDIR
3095 } else {
3096 const static TString roottutdir = ROOTTUTDIR;
3097 return roottutdir;
3098 }
3099#endif
3100}
3101
3102////////////////////////////////////////////////////////////////////////////////
3103/// Get the source directory in the installation. Static utility function.
3104
3105const TString& TROOT::GetSourceDir() {
3106#ifdef ROOTSRCDIR
3107 if (IgnorePrefix()) {
3108#endif
3109 static TString rootsrcdir;
3110 if (rootsrcdir.IsNull()) {
3111 rootsrcdir = "src";
3112 gSystem->PrependPathName(GetRootSys(), rootsrcdir);
3113 }
3114 return rootsrcdir;
3115#ifdef ROOTSRCDIR
3116 } else {
3117 const static TString rootsrcdir = ROOTSRCDIR;
3118 return rootsrcdir;
3119 }
3120#endif
3121}
3122
3123////////////////////////////////////////////////////////////////////////////////
3124/// Get the icon path in the installation. Static utility function.
3125
3126const TString& TROOT::GetIconPath() {
3127#ifdef ROOTICONPATH
3128 if (IgnorePrefix()) {
3129#endif
3130 static TString rooticonpath;
3131 if (rooticonpath.IsNull()) {
3132 rooticonpath = "icons";
3133 gSystem->PrependPathName(GetRootSys(), rooticonpath);
3134 }
3135 return rooticonpath;
3136#ifdef ROOTICONPATH
3137 } else {
3138 const static TString rooticonpath = ROOTICONPATH;
3139 return rooticonpath;
3140 }
3141#endif
3142}
3143
3144////////////////////////////////////////////////////////////////////////////////
3145/// Get the fonts directory in the installation. Static utility function.
3146
3147const TString& TROOT::GetTTFFontDir() {
3148#ifdef TTFFONTDIR
3149 if (IgnorePrefix()) {
3150#endif
3151 static TString ttffontdir;
3152 if (ttffontdir.IsNull()) {
3153 ttffontdir = "fonts";
3154 gSystem->PrependPathName(GetRootSys(), ttffontdir);
3155 }
3156 return ttffontdir;
3157#ifdef TTFFONTDIR
3158 } else {
3159 const static TString ttffontdir = TTFFONTDIR;
3160 return ttffontdir;
3161 }
3162#endif
3163}
3164
3165////////////////////////////////////////////////////////////////////////////////
3166/// Get the tutorials directory in the installation. Static utility function.
3167/// Backward compatibility function - do not use for new code
3168
3170 return GetTutorialDir();
3171}
@ kMarker
Definition: Buttons.h:34
@ kCurlyArc
Definition: Buttons.h:38
@ kPad
Definition: Buttons.h:30
@ kPolyLine
Definition: Buttons.h:28
@ kDiamond
Definition: Buttons.h:37
@ kPave
Definition: Buttons.h:31
@ kArrow
Definition: Buttons.h:33
@ kPaveText
Definition: Buttons.h:32
@ kCutG
Definition: Buttons.h:38
@ kLine
Definition: Buttons.h:33
@ kPavesText
Definition: Buttons.h:32
@ kCurlyLine
Definition: Buttons.h:38
@ kPaveLabel
Definition: Buttons.h:31
@ kButton
Definition: Buttons.h:37
@ kEllipse
Definition: Buttons.h:32
@ kText
Definition: Buttons.h:30
@ kArc
Definition: Buttons.h:33
SVector< double, 2 > v
Definition: Dict.h:5
#define SafeDelete(p)
Definition: RConfig.hxx:529
#define d(i)
Definition: RSha256.hxx:102
#define b(i)
Definition: RSha256.hxx:100
#define f(i)
Definition: RSha256.hxx:104
#define c(i)
Definition: RSha256.hxx:101
#define g(i)
Definition: RSha256.hxx:105
#define ROOT_RELEASE
Definition: RVersion.h:17
#define ROOT_RELEASE_TIME
Definition: RVersion.h:19
#define ROOT_VERSION_CODE
Definition: RVersion.h:21
#define ROOT_RELEASE_DATE
Definition: RVersion.h:18
static RooMathCoreReg dummy
const Ssiz_t kNPOS
Definition: RtypesCore.h:111
int Int_t
Definition: RtypesCore.h:41
unsigned int UInt_t
Definition: RtypesCore.h:42
const Bool_t kFALSE
Definition: RtypesCore.h:88
long Long_t
Definition: RtypesCore.h:50
bool Bool_t
Definition: RtypesCore.h:59
const Bool_t kTRUE
Definition: RtypesCore.h:87
const char Option_t
Definition: RtypesCore.h:62
#define ClassImp(name)
Definition: Rtypes.h:363
void(* VoidFuncPtr_t)()
Definition: Rtypes.h:76
R__EXTERN TClassTable * gClassTable
Definition: TClassTable.h:95
#define gDirectory
Definition: TDirectory.h:213
R__EXTERN TEnv * gEnv
Definition: TEnv.h:171
void Error(const char *location, const char *msgfmt,...)
void Warning(const char *location, const char *msgfmt,...)
R__EXTERN TGuiFactory * gBatchGuiFactory
Definition: TGuiFactory.h:67
R__EXTERN TGuiFactory * gGuiFactory
Definition: TGuiFactory.h:66
R__EXTERN TVirtualMutex * gInterpreterMutex
Definition: TInterpreter.h:40
TInterpreter * CreateInterpreter_t(void *shlibHandle, const char *argv[])
Definition: TInterpreter.h:534
R__EXTERN TInterpreter * gCling
Definition: TInterpreter.h:540
#define gInterpreter
Definition: TInterpreter.h:538
void * DestroyInterpreter_t(TInterpreter *)
Definition: TInterpreter.h:535
R__EXTERN TPluginManager * gPluginMgr
Bool_t & GetReadingObject()
Definition: TROOT.cxx:2454
static Int_t IVERSQ()
Return version id as an integer, i.e. "2.22/04" -> 22204.
Definition: TROOT.cxx:188
static Int_t IDATQQ(const char *date)
Return built date as integer, i.e. "Apr 28 2000" -> 20000428.
Definition: TROOT.cxx:198
static TClass * R__GetClassIfKnown(const char *className)
Check whether className is a known class, and only autoload if we can.
Definition: TROOT.cxx:1873
static DestroyInterpreter_t * gDestroyInterpreter
Definition: TROOT.cxx:174
Int_t gDebug
Definition: TROOT.cxx:635
static void * gInterpreterLib
Definition: TROOT.cxx:175
static Int_t ITIMQQ(const char *time)
Return built time as integer (with min precision), i.e.
Definition: TROOT.cxx:219
static void at_exit_of_TROOT()
Definition: TROOT.cxx:294
TVirtualMutex * gROOTMutex
Definition: TROOT.cxx:178
static void CleanUpROOTAtExit()
Clean up at program termination before global objects go out of scope.
Definition: TROOT.cxx:229
static void CallCloseFiles()
Insure that the files, canvases and sockets are closed.
Definition: TROOT.cxx:2524
void R__SetZipMode(int)
#define gROOT
Definition: TROOT.h:410
R__EXTERN TStyle * gStyle
Definition: TStyle.h:406
typedef void((*Func_t)())
R__EXTERN const char * gRootDir
Definition: TSystem.h:223
@ kReadPermission
Definition: TSystem.h:48
Bool_t R_ISREG(Int_t mode)
Definition: TSystem.h:119
R__EXTERN TSystem * gSystem
Definition: TSystem.h:540
R__EXTERN TVirtualMutex * gGlobalMutex
Definition: TVirtualMutex.h:29
#define R__LOCKGUARD(mutex)
#define gPad
Definition: TVirtualPad.h:286
#define R__READ_LOCKGUARD(mutex)
#define gVirtualX
Definition: TVirtualX.h:345
R__EXTERN TVirtualX * gGXBatch
Definition: TVirtualX.h:348
const char * proto
Definition: civetweb.c:16604
static void CreateApplication()
Using a TBrowser one can browse all ROOT objects.
Definition: TBrowser.h:37
The Canvas class.
Definition: TCanvas.h:31
TVirtualPad * cd(Int_t subpadnumber=0)
Set current canvas & pad.
Definition: TCanvas.cxx:693
Objects following this interface can be passed onto the TROOT object to implement a user customized w...
This class registers for all classes their name, id and dictionary function in a hash table.
Definition: TClassTable.h:36
The ROOT global object gROOT contains a list of all defined classes.
Definition: TClass.h:75
static void AddClass(TClass *cl)
static: Add a class to the list and map of classes.
Definition: TClass.cxx:444
static TClass * LoadClass(const char *requestedname, Bool_t silent)
Helper function used by TClass::GetClass().
Definition: TClass.cxx:5511
Short_t GetDeclFileLine() const
Definition: TClass.h:400
static void RemoveClass(TClass *cl)
static: Remove a class from the list and map of classes
Definition: TClass.cxx:470
ClassInfo_t * GetClassInfo() const
Definition: TClass.h:404
static Int_t ReadRules()
Read the class.rules files from the default location:.
Definition: TClass.cxx:1729
Bool_t InheritsFrom(const char *cl) const
Return kTRUE if this class inherits from a class with name "classname".
Definition: TClass.cxx:4720
const char * GetDeclFileName() const
Definition: TClass.h:399
@ kClassSaved
Definition: TClass.h:88
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.
Definition: TClass.cxx:2885
Collection abstract base class.
Definition: TCollection.h:63
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
virtual bool UseRWLock()
Set this collection to use a RW lock upon access, making it thread safe.
virtual void Clear(Option_t *option="")=0
virtual void AddAll(const TCollection *col)
Add all objects from collection col to this collection.
virtual void RecursiveRemove(TObject *obj)
Remove object from this collection and recursively remove the object from all other objects (and coll...
virtual void Delete(Option_t *option="")=0
Delete this object.
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
virtual void Add(TObject *obj)=0
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
Definition: TCollection.h:182
The color creation and management class.
Definition: TColor.h:19
static void InitializeColors()
Initialize colors used by the TCanvas based graphics (via TColor objects).
Definition: TColor.cxx:1077
Int_t GetNumber() const
Definition: TColor.h:54
Basic data type descriptor (datatype information is obtained from CINT).
Definition: TDataType.h:44
Describe directory structure in memory.
Definition: TDirectory.h:34
virtual void Close(Option_t *option="")
Delete all objects from memory and directory structure itself.
Definition: TDirectory.cxx:584
virtual TList * GetList() const
Definition: TDirectory.h:149
virtual void ls(Option_t *option="") const
List Directory contents.
static TDirectory *& CurrentDirectory()
Return the current directory for the current thread.
Definition: TDirectory.cxx:380
virtual void Append(TObject *obj, Bool_t replace=kFALSE)
Append object to this directory.
Definition: TDirectory.cxx:190
virtual void SetName(const char *newname)
Set the name for directory If the directory name is changed after the directory was written once,...
virtual void Build(TFile *motherFile=0, TDirectory *motherDir=0)
Initialise directory to defaults.
Definition: TDirectory.cxx:237
virtual TObject * Remove(TObject *)
Remove an object from the in-memory list.
TList * fList
Definition: TDirectory.h:87
The TEnv class reads config files, by default named .rootrc.
Definition: TEnv.h:125
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Definition: TEnv.cxx:491
A TFolder object is a collection of objects and folders.
Definition: TFolder.h:30
TFolder * AddFolder(const char *name, const char *title, TCollection *collection=0)
Create a new folder and add it to the list of folders of this folder, return a pointer to the created...
Definition: TFolder.cxx:186
virtual TObject * FindObjectAny(const char *name) const
Return a pointer to the first object with name starting at this folder.
Definition: TFolder.cxx:352
Dictionary for function template This class describes one single function template.
Global functions class (global functions are obtained from CINT).
Definition: TFunction.h:28
static void MakeFunctor(const char *name, const char *type, GlobFunc &func)
Definition: TGlobal.h:73
static TList & GetEarlyRegisteredGlobals()
Returns list collected globals Used to storeTGlobalMappedFunctions from other libs,...
Definition: TGlobal.cxx:185
Global variables class (global variables are obtained from CINT).
Definition: TGlobal.h:28
This ABC is a factory for GUI components.
Definition: TGuiFactory.h:42
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
Definition: THashList.h:34
THashTable implements a hash table to store TObject's.
Definition: THashTable.h:35
virtual void RegisterModule(const char *, const char **, const char **, const char *, const char *, void(*)(), const FwdDeclArgsToKeepCollection_t &fwdDeclArgsToKeep, const char **classesHeaders, Bool_t lateRegistration=false, Bool_t hasCxxModule=false)=0
virtual void Reset()=0
virtual void Initialize()=0
std::vector< std::pair< std::string, int > > FwdDeclArgsToKeepCollection_t
Definition: TInterpreter.h:121
virtual void SaveContext()=0
virtual void EnableAutoLoading()=0
TDictionary::DeclId_t DeclId_t
Definition: TInterpreter.h:268
Option_t * GetOption() const
Definition: TCollection.h:251
A collection of TDataMember objects designed for fast access given a DeclId_t and for keep track of T...
virtual void Delete(Option_t *option="")
Delete all TDataMember object files.
void Unload()
Mark 'all func' as being unloaded.
TDictionary * Get(DeclId_t id)
Return (after creating it if necessary) the TDataMember describing the data member corresponding to t...
void Load()
Load all the DataMembers known to the interpreter for the scope 'fClass' into this collection.
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
virtual TObject * FindObject(const char *name) const
Specialize FindObject to do search for the a function just by name or create it if its not already in...
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
TFunction * Get(DeclId_t id)
Return (after creating it if necessary) the TMethod or TFunction describing the function correspondin...
void Load()
Load all the functions known to the interpreter for the scope 'fClass' into this collection.
void Unload()
Mark 'all func' as being unloaded.
virtual void Delete(Option_t *option="")
Delete all TFunction object files.
A collection of TDataType designed to hold the typedef information and numerical type information.
Definition: TListOfTypes.h:31
A doubly linked list.
Definition: TList.h:44
virtual void Add(TObject *obj)
Definition: TList.h:87
virtual TObjLink * FirstLink() const
Definition: TList.h:108
virtual void Delete(Option_t *option="")
Remove all objects from the list AND delete all heap based objects.
Definition: TList.cxx:467
virtual void AddLast(TObject *obj)
Add object at the end of the list.
Definition: TList.cxx:149
virtual void Clear(Option_t *option="")
Remove all objects from the list.
Definition: TList.cxx:399
Handle messages that might be generated by the system.
virtual void HandleMessage(Int_t id, const TObject *obj)
Store message origin, keep statistics and call Notify().
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition: TNamed.cxx:164
virtual void SetName(const char *name)
Set the name of the TNamed.
Definition: TNamed.cxx:140
An array of TObjects.
Definition: TObjArray.h:37
TObject * At(Int_t idx) const
Definition: TObjArray.h:165
Mother of all ROOT objects.
Definition: TObject.h:37
static void SetObjectStat(Bool_t stat)
Turn on/off tracking of objects in the TObjectTable.
Definition: TObject.cxx:961
@ kNotDeleted
object has not been deleted
Definition: TObject.h:78
virtual const char * GetName() const
Returns name of object.
Definition: TObject.cxx:357
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition: TObject.h:172
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Definition: TObject.cxx:128
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition: TObject.cxx:866
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
Definition: TObject.cxx:321
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition: TObject.cxx:694
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition: TObject.cxx:443
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition: TObject.cxx:880
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
Definition: TObject.cxx:908
@ kInvalidObject
if object ctor succeeded but object should not be used
Definition: TObject.h:68
@ kMustCleanup
if object destructor must call RecursiveRemove()
Definition: TObject.h:60
This class implements a plugin library manager.
void LoadHandlersFromEnv(TEnv *env)
Load plugin handlers specified in config file, like:
static void Cleanup()
static function (called by TROOT destructor) to delete all TProcessIDs
Definition: TProcessID.cxx:202
static TProcessID * AddProcessID()
Static function to add a new TProcessID to the list of PIDs.
Definition: TProcessID.cxx:114
This class is a specialized TProcessID managing the list of UUIDs.
Definition: TProcessUUID.h:32
static Bool_t BlockAllSignals(Bool_t b)
Block or unblock all signals. Returns the previous block status.
Definition: TQObject.cxx:1055
ROOT top level object description.
Definition: TROOT.h:100
static Int_t IncreaseDirLevel()
Increase the indentation level for ls().
Definition: TROOT.cxx:2843
Int_t IgnoreInclude(const char *fname, const char *expandedfname)
Return 1 if the name of the given include file corresponds to a class that is known to ROOT,...
Definition: TROOT.cxx:1894
Int_t fVersionCode
Definition: TROOT.h:122
void Message(Int_t id, const TObject *obj)
Process message id called by obj.
Definition: TROOT.cxx:2346
void RemoveClass(TClass *)
Remove a class from the list and map of classes.
Definition: TROOT.cxx:2630
TSeqCollection * fProofs
Definition: TROOT.h:170
TCollection * fClassGenerators
Definition: TROOT.h:168
TROOT()
Default ctor.
Definition: TROOT.cxx:643
void SetCutClassName(const char *name="TCutG")
Set the default graphical cut class name for the graphics editor By default the graphics editor creat...
Definition: TROOT.cxx:2685
TSeqCollection * fCanvases
Definition: TROOT.h:157
const TObject * fPrimitive
Definition: TROOT.h:146
Bool_t fIsWebDisplay
Definition: TROOT.h:135
TFolder * fRootFolder
Definition: TROOT.h:175
void AddClassGenerator(TClassGenerator *gen)
Add a class generator.
Definition: TROOT.cxx:1057
TSeqCollection * fGeometries
Definition: TROOT.h:162
TString fCutClassName
Definition: TROOT.h:178
TInterpreter * fInterpreter
Definition: TROOT.h:132
std::vector< std::pair< std::string, int > > FwdDeclArgsToKeepCollection_t
Definition: TROOT.h:195
Int_t fVersionTime
Definition: TROOT.h:124
void EndOfProcessCleanups()
Execute the cleanups necessary at the end of the process, in particular those that must be executed b...
Definition: TROOT.cxx:1249
Bool_t fBatch
Definition: TROOT.h:133
TSeqCollection * GetListOfFiles() const
Definition: TROOT.h:245
Bool_t fEscape
Definition: TROOT.h:143
static const TString & GetBinDir()
Get the binary directory in the installation. Static utility function.
Definition: TROOT.cxx:2947
Int_t fVersionInt
Definition: TROOT.h:121
static const TString & GetIncludeDir()
Get the include directory in the installation. Static utility function.
Definition: TROOT.cxx:2989
Bool_t fFromPopUp
Definition: TROOT.h:138
TSeqCollection * fSockets
Definition: TROOT.h:156
Long_t ProcessLine(const char *line, Int_t *error=0)
Process interpreter command via TApplication::ProcessLine().
Definition: TROOT.cxx:2366
static const char * GetMacroPath()
Get macro search path. Static utility function.
Definition: TROOT.cxx:2764
TCollection * fFunctions
Definition: TROOT.h:159
void SaveContext()
Save the current interpreter context.
Definition: TROOT.cxx:2673
Bool_t IsExecutingMacro() const
Definition: TROOT.h:288
TDataType * GetType(const char *name, Bool_t load=kFALSE) const
Return pointer to type with name.
Definition: TROOT.cxx:1554
TFunction * GetGlobalFunctionWithPrototype(const char *name, const char *proto=0, Bool_t load=kFALSE)
Return pointer to global function by name.
Definition: TROOT.cxx:1699
TObject * GetFunction(const char *name) const
Return pointer to function with name.
Definition: TROOT.cxx:1579
static Int_t ConvertVersionCode2Int(Int_t code)
Convert version code to an integer, i.e. 331527 -> 51507.
Definition: TROOT.cxx:2883
TSeqCollection * fMessageHandlers
Definition: TROOT.h:166
void SetStyle(const char *stylename="Default")
Change current style to style with name stylename.
Definition: TROOT.cxx:2732
AListOfEnums_t fEnums
Definition: TROOT.h:173
void ReadGitInfo()
Read Git commit information and branch name from the etc/gitinfo.txt file.
Definition: TROOT.cxx:2425
static Bool_t fgRootInit
Definition: TROOT.h:109
void RefreshBrowsers()
Refresh all browsers.
Definition: TROOT.cxx:2514
void CloseFiles()
Close any files and sockets that gROOT knows about.
Definition: TROOT.cxx:1171
std::atomic< TApplication * > fApplication
Definition: TROOT.h:131
const char * FindObjectPathName(const TObject *obj) const
Return path name of obj somewhere in the //root/... path.
Definition: TROOT.cxx:1465
static Int_t ConvertVersionInt2Code(Int_t v)
Convert version as an integer to version code as used in RVersion.h.
Definition: TROOT.cxx:2891
TFile * GetFile() const
Definition: TROOT.h:268
static const TString & GetTTFFontDir()
Get the fonts directory in the installation. Static utility function.
Definition: TROOT.cxx:3147
Bool_t fForceStyle
Definition: TROOT.h:141
TCanvas * MakeDefCanvas() const
Return a default canvas.
Definition: TROOT.cxx:1546
TCollection * fTypes
Definition: TROOT.h:149
TColor * GetColor(Int_t color) const
Return address of color with index color.
Definition: TROOT.cxx:1528
TGlobal * GetGlobal(const char *name, Bool_t load=kFALSE) const
Return pointer to global variable by name.
Definition: TROOT.cxx:1612
TClass * FindSTLClass(const char *name, Bool_t load, Bool_t silent=kFALSE) const
return a TClass object corresponding to 'name' assuming it is an STL container.
Definition: TROOT.cxx:1476
TSeqCollection * fStreamerInfo
Definition: TROOT.h:167
static const TString & GetIconPath()
Get the icon path in the installation. Static utility function.
Definition: TROOT.cxx:3126
Long_t Macro(const char *filename, Int_t *error=0, Bool_t padUpdate=kTRUE)
Execute a macro in the interpreter.
Definition: TROOT.cxx:2312
TCollection * GetListOfGlobalFunctions(Bool_t load=kFALSE)
Return list containing the TFunctions currently defined.
Definition: TROOT.cxx:1807
TString fGitDate
Definition: TROOT.h:129
TSeqCollection * fSpecials
Definition: TROOT.h:164
TCollection * GetListOfFunctionTemplates()
Definition: TROOT.cxx:1752
static void RegisterModule(const char *modulename, const char **headers, const char **includePaths, const char *payLoadCode, const char *fwdDeclCode, void(*triggerFunc)(), const FwdDeclArgsToKeepCollection_t &fwdDeclsArgToSkip, const char **classesHeaders, bool hasCxxModule=false)
Called by static dictionary initialization to register clang modules for headers.
Definition: TROOT.cxx:2537
TCollection * fClasses
Definition: TROOT.h:148
Bool_t fReadingObject
Definition: TROOT.h:140
Bool_t fEditHistograms
Definition: TROOT.h:137
TListOfDataMembers * fGlobals
Definition: TROOT.h:151
TListOfFunctionTemplates * fFuncTemplate
Definition: TROOT.h:150
Int_t fTimer
Definition: TROOT.h:130
TSeqCollection * fDataSets
Definition: TROOT.h:172
TString fConfigOptions
Definition: TROOT.h:118
TStyle * GetStyle(const char *name) const
Return pointer to style with name.
Definition: TROOT.cxx:1571
TCollection * GetListOfEnums(Bool_t load=kFALSE)
Definition: TROOT.cxx:1735
Long_t ProcessLineFast(const char *line, Int_t *error=0)
Process interpreter command directly via CINT interpreter.
Definition: TROOT.cxx:2403
void InitInterpreter()
Initialize the interpreter.
Definition: TROOT.cxx:2036
TCollection * GetListOfGlobals(Bool_t load=kFALSE)
Return list containing the TGlobals currently defined.
Definition: TROOT.cxx:1769
virtual TObject * FindObjectAnyFile(const char *name) const
Scan the memory lists of all files for an object with name.
Definition: TROOT.cxx:1428
static void SetDirLevel(Int_t level=0)
Return Indentation level for ls().
Definition: TROOT.cxx:2875
TSeqCollection * fSecContexts
Definition: TROOT.h:169
TString fWebDisplay
Definition: TROOT.h:134
static const char * GetTutorialsDir()
Get the tutorials directory in the installation.
Definition: TROOT.cxx:3169
static Bool_t fgMemCheck
Definition: TROOT.h:110
TCollection * GetListOfFunctionOverloads(const char *name) const
Return the collection of functions named "name".
Definition: TROOT.cxx:1653
TSeqCollection * fCleanups
Definition: TROOT.h:165
static Bool_t Initialized()
Return kTRUE if the TROOT object has been initialized.
Definition: TROOT.cxx:2859
void RecursiveRemove(TObject *obj)
Recursively remove this object from the list of Cleanups.
Definition: TROOT.cxx:2500
Int_t fLineIsProcessing
Definition: TROOT.h:106
static const TString & GetSourceDir()
Get the source directory in the installation. Static utility function.
Definition: TROOT.cxx:3105
static const TString & GetMacroDir()
Get the macro directory in the installation. Static utility function.
Definition: TROOT.cxx:3063
TString fGitCommit
Definition: TROOT.h:127
TSeqCollection * fClosedObjects
Definition: TROOT.h:153
TSeqCollection * fTasks
Definition: TROOT.h:160
void Browse(TBrowser *b)
Add browsable objects to TBrowser.
Definition: TROOT.cxx:1078
TFunction * GetGlobalFunction(const char *name, const char *params=0, Bool_t load=kFALSE)
Return pointer to global function by name.
Definition: TROOT.cxx:1666
TSeqCollection * fClipboard
Definition: TROOT.h:171
const char * GetGitDate()
Return date/time make was run.
Definition: TROOT.cxx:2476
void SetEditorMode(const char *mode="")
Set editor mode.
Definition: TROOT.cxx:2706
static const TString & GetTutorialDir()
Get the tutorials directory in the installation. Static utility function.
Definition: TROOT.cxx:3084
virtual ~TROOT()
Clean up and free resources used by ROOT (files, network sockets, shared memory segments,...
Definition: TROOT.cxx:906
TSeqCollection * fColors
Definition: TROOT.h:161
static Bool_t MemCheck()
Return kTRUE if the memory leak checker is on.
Definition: TROOT.cxx:2867
void Idle(UInt_t idleTimeInSec, const char *command=0)
Execute command when system has been idle for idleTimeInSec seconds.
Definition: TROOT.cxx:1858
TSeqCollection * GetListOfBrowsers() const
Definition: TROOT.h:253
Bool_t ReadingObject() const
Deprecated (will be removed in next release).
Definition: TROOT.cxx:2462
TSeqCollection * fStyles
Definition: TROOT.h:158
Int_t fVersionDate
Definition: TROOT.h:123
TSeqCollection * GetListOfColors() const
Definition: TROOT.h:240
virtual void Append(TObject *obj, Bool_t replace=kFALSE)
Append object to this directory.
Definition: TROOT.cxx:1069
Int_t fBuiltTime
Definition: TROOT.h:126
TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE) const
Return pointer to class with name. Obsolete, use TClass::GetClass directly.
Definition: TROOT.cxx:1510
TVirtualPad * fSelectPad
Definition: TROOT.h:147
TSeqCollection * fFiles
Definition: TROOT.h:154
virtual TObject * FindObjectAny(const char *name) const
Return a pointer to the first object with name starting at //root.
Definition: TROOT.cxx:1418
static const TString & GetRootSys()
Get the rootsys directory in the installation. Static utility function.
Definition: TROOT.cxx:2926
TListOfFunctions * GetGlobalFunctions()
Internal routine returning, and creating if necessary, the list of global function.
Definition: TROOT.cxx:1644
Bool_t fInterrupt
Definition: TROOT.h:142
Bool_t fMustClean
Definition: TROOT.h:139
TObject * Remove(TObject *)
Remove an object from the in-memory list.
Definition: TROOT.cxx:2620
Int_t LoadClass(const char *classname, const char *libname, Bool_t check=kFALSE)
Check if class "classname" is known to the interpreter (in fact, this check is not needed anymore,...
Definition: TROOT.cxx:2179
void AddClass(TClass *cl)
Add a class to the list and map of classes.
Definition: TROOT.cxx:1047
static Int_t RootVersionCode()
Return ROOT version code as defined in RVersion.h.
Definition: TROOT.cxx:2902
TObject * FindSpecialObject(const char *name, void *&where)
Returns address and folder of a ROOT object if it exists.
Definition: TROOT.cxx:1359
void InitSystem()
Initialize operating system interface.
Definition: TROOT.cxx:1944
Bool_t ClassSaved(TClass *cl)
return class status bit kClassSaved for class cl This function is called by the SavePrimitive functio...
Definition: TROOT.cxx:1097
TString fGitBranch
Definition: TROOT.h:128
TCollection * GetListOfTypes(Bool_t load=kFALSE)
Return a dynamic list giving access to all TDataTypes (typedefs) currently defined.
Definition: TROOT.cxx:1846
virtual TObject * FindObject(const char *name) const
Returns address of a ROOT object if it exists.
Definition: TROOT.cxx:1305
static Int_t fgDirLevel
Definition: TROOT.h:108
Bool_t IsRootFile(const char *filename) const
Return true if the file is local and is (likely) to be a ROOT file.
Definition: TROOT.cxx:2226
static void IndentLevel()
Functions used by ls() to indent an object hierarchy.
Definition: TROOT.cxx:2851
static const TString & GetDocDir()
Get the documentation directory in the installation. Static utility function.
Definition: TROOT.cxx:3047
static const TString & GetEtcDir()
Get the sysconfig directory in the installation. Static utility function.
Definition: TROOT.cxx:3010
static const char **& GetExtraInterpreterArgs()
Definition: TROOT.cxx:2909
static void SetMacroPath(const char *newpath)
Set or extend the macro search path.
Definition: TROOT.cxx:2790
void InitThreads()
Load and initialize thread library.
Definition: TROOT.cxx:2025
TProcessUUID * fUUIDs
Definition: TROOT.h:174
TString fConfigFeatures
Definition: TROOT.h:119
TFunctionTemplate * GetFunctionTemplate(const char *name)
Definition: TROOT.cxx:1599
TPluginManager * fPluginManager
Definition: TROOT.h:177
TObject * GetGeometry(const char *name) const
Return pointer to Geometry with name.
Definition: TROOT.cxx:1728
Bool_t fExecutingMacro
Definition: TROOT.h:144
Int_t fBuiltDate
Definition: TROOT.h:125
Bool_t fIsWebDisplayBatch
Definition: TROOT.h:136
TSeqCollection * fMappedFiles
Definition: TROOT.h:155
static const TString & GetLibDir()
Get the library directory in the installation. Static utility function.
Definition: TROOT.cxx:2968
void ls(Option_t *option="") const
To list all objects of the application.
Definition: TROOT.cxx:2246
TSeqCollection * fBrowsers
Definition: TROOT.h:163
TString fDefCanvasName
Definition: TROOT.h:179
TListOfFunctions * fGlobalFunctions
Definition: TROOT.h:152
TList * fBrowsables
Definition: TROOT.h:176
static Int_t DecreaseDirLevel()
Decrease the indentation level for ls().
Definition: TROOT.cxx:2748
Long_t ProcessLineSync(const char *line, Int_t *error=0)
Process interpreter command via TApplication::ProcessLine().
Definition: TROOT.cxx:2386
void Reset(Option_t *option="")
Delete all global interpreter objects created since the last call to Reset.
Definition: TROOT.cxx:2653
Int_t fEditorMode
Definition: TROOT.h:145
const char * FindObjectClassName(const char *name) const
Returns class name of a ROOT object including CINT globals.
Definition: TROOT.cxx:1445
static const TString & GetDataDir()
Get the data directory in the installation. Static utility function.
Definition: TROOT.cxx:3031
void SetWebDisplay(const char *webdisplay)
The input parameter webdisplay defines where web graphics should be rendered.
Definition: TROOT.cxx:2815
Int_t LoadMacro(const char *filename, Int_t *error=0, Bool_t check=kFALSE)
Load a macro in the interpreter's memory.
Definition: TROOT.cxx:2264
TSeqCollection * GetListOfGeometries() const
Definition: TROOT.h:252
TSeqCollection * GetListOfStyles() const
Definition: TROOT.h:249
TString fVersion
Definition: TROOT.h:120
static Int_t GetDirLevel()
return directory level
Definition: TROOT.cxx:2756
void SetReadingObject(Bool_t flag=kTRUE)
Definition: TROOT.cxx:2467
Sequenceable collection abstract base class.
virtual void AddLast(TObject *obj)=0
virtual TObject * Last() const =0
virtual TObject * First() const =0
virtual void Add(TObject *obj)
static void EnableStatistics(int size=-1, int ix=-1)
Enable memory usage statistics gathering.
Definition: TStorage.cxx:450
static void PrintStatistics()
Print memory usage statistics.
Definition: TStorage.cxx:406
@ kBoth
Definition: TString.h:262
@ kIgnoreCase
Definition: TString.h:263
TStyle objects may be created to define special styles.
Definition: TStyle.h:27
static void BuildStyles()
Create some standard styles.
Definition: TStyle.cxx:421
Describes an Operating System directory for the browser.
Abstract base class defining a generic interface to the underlying Operating System.
Definition: TSystem.h:248
virtual Func_t DynFindSymbol(const char *module, const char *entry)
Find specific entry point in specified library.
Definition: TSystem.cxx:2044
virtual const char * Getenv(const char *env)
Get environment variable.
Definition: TSystem.cxx:1652
virtual TString SplitAclicMode(const char *filename, TString &mode, TString &args, TString &io) const
This method split a filename of the form:
Definition: TSystem.cxx:4160
virtual char * ConcatFileName(const char *dir, const char *name)
Concatenate a directory and a file name. User must delete returned string.
Definition: TSystem.cxx:1061
virtual void CleanCompiledMacros()
Remove the shared libs produced by the CompileMacro() function.
Definition: TSystem.cxx:4245
virtual const char * HomeDirectory(const char *userName=0)
Return the user's home directory.
Definition: TSystem.cxx:894
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
Definition: TSystem.cxx:1843
int GetPathInfo(const char *path, Long_t *id, Long_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
Definition: TSystem.cxx:1388
virtual const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
Definition: TSystem.cxx:1071
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
Definition: TSystem.cxx:1286
virtual const char * UnixPathName(const char *unixpathname)
Convert from a Unix pathname to a local pathname.
Definition: TSystem.cxx:1053
virtual Bool_t Init()
Initialize the OS interface.
Definition: TSystem.cxx:191
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
Definition: TSystem.cxx:941
virtual const char * WorkingDirectory()
Return working directory.
Definition: TSystem.cxx:878
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
Definition: TSystem.cxx:1536
virtual void ResetSignals()
Reset signals handlers to previous behaviour.
Definition: TSystem.cxx:593
char * DynamicPathName(const char *lib, Bool_t quiet=kFALSE)
Find a dynamic library called lib using the system search paths.
Definition: TSystem.cxx:2020
This class represents a WWW compatible URL.
Definition: TUrl.h:35
This class implements a mutex interface.
Definition: TVirtualMutex.h:34
TVirtualPad is an abstract base class for the Pad and Canvas classes.
Definition: TVirtualPad.h:50
static TVirtualPad *& Pad()
Return the current pad for the current thread.
Definition: TVirtualPad.cxx:28
Semi-Abstract base class defining a generic interface to the underlying, low level,...
Definition: TVirtualX.h:53
static TVirtualX *& Instance()
Returns gVirtualX global.
Definition: TVirtualX.cxx:57
TLine * line
TF1 * f1
Definition: legend1.C:11
static Func_t GetSymInLibImt(const char *funcname)
Definition: TROOT.cxx:397
static GetROOTFun_t gGetROOT
Definition: TROOT.cxx:395
R__EXTERN TROOT * gROOTLocal
Definition: TROOT.h:383
void DisableParBranchProcessing()
Globally disables the IMT use case of parallel branch processing, deactivating the corresponding lock...
Definition: TROOT.cxx:432
void DisableParTreeProcessing()
Globally disables the IMT use case of parallel branch processing, deactivating the corresponding lock...
Definition: TROOT.cxx:481
static Bool_t & IsImplicitMTEnabledImpl()
Keeps track of the status of ImplicitMT w/o resorting to the load of libImt.
Definition: TROOT.cxx:510
TROOT *(* GetROOTFun_t)()
Definition: TROOT.cxx:393
void EnableParBranchProcessing()
Globally enables the parallel branch processing, which is a case of implicit multi-threading (IMT) in...
Definition: TROOT.cxx:416
Bool_t IsParBranchProcessingEnabled()
Returns true if parallel branch processing is enabled.
Definition: TROOT.cxx:445
Bool_t IsParTreeProcessingEnabled()
Returns true if parallel tree processing is enabled.
Definition: TROOT.cxx:494
TROOT * GetROOT2()
Definition: TROOT.cxx:383
TROOT * GetROOT1()
Definition: TROOT.cxx:376
void EnableParTreeProcessing()
Globally enables the parallel tree processing, which is a case of implicit multi-threading in ROOT,...
Definition: TROOT.cxx:465
void function(const Char_t *name_, T fun, const Char_t *docstring=0)
Definition: RExports.h:151
Namespace for new ROOT classes and functions.
Definition: StringConv.hxx:21
TString & GetMacroPath()
Definition: TROOT.cxx:523
void EnableImplicitMT(UInt_t numthreads=0)
Enable ROOT's implicit multi-threading for all objects and methods that provide an internal paralleli...
Definition: TROOT.cxx:576
R__EXTERN TVirtualRWMutex * gCoreMutex
void EnableThreadSafety()
Enables the global mutex to make ROOT thread safe/aware.
Definition: TROOT.cxx:545
Bool_t IsImplicitMTEnabled()
Returns true if the implicit multi-threading in ROOT is enabled.
Definition: TROOT.cxx:607
UInt_t GetImplicitMTPoolSize()
Returns the size of the pool used for implicit multi-threading.
Definition: TROOT.cxx:614
TROOT * GetROOT()
Definition: TROOT.cxx:519
void DisableImplicitMT()
Disables the implicit multi-threading in ROOT (see EnableImplicitMT).
Definition: TROOT.cxx:593
void GetNormalizedName(std::string &norm_name, std::string_view name)
Return the normalized name.
Definition: TClassEdit.cxx:798
static constexpr double s
static constexpr double mm
STL namespace.
Int_t fMode
Definition: TSystem.h:128
TCanvas * style()
Definition: style.C:1
auto * l
Definition: textangle.C:4
auto * a
Definition: textangle.C:12
#define sym(otri1, otri2)
Definition: triangle.c:932