1

首先,感谢您制作了一个非常简洁的 Pythonic 工具,可以用作 RooFit 的替代品。

我已经成功定义了一个自定义 2D PDF,但我不完全确定如何注册我的函数的分析积分:

来自 WolframAlpha 的解析积分

PDF定义如下:

class PdfForDeltaW(zfit.pdf.ZPDF):
    """Pdf to calculate epsilon, w, and delta w, as a function of sig-flav and tag-flav"""

    _N_OBS = 2
    _PARAMS = "epsilon w delta_w mix_prob".split()

    def _unnormalized_pdf(self, x):
        """Calculation of PDF value"""
        sigflav, tagflav = zfit.ztf.unstack_x(x)

        epsilon = self.params["epsilon"]
        w = self.params["w"]
        delta_w = self.params["delta_w"]
        mix_prob = self.params["mix_prob"]

        dilution = 1 - 2 * w
        mixing = 1 - 2 * mix_prob
        return (
                0.5
                * epsilon
                * (1 - sigflav * tagflav * (sigflav * delta_w + dilution * mixing))
        )

通过查看github上的示例,除了可以通过属性访问的拟合变量之外,我不确定如何访问拟合的 observables 以用于计算(即 xsigflav和 y,对于我的 2D 案例)。tagflavparams

此外,我不确定应该如何定义我的限制。我知道 x 和 y 都必须在 [-1, 1] 范围内。我认为最好能更清楚地了解zfit.Space.from_axes应该如何使用该函数,以及它与解析积分的关系。

干杯,科尔姆

4

1 回答 1

0

谢谢你,让我解释一下不同的事情:

拟合变量

如果您想在整个 PDF 上注册积分,则不需要访问sigflavtagflav,因为您在它们上进行了积分。如果您有一个部分积分,您可以通过 访问它们x,它充当_unnormalized_pdf案例中的参数。

轴距

ASpace定义您的坐标和范围/范围。通常,作为 PDF 的用户,这涉及到 observables(如 DataFrame 的列)。但是,如果我们创建一个 PDF,它要使用的 observables 当然是未知的,PDF 工作“基于位置”或“基于轴”。例如,在您的示例中,sigflav位于轴 0 上,无论可观察到的名称将与 PDF 一起使用。这就是为什么在注册积分时,我们需要使用根据Space定义的a axes

积分限制

可以对 PDF 的限制进行不同的控制。如果需要,可以实现更细粒度的控制,但目前可用的是您可以定义从某个点/或任何地方到某个点/任何地方的积分。

这很有用,因为您可以注册多个积分。也许你知道一般积分,它有一个复杂的形式。但是您也知道,例如,从 -1 到 1 的积分正好是 1。因此您也可以注册它并赋予它更高的优先级。这意味着如果您对 -1 到 1 进行积分,则使用更简单的形式,否则使用更一般的形式。

在您的情况下,您想从 ANY 注册到 ANY,或将 ANY_LOWER、ANY_UPPER 用作限制,就像这样

lower_full = ((zfit.Space.ANY_LOWER, zfit.Space.ANY_LOWER),)
upper_full = ((zfit.Space.ANY_UPPER, zfit.Space.ANY_UPPER),)
integral_full_limits = zfit.Space.from_axes(axes=(0, 1),
                                            limits=(lower_full, upper_full))
于 2019-12-03T07:14:33.480 回答