示例#1
0
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')
示例#2
0
    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():
示例#3
0
文件: toys.py 项目: OstapHEP/ostap
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))
示例#4
0
    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 test_gauss():
示例#5
0
        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
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='# ')))
示例#7
0
文件: lumi.py 项目: chrisburr/ostap
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
示例#8
0
        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_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))
示例#10
0
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')
示例#11
0
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 = '# ' ) )
示例#12
0
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')
示例#13
0
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 
示例#14
0
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 = '# ') ) ) 
示例#15
0
文件: lumi.py 项目: OstapHEP/ostap
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
示例#16
0
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())