跳转至

Nebula simlulator

NEBULA 相关库#

1. 参数管理 (Parameter Management)#

TNEBULASimParameter#

  • 文件: TNEBULASimParameter.hh / .cc
  • 功能: 存储 NEBULA 的所有参数,包括探测器数量、类型、几何参数等,供仿真和数据转换模块调用。

NEBULASimParameterReader#

  • 文件: NEBULASimParameterReader.hh / .cc
  • 功能: 负责读取 NEBULA 的参数文件(如 NEBULA_Dayone.csvNEBULA_Detectors_Dayone.csv),并将参数加载到仿真环境中。包括探测器数量、位置、尺寸等信息。

相关数据文件#

  • 文件: NEBULA_Dayone.csv / NEBULA_Detectors_Dayone.csv
  • 功能: 这些文件包含 NEBULA 阵列的具体参数,如每个探测器的位置、尺寸、编号等,仿真时会被 NEBULASimParameterReader 读取。

2. 几何构建 (Geometry Construction)#

NEBULAConstruction & NEBULAConstructionMessenger#

  • 文件: NEBULAConstruction.hh / .cc
  • 功能: 定义 NEBULA 中子探测器的几何结构,包括探测器阵列的尺寸、位置、材料等。负责在 Geant4 仿真中构建 NEBULA 的物理模型。
  • 文件: NEBULAConstructionMessenger.hh / .cc
  • 功能: 提供命令接口,允许用户通过宏文件或命令行动态设置 NEBULA 的参数(如阵列参数文件、探测器参数文件等)。

3. 仿真核心 (Simulation Core)#

NEBULASD#

  • 文件: NEBULASD.hh / .cc
  • 功能: 定义 NEBULA 探测器的敏感体(Sensitive Detector),用于在仿真过程中记录粒子在 NEBULA 探测器中的能量沉积、位置、时间等信息。

4. 数据处理 (Data Handling)#

NEBULASimDataInitializer#

  • 文件: NEBULASimDataInitializer.hh / .cc
  • 功能: 初始化 NEBULA 仿真数据结构,为每个探测器分配数据存储空间,准备后续的数据采集和分析。

NEBULASimDataConverter_TArtNEBULAPla#

  • 文件: NEBULASimDataConverter_TArtNEBULAPla.hh / .cc
  • 功能: 将仿真过程中产生的原始数据(如能量沉积、探测器响应等)转换为实验分析所需的数据格式(如 TArtNEBULAPla),并写入 ROOT 文件。实现了能量转换、分辨率处理等物理模型。

Geant4 中的 NEBULA 输出#

1. 仿真输出信息#

  • 能量沉积 (Energy Deposit):每个中子探测器模块(NEBULA单元)记录粒子(主要是中子)在探测器中的能量沉积。
  • 探测器响应 (Detector Response):根据能量沉积、探测器分辨率等物理模型,模拟实际实验中探测器的信号输出(如光电倍增管响应)。
  • 位置与时间信息 (Position and Time Information):记录粒子在探测器中的击中位置、入射时间等,用于后续飞行时间(TOF)、空间分布等分析。
  • 粒子类型与编号 (Particle Type and ID):区分不同粒子(如中子、伪中子、伪γ等)及其对应的探测器编号,便于事件筛选和物理分析。

2. 生成的 ROOT 文件#

  • 数据结构:NEBULA 的仿真数据会被转换为 ROOT 文件,通常包含一个或多个 TTree(如 NEBULAPla),每个条目对应一次事件或一次探测器响应。
  • 内容举例
    • 每个事件下,NEBULAPla 分支存储所有被击中的 NEBULA 探测器单元的响应数据(如能量、位置、时间等)。
    • 其他分支可能包含全局事件信息、粒子初始参数等。
  • 用途
    • 实验数据对比:仿真输出的 ROOT 文件结构和实验数据一致,可直接用于与真实实验数据进行对比分析。
    • 物理分析:可用 ROOT 脚本或分析框架对仿真数据进行统计、绘图、效率计算、能谱分析等。
    • 探测器性能评估:分析探测器的响应分布、分辨率、探测效率等,为实验设计和数据解释提供依据。
    • 事件筛选:可根据粒子类型、能量、位置等条件筛选感兴趣的物理事件。

