前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ROOT-数据读取-直方图-Roofit拟合基本流程-(入门实用)

ROOT-数据读取-直方图-Roofit拟合基本流程-(入门实用)

作者头像
梁佐佐
发布于 2020-09-04 09:25:02
发布于 2020-09-04 09:25:02
2.6K00
代码可运行
举报
文章被收录于专栏:人芳觅人芳觅
运行总次数:0
代码可运行

笔者最近在测核素能谱,测出的能谱需要分析,比如计算某全能峰的分辨率。用到的数据处理分析工具是ROOT(cern),整个能谱读取分析的流程可给各位看官当入门或干货材料使用。不过,ROOT大神就必看本文了,至少节约2分钟的时间,日后要是有新鲜的ROOT技巧会另作分享。

本文ROOT分析的实验背景和数据处理目的如下图1所示:

图1 实验背景和ROOT数据处理的目的

目的1:得到扣除本底后的能谱并绘制出图

基本过程为:1)*.Spe文件数据读取;2)定义一个ROOT文件用于存储能谱;3)数据读取到直方图,并作本底扣除;4)写入ROOT文件;5)画图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

#include "RooRealVar.h"
#include "RooDataSet.h"
#include "RooGaussian.h"
#include "RooBreitWigner.h"
#include "RooPolynomial.h"
#include "RooAddPdf.h"
#include "RooFitResult.h"
#include "RooRealIntegral.h"
#include "TCanvas.h"
#include "RooPlot.h"
#include "TFile.h"
#include "TTree.h"
#include "TH2D.h"
#include "TH1D.h"
#include "THStack.h"
#include "TROOT.h"
#include "TLatex.h"
#include "TF2.h"
#include "TF1.h"
#include "iostream"
#include "fstream"
#include "RooCBShape.h"
#include "TMath.h"
#include "RooFit.h"
#include "RooMath.h"
 using namespace RooFit;
 using namespace std;
void templateread(){
const int varnum=2;
const char *newlabelname[varnum]={"CsI-B","CsI-Cs137"};
string filename[varnum]={"20190401-csi-bg-1725s.Spe","cs137-csi-1725s.Spe"};
double measuringtime[varnum]={1725,1725};
       const int channelnum=24+2048;
       string tempdata;
       ifstream fin[varnum];
       TH1F *spec[varnum];
 
int font=22;
TFile *outputFile=new
TFile("CsI-1cm1cm1cm-new.root","RECREATE");
for (int i1=0;i1<2;i1++)
{      fin[i1].open(filename[i1],ios_base::in);
        spec[i1] = new TH1F(newlabelname[i1],newlabelname[i1],2048,0,2048);
       for (int i=0;i<channelnum;i++)
       {
                fin[i1]>>tempdata;
                if(i>24)
 
                {
                       spec[i1]->SetBinContent(i-24,stod(tempdata));
                }
 
}
 
spec[i1]->SetFillColor(kRed);
spec[i1]->SetYTitle("Counts");
spec[i1]->SetXTitle("Channel");
spec[i1]->SetLineColor(kRed);
spec[i1]->SetLabelSize(0.04,"X");
spec[i1]->SetLabelSize(0.04,"Y");
spec[i1]->SetLabelFont(font,"X");
spec[i1]->SetLabelFont(font,"Y");
spec[i1]->SetLabelOffset(0.01,"X");
spec[i1]->SetLabelOffset(0.01,"Y");
spec[i1]->SetTitleOffset(1.0,"X");
spec[i1]->SetTitleOffset(1.2,"Y");
spec[i1]->SetTitleOffset(1.2,"Z");
spec[i1]->SetTitleSize(0.05,"X");
spec[i1]->SetTitleSize(0.05,"Y");
spec[i1]->SetTitleSize(0.05,"Z");
spec[i1]->SetTitleFont(font,"X");
spec[i1]->SetTitleFont(font,"Y");
spec[i1]->SetTitleFont(font,"Z");
 
}
 
gStyle->SetOptStat("");
 
spec[1]->Add(spec[0],-(measuringtime[1]/measuringtime[0]));
for (int j=0;j<2;j++)
{
   for (int i=0;i<2048;i++)
    {
 
       if(spec[j]->GetBinContent(i+1)<0)    {spec[j]->SetBinContent(i+1,0);}
 
    }
}
for (int i=0;i<20;i++)
{
spec[1]->SetBinContent(i+1,0);
}
outputFile->Write();
//spec[0]->Write();
//spec[1]->Write();
//outputFile->Close();
TCanvas*myc=new
TCanvas("myc","myc",650,450);
myc->SetLeftMargin(0.12);
myc->SetRightMargin(0.08);
myc->SetTopMargin(0.08);
myc->SetBottomMargin(0.12);
spec[1]->Draw();
//myc->Print(Form("CsI-NoBackground-sec1725.png"));
}

