跳转至

修改衰变

学习目标

  • 学习如何自定义生成的衰变
  • 学习如何修改使用的衰变道
  • 学习如何修改/移除生成器级别的切割

添加衰变道

为了使我们的衰变模型更接近现实,我们可以加入已知的共振态。例如,除了完全依赖相空间,我们可以加入显著的$\( \phi\to K^{+}K^{-} \)共振态。在Dst_D0pi,KKmumu=DecProdCut.dec衰变文件中,我们可以在\( D^0 \)的衰变道中添加另一行:

Decay MyD0
  0.5 K+ K- mu+ mu- PHSP;
  0.5 phi mu+ mu- PHSP;
Enddecay
CDecay MyantiD0

这会触发 EvtGen 在 50%的情况下产生\( \phi \)共振态,随后\( \phi \)会衰变。然而,我们没有告诉EvtGen\( \phi \)应该只衰变为\( K^+K^- \),因此它会从所有已知的衰变中随机选择。我们不修改通用的phi,而是采用与\( D^0 \)衰变相同的技巧:

Alias MyPhi phi
ChargeConj MyPhi MyPhi

Decay MyD0
  0.25 K+ K- mu+ mu- PHSP;  
  0.75 MyPhi mu+ mu- PHSP;  
Enddecay
CDecay MyantiD0

Decay MyPhi
  1.000 K+  K-    VSS;
Enddecay
修改衰变文件后,必须在Gen/DecFiles目录中重新运行make。用 Gauss尝试修改后的衰变文件,你应该会在\( m(K^+K^-) \)不变质量分布中看到一个大的峰值。不要忘记在运行命令中更改$DECFILESROOT,使其指向你当前的DecFile安装!此外,你可能需要更改27175000.py中的ToolSvc().EvtGenDecay.UserDecayFile行,使其指向你的DecFile 安装!

生成器级别的切割

探测器模拟计算成本高昂,而事件生成相对较快。在生成器级别进行切割可以节省大量的CPU和磁盘空间(这意味着你几乎可以免费获得更多真正有用的事件)。在生成器级别,你只能对分辨率前的量进行切割,所以通常你希望生成器切割对选定事件的效率是100%(在极小范围内)。默认示例是立即移除衰变产物远在 LHCb接受度之外的事件。 这在"DaugthersInLHCb"中实现,在昵称中也称为"DecProdCut"。这要求每个"稳定带电粒子"都在LHCb 接受度周围的一个宽松区域内(Theta在 10-400毫弧度)。 切割工具需要用 C++ 实现,并位于Gen/GenCuts包中。

移除生成器切割

生成器切割的绝对效率可以从相应的网站或生成的GeneratorLog.xml文件中获得,该文件包含:

<efficiency name = "generator level cut">
    <after> 5 </after>
    <before> 27 </before>
    <value> 0.18519 </value>
    <error> 0.074757 </error>
</efficiency>
然而,如果你需要效率作为某些其他可观测量的函数,这是不够的。相反,你可能希望创建一个没有应用任何切割的纯生成器样本。有两种可能性:

  1. 修改 DecFile 并重新编译包
  2. 覆盖最初由<event-type>.py配置的 python 配置

第二种选择通常更容易,在目前使用的示例中只需要添加一行配置:

Generation().SignalPlain.CutTool = ""
这必须在27175000.py被引入后包含(例如在Gauss-Job.py中)。 你可以确信这会改变观察到的分布,并导致生成器级别切割效率达到100%。在 EOS上可以找到一个大样本:root://eosuser.cern.ch//eos/lhcb/wg/dpa/wp7/Run3SK/simulation/Gauss-27175000-50000ev-resonance.xgen(包含上面添加的额外共振态)。 查看领头粒子的赝快度分布。这说明了 Gauss 中信号衰变生成的另一个默认行为:如果选定的信号粒子沿 z轴的动量为负,则生成事件的 z 轴会反转。

修改切割工具

如果你需要修改切割工具,通常可以在多个选项中选择,这些选项的复杂度和投入生产的时间逐渐增加:

  1. 如有可能,配置Gen/GenCuts中现有的切割工具。
  2. LoKi::GenCutTool中使用 GenParticleLoKi 函数子(以G开头)。
  3. 对于真正特殊的情况,最后的办法是:编写自己的IGenCutTool接口的C++ 实现。

