读取(大/多)slha文件的python包
xslha的Python项目详细描述
xslha
xSLHA
是以slha格式编写的文件的python
解析器。它经过优化,可以快速读取大量文件样本。
安装
该软件包可以通过
pip install xslha
并通过
import xslha
读取单个频谱文件
读取频谱文件file
并在类对象中搜索信息spc
是通过命令完成的
spc=xslha.read(file)
之后,您可以使用Value
命令访问不同的信息,例如
print("tan(beta): ",spc.Value('MINPAR',[3]))
print("T_u(3,3): ",spc.Value('TU',[3,3]))
print("m_h [GeV]: ",spc.Value('MASS',[25]))
print("Gamma(h) [GeV]: ",spc.Value('WIDTH',25))
print("BR(h->W^+W^-): ",spc.Value('BR',[25,[-13,13]]))
print("Sigma(pp->N1 N1,Q=8TeV): ",spc.Value('XSECTION',[8000,(2212,2212),(1000021,1000021)]))
产生以下输出
tan(beta): 16.870458
T_u(3,3): 954.867627
m_h [GeV]: 117.758677
Gamma(h) [GeV]: 0.00324670136
BR(h->W^+W^-): 0.000265688227
Sigma(pp->N1 N1,Q=8TeV): [[(0, 2, 0, 0, 0, 0), 0.00496483158]]
因此,约定如下:
- 对于不同slha块中给出的信息,使用块的名称作为输入并使用块列表中的数字返回
- 粒子的宽度通过关键字
WIDHT
和粒子的pdg返回。 - 对于分支比率,关键字
BR
与一个嵌套列表一起使用,该列表说明衰变粒子的pdg以及最终状态 - 对于横截面,关键字
XSECTION
与一个嵌套列表一起使用,该列表说明质量能量中心和初始/最终状态的pdg。结果是一个列表,其中包含了重整方案、qed&qcd顺序等给定选项的所有计算横截面(有关详细信息,请参阅slha建议)。
访问频谱文件中信息的另一种可能性是查看不同的词典
spc.blocks
spc.widths
spc.br
spc.xsctions
包含所有信息
从目录中读取所有频谱文件
为了读取目录dir
中的多个频谱文件,可以使用命令
list_spc=xslha.read_dir(dir)
这将生成一个列表list_spc
,其中每个条目对应一个频谱。因此,例如,可以使用
[[x.Value('MINPAR',[1]),x.Value('MASS',[25])] for x in list_spc]
提取二维散点图的输入。
快速读入许多文件
读取许多频谱文件可能非常耗时。然而,目前的研究通常不需要slha文件中提供的许多信息。因此,可以通过首先提取所有相关信息来加快读取速度。这将生成较小的文件,以便更快地读入。这可以通过read_dir
:
entries
来完成。
list_spc_fast=xslha.read_dir("/home/$USER/Documents/spc1000",entries=["# m0","# m12","# hh_1"])`
entries
定义一个字符串列表,可以使用grep
从slha文件中提取必要的行。如果实际上只需要slha文件中的一些条目,那么速度的提高很容易达到一个数量级。
速度
此优化对读取1000个文件的影响如下:
%%time
list_spc=xslha.read_dir("/home/$USER/Documents/spc1000")
CPU times: user 5.05 s, sys: 105 ms, total: 5.15 s
Wall time: 5.51 s
与
%%time
list_spc_fast=xslha.read_dir("/home/$USER/Documents/spc1000",entries=["# m0","# m12","# hh_1"])
CPU times: user 147 ms, sys: 132 ms, total: 280 ms
Wall time: 917 ms
我们还可以将其与其他可用的python解析器进行比较:
pylha
:
%%time
all_spc=[]
for filename in os.listdir("/home/$USER/Documents/spc1000/"):
with open("~/Documents/spc1000/"+filename) as f:
input=f.read()
all_spc.append(pylha.load(input))
CPU times: user 21.5 s, sys: 174 ms, total: 21.7 s
Wall time: 21.7 s
pyslha
{
%%time
all_spc=[]
for filename in os.listdir("/home/$USER/Documents/spc1000/"):
all_spc.append(pyslha.read(("/home/$USER/Documents/spc1000/"+filename)))
CPU times: user 13.3 s, sys: 152 ms, total: 13.5 s
Wall time: 13.5 s
读取存储在一个文件中的光谱
另一种保存频谱文件的常用方法是生成一个巨大的文件,其中不同的频谱由关键字分隔。xSLHA
可以通过为read
设置可选参数separator
来读取此类文件:
list_spc=xslha.read(file,separator=keyword)
在这种情况下,为了加快许多光谱的读取速度,还可以定义需要的条目:
list_spc=xslha.read(file,separator=keyword,entries=list)
在这种情况下,xSLHA
将首先使用cat
和grep
生成一个较小的频谱文件。例如,为了有效地读取用^{
list_spc=xslha.read("SpectrumFiles.spc",separator="ENDOFPARAMETERFILE",entries=["# m0", "# m12", "# hh_1"])
特殊块
有些程序使用的块不受官方SLHA惯例支持:
- ^{
} 期望块HIGGSBOUNDSINPUTHIGGSCOUPLINGSBOSONS
和HIGGSBOUNDSINPUTHIGGSCOUPLINGSFERMIONS
中的有效耦合比,它们的顺序与其他块不同(首先在所涉及粒子的pdg之后声明数值项) - ^{
} 由^{} 生成的版本可以计算对堕落。结果在与包含标准计算的DECAY
并行出现的DECAY1L
块中给出。xSLHA
将在读取文件时区分这些情况,并为Values
提供以下两个选项:
spc.Values('WIDTH1L',1000022)
spc.Values('BR1L',[1000023,[25,1000022]])
写入文件
SLHA格式的文件可以通过
xslha.write(blocks,file)
最好使用有序字典来定义块和块中的值。例如
import collections
out_blocks=collections.OrderedDict([
('MODSEL',collections.OrderedDict([('1', 1), ('2', 2),('6',0)])),
('MINPAR',collections.OrderedDict([('1', 1000.),('2', 2000),('3',10),('4',1),('5',0)]))
])
xslha.write(out_blocks,"/home/$USER/Documents/LH.in")