Esempio n. 1
0
def test_simfit2 ( ) :
    
    # =========================================================================    
    signal1  = Models.Gauss_pdf ( 'G1'                 ,
                                  xvar  = mass1        ,
                                  mean  = (1.5 , 6.5 ) ,
                                  sigma = (0.1 , 2.5 ) )
    
    model1   = Models.Fit1D ( suffix = 'M1' , signal = signal1 ,  background = -1 )
    model1.S = NS1
    model1.B = NB1 
    
    
    mean2    = signal1.vars_add      ( signal1.mean  , 10.0 )
    sigma2   = signal1.vars_multiply ( signal1.sigma , 0.5  )
    
    signal2  = Models.Gauss_pdf ( 'G2'            ,
                                  xvar  = mass2   ,
                                  mean  = mean2   ,
                                  sigma = sigma2  )
    
    model2  = Models.Fit1D ( suffix = 'M2' , signal = signal2 ,  background = -1  )
    model2.S = NS2
    model2.B = NB2 
    
    # =========================================================================
    ## fit 1 
    r1 , f1 = model1.fitTo ( dataset1 , draw = True , nbins = 50 , silent = True )
    
    ## fit 2
    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 ( mass1 , mass2 )
    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 )
    
    fA    = model_sim.draw ( 'A' , dataset , nbins = 50 )
    fB    = model_sim.draw ( 'B' , dataset , nbins = 50 )
    
    fNLL  = model_sim.draw_nll ( 'SM2' , dataset , range =   (0,1000)  )
    
    ## significance 
    wilks = model_sim.wilks    ( 'SM2' , dataset  )
    
    logger.info ( 'Fit  results are: %s ' % r )
Esempio n. 2
0
def test_simfit2():

    logger = getLogger('test_simfit2')
    # =========================================================================
    signal1 = Models.Gauss_pdf('G1',
                               xvar=mass1,
                               mean=(1.5, 6.5),
                               sigma=(0.1, 2.5))

    model1 = Models.Fit1D(suffix='M1', signal=signal1, background=-1)
    model1.S = NS1
    model1.B = NB1

    mean2 = signal1.vars_add(signal1.mean, 10.0)
    sigma2 = signal1.vars_multiply(signal1.sigma, 0.5)

    signal2 = Models.Gauss_pdf('G2', xvar=mass2, mean=mean2, sigma=sigma2)

    model2 = Models.Fit1D(suffix='M2', signal=signal2, background=-1)
    model2.S = NS2
    model2.B = NB2

    with use_canvas('test_simfit2'):
        # =========================================================================
        ## fit 1
        with wait(1):
            r1, f1 = model1.fitTo(dataset1, draw=True, nbins=50, silent=True)
            title = 'Results of fit to dataset1'
            logger.info('%s\n%s' % (title, r1.table(title=title, prefix='# ')))
        ## fit 2
        with wait(1):
            r2, f2 = model2.fitTo(dataset2, draw=True, nbins=50, silent=True)
            title = 'Results of fit to dataset2'
            logger.info('%s\n%s' % (title, r2.table(title=title, prefix='# ')))
        # =========================================================================

    ## combine data
    sample = ROOT.RooCategory('sample', 'sample', 'A', 'B')

    ## combine datasets
    from ostap.fitting.simfit import combined_data
    vars = ROOT.RooArgSet(mass1, mass2)
    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)

    title = 'Results of simultaneous fit'
    logger.info('%s\n%s' % (title, r.table(title=title, prefix='# ')))

    with use_canvas('test_simfit2'):
        with wait(1):
            fA = model_sim.draw('A', dataset, nbins=50)
        with wait(1):
            fB = model_sim.draw('B', dataset, nbins=50)
Esempio n. 3
0
def test_simfit1():

    logger = getLogger('test_simfit1')

    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_simfit1'):
        # =========================================================================
        ## 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_simfit1'):
        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)
