siddharthparashri5/Advanced_ROOT_Plotting

GitHub: siddharthparashri5/Advanced_ROOT_Plotting

基于CERN ROOT框架的高能物理数据分析图形界面工具,支持链式事件筛选、脚本执行和论文级图表制作。

Stars: 0 | Forks: 1

# 高级 ROOT 绘图 GUI 一个现代化、用户友好的图形界面,用于使用 ROOT 创建出版质量的图表,支持 CSV 数据文件、具有拖放功能的 ROOT 文件、带有链式过滤的高级 TTree 条目选择以及集成脚本执行。 ![Version](https://img.shields.io/badge/version-2.3-blue) ![ROOT](https://img.shields.io/badge/ROOT-6.26+-green) ![C++](https://img.shields.io/badge/C++-17-orange) ## 功能特性 ### 数据输入 - **CSV/文本文件导入**:带有可自定义设置的交互式预览对话框 - 多种分隔符选项(逗号、分号、制表符、空格、自定义) - 表头行检测和配置 - 跳过元数据行 - 带格式化表格视图的实时预览 - **ROOT 文件支持**:原生 ROOT 对象处理 - 加载直方图 (TH1, TH2, TH3) - 加载图表 (TGraph, TGraphErrors, TGraphAsymmErrors) - 加载 TTree 对象 - 支持从 TBrowser 拖放 - 带有对象预览的交互式 ROOT 文件浏览器 ### 新功能:基于 GUI 的 ROOT 分析和过滤 - **条目范围选择**:从 TTree 中选择特定事件范围 - 选择开始和结束条目号 - 应用于任何 TTree 分支 - 直方图的 Bin 范围选择 - **切割公式**:使用 ROOT 的 TCut 语法应用物理切割 - 复杂的布尔表达式:`Energy > 100 && Pt > 30` - 支持数学函数 - 用于基于条目切割的 Entry$ 变量 - **带切割的选择链**:构建累积过滤器管道 - 多个切割的顺序应用 - 每一步都建立在前一步的选择之上 - GUI 中的可视化链表示 - 实时条目计数反馈 - **保存/加载链**:持久化选择工作流 - 将链保存为 `.selchain` 文件(纯文本,易于版本控制) - 加载和重用选择链 - 与合作者分享分析工作流 - **绘图选项**: - 仅绘制当前选择(单步) - 使用整个链绘制(累积切割) - 从过滤后的 TTree 数据自动创建直方图 - 完全控制绘制选项 ### 绘图能力 - **多种图表类型**: - 带误差棒的散点图 - 折线图 - 直方图 (1D, 2D, 3D) - 误差棒图 - 色彩图和曲面图 - 带切割的基于 TTree 的直方图 - **自定义选项**: - 坐标轴标签和标题 - 自定义配色方案 - 标记样式和大小 - 线条样式和宽度 - 图例定位 - 网格选项 ### 高级功能 - **多画布支持**:创建和管理多个绘图画布 - **列选择器**:用于选择数据列的交互式对话框 - **实时预览**:实时查看更改 - **导出选项**:以多种格式保存图表 (PDF, PNG, EPS, SVG) - **拖放**:直接将 ROOT 对象拖放到 GUI 上 - **集成脚本引擎**:执行 ROOT/C++ 和 Python 脚本 - 带语法高亮的多行脚本编辑器 - 用于单行命令的命令行界面 - 加载/保存外部脚本文件 - 从脚本访问已加载的 ROOT 文件 - **高级拟合**:多种拟合函数,支持 RooFit - 高斯、多项式、指数拟合 - 正弦、阻尼正弦(用于周期性数据) - 自定义函数支持 - 显示带不确定度的拟合参数 ## 系统要求 ### 系统需求 - **操作系统**:Linux (推荐 Ubuntu 20.04+) - **ROOT**:版本 6.26 或更高(推荐 6.28+ 以使用所有功能) - **C++ 编译器**:GCC 9.0+,支持 C++17 - **CMake**:版本 3.12 或更高 - **Python**(可选):用于 Python 脚本执行 ### ROOT 安装 ``` # 从官方仓库安装 ROOT 或从源代码构建 # 检查或从 https://root.cern/install/ 下载 ``` ## 安装说明 ### 1. 克隆或下载项目 ``` git clone https://github.com/siddharthparashri5/Advanced_ROOT_Plotting.git cd Advanced_ROOT_Plotting mkdir build cd build cmake .. make -j ``` ### 2. 项目结构 ``` Advance_ROOT_Plotting_dev/ ├── src/ │ ├── AdvancedPlotGUI.cpp # Main GUI implementation │ ├── CSVPreviewDialog.cpp # CSV preview and import │ ├── ColumnSelectorDialog.cpp # Column selection dialog │ ├── ColumnSelectorDict.cpp # ROOT dictionary │ ├── RootEntrySelector.cpp # Entry selector GUI │ ├── PlotManager.cpp # Plot creation and management │ ├── FileHandler.cpp # File loading and processing │ ├── PlotTypes.cpp # Plot type implementations │ ├── ProjectDict.cpp # ROOT dictionary │ ├── RootDataInspector.cpp # ROOT data inspection │ ├── ROOTFileBrowser.cpp # ROOT file browser dialog │ ├── ScriptEngine.cpp # Script execution engine │ ├── include/ │ ├── AdvancedPlotGUI.h # Main GUI header │ ├── CSVPreviewDialog.h # CSV preview dialog │ ├── ColumnSelectorDialog.h # Column selector │ ├── ColumnSelectorLinkDef.h # ROOT linkdef │ ├── RootEntrySelector.h # Entry selector GUI │ ├── PlotManager.h # Plot management │ ├── DataReader.h # Data reading utilities │ ├── FileHandler.h # File handling │ ├── PlotTypes.h # Plot type definitions │ ├── ErrorHandling.h # Error utilities │ ├── FitUtils.h # Fitting utilities │ ├── RootDataInspector.h # Data inspection │ ├── ROOTFileBrowser.h # File browser │ ├── ScriptEngine.h # Script engine │ ├── main.cpp # Application entry point ├── CMakeLists.txt # Build configuration └── sample_data.csv # Example data file ``` ### 3. 构建应用程序 ``` mkdir build cd build cmake .. make -j$(nproc) ``` 这将创建可执行文件:`AdvancedPlotGUIApp` ### 4. 构建问题排查 **ROOT 缺失**:如果 CMake 找不到 ROOT,请 source ROOT 环境: ``` source /path/to/root/bin/thisroot.sh ``` **编译器错误**:确保您具有 C++17 支持: ``` g++ --version # Should be 9.0 or higher ``` ## 使用说明 ### 启动应用程序 ``` # From the build directory: ./AdvancedPlotGUIApp # 或者使用 ROOT: root -l .x ../main.cpp ``` ### 加载 CSV 文件 1. **点击 "Browse"** 按钮 2. **选择您的数据文件** 在文件浏览器中 3. **配置导入设置** 在预览对话框中: - 选择分隔符(逗号、分号、制表符等) - 设置第一行是否包含表头 - 如有需要,跳过元数据行 - 预览显示格式化的表格 4. **点击 "Load"** 导入数据 5. **成功对话框** 确认数据已加载 ### 加载 ROOT 文件 1. **点击 "Browse"** 按钮 2. **选择您的 .root 文件** 在文件浏览器中 3. **ROOT 文件浏览器对话框** 显示: - 所有直方图 (TH1*, TH2*, TH3*) - 所有图表 (TGraph*) - 所有 TTree 及分支信息 4. **选择对象** 加载 5. **选择**:在单个画布、叠加或分割画布中绘制对象,或仅打开 TBrowser 6. **选择**:加载对象或仅打开 TBrowser ### 使用 ROOT 分析(新功能) ROOT 分析提供带有链式过滤的高级 TTree 事件选择。 #### 打开 ROOT 分析 #### 基本工作流程 1. **加载 ROOT 文件**:文件在启动时自动打开 2. **选择对象**:从下拉菜单中选择 TTree 或直方图 3. **选择分支**(用于 TTree):选择要绘制的分支 4. **设置条目范围**: - 开始条目:要包含的第一个事件(默认:0) - 结束条目:要包含的最后一个事件(默认:全部) 5. **添加切割公式**(可选): Energy > 100 Energy > 50 && Pt > 30 abs(Eta) < 2.5 6. **添加到链**:点击保存此选择步骤 7. **重复**:添加更多步骤以构建链 8. **绘图**: - "Plot Current Only":仅当前设置 - "Plot with Chain Cuts":累积应用所有切割 #### 选择链示例 ``` Step 1: Events:Energy | Cut: Energy > 70 → ~7000 events Step 2: Events:Pt | Cut: Pt > 30 → ~3500 events Step 3: Events:Eta | Cut: abs(Eta) < 2.0 → ~2800 events Final plot shows Energy distribution with ALL cuts applied! ``` #### 保存和加载链 - **保存链**:点击 "Save Chain" → 选择文件名 → 创建 `.selchain` 文件 - **加载链**:点击 "Load Chain" → 选择 `.selchain` 文件 → 恢复所有步骤 - 链文件是纯文本的,易于版本控制 #### 重要说明 - **直方图**:仅条目/Bin 范围有效,切割被忽略(直方图是预先分 bin 的) - **TTree**:条目范围和切割均有效 - **Entry$ 变量**:用于切割中条目号的特殊 ROOT 变量 Entry$ < 1000 # 前 1000 个事件 Entry$ >= 5000 && Entry$ < 10000 # 事件 5000-10000 ### 创建图表 #### 从 CSV 数据: 1. 加载 CSV 文件(见上文) 2. 点击 **"Add Plot"** 按钮 3. **列选择对话框** 打开: - 选择图表类型 (TGraph, TGraphErrors, TH1, TH2, TH3) - 选择 X 轴列 - 选择 Y 轴列(用于散点图/2D 图) - 选择 Z 轴列(用于 3D 图) - 可选择误差列(X 误差,Y 误差) 4. 点击 **"OK"** 添加到绘图列表 5. 配置画布选项: - 同一画布(叠加)或单独画布 - 带行/列的分割画布 6. 点击 **"Create Plots"** #### 从 ROOT 文件: 1. 加载 ROOT 文件(见上文) 2. **选项 A**:在浏览器中选择对象 → 点击 "Load Selected" 3. **选项 B**:打开 TBrowser 并将对象拖到 GUI 窗口 4. **选项 C**:使用条目选择器进行高级 TTree 过滤 5. 图表在画布中自动创建 ### 使用拖放 GUI 支持从 ROOT 的 TBrowser 拖放: 1. **打开 TBrowser**:在 ROOT 终端输入 `TBrowser b;` 或在文件浏览器中点击 "TBrowser Only" 2. **导航** 到您的 ROOT 文件 3. **拖动直方图或图表** 从 TBrowser 4. **放置到 GUI 主窗口** 5. **自动创建图表**: - TH1/TH2/TH3 → 直方图 - TGraph → 带标记的图表 - TTree → 显示信息(使用条目选择器进行绘图) ### 使用脚本引擎(新功能) 集成脚本引擎支持 ROOT/C++ 和 Python。 #### 命令框(单行执行) 在底部输入框中输入命令并按 **Enter**: ``` // ROOT/C++ commands: cout << "Hello ROOT" << endl TH1F *h = new TH1F("h","Test",100,-5,5) h->FillRandom("gaus",10000) h->Draw() gDirectory->ls() ``` #### 脚本编辑器(多行脚本) 在编辑器中编写多行脚本并点击 **"Run Script"**: ``` void myAnalysis() { TCanvas *c = new TCanvas("c","Analysis",1200,800); c->Divide(2,2); // Plot 1: Gaussian c->cd(1); TH1F *h1 = new TH1F("h1","Gaussian",100,-5,5); h1->FillRandom("gaus",10000); h1->Draw(); // Plot 2: Exponential c->cd(2); TH1F *h2 = new TH1F("h2","Exponential",100,0,10); h2->FillRandom("expo",10000); h2->Draw(); // Plot 3: Scatter c->cd(3); TGraph *g = new TGraph(50); for(int i=0; i<50; i++) { g->SetPoint(i, i, sin(i*0.2)*exp(-i/20.0)); } g->Draw("APL"); // Plot 4: 2D histogram c->cd(4); TH2F *h3 = new TH2F("h3","2D Dist",50,-3,3,50,-3,3); h3->FillRandom("gaus",50000); h3->Draw("COLZ"); c->Update(); } ``` 然后在命令框中:`myAnalysis()` #### Python 脚本 从语言下拉菜单中选择 "Python": ``` import ROOT # Create canvas c = ROOT.TCanvas("c", "Python Plot", 800, 600) # Create and fill histogram h = ROOT.TH1F("h", "Energy Distribution;Energy [GeV];Events", 100, 0, 200) for i in range(10000): h.Fill(ROOT.gRandom.Gaus(100, 15)) h.SetLineColor(ROOT.kBlue) h.SetFillColor(ROOT.kCyan) h.Draw() c.Update() ``` #### 加载外部脚本 - 点击 **"Load..."** 加载 `.C`、`.cpp` 或 `.py` 文件 - 点击 **"Save..."** 保存当前脚本 - 脚本在会话之间持久保存 #### 重要脚本说明 - **多行 C++**:必须包装在函数中(见上文示例) - **单行 C++**:可直接执行 - **Python**:无需包装 - **访问已加载的文件**:在脚本中使用 `gDirectory->GetFile()` ### 高级拟合(新功能) GUI 包含全面的拟合功能: #### 可用拟合函数 - **高斯**:标准正态分布 - **多项式**:Pol0(常数)、Pol1(线性)、Pol2-Pol4(高阶) - **指数**:衰减函数 - **正弦函数**:正弦、正弦+偏移、阻尼正弦(用于振荡数据) - **自定义**:输入任何 ROOT 公式 #### 使用拟合 1. 从下拉菜单中选择拟合函数 2. 对于自定义拟合,输入公式:`[0]*x^2 + [1]*x + [2]` 3. 正常创建图表 4. 自动应用拟合 5. 显示带不确定度的拟合参数 #### RooFit 集成 对于直方图上的高斯拟合,自动使用 RooFit: - 更稳健的参数估计 - 正确的误差传播 - 显示 Chi-square 和 NDF ### 自定义图表 **坐标轴标签:** - 自动使用 CSV 中的列表头 - 或使用 ROOT 对象标题 - 可在 ROOT 画布中自定义 **图表样式:** - 右键点击画布获取 ROOT 上下文菜单 - 访问 SetLogy()、SetLogx()、SetLogz() - 更改标记样式、颜色 - 修改直方图填充颜色 **导出:** - 右键点击画布 → "Save As" - 支持格式:PDF, PNG, EPS, SVG, ROOT ## 示例工作流程 ### 示例 1:简单 CSV 散点图 ``` # sample_data.csv x,y,xerr,yerr,z 1.0,2.5,0.1,0.2,5.0 2.0,3.8,0.1,0.3,7.5 3.0,5.2,0.15,0.25,9.0 4.0,7.1,0.2,0.4,11.5 ``` 1. 点击 "Browse" → 加载 `sample_data.csv` 2. 点击 "Add Plot" 3. 选择:TGraphErrors, X=x, Y=y, X-Error=xerr, Y-Error=yerr 4. 点击 "OK" 5. 点击 "Create Plots" 6. 结果:带误差棒的散点图 ### 示例 2:高级 TTree 事件选择(新功能) 创建测试数据: ``` cd RootEntrySelector ./test_entry_selector # Creates test_data.root with physics events ``` 分析工作流程: ``` 1. Open Entry Selector with test_data.root 2. Select "Events" tree 3. Add selection chain: Step 1: - Branch: Energy - Cut: Energy > 70 - Click "Add to Chain" Step 2: - Branch: Pt - Cut: Pt > 30 - Click "Add to Chain" Step 3: - Branch: Eta - Cut: abs(Eta) < 2.0 - Click "Add to Chain" 4. Click "Plot with Chain Cuts" 5. Result: Histogram showing Energy distribution for events passing ALL cuts 6. Save chain: Click "Save Chain" → "physics_cuts.selchain" 7. Later: Click "Load Chain" → Select "physics_cuts.selchain" → All steps restored! ``` ### 示例 3:基于脚本的分析(新功能) ``` // Load in script editor: void quickAnalysis() { // Get the loaded ROOT file TFile *f = (TFile*)gDirectory->GetFile(); if (!f) { cout << "No file loaded!" << endl; return; } // Get tree TTree *tree = (TTree*)f->Get("Events"); if (!tree) { cout << "Tree not found!" << endl; return; } // Apply cuts and plot TCanvas *c = new TCanvas("c", "Analysis", 1200, 400); c->Divide(3,1); c->cd(1); tree->Draw("Energy", "Energy > 50"); c->cd(2); tree->Draw("Pt", "Pt > 20 && Energy > 50"); c->cd(3); tree->Draw("Eta:Phi", "Energy > 100", "COLZ"); c->Update(); cout << "Total events: " << tree->GetEntries() << endl; cout << "Passed Energy>50: " << tree->GetEntries("Energy > 50") << endl; } ``` 执行:在命令框中输入 `quickAnalysis()` 并按 Enter ### 示例 4:拟合分析(新功能) ``` 1. Load ROOT file with histogram or create from CSV 2. Select fit function: "Gaussian" 3. Add plot, create plots 4. Fit automatically applied 5. Fit parameters shown on plot: - Mean ± error - Sigma ± error - Chi²/NDF 6. Right-click → Save As → Export with fit ``` ## 功能详情 ### CSV 预览对话框 - **实时预览**:以表格形式查看前 100 行 - **分隔符自动检测**:智能检测常见分隔符 - **自定义分隔符**:支持任何单字符分隔符 - **表头检测**:自动识别表头行 - **跳过行**:跳文件开头的元数据或注释 - **编码支持**:UTF-8, ASCII, ISO-8859-1 - **大文件处理**:高效加载 10万+ 行的文件 ### 列选择对话框 - **图表类型选择**:TGraph, TGraphErrors, TH1, TH2, TH3 - **可视化列选择**:通过下拉菜单轻松选择 - **数据类型检测**:自动数字/字符串检测 - **误差列支持**:可选 X/Y 误差棒 - **3D 图表支持**:可选 Z 列用于 3D 图 - **智能默认值**:自动选择合适的列 ### ROOT 文件浏览器(新功能) - **对象树视图**:分层显示文件内容 - **类型过滤**:直方图、图表、树分别分类 - **多选**:一次加载多个对象 - **TTree 详情**:显示条目数和分支信息 - **TBrowser 集成**:可选择打开传统 TBrowser - **双击绘图**:双击对象即可立即绘图 ### ROOT 分析(新功能) - **条目范围选择**:选择特定事件范围 - **切割公式**:使用 ROOT 语法应用物理切割 - **选择链**:构建多步过滤器管道 - **链持久化**:保存/加载选择工作流 - **实时反馈**:查看过滤后的条目计数 - **分支选择**:选择要绘制的 TTree 分支 - **直方图支持**:直方图的 Bin 范围选择 - **文档**:全面的用户指南和示例 ### 脚本引擎(新功能) - **双重界面**:命令框用于单行,编辑器用于脚本 - **多语言**:支持 ROOT/C++ 和 Python - **文件 I/O**:加载/保存脚本文件 - **输出捕获**:脚本输出显示在专用面板中 - **自动补全**:ROOT 命令可用(如已启用) - **历史记录**:使用方向键浏览命令历史 ### 高级拟合(新功能) - **多种函数**:高斯、多项式、指数、正弦 - **自定义函数**:支持任何 ROOT 公式 - **RooFit 集成**:直方图上的高斯拟合自动使用 - **参数显示**:显示带不确定度的拟合结果 - **Chi-square**:显示质量指标 - **可视化叠加**:拟合曲线绘制在图表上 ## 键盘快捷键 | 按键 | 操作 | |-----|--------| | `Ctrl+O` | 打开文件浏览器 | | `Ctrl+S` | 保存当前画布 | | `Ctrl+Q` | 退出应用程序 | | `Ctrl+N` | 新建画布 | | `Ctrl+W` | 关闭当前画布 | | `Enter` | 执行命令(在命令框中)| | `Ctrl+Enter` | 运行脚本(在脚本编辑器中)| ## 配置文件 ### CMakeLists.txt 配置构建选项: ``` # Enable/disable features option(BUILD_TESTING "Build tests" OFF) option(ENABLE_WARNINGS "Enable compiler warnings" ON) # Set ROOT components find_package(ROOT REQUIRED COMPONENTS Core Hist Graf Gpad Tree RIO RooFit RooFitCore # For advanced fitting Gui Rint # For GUI ROOTTPython # For Python support ) ``` ### ROOT 分析集成 要将条目选择器集成到主 GUI 中: 1. 参见 `RootEntrySelector/docs/INTEGRATION_GUIDE.md` 2. 添加头文件并创建 RootEntrySelector 实例 3. 添加菜单项或按钮以启动 4. 提供完整的集成示例 ## 已知问题与限制 ### 当前限制 - CSV 文件必须格式正确(无锯齿状行) - 推荐的最大文件大小:1000 万行 - 拖放仅适用于 ROOT 6.26+ - 某些 ROOT 对象类型尚不支持 (THStack, TMultiGraph) - 脚本编辑器没有语法高亮 - 条目选择器为独立工具(提供集成指南) ### 已知问题 1. **大型 TTree 文件**:加载非常大的 TTree(>1GB)可能会很慢 2. **X11 渲染**:Wayland 会话上存在一些显示问题(请使用 X11) 3. **内存**:大型数据集可能需要大量 RAM 4. **脚本错误**:多行 C++ 脚本必须包装在函数中 ### 解决方法 - 对于大文件:仅加载特定分支或使用条目选择器 - 对于 Wayland:设置 `GDK_BACKEND=x11` 环境变量 - 对于内存问题:分块处理数据 - 对于脚本:参见脚本故障排除指南 ## 故障排除 ### "无法打开 libAdvancedPlotGUI.so" ``` # Add build directory to library path export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd) ``` ### "字典生成失败" ``` # Clean and rebuild rm -rf build/ mkdir build && cd build cmake .. && make clean && make ``` ### "条目选择器出现段错误崩溃" 这通常是由于 `Form()` 函数问题。最新版本已修复此问题: ``` cd RootEntrySelector make clean make # Ensure you're using the fixed versions from outputs folder ``` ### "条目选择器中的分支选择无法工作" 使用 `AddSelectionStep_PROPER_FIX.cpp` 中修复的 `AddSelectionStep()`,它: - 正确捕获从组合框中选择的分支 - 验证分支在树中是否存在 - 如果未选择分支,则回退到第一个分支并发出警告 ### "使用链切割绘图返回 -1 个条目" 确保分支名称包含在链步骤中: - 链应存储 "TreeName:BranchName" 格式 - 使用修复的 `PlotWithChain()`,如果缺失则自动选择第一个分支 - 检查控制台输出以获取详细的错误消息 ### "脚本无法执行" 常见问题: - **多行脚本**:必须包装在函数中 (void myFunc() { ... }) - **单行命令**:可直接执行 - **语法错误**:检查 ROOT 语法 - **缺少分号**:C++ 需要它们 - 有关完整指南,请参见 `SCRIPT_TROUBLESHOOTING_GUIDE.txt` ### "CSV 预览对话框不显示" - 检查文件权限:`ls -l your_file.csv` - 验证文件是有效的 CSV/文本格式 - 尝试使用提供的 sample_data.csv - 检查非 ASCII 字符 ### "拖放不工作" - 确保您使用的是 ROOT 6.26 或更高版本:`root --version` - 检查 X11 是否正在运行:`echo $DISPLAY` - 重启应用程序和 TBrowser - 确保您是从 TBrowser 拖动,而不是文件管理器 ### "加载 CSV 后按钮仍处于禁用状态" - 检查控制台是否有错误消息 - 验证 CSV 包含数字数据 - 尝试使用不同的分隔符设置 - 确保至少有 2 列数字 ## 开发 ### 使用调试符号构建 ``` cmake -DCMAKE_BUILD_TYPE=Debug .. make -j$(nproc) gdb ./AdvancedPlotGUIApp ``` ### 添加自定义功能 **新图表类型:** 1. 在 `PlotTypes.h` 中添加图表类型枚举 2. 在 `PlotTypes.cpp` 中实现创建器 3. 在 `ColumnSelectorDialog` 中添加 UI 控件 4. 更新 `PlotManager` 以处理新类型 **新文件格式:** 1. 在 `FileHandler.cpp` 中添加加载器 2. 创建预览对话框(遵循 `CSVPreviewDialog` 模式) 3. 更新 UI 以包含新文件类型 4. 添加到文件类型过滤器 ### 代码风格 - 遵循 ROOT 编码约定 - 对 ROOT 类使用 `ClassDef`/`ClassImp` 宏 - 使用 Doxygen 注释记录公共方法 - 尽可能保持函数在 50 行以内 - 使用 `snprintf()` 而不是 `Form()` 进行字符串构造 ### 测试 **基本功能:** ``` ./AdvancedPlotGUIApp # Test CSV loading with sample_data.csv # Test ROOT file loading # Test drag & drop from TBrowser # Test script execution ``` **脚本引擎:** ``` # Test single commands # Test multi-line scripts # Test Python execution # Test load/save scripts ``` ## 贡献 欢迎贡献!请: 1. Fork 仓库 2. 创建功能分支 3. 进行更改并使用清晰的提交消息 4. 使用示例数据进行彻底测试 5. 在 README 中记录新功能 6. 提交 Pull Request ### 优先领域 - ROOT 分析 GUI 集成到主应用程序 - 脚本编辑器语法高亮 - 额外的拟合函数 - THStack 和 TMultiGraph 支持 - 改进的错误处理 - 单元测试 ## 引用 如果您在研究中使用本软件,可以按以下方式引用: ``` @software{advanced_root_plotting_gui, author = {Siddharth Parashari}, title = {Advanced ROOT Plotting GUI}, version = {2.3}, year = {2024}, url = {https://github.com/yourusername/Advance_ROOT_Plotting_dev} } ``` ## 联系与支持 - **问题**:在 GitHub 上开启 issue - **Email**:siddharthparashri5@gmail.com - **ROOT 论坛**:https://root-forum.cern.ch/ ## 致谢 - 使用 [ROOT Data Analysis Framework](https://root.cern/) 构建 - 灵感来源于 ROOT 的 TBrowser 和 TCanvas - 感谢 ROOT 开发团队 - 用于高级拟合的 RooFit 集成 ## 版本历史 ### v2.3 (当前版本 - 2026年2月) - **新功能**:带有链式过滤的高级 ROOT 分析 - TTree 和直方图的条目选择 - 使用 ROOT 语法的复杂切割公式 - 顺序过滤器链 - 保存/加载选择工作流 - 带集成指南的独立工具 - **新功能**:集成脚本引擎 - ROOT/C++ 和 Python 脚本执行 - 多行脚本编辑器 - 命令行界面 - 加载/保存外部脚本 - 输出捕获面板 - **新功能**:高级拟合功能 - 多种预定义拟合函数 - 自定义函数支持 - 用于高斯拟合的 RooFit 集成 - 显示带不确定度的拟合参数 - **新功能**:ROOT 文件浏览器对话框 - 交互式对象树视图 - 多选支持 - TTree 分支信息 - 双击绘图 - **改进**:全面的错误处理 - **改进**:用于故障排除的调试输出 - **修复**:将 Form() 用法替换为 snprintf() 以提高稳定性 - **修复**:TTree 绘图中的分支选择 - **修复**:内存泄漏和段错误 - **文档**:添加了全面的文档 ### v2.2 - 带实时格式化的 CSV 预览对话框 - 列选择器改进 - 从 TBrowser 拖放 - 多画布管理 - 多种格式导出 ### v2.1 - ROOT 文件支持 - TTree 基本处理 - 直方图和图表加载 - 初始 GUI 框架 ### v2.0 - 使用现代 C++17 完全重写 - ROOT 6.26+ 支持 - 提高稳定性 ### v1.0 (初始版本) - 基本 CSV 文件支持 - 简单的绘图功能 - 列选择 - 画布管理 ### 计划功能 (v2.4) - 将 ROOT 分析完全集成到主 GUI 中 - 脚本编辑器语法高亮 - ROOT 命令自动补全 - 图表模板和样式管理器 - 批处理模式 - 额外的文件格式支持 (HDF5, Parquet) - 单元测试框架 - 性能分析工具 **最后更新**:2026年2月18日 **版本**:2.3 **维护者**:Siddharth Parashari ## 快速入门指南 **用于 CSV 分析:** 1. 启动:`./AdvancedPlotGUIApp` 2. 点击 "Browse" → 选择 CSV 3. 配置分隔符 → 点击 "Load" 4. 点击 "Add Plot" → 选择列 → OK 5. 点击 "Create Plots" **用于 ROOT 文件分析:** 1. 启动:`./AdvancedPlotGUIApp` 2. 点击 "Browse" → 选择 .root 文件 3. 在浏览器中选择对象 → "Load Selected" 4. 自动创建图表 **用于高级 TTree 过滤:** 1. 启动条目选择器:使用 `Use ROOT Analysis` 按钮加载 ROOT 文件 2. 选择树 → 选择分支 3. 输入切割公式 → "Add to Chain" 4. 为多个切割重复此操作 5. "Plot with Chain Cuts" → 查看结果 6. "Save Chain" 以保留工作流 **用于基于脚本的分析:** 1. 启动主 GUI 2. 选择 "ROOT/C++" 或 "Python" 语言 3. 在命令框(底部)中输入命令 + Enter 4. 或在编辑器中编写多行脚本 + "Run Script" 5. 使用 `gDirectory->GetFile()` 访问已加载的文件 **需要帮助?** - 参见 `RootEntrySelector/docs/` 获取详细教程 - 检查控制台输出是否有错误消息 - 有关脚本问题,请查阅 `SCRIPT_TROUBLESHOOTING_GUIDE.txt` - 在 GitHub 上开启 issue,包含: - 您正在尝试做什么 - 您看到的错误 - 控制台输出 - ROOT 版本:`root --version`
标签:Bash脚本, C++, CSV导入, GUI, HEP软件, ROOT, TCut语法, TTree筛选, 出版级图表, 图形用户界面, 拖拽功能, 数据分析工具, 数据擦除, 文件浏览器, 直方图, 科学绘图, 脚本执行, 跨平台桌面应用, 过滤器链, 逆向工具, 高能物理