Python函数替换variab的一部分

2024-04-20 04:12:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为粒子物理学的一个项目编写代码(使用pyroot)。你知道吗

在我的初稿中,我用了下面这行

for i in MyTree:    

   pion.SetXYZM(K_plus_PX, K_plus_PY, K_plus_PZ,K_plus_MM)

这基本上赋予π介子括号中变量的值,即动量和介子的质量。你知道吗

撇开物理学不谈,我想写一个“形式”函数:

def myfunc(particle):
    return %s_PX % particle

我知道这是错的。我想实现的是编写一个函数,它允许,对于给定的粒子,将particle\u PX,particle\u PY等设置为SetXYZM的参数。你知道吗

谢谢你的帮助

B类


Tags: 项目函数代码inpyfor粒子plus
1条回答
网友
1楼 · 发布于 2024-04-20 04:12:38

要从字符串变量访问类属性,可以使用python的getattr

import ROOT
inputfile = ROOT.TFile.Open("somefile.root","read")
inputtree = inputfile.Get("NameOfTTree")
inputtree.Print()
# observe that there are branches
# K_plus_PX
# K_plus_PY
# K_plus_PZ
# K_plus_MM
# K_minus_PX
# K_minus_PY
# K_minus_PZ
# K_minus_MM
# pi_minus_PX
# pi_minus_PY
# pi_minus_PZ
# pi_minus_MM

def getx(ttree,particlename):
    return getattr(ttree,particlename+"_PX")
def gety(ttree,particlename):
    return getattr(ttree,particlename+"_PY")
def getz(ttree,particlename):
    return getattr(ttree,particlename+"_PZ")
def getm(ttree,particlename):
    return getattr(ttree,particlename+"_MM")
def getallfour(ttree,particlename):
    x = getattr(ttree,particlename+"_PX")
    y = getattr(ttree,particlename+"_PY")
    z = getattr(ttree,particlename+"_PZ")
    m = getattr(ttree,particlename+"_MM")
    return x,y,z,m


for entry in xrange(inputtree.GetEntries()):
    inputtree.GetEntry(entry)
    pion1 = ROOT.TLorentzVector()
    x = getx(inputtree,"K_plus")
    y = gety(inputtree,"K_plus")
    z = getz(inputtree,"K_plus")
    m = getm(inputtree,"K_plus")
    pion2.SetXYZM(x,y,z,m)
    x,y,z,m = getallfour(inputtree,"pi_minus")
    pion2 = ROOT.TLorentzVector()
    pion2.SetXYZM(x,y,z,m)

正如Josh Caswell所链接的,您可以类似地访问变量名:

def getx(particlename):
    x = globals()[partilcename+"_PX"]

尽管这可能会很快变得令人讨厌,因为你的变量是全局的还是局部的,对于局部的,在哪个上下文中。你知道吗

相关问题 更多 >