Esempio n. 4
0
def test_simfit4():

    # =========================================================================
    VARS = MakeVar()

    ## MC/DATA ratio for signal widths
    Rs = ROOT.RooRealVar('Rs', 'MC/DATA ratio for signal widths', 1.0, 0.2,
                         3.0)

    ## sigma for normalization peak: sigma from MC multiplied by a factor
    sigma_N = VARS.vars_multiply(Rs, sigma1, name='sigma_N')

    ## sigma for signal peak: sigma from MC multiplied by the same factor
    sigma_S = VARS.vars_multiply(Rs, sigma2, name='sigma_S')

    ## Normalization peak:
    signal_N = Models.Gauss_pdf('GN', xvar=mass1, mean=(3, 8), sigma=sigma_N)

    ## mean of low-statistics signal is constrained to the mean of high statistic signal
    mean_S = VARS.vars_sum(signal_N.mean, mean2 - mean1)

    ## low statistic signal :
    signal_S = Models.Gauss_pdf('GS', xvar=mass2, mean=mean_S, sigma=sigma_S)

    # =========================================================================
    ## model for fitting of normalization channel
    model_N = Models.Fit1D(suffix='N', signal=signal_N,
                           background=-2)  ## 2nd order positive polynomial
    model_N.S = NS1
    model_N.B = NB1

    ## model for fitting of low-statistic signal channel
    model_S = Models.Fit1D(suffix='S', signal=signal_S,
                           background=-2)  ## 2nd order positive polynomial

    model_S.S = NS2
    model_S.B = NB2

    # =========================================================================
    ## make fit for thew normalization channel only
    # =========================================================================
    rN, fN = model_N.fitTo(dataset1, draw=None, silent=True)
    rN, fN = model_N.fitTo(dataset1, draw=None, silent=True)
    rN, fN = model_N.fitTo(dataset1, draw=True, nbins=50, silent=True)

    logger.info('Fit results for normalization sample only: %s' % rN)

    # =========================================================================
    ## make fit for the low-statistic signal channel only
    # =========================================================================
    rS, fS = model_S.fitTo(dataset2, draw=None, silent=True)
    rS, fS = model_S.fitTo(dataset2, draw=None, silent=True)
    rS, fS = model_S.fitTo(dataset2, draw=True, nbins=50, silent=True)

    logger.info('Fit results for low-statistic signal only: %s' % rS)

    # =========================================================================
    ## combine data for simultaneous  fit
    # =========================================================================

    sample = ROOT.RooCategory('sample', 'sample', 'S', 'N')

    ## combine datasets
    from ostap.fitting.simfit import combined_data
    vars = ROOT.RooArgSet(mass1, mass2)
    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)
    rC, fC = model_sim.fitTo(dataset, silent=True)

    fN = model_sim.draw('N', dataset, nbins=50)
    fS = model_sim.draw('S', dataset, nbins=50)

    logger.info('Combined fit  results are: %s ' % rC)

    logger.info(' Value |        Simple fit         |    Combined fit ')
    logger.info(' #N    | %25s | %-25s ' % (rS.SS * 1, rC.SS * 1))
    logger.info(' mean  | %25s | %-25s ' % (rS.mean_GN * 1, rC.mean_GN * 1))
    logger.info(' Rs    | %25s | %-25s ' % (rS.Rs * 1, rC.Rs * 1))
def 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

    # =========================================================================
    ## fit 1
    r1, f1 = model1.fitTo(dataset1, draw=True, nbins=50, silent=True)

    ## fit 2
    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)

    fA = model_sim.draw('A', dataset, nbins=50)
    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)
