Helper class to factorize some necessary tasks when working with Belle2 output files.
More...
#include <RootFileInfo.h>
|
| | RootFileInfo (const std::string &filename) |
| | Create an object from a given filename or url.
|
| |
|
| ~RootFileInfo () |
| | Close the file and delete all structures associated with it.
|
| |
| TTree & | getPersistentTree () |
| | Return a reference to the persistent tree.
|
| |
| TTree & | getEventTree () |
| | Return a reference to the event tree.
|
| |
| const FileMetaData & | getFileMetaData () |
| | Return the event metadata from the file.
|
| |
| const std::set< std::string > & | getBranchNames (bool persistent=false) |
| | Return a set of branch names for either the event or the persistent tree.
|
| |
| const std::set< std::string > | getNtupleBranchNames (std::string treeName) |
| | Return a set of branch names residing in the passed tree.
|
| |
| const std::set< std::string > | getTreeNames () |
| | Return a set of event tree names in the file.
|
| |
| void | checkMissingBranches (const std::set< std::string > &required, bool persistent=false) |
| | Check if the event or persistent tree contain at least all the branches in the set of required branches.
|
| |
|
| std::unique_ptr< TFile > | m_file |
| | Pointer to the file object.
|
| |
| std::unique_ptr< TTree > | m_persistent |
| | Pointer to the persistent tree.
|
| |
| std::unique_ptr< TTree > | m_events |
| | Pointer to the event tree.
|
| |
| std::unique_ptr< FileMetaData > | m_metadata |
| | Pointer to the file metadata once it has been read.
|
| |
| std::optional< std::set< std::string > > | m_persistentBranches |
| | Cached set of persistent branch names.
|
| |
| std::optional< std::set< std::string > > | m_eventBranches |
| | Cached set of event branch names.
|
| |
Helper class to factorize some necessary tasks when working with Belle2 output files.
Like the correct way to obtain the FileMetaData from a file or to check the list of existing branches
Definition at line 27 of file RootFileInfo.h.
◆ RootFileInfo()
Create an object from a given filename or url.
This will open the file and read the tree headers. It will throw exceptions if it encounters any problems:
- std::invalid_argument if the file cannot be opened at all
- std::runtime_error if any of the trees is missing or the number of entries in the persistent tree is !=1
Definition at line 18 of file RootFileInfo.cc.
19 {
20
21 TDirectory::TContext directoryGuard;
22
23 m_file.reset(TFile::Open(filename.c_str(),
"READ"));
24 if (!
m_file || !
m_file->IsOpen())
throw std::invalid_argument(
"Could not open file");
25
26 auto getTree = [&file = this->
m_file](
const std::string & label,
const std::string & name, std::unique_ptr<TTree>& destination) {
27 TTree* tmp{nullptr};
28 file->GetObject(name.c_str(), tmp);
29 if (!tmp) throw std::runtime_error("No " + label + " tree found");
30 destination.reset(tmp);
31 };
32
35 auto isNtuple = description.find("isNtupleMetaData");
36 if ((isNtuple == description.end()) || (isNtuple->second != "True")) {
38 }
39
40 if (
auto npersistent =
m_persistent->GetEntries(); npersistent != 1) {
41 throw std::runtime_error("Expected exactly one entry in persistent tree, found " + std::to_string(npersistent));
42 }
43 }
@ c_Persistent
Object is available during entire execution time.
@ c_Event
Different object in each event, all objects/arrays are invalidated after event() function has been ca...
const FileMetaData & getFileMetaData()
Return the event metadata from the file.
std::unique_ptr< TTree > m_events
Pointer to the event tree.
std::unique_ptr< TFile > m_file
Pointer to the file object.
std::unique_ptr< TTree > m_persistent
Pointer to the persistent tree.
const std::string c_treeNames[]
Names of trees.
◆ checkMissingBranches()
| void checkMissingBranches |
( |
const std::set< std::string > & |
required, |
|
|
bool |
persistent = false |
|
) |
| |
Check if the event or persistent tree contain at least all the branches in the set of required branches.
Throw a std::runtime_error if not
Definition at line 91 of file RootFileInfo.cc.
92 {
93
95
96 std::vector<std::string> missing;
97 std::set_difference(required.begin(), required.end(), existing.begin(), existing.end(),
98 std::inserter(missing, missing.begin()));
99
100 if (!missing.empty()) {
101 std::stringstream message;
102 message << "Branches missing from event tree: ";
103 for (const auto& name : missing) {
104 message << name << ", ";
105 }
106 throw std::runtime_error(message.str());
107 }
108 }
const std::set< std::string > & getBranchNames(bool persistent=false)
Return a set of branch names for either the event or the persistent tree.
◆ getBranchNames()
| const std::set< std::string > & getBranchNames |
( |
bool |
persistent = false | ) |
|
Return a set of branch names for either the event or the persistent tree.
Definition at line 59 of file RootFileInfo.cc.
60 {
61
63
64 if (!cache) {
66 std::set<std::string> result;
67 for (const TObject* obj : * (tree.GetListOfBranches())) {
68 const auto* branch = dynamic_cast<const TBranch*>(obj);
69 if (!branch) throw std::runtime_error("Entry in list of branches is no branch");
70 result.emplace(branch->GetName());
71 }
72
73 cache.emplace(std::move(result));
74 }
75
76 return *cache;
77 }
std::optional< std::set< std::string > > m_persistentBranches
Cached set of persistent branch names.
std::optional< std::set< std::string > > m_eventBranches
Cached set of event branch names.
◆ getEventTree()
Return a reference to the event tree.
Definition at line 42 of file RootFileInfo.h.
◆ getFileMetaData()
Return the event metadata from the file.
On the first call it will be read from the persistent tree. If this fails a std::runtime_error is thrown.
Definition at line 45 of file RootFileInfo.cc.
46 {
48
49 FileMetaData* metadata{nullptr};
50 auto branchStatus =
m_persistent->SetBranchAddress(
"FileMetaData", &metadata);
51 if (branchStatus < 0) throw std::runtime_error("Error retrieving FileMetaData branch: " + std::to_string(branchStatus));
52 if (
m_persistent->GetEntry(0) <= 0 || !metadata)
throw std::runtime_error(
"Cannot read FileMetaData");
53
55 }
57 }
std::unique_ptr< FileMetaData > m_metadata
Pointer to the file metadata once it has been read.
◆ getNtupleBranchNames()
| const std::set< std::string > getNtupleBranchNames |
( |
std::string |
treeName | ) |
|
Return a set of branch names residing in the passed tree.
Definition at line 79 of file RootFileInfo.cc.
80 {
81 std::set<std::string> branches;
82 auto* tree =
dynamic_cast<TTree*
>(
m_file->Get(treeName.c_str()));
83 for (const TObject* obj : * (tree->GetListOfBranches())) {
84 const auto* branch = dynamic_cast<const TBranch*>(obj);
85 if (!branch) throw std::runtime_error("Entry in list of branches is no branch");
86 branches.emplace(branch->GetName());
87 }
88 return branches;
89 }
◆ getPersistentTree()
| TTree & getPersistentTree |
( |
| ) |
|
|
inline |
Return a reference to the persistent tree.
Definition at line 40 of file RootFileInfo.h.
◆ getTreeNames()
| const std::set< std::string > getTreeNames |
( |
| ) |
|
Return a set of event tree names in the file.
Definition at line 110 of file RootFileInfo.cc.
111 {
112 std::set<std::string> treeNames;
113 TList* keylist =
m_file->GetListOfKeys();
114 TIter next(keylist);
115 while (auto&& key = next()) {
116 if (strcmp(key->GetName(), "persistent") != 0) {
117 treeNames.emplace(key->GetName());
118 }
119 }
120 return treeNames;
121 }
◆ m_eventBranches
| std::optional<std::set<std::string> > m_eventBranches |
|
private |
◆ m_events
| std::unique_ptr<TTree> m_events |
|
private |
◆ m_file
| std::unique_ptr<TFile> m_file |
|
private |
◆ m_metadata
Pointer to the file metadata once it has been read.
Definition at line 65 of file RootFileInfo.h.
◆ m_persistent
| std::unique_ptr<TTree> m_persistent |
|
private |
◆ m_persistentBranches
| std::optional<std::set<std::string> > m_persistentBranches |
|
private |
Cached set of persistent branch names.
Definition at line 67 of file RootFileInfo.h.
The documentation for this class was generated from the following files: