我有一个目录trial
,其中包含数百个直方图和一个宏。每个方法都以hists09876_blinded.root
或hists12365_blinded.root
的方式调用。但是,顺序并非如此。有些hists10467_blinded.root
hists10468_blinded.root
hists10470_blinded.root
之类的Missig直方图。最终目标是在画布上获得一个直方图,该直方图代表所有组合在一起的直方图。棘手的是,每个hists*****_blinded.root
中都包含大约15个1D历史数据,我只需要从每个sc*****
中提取一个。
我有2个想法,但我想我应该将它们结合在一起以获得最终结果。
第一个想法是先按histo打开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();
}
}
答案 0 :(得分:0)
由于预计某些文件“丢失”,因此建议不要尝试猜测实际存在的文件的名称。而是使用列出给定目录中所有文件的功能,然后从该列表中过滤出与要读取的文件模式匹配的那些文件。例如,请参见以下链接,了解如何在C ++中读取目录的内容:
答案 1 :(得分:0)
在阅读了几乎相同的问题(1,2和这个问题)的多个帖子后,我发现my answer here出了什么问题:我不知道如果文件名中的数字<10000,则文件名可能包含零。另外,我无法理解直方图名称中的星号(您称为sc*****
)实际上隐藏了与文件名!我认为这是完全不同的东西。因此,在这种情况下,我建议您在相同循环中构造文件名和直方图名称:
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();
}
}