重叠数百个直方图宏问题

时间:2019-07-09 06:17:17

标签: c++ root-framework

我有一个目录trial,其中包含数百个直方图和一个宏。每个方法都以hists09876_blinded.roothists12365_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();
        }
}

2 个答案:

答案 0 :(得分:0)

由于预计某些文件“丢失”,因此建议不要尝试猜测实际存在的文件的名称。而是使用列出给定目录中所有文件的功能,然后从该列表中过滤出与要读取的文件模式匹配的那些文件。例如,请参见以下链接,了解如何在C ++中读取目录的内容:

答案 1 :(得分:0)

在阅读了几乎相同的问题(12和这个问题)的多个帖子后,我发现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();
    }
}