Exemplo n.º 1
0
from ostap.utils.utils import wait
# =============================================================================
# logging
# =============================================================================
from ostap.logger.logger import getLogger
if '__main__' == __name__ or '__builtin__' == __name__:
    logger = getLogger('test_fitting_simfit1')
else:
    logger = getLogger(__name__)
# =============================================================================
## make simple test mass
mass = ROOT.RooRealVar('test_mass', 'Some test mass', 0, 5)

## book very simple data set:
varset1 = ROOT.RooArgSet(mass)
dataset1 = ROOT.RooDataSet(dsID(), 'Test Data set-1', varset1)

## book very simple data set:
varset2 = ROOT.RooArgSet(mass)
dataset2 = ROOT.RooDataSet(dsID(), 'Test Data set-2', varset2)

## high statistic, low-background "control channel"
mean1 = 2.0
sigma1 = 0.50
NS1 = 10000
NB1 = 1000

for i in range(NS1):
    v1 = random.gauss(mean1, sigma1)
    if v1 in mass:
        mass.setVal(v1)
Exemplo n.º 2
0
# =============================================================================
# logging
# =============================================================================
from ostap.logger.logger import getLogger
if '__main__' == __name__ or '__builtin__' == __name__:
    logger = getLogger('test_models2_2D')
else:
    logger = getLogger(__name__)
# =============================================================================
## make simple test mass
m_x = ROOT.RooRealVar('mass_x', 'Some test mass(X)', 3, 3.2)
m_y = ROOT.RooRealVar('mass_y', 'Some test mass(Y)', 3, 3.2)

## book very simple data set
varset = ROOT.RooArgSet(m_x, m_y)
dataset = ROOT.RooDataSet(dsID(), 'Test Data set-1', varset)

m = VE(3.100, 0.015**2)

N_ss = 10000
N_sb = 2500
N_bs = 2500
N_bb = 5000

random.seed(0)

## fill it : 5000 events  Gauss * Gauss
for i in xrange(0, N_ss):
    m_x.value = m.gauss()
    m_y.value = m.gauss()
    dataset.add(varset)
Exemplo n.º 3
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')
Exemplo n.º 4
0
# =============================================================================
from ostap.logger.logger import getLogger
if '__main__' == __name__  or '__builtin__' == __name__ : 
    logger = getLogger ( 'test_fitting_efficiency' )
else : 
    logger = getLogger ( __name__ )
# =============================================================================
## make
x           = ROOT.RooRealVar ( 'x',  'test' , 0 , 10 )
xmin , xmax = x.minmax()

acc = ROOT.RooCategory( 'cut','cut')
acc.defineType('accept',1)
acc.defineType('reject',0)
varset  = ROOT.RooArgSet  ( x , acc )
ds      = ROOT.RooDataSet ( dsID() , 'test data' ,  varset )

eff0       = Models.Monotonic_pdf ( 'E0' , xvar = x , power = 2 , increasing = True )
eff0.phis  = 3.1415/2 , 3.1415/2 
margin     = 1.25 
emax       = margin * eff0 ( x.getMax() ) 

for i in range ( 10000 ) :
    
    xv = random.uniform ( xmin , xmax )
    
    x.setVal ( xv )
    
    ev = random.uniform ( 0 , emax )
    
    if eff0( xv )  > ev : acc.setIndex(1)
