# 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
```
主界面如下:

---
##### 2. 选择数据文件
1. 单击`Select File`选择`.root`文件

2. 软件会自动读取root文件内的tree和branch。
* 选取tree的时候,软件会对数据进行读取,读取的方法如下图

```python
data = RooDataSet(name, title, vars, RooFit.ImportFromFile(fileName, treeName))
```
* 如果只有一个tree,那么会自动读取那个tree;同理,如果只有一个branch,会自动选择那个branch
3. 选择你要进行拟合的branch

4. 裁剪数据
* 如需裁剪数据,可在左下角输入裁剪命令(相当于调用`data = data.reduce(cutStr)`),然后点击`Cut Data`
* 如需还原至裁剪前的数据,可点击`Reset`

---
##### 3. 单函数拟合
1. 确保当前处于Single Model状态

PS:点击`Mode`$\rightarrow$`Single-Model`可以切换为Single Model状态
2. 选择你需要用于拟合的函数类型

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状态

2. 双击左侧函数类型列表,可以添加复合函数的component

3. 右键选项卡,可以删除component

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]
$$
更多信息请参看中的

**特别注意:不恰当的模式与系数设置会导致拟合失败。`Normal`与 `Recursive`要求系数范围 $\in[0,1]$ ,而`Extended`中的系数为信号数**
5. 调整函数位置
* 拖动`Overview`中的函数可以修改排列顺序
* 在`Normal`与`Recursive`模式中,**默认排在最后的函数不需要系数**


6. 点击`Fit`进行拟合,结果会显示至各个函数的`Results`中
##### 5. 绘图
* 点击`Plot`即可展示当前data的图片,bin可在`Sum of bins`设置
* 只有在函数进行过拟合后,才会在图中显示拟合函数
##### 6. 导入自定义函数
本软件支持导入由`classFactory`生成的**定参数**的pdf函数
1. 点击 `File` $\rightarrow$ `Import Macro` ,选择需要导入的函数文件
2. 在弹出的窗口中输入该文件的函数名称,并可对参数进行命名

3. 导入后即可使用
