Root - ошибка заполнения ветви: резидентное дерево - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь объединить деревья, выполняя:

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

Но я создаю TFile до TTreeв цикле, так что я не понимаю.У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 31 января 2019

Вы видите сообщение об ошибке от TTree, в которое вы пишете.Насколько я понимаю твой код, TFile *file_adress и TTree *tree_adress открыты для чтения, а ты пишешь в TTree *TPulses.Я не вижу настройки по умолчанию для TFile::Open (если она READ только для чтения или update для управления содержимым), но из вашего вывода я утверждаю, что TPulses не создается в последнем открытом вами файле,а скорее в оперативной памяти, и у вас кончается ( см. документы ).Обычным шаблоном будет создание выходного файла перед созданием TPulses:

TFile* outputfile = TFile::Open("output.root", "recreate");
TTree* TPulses = TTree::MergeTrees(list);
// ...
TPulses->Write();
outputfile->Close();
delete outputfile;
...