3. 相关代码模块#

  • NEBULASimDataConverter_TArtNEBULAPla:负责将仿真数据转换为 TArtNEBULAPla 格式,并写入 ROOT 文件。
  • NEBULASD:实现敏感体,负责在仿真过程中采集粒子击中信息。
  • NEBULASimParameterReader:读取探测器参数,决定输出数据结构和内容。

TArtNEBULAPla 数据结构#

TArtNEBULAPla 是 ANAROOT 框架中用于描述 NEBULA 单个探测器模块(Plastic Scintillator)的数据结构类。它的主要作用是存储和管理每个 NEBULA 塑料条的实验或仿真响应信息,便于后续物理分析和实验数据处理。

1. 主要成员变量(常见字段)#

  • 探测器编号(ID): 唯一标识每个 NEBULA 塑料条的编号,便于定位和区分。
  • 能量(Energy): 记录粒子在该塑料条中的能量沉积(单位通常为 MeV),用于能谱分析和事件筛选。
  • 时间(Time): 记录粒子击中该塑料条的时间信息(如飞行时间 TOF),用于时间分辨和事件重建。
  • 位置(Position): 塑料条在阵列中的空间坐标,便于空间分布分析和几何重建。
  • 粒子类型(ParticleID): 记录击中该塑料条的粒子类型(如中子、γ、重离子等),用于物理过程区分。
  • 分辨率/信号处理相关变量: 可能包含模拟或实验中的分辨率、信号幅度、光电倍增管响应等信息。

2. TArtNEBULAPla.h#

#ifndef _TARTNEBULAPLA_H_
#define _TARTNEBULAPLA_H_

#include "TString.h"

#include <iostream>

#include "TArtDataObject.hh"

class TArtNEBULAPla : public TArtDataObject
{
public:
  TArtNEBULAPla()
    : TArtDataObject(),
      fLayer(-1), fSubLayer(-1), fHit(0),
      fQURaw(-1), fQDRaw(-1), fQUCal(-1), fQDCal(-1),
      fQAvePed(-1), fQAveCal(-1), fLogQPed(0), fLogQCal(0),
      fIvSqrtQUPed(-1), fIvSqrtQDPed(-1), fIvSqrtQAvePed(-1), 
      fTURaw(-1), fTDRaw(-1), fTURaw_Trailing(-1), fTDRaw_Trailing(-1), fTURaw_Width(-1), fTDRaw_Width(-1), 
      fTURawRef(-1), fTDRawRef(-1), fTURaw_SubTRef(-99999), fTDRaw_SubTRef(-99999), 
      fTUMulti(0), fTDMulti(0), 
      fTUCal(-1), fTDCal(-1), fTUCal_Width(-1), fTDCal_Width(-1), fTUSlw(-1), fTDSlw(-1),
      fDTRaw(-1), fDTCal(-1), fDTSlw(-1), fTAveRaw(-1), fTAveCal(-1), fTAveSlw(-1),
      fTUCalT0(-1), fTDCalT0(-1), fTUSlwT0(-1), fTDSlwT0(-1), fTAveCalT0(-1), fTAveSlwT0(-1),
      fTTOFGamma(-90000), fTTOFNeutron(-90000),
      fPosCal(0), fPosSlw(0), fFlightLength(-1), fFlightAngle(-1)
  {
    for(Int_t i=0; i<3; ++i) fDetPos[i] = -90000;
    for(Int_t i=0; i<3; ++i) fPos[i] = -90000;
  }
  virtual ~TArtNEBULAPla(){;}

  virtual void SetLayer(Int_t val){fLayer = val;}
  virtual void SetSubLayer(Int_t val){fSubLayer = val;}
  virtual void SetDetPos(const Double_t* val){for(Int_t i=0; i<3; ++i){fDetPos[i] = val[i];}}
  virtual void SetDetPos(Double_t val, Int_t i){fDetPos[i] = val;}
  virtual void SetHit(Int_t val){fHit = val;}

