コード例 #1
0
ファイル: roofitresult.py プロジェクト: OstapHEP/ostap
def _rfr_sum_ ( self , var1 , var2 , *vars ) :
    """Get correct estimate of sum of two or more variables,
    taking into account correlations
    >>> r = ...
    >>> print r.sum( 'S' , 'B' ) ## S+B
    """
    allvars = ( var1 , var2 ) + vars 
    n       = len ( allvars ) 
    s  = 0.0
    c2 = 0.0
    for i in range ( n ) :
        vi = allvars [ i ]
        if isinstance ( vi , str ) : vi = self.param ( vi ) [1]        
        v   = vi.value
        v   = VE ( v ) 
        s  += v . value ()
        vc  = v.cov2() 
        if 0 >= vc or vi in self.constPars() : continue        
        c2 += vc 
        for j in range ( i ) :
            vj  = allvars [ j ]
            if isinstance ( vj , str ) : vj = self.param ( vj ) [1]
            if vj in self.constPars() : continue        
            c2 += 2 * self.covariance ( vi , vj ) 
            
    return VE ( s , c2 ) 
コード例 #2
0
ファイル: roofitresult.py プロジェクト: OstapHEP/ostap
def _rfr_multiply_ ( self , var1 ,  var2 , *vars ) :
    """Get correct estimate of product of two variables,
    taking into account correlations
    >>> r = ...
    >>> print r.multiply( 'S' , 'B' ) ## S*B
    """
    allvars = ( var1 , var2 ) + vars 
    n       = len ( allvars ) 
    
    m  = 1.0
    c2 = 0
    for i in range ( n ) :
        vi = allvars[i]
        if isinstance ( vi , str ) : vi = self.param ( vi )[1]
        v  = vi.value
        v  = VE ( v ) 
        vv = v.value ()
        if iszero ( vv ) or iszero ( m ) : return  VE ( 0.0 , 0.0 )   ## RETURN HERE
        m  *= vv
        vc  = v.cov2()
        if 0 >= vc or vi in self.constPars() : continue        
        c2 += vc / ( vv * vv )        
        for j in range ( i  ) :            
            vj  = allvars [ j ]
            if isinstance ( vj , str ) : vj = self.param( vj )[1]
            if vj in self.constPars()  : continue        
            w   = vj . value
            w   = VE ( w ) 
            ww  = w.value() 
            c2 += 2 * self.covariance ( vi , vj ) / ( vv * ww ) 
            
    return  VE ( m , c2 * m * m ) 
コード例 #3
0
ファイル: covtransform.py プロジェクト: chrisburr/ostap
def transform(C, X, *Y):
    """ Transform the covariance nmatrix C at point X to the variables Y(X)
    >>> X = 1 , 2
    >>> C = Ostap.SymMatrix(2)()
    >>> C [ 0 , 0 ] = 0.20
    >>> C [ 0 , 1 ] = 0.05
    >>> C [ 1 , 1 ] = 0.30
    >>> r   = lambda x , y : (x*x+y*y)**2
    >>> phi = lambda x , y : math.atan2 ( y , x )
    >>> C_polar = transform ( C , X , r , phi ) 
    """

    ny = len(Y)
    assert 1 <= ny, 'Invalid size of Y!'

    nx = len(X)
    if C is None and 1 <= nx:
        C = Ostap.SymMatrix(nx)()
        for i, x in enumerate(X):
            xx = VE(x)
            C[i, i] = xx.cov2()

    shape = C.shape
    assert shape[0] == shape[1] and shape[0] == nx, 'Invalid shape of matrix C!'

    CC = Ostap.SymMatrix(nx)()
    for i in range(CC.kRows):
        CC[i, i] = C(i, i)
        for j in range(i + 1, CC.kCols):
            v = 0.5 * (C(i, j) + C(j, i))
            CC[i, j] = v

    XX = Ostap.Vector(nx)()
    for i, x in enumerate(X):
        XX[i] = float(x)

    ## get vector-with-errors
    XX = Ostap.VectorE(nx)(XX, CC)

    R = XX.transform(*Y)

    return R.cov2()