# gui-fit **Repository Path**: mrzimu/gui-fit ## Basic Information - **Project Name**: gui-fit - **Description**: 使用python实现数据可视化拟合 - **Primary Language**: Python - **License**: MPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-11-15 - **Last Updated**: 2024-11-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # GUI-fit #### 介绍 本软件主要实现使用python对数据进行图形化拟合,**本质是将CERN旗下的ROOT软件的RooFit模块的部分功能进行了可视化处理**(即将命令行操作转变为图形化操作)。 实现图形化的操作为:单函数/复合函数的数据拟合(支持定参自定义函数,不支持RooKeysPdf、RooHistPdf) #### 安装教程 本文假设你已正确安装ROOT且能正常使用 Python3 的 PyROOT(查看[编译安装ROOT](./Explanations/README/Install source ROOT.md)或[下载预编译包安装ROOT](./Explanations/READEME/Install pre-compiled ROOT.md)) 使用前请安装 Python3 的PyQt5库: ```bash pip install pyqt5 ``` 或 ```bash pip3 install pyqt5 ``` > 关于pip的安装: #### 使用说明 ##### 1. 启动程序 用**python3**运行主目录下的`main.py` ```python python3 main.py ``` 主界面如下: ![](Explanations/image/README/mainwindow.png) --- ##### 2. 选择数据文件 1. 单击`Select File`选择`.root`文件 ![](Explanations/image/README/single_select_data.png) 2. 软件会自动读取root文件内的tree和branch。 * 选取tree的时候,软件会对数据进行读取,读取的方法如下图 ![](Explanations/image/README/single_import_way.png) ```python data = RooDataSet(name, title, vars, RooFit.ImportFromFile(fileName, treeName)) ``` * 如果只有一个tree,那么会自动读取那个tree;同理,如果只有一个branch,会自动选择那个branch 3. 选择你要进行拟合的branch ![](Explanations/image/README/single_choose_branch.png) 4. 裁剪数据 * 如需裁剪数据,可在左下角输入裁剪命令(相当于调用`data = data.reduce(cutStr)`),然后点击`Cut Data` * 如需还原至裁剪前的数据,可点击`Reset` ![](Explanations/image/README/single_cut_data.png) --- ##### 3. 单函数拟合 1. 确保当前处于Single Model状态 ![](Explanations/image/README/single_make_sure_mode.png) PS:点击`Mode`$\rightarrow$`Single-Model`可以切换为Single Model状态 2. 选择你需要用于拟合的函数类型 ![](Explanations/image/README/single_choose_function.png) 3. 设置参数 * 部分函数会根据数据自动生成推荐的拟合参数设定 * 勾选`binned`表示分bin拟合,bin数由`Sum of bins`设置 * 勾选`Const`表示将改参数设为常数(`RooRealVar.setConstant()`) * `Ns`为信号数: 若$f(x)$为所选概率密度函数,$N_{sum}$为总事件数,$N_{signal}$为信号数(即为$N_s$),那么最终用于拟合的函数为(设数据已经归一化): $$ g(x)=\frac{N_{signal}}{N_{sum}} f(x) $$ 4. 点击`Fit`进行拟合,结果会显示至`Results`中 ##### 4. 复合函数拟合 1. 确保当前处于Compo Model状态 ![](Explanations/image/README/compo_make_sure_mode.png) 2. 双击左侧函数类型列表,可以添加复合函数的component ![](Explanations/image/README/compo_add_model.png) 3. 右键选项卡,可以删除component ![compo_remove](Explanations/image/README/compo_remove.png) 4. 选择函数的构造方式 * Normal:系数个数为函数个数-1,系数 $c$ 满足 $0\le c_i \le 1$ $$ g(x)=\sum_{i=1}^{n-1} c_i \cdot f_i(x)+\left( 1-\sum_{i=1}^{n-1} c_i \right) \cdot f_n(x) $$ * Extended:系数个数=函数个数 假设 $f_i(x)$ 的信号数为 $N_i$ ,总信号数为 $N_{\mathrm{sum}}$ 则 $$ g(x)=\sum_{i=1}^{n} \frac{N_i}{N_{\mathrm{sum}}} \cdot f_i(x) $$ * Recursive:参数个数=函数个数-1 $$ g(x)=(c_1 f_1(x)+(1-c_1)(c_2 f_2(x)+(1-c_2)(c_3 f_3(x)+(1-c_3)(\cdots)))) $$ 注意到,最后一项 $f_n(x)$ 的系数应为 $$ \left[c_{n-1} f_{n-1}(x)+(1-c_{n-1})f_n(x)\right] $$ 更多信息请参看中的 ![](Explanations/image/README/compo_more_build_info.png) ​ **特别注意:不恰当的模式与系数设置会导致拟合失败。`Normal`与 `Recursive`要求系数范围 $\in[0,1]$ ,而`Extended`中的系数为信号数** 5. 调整函数位置 * 拖动`Overview`中的函数可以修改排列顺序 * 在`Normal`与`Recursive`模式中,**默认排在最后的函数不需要系数** ![](Explanations/image/README/compo_before_drag.png "Before draw") ![](Explanations/image/README/compo_after_drag.png "After drag") 6. 点击`Fit`进行拟合,结果会显示至各个函数的`Results`中 ##### 5. 绘图 * 点击`Plot`即可展示当前data的图片,bin可在`Sum of bins`设置 * 只有在函数进行过拟合后,才会在图中显示拟合函数 ##### 6. 导入自定义函数 本软件支持导入由`classFactory`生成的**定参数**的pdf函数 1. 点击 `File` $\rightarrow$ `Import Macro` ,选择需要导入的函数文件 2. 在弹出的窗口中输入该文件的函数名称,并可对参数进行命名 ![](Explanations/image/README/import_name_function.png) 3. 导入后即可使用 ![](Explanations/image/README/import_after_import.png)