Чтение дерева из отдельного файла - PullRequest
0 голосов
/ 11 февраля 2020

Я работаю с C ++ и ROOT. Я создал простое дерево в отдельном файле / коде. C (он называется tree_ex1. c), и я пытаюсь получить содержимое этого дерева и построить гистограмму в другом файле. C (он называется tree_ex2. c). Я ожидаю, что при использовании tree_ex1. c, если я построю гистограмму одной из переменных в дереве, это будет та же самая гистограмма, которую я построил бы со вторым файлом. C, tree_ex2. c

В моем файле tree_ex1. c я создал простое дерево и построил гистограмму одной из ветвей дерева. Я могу получить гистограмму от tree_ex1. c. Затем в моем файле tree_ex2. c я пытаюсь вызвать содержимое моего дерева в первом файле для построения той же переменной. Однако моя гистограмма из tree_ex2. c выглядит не так.

Ниже моя попытка. Я получаю сюжет, который в основном выглядит пустым. Количество записей равно 10000, но среднее значение и стандартное отклонение равно 0.

void tree_ex2()
{ 


  //Filling Histograms
  //TH1F *hist = new TH1F("hist", "", 100, 0., 2.); (worked)
  TH2F *h_pxpy = new TH2F("h_pxpy", "py Vs px", 100, -2.0, 2.0, 100, -2.0, 2.0);
  TH1F *h_pt = new TH1F("h_pt", "pt", 100, 0., 5.0);


  TFile *f = new TFile("new.root"); //new.root is name of file that was "RECREATED" in tree_ex1
  //TFile *f = TFile::Open("new.root"); 
  TTree *tree1 = (TTree*) f->Get("T"); 
    //Set up the variables
  Float_t px, py, pz, pt;
  Double_t random;
  Int_t i;

    //Set Variables to Tree's Branches

  tree1->Branch("px", &px);
  tree1->Branch("py", &py);
  tree1->Branch("pz", &pz);
  tree1->Branch("pt", &pt);
  tree1->Branch("random", &random);

  Int_t nentries = (Int_t)tree1->GetEntries();

  for (i = 0; i < 10000; i++)
  {
    tree1->GetEntry(i);

    h_pxpy->Fill(px, py);
    h_pt->Fill(pt);
  }

  TCanvas *c1 = new TCanvas();
  h_pxpy->Draw("colz");
  //c1->SaveAs("tree_example2_pxpy.png");

  TCanvas *c2 = new TCanvas();
  //c1->Update();
  h_pt->Draw();
  //c2->SaveAs("tree_example2_pt.png");

  //f->Write();
  f->Close();

}

Что вызывает эту проблему?

1 Ответ

1 голос
/ 02 марта 2020

Я полагаю, что вы ошиблись Branch за SetBranchAddress в коде, который вы разместили. Документация Branch говорит (например, https://root.cern/doc/master/classTTree.html#ab47499eeb7793160b20fa950f4de716a) «Добавить новую ветку». Пока вы хотите читать из существующей ветки. https://root.cern/doc/master/classTTree.html#a39b867210e4a77ef44917fd5e7898a1d.

Поэтому я думаю, что если вы замените

  tree1->Branch("px", &px);
  tree1->Branch("py", &py);
  tree1->Branch("pz", &pz);
  tree1->Branch("pt", &pt);
  tree1->Branch("random", &random);

на

  tree1->SetBranchAddress("px", &px);
  tree1->SetBranchAddress("py", &py);
  tree1->SetBranchAddress("pz", &pz);
  tree1->SetBranchAddress("pt", &pt);
  tree1->SetBranchAddress("random", &random);

Это должно дать вам желаемый результат.

(не связано, TFile::Open рекомендуется более new TFile, поскольку он также может обрабатывать нелокальные файлы, см. Комментарий https://root.cern/doc/master/classTFile.html#ad0377adf2f3d88da1a1f77256a140d60. Здесь вы ничего не получите, но считается хорошей практикой.)

...