我需要从一个目录中汇总数千个直方图

I need to sum up thousands of histograms from one directory

我有一个包含数千个 hists*****_blinded.root 文件的目录 Processed_Data。每个 hists*****_blinded.root 包含大约 15 个图表和直方图。我的目标只是从每个文件中重叠 1 个特定的直方图 sc***** 以获得最终的直方图 finalhists_blinded.root,它将代表所有重叠在一起的直方图。

我试过下面的宏:

void final()
{
   TCanvas *time = new TCanvas("c1","overlap" ,600,1000);
   time ->Divide(1,1);
   time ->cd(1);

   TH1F *h1 = new TH1F("h1","time" ,4096,0,4096);
   ifstream in;
   Float_t t;
   Int_t nlines= 0;
   in.open("Processed_Data", ios::in);
   while (1) {
      in >> t;
      if (!in.good()) break;
      h1->Fill(t);
      nlines++;
   }
   in.close();

但我最后得到的是空白 canvas。思路是通过代码对每个运行个hists个文件,逐一相加。

因此,我希望看到所有这些 sc***** 直方图重​​叠,这样每个直方图中的峰值都会在 finalhists_blinded.root 文件中创建一个模式。

应该没那么复杂,试试这个:

void overlap()
{
        TCanvas *time = new TCanvas("c1", "overlap", 0, 0, 800, 600);

        const char* histoname = "sc";

        const int NFiles = 100000;
        for (int fileNumber = 0; fileNumber < NFiles; fileNumber++)
        {
                TFile* myFile = TFile::Open(Form("Processed_Data/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();
        }
}

它遍历所有 Processed_Data/histsXXXXXi_blinded.root 个文件(鉴于它们的名称是 Processed_Data/hists0_blinded.rootProcessed_Data/hists1_blinded.rootProcessed_Data/hists2_blinded.root、...、Processed_Data/hists99998_blinded.rootProcessed_Data/hists99999_blinded.root), 打开它们中的每一个,抓取一维 sc 直方图,将其添加到 canvas,关闭文件并移动到下一个文件。