LoKi::GenCutTool风格的工具是一个很好的解决方案,当你需要施加超出DaughtersInLHCb提供的要求时,例如\( D^0 \)的最小横动量。

Sim11中的LoKi

Loki 在 up to 并包括 Sim10 的 DecFiles 中工作得很好,但是在 Sim11 中Loki 将不再被支持!当 Sim11 发布时,请注意新的文档!

对于本地测试,可以通过覆盖27175000.py设置的默认切割工具来轻松实现:

from Configurables import LoKi__GenCutTool
from Gauss.Configuration import *
Generation().SignalPlain.CutTool = "LoKi::GenCutTool/TightCut"

from Configurables import LoKi__GenCutTool
gen=Generation()
gen.SignalPlain.addTool ( LoKi__GenCutTool , 'TightCut' )

tightCut = Generation().SignalPlain.TightCut
tightCut.Decay     = '^[D*(2010)+ ==> ^( D0 ==> ^K+ ^K- ^mu+ ^mu- ) pi+]CC'
tightCut.Preambulo += [
   'from GaudiKernel.SystemOfUnits import GeV',
   'inAcc         =  in_range ( 0.005 , GTHETA , 0.400 )',
   'goodD0        =  ( GPT > 2.0 * GeV )',
]
tightCut.Cuts = {
   '[D0]cc': 'goodD0',
   '[K+]cc': 'inAcc',
   '[mu+]cc': 'inAcc'
}
你可以再次检查这是否有效,10,000个事件的更大样本可以在root://eosuser.cern.ch//eos/lhcb/wg/dpa/wp7/Run3SK/simulation/Gauss-27175000-10000ev-gencuttools.xgen找到。

提示

关于这种情况的具体示例,下面提供了 27175000.py 文件的 diff 对比结果。

@@ -15,7 +18,33 @@
from Configurables import EvtGenDecay
ToolSvc().addTool( EvtGenDecay )
ToolSvc().EvtGenDecay.UserDecayFile = "$DECFILESROOT/dkfiles/Dst_D0pi,KKmumu=DecProdCut.dec"
-Generation(genAlgName).SignalPlain.CutTool = "DaughtersInLHCb"
+# Generation(genAlgName).SignalPlain.CutTool = ""
+
+###
+
+from Configurables import LoKi__GenCutTool
+from Gauss.Configuration import *
+Generation(genAlgName).SignalPlain.CutTool = "LoKi::GenCutTool/TightCut"
+
+from Configurables import LoKi__GenCutTool
+gen=Generation(genAlgName)
+gen.SignalPlain.addTool ( LoKi__GenCutTool , 'TightCut' )
+
+tightCut = Generation(genAlgName).SignalPlain.TightCut
+tightCut.Decay     = '^[D*(2010)+ ==> ^( D0 ==> ^K+ ^K- ^mu+ ^mu- ) pi+]CC'
+tightCut.Preambulo += [
+   'from GaudiKernel.SystemOfUnits import GeV',
+   'inAcc         =  in_range ( 0.005 , GTHETA , 0.400 )',
+   'goodD0        =  ( GPT > 2.0 * GeV )',
+]
+tightCut.Cuts = {
+   '[D0]cc': 'goodD0',
+   '[K+]cc': 'inAcc',
+   '[mu+]cc': 'inAcc'
+}
+
+###
+
Generation(genAlgName).SignalPlain.SignalPIDList = [ 413,-413 ]

# Ad-hoc particle gun code

你可能还会注意到事件产生的速度略有减慢:默认情况下,一个未能通过生成器切割的事件(在Pythia 和 EvtGen完成后应用)会触发模拟的整个生成阶段的重置。因此,非常严格的生成器级别切割,加上在最小偏置事件中很少出现的信号粒子,可能导致生成阶段比探测器响应的模拟花费更长的时间(你可能需要重新考虑你的事件生成策略)。关于可以应用哪种切割,你可以查看GeneratorLevelTightCuts定义。

修改和新版本

由于切割工具要在 DecFiles中配置,它们构成了事件类型本身的一个组成部分。 因此,任何改变所产生事件的修改通常需要发布一个新的DecFile,包括一个新的事件类型或一个新的模拟子版本,以便事件最终进入不同的记录位置。