2017-02-08 8 views
1

ROOTヒストグラムにいくつかのガウス関数を適合させるプログラムを作成しようとしていますが、残念ながら私のpyroOT経験はありません。ROOTヒストグラムにガウスシアンを当てる

私はBa133の発光スペクトルのヒストグラムを持っており、検出器を較正するために、このピークのx軸値を知るためにピークにガウス分布を合わせたいと考えています。理想的には、プログラムは反復してピークを見つけることになりますが、自分で指定する必要はありません。

Ba133 spectrum

現在、私が持っている唯一のコードは次のとおりです。

import ROOT 

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

Ba_spectrum = infile.Get("hQ0") 

Ba_spectrum.Draw() 

誰かが好ましくは自動、どのようにこれらのピークにガウス分布に合わせてpyrootを使用する方法を教えてくださいことができれば、それをいただければ幸いです。まともなフィット結果を得ることは、多くの場合、あなたはおそらくで始まるようにピークのおおよその位置を指定する方がいいでしょう、合理的な初期パラメータ値で始まるに依存していることを考えると

おかげ

+1

[TSpectrum](https://root.cern.ch/doc/master/classTSpectrum.html)はあなたのケースでは機能しますか?またはピークの大まかな位置を知っていて、そのパラメータに合わせたいと思っていますか? – user2148414

+0

私はROOTの経験がほとんどないと言ったように、私は提案について開いています。私はピークを目に見えるだけの大まかな位置を知っています。私はガウス分布に合わせてxの値を決定する必要があります。私は375 keVのピークがビン番号に対応すると判断することができます。例えば2500である。 – user3355561

答えて

3

。たとえば、すべての見かけのピークの高さ、平均、幅の推測を含むテキストファイルを作成することができます。

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

それは私の無知を許して理想的に見えますが、どうすればこのコードから実際の手段を引き出すことができますか?それらを印刷またはファイルに書き込む方法はありますか? ありがとう – user3355561

+0

私は手段を印刷するために少しコードを変更しました。 –

関連する問題