  virtual void SetQURaw(Int_t    val){fQURaw = val;}
  virtual void SetQDRaw(Int_t    val){fQDRaw = val;}
  virtual void SetQUPed(Double_t val){fQUPed = val;}
  virtual void SetQDPed(Double_t val){fQDPed = val;}
  virtual void SetQUCal(Double_t val){fQUCal = val;}
  virtual void SetQDCal(Double_t val){fQDCal = val;}
  virtual void SetQAvePed(Double_t val){fQAvePed = val;}
  virtual void SetQAveCal(Double_t val){fQAveCal = val;}
  virtual void SetLogQPed(Double_t val){fLogQPed = val;}
  virtual void SetLogQCal(Double_t val){fLogQCal = val;}
  virtual void SetIvSqrtQUPed(Double_t val){fIvSqrtQUPed = val;}
  virtual void SetIvSqrtQDPed(Double_t val){fIvSqrtQDPed = val;}
  virtual void SetIvSqrtQAvePed(Double_t val){fIvSqrtQAvePed = val;}

  virtual void SetTURaw(Int_t    val){fTURaw = val;}
  virtual void SetTDRaw(Int_t    val){fTDRaw = val;}
  virtual void SetTURaw_Trailing(Int_t    val){fTURaw_Trailing = val;}
  virtual void SetTDRaw_Trailing(Int_t    val){fTDRaw_Trailing = val;}
  virtual void SetTURaw_Width(Int_t    val){fTURaw_Width = val;}
  virtual void SetTDRaw_Width(Int_t    val){fTDRaw_Width = val;}
  virtual void SetTURawRef(Int_t val){fTURawRef = val;}
  virtual void SetTDRawRef(Int_t val){fTDRawRef = val;}
  virtual void SetTURaw_SubTRef(Int_t val){fTURaw_SubTRef = val;}
  virtual void SetTDRaw_SubTRef(Int_t val){fTDRaw_SubTRef = val;}
  virtual void SetTUMulti(Int_t val){fTUMulti = val;}  
  virtual void SetTDMulti(Int_t val){fTDMulti = val;}  
  virtual void SetTUCal(Double_t val){fTUCal = val;}
  virtual void SetTDCal(Double_t val){fTDCal = val;}
  virtual void SetTUCal_Width(Double_t val){fTUCal_Width = val;}
  virtual void SetTDCal_Width(Double_t val){fTDCal_Width = val;}
  virtual void SetTUSlw(Double_t val){fTUSlw = val;}
  virtual void SetTDSlw(Double_t val){fTDSlw = val;}
  virtual void SetDTRaw(Double_t val){fDTRaw = val;}
  virtual void SetDTCal(Double_t val){fDTCal = val;}
  virtual void SetDTSlw(Double_t val){fDTSlw = val;}
  virtual void SetTAveRaw(Double_t val){fTAveRaw = val;}
  virtual void SetTAveCal(Double_t val){fTAveCal = val;}
  virtual void SetTAveSlw(Double_t val){fTAveSlw = val;}
  virtual void SetTUCalT0(Double_t val){fTUCalT0 = val;}
  virtual void SetTDCalT0(Double_t val){fTDCalT0 = val;}
  virtual void SetTUSlwT0(Double_t val){fTUSlwT0 = val;}
  virtual void SetTDSlwT0(Double_t val){fTDSlwT0 = val;}
  virtual void SetTAveCalT0(Double_t val){fTAveCalT0 = val;}
  virtual void SetTAveSlwT0(Double_t val){fTAveSlwT0 = val;}
  virtual void SetTTOFGamma(Double_t val){fTTOFGamma = val;}
  virtual void SetTTOFNeutron(Double_t val){fTTOFNeutron = val;}

  virtual void SetPosCal(Double_t val){fPosCal = val;}
  virtual void SetPosSlw(Double_t val){fPosSlw = val;}
  virtual void SetPos(const Double_t* val){for(Int_t i=0; i<3; ++i) fPos[i] = val[i];}
  virtual void SetPos(Double_t val, Int_t i){fPos[i] = val;}
  virtual void SetFlightLength(Double_t val){fFlightLength = val;}
  virtual void SetFlightAngle(Double_t val){fFlightAngle = val;}

  virtual Int_t GetLayer() const {return fLayer;}
  virtual Int_t GetSubLayer() const {return fSubLayer;}
  virtual const Double_t* GetDetPos() const {return fDetPos;}
  virtual Double_t GetDetPos(Int_t i) const {return fDetPos[i];}
  virtual Int_t GetHit() const {return fHit;}

