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 как коллекция записей (классические деревья). Каждая из записей состоит из ветвей (узлов). Вот как ты это читаешь.

Другие вопросы по тегам