Python 函数替换部分变量
Python function replacing part of variable
我正在为粒子物理项目编写代码(使用 pyroot)。
在我的初稿中,我使用以下行
for i in MyTree:
pion.SetXYZM(K_plus_PX, K_plus_PY, K_plus_PZ,K_plus_MM)
这基本上是将括号中变量的值赋给 pion,即 momenta 和 inv。 kaon 的质量。
抛开物理学,我想写一个函数"of the form":
def myfunc(particle):
return %s_PX % particle
我知道这是错误的。我想要实现的是编写一个函数,允许对于给定的粒子,将 particle_PX、particle_PY 等设置为 SetXYZM.
的参数
感谢您的帮助,
乙
要从字符串变量访问 class 属性,您可以使用 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"]
尽管关于您的变量是全局变量还是局部变量以及对于局部变量,在哪种情况下,这可能会很快变得令人讨厌。
我正在为粒子物理项目编写代码(使用 pyroot)。
在我的初稿中,我使用以下行
for i in MyTree:
pion.SetXYZM(K_plus_PX, K_plus_PY, K_plus_PZ,K_plus_MM)
这基本上是将括号中变量的值赋给 pion,即 momenta 和 inv。 kaon 的质量。
抛开物理学,我想写一个函数"of the form":
def myfunc(particle):
return %s_PX % particle
我知道这是错误的。我想要实现的是编写一个函数,允许对于给定的粒子,将 particle_PX、particle_PY 等设置为 SetXYZM.
的参数感谢您的帮助,
乙
要从字符串变量访问 class 属性,您可以使用 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"]
尽管关于您的变量是全局变量还是局部变量以及对于局部变量,在哪种情况下,这可能会很快变得令人讨厌。