我需要从一个目录中汇总数千个直方图
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.root
、Processed_Data/hists1_blinded.root
、Processed_Data/hists2_blinded.root
、...、Processed_Data/hists99998_blinded.root
、Processed_Data/hists99999_blinded.root
), 打开它们中的每一个,抓取一维 sc
直方图,将其添加到 canvas,关闭文件并移动到下一个文件。
我有一个包含数千个 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.root
、Processed_Data/hists1_blinded.root
、Processed_Data/hists2_blinded.root
、...、Processed_Data/hists99998_blinded.root
、Processed_Data/hists99999_blinded.root
), 打开它们中的每一个,抓取一维 sc
直方图,将其添加到 canvas,关闭文件并移动到下一个文件。