Пересекаются сотни гистограмм макроса вопроса - PullRequest
0 голосов
/ 09 июля 2019

У меня есть каталог trial, в котором содержатся сотни гистограмм и макрос.Каждый называется так: hists09876_blinded.root или hists12365_blinded.root.Порядок, однако, не такой.Есть несколько неправильных гистограмм, таких как hists10467_blinded.root hists10468_blinded.root hists10470_blinded.root.Конечная цель состоит в том, чтобы получить одну гистограмму на холсте, которая представляет все те, которые объединены вместе.Хитрость заключается в том, что в каждом hists*****_blinded.root содержится около 15 одномерных гистосов, мне нужно вытащить только по одному из каждого, называемого sc*****.

У меня есть 2 идеи, но я думаю, что мне следует объединить их вместечтобы получить окончательный результат.

Первая идея состояла в том, чтобы открыть гисто с помощью гисто, но поскольку в заказе есть некоторые пропущенные гистосы, это не работает.

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 голосов
/ 09 июля 2019

Прочитав несколько постов по одному и тому же вопросу ( 1 , 2 и этот), я выяснил, что не так с моим ответом здесь : я не знал, что имя файла может содержать ноль, если число в его имени <10000. Кроме того, мне не удалось понять, что звездочки в имени гистограммы, которое вы называете <code>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();
    }
}
0 голосов
/ 09 июля 2019

Поскольку ожидается, что некоторые файлы «отсутствуют», я предлагаю не пытаться угадать имена файлов, которые на самом деле существуют. Вместо этого используйте функцию, которая выводит список всех файлов в данном каталоге и из этого списка отфильтровывает те файлы, которые соответствуют шаблону файлов, которые вы хотите прочитать. Смотрите, например, эти ссылки для того, чтобы прочитать содержимое каталога в C ++:

...