在 PyROOT

问题描述


我一直在尝试使用 pyroot 将一组数据与两个高斯函数的总和拟合,但我所有的尝试都以我不知道如何修复的相同错误结束。
我尝试使用高斯方程的表达式和 ROOT 内部公式(如 {gaus(0)+gaus(3)})定义自定义函数,但两个版本都不起作用。我很确定错误在于我对定义变量函数所需的步骤或在 ROOT's Fit 中实现它的步骤的错误解释。我在网上看到了各种类似的问题,每个人都建议使用 matplotlib 或类似的东西,但我真的很想了解我做错了什么。如果与 ROOT 的预定义 FIt 公式之一一起使用,则代码运行顺畅,因此我认为问题仅存在于我定义的函数中。

一个问题是关于我在程序中插入 Canvas 的方式:因为我想要一个迭代系列的 Fit 我需要 n 个画布,但我不知道如何迭代生成它们(就像你一样可以看到,我事先定义了它们,然后创建了一个数组,这真是令人不快的查看和编辑)。如果有人有建议,我会很高兴听到他们的建议!

我将复制下面的代码,然后我从程序的特定版本中得到错误,但我不知道如何添加包含数据的文件,所以如果需要数据集,我需要一个关于如何提供它的输入...


import ROOT 
import array 
import numpy as np
import scipy

n=0.1           #step
xmin=7.9        #minimum
xmax=8.2        #maximum
gr=[]           #graph's array
par1=[]         #parameter's array
par2=[]         #parameter's array
par1er=[]       #parameter's error array
par2er=[]       #parameter's error array
parameters=([0],[1],[2],[3],[4],[5])
data = np.genfromtxt('CampioneRame.txt',usecols = 1)
x = data[:]

c0=ROOT.TCanvas("c0","Passo 1")
c1=ROOT.TCanvas("c1","Passo 2")
c2=ROOT.TCanvas("c2","Passo 3")
c3=ROOT.TCanvas("c3","Passo 4")
c4=ROOT.TCanvas("c4","Passo 5")
c5=ROOT.TCanvas("c5","Passo 6")
c6=ROOT.TCanvas("c6","Passo 7")
c7=ROOT.TCanvas("c7","Passo 8")
c8=ROOT.TCanvas("c8","Passo 9")
c9=ROOT.TCanvas("c9","Passo 10")
c=[c0,c1,c2,c3,c4,c5,c6,c7,c8,c9]           #canvas' array


def DoubleGaussian(x,parameters):
    parameters=([0],[5])
    fun=[0]*np.exp(-0.5*((x-[1])/[2])**2) + [3]*np.exp(-0.5*((x-[4])/[5])**2)
    return fun

for i in range (0,10,1):
    gr.append( ROOT.TGraphErrors("CampioneRame.txt" ) ) #Graph from file
    gr[i].SetName("gr1")
    gr[i].SetMarkerStyle(20) 
    gr[i].SetMarkerSize(0.4) 
    gr[i].SetMarkerColor(1) 

    function=ROOT.TF1("function","DoubleGaussian",xmin-2*(i*n),xmax+2*(i*n))
    parameters=([0],[5])
    function.SetParameters(15000,1,2,10000,2)
    
    gr[i].Draw("AP")
    gr[i].Fit("function","RV","",xmin-i*n,xmax+i*n) 
    fit = gr[i].GetFunction("function") 
    #par1.append(fit.GetParameter(2))
    #par2.append(fit.GetParameter(5))
    #par1er.append(fit.GetParError(2))
    #par2er.append(fit.GetParError(5))
    print xmin-i*n
    print xmax+i*n
    
    gr[i].SetTitle("Profilo dello spot della sorgente di Raggi X") 
    gr[i].GetXaxis().SetTitle("Pixel")  
    gr[i].GetXaxis().SetTitleSize(0.045) 
    gr[i].GetXaxis().SetTitleOffset(0.8) 
    gr[i].GetXaxis().CenterTitle() 
    gr[i].GetYaxis().SetTitle("Livelli di grigio")
    gr[i].GetYaxis().SetTitleSize(0.045)
    gr[i].GetYaxis().SetTitleOffset(0.8)
    gr[i].GetYaxis().CenterTitle()
    ROOT.gStyle.SetoptFit() 

    #c.append( ROOT.TCanvas("c"[i],"New Canvas") )
    c[i].cd()
    fit.Draw()

print "\n Valori Medie"
for i in range (0,1):
    print par1[i],par1er[i]
print "\n Valori Sigma"
for i in range (0,1):
    print par2[i],par2er[i]


错误

TFormula::Compile 中的错误错误的数值表达式: TF1::TF1 中的“DoubleGaussian”错误函数函数/DoubleGaussian 有 0 个参数而不是 1 个未知 功能功能 7.9 8.2 回溯(最近一次调用最后一次):文件“multifit - copia.py”,第 75 行,在 fit.Draw() ReferenceError: 尝试访问空指针

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...