图2 绘制能谱

目的2:对能谱全能峰进行拟合

基本过程为:1)已经保存的ROOT文件中读取直方图;2)定义拟合函数的参数区间;3)选择感兴趣的几个函数用于全能峰拟合;4)绘制拟合结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

#include "RooRealVar.h"
#include "RooDataSet.h"
#include "RooGaussian.h"
#include "TCanvas.h"
#include "RooPlot.h"
#include "TAxis.h"
//#include <stdlib.h>
using namespace RooFit ;
using namespace std ;
 
void goodfit()
{
//TFile f1("20190501bgona22.root");
//TH1D* hist =(TH1D*)f1.Get("BGO-Na22");
TFile* inputFile = TFile::Open("20190501bgona22.root");
//TFile* inputFile = TFile::Open("CsI-1cm1cm1cm-new.root");
//TFile* inputFile = TFile::Open("GAGG-6mm6mm6mm-cs137-exp.root");
TH1F *spec[4];
//spec[0]=new TH1F();
spec[0]=(TH1F*)inputFile->Get("BGO-Na22");
//spec[0]=(TH1F*)inputFile->Get("Cs137-TC");
//spec[0]=(TH1F*)inputFile->Get("CsI-Cs137");
//spec[0]=(TH1F*)inputFile->Get("BGO-Cs137");
// S e t u p   m o d e l
// ---------------------
//double myscale=1.0/h1->Integral();
//h1->Scale(myscale);//normalize the hist
int meanv=450;
int rangexmin=390;int rangexmax=580;
int xmin=rangexmin;int xmax=rangexmax;
RooRealVar x("x","x",xmin,xmax) ;
RooRealVar mean("mean","mean",meanv,rangexmin,rangexmax) ;
RooRealVar sigma("sigma","sigma",20,5.,500) ;
RooGaussian sig("sig","signal p.d.f.",x,mean,sigma) ;

RooRealVar argpar1("argpar1","argus shape parameter",20,0.,40.) ;
RooRealVar argpar2("argpar2","argus shape parameter",20,0.,40.) ;
RooArgusBG argus("argus","Argus PDF",x,argpar1,argpar2) ;
RooRealVar a0("a0","a0",-0.0001,-1.,0.1);
// RooRealVar a1("a1","", 0.5, -1, 100);
RooExponential bkg("bkg","background p.d.f.", x,a0);
RooRealVar c0("c0","coefficient #0", -1.0,-300.,10.) ;
RooRealVar c1("c1","coefficient #1", 0.1,-100.,1.) ;
RooRealVar c2("c2","coefficient #2",-0.1,-100.,2.) ;
RooChebychev compton("bkg","background p.d.f.",x,RooArgList(c0,c1,c2)) ;
RooRealVar mean_bkg("mean_bkg","mean",rangexmin/2+rangexmax/2,rangexmin,rangexmax);
RooRealVar sigma_bkg("sigma_bkg","sigma",30,10.,60.);
RooGaussian bkg_peak("bkg_peak","peaking bkg p.d.f.",x,mean_bkg,sigma_bkg) ;
RooRealVar fpeakbkg("fpeakbkg","peaking background fraction",0.5,0.4,1.) ;
RooAddPdf totalbkg("totalbkg","compton+bkg_peak",RooArgList(bkg_peak,compton),fpeakbkg);
 
RooRealVar fsig("fsig","signal fraction",0.9,0.5,1.) ;
//RooAddPdf
model("model","sig+(compton+bkg_peak)",RooArgList(sig,totalbkg),fsig);
RooAddPdf model("model","sig+bkg-e",RooArgList(sig,bkg),fsig) ;
//RooAddPdf
model("model","sig+compton",RooArgList(sig,compton),fsig) ;
//RooAddPdf
model("model","sig+compton",RooArgList(sig),fsig) ;
//RooAddPdf
model("model","sig+compton",RooArgList(sig,argus),fsig) ;
 
//RooPlot* frame = x.frame(Title("CsI Cs-137 662keV Photopeak Fitting;Channel"));
//RooPlot* frame = x.frame(Title("BGO Cs-137 662keV Photopeak Fitting;Channel"));
RooPlot* frame = x.frame(Title("BGO Na-22 511keV Photopeak Fitting;Channel"));
//RooPlot* frame = x.frame(Title("GAGG Ba-133 81keV Photopeak Fitting"));
RooAbsData* data = new RooDataHist("data","data",x,spec[0]);
data->plotOn(frame);
//data->plotOn(xframe,Binning(1000));
//model.fitTo(*data,Save(),Extended());
model.fitTo(*data,Save(),Extended(),Range(rangexmin,rangexmax));
//model.fitTo(*data,Save(),Extended(),Range(rangexmin,rangexmax));
 
model.plotOn(frame,LineColor(kGreen)) ;
//model.plotOn(frame,Components(argus),LineColor(kBlue),LineStyle(kDashed)) ;
model.plotOn(frame, Components(compton),LineColor(kBlue),LineStyle(kDashed)) ;
model.plotOn(frame, Components(sig),LineColor(kRed),LineStyle(kDashed)) ;
//model.plotOn(frame, Components(bkg_peak),LineColor(kViolet),LineStyle(kDashed)) ;
//model.plotOn(frame, Components(totalbkg),LineColor(kBlue),LineStyle(kDashed)) ;
//model.plotOn(frame, Components(bkg),LineColor(kBlue),LineStyle(kDashed)) ;
 
//model.paramOn(frame, Format("NEU"), Layout(0.15,0.50,0.9));
model.paramOn(frame,Parameters(RooArgSet(sigma,mean)), Format("NEU"), Layout(0.55,0.9,0.9));
//model.paramOn(frame,Parameters(RooArgSet(sigma,mean,c0,c1,c2)), Format("NEU"),Layout(0.55,0.9,0.9));
//model.paramOn(frame,Parameters(RooArgSet(sigma,mean,fsig,a0)), Format("NEU"), Layout(0.55,0.9,0.9));
TCanvas* c = new TCanvas("c2","Fitting test",1200,800);
frame->Draw() ;
//c->Print(Form("Na22-511keVfit0903.png"));
//c->Print(Form("Ba133-81keVfit0903.png"));
}

