Exemple #1
0
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))
Exemple #2
0
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)
Exemple #4
0
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)
Exemple #5
0
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)
Exemple #9
0
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 )