从单独的文件中读取树

Reading a Tree from a Separate File

我正在使用 C++ 和 ROOT。 我在单独的 .C file/code(称为 tree_ex1.c)中创建了一个简单的树,我试图获取该树的内容并在另一个 .C 文件(称为 tree_ex2.c 中绘制直方图). 我希望使用 tree_ex1.c 如果我绘制树中变量之一的直方图,它将与我用第二个 .C 文件 tree_ex2.c[=11= 绘制的直方图相同]

在我的 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();

}

是什么导致了这个问题?

我认为您在发布的代码中将 Branch 误认为是 SetBranchAddress。 Branch 的文档说(例如 https://root.cern/doc/master/classTTree.html#ab47499eeb7793160b20fa950f4de716a) "Add a new branch". While you want to read from an existing branch. 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::Opennew TFile 更推荐,因为它也可以处理非本地文件,请参阅评论 https://root.cern/doc/master/classTFile.html#ad0377adf2f3d88da1a1f77256a140d60。这不会给你带来任何好处,但是被认为是好的做法。)