  virtual Int_t    GetQURaw() const {return fQURaw;}
  virtual Int_t    GetQDRaw() const {return fQDRaw;}
  virtual Double_t GetQUPed() const {return fQUPed;}
  virtual Double_t GetQDPed() const {return fQDPed;}
  virtual Double_t GetQUCal() const {return fQUCal;}
  virtual Double_t GetQDCal() const {return fQDCal;}
  virtual Double_t GetQAvePed() const {return fQAvePed;}
  virtual Double_t GetQAveCal() const {return fQAveCal;}
  virtual Double_t GetLogQPed() const {return fLogQPed;}
  virtual Double_t GetLogQCal() const {return fLogQCal;}
  virtual Double_t GetIvSqrtQUPed() const {return fIvSqrtQUPed;}
  virtual Double_t GetIvSqrtQDPed() const {return fIvSqrtQDPed;}
  virtual Double_t GetIvSqrtQAvePed() const {return fIvSqrtQAvePed;}

  virtual Int_t    GetTURaw() const {return fTURaw;}
  virtual Int_t    GetTDRaw() const {return fTDRaw;}
  virtual Int_t    GetTURaw_Trailing() const {return fTURaw_Trailing;}
  virtual Int_t    GetTDRaw_Trailing() const {return fTDRaw_Trailing;}
  virtual Int_t    GetTURaw_Width() const {return fTURaw_Width;}
  virtual Int_t    GetTDRaw_Width() const {return fTDRaw_Width;}
  virtual Int_t    GetTURawRef() const {return fTURawRef;}
  virtual Int_t    GetTDRawRef() const {return fTDRawRef;}
  virtual Int_t    GetTURaw_SubTRef() const {return fTURaw_SubTRef;}
  virtual Int_t    GetTDRaw_SubTRef() const {return fTDRaw_SubTRef;}
  virtual Int_t    GetTUMulti() const {return fTUMulti;}
  virtual Int_t    GetTDMulti() const {return fTDMulti;}
  virtual Double_t GetTUCal() const {return fTUCal;}
  virtual Double_t GetTDCal() const {return fTDCal;}
  virtual Double_t GetTUCal_Width() const {return fTUCal_Width;}
  virtual Double_t GetTDCal_Width() const {return fTDCal_Width;}
  virtual Double_t GetTUSlw() const {return fTUSlw;}
  virtual Double_t GetTDSlw() const {return fTDSlw;}
  virtual Double_t GetDTRaw() const {return fDTRaw;}
  virtual Double_t GetDTCal() const {return fDTCal;}
  virtual Double_t GetDTSlw() const {return fDTSlw;}
  virtual Double_t GetTAveRaw() const {return fTAveRaw;}
  virtual Double_t GetTAveCal() const {return fTAveCal;}
  virtual Double_t GetTAveSlw() const {return fTAveSlw;}
  virtual Double_t GetTUCalT0() const {return fTUCalT0;}
  virtual Double_t GetTDCalT0() const {return fTDCalT0;}
  virtual Double_t GetTUSlwT0() const {return fTUSlwT0;}
  virtual Double_t GetTDSlwT0() const {return fTDSlwT0;}
  virtual Double_t GetTAveCalT0() const {return fTAveCalT0;}
  virtual Double_t GetTAveSlwT0() const {return fTAveSlwT0;}
  virtual Double_t GetTTOFGamma() const {return fTTOFGamma;}
  virtual Double_t GetTTOFNeutron() const {return fTTOFNeutron;}

  virtual Double_t GetPosCal() const {return fPosCal;}
  virtual Double_t GetPosSlw() const {return fPosSlw;}
  virtual const Double_t* GetPos() const {return fPos;}
  virtual Double_t GetPos(Int_t i) const {return fPos[i];}
  virtual Double_t GetFlightLength() const {return fFlightLength;}
  virtual Double_t GetFlightAngle() const {return fFlightAngle;}

private:
  Int_t    fLayer;  
  Int_t    fSubLayer;  
  Double_t fDetPos[3];
  Int_t    fHit;

  Int_t    fQURaw;
  Int_t    fQDRaw;
  Double_t fQUPed;
  Double_t fQDPed;
  Double_t fQUCal;
  Double_t fQDCal;
  Double_t fQAvePed;
  Double_t fQAveCal;
  Double_t fLogQPed;
  Double_t fLogQCal;
  Double_t fIvSqrtQUPed;
  Double_t fIvSqrtQDPed;
  Double_t fIvSqrtQAvePed;

