【高能物理.ROOT】ROOT高斯拟合

ROOT拟合

如有错误,欢迎指正。
参考类似:假设检验
ROOT官方文档里面有很多关于ROOT的教程。其中就有关于拟合的示例代码,选取一两个看看就知道了。

简介

有时候有些模型的部分参数是未知的,需要通过拟合得到。一般的拟合是找到最大似然函数最大的位置作为参数的估计值。

  • 最小二乘法(least squares)是一种常用的拟合方法,它通过最小化残差平方和来拟合数据。实际上就是假设了模型的误差项服从高斯分布,并通过极大似然估计的方法求解参数。没有对模型其他参数有限制。
  • 卡方拟合(chi square fitting)跟最小二乘法类似,实际上是一种特殊的最大似然函数,只不过假设模型的统计误差服从高斯分布.

一般的高能物理是计数实验,计数的统计误差往往服从泊松分布,一般在计数小的时候,此时最大似然函数拟合中“正常项”就是泊松分布的样子.计数大的时候泊松分布趋近于高斯分布。用chi2拟合也没差了。

对于拟合的类型有很多种

  • 一维拟合:一个数据只有一个值,这批数据符合某个分布,这个分布的参数是要估计的。
  • 二维拟合:一个数据有两个个值。正常的直线拟合说的就是这种

拟合例子及代码

一维拟合高斯分布

拟合模型建立

    #模型建立
    m = ROOT.RooRealVar("m", "m", (变量范围[1]+变量范围[2])/2.0, 变量范围[1], 变量范围[2])
    s = ROOT.RooRealVar("s", "s", s0, 0, (变量范围[2]-变量范围[1])*2)
    # 变量=ROOT.RooRealVar(变量名, 变量名, 变量范围[1], 变量范围[2])
    model = ROOT.RooGaussian("Gauss", "Gauss", 变量, m, s)
    if type(fixm)!=type(None):
        m.setVal(fixm)
        m.setConstant(True)

拟合

    fitpara=model.fitTo(DATASet, Save=True)

结果输出

    frame = 变量.frame(Title=变量名, Bins=变量范围[0])
    DATASet.plotOn(frame)
    model.plotOn(frame,VisualizeError=(fitpara, 2),FillColor="kOrange")
    model.plotOn(frame,LineColor="g")

    if os.path.exists(保存位置):
        cforfit=ROOT.TCanvas(变量名, 变量名, 800, 800)
        ROOT.gPad.SetLeftMargin(0.15)
        frame.GetYaxis().SetTitleOffset(1.4)
        if 画图:frame.Draw()
        cforfit.SaveAs(os.path.join(保存位置,'fit_'+变量名+'.png'))

    print("minimized -log(L) value=",fitpara.minNll())
    print("estimated distance to minimum = ", fitpara.edm())
    result=[]
    for x in fitpara.floatParsFinal():
        print("拟合结果",x.getTitle(),"=",x.getValV(),"+-",x.getError())
        result.append([x.getTitle(),x.getValV(),x.getError()])
    print("cor:",fitpara.correlationMatrix())
    if type(fixm)==type(None):
        COR=fitpara.correlationMatrix()
        for i in range(2):
            for j in range(2):
                print(COR[i][j],end='\t')
            print()
        print("cov:",fitpara.covarianceMatrix())
        COV=fitpara.covarianceMatrix()
        for i in range(2):
            for j in range(2):
                print(COV[i][j],end='\t')
            print()

完整代码

import ROOT
import os

def 高斯拟合(DATASet,变量名,变量,变量范围,保存位置='',fixm=None,s0=1.0,画图=True):
    '''
    拟合其中的某个变量。拟合模型是高斯。
    DATASet:ROOT.RooDataSet
    变量名:'Mofll'
    变量范围:(bins,xmin,xmax)
    输出:
    '''
    #模型建立
    m = ROOT.RooRealVar("m", "m", (变量范围[1]+变量范围[2])/2.0, 变量范围[1], 变量范围[2])
    s = ROOT.RooRealVar("s", "s", s0, 0, (变量范围[2]-变量范围[1])*2)
    # 变量=ROOT.RooRealVar(变量名, 变量名, 变量范围[1], 变量范围[2])
    model = ROOT.RooGaussian("Gauss", "Gauss", 变量, m, s)
    if type(fixm)!=type(None):
        m.setVal(fixm)
        m.setConstant(True)

    fitpara=model.fitTo(DATASet, Save=True)

    frame = 变量.frame(Title=变量名, Bins=变量范围[0])
    DATASet.plotOn(frame)
    model.plotOn(frame,VisualizeError=(fitpara, 2),FillColor="kOrange")
    model.plotOn(frame,LineColor="g")

    if os.path.exists(保存位置):
        cforfit=ROOT.TCanvas(变量名, 变量名, 800, 800)
        ROOT.gPad.SetLeftMargin(0.15)
        frame.GetYaxis().SetTitleOffset(1.4)
        if 画图:frame.Draw()
        cforfit.SaveAs(os.path.join(保存位置,'fit_'+变量名+'.png'))

    print("minimized -log(L) value=",fitpara.minNll())
    print("estimated distance to minimum = ", fitpara.edm())
    result=[]
    for x in fitpara.floatParsFinal():
        print("拟合结果",x.getTitle(),"=",x.getValV(),"+-",x.getError())
        result.append([x.getTitle(),x.getValV(),x.getError()])
    print("cor:",fitpara.correlationMatrix())
    if type(fixm)==type(None):
        COR=fitpara.correlationMatrix()
        for i in range(2):
            for j in range(2):
                print(COR[i][j],end='\t')
            print()
        print("cov:",fitpara.covarianceMatrix())
        COV=fitpara.covarianceMatrix()
        for i in range(2):
            for j in range(2):
                print(COV[i][j],end='\t')
            print()
    return result

