c++ - Root - failed filling branch : memory-resident tree
问题描述
I am trying to merge trees doing :
string filename_;
TList *list = new TList;
///Loop on all .root output files
for (int i = 1; i < 13; ++i) {
string filename_ = "file_";
string file_extension = ".root";
stringstream ss;
ss << i;
string str = ss.str();
filename_ = filename_+str+file_extension;
const char* c_filename = filename_.c_str();
TFile *file_adress = TFile::Open(c_filename);
TTree *tree_adress = (TTree*)file_adress->Get("pulses");
list->Add(tree_adress);
}
// Output tree:
TTree *TPulses = TTree::MergeTrees(list);
But I am getting this error, which is quietly explicite :
Error in <TTree::Fill>: Failed filling branch:pulses.pulse_time, nbytes=-1, entry=115710
This error is symptomatic of a Tree created as a memory-resident Tree
Instead of doing:
TTree *T = new TTree(...)
TFile *f = new TFile(...)
you should do:
TFile *f = new TFile(...)
TTree *T = new TTree(...)
But I am creating the TFile before the TTree in the for loop, so I don't understand. Does someone have an idea ?
解决方案
您看到的错误消息来自TTree
您正在写入的内容。据我了解您的代码,TFile *file_adress
andTTree *tree_adress
被打开以供阅读,而您写入TTree *TPulses
. 我没有看到TFile::Open
(如果它是READ
用于只读或update
用于操作内容)的默认设置,但从您的输出中我声称TPulses
不会在您打开的最后一个文件中创建,而是在 RAM 中创建并且您用完了(请参阅文档)。一个常见的模式是在创建之前创建一个输出文件TPulses
:
TFile* outputfile = TFile::Open("output.root", "recreate");
TTree* TPulses = TTree::MergeTrees(list);
// ...
TPulses->Write();
outputfile->Close();
delete outputfile;
推荐阅读
- python - 在多个 AWS Lambda 中处理相同的函数名称
- python - 如何构建 Jupyter Notebook 页面以访问远程分子动力学结果?
- swift - 如何在 SwiftUI 中正确呈现弹出视图(而不是作为工作表)?
- docker - 如何在 Docker-Compose 中使用卷?
- reactjs - 是否有必要向 facebook API 发出任何请求,以便创建一个反应网站
- vue.js - 使用 Cypress 和 Quasar 的 Github Actions
- html - 如何仅将 css 网格中的一个项目向右对齐?
- java - Kafka Streams API 仅在新事件到达后将旧值推送到主题
- c# - 存储库调用在 .Net core 3.1 中引发错误
- c# - 在 c# 中使用 Titanium.Web.Proxy 重定向到另一个代理时出现问题