def _rfr_multiply_ ( self , var1 , var2 , *vars ) : """Get correct estimate of product of two variables, taking into account correlations >>> r = ... >>> print r.multiply( 'S' , 'B' ) ## S*B """ allvars = ( var1 , var2 ) + vars n = len ( allvars ) m = 1.0 c2 = 0 for i in range ( n ) : vi = allvars[i] if isinstance ( vi , str ) : vi = self.param ( vi )[1] v = vi.value v = VE ( v ) vv = v.value () if iszero ( vv ) or iszero ( m ) : return VE ( 0.0 , 0.0 ) ## RETURN HERE m *= vv vc = v.cov2() if 0 >= vc or vi in self.constPars() : continue c2 += vc / ( vv * vv ) for j in range ( i ) : vj = allvars [ j ] if isinstance ( vj , str ) : vj = self.param( vj )[1] if vj in self.constPars() : continue w = vj . value w = VE ( w ) ww = w.value() c2 += 2 * self.covariance ( vi , vj ) / ( vv * ww ) return VE ( m , c2 * m * m )
def _rfr_sum_(self, var1, var2, *vars): """Get correct estimate of sum of two or more variables, taking into account correlations >>> r = ... >>> print r.sum( 'S' , 'B' ) ## S+B """ allvars = (var1, var2) + vars n = len(allvars) s = 0 c2 = 0 for i in range(n): vi = allvars[i] if isinstance(vi, str): vi = self.param(vi)[1] v = vi.value v = VE(v) s += v.value() vc = v.cov2() if 0 >= vc or vi in self.constPars(): continue c2 += vc for j in range(i + 1, n): vj = allvars[j] if isinstance(vj, str): vj = self.param(vj)[1] if vj in self.constPars(): continue c2 += 2 * self.correlation(vi, vj) return VE(s, c2)
for i in range(0, N_bb): m_x.value = random.uniform(*m_x.minmax()) m_y.value = random.uniform(*m_y.minmax()) dataset.add(varset) logger.info('Dataset:%s ' % dataset) models = set() # ============================================================================= signal1 = Models.Gauss_pdf('Gx', xvar=m_x) signal2 = Models.Gauss_pdf('Gy', xvar=m_y) signal2s = signal1.clone(name='GyS', xvar=m_y) signal1.mean = m.value() signal1.sigma = m.error() signal2.mean = m.value() signal2.sigma = m.error() knots = std.vector('double')() knots.push_back(m_x.xmin()) knots.push_back(0.5 * (m_x.xmin() + m_x.xmax())) knots.push_back(m_x.xmax()) spline1 = Ostap.Math.BSpline(knots, 2) # ============================================================================= ## gauss as signal, expo times 1st order polynomial as background # ============================================================================= def test_model_14():
m_y.value = m.gauss() dataset.add(varset) ## fill it : 1000 events const * const *Gauss for i in range(0, N_bb): m_x.value = random.uniform(*m_x.minmax()) m_y.value = random.uniform(*m_y.minmax()) dataset.add(varset) logger.info('Dataset: %s' % dataset) ## various fit components signal_x1 = Models.Gauss_pdf('G1x', xvar=m_x, mean=m1.value(), sigma=m1.error()) signal_y1 = signal_x1.clone(name='G1y', xvar=m_y) signal_x2 = Models.Gauss_pdf(name='G2x', xvar=m_x, mean=m2.value(), sigma=m2.error()) signal_y2 = signal_x2.clone(name='G2y', xvar=m_y) bkg_x = make_bkg(-1, 'Bx', m_x) bkg_y = bkg_x.clone(name='By', xvar=m_y) # S(x)*S(y) component ss_cmp = signal_x2 * signal_y2
mass.value = m.gauss() dataset0.add(varset0) for i in range(0, 500): mass.value = random.uniform(mmin, mmax) dataset0.add(varset0) logger.info('DATASET\n%s' % dataset0) models = set() ## signal component signal_gauss = Models.Gauss_pdf( name='Gauss', ## the name xvar=mass, ## the variable mean=m.value(), ## mean value (fixed) sigma=m.error()) ## sigma (fixed) ## construct composite model: signal + background model_gauss = Models.Fit1D( signal=signal_gauss, background=Models.Bkg_pdf('BkgGauss', xvar=mass, power=0), ) S = model_gauss.S B = model_gauss.B # ============================================================================= ## gauss PDF # =============================================================================
def getLumi(data, *args): """Get lumi : >>> l1 = getLumi ( 'myfile.root' ) >>> l2 = getLumi ( tree ) >>> l3 = getLumi ( chain ) >>> l4 = getLumi ( file ) >>> l5 = getLumi ( [ any sequence of above ] ) """ # if args: data = [data] for a in args: data.append(a) return getLumi(data) if isinstance(data, str): ## expand the actual file name data = os.path.expandvars(data) data = os.path.expanduser(data) data = os.path.expandvars(data) data = os.path.expandvars(data) try: tree = ROOT.TChain(lumi_tree) tree.Add(data) return getLumi(tree) except: logger.error('Unable to get lumi/1 for %s' % data) return VE() # if isinstance(data, ROOT.TFile): try: tree = data.Get(lumi_tree) return getLumi(tree) except: logger.error('Unable to get lumi/2 for %s' % data.GetName()) return VE() if isinstance(data, ROOT.TTree): ## try : with rootError(): ## suppress errors from ROOT ## if hasattr ( data , 'pstatVar' ) : ## stat = data.pstatVar ( [ lumi , lumi_err ] , lumi_cuts , chunk_size = -1 , max_files = 10 ) ## else : stat = data.statVar([lumi, lumi_err], lumi_cuts) ## s1 = stat[lumi] s2 = stat[lumi_err] ## return VE(s1.sum(), s2.sum()**2) ##except : ## logger.error('Unable to get lumi/3 for %s' % data.GetName() ) ## return VE() l = VE() for i in data: k = getLumi(i) ## @attention: linear addition of uncertainties: l = VE(l.value() + k.value(), (l.error() + k.error())**2) return l
def test_fitting_components_3D(): logger = getLogger('test_fitting_components_3D') ## make simple test mass m_x = ROOT.RooRealVar('mass_x', 'Some test mass(X)', 0, 10) m_y = ROOT.RooRealVar('mass_y', 'Some test mass(Y)', 0, 10) m_z = ROOT.RooRealVar('mass_z', 'Some test mass(z)', 0, 10) ## book very simple data set varset = ROOT.RooArgSet(m_x, m_y, m_z) dataset = ROOT.RooDataSet(dsID(), 'Test Data set-1', varset) m1 = VE(3, 0.10**2) m2 = VE(7, 0.20**2) ## fill it N_sss = 5000 N_ssb = 500 N_sbs = 500 N_bss = 1000 N_bbs = 500 N_bsb = 100 N_sbb = 100 N_bbb = 250 random.seed(0) ## fill it : 5000 events Gauss * Gauss *Gauss for m in (m1, m2): ## S x S x S for i in range(N_sss): m_x.value = m.gauss() m_y.value = m.gauss() m_z.value = m.gauss() dataset.add(varset) ## S x S x B for i in range(0, N_bss): m_x.value = m.gauss() m_y.value = m.gauss() m_z.value = random.uniform(*m_z.minmax()) dataset.add(varset) ## S x B x S for i in range(N_ssb): m_x.value = m.gauss() m_y.value = random.uniform(*m_y.minmax()) m_z.value = m.gauss() dataset.add(varset) ## B x S x S for i in range(N_sbs): m_x.value = random.uniform(*m_x.minmax()) m_y.value = m.gauss() m_z.value = m.gauss() dataset.add(varset) ## B x B X S for i in range(N_sbb): m_x.value = random.uniform(*m_x.minmax()) m_y.value = random.uniform(*m_y.minmax()) m_z.value = m.gauss() dataset.add(varset) ## B x S x B for i in range(N_bsb): m_x.value = random.uniform(*m_x.minmax()) m_y.value = m.gauss() m_z.value = random.uniform(*m_y.minmax()) dataset.add(varset) ## S x B x B for i in range(N_sbb): m_x.value = m.gauss() m_y.value = random.uniform(*m_y.minmax()) m_z.value = random.uniform(*m_y.minmax()) dataset.add(varset) ## B x B x B for i in range(N_bbb): m_x.value = random.uniform(*m_x.minmax()) m_y.value = random.uniform(*m_y.minmax()) m_z.value = random.uniform(*m_y.minmax()) dataset.add(varset) logger.info('Dataset:\n%s' % dataset.table(prefix='# ')) ## various fit components for main fit model : signal_x1 = Models.Gauss_pdf('G1x', xvar=m_x, mean=m1.value(), sigma=m1.error()) signal_y1 = signal_x1.clone(name='G1y', xvar=m_y) signal_z1 = signal_x1.clone(name='G1z', xvar=m_z) bkg_x = make_bkg(-1, 'Bx', m_x) bkg_y = bkg_x.clone(name='By', xvar=m_y) bkg_z = bkg_x.clone(name='Bz', xvar=m_z) ## construct other components signal_x2 = Models.Gauss_pdf(name='G2x', xvar=m_x, mean=m2.value(), sigma=m2.error()) signal_y2 = signal_x2.clone(name='G2y', xvar=m_y) signal_z2 = signal_x2.clone(name='G2z', xvar=m_z) ## S(x) * S(y) components ss_cmp = signal_x2 * signal_y2 ## S(x) * B(y) component sb_cmp = signal_x2 * bkg_y ## B(x) * S(y) component bs_cmp = bkg_x * signal_y2 ## B(x) * B(y) component bb_cmp = bkg_x * bkg_y ## S(x) * S(y) * S(z) component sss_cmp = ss_cmp * signal_z2 ## S(x) * S(y) * B(z) component ssb_cmp = ss_cmp * bkg_z ## S(x) * B(y) * S(z) component sbs_cmp = sb_cmp * signal_z2 ## S(x) * B(y) * S(z) component bss_cmp = bs_cmp * signal_z2 ## S(x) * B(y) * B(z) component sbb_cmp = sb_cmp * bkg_z ## B(x) * S(y) * B(z) component bsb_cmp = bs_cmp * bkg_z ## B(x) * B(y) * S(z) component bbs_cmp = bs_cmp * signal_z2 model = Models.Fit3D( name='fit_comp', signal_x=signal_x1, signal_y=signal_y1, signal_z=signal_z1, bkg_1x=bkg_x, bkg_1y=bkg_y, bkg_1z=bkg_z, suffix="_1", ## components=[ sss_cmp, ssb_cmp, sbs_cmp, bss_cmp, sbb_cmp, bsb_cmp, bbs_cmp ]) model.SSS = N_sss model.SSB = N_ssb model.SBS = N_sbs model.BSS = N_bss model.BBS = N_bbs model.BSB = N_bsb model.SBB = N_sbb model.BBB = N_bbb model.C = N_sss, N_ssb, N_sbs, N_sbb, N_bss, N_sbs, N_bbs r = model.fitTo(dataset, silent=True) r = model.fitTo(dataset, silent=True) with use_canvas('test_fitting_components_3D'): with wait(2): model.draw1(dataset) with wait(2): model.draw2(dataset) with wait(2): model.draw3(dataset) logger.info('Model %s Fit result\n%s ' % (model.name, r.table(prefix='# ')))
def getLumi(data, *args): """Get lumi : >>> l1 = getLumi ( 'myfile.root' ) >>> l2 = getLumi ( tree ) >>> l3 = getLumi ( chain ) >>> l4 = getLumi ( file ) >>> l5 = getLumi ( [ any sequence of above ] ) """ # if args: data = [data] for a in args: data.append(a) return getLumi(data) if isinstance(data, str): ## expand the actual file name data = os.path.expandvars(data) data = os.path.expanduser(data) data = os.path.expandvars(data) data = os.path.expandvars(data) try: tree = ROOT.TChain(lumi_tree) tree.Add(data) return getLumi(tree) except: logger.error('Unable to get lumi/1 for %s' % data) return VE() # if isinstance(data, ROOT.TFile): try: tree = data.Get(lumi_tree) return getLumi(tree) except: logger.error('Unable to get lumi/2 for %s' % data.GetName()) return VE() if isinstance(data, ROOT.TTree): ## try : with rootError(): ## suppress errors from ROOT ## if ( 6 , 25 ) < root_info : ## ## use DataFrames. It is faster here? not sure.... ## from ostap.frame.frames import DataFrame , frame_statVars ## frame = DataFrame ( data ) ## stat = frame_statVars ( frame , [ lumi , lumi_err ] , lumi_cuts ) ## else : stat = data.statVar([lumi, lumi_err], lumi_cuts) ## s1 = stat[lumi] s2 = stat[lumi_err] ## return VE(s1.sum(), s2.sum()**2) ##except : ## logger.error('Unable to get lumi/3 for %s' % data.GetName() ) ## return VE() l = VE() for i in data: k = getLumi(i) ## @attention: linear addition of uncertainties: l = VE(l.value() + k.value(), (l.error() + k.error())**2) return l
dataset.add ( varset ) ## fill it : 1000 events const * const *Gauss for i in range(0,N_bb) : m_x.value = random.uniform ( *m_x.minmax() ) m_y.value = random.uniform ( *m_y.minmax() ) dataset.add ( varset ) logger.info ('Dataset: %s' % dataset ) ## various fit components signal_x1 = Models.Gauss_pdf ( 'G1x' , xvar = m_x , mean = m1.value() , sigma = m1.error() ) signal_y1 = signal_x1.clone ( name='G1y' , xvar = m_y ) signal_x2 = Models.Gauss_pdf ( name='G2x' , xvar = m_x , mean = m2.value() , sigma = m2.error() ) signal_y2 = signal_x2.clone ( name='G2y' , xvar = m_y ) bkg_x= make_bkg ( -1 , 'Bx' , m_x ) bkg_y= bkg_x.clone ( name= 'By' , xvar =m_y ) # S(x)*S(y) component ss_cmp=signal_x2*signal_y2 # S(x)*B(y) component sb=signal_x2*bkg_y # B(x)*S(y) component
def test_fitting_in_range_2d(): logger = getLogger('test_fitting_in_range_2d') ## make simple test mass m_x = ROOT.RooRealVar('m_x', 'Some test mass(X)', 0, 5) m_y = ROOT.RooRealVar('m_y', 'Some test mass(Y)', 6, 10) ## book very simple data set varset = ROOT.RooArgSet(m_x, m_y) dataset = ROOT.RooDataSet(dsID(), 'Test Data set-1', varset) m1 = VE(3, 0.10**2) m2 = VE(7, 0.10**2) ## fill it with three gausissians, 5k events each N_ss = 5000 N_sb = 1000 N_bs = 500 N_bb = 100 random.seed(0) ## S x S for i in range(N_ss): m_x.value = m1.gauss() m_y.value = m2.gauss() dataset.add(varset) ## S x B for i in range(N_sb): m_x.value = m1.gauss() m_y.value = random.uniform(*m_y.minmax()) dataset.add(varset) ## B x S for i in range(N_bs): m_x.value = random.uniform(*m_x.minmax()) m_y.value = m2.gauss() dataset.add(varset) ## B x B for i in range(N_bb): m_x.value = random.uniform(*m_x.minmax()) m_y.value = random.uniform(*m_y.minmax()) dataset.add(varset) logger.info('Dataset:\n%s' % dataset.table(prefix='# ')) ## various fit components signal_x1 = Models.Gauss_pdf('G1x', xvar=m_x, mean=m1.value(), sigma=m1.error()) signal_y1 = Models.Gauss_pdf(name='G1y', xvar=m_y, mean=m2.value(), sigma=m2.error()) bkg_x = make_bkg(-1, 'Bx', m_x) bkg_y = make_bkg(-1, name='By', xvar=m_y) ## build fit model model = Models.Fit2D(name='fit_comp', signal_x=signal_x1, signal_y=signal_y1, bkg_1x=bkg_x, bkg_1y=bkg_y) model.SS = N_ss model.SB = N_sb model.BS = N_bs model.BB = N_bb r = model.fitTo(dataset, silent=True) r = model.fitTo(dataset, silent=True) dataset.m_y.setRange('fit', 8, 10.) model.yvar.setRange('fit', 8, 10.) with use_canvas('test_fitting_in_range_2d'): with wait(2): model.draw1(dataset, nbins=200, in_range=(6, 8)) with wait(2): model.draw1(dataset, nbins=200, in_range='fit') dataset.m_x.setRange('fit2', 0, 2.5) model.xvar.setRange('fit2', 0, 2.5) with use_canvas('test_fitting_in_range_2d'): with wait(2): model.draw2(dataset, nbins=200, in_range=(2.5, 5)) with wait(2): model.draw2(dataset, nbins=200, in_range='fit2')
def test_components_2 () : ## make simple test mass mass = ROOT.RooRealVar ( 'test_mass' , 'Some test mass' , 0 , 10 ) ## book very simple data set varset = ROOT.RooArgSet ( mass ) dataset = ROOT.RooDataSet ( dsID() , 'Test Data set' , varset ) mmin, mmax = mass.minmax() ## two gaussinan signal cmppnent N1 = 5000 m1 = VE(5,0.2**2) N2 = 5000 m2 = VE(3,0.3**2) ## background exponential components taub = 5.0 NB = 5000 ## generate 1st signal for i in range(0,N1) : m = m1.gauss () while not mmin < m < mmax : m = m1.gauss() mass.value = m dataset.add ( varset ) ## generate 2nd signal for i in range(0,N2) : m = m2.gauss () while not mmin < m < mmax : m = m2.gauss() mass.value = m dataset.add ( varset ) ## generate background for i in range ( 0,NB) : m = random.expovariate ( 1./ taub ) while not mmin < m < mmax : m = random.expovariate ( 1./ taub ) mass.value = m dataset.add ( varset ) logger.info ( "Original dataset\n%s" % dataset.table ( prefix = '# ' ) ) signal1 = Models.Gauss_pdf ( 'G1' , xvar = mass , mean = ( 5 , 4, 6 ) , sigma = ( 0.2 , 0.1 , 0.3 ) ) signal2 = Models.Gauss_pdf ( 'G2' , xvar = mass , mean = ( 3 , 2, 4 ) , sigma = ( 0.3 , 0.2 , 0.4 ) ) S1 = ROOT.RooRealVar ( 'S1' , '1st signal yeild' , N1 , 1 , 10000 ) ratio = ROOT.RooRealVar ( 'R' , 'ratio of S2 to S1' , 1.0*N2 / N1 , 0.05 , 100 ) S2 = signal1.vars_multiply ( S1 , ratio , name = 'S2' , title = '2ns signal yield' ) model = Models.Fit1D( signals = [ signal1 , signal2 ] , background = 1 , S = ( S1 , S2 ) ) model.B = NB signal1.mean .fix ( m1.value () ) signal1.sigma.fix ( m1.error () ) signal2.mean .fix ( m2.value () ) signal2.sigma.fix ( m2.error () ) model.fitTo ( dataset , silent = True ) signal1.mean .release() signal1.sigma.release() signal2.mean .release() signal2.sigma.release() model.fitTo ( dataset , silent = True ) r , f = model.fitTo ( dataset , silent = True , draw = True , nbins = 50 ) logger.info ( "Mass fit : fit results\n%s" % r.table ( title = 'Mass fit' , prefix = '# ' ) ) r , f = model.fitTo ( dataset , silent = True , draw = True , nbins = 50 , minos = ('R','S1') ) logger.info ( "Mass fit : fit results\n%s" % r.table ( title = 'Mass fit' , prefix = '# ' ) )
def test_fitting_in_range_3d(): logger = getLogger('test_fitting_in_range_3d') ## make simple test mass m_x = ROOT.RooRealVar('m_x', 'Some test mass(X)', 0, 5) m_y = ROOT.RooRealVar('m_y', 'Some test mass(Y)', 6, 10) m_z = ROOT.RooRealVar('m_z', 'Some test mass(z)', 10, 15) ## book very simple data set varset = ROOT.RooArgSet(m_x, m_y, m_z) dataset = ROOT.RooDataSet(dsID(), 'Test Data set-1', varset) m1 = VE(3, 0.10**2) m2 = VE(7, 0.10**2) m3 = VE(12, 0.10**2) N_sss = 5000 N_ssb = 5000 N_sbs = 5000 N_sbb = 1000 N_bss = 500 N_bsb = 100 N_bbs = 100 N_bbb = 250 random.seed(0) ## S x S x S for i in range(N_sss): m_x.value = m1.gauss() m_y.value = m2.gauss() m_z.value = m3.gauss() dataset.add(varset) ## S x S x B for i in range(N_ssb): m_x.value = m1.gauss() m_y.value = m2.gauss() m_z.value = random.uniform(*m_z.minmax()) dataset.add(varset) ## S x B x S for i in range(N_sbs): m_x.value = m1.gauss() m_y.value = random.uniform(*m_y.minmax()) m_z.value = m3.gauss() dataset.add(varset) ## B x S x S for i in range(N_bss): m_x.value = random.uniform(*m_x.minmax()) m_y.value = m2.gauss() m_z.value = m3.gauss() dataset.add(varset) ## S x B x B for i in range(N_sbb): m_x.value = m1.gauss() m_y.value = random.uniform(*m_y.minmax()) m_z.value = random.uniform(*m_z.minmax()) dataset.add(varset) ## B x S x B for i in range(N_bsb): m_x.value = random.uniform(*m_x.minmax()) m_y.value = m2.gauss() m_z.value = random.uniform(*m_z.minmax()) dataset.add(varset) ## B x B x S for i in range(N_bbs): m_x.value = random.uniform(*m_x.minmax()) m_y.value = random.uniform(*m_y.minmax()) m_z.value = m3.gauss() dataset.add(varset) ## B x B x B for i in range(N_bbb): m_x.value = random.uniform(*m_x.minmax()) m_y.value = random.uniform(*m_y.minmax()) m_z.value = random.uniform(*m_z.minmax()) dataset.add(varset) logger.info('Dataset:\n%s' % dataset.table(prefix='# ')) signal_x1 = Models.Gauss_pdf('G1x', xvar=m_x, mean=m1.value(), sigma=m1.error()) signal_y1 = Models.Gauss_pdf(name='G1y', xvar=m_y, mean=m2.value(), sigma=m2.error()) signal_z1 = Models.Gauss_pdf(name='G1z', xvar=m_z, mean=m3.value(), sigma=m3.error()) bkg_x = make_bkg(-1, 'Bx', m_x) bkg_y = make_bkg(-1, name='By', xvar=m_y) bkg_z = make_bkg(-1, name='Bz', xvar=m_z) model = Models.Fit3D( name='fit_comp', signal_x=signal_x1, signal_y=signal_y1, signal_z=signal_z1, bkg_1x=bkg_x, bkg_1y=bkg_y, bkg_1z=bkg_z, ) model.SSS = N_sss model.SSB = N_ssb model.SBS = N_sbs model.BSS = N_bss model.SBB = N_sbb model.BSB = N_bsb model.BBS = N_bbs model.BBB = N_bbb r = model.fitTo(dataset, silent=True) r = model.fitTo(dataset, silent=True) dataset.m_y.setRange('fit', 6, 8.) model.yvar.setRange('fit', 6, 8.) t = 1.0 with use_canvas('test_fitting_in_range_3d'): with wait(t): model.draw1(dataset, nbins=200, in_range3=(11, 12), in_range2=(8, 10)) with wait(t): model.draw1(dataset, nbins=200, in_range3=(11, 12), in_range2='fit') with wait(t): model.draw1(dataset, nbins=200, in_range3=(11, 12)) with wait(t): model.draw1(dataset, nbins=200, in_range2='fit') dataset.m_x.setRange('fit2', 2.5, 3.) model.xvar.setRange('fit2', 2.5, 3.) with use_canvas('test_fitting_in_range_3d'): with wait(t): model.draw2(dataset, nbins=200, in_range3=(11, 12), in_range1=(0, 3)) with wait(t): model.draw2(dataset, nbins=200, in_range3=(11, 12), in_range1='fit2') with wait(t): model.draw2(dataset, nbins=200, in_range3=(11, 12)) with wait(t): model.draw2(dataset, nbins=200, in_range1='fit2') dataset.m_x.setRange('fit3', 2.5, 3.) model.xvar.setRange('fit3', 2.5, 3.) with use_canvas('test_fitting_in_range_3d'): with wait(t): model.draw3(dataset, nbins=200, in_range2=(6, 8), in_range1=(0, 3)) with wait(t): model.draw3(dataset, nbins=200, in_range2=(6, 8), in_range1='fit3') with wait(t): model.draw3(dataset, nbins=200, in_range2=(6, 8)) with wait(t): model.draw3(dataset, nbins=200, in_range1='fit3')
def getLumi ( data , *args ) : """Get lumi : >>> l1 = getLumi ( 'myfile.root' ) >>> l2 = getLumi ( tree ) >>> l3 = getLumi ( chain ) >>> l4 = getLumi ( file ) >>> l5 = getLumi ( [ any sequence of above ] ) """ tree_name = 'GetIntegratedLuminosity/LumiTuple' # from ostap.core.core import VE, hID import ostap.io.root_file import ostap.trees.trees # if args : data = [ data ] for a in args : data.append ( a ) return getLumi ( data ) if isinstance ( data , str ) : ## expand the actual file name import os data = os.path.expandvars ( data ) data = os.path.expanduser ( data ) data = os.path.expandvars ( data ) data = os.path.expandvars ( data ) try : tree = ROOT.TChain ( tree_name ) tree.Add ( data ) lumi = getLumi ( tree ) return lumi except : logger.error('Unable to get lumi(1) for %s' % data ) return VE() # if isinstance ( data , ROOT.TFile ) : try : tree = data.Get( tree_name ) return getLumi ( tree ) except: logger.error('Unable to get lumi(2) for %s' % data.GetName() ) return VE() if isinstance ( data , ROOT.TTree ) : ## print data from ostap.logger.utils import rootError try: # with rootError() : ## suppress errors from ROOT ## @attention here we are using sumVar! l1 = data.sumVar ( '1.0*IntegratedLuminosity+0.0*IntegratedLuminosityErr' , '0<=IntegratedLuminosity' ) l2 = data.sumVar ( '1.0*IntegratedLuminosity+1.0*IntegratedLuminosityErr' , '0<=IntegratedLuminosity' ) l3 = data.sumVar ( '1.0*IntegratedLuminosity-1.0*IntegratedLuminosityErr' , '0<=IntegratedLuminosity' ) # l1.setError ( 0.5 * abs ( l2.value () - l3.value () ) ) # l0 = data.sumVar ( 'IntegratedLuminosity' , '0 >IntegratedLuminosity' ) if 0 != l0.value() : logger.error( 'Something weird happens with Lumi/1: %s' % l0 ) l0 = data.sumVar ( 'IntegratedLuminosity' , 'IntegratedLuminosity>100000' ) if 0 != l0.value() : logger.error( 'Something weird happens with Lumi/2: %s' % l0 ) l0 = data.sumVar ( 'IntegratedLuminosity' , '0>IntegratedLuminosityErr' ) if 0 != l0.value() : logger.error( 'Something weird happens with Lumi/3: %s' % l0 ) # return l1 except : logger.error('Unable to get lumi(3) for %s' % data.GetName() ) return VE() l = VE() for i in data : k = getLumi ( i ) ## @attention: linear addition of uncertainties: l = VE ( l.value() + k.value() , ( l.error() + k.error () ) ** 2 ) return l
def test_fitting_components3_3D () : logger = getLogger( 'test_fitting_components3_3D' ) ## make simple test mass m_x = ROOT.RooRealVar ( 'mass_x' , 'Some test mass(X)' , 0 , 10 ) m_y = ROOT.RooRealVar ( 'mass_y' , 'Some test mass(Y)' , 0 , 10 ) m_z = ROOT.RooRealVar ( 'mass_z' , 'Some test mass(z)' , 0 , 10 ) ## book very simple data set varset = ROOT.RooArgSet ( m_x , m_y,m_z ) dataset = ROOT.RooDataSet ( dsID() , 'Test Data set-1' , varset ) m1 = VE ( 3 , 0.10**2 ) m2 = VE ( 7 , 0.20**2 ) ## fill it with three gausissians, 5k events each N_sss = 5000 N_ssb = 500 N_sbs = N_ssb N_bss = N_ssb N_bbs = 100 N_bsb = N_bbs N_sbb = N_bbs N_bbb = 500 random.seed(0) ## fill it : 5000 events Gauss * Gauss *Gauss for m in (m1,m2) : ## S x S x S for i in range ( N_sss ) : m_x.value = m.gauss() m_y.value = m.gauss() m_z.value = m.gauss() dataset.add ( varset ) ## S x S x B for i in range(0,N_bss) : m_x.value = m.gauss() m_y.value = m.gauss() m_z.value = random.uniform ( *m_z.minmax() ) dataset.add ( varset ) ## S x B x S for i in range ( N_ssb ) : m_x.value = m.gauss() m_y.value = random.uniform ( *m_y.minmax() ) m_z.value = m.gauss() dataset.add ( varset ) ## B x S x S for i in range ( N_sbs ) : m_x.value = random.uniform ( *m_x.minmax() ) m_y.value = m.gauss() m_z.value = m.gauss() dataset.add ( varset ) ## B x B X S for i in range ( N_sbb ) : m_x.value = random.uniform ( *m_x.minmax() ) m_y.value = random.uniform ( *m_y.minmax() ) m_z.value = m.gauss() dataset.add ( varset ) ## B x S x B for i in range ( N_bsb ) : m_x.value = random.uniform ( *m_x.minmax() ) m_y.value = m.gauss() m_z.value = random.uniform ( *m_y.minmax() ) dataset.add ( varset ) ## S x B x B for i in range ( N_sbb ) : m_x.value = m.gauss() m_y.value = random.uniform ( *m_y.minmax() ) m_z.value = random.uniform ( *m_y.minmax() ) dataset.add ( varset ) ## B x B x B for i in range ( N_bbb ) : m_x.value = random.uniform ( *m_x.minmax() ) m_y.value = random.uniform ( *m_y.minmax() ) m_z.value = random.uniform ( *m_y.minmax() ) dataset.add ( varset ) logger.info ('Dataset:\n%s' % dataset.table ( prefix = '# ') ) ## various fit components signal_x1 = Models.Gauss_pdf ( 'G1x' , xvar = m_x , mean = m1.value() , sigma = m1.error() ) signal_y1 = signal_x1.clone ( name='G1y' , xvar = m_y ) signal_z1 = signal_x1.clone ( name='G1z' , xvar = m_z ) bkg_x = make_bkg ( -1 , 'Bx' , m_x ) bkg_y = bkg_x.clone ( name= 'By' , xvar =m_y ) bkg_z = bkg_x.clone ( name='Bz' , xvar =m_z ) signal_x2 = Models.Gauss_pdf ( name='G2x' , xvar = m_x , mean = m2.value() , sigma = m2.error() ) signal_y2 = signal_x2.clone ( name='G2y' , xvar = m_y ) signal_z2 = signal_x2.clone ( name='G2z' , xvar = m_z ) # S(x) * S(y) component ss_cmp = signal_x2 * signal_y2 # S(x) * B(y) component sb_cmp = signal_x2 * bkg_y # B(x) * S(y) component bs_cmp = bkg_x * signal_y2 # B(x) * B(y) component bb_cmp = bkg_x * bkg_y # S(x)*S(y)*S(z) component sss_cmp = ss_cmp * signal_z2 # S(x) * B(y) * S(z) + B(x) * S(y) * S(z) + S(x) * S(y) * B(z) component ssb_ = ss_cmp * bkg_z sbs_ = sb_cmp * signal_z2 bss_ = bs_cmp * signal_z2 ssb_cmp = ssb_ + ( sbs_ , bss_ ) # S(x)*B(y)*B(z) + B(x)*S(y)*B(z) + B(x)*B(y)*S(z) component sbb_ = sb_cmp * bkg_z bsb_ = bs_cmp * bkg_z bbs_ = bb_cmp * signal_z2 bbs_cmp = sbb_ + ( bsb_ , bbs_ ) logger.info ('Test multi-component 3d Sym fit') model = Models.Fit3DMix ( name = 'fitSym_comp', signal_x = signal_x1, signal_y = signal_y1, signal_z = signal_z1, bkg_1x = bkg_x , bkg_1y= bkg_y, bkg_2x = 'clone' , bkg_2y= 'clone', components = [ sss_cmp , ssb_cmp , bbs_cmp ] ) ## components model.SSS = N_sss model.SSB = N_ssb * 3 model.SBB = N_sbb * 3 model.BBB = N_bbb model.C = N_sss, N_ssb * 3 , N_sbb * 3 r = model.fitTo ( dataset , silent = True ) r = model.fitTo ( dataset , silent = True ) r = model.fitTo ( dataset , silent = True ) with use_canvas ( 'test_fitting_components3_3D' ) : with wait ( after = 2 ) : model.draw1 ( dataset ) with wait ( after = 2 ) : model.draw2 ( dataset ) with wait ( after = 2 ) : model.draw3 ( dataset ) logger.info ( 'Model %s Fit result\n%s ' % ( model.name , r.table (prefix = '# ') ) )
def print_bootstrap(fitresult, stats, morevars={}, logger=logger, title=''): """print Bootstrap statistics """ header = ('Parameter', 'theta', 'theta_boot', 'bias/sigma [%]', 'error [%]') table = [] n = 0 for name in sorted(stats): if name in fitresult: p = fitresult[name] theta = p * 1.0 if not isinstance(theta, VE) or theta.cov2() <= 0: logger.warning( 'print_bootstrap: parameter "%s" is invalid in ``fitresult' ', skip %s' % (name, theta)) continue elif name in morevars: theta = morevars[name] if not isinstance(theta, VE) or theta.cov2() <= 0: logger.warning( 'print_bootstrap: parameter "%s" is invalid in ``morevars' ', skip %s' % (name, theta)) continue else: continue statistics = stats[name] n = max(n, statistics.nEntries()) theta_boot = VE(statistics.mean().value(), statistics.mu2()) bias = theta_boot.value() - theta.value() scale = theta.error() / theta_boot.error() row = (name, "%+13.6g +/- %-13.6g" % (theta.value(), theta.error()), "%+13.6g +/- %-13.6g" % (theta_boot.value(), theta_boot.error()), '%+6.2f' % (bias / theta.error() * 100), '%+6.2f' % (scale * 100 - 100)) table.append(row) for name in sorted(stats): if name in fitresult: continue if name in morevars: continue statistics = stats[name] theta_boot = VE(statistics.mean().value(), statistics.mu2()) row = name, '', "%+13.6g +/- %-13.6g" % (theta_boot.value(), theta_boot.error()), '', '' table.append(row) table = [header] + table title = title if title else "Bootstrapping with #%d samples" % n import ostap.logger.table as Table table = Table.table(table, title=title, alignment='lcccc', prefix="# ") logger.info('%s:\n%s' % (title, table))
def test_splot(): logger = getLogger('test_splot') ## make simple test mass mass = ROOT.RooRealVar('test_mass', 'Some test mass', 0, 10) tau = ROOT.RooRealVar('test_tau', 'Some test tau', 0, 10) ## book very simple data set varset = ROOT.RooArgSet(mass, tau) dataset = ROOT.RooDataSet(dsID(), 'Test Data set', varset) mmin, mmax = mass.minmax() tmin, tmax = tau.minmax() m0 = VE(3, 0.2**2) taus = 6 taub = 0.4 NS = 5000 NB = 5000 ## generate signal for i in range(0, NS): m = m0.gauss() while not mmin < m < mmax: m = m0.gauss() t = random.expovariate(1. / taus) while not tmin < t < tmax: t = random.expovariate(1. / taus) mass.value = m tau.value = t dataset.add(varset) ## generate background for i in range(0, NB): m = random.expovariate(1. / 5) while not mmin < m < mmax: m = random.expovariate(1. / 3) t = random.expovariate(1. / taub) while not tmin < t < tmax: t = random.expovariate(1. / taus) mass.value = m tau.value = t dataset.add(varset) logger.info("Original dataset\n%s" % dataset.table(prefix='# ')) signal = Models.Gauss_pdf('G', xvar=mass, mean=(3, 2, 4), sigma=(0.2, 0.1, 0.5)) model = Models.Fit1D(signal=signal, background=1) model.S = NS model.B = NB signal.mean.fix(m0.value()) signal.sigma.fix(m0.error()) model.fitTo(dataset, silent=True) signal.mean.release() signal.sigma.release() model.fitTo(dataset, silent=True) with use_canvas('test_splot'): r, f = model.fitTo(dataset, silent=True, draw=True, nbins=50) logger.info("Mass fit : fit results\n%s" % r.table(title='Mass fit', prefix='# ')) ## make splot analysis model.sPlot(dataset) logger.info("Dataset after sPlot\n%s" % dataset.table(prefix='# ')) ## make signal-weighted dataset ds_signal = dataset.makeWeighted('S_sw') ## make background-weighted dataset ds_bkg = dataset.makeWeighted('B_sw') logger.info("Signal-weighted dataset\n%s" % ds_signal.table(prefix='# ')) logger.info("Background-weighted dataset\n%s" % ds_bkg.table(prefix='# ')) ## make exponential fits fot signal and background samples TS = Models.Bkg_pdf('TS', xvar=tau, power=0) TB = Models.Bkg_pdf('TB', xvar=tau, power=0) TS.fitTo(ds_signal, silent=True) TS.fitTo(ds_signal, silent=True) with use_canvas('test_splot'): rS, f = TS.fitTo(ds_signal, silent=True, draw=True, nbins=100) logger.info("Tau/signal fit : fit results\n%s" % rS.table(title='Tau signal fit', prefix='# ')) TB.fitTo(ds_bkg, silent=True) TB.fitTo(ds_bkg, silent=True) with use_canvas('test_splot'): rB, f = TB.fitTo(ds_bkg, silent=True, draw=True, nbins=100) logger.info("Tau/bkg fit : fit results\n%s" % rB.table(title='Tau bkg fit', prefix='# ')) logger.info("Tau/signal : %28s vs %s" % (abs(1.0 / rS.tau_TS), taus)) logger.info("Tau/bkg : %28s vs %s" % (abs(1.0 / rB.tau_TB), taub))
w2 = VE(6.0, 4**2) n1 = VE(2.0, 1**2) n2 = VE(4.0, 1**2) for i in xrange(1000): for w in (w1, w2, n1, n2): v = w.gauss() if v in mass: mass.value = v dataset.add(varset) logger.info('Dataset: %s' % dataset) ## various fit components signal_1 = Models.Gauss_pdf('G1', xvar=mass, mean=m1.value(), sigma=m1.error()) signal_2 = Models.Gauss_pdf('G2', xvar=mass, mean=m2.value(), sigma=m2.error()) signal_3 = Models.Gauss_pdf('G3', xvar=mass, mean=m3.value(), sigma=m3.error()) wide_1 = Models.Gauss_pdf('GW1', xvar=mass, mean=4.0, sigma=4) wide_2 = Models.Gauss_pdf('GW2', xvar=mass, mean=6.0, sigma=4) narrow_1 = Models.Gauss_pdf('GN1', xvar=mass, mean=2.0, sigma=1) narrow_2 = Models.Gauss_pdf('GN2', xvar=mass, mean=4.0, sigma=1) # ============================================================================= ## Test extended multi-component fit' def test_extended1(): logger.info('Test extended multi-component fit')
n2 = VE(12.0, 1**2) for i in range(N3): for w in (w1, w2, n1, n2): v = w.gauss() if v in mass: mass.value = v dataset.add(varset) logger.info('Dataset:\n%s' % dataset.table(prefix='# ')) NT = 3.0 * N1 + N2 + 4 * N3 ## various fit components signal_1 = Models.Gauss_pdf('G1', xvar=mass, mean=m1.value(), sigma=m1.error()) signal_2 = Models.Gauss_pdf('G2', xvar=mass, mean=m2.value(), sigma=m2.error()) signal_3 = Models.Gauss_pdf('G3', xvar=mass, mean=m3.value(), sigma=m3.error()) wide_1 = Models.Gauss_pdf('GW1', xvar=mass, mean=w1.value(), sigma=w1.error()) wide_2 = Models.Gauss_pdf('GW2', xvar=mass, mean=w2.value(), sigma=w2.error()) narrow_1 = Models.Gauss_pdf('GN1', xvar=mass, mean=n1.value(), sigma=n1.error()) narrow_2 = Models.Gauss_pdf('GN2', xvar=mass, mean=n2.value(), sigma=n2.error())