跳转至

交互式探索文件

学习目标

  • 了解 RawEvents 和 RawBanks 如何保存事件信息
  • 使用 GaudiPython 交互式探索文件内容
  • 能够手动遍历候选衰变链(就像 DaVinci 所做的那样)

在文件中,事件以 RawEvents 形式存储。每个 RawEvent 由多个 RawBanks 组成,RawEvent 是一个出现在路径 /Event/<stream>/RawEvent 的 DataObject,需通过 GaudiConf.reading 中的do_unpacking 函数解包为(可能多个)不同的 RawBanks。

本教程相关的 RawBanks 包括:

  • DstData:存储物理对象(如信号候选粒子)和需持久化的重建对象

  • HltDecReports:存储 HLT{1,2}(及 Sprucing)触发器的决策结果

其他探测器 RawBanks (如 MuonRich),可按需持久化

使用 GaudiPython

要查看 DST 文件的内容,我们可以使用 GaudiPython。这是 LHCb 事件处理框架(即 Gaudi)的 Python 实现版本,该框架被 Moore 和 DaVinci 应用程序所采用。

事件处理时,Gaudi 将事件数据存入 瞬态事件存储 (TES) 。存储中的元素通过类目录路径的字符串访问,返回DataObject。

探索文件内容

让我们看一个经过 HLT2 处理\(B_s^0 \to D_s^- \pi^+\)的MC文件。该文件已复制到 DPA EOS 空间,路径为 /eos/lhcb/wg/dpa/wp7/Run3SK/exampleDST/00257716_00000011_1.hlt2.dst

exploring script 复制到本地1,该脚本调用 do_unpacking 函数,并将其命名为 explore.py 。运行以下命令:

lb-run Moore/v56r2 python -i explore.py --input_file root://eoslhcb.cern.ch//eos/lhcb/wg/dpa/wp7/Run3SK/exampleDST/00257716_00000011_1.hlt2.dst --input_process Hlt2 --simulation True

你现在应该会看到一长串看起来像路径的位置。

探索 HltDecReports 决策信息

HltDecReports RawBank已经被解包和解码,可以通过 TES 位置 /Event/<source>/DecReports 访问,其中 source ;是 Hlt1 , Hlt2Spruce

输入 evt['/Event/Hlt2/DecReports'],查看在此数据上运行的所有 HLT2 线路以及它们相应的“决策”,决策是一个布尔值,取决于该事件是否触发了每条线路。

前进到一个阳性决策

此文件中的所有事件都通过了至少一条 HLT2 触发线路。尽管这里我们有\(B_s^0 \to D_s^- \pi^+\)MC事件,但是由于效率问题,并非所有事件实际上都会通过 Hlt2B2OC_BdToDsmPi_DsmToKpKmPim HLT2 线路。使用辅助函数 advance_decision 移动到第一个通过 Hlt2B2OC_BdToDsmPi_DsmToKpKmPim 线路的事件。

advance_decision("Hlt2B2OC_BdToDsmPi_DsmToKpKmPim")

探索 DstData 候选者信息

已经被解包的DstData RawBank ,作为 python 脚本运行 evt.dump () 的结果,你应该会看到所有可访问的TES 位置。事件总是将初级顶点(PVs)持久化在 TES 位置:

/Event/Rec/Vertex/Primary

以及重建摘要在 TES 位置:

/Event/Rec/Summary

在事件转储中,你会看到 TES 位置 /Event/HLT2/Hlt2B2OC_BdToDsmPi_DsmToKpKmPim/Particles 。这些是通过 Sprucing 线路选择的候选者,该线路选择 \(B_s^0\) 介子衰变为 \(D_s^-\) 介子和 \(\pi^+\) 。该衰变链是 LHCb flagship measurements \(B_s^0 - \bar{B_s^0}\) 混合的关键通道。此线路使用的衰变描述符为: \[ B_s^0 \to D_s^- \pi^+ \] 其中 \[ D_s^- \to K^- K^+ \pi^- \] 这个衰变链有一个母粒子 \(B_s^0\) ,一个中间态粒子 \(D_s^-\) 和 4 个最终状态粒子:相关的 \(\pi^-\) 和 3 个 \(D_s^-\) 的三体衰变物 \(K^-\), \(K^+\) 和 \(\pi^-\)。请注意,此衰变的电荷共轭也包括在内。

我们可以更仔细地查看这些候选者;通过运行

evt['/Event/HLT2/Hlt2B2OC_BdToDsmPi_DsmToKpKmPim/Particles'].size()

我们可以看到在此事件中有一个 \(B_s^0\to D_s^- \pi^+\) 候选粒子。如果事件中有多个符合 Sprucing 线路所有选择的轨道组合,那么一个事件可以有多个候选者。

我们可以使用索引访问这个候选者。通过运行

evt['/Event/HLT2/Hlt2B2OC_BdToDsmPi_DsmToKpKmPim/Particles'][0]

我们可以看到候选粒子 \(B_s^0\) 的属性,如测量质量动量等。我们还可以看到,根据MC粒子编号方案,这个 \(B_s^0\) 粒子被分配了particleID number -511。请记住,这并不意味着这个粒子本身有什么内在属性表明它是 \(B_s^0\) ,此编号基于衰变描述符而非粒子固有属性(定义见PDG)。

到目前为止,我们只查看了顶级候选者 \(B_s^0\) ,但我们可以使用这个脚本来探索整个衰变树。要查看我们的信号候选者的衰变产物,我们可以使用 daughtersVector()。尝试运行

evt['/Event/HLT2/Hlt2B2OC_BdToDsmPi_DsmToKpKmPim/Particles'][0].daughtersVector().size()

我们看到,正如预期的那样,有 2 个 \(B_s^0\) 的子粒子,索引 0 处是中间粒子 \(D_s^-\) ,索引 1 处是最终状态粒子 \(\pi^+\)。

遍历decay tree

通过链式调用 daughtersVector() ,并依据 Monte Carlo particle numbering scheme,确认\(D_s^-\)例子中索引为 0, 1, 2 处的子粒子分别被分配为\(K^- K^+ \pi^-\)。

恭喜!你现在可以交互式地探索 LHCb 数据文件了。这对于你未来的数据分析来说是一个很好的调试工具!


  1. 这可以通过以下命令完成:wget -O explore.py https://gitlab.cern.ch/lhcb/Moore/-/raw/master/Hlt/Moore/tests/options/starterkit/first-analysis-steps/interactive-dst.py?inline=false