我正在尝试从Cern ROOT TTree文件中读取数据。我之前没有使用root,而且我正在努力解决这个问题。我熟悉C ++,所以可以对数组方面进行排序,但是我已经在线浏览了几个教程页面并且没有任何地方。
如何从TTree文件中读取数据?我假设它会通过在for循环中迭代树的节点(再次,我不确定文件是如何组织的?)来完成的?
这是我一直试图遵循的那种参考的例子。
https://root.cern.ch/drupal/content/using-macro-read-ttree
据我所知,这是一个通用的问题,但是TTree不是通用的吗? (因为它们可能包含不同的变量名称,我想?)
因此,我认为重要的进一步信息是:
打开根对象浏览器TBrowser b
- 并浏览到'.root'文件,(并双击它)我可以看到文件中有12个变量。例如,一个被称为'质量','充电'等......
希望有足够的信息?如果没有,我可以提供更多。
答案 0 :(得分:4)
此页面似乎很好地展示了如何做到这一点: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, ...
}
在 olden 日,曾经有过一种更简洁的方法来做同样的事情。您必须将树的分支重定向到本地变量。此方法如下所示:
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中读取您需要提供的分支的名称,作为TTreeReaderValue
或SetBranchAddress
的第二个参数。
基本上,您应该将TTree
视为条目集合(经典树)。每个条目都由分支(节点)组成。这就是你读它的方式。