0

我正在使用 PyROOT 尝试遍历文件夹中的文件,获取所有文件中存在的特定直方图(最小测试中的两个)并在同一个画布中绘制所有直方图。我仅使用两个直方图运行的最小示例如下。

import ROOT
import os

inputDir = "inputExample/"
outputDir =  "outputExample/"

c1 = ROOT.TCanvas('c1', 'c1')
for filename in os.listdir(inputDir):
    inputFile = ROOT.TFile.Open(inputDir+filename)
    hist = inputFile.Get("variables/Method_BDT/BDT/MVA_BDT_trainingRejBvsS")
    if filename == "first.root":
        hist.Draw("")
    else:
        hist.Draw("SAME")

c1.SaveAs(outputDir+"Superimposed.png")

我不明白为什么只保存第二个直方图。这是另一个最小的示例,我希望它是等效的并且可以正常工作(我在同一个画布上绘制了两个直方图)。

import ROOT

inputDir = "inputExample/"
outputDir =  "outputExample/"

c1 = ROOT.TCanvas('c1', 'c1')
inputFile1 = ROOT.TFile.Open(inputDir+"first.root")
hist = inputFile1.Get("variables/Method_BDT/BDT/MVA_BDT_trainingRejBvsS")
hist.Draw("")
inputFile2 = ROOT.TFile.Open(inputDir+"second.root")
hist = inputFile2.Get("variables/Method_BDT/BDT/MVA_BDT_trainingRejBvsS")
hist.Draw("SAME")

c1.SaveAs(outputDir+"Superimposed.png")
4

1 回答 1

0

我怀疑您遇到了对象所有权和 python 和 root 之间的垃圾收集器的问题。在第二个示例中,当调用 c1.SaveAs 时,所有对象仍然存在于内存中。在第一个示例中,对 hist 和 inputFile 的引用是在循环内创建的,因此当您进行第二次迭代时,它们的引用超出了范围。

一般来说,尝试使用循环为 pyroot 中的绘图创建对象是令人担忧的。制作一个 THStack 并用您要绘制的直方图的克隆填充它通常可以规避原始对象内存不足的问题。

于 2021-11-16T13:55:02.957 回答