Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Cern ROOT-如何将TTree根文件中的内容读取到数组中_C++_Root Framework - Fatal编程技术网

C++ Cern ROOT-如何将TTree根文件中的内容读取到数组中

C++ Cern ROOT-如何将TTree根文件中的内容读取到数组中,c++,root-framework,C++,Root Framework,我正在尝试从Cern根TTree文件中读取数据。我以前没有使用过root,我正在努力解决这个问题。我对C++很熟悉,所以可以对数组的边排序,但是我已经通过了几个教程网页,没有任何地方。 如何从TTree文件中读取数据?我假设它可以通过在for循环中遍历树的节点来完成(同样,我也不确定文件是如何组织的?) 下面是一个我一直试图遵循的参考的例子 据我所知,这是一个通用的问题,但TTree不是通用的?(因为它们可能包含不同的变量名,我想?) 因此,我认为重要的进一步信息是: 通过打开根对象浏览器TB

我正在尝试从Cern根TTree文件中读取数据。我以前没有使用过root,我正在努力解决这个问题。我对C++很熟悉,所以可以对数组的边排序,但是我已经通过了几个教程网页,没有任何地方。 如何从TTree文件中读取数据?我假设它可以通过在for循环中遍历树的节点来完成(同样,我也不确定文件是如何组织的?)

下面是一个我一直试图遵循的参考的例子

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

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

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


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

本页似乎很好地展示了如何做到这一点:

对于您的案例,最短的使用示例是:

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, ...
}
t文件文件(“filename.root”);
t阅读器(“treename”和文件);
t读卡器值质量(读卡器,“质量”);//模板类型必须与数据类型匹配
t读卡器价值收费(读卡器,“收费”);//名称必须与branchname匹配
...
while(reader.Next()){
//使用*质量,*电荷。。。
}
在过去,做同样的事情有一种更为手工的方式。必须将树的分支重定向到局部变量。此方法如下所示:

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
}
TTree*tree=(TTree*)file.Get(“treename”);
浮子质量、电荷等。。。;
树->地址(“质量”、&mass);
树->地址(“费用”和费用);
...
对于(inti=0,N=tree->GetEntries();i获取条目(i);
//使用质量、电荷
}
从TBrowser中,您可以读取需要作为第二个参数提供给
TTreeReaderValue
SetBranchAddress
的分支名称


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

如何使用质量和电荷等?例如,我将如何计算while循环中的值?所有内容都写在答案中:当你在变量周围创建一个
TTreeReaderVaue
包装器时,你可以像使用指针一样使用它:
cout可能是变量(质量/电荷)需要
double
而不是
float
。哦,是的,现在似乎正在工作,使用了第二种方法。谢谢你的帮助-我将不得不等到下周末再做这项工作,因为我已经落后于其他工作,所以我会更新,希望在不久的将来更新投票并接受。再次感谢您的打字安全。使用<代码> StRealChanLoad < /Cord>根无法验证在传递给它的地址上是否有足够的空间,当出错时可以很容易地进行分段。如果下面的答案解决了您的问题,请考虑将其标记为接受。它不能解决问题,因此我不会将其标记为接受。谢谢你的关心。它解决不了你的问题吗?它解决不了问题。这就是它不能解决问题的方式。我的意思是,如果你能更具体地说明你的问题,我也许能帮上忙:)。我经常使用这两种方法,它们通常效果很好。