1

我选择在这里问一个问题,我很清楚我可能会违反 StackExchange 的一些规则,因为这不是问这个问题的正确地方,但我看到了很多与 CERN ROOT 相关的问题。我知道在这里回答问题的人更喜欢展示方法而不是给出一个成熟的解决方案,但我需要一些帮助,我没有时间从答案中学习,我只想要我的问题的解决方案。我提前道歉!

这是我的问题:我有两个 .root 文件:

  • 频谱之一(“sezione_misura_90.root”),
  • 一个来自背景(“sezione_fondo_90.root”)。

我必须从第一个中减去第二个并得到最终的直方图。通常我用 TBroswer 打开文件,我不知道如何实现脚本的宏来打开 .root 文件或做其他所有事情,首先因为我讨厌 ROOT 和所有与编程相关的东西,而且我只有一门课程我应该在哪里使用它,没有人告诉我怎么用!!!即使是教授。不知道怎么用...

如果某个阅读者有一个可以使用的宏或脚本,我将永远感谢他与我分享。提前致谢!

编辑 我用以下几行写下一个名为 run.cxx 的文件

诠释运行(){

// Open both files side-by-side
TFile* sezione_misura_90 = new TFile("sezione_misura_90.root");
TFile* sezione_fondo_90 = new TFile("sezione_fondo_90.root");

// Get the histograms from the file
// Since you didn't say from your post, I'm going to assume that
// the histograms are called "hist" and that they hold floating
// point values (meaning, they're TH1F histograms.  The "F" means float)

TH1F* h_misura = (TH1F*) sezione_misura_90->Get("hist");
TH1F* h_fondo = (TH1F*) sezione_fondo_90->Get("hist");

// Now we add them together
TH1F* h_sum = h_misura->Add(*h_fondo, -1);

有一些错别字,例如 ( 和 ;,我更正了它们,但我得到了以下内容。

错误:指向类对象 h_misura 0x0 139 run.cxx:21 的非法指针: ** 解释器错误已恢复 **

4

2 回答 2

0

我看到至少两个问题。一个问题与 ROOT 管理内存的方式有关,更具体地说是内存中的 ROOT 对象:

// Each ROOT object derives from a TNamed class, 
// hence has a <name>, which ROOT uses internally 
// to keep track of the objects
TH1F* h_misura = (TH1F*) sezione_misura_90->Get("hist");
// now you have a histogram named "hist" in memory; 
//btw, better to name it something more unique, e.g. hist1, at least
TH1F* h_fondo = (TH1F*) sezione_fondo_90->Get("hist");
// And now, you are trying to get another histogram named "hist",
// which creates a problem: Two different histograms with the same
// name - you can't do that.
// At the very least ROOT is going to overwrite the first hist 
// and replace it with the second, or bug out

解决问题一:

// Rename the "hist"s to something like "hist1" and "hist2"
TH1F* h_misura = (TH1F*) sezione_misura_90->Get("hist");
h_misura->SetName("hist1");
TH1F* h_fondo = (TH1F*) sezione_fondo_90->Get("hist");
h_fondo->SetName("hist2");
// now, you have to histograms in memory with unique names

问题二:当你打开一个 TFile 时

// TFile * f = new TFile("file.root");

它以只读模式打开它,因此如果要保存直方图的总和,则无法写入它们。而是这样做:

TFile * f = TFile::Open("file.root", "write");
// and do a null pointer check
if (!f) { std::cout << "file not found" << std::endl; exit(1); }
// if you want to save the results to file f
// ...
f->cd();
hist->Write();
f->Close();
于 2013-11-22T17:42:38.543 回答
0

完成此操作的一种简单方法是编写一个脚本,打开这两个文件,从文件中读取直方图,然后减去它们(这与使用因子 -1 相加相同)。这可以使用类似于以下的代码块来完成:

{

// Open both files side-by-side
TFile* sezione_misura_90 = new TFile("sezione_misura_90.root");
TFile* sezione_fondo_90 = new TFile(("sezione_fondo_90.root");

// Get the histograms from the file
// Since you didn't say from your post, I'm going to assume that
// the histograms are called "hist" and that they hold floating
// point values (meaning, they're TH1F histograms.  The "F" means float)

TH1F* h_misura = (TH1F*) sezione_misura_90->Get("hist");
TH1F* h_fondo = (TH1F*) sezione_fondo_90->Get("hist");

// Now we add them together
TH1F* h_sum = h_misura->Add(*h_fondo, -1);

}

此时,h_sum 应该就是你想要的直方图了。您可以将其保存到文件中以供以后阅读,或者如果您正在运行交互式根会话,则可以将其绘制到屏幕上。

可以通过执行以下操作之一来运行上述代码:

  • 只需键入 root 然后键入以上行即可进行交互式 root 会话)
  • 作为根脚本(通过将它们粘贴到一个文件中,例如,可以命名为“file.C”并键入“root file.C”)
  • 一个更大的程序(通过将上述行放在一个函数中并调用该函数)

您可以在 ROOT 的文档中阅读有关直方图可用方法的更多信息: http ://root.cern.ch/root/html/TH1.html#TH1:Add@1

希望有帮助。

于 2013-10-21T16:41:12.610 回答