Esempio n. 6
0
def test_simfit4():

    logger = getLogger('test_simfit4')
    # =========================================================================
    VARS = MakeVar()

    ## MC/DATA ratio for signal widths
    Rs = ROOT.RooRealVar('Rs', 'MC/DATA ratio for signal widths', 1.0, 0.2,
                         3.0)

    ## sigma for normalization peak: sigma from MC multiplied by a factor
    sigma_N = VARS.vars_multiply(Rs, sigma1, name='sigma_N')

    ## sigma for signal peak: sigma from MC multiplied by the same factor
    sigma_S = VARS.vars_multiply(Rs, sigma2, name='sigma_S')

    ## Normalization peak:
    signal_N = Models.Gauss_pdf('GN', xvar=mass1, mean=(3, 8), sigma=sigma_N)

    ## mean of low-statistics signal is constrained to the mean of high statistic signal
    mean_S = VARS.vars_sum(signal_N.mean, mean2 - mean1)

    ## low statistic signal :
    signal_S = Models.Gauss_pdf('GS', xvar=mass2, mean=mean_S, sigma=sigma_S)

    # =========================================================================
    ## 3rd order positive polynomial
    bkg_N = Models.make_bkg(-3, 'Bkg_N', mass1)
    ## model for fitting of normalization channel
    model_N = Models.Fit1D(suffix='N', signal=signal_N, background=bkg_N)
    model_N.S = NS1
    model_N.B = NB1

    ## 3rd order positive polynomial
    bkg_S = Models.make_bkg(-3, 'Bkg_S', mass2)
    ## model for fitting of low-statistic signal channel
    model_S = Models.Fit1D(suffix='S', signal=signal_S, background=bkg_S)

    model_S.S = NS2
    model_S.B = NB2

    # =========================================================================
    ## make fit for thew normalization channel only
    # =========================================================================
    with use_canvas('test_simfit4'):
        rN, fN = model_N.fitTo(dataset1, draw=None, silent=True)
        rN, fN = model_N.fitTo(dataset1, draw=None, silent=True)
        rN, fN = model_N.fitTo(dataset1, draw=True, nbins=50, silent=True)

    title = 'Fit to high-statistic normalisation sample'
    logger.info('Fit results for normalization sample only: %s' %
                rN.table(title=title, prefix='# '))

    # =========================================================================
    ## make fit for the low-statistic signal channel only
    # =========================================================================
    with use_canvas('test_simfit4'):
        rS, fS = model_S.fitTo(dataset2, draw=None, silent=True)
        rS, fS = model_S.fitTo(dataset2, draw=None, silent=True)
        rS, fS = model_S.fitTo(dataset2, draw=True, nbins=50, silent=True)

    title = 'Fit to low-statistics sample'
    logger.info('Fit results for low-statistic signal only:\n%s' %
                rS.table(title=title, prefix='# '))

    # =========================================================================
    ## combine data for simultaneous  fit
    # =========================================================================

    sample = ROOT.RooCategory('sample', 'sample', 'S', 'N')

    ## combine datasets
    from ostap.fitting.simfit import combined_data
    vars = ROOT.RooArgSet(mass1, mass2)
    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)
    rC, fC = model_sim.fitTo(dataset, silent=True)
    rC, fC = model_sim.fitTo(dataset, silent=True)

    with use_canvas('test_simfit4'):
        with wait(1):
            fN = model_sim.draw('N', dataset, nbins=50)
        with wait(1):
            fS = model_sim.draw('S', dataset, nbins=50)

    title = 'Simultaneous fit'
    logger.info('Combined fit  results are:\n%s ' %
                rC.table(title=title, prefix='#'))
Esempio n. 7
0
## 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 )

fA = model_sim.draw ( 'A' , dataset , nbins = 50 )
fB = model_sim.draw ( 'B' , dataset , nbins = 50 )

logger.info ( 'Fit  results are: %s ' % r )

# =============================================================================
##                                                                      The END 
# =============================================================================
Esempio n. 8
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))
Esempio n. 9
0
# =============================================================================
## 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 )

fN  = model_sim.draw ( 'N'   , dataset , nbins = 50 )
fSx = model_sim.draw ( 'S/x' , dataset , nbins = 50 )
fSy = model_sim.draw ( 'S/y' , dataset , nbins = 50 )

