我使用以下内容定义了自己的ZFit pdf:
class AngularPDFWithAcceptance(zfit.pdf.BasePDF):
def __init__(self, ctl_name, ctk_name, phi_name, params, name):
from math import pi
ctl = zfit.Space(ctl_name, limits=(-1.0, 1.0))
ctk = zfit.Space(ctk_name, limits=(-1.0, 1.0))
phi = zfit.Space(phi_name, limits=(-pi, pi))
obs = ctl*ctk*phi
super().__init__(obs=obs, params=params, name=name)
integral_full_limits = zfit.Space(axes=self.axes, limits = self.space.limits)
self.register_analytic_integral( self.compute_integral_full_limits, integral_full_limits )
...
def compute_integral_full_limits(limits, params, model):
# this is the integral over 8pi
...
return normalization在创建PDF时,我会得到一个错误
...
File "/data/bfys/wouterh/miniconda3/envs/bd2ksteeEnv/lib/python3.8/site-packages/zfit/core/integration.py", line 606, in __call__
return self.integrate(*args, **kwargs)
File "/data/bfys/wouterh/miniconda3/envs/bd2ksteeEnv/lib/python3.8/site-packages/zfit/core/space.py", line 2777, in new_func
return func(*args, **kwargs)
TypeError: compute_integral() got multiple values for argument 'limits'有人能说出我做错了什么吗?提前谢谢..。
发布于 2022-06-06 11:49:30
问题
这里出现的问题是,积分注册是在实例的init中完成的,但它实际上是一个类方法,应该在类中注册,而不是在实例上注册(下面错误的技术细节)。
解决方案
因此,该示例应该如下所示:
class AngularPDFWithAcceptance(zfit.pdf.BasePDF):
def __init__(self, ctl_name, ctk_name, phi_name, params, name):
from math import pi
ctl = zfit.Space(ctl_name, limits=(-1.0, 1.0))
ctk = zfit.Space(ctk_name, limits=(-1.0, 1.0))
phi = zfit.Space(phi_name, limits=(-pi, pi))
obs = ctl*ctk*phi
super().__init__(obs=obs, params=params, name=name)
...
def compute_integral_full_limits(limits, params, model):
# this is the integral over 8pi
...
return normalization
# the following code is duplicated, one could refactor it, i.e. into a class method/attribute
from math import pi
ctl = zfit.Space(ctl_name, limits=(-1.0, 1.0))
ctk = zfit.Space(ctk_name, limits=(-1.0, 1.0))
phi = zfit.Space(phi_name, limits=(-pi, pi))
obs = ctl*ctk*phi
integral_full_limits = zfit.Space(axes=self.axes, limits = self.space.limits) AngularPDFWithAcceptance.register_analytic_integral(compute_integral_full_limits, integral_full_limits)解释
问题是compute_integral_full_limits是一个(实例)方法。因此,它将自动接受第一个(隐藏)参数self。然而,由于注册函数是一个类方法,它在某种程度上混淆了签名,即不自动提供自作为第一个参数。因此,最有可能的是,在某种程度上,限制被作为第一种和第二种观点来讨论。
https://stackoverflow.com/questions/72507415
复制相似问题