图3 全能峰拟合

到这里,两个目的均已达成,Roofit其实算是种很偷懒的拟合,未来的教程将探讨普适的Fit以及TSpectrum的机智用法。

图4 TSpectrum用作峰位的初始化值很方便,且很准确

喜欢的话,分享一下吧~^o^~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人芳觅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ROOT-画双Y轴图表
字号字体:当图片缩放占用单栏时,宽度约7.8cm,对应图片内字号与文章内字号大致相同,即10号Times New Roman。
梁佐佐
2021/07/20
2.3K5
ROOT-画双Y轴图表
串口数据读取和动态显示Tkinter+matplotlib+pyqtgraph(详细教程)
注意 :本函数已将pyqtgraph动态绘图隐藏,在main函数中去除隐藏便可以显示,但是没有嵌入到tkinter 运行环境: win10,python3.5.2
全栈程序员站长
2021/04/07
2.8K0
ROS联合webots实战案例(五)导航功能包入门2
在前面几章中分别介绍了在webots中如何创建自己的机器人、添加传感器以及使用手柄或键盘驱动它在仿真环境中移动。在本章中,你会学习到ROS系统最强大的特性之一,它能够让你的机器人自主导航和运动。
锡城筱凯
2021/02/07
1.6K0
ROS联合webots实战案例(五)导航功能包入门2
NumPyML 源码解析(四)
The wrappers.py module implements wrappers for the layers in layers.py. It includes
ApacheCN_飞龙
2024/02/17
3770
深度学习 | 《深度学习入门之PyTorch》阅读笔记
KDD(knowledge discovery in database),从数据中获取有意义的信息
Justlovesmile
2021/12/14
1.5K0
深度学习 | 《深度学习入门之PyTorch》阅读笔记
Python 元学习实用指南:1~5
元学习是当前人工智能领域最有前途和趋势的研究领域之一。 它被认为是获得广义人工智能(AGI)的垫脚石。 在本章中,我们将了解什么是元学习以及为什么元学习是当前人工智能中最令人振奋的研究。 我们将了解什么是少拍,单拍和零拍学习,以及如何在元学习中使用它。 我们还将学习不同类型的元学习技术。 然后,我们将探索学习通过梯度下降学习梯度下降的概念,其中我们了解如何使用元学习器来学习梯度下降优化。 继续进行,我们还将学习优化作为少样本学习的模型,我们将了解如何在少样本学习设置中将元学习器用作优化算法。
ApacheCN_飞龙
2023/04/24
9700
Python 元学习实用指南:1~5
TensorFlow 1.x 深度学习秘籍:6~10
在本章中,我们将讨论循环神经网络(RNN)如何在保持顺序顺序重要的领域中用于深度学习。 我们的注意力将主要集中在文本分析和自然语言处理(NLP)上,但我们还将看到用于预测比特币价值的序列示例。
ApacheCN_飞龙
2023/04/23
9570
TensorFlow 1.x 深度学习秘籍:6~10
Tina-SDK开发
Tina-SDKV2.0源码网盘链接:https://pan.baidu.com/s/13uKlqDXImmMl9cgKc41tZg?pwd=qcw7
韦东山
2024/08/24
4210
Tina-SDK开发
Python 单样本学习实用指南:1~6 全
深度学习给制造业带来了重大变化,无论是制造业,医疗还是人力资源。 通过这一重大革命和概念验证,几乎每个行业都在尝试调整其业务模型以适应深度学习,但是它有一些主要要求,可能并不适合每个业务或行业。 阅读本节后,您将对深度学习的优缺点有适当的了解。
ApacheCN_飞龙
2023/04/27
1.4K0
NumPyML 源码解析(三)
The losses.py module implements several common loss functions, including:
ApacheCN_飞龙
2024/02/17
2140
精通 TensorFlow 1.x:11~15
TensorFlow 模型在开发环境中经过训练和验证。一旦发布,它们需要托管在某个地方,提供用工程师和软件工程师使用,以集成到各种应用中。 TensorFlow 为此提供了一个高表现服务器,称为 TensorFlow 服务。
ApacheCN_飞龙
2023/04/23
1.6K0
精通 TensorFlow 2.x 计算机视觉:第三、四部分
在本节中,您将基于从上一节中获得的理解,并开发更新的概念并学习用于动作识别和对象检测的新技术。 在本节中,您将学习不同的 TensorFlow 工具,例如 TensorFlow Hub,TFRecord 和 TensorBoard。 您还将学习如何使用 TensorFlow 开发用于动作识别的机器学习模型。
ApacheCN_飞龙
2023/04/27
5.9K0
机器学习学术速递[7.14]
【1】 A Graph Data Augmentation Strategy with Entropy Preserving 标题:一种保熵的图形数据增强策略
公众号-arXiv每日学术速递
2021/07/27
1.4K0
人工智能学术速递[10.19]
【1】 Discovering and Achieving Goals via World Models 标题:通过世界模型发现和实现目标 链接:https://arxiv.org/abs/2110.09514
公众号-arXiv每日学术速递
2021/10/21
1.5K0
机器学习学术速递[6.25]
【1】 Fea2Fea: Exploring Structural Feature Correlations via Graph Neural Networks 标题:Fea2Fea:基于图神经网络的结构特征相关性研究
公众号-arXiv每日学术速递
2021/07/02
1.9K0
机器学习学术速递[10.19]
【1】 Beltrami Flow and Neural Diffusion on Graphs 标题:图上的Beltrami流与神经扩散 链接:https://arxiv.org/abs/2110.09443
公众号-arXiv每日学术速递
2021/10/21
2K0
机器学习学术速递[8.18]
【1】 SPAN: Subgraph Prediction Attention Network for Dynamic Graphs 标题:SPAN:动态图的子图预测注意网络 链接:https://arxiv.org/abs/2108.07776
公众号-arXiv每日学术速递
2021/08/24
1.2K0
机器学习学术速递[12.23]
【1】 Graph augmented Deep Reinforcement Learning in the GameRLand3D environment 标题:GameRLand3D环境下的图形增广深度强化学习 链接:https://arxiv.org/abs/2112.11731
公众号-arXiv每日学术速递
2021/12/27
1.2K0
机器学习学术速递[6.28]
【1】 Data efficiency in graph networks through equivariance 标题:图网络中的等方差数据效率
公众号-arXiv每日学术速递
2021/07/02
1.4K0
精通 Pandas:6~11
在本章中,我们将介绍一些必要的主题,这些主题对于培养使用 Pandas 的专业知识必不可少。 这些主题的知识对于准备数据作为处理数据以进行分析,预测或可视化的程序或代码的输入非常有用。 我们将讨论的主题如下:
ApacheCN_飞龙
2023/04/23
3.1K0
相关推荐
ROOT-画双Y轴图表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档