事件重构

用户的物理分析以本程序产生的 ROOT 文件为基准。

用户首先需要修改 UesrDefine.hh 文件中的定义

#define RAWFILEPATH "/wuhongyi1/dataroot/"   //原始ROOT文件的路径
#define RAWFILENAME "data"                   //原始文件的文件名
#define RAWFILECRATENUMBER "C2"              //原始文件中机箱数,一个机箱为 C1,两个为 C2,依次类推

#define ROOTFILEPATH "/wuhongyi1/datarootevent/"  //要生成ROOT文件的路径
#define ROOTFILENAME "event"                      //要生成ROOT文件的名字

#define WAVEFORM
#define ENERGYSUM
#define QDCSUM
#define EXTERNALTS

#define EVENTTIMEWINDOWSWIDTH  8000   //ns   事件时间窗

WAVEFORM、ENERGYSUM、QDCSUM、EXTERNALTS 这四个变量分别表示 波形、能量计算相关的三段积分和基线、 8段 QDC 积分、外部时钟。如果数据中不需要该数据,或者记录的数据没有以上的数据,则注释掉相应的定义。抛弃不要的数据,可以极大提高数据转换速度。

文件夹内还有 par.dat 配置文件,该文件需要用户自行配置。该文件共 8 列,第一列表示机箱标号,第二列表示模块编号,第三列表示通道编号,第四列表示探测器类型编号,第五列表示同一类型探测器的子编号,第六、七、八表示刻度系数。生成数据中变量 raw 为 原始道址,变量 e 为原始道址添加刻度系数计算之后得到的能量值。该文件中没有配置的通道数据将被丢弃,当探测器编号或者探测器子编号设置为 -1 时,该通道数据同样丢弃。

修改之后执行以下命令编译程序:

make clean
make

编译成功之后将生成一个可执行文件 event,程序运行方式:

./event  [RunNnumber]

其中 [RunNnumber] 为想要转换的文件运行编号(数据中第一个机箱的运行编号)。

本程序转换之后,同一个事件被存在一个 vector 容器中,定义如下:

std::vector<DATAEVENT> event_vec;
// DATAEVENT 定义如下
// 最小数据单元
typedef struct DATAEVENT
{
  Short_t      det;//探测器类型
  Short_t      id;//探测器编号

  Short_t         sr;
  Long64_t        ts;
  UShort_t        raw;//原始能量道址
  double        e;//刻度能量

  Bool_t          pileup;
  Bool_t          outofr;
  Short_t         cfd;
  Bool_t          cfdft;
  Short_t         cfds;

#ifdef ENERGYSUM
  Bool_t esumf;
  UInt_t trae;  // trailing energy sum
  UInt_t leae;        // leading energy sum
  UInt_t gape;        // Gap energy sum
  UInt_t base;        // baseline value
#endif

#ifdef QDCSUM
  Bool_t qsumf;
  UInt_t qs[8];
#endif

#ifdef EXTERNALTS
  Bool_t etsf;
  Long64_t ets;
#endif

#ifdef WAVEFORM
  unsigned short ltra;
  std::vector<unsigned short> data;
#endif

} DATAEVENT;

用户可参考以下代码读取该数据

typedef struct DATAEVENT
{
  Short_t      det;//探测器类型
  Short_t      id;//探测器编号

  Short_t         sr;
  Long64_t        ts;
  UShort_t        raw;//原始能量道址
  double        e;//刻度能量

  Bool_t          pileup;
  Bool_t          outofr;
  Short_t         cfd;
  Bool_t          cfdft;
  Short_t         cfds;

#ifdef ENERGYSUM
  Bool_t esumf;
  UInt_t trae;  // trailing energy sum
  UInt_t leae;        // leading energy sum
  UInt_t gape;        // Gap energy sum
  UInt_t base;        // baseline value
#endif

#ifdef QDCSUM
  Bool_t qsumf;
  UInt_t qs[8];
#endif

#ifdef EXTERNALTS
  Bool_t etsf;
  Long64_t ets;
#endif

#ifdef WAVEFORM
  unsigned short ltra;
  std::vector<unsigned short> data;
#endif

} DATAEVENT;



std::vector<DATAEVENT>* br_event;
br_event = 0;
tree->SetBranchAddress("event",&br_event);



tree->GetEntry(xxx);

for(int i = 0; i < br_event->size(); i++)
  {
      int flag = (*br_event)[i].det;
      Short_t id = (*br_event)[i].id;
      UShort_t raw = (*br_event)[i].raw;
      double e = (*br_event)[i].e;
      Long64_t ts = (*br_event)[i].ts;
      Bool_t pileup = (*br_event)[i].pileup;
      Bool_t outofr = (*br_event)[i].outofr;
      // ...
  }