Subclassing `~astropy.nddata.nddata.NDData` and `~astropy.nddata.nderror.NDUncertainty` ======================================================================================= Subclassing `~astropy.nddata.nderror.NDUncertainty` --------------------------------------------------- New error classes should sub-class from `~astropy.nddata.nderror.NDUncertainty`, and should provide methods with the following API:: class MyUncertainty(NDUncertainty): def propagate_add(self, other_nddata, result_data): ... result_uncertainty = MyUncertainty(...) return result_uncertainty def propagate_subtract(self, other_nddata, result_data): ... result_uncertainty = MyUncertainty(...) return result_uncertainty def propagate_multiply(self, other_nddata, result_data): ... result_uncertainty = MyUncertainty(...) return result_uncertainty def propagate_divide(self, other_nddata, result_data): ... result_uncertainty = MyUncertainty(...) return result_uncertainty All error sub-classes inherit an attribute ``self.parent_nddata`` that is automatically set to the parent `~astropy.nddata.nddata.NDData` object that they are attached to. The arguments passed to the error propagation methods are ``other_nddata``, which is the `~astropy.nddata.nddata.NDData` object that is being combined with ``self.parent_nddata``, and ``result_data``, which is a Numpy array that contains the data array after the arithmetic operation. All these methods should return an error instance ``result_uncertainty``, and should not modify ``parent_nddata`` directly. For subtraction and division, the order of the operations is ``parent_nddata - other_nddata`` and ``parent_nddata / other_nddata``. To make it easier and clearer to code up the error propagation, you can use variables with more explicit names, e.g:: class MyUncertainty(NDUncertainty): def propogate_add(self, other_nddata, result_data): left_uncertainty = self.parent.uncertainty.array right_uncertainty = other_nddata.uncertainty.array ... Note that the above example assumes that the errors are stored in an ``array`` attribute, but this does not have to be the case. For an example of a complete implementation, see `~astropy.nddata.nduncertainty.StdDevUncertainty`.