读取(大/多)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将首先使用catgrep生成一个较小的频谱文件。例如,为了有效地读取用^{}生成的文件,可以使用:

list_spc=xslha.read("SpectrumFiles.spc",separator="ENDOFPARAMETERFILE",entries=["# m0", "# m12", "# hh_1"])

特殊块

有些程序使用的块不受官方SLHA惯例支持:

  • ^{}期望块HIGGSBOUNDSINPUTHIGGSCOUPLINGSBOSONSHIGGSBOUNDSINPUTHIGGSCOUPLINGSFERMIONS中的有效耦合比,它们的顺序与其他块不同(首先在所涉及粒子的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")

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Android Studio Java将输入存储在一个文本文件中,所有输入在一行中加载后显示在屏幕上   在我的Java应用程序中记录日志配置   java在将socket从Localhost构建到google时出错。通用域名格式   在java中通过SOAP发送附件   java Tomcat的JspWriter编码不正确   java应用程序在截击StringRequest时不断崩溃   java需要一个保持顺序并具有“顺序敏感”equals/hashCode的映射   Java框架地址栏元素   java如何从特定范围生成4个不重复的数字?   googleappenginejava。安全AccessControlException:拒绝访问(java.io.FilePermission)   加载游戏时java Fabric入口点异常崩溃   java Python我如何读入和读出,以便其他读者可以阅读它以便进一步购买?