logger.info ( 'Combined fit  results are: %s ' % rC )

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 ) )
Esempio n. 10
0
def test_simfit5():

    logger = getLogger('test_simfit5')

    # =========================================================================
    ## resoltuion for the left peak
    # =========================================================================
    reso1 = Models.ResoGauss('RG1',
                             xvar=dm1,
                             sigma=(sigma1, sigma1 / 2, sigma1 * 2),
                             mean=(0, -1, 1))

    # fit DM1 dataset for resolution
    r1, f1 = reso1.fitTo(dset1, silent=True)
    r1, f1 = reso1.fitTo(dset1, silent=True, draw=True, nbins=100)

    # =========================================================================
    ## resoltuion for the central peak
    # =========================================================================
    reso2 = Models.ResoGauss('RG2',
                             xvar=dm2,
                             sigma=(sigma2, sigma2 / 2, sigma2 * 2),
                             mean=(0, -1, 1))

    # fit DM2 dataset for resolution
    r2, f2 = reso2.fitTo(dset2, silent=True)
    r2, f2 = reso2.fitTo(dset2, silent=True, draw=True, nbins=100)

    # =========================================================================
    ## resoltuion for the right peak
    # =========================================================================
    reso3 = Models.ResoGauss('RG3',
                             xvar=dm3,
                             sigma=(sigma3, sigma3 / 2, sigma3 * 2),
                             mean=(0, -1, 1))

    # fit DM2 dataset for resolution
    r3, f3 = reso3.fitTo(dset3, silent=True)
    r3, f3 = reso3.fitTo(dset3, silent=True, draw=True, nbins=100)

    # =========================================================================
    # model for data fit
    # =========================================================================
    signal1 = Models.Gauss_pdf('G1',
                               xvar=mass,
                               sigma=reso1.sigma,
                               mean=(mean1, mean1 - 1, mean1 + 1))
    signal2 = Models.Gauss_pdf('G2',
                               xvar=mass,
                               sigma=reso2.sigma,
                               mean=(mean2, mean2 - 1, mean2 + 1))
    signal3 = Models.Gauss_pdf('G3',
                               xvar=mass,
                               sigma=reso3.sigma,
                               mean=(mean3, mean3 - 1, mean3 + 1))

    background = Models.PolyPos_pdf('Bkg', xvar=mass, power=1)

    model = Models.Fit1D(signals=[signal1, signal2, signal3],
                         background=background)
    model.S = NS1, NS2, NS3
    model.B = NB

    # =========================================================================
    ## Fit data (without resolution samples)
    # =========================================================================
    r0, f0 = model.fitTo(dataset, silent=True)
    r0, f0 = model.fitTo(dataset, silent=True, draw=True, nbins=100)

    logger.info('Fit result (only data):\n%s' % r0.table(prefix="# "))

    ## combine PDFs
    model_sim = Models.SimFit(category, {
        'data': model,
        'dm1': reso1,
        'dm2': reso2,
        'dm3': reso3
    },
                              name='X')

    # =========================================================================
    ## Simultanegous fit data with resolution samples)
    # =========================================================================
    r_1, f_1 = model_sim.fitTo(cdataset1, silent=True)
    r_1, f_1 = model_sim.fitTo(cdataset1, silent=True)

    logger.info('Simultaneous fit result (unbinned reso):\n%s' %
                r_1.table(prefix="# "))

    with use_canvas('test_simfit5'), wait(1):
        with wait(1):
            fdm1 = model_sim.draw('dm1', cdataset1, nbins=100)
        with wait(1):
            fdm2 = model_sim.draw('dm2', cdataset1, nbins=100)
        with wait(1):
            fdm3 = model_sim.draw('dm3', cdataset1, nbins=100)
        with wait(1):
            fd = model_sim.draw('data', cdataset1, nbins=100)

    # =========================================================================
    ## Simultanegous fit data with resolution samples)
    # =========================================================================
    r_2, f_2 = model_sim.fitTo(cdataset2, silent=True, sumw2=True)
    r_2, f_2 = model_sim.fitTo(cdataset2, silent=True, sumw2=True)

    logger.info('Simultaneous fit result (binned reso):\n%s' %
                r_2.table(prefix="# "))

    with use_canvas('test_simfit5'), wait(1):
        with wait(1):
            fdm1 = model_sim.draw('dm1', cdataset2, nbins=100)
        with wait(1):
            fdm2 = model_sim.draw('dm2', cdataset2, nbins=100)
        with wait(1):
            fdm3 = model_sim.draw('dm3', cdataset2, nbins=100)
        with wait(1):
            fd = model_sim.draw('data', cdataset2, nbins=100)
Esempio n. 11
0
# ===============================================================================
## 3a: Construction for simultaneous fit
# ===============================================================================

## combine data
sample = ROOT.RooCategory('sample', 'sample', 'DATA', 'MC')

## combine datasets
vars = ROOT.RooArgSet(mass, dm)
dataset = combined_data(sample, vars, {'DATA': ds_DATA, 'MC': ds_MC})

## combine PDFs
model_sim = Models.SimFit(sample, {
    'DATA': model_DATA,
    'MC': model_MC
},
                          name='X')

## fit it!
rSIM, fSIM = model_sim.fitTo(dataset, silent=True)
rSIM, fSIM = model_sim.fitTo(dataset, silent=True)
title = 'Simultaneous fit(1) to DATA&MC'
logger.info('%s\n%s' % (title, rSIM.table(title=title, prefix='# ')))

phi_DATA.m0.release()
reso_MC.sigma.release()

## fit it!
rSIM, fSIM = model_sim.fitTo(dataset, silent=True)
rSIM, fSIM = model_sim.fitTo(dataset, silent=True)