Cern ROOT - Как прочитать содержимое из корневого файла TTree в массив
Я пытаюсь прочитать данные из файла Cern ROOT TTree. Я раньше не использовал root и с этим немного борюсь. Я знаком с C++, поэтому могу разбираться со стороной массива, но я пролистал несколько страниц с учебниками онлайн и никуда не попал.
Как я могу прочитать данные из файла TTree? Я предполагаю, что это будет сделано путем перебора узлов дерева (опять же, я не совсем уверен, как организован файл?) Внутри цикла for?
Вот пример той ссылки, которой я пытался следовать.
https://root.cern.ch/drupal/content/using-macro-read-ttree
Насколько я понимаю, это общий вопрос, но TTree не являются общими? (Так как они могут содержать разные имена переменных, я думаю?)
Итак, дальнейшая информация, которую я считаю важной:
Открыв браузер корневых объектов TBrowser b
- и, просматривая файл '.root' (и дважды щелкнув по нему), я вижу, что в файле 12 переменных. Например, один называется "масса", "заряд" и т. Д.
Надеюсь, этого достаточно? Если нет, я могу предоставить больше.
1 ответ
Эта страница, кажется, хорошо показывает, как это можно сделать: 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
}
Из TBrowser вы можете прочитать названия веток, которые вам нужно указать в качестве второго параметра для TTreeReaderValue
или же SetBranchAddress
,
В основном вы должны думать о TTree
как коллекция записей (классические деревья). Каждая из записей состоит из ветвей (узлов). Вот как ты это читаешь.