目的; 我希望比较具有相同结构的两个ROOT TTree个对象的内容(但显然不是相同的内容)。最好的方法是使用AddFriend。
问题; 我收到此错误消息;
Error: illegal pointer to class object t3 0x0 1681 makeFriends.C:6:
*** Interpreter error recovered ***
到目前为止我尝试了什么;
成功运行this page底部的示例后,我决定将其简化为阅读和朋友添加部分,因为我已在第一次运行中创建了tree3.root
和tree3f.root
。所以我有一个名为tree3.C的文件,包含;
// Function to read the two files and add the friend
void tree3r() {
TFile *f = new TFile("tree3.root");
TTree *t3 = (TTree*)f->Get("t3");
// Add the second tree to the first tree as a friend
t3->AddFriend("t3f","tree3f.root");
// Draw pz which is in the first tree and use pt
// in the condition. pt is in the friend tree.
//t3->Draw("pz","pt>5");
}
从根提示符加载(root[] .L tree3.C
)和运行(root[] tree3r()
)时,这按预期工作。
因此,我将副本放在包含我的根文件plainMaskOutput.root
和DNMaskOutput.root
的文件夹中,并更改副本中的字符串以匹配我的文件名。所以我有;
// Function to read the two files and add the friend
void tree3r() {
TFile *f = new TFile("plainMaskOutput.root");
TTree *t3 = (TTree*)f->Get("t3");
// Add the second tree to the first tree as a friend
t3->AddFriend("t3f","DNMaskOutput.root");
// Draw pz which is in the first tree and use pt
// in the condition. pt is in the friend tree.
//t3->Draw("pz","pt>5");
}
上面给出了错误。我不明白为什么这些事情表现得很差劲?为什么他们不能只是朋友?
答案 0 :(得分:1)
问题是plainMaskOutput.root
是文件名,Get()
括号内的字符串是树名。名为plainMaskOutput.root
的文件不包含名称为t3
的树,其中包含名称为HitsTree
的树。所以这条线应该是;
TTree *foo = (TTree*)f->Get("HitsTree");
同样,add friend命令需要将树的名称存储在DNMaskOutput.root
中,但因为它们具有相同的名称,所以应该是aliased;
foo->AddFriend("DNHitsTree = HitsTree","DNMaskOutput.root");
这只是我这次遇到的问题,可能并不总是与此错误相关的问题。我在这方面的知识不足以说出其他问题是可能的。
答案 1 :(得分:1)
事实证明,TFile
方法Get
可能返回null,表示失败。你没有考虑到这一点。为什么它会在你的情况下返回null?
根据我在评论(https://root.cern.ch/phpBB3/viewtopic.php?t=12407)中提供的链接,这是因为您的文件不包含具有您提供的名称的树。
最好从Get
添加对返回值的显式检查。如果文件稍后更改,程序将再次开始崩溃。