重叠数百个直方图宏问题

Overlap hundreds of histograms macro question

我有一个目录 trial,其中包含数百个直方图和一个宏。每个都以 hists09876_blinded.roothists12365_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++ 中读取目录内容的示例,请参见这些链接:

在阅读了关于几乎相同问题的多个帖子后(, , 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();
    }
}