from ostap.utils.utils import wait # ============================================================================= # logging # ============================================================================= from ostap.logger.logger import getLogger if '__main__' == __name__ or '__builtin__' == __name__: logger = getLogger('test_fitting_simfit1') else: logger = getLogger(__name__) # ============================================================================= ## make simple test mass mass = ROOT.RooRealVar('test_mass', 'Some test mass', 0, 5) ## book very simple data set: varset1 = ROOT.RooArgSet(mass) dataset1 = ROOT.RooDataSet(dsID(), 'Test Data set-1', varset1) ## book very simple data set: varset2 = ROOT.RooArgSet(mass) dataset2 = ROOT.RooDataSet(dsID(), 'Test Data set-2', varset2) ## high statistic, low-background "control channel" mean1 = 2.0 sigma1 = 0.50 NS1 = 10000 NB1 = 1000 for i in range(NS1): v1 = random.gauss(mean1, sigma1) if v1 in mass: mass.setVal(v1)
# ============================================================================= # logging # ============================================================================= from ostap.logger.logger import getLogger if '__main__' == __name__ or '__builtin__' == __name__: logger = getLogger('test_models2_2D') else: logger = getLogger(__name__) # ============================================================================= ## make simple test mass m_x = ROOT.RooRealVar('mass_x', 'Some test mass(X)', 3, 3.2) m_y = ROOT.RooRealVar('mass_y', 'Some test mass(Y)', 3, 3.2) ## book very simple data set varset = ROOT.RooArgSet(m_x, m_y) dataset = ROOT.RooDataSet(dsID(), 'Test Data set-1', varset) m = VE(3.100, 0.015**2) N_ss = 10000 N_sb = 2500 N_bs = 2500 N_bb = 5000 random.seed(0) ## fill it : 5000 events Gauss * Gauss for i in xrange(0, N_ss): m_x.value = m.gauss() m_y.value = m.gauss() dataset.add(varset)
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')
# ============================================================================= from ostap.logger.logger import getLogger if '__main__' == __name__ or '__builtin__' == __name__ : logger = getLogger ( 'test_fitting_efficiency' ) else : logger = getLogger ( __name__ ) # ============================================================================= ## make x = ROOT.RooRealVar ( 'x', 'test' , 0 , 10 ) xmin , xmax = x.minmax() acc = ROOT.RooCategory( 'cut','cut') acc.defineType('accept',1) acc.defineType('reject',0) varset = ROOT.RooArgSet ( x , acc ) ds = ROOT.RooDataSet ( dsID() , 'test data' , varset ) eff0 = Models.Monotonic_pdf ( 'E0' , xvar = x , power = 2 , increasing = True ) eff0.phis = 3.1415/2 , 3.1415/2 margin = 1.25 emax = margin * eff0 ( x.getMax() ) for i in range ( 10000 ) : xv = random.uniform ( xmin , xmax ) x.setVal ( xv ) ev = random.uniform ( 0 , emax ) if eff0( xv ) > ev : acc.setIndex(1)
def test_toys_simfit_1(): logger = getLogger('test_toys_simfit_1') ## make simple test mass mass = ROOT.RooRealVar('test_mass', 'Some test mass', 0, 5) ## book very simple data set: varset1 = ROOT.RooArgSet(mass) dataset1 = ROOT.RooDataSet(dsID(), 'Test Data set-1', varset1) ## book very simple data set: varset2 = ROOT.RooArgSet(mass) dataset2 = ROOT.RooDataSet(dsID(), 'Test Data set-2', varset2) ## high statistic, low-background "control channel" mean1 = 2.0 sigma1 = 0.50 NS1 = 1000 NB1 = 250 for i in range(NS1): v1 = random.gauss(mean1, sigma1) if v1 in mass: mass.setVal(v1) dataset1.add(varset1) for i in range(NB1): v1 = random.uniform(0, 5) if v1 in mass: mass.setVal(v1) dataset1.add(varset1) ## low statistic, high-background "control channel" NS2 = 250 NB2 = 1000 mean2 = mean1 + 1.0 sigma2 = sigma1 * 0.5 for i in range(NS2): v2 = random.gauss(mean2, sigma2) if v2 in mass: mass.setVal(v2) dataset2.add(varset2) for i in range(NB2): v2 = random.uniform(0, 5) if v2 in mass: mass.setVal(v2) dataset2.add(varset2) signal1 = Models.Gauss_pdf('G1', xvar=mass, mean=(0.5, 2.5), sigma=(0.1, 1.0)) model1 = Models.Fit1D(suffix='M1', signal=signal1, background=-1) model1.S = NS1 model1.B = NB1 mean2 = signal1.vars_add(signal1.mean, 1.0) sigma2 = signal1.vars_multiply(signal1.sigma, 0.5) signal2 = Models.Gauss_pdf('G2', xvar=mass, mean=mean2, sigma=sigma2) model2 = Models.Fit1D(suffix='M2', signal=signal2, background=model1.background) model2.S = NS2 model2.B = NB2 with use_canvas('test_toys_simfit_1'): # ========================================================================= ## fit 1 with wait(1): r1, f1 = model1.fitTo(dataset1, draw=True, nbins=50, silent=True) ## fit 2 with wait(1): r2, f2 = model2.fitTo(dataset2, draw=True, nbins=50, silent=True) # ========================================================================= ## combine data sample = ROOT.RooCategory('sample', 'sample', 'A', 'B') ## combine datasets from ostap.fitting.simfit import combined_data vars = ROOT.RooArgSet(mass) dataset = combined_data(sample, vars, {'A': dataset1, 'B': dataset2}) ## combine PDFs model_sim = Models.SimFit(sample, {'A': model1, 'B': model2}, name='X') # ========================================================================= r, f = model_sim.fitTo(dataset, silent=True) r, f = model_sim.fitTo(dataset, silent=True) with use_canvas('test_toys_simfit_1'): with wait(1): fA = model_sim.draw('A', dataset, nbins=50) with wait(1): fB = model_sim.draw('B', dataset, nbins=50) logger.info('Fit results are: %s ' % r.table(prefix="# ")) ## Make toys results, stats = Toys.make_toys(pdf=model_sim, nToys=100, data=[mass], gen_config={ 'nEvents': (NS1 + NB1, NS2 + NB2), 'sample': True }, fit_config={'silent': True}, init_pars={ 'mean_G1': mean1, 'BM1': NB1, 'BM2': NB2, 'sigma_G1': sigma1, 'SM1': NS1, 'SM2': NS2, 'phi0_Bkg_FitG1_M1': 0 }, silent=True, progress=True)
from ostap.logger.utils import rooSilent # ============================================================================= # logging # ============================================================================= from ostap.logger.logger import getLogger if '__main__' == __name__ or '__builtin__' == __name__: logger = getLogger('test_models') else: logger = getLogger(__name__) # ============================================================================= ## make simple test mass mass = ROOT.RooRealVar('test_mass', 'Some test mass', 3.0, 3.2) ## book very simple data set varset0 = ROOT.RooArgSet(mass) dataset0 = ROOT.RooDataSet(dsID(), 'Test Data set-0', varset0) mmin, mmax = mass.minmax() ## fill it m = VE(3.100, 0.015**2) for i in xrange(0, 5000): mass.value = m.gauss() dataset0.add(varset0) for i in xrange(0, 500): mass.value = random.uniform(mmin, mmax) dataset0.add(varset0) logger.info('DATASET %s' % dataset0)
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 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_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 = '# ') ) )