Example #1
0
 def get_peak_position(self):
     '''
     Returns the apparent position of the peak of the fitted PDF.
     Preconditions: attribute self.workspace is defined.
     '''
     return tools.pdf_mode(self.workspace.pdf('pm'), 
                           self.workspace.var('mmgMass'))
Example #2
0
 def get_peak_position(self):
     '''
     Returns the apparent position of the peak of the fitted PDF.
     Preconditions: attribute self.workspace is defined.
     '''
     return tools.pdf_mode(self.workspace.pdf('pm'), 
                           self.workspace.var('mmgMass'))
Example #3
0
    def __init__(self,
                 name,
                 title,
                 x,
                 t,
                 s,
                 r,
                 data,
                 mirror=ROOT.RooKeysPdf.NoMirror,
                 rho=1.,
                 forcerange=True):
        # t.setMin(ROOT.TMath.Log(1 + 0.01 * x.getMin()))
        # t.setMax(ROOT.TMath.Log(1 + 0.01 * x.getMax()))

        self.w = ROOT.RooWorkspace('logErecoOverEgen')
        # self.w.Import(data)
        self.shape = ROOT.RooKeysPdf(name + '_shape', title + ' shape', x,
                                     data, mirror, rho)
        self.r0val = tools.pdf_effsigma(self.shape, x)
        if self.r0val <= 0.:
            raise RuntimeError, ('Illegal value of pdf width: %f.' %
                                 self.r0val)
        self.r0 = ROOT.RooRealVar(name + '_r0', name + '_r0', self.r0val)
        self.s0val = tools.pdf_mode(self.shape, x)
        self.s0 = ROOT.RooRealVar(name + '_s0', name + '_s0', self.s0val)

        ## Define the transformation of x that introduces the dependence on the
        ## t, s and r
        self.xtransform = ROOT.RooClassFactory.makeFunctionInstance(
            'Roo' + name.title() + 'Xtransform', name + '_xtransform',
            "{s0} + (100 * (exp(t) - 1) - {s}) * {r0} / {r}".format(
                t=t.GetName(),
                s=s.GetName(),
                r=r.GetName(),
                s0=self.s0.GetName(),
                r0=self.r0.GetName()),
            ROOT.RooArgList(t, s, r, self.s0, self.r0))

        if forcerange:
            ## Restrict the allowed tranformed values to the range where the
            ## PDF was trained.
            self.xtransform_fullrange = self.xtransform
            self.xtransform_fullrange.SetName(name + '_xtransform_fullrange')
            self.xtransform_fullrange.SetTitle(name + '_xtransform_fullrange')
            self.xtransform = ROOT.RooClassFactory.makeFunctionInstance(
                'Roo' + name.title() + 'RangeTransform', name + '_xtransform',
                ('{lo} * ({x} <= {lo}) + '
                 '{x} * ({lo} < {x} & {x} < {hi}) + '
                 '{hi} * ({hi} <= {x})').format(
                     x=self.xtransform_fullrange.GetName(),
                     lo=x.getMin(),
                     hi=x.getMax()),
                ROOT.RooArgList(self.xtransform_fullrange))

        self.customizer = ROOT.RooCustomizer(self.shape, 'transform')
        self.customizer.replaceArg(x, self.xtransform)

        ROOT.RooKeysPdf.__init__(self, self.customizer.build())
        self.SetName(name)
        self.SetTitle(title)
Example #4
0
    def __init__(self, name, title, x, t, s, r, data,
                 mirror=ROOT.RooKeysPdf.NoMirror, rho=1., forcerange=True):
        # t.setMin(ROOT.TMath.Log(1 + 0.01 * x.getMin()))
        # t.setMax(ROOT.TMath.Log(1 + 0.01 * x.getMax()))
        
        self.w = ROOT.RooWorkspace('logErecoOverEgen')
        # self.w.Import(data)
        self.shape = ROOT.RooKeysPdf(name + '_shape', title + ' shape', x, data,
                                     mirror, rho)
        self.r0val = tools.pdf_effsigma(self.shape, x)
        if self.r0val <= 0.:
            raise RuntimeError, ('Illegal value of pdf width: %f.' %
                                 self.r0val)
        self.r0 = ROOT.RooRealVar(name + '_r0', name + '_r0', self.r0val)
        self.s0val = tools.pdf_mode(self.shape, x)
        self.s0 = ROOT.RooRealVar(name + '_s0', name + '_s0', self.s0val)

        ## Define the transformation of x that introduces the dependence on the
        ## t, s and r
        self.xtransform = ROOT.RooClassFactory.makeFunctionInstance(
            'Roo' + name.title() + 'Xtransform',
            name + '_xtransform',
            "{s0} + (100 * (exp(t) - 1) - {s}) * {r0} / {r}".format(
                t=t.GetName(),
                s=s.GetName(),
                r=r.GetName(),
                s0=self.s0.GetName(),
                r0=self.r0.GetName()
                ),
            ROOT.RooArgList(t, s, r, self.s0, self.r0)
            )

        if forcerange:
            ## Restrict the allowed tranformed values to the range where the
            ## PDF was trained.
            self.xtransform_fullrange = self.xtransform
            self.xtransform_fullrange.SetName(name + '_xtransform_fullrange')
            self.xtransform_fullrange.SetTitle(name + '_xtransform_fullrange')
            self.xtransform = ROOT.RooClassFactory.makeFunctionInstance(
                'Roo' + name.title() + 'RangeTransform',
                name + '_xtransform',
                ('{lo} * ({x} <= {lo}) + '
                 '{x} * ({lo} < {x} & {x} < {hi}) + '
                 '{hi} * ({hi} <= {x})').format(
                    x=self.xtransform_fullrange.GetName(),
                    lo=x.getMin(),
                    hi=x.getMax()
                    ),
                ROOT.RooArgList(self.xtransform_fullrange)
                )

        self.customizer = ROOT.RooCustomizer(self.shape, 'transform')
        self.customizer.replaceArg(x, self.xtransform)

        ROOT.RooKeysPdf.__init__(self, self.customizer.build())
        self.SetName(name)
        self.SetTitle(title)
