Python 用根直方图拟合高斯分布

Python 用根直方图拟合高斯分布,python,histogram,root-framework,pyroot,Python,Histogram,Root Framework,Pyroot,我正试图编写一个程序,将几个高斯函数拟合成一个根柱状图,但不幸的是,我对派罗特的经验不足 我有一个Ba133发射光谱的柱状图,我想将高斯拟合到峰值,这样我就知道了所述峰值的x轴值,以便校准检测器。理想情况下,程序将进行迭代并找到峰值本身,但我可以自己指定它们 目前我仅有的代码是: import ROOT infile = ROOT.TFile("run333.root") Ba_spectrum = infile.Get("hQ0") Ba_spectrum.Draw() 如果有人能告

我正试图编写一个程序,将几个高斯函数拟合成一个根柱状图,但不幸的是,我对派罗特的经验不足

我有一个Ba133发射光谱的柱状图,我想将高斯拟合到峰值,这样我就知道了所述峰值的x轴值,以便校准检测器。理想情况下,程序将进行迭代并找到峰值本身,但我可以自己指定它们

目前我仅有的代码是:

import ROOT

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

Ba_spectrum = infile.Get("hQ0")

Ba_spectrum.Draw()
如果有人能告诉我如何使用派罗来拟合高斯峰,最好是自动拟合,我将不胜感激


感谢

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

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))

你的情况行吗?或者你知道峰值的大致位置,你想拟合它们的参数?可能,就像我说的,我对ROOT几乎没有经验,所以我愿意接受建议。我只需通过目测就能知道峰值的大致位置,我需要拟合高斯函数来确定x值,例如,我可以确定375千电子伏的峰值对应于2500号料仓。这看起来很理想,请原谅我的无知,但我如何从这段代码中获得实际的平均值?有没有办法将它们打印或写入文件?谢谢