Exemplo n.º 5
0
def test_toys_simfit_1():

    logger = getLogger('test_toys_simfit_1')

    ## make simple test mass
    mass = ROOT.RooRealVar('test_mass', 'Some test mass', 0, 5)

    ## book very simple data set:
    varset1 = ROOT.RooArgSet(mass)
    dataset1 = ROOT.RooDataSet(dsID(), 'Test Data set-1', varset1)

    ## book very simple data set:
    varset2 = ROOT.RooArgSet(mass)
    dataset2 = ROOT.RooDataSet(dsID(), 'Test Data set-2', varset2)

    ## high statistic, low-background "control channel"
    mean1 = 2.0
    sigma1 = 0.50
    NS1 = 1000
    NB1 = 250

    for i in range(NS1):
        v1 = random.gauss(mean1, sigma1)
        if v1 in mass:
            mass.setVal(v1)
            dataset1.add(varset1)

    for i in range(NB1):
        v1 = random.uniform(0, 5)
        if v1 in mass:
            mass.setVal(v1)
            dataset1.add(varset1)

    ## low statistic, high-background "control channel"
    NS2 = 250
    NB2 = 1000
    mean2 = mean1 + 1.0
    sigma2 = sigma1 * 0.5

    for i in range(NS2):
        v2 = random.gauss(mean2, sigma2)
        if v2 in mass:
            mass.setVal(v2)
            dataset2.add(varset2)
    for i in range(NB2):
        v2 = random.uniform(0, 5)
        if v2 in mass:
            mass.setVal(v2)
            dataset2.add(varset2)

    signal1 = Models.Gauss_pdf('G1',
                               xvar=mass,
                               mean=(0.5, 2.5),
                               sigma=(0.1, 1.0))

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

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

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

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

    with use_canvas('test_toys_simfit_1'):
        # =========================================================================
        ## fit 1
        with wait(1):
            r1, f1 = model1.fitTo(dataset1, draw=True, nbins=50, silent=True)

        ## fit 2
        with wait(1):
            r2, f2 = model2.fitTo(dataset2, draw=True, nbins=50, silent=True)
        # =========================================================================

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

    ## combine datasets
    from ostap.fitting.simfit import combined_data
    vars = ROOT.RooArgSet(mass)
    dataset = combined_data(sample, vars, {'A': dataset1, 'B': dataset2})

    ## combine PDFs
    model_sim = Models.SimFit(sample, {'A': model1, 'B': model2}, name='X')

    # =========================================================================
    r, f = model_sim.fitTo(dataset, silent=True)
    r, f = model_sim.fitTo(dataset, silent=True)

    with use_canvas('test_toys_simfit_1'):
        with wait(1):
            fA = model_sim.draw('A', dataset, nbins=50)
        with wait(1):
            fB = model_sim.draw('B', dataset, nbins=50)

    logger.info('Fit  results are: %s ' % r.table(prefix="# "))

    ## Make toys
    results, stats = Toys.make_toys(pdf=model_sim,
                                    nToys=100,
                                    data=[mass],
                                    gen_config={
                                        'nEvents': (NS1 + NB1, NS2 + NB2),
                                        'sample': True
                                    },
                                    fit_config={'silent': True},
                                    init_pars={
                                        'mean_G1': mean1,
                                        'BM1': NB1,
                                        'BM2': NB2,
                                        'sigma_G1': sigma1,
                                        'SM1': NS1,
                                        'SM2': NS2,
                                        'phi0_Bkg_FitG1_M1': 0
                                    },
                                    silent=True,
                                    progress=True)
Exemplo n.º 6
0
from ostap.logger.utils import rooSilent
# =============================================================================
# logging
# =============================================================================
from ostap.logger.logger import getLogger
if '__main__' == __name__ or '__builtin__' == __name__:
    logger = getLogger('test_models')
else:
    logger = getLogger(__name__)
# =============================================================================
## make simple test mass
mass = ROOT.RooRealVar('test_mass', 'Some test mass', 3.0, 3.2)

## book very simple data set
varset0 = ROOT.RooArgSet(mass)
dataset0 = ROOT.RooDataSet(dsID(), 'Test Data set-0', varset0)

mmin, mmax = mass.minmax()

## fill it
m = VE(3.100, 0.015**2)
for i in xrange(0, 5000):
    mass.value = m.gauss()
    dataset0.add(varset0)

for i in xrange(0, 500):
    mass.value = random.uniform(mmin, mmax)
    dataset0.add(varset0)

logger.info('DATASET %s' % dataset0)
Exemplo n.º 7
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')
Exemplo n.º 8
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='# '))
Exemplo n.º 9
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 = '# ') ) )