c++ - Cern ROOT - 如何将 TTree 根文件中的内容读入数组

标签 c++ root-framework

我正在尝试从 Cern ROOT TTree 文件中读取数据。我以前没有使用过 root,为此我有点挣扎。我熟悉 C++,因此可以对事物的数组方面进行排序,但我已经在线浏览了几个教程页面,但一无所获。

如何从 TTree 文件中读取数据?我假设这将通过在 for 循环内遍历树的节点(同样,我不确定文件的组织方式?)来完成?

这是我一直试图遵循的那种引用示例。

https://root.cern.ch/drupal/content/using-macro-read-ttree

据我了解,这是一个通用问题,但 TTree 不是通用问题吗? (因为它们可能包含不同的变量名,我想?)

因此,我认为重要的进一步信息是:

通过打开根对象浏览器 TBrowser b - 并浏览到“.root”文件(并双击它),我可以看到文件中有 12 个变量。比如一个叫做'mass', 'charge'等等...

希望这些信息足够了?如果没有,我可以提供更多。

最佳答案

此页面似乎很好地展示了如何做到这一点:https://root.cern.ch/root/htmldoc/TTreeReader.html

您的案例的最短用法示例是:

TFile file("filename.root");
TTreeReader reader("treename", &file);
TTreeReaderValue<float> mass(reader, "mass"); // template type must match datatype
TTreeReaderValue<float> charge(reader, "charge"); // name must match branchname
...
while (reader.Next()) {
    // use *mass, *charge, ...
}

在过去, 曾经有一种更手动的方式来做同样的事情。您必须将树的分支重定向到局部变量。这个方法看起来像这样:

TTree* tree = (TTree*) file.Get("treename");
float mass, charge, ...;
tree->SetBranchAddress("mass", &mass);
tree->SetBranchAddress("charge", &charge);
...
for (int i = 0, N = tree->GetEntries(); i < N; ++i) {
    tree->GetEntry(i);
    // use mass, charge
}

您可以从 TBrowser 中读取您需要作为第二个参数提供给 TTreeReaderValueSetBranchAddress 的分支名称。

基本上,您应该将 TTree 视为条目的集合(经典的)。每个条目都由分支(节点)组成。这就是您阅读它的方式。

关于c++ - Cern ROOT - 如何将 TTree 根文件中的内容读入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28329457/

相关文章:

c++ - 没有用于调用“boost::property_tree::ptree_bad_data::ptree_bad_data()”的匹配函数

c++ - 关于 C++ 中临时对象的确切销毁时间的问题

c++ - 使用 Cern ROOT 绘图

python - PyROOT 是如何改变 python 解释器的?

python - 在 PyRoot 中声明一个 TTree 分支

c++ - 在 ROOT 中迭代绘制 TEllipse

c++ - 为什么 TCanvas 在 root shell 中执行宏时不绘制?

C++ 奇怪的行为

c++ - 如何创建队列数组?

c++ - 如何在 POCO C++ 库中正确使用 OpenSSL