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 )
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 )
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()