def __isub__(self, other): """self -= b b is a pair of numbers (x, xerr_square) or another histogram """ data = self._data; errs = self._errors if isNumberPair(other) and self.isunitless(): x, xerr = other data -= x; errs += xerr pass elif isDimensionalPair(other): x, xerr = other data -= x; errs += xerr pass elif isHistogram(other): data -= other._data; errs += other._errors else: raise NotImplementedError , "__sub__ is not defined for %s and %s" % ( self.__class__.__name__, other.__class__.__name__, ) return self
def __idiv__(self, other): """self /= b b is a pair of numbers (x, xerr_square) or another histogram """ data = self._data; errs = self._errors # sigmaA**2/B**2 + A**2*sigmaB**2/B**4 if isNumberPair(other): y, dy2 = other y, dy2 = float(y), float(dy2) if dy2 == 0 or dy2 == 0.0: #special case #ydx/y^2 self._setunit(1.*self.unit()/y) return self errs /= y*y errs += dy2 * data * data / y**4 data /= y pass elif isDimensionalPair(other): y, dy2 = other unitlessother = 1, dy2/y/y self._setunit( 1.*self.unit()/y ) self /= unitlessother pass elif isHistogram(other): y = other._data; dy2 = other._errors if dy2 == None: #special case #ydx/y^2 errs /= y; errs /= y data /= y return self errs /= y*y errs += dy2 * data * data /y/y/y/y data /= y self._setunit( self.unit()/other.unit() ) else: raise NotImplementedError , "__div__ is not defined for %s and %s. "\ "self=%s, other=%s" % ( self.__class__.__name__, other.__class__.__name__, self, other) self._syncUnit() return self
def __iadd__(self, other): """self += b b is a pair of numbers (x, xerr_square) or another histogram """ data = self._data; errs = self._errors if isNumberPair(other) and self.isunitless(): x, xerr = other data += x errs += xerr pass elif isDimensionalPair( other ): x, xerr = other data += x errs += xerr pass elif isHistogram(other): data += other._data; if errs is None: if other._errors is not None: self._dataCont.replaceDataset("error", other._errors.copy() ) pass pass else: errs += other._errors pass pass else: raise NotImplementedError , "__add__ is not defined for %s and %s" % ( self.__class__.__name__, other.__class__.__name__, ) return self
def __imul__(self, other): """self *= b b is a pair of numbers (x, xerr_square) or another histogram """ data = self._data; errs = self._errors if isNumberPair(other) or isDimensionalPair(other): y, dy2 = other y, dy2 = float(y), float(dy2) #B**2*sigmaA**2 + A**2*sigmaB**2 #term2 = dy2 * data * data #term1 = errs * y * y errs *= y*y errs += dy2*data*data data *= y pass elif isHistogram(other): y = other.data(); dy2 = other.errors() # errs *= y*y errs += dy2 * data*data data *= y self._setunit( self.unit() * other.unit() ) else: raise NotImplementedError , "__mul__ is not defined for %s and %s" % ( self.__class__.__name__, other.__class__.__name__, ) self._syncUnit() return self