def test_comp_2dSymfit(): logger.info('Test multi-component 2d Sym fit') model = Models.Fit2DSym(name='fit_comp', signal_x=signal_x1, signal_y=signal_y1, bkg_1x=bkg_x, components=[ss_cmp, sb_cmp, bb_cmp]) with rooSilent(): ## components model.SS.fix(5000) model.SB.fix(1000) model.BB.fix(1000) model.C[0].fix(5000) model.C[1].fix(1000) model.C[2].fix(1000) r = model.fitTo(dataset, ncpu=8) model.SS.release() model.SB.release() model.BB.release() model.C[0].release() model.C[1].release() model.C[2].release() r = model.fitTo(dataset, ncpu=8) logger.info('Model %s Fit result \n#%s ' % (model.name, r))
def test_psxps_BBsym () : logger.info ('Simmetric fit model with non-factorizeable background component: ( Gauss + P1 ) (x) ( Gauss + P1 ) + (PS*P1)**2') PS = Ostap.Math.PhaseSpaceNL( 1.0 , 5.0 , 2 , 5 ) model = Models.Fit2DSym ( suffix = '_12' , signal_x = signal1 , signal_y = signal2s , bkg_1x = -1 , bkg_2D = Models.PSPol2Dsym_pdf ( 'P2D12' , m_x , m_y , ps = PS , n = 1 ) ) ## fit with fixed mass and sigma with rooSilent() : result, frame = model. fitTo ( dataset ) model.signal_x.sigma.release () model.signal_y.sigma.release () model.signal_x.mean .release () model.signal_y.mean .release () result, frame = model. fitTo ( dataset ) if 0 != result.status() or 3 != result.covQual() : logger.warning('Fit is not perfect MIGRAD=%d QUAL=%d ' % ( result.status() , result.covQual() ) ) print(result) else : logger.info ('S1xS2 : %20s' % result ( model.SS ) [0] ) logger.info ('S1xB2 : %20s' % ( result ( model.SB ) [0] /2 ) ) logger.info ('B1xS2 : %20s' % ( result ( model.BS ) [0] /2 ) ) logger.info ('B1xB2 : %20s' % result ( model.BB ) [0] ) models.add ( model )
def test_p1xp1_BBsym(): logger.info( 'Symmetric non-factorized fit model: ( Gauss + P1 ) (x) ( Gauss + P1 ) + BBsym' ) sb = ROOT.RooRealVar('sb', 'SB', 0, 10000) model = Models.Fit2DSym( suffix='_6', signal_x=signal1, signal_y=signal2s, bkg_1x=-1, bkg_2D=Models.PolyPos2Dsym_pdf('P2D5', m_x, m_y, n=2), ) ## fit with fixed mass and sigma with rooSilent(): result, frame = model.fitTo(dataset) model.signal_x.sigma.release() model.signal_y.sigma.release() model.signal_x.mean.release() model.signal_y.mean.release() result, frame = model.fitTo(dataset) model.draw1(dataset) model.draw2(dataset) if 0 != result.status() or 3 != result.covQual(): logger.warning('Fit is not perfect MIGRAD=%d QUAL=%d ' % (result.status(), result.covQual())) print(result) else: logger.info('S1xS2 : %20s' % result(model.SS)[0]) logger.info('S1xB2 : %20s' % (result(model.SB)[0] / 2)) logger.info('B1xS2 : %20s' % (result(model.BS)[0] / 2)) logger.info('B1xB2 : %20s' % result(model.BB)[0]) models.add(model)
def test_model_16(): logger.info( 'Symmetric fit model with non-factorazeable symmetric (spline) background component: ( Gauss + expo*P1 ) (x) ( Gauss + expo*P1 ) + Spline2Dsym' ) SPLINES = Ostap.Math.PositiveSpline2DSym(spline1) model = Models.Fit2DSym(suffix='_16', signal_x=signal1, signal_y=signal2s, bkg_1x=1, bkg_2D=Models.Spline2Dsym_pdf('P2D16', m_x, m_y, spline=SPLINES)) ## fit with fixed mass and sigma with rooSilent(): result, frame = model.fitTo(dataset) model.signal_x.sigma.release() model.signal_y.sigma.release() model.signal_x.mean.release() model.signal_y.mean.release() result, frame = model.fitTo(dataset) if 0 != result.status() or 3 != result.covQual(): logger.warning('Fit is not perfect MIGRAD=%d QUAL=%d ' % (result.status(), result.covQual())) print(result) else: logger.info('S1xS2 : %20s' % result(model.SS)[0]) logger.info('S1xB2 : %20s' % (result(model.SB)[0] / 2)) logger.info('B1xS2 : %20s' % (result(model.BS)[0] / 2)) logger.info('B1xB2 : %20s' % result(model.BB)[0]) models.add(model)
def test_pbxpb_BBsym(): logger.info( 'Symmetric fit model with non-factorizeable background component: ( Gauss + P1 ) (x) ( Gauss + P1 ) + Sym(expo*P1)**2' ) model = Models.Fit2DSym(suffix='_9', signal_1=signal1, signal_2=signal2s, bkg1=-1, bkg2D=Models.ExpoPol2Dsym_pdf('P2D9', m_x, m_y, n=1)) ## fit with fixed mass and sigma with rooSilent(): result, frame = model.fitTo(dataset) model.signal1.sigma.release() model.signal2.sigma.release() model.signal1.mean.release() model.signal2.mean.release() result, frame = model.fitTo(dataset) if 0 != result.status() or 3 != result.covQual(): logger.warning('Fit is not perfect MIGRAD=%d QUAL=%d ' % (result.status(), result.covQual())) print result else: logger.info('S1xS2 : %20s' % result(model.SS)[0]) logger.info('S1xB2 : %20s' % (result(model.SB)[0] / 2)) logger.info('B1xS2 : %20s' % (result(model.BS)[0] / 2)) logger.info('B1xB2 : %20s' % result(model.BB)[0]) models.add(model)
def test_psxps_BBsym(): logger.info( 'Simmetric fit model with non-factorizeable background component: ( Gauss + expo*P1 ) (x) ( Gauss + expo*P1 ) + (PS*P1)**2' ) PS = Ostap.Math.PhaseSpaceNL(1.0, 5.0, 2, 5) model = Models.Fit2DSym(suffix='_12', signal_1=Models.Gauss_pdf('Gx', m_x.getMin(), m_x.getMax(), mass=m_x), signal_2=Models.Gauss_pdf('Gy', m_y.getMin(), m_y.getMax(), mass=m_y), bkg1=1, bkg2D=Models.PSPol2Dsym_pdf('P2D12', m_x, m_y, ps=PS, n=1)) model.signal1.sigma.fix(m.error()) model.signal2.sigma.fix(m.error()) model.signal1.mean.fix(m.value()) model.signal2.mean.fix(m.value()) model.signal1.mean.fix(m.value()) model.signal2.mean.fix(m.value()) model.bkg1.tau.fix(0) model.bkg2.tau.fix(0) ## fit with fixed mass and sigma with rooSilent(): result, frame = model.fitTo(dataset) model.signal1.sigma.release() model.signal2.sigma.release() model.signal1.mean.release() model.signal2.mean.release() result, frame = model.fitTo(dataset) if 0 != result.status() or 3 != result.covQual(): logger.warning('Fit is not perfect MIGRAD=%d QUAL=%d ' % (result.status(), result.covQual())) print result else: logger.info('S1xS2 : %20s' % result(model.ss)[0]) logger.info('S1xB2 : %20s' % (result(model.sb)[0] / 2)) logger.info('B1xS2 : %20s' % (result(model.bs)[0] / 2)) logger.info('B1xB2 : %20s' % result(model.bb)[0]) models.add(model)
def test_model_16(): logger.info( 'Symmetric fit model with non-factorazeable symmetric (spline) backgrond component: ( Gauss + expo*P1 ) (x) ( Gauss + expo*P1 ) + Spline2Dsym' ) SPLINES = Ostap.Math.Spline2DSym(spline1) model = Models.Fit2DSym(suffix='_16', signal_1=Models.Gauss_pdf('Gx', m_x.getMin(), m_x.getMax(), mass=m_x), signal_2=Models.Gauss_pdf('Gy', m_y.getMin(), m_y.getMax(), mass=m_y), bkg1=1, bkg2D=Models.Spline2Dsym_pdf('P2D16', m_x, m_y, spline=SPLINES)) model.signal1.sigma.fix(m.error()) model.signal2.sigma.fix(m.error()) model.signal1.mean.fix(m.value()) model.signal2.mean.fix(m.value()) model.signal1.mean.fix(m.value()) model.signal2.mean.fix(m.value()) model.bkg1.tau.fix(0) ## fit with fixed mass and sigma with rooSilent(): result, frame = model.fitTo(dataset) model.signal1.sigma.release() model.signal2.sigma.release() model.signal1.mean.release() model.signal2.mean.release() result, frame = model.fitTo(dataset) if 0 != result.status() or 3 != result.covQual(): logger.warning('Fit is not perfect MIGRAD=%d QUAL=%d ' % (result.status(), result.covQual())) print result else: logger.info('S1xS2 : %20s' % result(model.ss)[0]) logger.info('S1xB2 : %20s' % (result(model.sb)[0] / 2)) logger.info('B1xS2 : %20s' % (result(model.bs)[0] / 2)) logger.info('B1xB2 : %20s' % result(model.bb)[0]) models.add(model)
def test_p1xp1_BBsym(): logger.info( 'Symmetric non-factorized fit model: ( Gauss + P1 ) (x) ( Gauss + P1 ) + BBsym' ) sb = ROOT.RooRealVar('sb', 'SB', 0, 10000) model = Models.Fit2DSym( suffix='_6', signal_1=Models.Gauss_pdf('Gx', m_x.getMin(), m_x.getMax(), mass=m_x), signal_2=Models.Gauss_pdf('Gy', m_y.getMin(), m_y.getMax(), mass=m_y), bkg1=1, bkg2D=Models.PolyPos2Dsym_pdf('P2D5', m_x, m_y, n=2), ) model.signal1.sigma.fix(m.error()) model.signal2.sigma.fix(m.error()) model.signal1.mean.fix(m.value()) model.signal2.mean.fix(m.value()) model.signal1.mean.fix(m.value()) model.signal2.mean.fix(m.value()) model.bkg1.tau.fix(0) model.bkg2.tau.fix(0) ## fit with fixed mass and sigma with rooSilent(): result, frame = model.fitTo(dataset) model.signal1.sigma.release() model.signal2.sigma.release() model.signal1.mean.release() model.signal2.mean.release() result, frame = model.fitTo(dataset) if 0 != result.status() or 3 != result.covQual(): logger.warning('Fit is not perfect MIGRAD=%d QUAL=%d ' % (result.status(), result.covQual())) print result else: logger.info('S1xS2 : %20s' % result(model.ss)[0]) logger.info('S1xB2 : %20s' % (result(model.sb)[0] / 2)) logger.info('B1xS2 : %20s' % (result(model.bs)[0] / 2)) logger.info('B1xB2 : %20s' % result(model.bb)[0]) models.add(model)
def test_simfit3(): logger = getLogger('test_simfit3') ## low statistic, high-background "signal channel" signal2 = Models.Gauss_pdf('G2', xvar=mass2, mean=(15, 20), sigma=(0.1, 5.0)) signal3 = Models.Gauss_pdf('G3', xvar=mass3, mean=signal2.mean, sigma=signal2.sigma) model_S = Models.Fit2DSym(suffix='M2', yvar=mass3, signal_x=signal2, signal_y=signal3, bkg_1x=None, bkg_2x=None) model_S.BB = NB2 model_S.SS = NS2 model_S.SB = NC2 model_S.SB.setMin(-500) ## fit 2 rS, fx = model_S.fitTo(dataset2, draw=None, nbins=50, silent=True) rS, fx = model_S.fitTo(dataset2, draw=None, nbins=50, silent=True) title = 'Results of fit to signal sample only' logger.info('%s\n%s' % (title, rS.table(title=title, prefix='# '))) with use_canvas('test_simfit3'): with wait(1): rS, fx = model_S.fitTo(dataset2, draw='X', nbins=50, silent=True) with wait(1): rS, fy = model_S.fitTo(dataset2, draw='Y', nbins=50, silent=True) # ========================================================================= ## high statistic, low-background "control/normalization channel" mean_N = signal2.vars_subtract(signal2.mean, 10.0) sigma_N = signal2.vars_multiply(signal2.sigma, 0.5) signal_N = Models.Gauss_pdf('G1', xvar=mass1, mean=mean_N, sigma=sigma_N) model_N = Models.Fit1D(suffix='M1', signal=signal_N, background=-1) model_N.S = NS1 model_N.B = NB1 ## fit 1 rN, fN = model_N.fitTo(dataset1, draw=False, nbins=50, silent=True) with use_canvas('test_simfit3'), wait(1): rN, fN = model_N.fitTo(dataset1, draw=True, nbins=50, silent=True) title = 'Results of fit to normalization sample only' logger.info('%s\n%s' % (title, rN.table(title=title, prefix='# '))) # ========================================================================= ## combine data sample = ROOT.RooCategory('sample', 'sample', 'S', 'N') ## combine datasets from ostap.fitting.simfit import combined_data vars = ROOT.RooArgSet(mass1, mass2, mass3) dataset = combined_data(sample, vars, {'N': dataset1, 'S': dataset2}) ## combine PDFs model_sim = Models.SimFit(sample, {'S': model_S, 'N': model_N}, name='X') # ========================================================================= rC, fC = model_sim.fitTo(dataset, silent=True) rC, fC = model_sim.fitTo(dataset, silent=True) title = 'Results of simultaneous fit' logger.info('%s\n%s' % (title, rC.table(title=title, prefix='# '))) with use_canvas('test_simfit3'), wait(1): with wait(1): fN = model_sim.draw('N', dataset, nbins=50) with wait(1): fSx = model_sim.draw('S/x', dataset, nbins=50) with wait(1): fSy = model_sim.draw('S/y', dataset, nbins=50) logger.info(' Value | Simple fit | Combined fit ') logger.info(' #N | %25s | %-25s ' % (rS.SSM2 * 1, rC.SSM2 * 1)) logger.info(' mean | %25s | %-25s ' % (rS.mean_G2 * 1, rC.mean_G2 * 1)) logger.info(' sigma | %25s | %-25s ' % (rS.sigma_G2 * 1, rC.sigma_G2 * 1))
# ============================================================================= ## low statistic, high-background "signal channel" signal2 = Models.Gauss_pdf ( 'G2' , xvar = mass2 , mean = ( 15 , 20 ) , sigma = ( 0.1 , 5.0 ) ) signal3 = Models.Gauss_pdf ( 'G3' , xvar = mass3 , mean = signal2.mean , sigma = signal2.sigma ) model_S = Models.Fit2DSym ( suffix = 'M2' , yvar = mass3 , signal_x = signal2 , signal_y = signal3 , bkg_1x = None , bkg_2x = None ) model_S.BB = NB2 model_S.SS = NS2 model_S.SB = NC2 model_S.SB.setMin ( -500 ) ## fit 2 rS , fx = model_S.fitTo ( dataset2 , draw = None , nbins = 50 , silent = True ) rS , fx = model_S.fitTo ( dataset2 , draw = None , nbins = 50 , silent = True ) rS , fx = model_S.fitTo ( dataset2 , draw = 'X' , nbins = 50 , silent = True ) rS , fy = model_S.fitTo ( dataset2 , draw = 'Y' , nbins = 50 , silent = True ) logger.info ( 'Fit results for signal sample only: %s' % rS )