if __name__ == '__main__':
    # 产生数据
    x = ROOT.RooRealVar("x", "x", -10, 10)
    
    设定均值 = ROOT.RooRealVar("m", "m", 1.1)
    设定标准差 = ROOT.RooRealVar("s", "s", 2)
    设定模型 = ROOT.RooGaussian("model", "model", x, 设定均值, 设定标准差)
    
    DATASet = 设定模型.generate({x}, 1000)#没分bin数据
    x.setBins(25)
    
    # 进行拟合
    高斯拟合(DATASet,"x",x,(25,-10,10),
         保存位置='/home/csq/代码/vs_code/md文件/testcode/',
         画图=True)

结果

图片中黄色的是拟合参数的拟合误差 ± 2 σ \pm2\sigma ±2σ的模型变化行为。
在这里插入图片描述

输出结果:

minimized -log(L) value= 2149.229088005724
estimated distance to minimum =  1.912172983979974e-06
拟合结果 m = 1.153746032145044 +- 0.06565361253393576
拟合结果 s = 2.075960999790656 +- 0.04646477947196859
cor: Name: TMatrixTSym<double> Title: 
1.0     0.0007898421275319538
0.0007898421275319538   1.0
cov: Name: TMatrixTSym<double> Title: 
0.004310459607468626    2.4095056496145953e-06
2.4095056496145953e-06  0.0021589954668200222
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果您想打开 ROOT 格式的图片,您需要先安装 ROOT 软件包。ROOT 是一个用于高能物理数据分析的软件框架,可用于绘制、分析和处理 ROOT 格式的数据和图像。您可以在 ROOT 官网上下载 ROOT 软件包,并按照官方文档中的指导进行安装和使用。在安装完成后,您可以使用 ROOT 软件打开 .root 格式的图片。 ### 回答2: 打开一个.root的图片意味着要使用ROOT软件来查看和处理这个文件。ROOT是一个数据分析框架,经常用于高能物理实验数据的分析和绘图。 要打开.root图片,首先需要安装并打开ROOT软件。在ROOT软件界面中,可以通过点击菜单栏中的"File"按钮,然后选择"Open"选项或者使用快捷键Ctrl+O来打开文件浏览器。 在文件浏览器中,找到存储有.root图片的文件夹,并双击选择要打开的文件。打开文件后,ROOT软件会自动解析并显示图片内容。 在ROOT软件中,可以使用不同的功能来查看和处理打开的.root图片。例如,可以使用ROOT提供的绘图函数来绘制直方图、散点图等。可以调整绘图的样式、颜色和标签等属性,以满足个人需求。 此外,ROOT还提供了丰富的数据分析功能,可以进行数据拟合、统计分析等操作。通过ROOT的命令行界面或者编写脚本,可以实现更复杂的数据分析操作。 在处理完打开的.root图片后,可以选择保存修改后的结果或者关闭文件。 ### 回答3: 若要打开一个以“.root”为扩展名的图片文件,你需要使用适当的软件。一种常用的软件是ROOT(一种数据处理和分析框架),它可以用于打开并操作以“.root”为扩展名的文件。 要打开一个.root图片,首先需要安装ROOT软件。可以从ROOT的官方网站或其他可靠的来源下载并安装ROOT。安装完成后,就可以启动ROOT软件。 在ROOT软件中,可以使用TBrowser类打开.root文件。首先,使用ROOT命令提示符创建并初始化一个TBrowser对象。然后,使用TBrowser的Open()方法将.root文件加载到浏览器中。 加载完成后,就可以在TBrowser窗口中浏览和查看图片文件的内容。可以使用ROOT提供的函数和工具对图片进行进一步的分析和可视化。 总之,要打开一个.root的图片文件,需要先安装ROOT软件,然后使用TBrowser类打开并浏览该文件。ROOT软件提供了许多功能和工具,可用于处理和分析.root文件中的图片数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值