Example #5
0
    def __init__(self, name, title, x, mode, width, data,
                 mirror=ROOT.RooKeysPdf.NoMirror, rho=1., forcerange=True):

        self.shape = ROOT.RooKeysPdf(name + '_shape', title + ' shape', x, data,
                                     mirror, rho)
        self.shapewidth = tools.pdf_effsigma(self.shape, x)
        self.shapewidthvar = ROOT.RooRealVar(
            name + '_shapewidthvar',
            name + '_shapewidthvar',
            self.shapewidth
            )
        self.shapewidthvar.setConstant(True)
        self.shapemode = tools.pdf_mode(self.shape, x)
        self.shapemodevar = ROOT.RooRealVar(
            name + '_shapemodevar',
            name + '_shapemodevar',
            self.shapemode
            )
        if self.shapewidth <= 0.:
            raise RuntimeError, ('Illegal value of pdf width: %f.' %
                                 self.shapewidth)
        self.shapemodevar.setConstant(True)
        ## Define the transformation of x that introduces the dependence on the
        ## mode and width
        self.xtransform = ROOT.RooFormulaVar(
            name + '_xtransform',
            name + '_xtransform',
            "{shapemode} + ({x} - {mode}) * {shapewidth} / {width}".format(
                x=x.GetName(),
                mode=mode.GetName(),
                width=width.GetName(),
                shapemode=self.shapemodevar.GetName(),
                shapewidth=self.shapewidthvar.GetName()
                ),
            ROOT.RooArgList(x, mode, width, self.shapemodevar,
                            self.shapewidthvar)
            )

        ## TODO: Use RooLinearVar for the xtransform along the lines below
        ## Unfortunately, the implementation below doesn't seem to work.
        ## It seems that the normalization is not calculated properly
        ## for RooKeysPdf + RooLinearVar
        ## self.xslope = ROOT.RooFormulaVar(
        ##     name + '_xslope',
        ##     name + '_xslope',
        ##     "{shapewidth} / {width}".format(
        ##         shapewidth=self.shapewidthvar.GetName(),
        ##         width=width.GetName()
        ##         ),
        ##     ROOT.RooArgList(self.shapewidthvar, width)
        ##     )

        ## self.xoffset = ROOT.RooFormulaVar(
        ##     name + '_xoffset',
        ##     name + '_xoffset',
        ##     "{shapemode} - {mode} * {shapewidth} / {width}".format(
        ##         mode=mode.GetName(), width=width.GetName(), 
        ##         shapemode=self.shapemodevar.GetName(),
        ##         shapewidth=self.shapewidthvar.GetName(),
        ##         ),
        ##     ROOT.RooArgList(mode, width, self.shapemodevar,
        ##                     self.shapewidthvar)
        ##     )

        ## self.xtransform = ROOT.RooLinearVar(
        ##     name + '_xtransform',
        ##     name + '_xtransform',
        ##     x, self.xslope, self.xoffset, x.getUnit()
        ##     )

        if forcerange:
            ## Restrict the allowed tranformed values to the range where the
            ## PDF was trained.
            ## TODO: Use a custom compiled class for this instead of the
            ## interpreted RooFormulaVar.
            self.xtransform_fullrange = self.xtransform
            self.xtransform_fullrange.SetName(name + '_xtransform_fullrange')
            self.xtransform_fullrange.SetTitle(name + '_xtransform_fullrange')
            self.xtransform = ROOT.RooFormulaVar(
                name + '_xtransform',
                name + '_xtransform',
                ('{lo} * ({x} <= {lo}) + '
                 '{x} * ({lo} < {x} & {x} < {hi}) + '
                 '{hi} * ({hi} <= {x})').format(
                    x=self.xtransform_fullrange.GetName(),
                    lo=x.getMin(),
                    hi=x.getMax()
                    ),
                ROOT.RooArgList(self.xtransform_fullrange)
                )

        self.customizer = ROOT.RooCustomizer(self.shape, 'transform')
        self.customizer.replaceArg(x, self.xtransform)

        ROOT.RooKeysPdf.__init__(self, self.customizer.build())
        self.SetName(name)
        self.SetTitle(title)