Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RFile.hxx
Go to the documentation of this file.
1/// \file ROOT/RFile.hxx
2/// \author Giacomo Parolini <giacomo.parolini@cern.ch>
3/// \date 2025-03-19
4/// \warning This is part of the ROOT 7 prototype! It will change without notice. Feedback
5/// is welcome!
6
7#ifndef ROOT7_RFile
8#define ROOT7_RFile
9
10#include <Compression.h>
11#include <Rtypes.h>
12#include <ROOT/RError.hxx>
13
14#include <deque>
15#include <functional>
16#include <iostream>
17#include <memory>
18#include <string_view>
19#include <typeinfo>
20#include <type_traits>
21#include <variant>
22
23class TFile;
24class TIterator;
25class TKey;
26class TTree;
27
28namespace ROOT {
29
30class RKeyInfo;
31class RFile;
32
33namespace Internal {
34
36
37/// Returns an **owning** pointer to the object referenced by `key`. The caller must delete this pointer.
38/// This method is meant to only be used by the pythonization.
39[[nodiscard]] void *RFile_GetObjectFromKey(RFile &file, const RKeyInfo &key);
40
41TFile *GetRFileTFile(RFile &rfile);
42
43} // namespace Internal
44
45namespace Detail {
46
47/// Given a "path-like" string (like foo/bar/baz), returns a pair `{ dirName, baseName }`.
48/// `baseName` will be empty if the string ends with '/'.
49/// `dirName` will be empty if the string contains no '/'.
50/// `dirName`, if not empty, always ends with a '/'.
51/// NOTE: this function does no semantic checking or path expansion, nor does it interact with the
52/// filesystem in any way (so it won't follow symlink or anything like that).
53/// Moreover it doesn't trim the path in any way, so any leading or trailing whitespaces will be preserved.
54/// This function does not perform any copy: the returned string_views have the same lifetime as `path`.
55std::pair<std::string_view, std::string_view> DecomposePath(std::string_view path);
56
57}
58
59class RFileKeyIterable;
60
61/**
62\class ROOT::RKeyInfo
63\ingroup io_files
64\brief Information about an RFile object's Key.
65
66Every object inside a ROOT file has an associated "Key" which contains metadata on the object, such as its name, type
67etc.
68Querying this information can be done via RFile::ListKeys(). Reading an object's Key
69doesn't deserialize the full object, so it's a relatively lightweight operation.
70*/
71class RKeyInfo final {
72 friend class ROOT::RFile;
74
75public:
76 enum class ECategory : std::uint16_t {
78 kObject,
80 };
81
82private:
83 std::string fPath;
84 std::string fTitle;
85 std::string fClassName;
86 std::uint16_t fCycle = 0;
88 std::uint64_t fLenObj = 0;
89 std::uint64_t fNBytesObj = 0;
90 std::uint64_t fNBytesKey = 0;
91 std::uint64_t fSeekKey = 0;
92 std::uint64_t fSeekParentDir = 0;
93
94 explicit RKeyInfo(const TKey &key);
95
96public:
97 RKeyInfo() = default;
98
99 /// Returns the absolute path of this key, i.e. the directory part plus the object name.
100 const std::string &GetPath() const { return fPath; }
101 /// Returns the base name of this key, i.e. the name of the object without the directory part.
102 std::string GetBaseName() const { return std::string(Detail::DecomposePath(fPath).second); }
103 const std::string &GetTitle() const { return fTitle; }
104 const std::string &GetClassName() const { return fClassName; }
105 std::uint16_t GetCycle() const { return fCycle; }
106 ECategory GetCategory() const { return fCategory; }
107 /// Returns the in-memory size of the uncompressed object.
108
109 std::uint64_t GetLenObj() const { return fLenObj; }
110 /// Returns the on-disk size of the (potentially compressed) object, excluding its key.
111 std::uint64_t GetNBytesObj() const { return fNBytesObj; }
112
113 /// Returns the on-disk size of this object's key.
114 std::uint64_t GetNBytesKey() const { return fNBytesKey; }
115 /// Returns the on-disk offset of this object's key.
116 std::uint64_t GetSeekKey() const { return fSeekKey; }
117
118 /// Returns the on-disk offset of this object's parent directory key.
119 std::uint64_t GetSeekParentDir() const { return fSeekParentDir; }
120};
121
122/// The iterable returned by RFile::ListKeys()
123class RFileKeyIterable final {
124 using Pattern_t = std::string;
125
126 TFile *fFile = nullptr;
128 std::uint32_t fFlags = 0;
129
130public:
131 class RIterator {
132 friend class RFileKeyIterable;
133
135 // This is ugly, but TList returns an (owning) pointer to a polymorphic TIterator...and we need this class
136 // to be copy-constructible.
137 std::shared_ptr<TIterator> fIter;
138 std::string fDirPath;
139
140 // Outlined to avoid including TIterator.h
141 RIterStackElem(TIterator *it, const std::string &path = "");
142 // Outlined to avoid including TIterator.h
144
145 // fDirPath doesn't need to be compared because it's implied by fIter.
146 bool operator==(const RIterStackElem &other) const { return fIter == other.fIter; }
147 };
148
149 // Using a deque to have pointer stability
150 std::deque<RIterStackElem> fIterStack;
152 const TKey *fCurKey = nullptr;
153 std::uint16_t fRootDirNesting = 0;
154 std::uint32_t fFlags = 0;
155
156 void Advance();
157
158 // NOTE: `iter` here is an owning pointer (or null)
159 RIterator(TIterator *iter, Pattern_t pattern, std::uint32_t flags);
160
161 public:
163 using iterator_category = std::input_iterator_tag;
164 using difference_type = std::ptrdiff_t;
166 using pointer = const value_type *;
167 using reference = const value_type &;
168
170 {
171 Advance();
172 return *this;
173 }
174 value_type operator*();
175 bool operator!=(const iterator &rh) const { return !(*this == rh); }
176 bool operator==(const iterator &rh) const { return fIterStack == rh.fIterStack; }
177 };
178
179 RFileKeyIterable(TFile *file, std::string_view rootDir, std::uint32_t flags)
180 : fFile(file), fPattern(std::string(rootDir)), fFlags(flags)
181 {
182 }
183
184 RIterator begin() const;
185 RIterator end() const;
186};
187
188/**
189\class ROOT::RFile
190\ingroup io_files
191\brief An interface to read from, or write to, a ROOT file, as well as performing other common operations.
192
193Please refer to the documentation of TFile for the details related to how data and executable code can be stored
194in ROOT files.
195
196## When and why should you use RFile
197
198RFile is a modern and minimalistic interface to ROOT files, both local and remote, that can be used instead of TFile
199when you only need basic Put/Get operations and don't need the more advanced TFile/TDirectory functionalities.
200It provides:
201- a simple interface that makes it easy to do things right and hard to do things wrong;
202- more robustness and better error reporting for those operations;
203- clearer ownership semantics expressed through the type system.
204
205RFile doesn't cover the entirety of use cases covered by TFile/TDirectory/TDirectoryFile and is not
206a 1:1 replacement for them. It is meant to simplify the most common use cases by following newer standard C++
207practices.
208
209## Ownership model
210
211RFile handles ownership via smart pointers, typically std::unique_ptr.
212
213When getting an object from the file (via RFile::Get) you get back a unique copy of the object. Calling `Get` on the
214same object twice produces two independent clones of the object. The ownership over that object is solely on the caller
215and not shared with the RFile. Therefore, the object will remain valid after closing or destroying the RFile that
216generated it. This also means that any modification done to the object are **not** reflected to the file automatically:
217to update the object in the file you need to write it again (via RFile::Overwrite).
218
219RFile::Put and RFile::Overwrite are the way to write objects to the file. Both methods take a const reference to the
220object to write and don't change the ownership of the object in any way. Calling Put or Overwrite doesn't guarantee that
221the object is immediately written to the underlying storage: to ensure that, you need to call RFile::Flush (or close the
222file).
223
224## Directories
225
226Even though there is no equivalent of TDirectory in the RFile API, directories are still an existing concept in RFile
227(since they are a concept in the ROOT binary format). However they are for now only interacted with indirectly, via the
228use of filesystem-like string-based paths. If you Put an object in an RFile under the path "path/to/object", "object"
229will be stored under directory "to" which is in turn stored under directory "path". This hierarchy is encoded in the
230ROOT file itself and it can provide some optimization and/or conveniences when querying objects.
231
232For the most part, it is convenient to think about RFile in terms of a key-value storage where string-based paths are
233used to refer to arbitrary objects. However, given the hierarchical nature of ROOT files, certain filesystem-like
234properties are applied to paths, for ease of use: the '/' character is treated specially as the directory separator;
235multiple '/' in a row are collapsed into one (since RFile doesn't allow directories with empty names).
236
237At the moment, RFile doesn't allow getting directories via Get, nor writing ones via Put (this may change in the
238future).
239
240## Sample usage
241Opening an RFile (for writing) and writing an object to it:
242~~~{.cpp}
243auto rfile = ROOT::RFile::Recreate("my_file.root");
244auto myObj = TH1D("h", "h", 10, 0, 1);
245rfile->Put(myObj.GetName(), myObj);
246~~~
247
248Opening an RFile (for reading) and reading an object from it:
249~~~{.cpp}
250auto rfile = ROOT::RFile::Open("my_file.root");
251auto myObj = file->Get<TH1D>("h");
252~~~
253*/
254class RFile final {
255 friend void *Internal::RFile_GetObjectFromKey(RFile &file, const RKeyInfo &key);
257
258 /// Flags used in PutInternal()
260 /// When encountering an object at the specified path, overwrite it with the new one instead of erroring out.
262 /// When overwriting an object, preserve the existing one and create a new cycle, rather than removing it.
264 };
265
266 std::unique_ptr<TFile> fFile;
267
268 // Outlined to avoid including TFile.h
269 explicit RFile(std::unique_ptr<TFile> file);
270
271 /// Gets object `path` from the file and returns an **owning** pointer to it.
272 /// The caller should immediately wrap it into a unique_ptr of the type described by `type`.
273 [[nodiscard]] void *GetUntyped(std::string_view path,
274 std::variant<const char *, std::reference_wrapper<const std::type_info>> type) const;
275
276 /// Writes `obj` to file, without taking its ownership.
277 void PutUntyped(std::string_view path, const std::type_info &type, const void *obj, std::uint32_t flags,
278 std::string_view title);
279
280 template <typename T>
281 void PutInternal(std::string_view path, const T &obj, std::uint32_t flags, std::string_view title)
282 {
283 PutUntyped(path, typeid(T), &obj, flags, title);
284 }
285
286 /// Given `path`, returns the TKey corresponding to the object at that path (assuming the path is fully split, i.e.
287 /// "a/b/c" always means "object 'c' inside directory 'b' inside directory 'a'").
288 /// IMPORTANT: `path` must have been validated/normalized via ValidateAndNormalizePath() (see RFile.cxx).
289 TKey *GetTKey(std::string_view path) const;
290
291public:
300
302 /// See core/zip/inc/Compression.h for the meaning of the `compression` argument.
303 /// Default compression is 505 (ZSTD level 10).
305 /// If true the RFile will show up in the TBrowser window. This causes the file to also be added
306 /// to the list of global files. Set to false to prevent this global registration.
308
310 };
311
313 /// If true the RFile will show up in the TBrowser window. This causes the file to also be added
314 /// to the list of global files. Set to false to prevent this global registration.
316
318 };
319
321 /// If true the RFile will show up in the TBrowser window. This causes the file to also be added
322 /// to the list of global files. Set to false to prevent this global registration.
324
326 };
327
328 // This is arbitrary, but it's useful to avoid pathological cases
329 static constexpr int kMaxPathNesting = 1000;
330
331 ///// Factory methods /////
332
333 /// Opens the file for reading. `path` may be a regular file path or a remote URL.
334 /// \throw ROOT::RException if the file at `path` could not be opened.
335 static std::unique_ptr<RFile> Open(std::string_view path, const ROpenOptions &opts = ROpenOptions());
336
337 /// Opens the file for reading/writing, overwriting it if it already exists.
338 /// \throw ROOT::RException if a file could not be created at `path` (e.g. if the specified
339 /// directory tree does not exist).
340 static std::unique_ptr<RFile> Recreate(std::string_view path, const RRecreateOptions &opts = RRecreateOptions());
341
342 /// Opens the file for updating, creating a new one if it doesn't exist.
343 /// \throw ROOT::RException if the file at `path` could neither be read nor created
344 /// (e.g. if the specified directory tree does not exist).
345 static std::unique_ptr<RFile> Update(std::string_view path, const RUpdateOptions &opts = RUpdateOptions());
346
347 ///// Instance methods /////
348
349 // Outlined to avoid including TFile.h
351
352 /// Retrieves an object from the file.
353 /// `path` should be a string such that `IsValidPath(path) == true`, otherwise an exception will be thrown.
354 /// See \ref ValidateAndNormalizePath() for info about valid path names.
355 /// \return A copy of the object at `path`, or `nullptr` if there is no object of type `T` at the specified path.
356 template <typename T>
357 std::unique_ptr<T> Get(std::string_view path) const
358 {
359 void *obj = GetUntyped(path, typeid(T));
360 return std::unique_ptr<T>(static_cast<T *>(obj));
361 }
362
363 /// Puts object `obj` into the file and gives it a title.
364 /// The application retains ownership of the object.
365 /// The object will be effectively copied into the file, so any further modifications won't be seen by the object
366 /// inside the file.
367 /// Note that the object is not necessarily written to storage until the RFile is closed or `Flush()` is called.
368 ///
369 /// `path` should be a string such that `IsValidPath(path) == true`, otherwise an exception will be thrown.
370 /// See \ref ValidateAndNormalizePath() for info about valid path names.
371 ///
372 /// \throws ROOT::RException if `path` already identifies a valid object or directory.
373 /// \throws ROOT::RException if the file was opened in read-only mode.
374 template <typename T>
375 void Put(std::string_view path, const T &obj, std::string_view title = "")
376 {
377 static_assert(!std::is_base_of_v<TTree, T>, "Writing TTree with RFile is unsupported.");
378 PutInternal(path, obj, /* flags = */ 0, title);
379 }
380
381 /// Puts object `namedObj` in the file under the path `dirPath/namedObj.GetName()`, giving it a title equal to
382 /// `namedObj.GetTitle()`.
383 /// If `dirPath` is empty (default), the object is put at the top level of the file.
384 ///
385 /// \throws ROOT::RException if `dirPath/namedObj.GetName()` results in an invalid object path. Notably, this
386 /// includes the case where `namedObj.GetName()` contains a slash character.
387 void Put(const class TNamed &namedObj, std::string_view dirPath = "");
388
389 /// Puts an object into the file, overwriting any previously-existing object at that path.
390 /// See Put for more details.
391 ///
392 /// `overwriteFlags` must contain values from the `EOverwriteFlags` enum.
393 /// If an object already exists at that path AND it has type `T`, it is kept as a backup cycle
394 /// unless `overwriteFlags` contains `kOverwrite_NoNewCycle`.
395 /// If the existing object's type differs from `T`, an exception is thrown.
396 /// Note that even if no new cycle is created, only the *latest* cycle will be deleted.
397 ///
398 /// \throws ROOT::RException if `path` is already the path of a directory.
399 /// \throws ROOT::RException if the file was opened in read-only mode.
400 template <typename T>
401 void Overwrite(std::string_view path, const T &obj, std::uint32_t overwriteFlags = 0)
402 {
403 static_assert(!std::is_base_of_v<TTree, T>, "Writing TTree with RFile is unsupported.");
404 Overwrite(path, obj, "", overwriteFlags);
405 }
406
407 /// Like Overwrite(std::string_view, const T&, bool) but allows giving a title to the object.
408 template <typename T>
409 void Overwrite(std::string_view path, const T &obj, std::string_view title, std::uint32_t overwriteFlags = 0)
410 {
411 std::uint32_t flags = kPutFlag_AllowOverwrite;
412 const bool createNewCycle = !(overwriteFlags & kOverwrite_NoNewCycle);
413 flags |= createNewCycle * kPutFlag_OverwriteKeepCycle;
414 PutInternal(path, obj, flags, title);
415 }
416
417 /// Writes all objects and the file structure to disk.
418 /// \return the number of bytes written.
419 size_t Flush();
420
421 /// Flushes the RFile if needed and closes it, disallowing any further reading or writing.
422 void Close();
423
424 /// Returns an iterable over all keys of objects and/or directories written into this RFile starting at path
425 /// `basePath` (defaulting to include the content of all subdirectories).
426 /// The iterable yields values of type ROOT::Experimental::RKeyInfo.
427 ///
428 /// By default, keys referring to directories are not returned: only those referring to leaf objects are.
429 /// If `basePath` is the path of a leaf object, only `basePath` itself will be returned.
430 /// If `basePath` is the path of a directory, it won't appear in the listing.
431 /// `flags` is a bitmask specifying the listing mode.
432 /// If `(flags & kListObjects) != 0`, the listing will include keys of non-directory objects (default);
433 /// If `(flags & kListDirs) != 0`, the listing will include keys of directory objects;
434 /// If `(flags & kListRecursive) != 0`, the listing will recurse on all subdirectories of `basePath` (default),
435 /// otherwise it will only list immediate children of `basePath`.
436 ///
437 /// Example usage:
438 /// ~~~{.cpp}
439 /// for (RKeyInfo key : file->ListKeys()) {
440 /// // iterate over all objects in the RFile
441 /// cout << key.GetPath() << ";" << key.GetCycle() << " of type " << key.GetClassName() << "\n";
442 /// }
443 /// for (RKeyInfo key : file->ListKeys("", kListDirs|kListObjects|kListRecursive)) {
444 /// // iterate over all objects and directories in the RFile
445 /// }
446 /// for (RKeyInfo key : file->ListKeys("a/b", kListObjects)) {
447 /// // iterate over all objects that are immediate children of directory "a/b"
448 /// }
449 /// for (RKeyInfo key : file->ListKeys("foo", kListDirs|kListRecursive)) {
450 /// // iterate over all directories under directory "foo", recursively
451 /// }
452 /// ~~~
453 RFileKeyIterable ListKeys(std::string_view basePath = "", std::uint32_t flags = kListObjects | kListRecursive) const
454 {
455 return RFileKeyIterable(fFile.get(), basePath, flags);
456 }
457
458 /// Retrieves information about the key of object at `path`, if one exists.
459 std::optional<RKeyInfo> GetKeyInfo(std::string_view path) const;
460
461 /// Prints the internal structure of this RFile to the given stream.
462 void Print(std::ostream &out = std::cout) const;
463};
464
465} // namespace ROOT
466
467#endif
#define BIT(n)
Definition Rtypes.h:90
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
RIterator(TIterator *iter, Pattern_t pattern, std::uint32_t flags)
Definition RFile.cxx:424
bool operator!=(const iterator &rh) const
Definition RFile.hxx:175
bool operator==(const iterator &rh) const
Definition RFile.hxx:176
std::deque< RIterStackElem > fIterStack
Definition RFile.hxx:150
std::input_iterator_tag iterator_category
Definition RFile.hxx:163
The iterable returned by RFile::ListKeys()
Definition RFile.hxx:123
std::string Pattern_t
Definition RFile.hxx:124
RIterator end() const
Definition RFile.cxx:448
RFileKeyIterable(TFile *file, std::string_view rootDir, std::uint32_t flags)
Definition RFile.hxx:179
RIterator begin() const
Definition RFile.cxx:443
std::uint32_t fFlags
Definition RFile.hxx:128
An interface to read from, or write to, a ROOT file, as well as performing other common operations.
Definition RFile.hxx:254
@ kOverwrite_NoNewCycle
Definition RFile.hxx:298
void Close()
Flushes the RFile if needed and closes it, disallowing any further reading or writing.
Definition RFile.cxx:559
static constexpr int kMaxPathNesting
Definition RFile.hxx:329
static std::unique_ptr< RFile > Open(std::string_view path, const ROpenOptions &opts=ROpenOptions())
Opens the file for reading.
Definition RFile.cxx:205
void PutUntyped(std::string_view path, const std::type_info &type, const void *obj, std::uint32_t flags, std::string_view title)
Writes obj to file, without taking its ownership.
Definition RFile.cxx:342
std::unique_ptr< TFile > fFile
Definition RFile.hxx:266
void PutInternal(std::string_view path, const T &obj, std::uint32_t flags, std::string_view title)
Definition RFile.hxx:281
void Overwrite(std::string_view path, const T &obj, std::uint32_t overwriteFlags=0)
Puts an object into the file, overwriting any previously-existing object at that path.
Definition RFile.hxx:401
size_t Flush()
Writes all objects and the file structure to disk.
Definition RFile.cxx:554
void Print(std::ostream &out=std::cout) const
Prints the internal structure of this RFile to the given stream.
Definition RFile.cxx:540
TKey * GetTKey(std::string_view path) const
Given path, returns the TKey corresponding to the object at that path (assuming the path is fully spl...
Definition RFile.cxx:242
RFileKeyIterable ListKeys(std::string_view basePath="", std::uint32_t flags=kListObjects|kListRecursive) const
Returns an iterable over all keys of objects and/or directories written into this RFile starting at p...
Definition RFile.hxx:453
void Overwrite(std::string_view path, const T &obj, std::string_view title, std::uint32_t overwriteFlags=0)
Like Overwrite(std::string_view, const T&, bool) but allows giving a title to the object.
Definition RFile.hxx:409
void * GetUntyped(std::string_view path, std::variant< const char *, std::reference_wrapper< const std::type_info > > type) const
Gets object path from the file and returns an owning pointer to it.
Definition RFile.cxx:287
static std::unique_ptr< RFile > Recreate(std::string_view path, const RRecreateOptions &opts=RRecreateOptions())
Opens the file for reading/writing, overwriting it if it already exists.
Definition RFile.cxx:227
std::unique_ptr< T > Get(std::string_view path) const
Retrieves an object from the file.
Definition RFile.hxx:357
void Put(std::string_view path, const T &obj, std::string_view title="")
Puts object obj into the file and gives it a title.
Definition RFile.hxx:375
@ kListRecursive
Definition RFile.hxx:295
EPutFlags
Flags used in PutInternal()
Definition RFile.hxx:259
@ kPutFlag_AllowOverwrite
When encountering an object at the specified path, overwrite it with the new one instead of erroring ...
Definition RFile.hxx:261
@ kPutFlag_OverwriteKeepCycle
When overwriting an object, preserve the existing one and create a new cycle, rather than removing it...
Definition RFile.hxx:263
std::optional< RKeyInfo > GetKeyInfo(std::string_view path) const
Retrieves information about the key of object at path, if one exists.
Definition RFile.cxx:578
RFile(std::unique_ptr< TFile > file)
Definition RFile.cxx:238
static std::unique_ptr< RFile > Update(std::string_view path, const RUpdateOptions &opts=RUpdateOptions())
Opens the file for updating, creating a new one if it doesn't exist.
Definition RFile.cxx:216
void Put(const class TNamed &namedObj, std::string_view dirPath="")
Puts object namedObj in the file under the path dirPath/namedObj.GetName(), giving it a title equal t...
Information about an RFile object's Key.
Definition RFile.hxx:71
std::uint64_t GetNBytesKey() const
Returns the on-disk size of this object's key.
Definition RFile.hxx:114
std::uint64_t fSeekKey
Definition RFile.hxx:91
std::uint64_t fNBytesObj
Definition RFile.hxx:89
std::string fTitle
Definition RFile.hxx:84
RKeyInfo()=default
std::uint64_t fSeekParentDir
Definition RFile.hxx:92
std::uint16_t GetCycle() const
Definition RFile.hxx:105
std::uint64_t fNBytesKey
Definition RFile.hxx:90
const std::string & GetPath() const
Returns the absolute path of this key, i.e. the directory part plus the object name.
Definition RFile.hxx:100
std::uint16_t fCycle
Definition RFile.hxx:86
std::uint64_t GetSeekParentDir() const
Returns the on-disk offset of this object's parent directory key.
Definition RFile.hxx:119
const std::string & GetClassName() const
Definition RFile.hxx:104
ECategory GetCategory() const
Definition RFile.hxx:106
std::string fPath
Definition RFile.hxx:83
std::uint64_t fLenObj
Definition RFile.hxx:88
std::uint64_t GetSeekKey() const
Returns the on-disk offset of this object's key.
Definition RFile.hxx:116
std::string GetBaseName() const
Returns the base name of this key, i.e. the name of the object without the directory part.
Definition RFile.hxx:102
std::uint64_t GetNBytesObj() const
Returns the on-disk size of the (potentially compressed) object, excluding its key.
Definition RFile.hxx:111
std::string fClassName
Definition RFile.hxx:85
ECategory fCategory
Definition RFile.hxx:87
const std::string & GetTitle() const
Definition RFile.hxx:103
std::uint64_t GetLenObj() const
Returns the in-memory size of the uncompressed object.
Definition RFile.hxx:109
A log configuration for a channel, e.g.
Definition RLogger.hxx:97
A file, usually with extension .root, that stores data and code in the form of serialized objects in ...
Definition TFile.h:130
Iterator abstract base class.
Definition TIterator.h:30
Book space in a file, create I/O buffers, to fill them, (un)compress them.
Definition TKey.h:28
The TNamed class is the base class for all named ROOT classes.
Definition TNamed.h:29
A TTree represents a columnar dataset.
Definition TTree.h:95
std::pair< std::string_view, std::string_view > DecomposePath(std::string_view path)
Given a "path-like" string (like foo/bar/baz), returns a pair { dirName, baseName }.
Definition RFile.cxx:194
ROOT::RLogChannel & RFileLog()
Definition RFile.cxx:25
void * RFile_GetObjectFromKey(RFile &file, const RKeyInfo &key)
Returns an owning pointer to the object referenced by key.
Definition RFile.cxx:588
TFile * GetRFileTFile(RFile &rfile)
Definition RFile.cxx:595
@ kUseGeneralPurpose
Use the new recommended general-purpose setting; it is a best trade-off between compression ratio/dec...
Definition Compression.h:58
RIterStackElem(TIterator *it, const std::string &path="")
Definition RFile.cxx:417
bool operator==(const RIterStackElem &other) const
Definition RFile.hxx:146
bool fEnableBrowsability
If true the RFile will show up in the TBrowser window.
Definition RFile.hxx:315
int fCompressionSettings
See core/zip/inc/Compression.h for the meaning of the compression argument.
Definition RFile.hxx:304
bool fEnableBrowsability
If true the RFile will show up in the TBrowser window.
Definition RFile.hxx:307
bool fEnableBrowsability
If true the RFile will show up in the TBrowser window.
Definition RFile.hxx:323