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'))
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)
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)
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)