从ROOT(cern)使用AddFriend时出现“非法指针”错误

时间:2015-07-09 10:00:30

标签: c++ pointers tree root-framework

目的; 我希望比较具有相同结构的两个ROOT TTree个对象的内容(但显然不是相同的内容)。最好的方法是使用AddFriend

问题; 我收到此错误消息;

Error: illegal pointer to class object t3 0x0 1681  makeFriends.C:6:
*** Interpreter error recovered ***

到目前为止我尝试了什么; 成功运行this page底部的示例后,我决定将其简化为阅读和朋友添加部分,因为我已在第一次运行中创建了tree3.roottree3f.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.rootDNMaskOutput.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");
}

上面给出了错误。我不明白为什么这些事情表现得很差劲?为什么他们不能只是朋友?

2 个答案:

答案 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添加对返回值的显式检查。如果文件稍后更改,程序将再次开始崩溃。