9#include <framework/io/RootFileInfo.h>
10#include <framework/io/RootIOUtilities.h>
11#include <framework/dataobjects/FileMetaData.h>
12#include <framework/datastore/DataStore.h>
21 TDirectory::TContext directoryGuard;
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");
26 auto getTree = [&file = this->
m_file](
const std::string & label,
const std::string & name, std::unique_ptr<TTree>& destination) {
28 file->GetObject(name.c_str(), tmp);
29 if (!tmp)
throw std::runtime_error(
"No " + label +
" tree found");
30 destination.reset(tmp);
35 auto isNtuple = description.find(
"isNtupleMetaData");
36 if ((isNtuple == description.end()) || (isNtuple->second !=
"True")) {
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));
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");
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());
73 cache.emplace(std::move(result));
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());
96 std::vector<std::string> missing;
97 std::set_difference(required.begin(), required.end(), existing.begin(), existing.end(),
98 std::inserter(missing, missing.begin()));
100 if (!missing.empty()) {
101 std::stringstream message;
102 message <<
"Branches missing from event tree: ";
103 for (
const auto& name : missing) {
104 message << name <<
", ";
106 throw std::runtime_error(message.str());
112 std::set<std::string> treeNames;
113 TList* keylist =
m_file->GetListOfKeys();
115 while (
auto&& key = next()) {
116 if (strcmp(key->GetName(),
"persistent") != 0) {
117 treeNames.emplace(key->GetName());
@ 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 std::set< std::string > getTreeNames()
Return a set of event tree names in the file.
const FileMetaData & getFileMetaData()
Return the event metadata from the file.
std::unique_ptr< TTree > m_events
Pointer to the event tree.
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 branch...
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::unique_ptr< TFile > m_file
Pointer to the file object.
std::optional< std::set< std::string > > m_eventBranches
Cached set of event branch names.
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.
const std::set< std::string > getNtupleBranchNames(std::string treeName)
Return a set of branch names residing in the passed tree.
std::unique_ptr< TTree > m_persistent
Pointer to the persistent tree.
const std::set< std::string > & getBranchNames(bool persistent=false)
Return a set of branch names for either the event or the persistent tree.
Some constants and helpers common to the RootInput and RootOutput modules.
const std::string c_treeNames[]
Names of trees.