CERN根-根据时间筛选子树的事件时出错
CERN root - error when filtering events for subtree based on time
我之前在官方根目录(CERN)论坛上问过这个问题,但到目前为止这个问题仍未解决。也许这里的任何人都可以帮忙,要么指出我的错误,要么提出一种替代方法?
我有一个事件树;TTree有一个分支,其中包含每个事件的UNIX时间,还有一些其他分支。我想根据时间间隔选择事件的子集,这样我就可以分别分析这些事件。为了进行选择,我创建了另一个树,并在正确的时间间隔内复制所有条目。
以下代码工作得非常好,并将所有事件从树复制到子树:
void tree_time_filter(TTree* tree, TTree** subtree, Int_t time_i, Int_t time_f){
*subtree = tree->CloneTree(0);
Int_t t;
tree->SetBranchAddress("UNIX time", &t);
for(Long64_t i = 0; i<tree->GetEntries(); i++){
tree->GetEntry(i);
if (true)
{
(*subtree)->Fill();
}
}
cout<<"Tree filtered. "<<(*subtree)->GetEntries()<< " entries were selected.n";
return;
}
当我用实际条件替换if(true)时,问题发生了:
void tree_time_filter(TTree* tree, TTree** subtree, Int_t time_i, Int_t time_f){
*subtree = tree->CloneTree(0);
Int_t t;
tree->SetBranchAddress("UNIX time", &t);
for(Long64_t i = 0; i<tree->GetEntries(); i++){
tree->GetEntry(i);
if (t > time_i && t < time_f) //-> the condition
{
(*subtree)->Fill(); //-> this line now gives an error
}
}
cout<<"Tree filtered. "<<(*subtree)->GetEntries()<< " entries were selected.n";
return;
}
我收到错误:"错误:指向类对象子树0x0 3084 c:/….的非法指针。*解释器错误已恢复*"
错误行引用了(*subtree)->Fill(),这与第一个示例中运行良好的代码相同。对于任何不涉及t的条件或任何不引用子树的if体,代码都有效。有人能解释一下这里出了什么问题吗?
谢谢!
(参考原始问题链接:http://root.cern.ch/phpBB3/posting.php?mode=edit&f=3&p=79722)
我认为这是解释器的问题,在我看来是一个bug。
当宏第一次经过(*subtree)->Fill();
时,它没有填充任何内容时,我可以重现您的错误。这很奇怪,因为它没有进入那里,但是。。。
我可以通过做两个循环来解决它:第一个循环循环,直到找到第一个通过剪切的事件,然后停止。第二个,(*subtree)->Fill();
从这个事件开始,确保处理的第一个事件通过了剪切并被填充。
感谢Asen Christov,这里是该函数的工作版本。我把两个for循环放在while循环中,以防事件不按时间顺序排列;这应该有效,但没有经过广泛的测试。我真的不敢相信这是完成这样一项共同任务的最佳方式,所以任何"标准"的方式仍然受到欢迎。
void tree_time_filter(TTree* tree, TTree** subtree, Int_t time_i, Int_t time_f){
*subtree = tree->CloneTree(0);
Int_t t;
tree->SetBranchAddress("UNIX time", &t);
Long64_t i = 0;
while (i < tree->GetEntries())
{
for(i; i<tree->GetEntries(); i++){
tree->GetEntry(i);
if (t > time_i && t < time_f) break;
}
for (i; i<tree->GetEntries(); i++){
tree->GetEntry(i);
(*subtree)->Fill();
if (!(t > time_i && t < time_f)) break;
}
}
cout<<"Tree filtered. "<<(*subtree)->GetEntries()<< " entries were selected.n";
return;
}
- 访问者访问变体并返回不同类型时出错
- 在Linux for Windows上编译C++代码时出错
- 读取文件的最后一行并输入到链接列表时出错
- 重载操作程序时出错>>用于类中的字符串 memebr
- 调用专用模板时出错"no matching function for call to [...]"
- Android NDK传感器向事件队列报告奇怪的间隔
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 在Google Kick start中提交时出错
- 在c++中访问int到类对象的映射时出错
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 分段错误当我试图运行程序时出错
- 使用dynamic_cast和构造函数时出错
- CHECK(调用)函数在Google Colab中出错
- 用pybind11包装C++抽象类时出错
- 在 Qt 中将 x 可执行文件作为按钮事件运行时出错
- 将事件处理程序添加到任何控件都会导致 Visual Studio 中出错
- CERN根-根据时间筛选子树的事件时出错