3

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

如何从 TTree 文件中读取数据?我认为这将通过在 for 循环中迭代树的节点来完成(同样,我不确定文件是如何组织的?)?

这是我一直试图遵循的那种参考的例子。

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

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

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

通过打开根对象浏览器TBrowser b并浏览到“.root”文件(并双击它),我可以看到文件中有 12 个变量。例如,一个称为“质量”、“电荷”等......

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

4

1 回答 1

5

这个页面似乎很好地展示了如何做到这一点: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
}

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

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

于 2015-02-04T22:31:32.007 回答