python - 将高斯拟合到 ROOT 直方图

标签 python histogram root-framework pyroot

我正在尝试编写一个程序来将几个高斯拟合到 ROOT 直方图,但不幸的是我对 pyROOT 缺乏经验。

我有 Ba133 发射光谱的直方图,并且希望将高斯拟合到峰值,以便我知道所述峰值的 x 轴值,这是为了校准探测器。理想情况下,程序会迭代并找到峰值本身,但我可以自己指定它们。

Ba133 spectrum

目前我唯一的代码是:

import ROOT

infile = ROOT.TFile("run333.root")

Ba_spectrum = infile.Get("hQ0")

Ba_spectrum.Draw()

如果有人可以告诉我如何使用 pyroot 将高斯函数拟合到这些峰值,最好是自动化的,我将不胜感激。

谢谢

最佳答案

鉴于获得合适的拟合结果通常取决于从合理的初始参数值开始,您最好一开始就指定峰值的大致位置。例如,您可以有一个文本文件,其中包含所有明显峰的高度、平均值和宽度的猜测。

16000.0 625.0 25.0
  500.0 750.0 50.0
...

然后像这样运行拟合。

import ROOT

in_file = ROOT.TFile("run333.root")
if not in_file.IsOpen():
    raise SystemExit("Could not open file.")

spectrum = in_file.Get("hQ0")
if spectrum is None:
    raise SystemExit("Could not find spectrum histogram.")

N_GAUSS_PARAMS = 3

init = []
with open("init.txt") as f:
    for s in f:
        tokens = s.split()
        if not tokens:
            continue
        if len(tokens) != N_GAUSS_PARAMS:
            raise SystemExit(
                "Bad line in initial-value file: \"{}.\"".format(s)
            )

        init.append([float(t) for t in tokens])

n_peaks  = len(init)
n_params = N_GAUSS_PARAMS * n_peaks

fit_function = ROOT.TF1(
    "fit_function",
    "+".join(
        ["gaus({})".format(i)
         for i in range(0, n_params, N_GAUSS_PARAMS)]
    ), 0.0, 4100.0
)
for i in range(n_peaks):
    for j in range(N_GAUSS_PARAMS):
        fit_function.SetParameter(i * N_GAUSS_PARAMS + j, init[i][j])

spectrum.Fit(fit_function)

for i in range(1, n_params, N_GAUSS_PARAMS):
    print(fit_function.GetParameter(i))

关于python - 将高斯拟合到 ROOT 直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42120425/

相关文章:

python - IronPython 和 Jython 是否存在与 CPython 相同的 GIL 问题?

python - 如何在 Python 中运行带参数的应用程序?

python - 无法获得合适的直方图

python - 为分组列创建直方图

python - python 中 C++ vector 的实例(对于 pyROOT 中的 TTrees)

c++ - cmake .exe 和终端命令之间的 ROOT 结果不匹配

python - 绘制n个相同的无重叠和中心重心的圆

python - 我的 if 和 else 语句不会互相绕过

gnuplot x 标签在直方图中的位置

c++ - 如何在ROOT下编译多个文件