从单独的文件中读取树
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::Open
比 new TFile
更推荐,因为它也可以处理非本地文件,请参阅评论 https://root.cern/doc/master/classTFile.html#ad0377adf2f3d88da1a1f77256a140d60。这不会给你带来任何好处,但是被认为是好的做法。)
我正在使用 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::Open
比 new TFile
更推荐,因为它也可以处理非本地文件,请参阅评论 https://root.cern/doc/master/classTFile.html#ad0377adf2f3d88da1a1f77256a140d60。这不会给你带来任何好处,但是被认为是好的做法。)