重叠数百个直方图宏问题
Overlap hundreds of histograms macro question
我有一个目录 trial
,其中包含数百个直方图和一个宏。每个都以 hists09876_blinded.root
或 hists12365_blinded.root
的方式调用。然而,顺序不是这样的。有一些 missig 直方图,如 hists10467_blinded.root
hists10468_blinded.root
hists10470_blinded.root
。最终目标是在 canvas 上获得一个直方图,它表示所有这些组合在一起。棘手的是每个 hists*****_blinded.root
中都有大约 15 个 1D histos,我需要从每个名为 sc*****
.
中取出一个
我有2个想法,但我想我应该把它们结合起来得到最终结果。
第一个想法是逐个打开 histo,但由于订单中有一些遗漏的 histos,所以效果不佳。
void overlap()
{
TCanvas *time = new TCanvas("c1", "overlap", 0, 0, 800, 600);
const char* histoname = "sc";
const int NFiles = 256;
for (int fileNumber = 09675; fileNumber < NFiles; fileNumber++)
{
TFile* myFile = TFile::Open(Form("hists%i_blinded.root", fileNumber));
if (!myFile)
{
printf("Nope, no such file!\n");
return;
}
TH1* h1 = (TH1*)myFile->Get(histoname);
if (!h1)
{
printf("Nope, no such histogram!\n");
return;
}
h1->SetDirectory(gROOT);
h1->Draw("same");
myFile->Close();
}
}
由于预计某些文件是"missing",我建议不要尝试猜测实际存在的文件的名称。相反,使用一个函数列出给定目录中的所有文件,并从该列表中过滤出与您要读取的文件模式匹配的文件。有关如何在 C++ 中读取目录内容的示例,请参见这些链接:
- How can I get the list of files in a directory using C or C++?
- http://www.martinbroadhurst.com/list-the-files-in-a-directory-in-c.html
在阅读了关于几乎相同问题的多个帖子后(, , and this one) I have figured out what was wrong with :我不知道如果名称中的数字小于 10000,文件名可能包含零。此外,我未能了解直方图名称中的星号,您称为 sc*****
,实际上隐藏了与文件名中相同的数字!我认为这是完全不同的东西。所以在那种情况下我建议您构造文件名以及您应该在 same 循环中使用的直方图名称:
void overlap_v2()
{
TCanvas *time = new TCanvas("c1", "overlap", 0, 0, 800, 600);
const int firstNumber = 9675;
const int NFiles = 100000;
for (int fileNumber = firstNumber; fileNumber < firstNumber+NFiles; fileNumber++)
{
const char* filename = Form("trial/hists%05i_blinded.root", fileNumber);
TFile* myFile = TFile::Open(filename);
if (!myFile)
{
printf("Can not find a file named \"%s\"!\n", filename);
continue;
}
const char* histoname = Form("sc%05i", fileNumber);
TH1* h1 = (TH1*)myFile->Get(histoname);
if (!h1)
{
printf("Can not find a histogram named \"%s\" in the file named \"%s\"!\n", histoname, filename);
continue;
}
h1->SetDirectory(gROOT);
h1->Draw("same");
myFile->Close();
}
}
我有一个目录 trial
,其中包含数百个直方图和一个宏。每个都以 hists09876_blinded.root
或 hists12365_blinded.root
的方式调用。然而,顺序不是这样的。有一些 missig 直方图,如 hists10467_blinded.root
hists10468_blinded.root
hists10470_blinded.root
。最终目标是在 canvas 上获得一个直方图,它表示所有这些组合在一起。棘手的是每个 hists*****_blinded.root
中都有大约 15 个 1D histos,我需要从每个名为 sc*****
.
我有2个想法,但我想我应该把它们结合起来得到最终结果。
第一个想法是逐个打开 histo,但由于订单中有一些遗漏的 histos,所以效果不佳。
void overlap()
{
TCanvas *time = new TCanvas("c1", "overlap", 0, 0, 800, 600);
const char* histoname = "sc";
const int NFiles = 256;
for (int fileNumber = 09675; fileNumber < NFiles; fileNumber++)
{
TFile* myFile = TFile::Open(Form("hists%i_blinded.root", fileNumber));
if (!myFile)
{
printf("Nope, no such file!\n");
return;
}
TH1* h1 = (TH1*)myFile->Get(histoname);
if (!h1)
{
printf("Nope, no such histogram!\n");
return;
}
h1->SetDirectory(gROOT);
h1->Draw("same");
myFile->Close();
}
}
由于预计某些文件是"missing",我建议不要尝试猜测实际存在的文件的名称。相反,使用一个函数列出给定目录中的所有文件,并从该列表中过滤出与您要读取的文件模式匹配的文件。有关如何在 C++ 中读取目录内容的示例,请参见这些链接:
- How can I get the list of files in a directory using C or C++?
- http://www.martinbroadhurst.com/list-the-files-in-a-directory-in-c.html
在阅读了关于几乎相同问题的多个帖子后(sc*****
,实际上隐藏了与文件名中相同的数字!我认为这是完全不同的东西。所以在那种情况下我建议您构造文件名以及您应该在 same 循环中使用的直方图名称:
void overlap_v2()
{
TCanvas *time = new TCanvas("c1", "overlap", 0, 0, 800, 600);
const int firstNumber = 9675;
const int NFiles = 100000;
for (int fileNumber = firstNumber; fileNumber < firstNumber+NFiles; fileNumber++)
{
const char* filename = Form("trial/hists%05i_blinded.root", fileNumber);
TFile* myFile = TFile::Open(filename);
if (!myFile)
{
printf("Can not find a file named \"%s\"!\n", filename);
continue;
}
const char* histoname = Form("sc%05i", fileNumber);
TH1* h1 = (TH1*)myFile->Get(histoname);
if (!h1)
{
printf("Can not find a histogram named \"%s\" in the file named \"%s\"!\n", histoname, filename);
continue;
}
h1->SetDirectory(gROOT);
h1->Draw("same");
myFile->Close();
}
}