0

我有一个Processed_Data包含数千个hists*****_blinded.root文件的目录。每个都hists*****_blinded.root包含大约 15 个图表和直方图。我的目标只是sc*****从每个文件中重叠 1 个特定的直方图,以获得最终的直方图,该直方图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();

但我最后得到了空白画布。这个想法是hists通过代码运行每个文件并逐个添加。

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

4

1 回答 1

1

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

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.root, Processed_Data/hists1_blinded.root, Processed_Data/hists2_blinded.root, ..., Processed_Data/hists99998_blinded.root, Processed_Data/hists99999_blinded.root),打开每个文件,获取一维sc直方图,将其添加到画布,关闭文件并移动到下一个文件。

于 2019-07-03T11:11:33.477 回答