根 - 填充失败分支:内存驻留树

Root - failed filling branch : memory-resident tree

本文关键字:内存 分支 填充 失败      更新时间:2023-10-16

我正在尝试合并树:

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);

但是我收到此错误,这是悄悄明确的:

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(...)

但是我在 for 循环中的 TTree 之前创建 TFile,所以我不明白。有人有想法吗?

您看到的错误消息来自您正在写入的TTree。据我了解您的代码,TFile *file_adressTTree *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;