  Int_t    fTURaw;
  Int_t    fTDRaw;
  Int_t    fTURaw_Trailing;
  Int_t    fTDRaw_Trailing;
  Int_t    fTURaw_Width;
  Int_t    fTDRaw_Width;
  Int_t    fTURawRef;
  Int_t    fTDRawRef;
  Int_t    fTURaw_SubTRef;
  Int_t    fTDRaw_SubTRef;
  Int_t    fTUMulti;
  Int_t    fTDMulti;
  Double_t fTUCal;
  Double_t fTDCal;
  Double_t fTUCal_Width;
  Double_t fTDCal_Width;
  Double_t fTUSlw;
  Double_t fTDSlw;
  Double_t fDTRaw;
  Double_t fDTCal;
  Double_t fDTSlw;
  Double_t fTAveRaw;
  Double_t fTAveCal;
  Double_t fTAveSlw;
  Double_t fTUCalT0;
  Double_t fTDCalT0;
  Double_t fTUSlwT0;
  Double_t fTDSlwT0;
  Double_t fTAveCalT0;
  Double_t fTAveSlwT0;
  Double_t fTTOFGamma;
  Double_t fTTOFNeutron;

  Double_t fPosCal;
  Double_t fPosSlw;
  Double_t fPos[3];
  Double_t fFlightLength;
  Double_t fFlightAngle;

  ClassDef(TArtNEBULAPla,1);
};
#endif

3. 成员变量详解#

a. 探测器结构相关#

  • fLayer: 所在层编号(如 NEBULA 阵列的第几层)。
  • fSubLayer: 子层编号(如同一层内的分组)。
  • fDetPos[3]: 探测器空间坐标(X, Y, Z),用于几何定位。

b. 信号与能量相关#

  • fQURaw / fQDRaw: 上/下端原始信号(ADC),未经过校准。
  • fQUCal / fQDCal: 上/下端校准后的信号(能量),单位通常为 MeV。
  • fQAveCal: 上下端信号的平均值,常用于能量重建。
  • fLogQCal: 信号的对数变换,便于谱分析或分辨率处理。
  • fIvSqrtQUPed 等: 信号处理相关变量,用于分辨率、噪声分析。

c. 时间相关#

  • fTURaw / fTDRaw: 上/下端原始时间信号(TDC)。
  • fTUCal / fTDCal: 校准后的时间信号(单位 ns)。
  • fTAveCal: 上下端时间的平均值,常用于飞行时间(TOF)计算。
  • fTTOFGamma / fTTOFNeutron: γ/中子的飞行时间,便于粒子鉴别。

d. 位置与飞行参数#

  • fPosCal / fPosSlw: 击中位置的校准值和慢信号值。
  • fPos[3]: 击中点的空间坐标(X, Y, Z)。
  • fFlightLength: 粒子从反应点到探测器的飞行距离。
  • fFlightAngle: 粒子入射角度。

e. 多重击中与参考信号#

  • fTUMulti / fTDMulti: 上/下端多重击中计数。
  • fTURawRef / fTDRawRef: 参考时间信号(如触发参考)。
  • fTURaw_SubTRef / fTDRaw_SubTRef: 与参考信号的差值。

f. 其他#

  • fHit: 是否被击中(0/1),用于事件筛选。
  • 还有大量信号处理相关变量(如 trailingwidthslw),用于详细分析探测器响应特性。
    fPos[3]:击中点的空间坐标(X, Y, Z)。
    fFlightLength:粒子从反应点到探测器的飞行距离。
    fFlightAngle:粒子入射角度。
  • 多重击中与参考信号
    fTUMulti / fTDMulti:上/下端多重击中计数。
    fTURawRef / fTDRawRef:参考时间信号(如触发参考)。
    fTURaw_SubTRef / fTDRaw_SubTRef:与参考信号的差值。
  • 其他
    fHit:是否被击中(0/1),用于事件筛选。
    还有大量信号处理相关变量(如 trailing、width、slw),用于详细分析探测器响应特性。

最后更新: 2025-08-23
创建日期: 2025-08-23