def test_calculate_exposure_time_correction(input_arrays, old_unit, exposure_time, force, expected_arrays, expected_unit): output_arrays, output_unit = iris_tools.calculate_exposure_time_correction( input_arrays, old_unit, exposure_time, force=force) for i, output_array in enumerate(output_arrays): np_test.assert_allclose(output_array, expected_arrays[i]) assert output_unit == expected_unit
def apply_exposure_time_correction(self, undo=False, force=False): """ Applies or undoes exposure time correction to data and uncertainty and adjusts unit. Correction is only applied (undone) if the object's unit doesn't (does) already include inverse time. This can be overridden so that correction is applied (undone) regardless of unit by setting force=True. Parameters ---------- undo: `bool` If False, exposure time correction is applied. If True, exposure time correction is undone. Default=False force: `bool` If not True, applies (undoes) exposure time correction only if unit doesn't (does) already include inverse time. If True, correction is applied (undone) regardless of unit. Unit is still adjusted accordingly. Returns ------- result: `IRISSpectrogramCube` New IRISSpectrogramCube in new units. """ # Get exposure time in seconds and change array's shape so that # it can be broadcast with data and uncertainty arrays. exposure_time_s = self.extra_coords["exposure time"]["value"].to(u.s).value if not self.extra_coords["exposure time"]["value"].isscalar: if len(self.dimensions) == 1: pass elif len(self.dimensions) == 2: exposure_time_s = exposure_time_s[:, np.newaxis] elif len(self.dimensions) == 3: exposure_time_s = exposure_time_s[:, np.newaxis, np.newaxis] else: raise ValueError( "IRISSpectrogramCube dimensions must be 2 or 3. Dimensions={0}".format( len(self.dimensions.shape))) # Based on value on undo kwarg, apply or remove exposure time correction. if undo is True: new_data_arrays, new_unit = iris_tools.uncalculate_exposure_time_correction( (self.data, self.uncertainty.array), self.unit, exposure_time_s, force=force) else: new_data_arrays, new_unit = iris_tools.calculate_exposure_time_correction( (self.data, self.uncertainty.array), self.unit, exposure_time_s, force=force) # Return new instance of IRISSpectrogramCube with correction applied/undone. return IRISSpectrogramCube( new_data_arrays[0], self.wcs, new_data_arrays[1], new_unit, self.meta, convert_extra_coords_dict_to_input_format(self.extra_coords, self.missing_axis), mask=self.mask, missing_axis=self.missing_axis)
def apply_exposure_time_correction(self, undo=False, force=False): """ Applies or undoes exposure time correction to data and uncertainty and adjusts unit. Correction is only applied (undone) if the object's unit doesn't (does) already include inverse time. This can be overridden so that correction is applied (undone) regardless of unit by setting force=True. Parameters ---------- undo: `bool` If False, exposure time correction is applied. If True, exposure time correction is removed. Default=False force: `bool` If not True, applies (undoes) exposure time correction only if unit doesn't (does) already include inverse time. If True, correction is applied (undone) regardless of unit. Unit is still adjusted accordingly. Returns ------- result: `IRISMapCube` A new IRISMapCube is returned with the correction applied (undone). """ # Raise an error if this method is called while memmap is used if not self.scaled: raise ValueError( "This method is not available as you are using memmap") # Get exposure time in seconds and change array's shape so that # it can be broadcast with data and uncertainty arrays. exposure_time_s = u.Quantity( self.extra_coords["EXPOSURE TIME"]["value"], unit='s').value if not np.isscalar(self.extra_coords["EXPOSURE TIME"]["value"]): if self.data.ndim == 1: pass elif self.data.ndim == 2: exposure_time_s = exposure_time_s[:, np.newaxis] elif self.data.ndim == 3: exposure_time_s = exposure_time_s[:, np.newaxis, np.newaxis] else: raise ValueError( "IRISMapCube dimensions must be 2 or 3. Dimensions={0}". format(self.data.ndim)) # Based on value on undo kwarg, apply or remove exposure time correction. if undo is True: new_data_arrays, new_unit = iris_tools.uncalculate_exposure_time_correction( (self.data, self.uncertainty.array), self.unit, exposure_time_s, force=force) else: new_data_arrays, new_unit = iris_tools.calculate_exposure_time_correction( (self.data, self.uncertainty.array), self.unit, exposure_time_s, force=force) # Return new instance of IRISMapCube with correction applied/undone. return IRISMapCube( data=new_data_arrays[0], wcs=self.wcs, uncertainty=new_data_arrays[1], unit=new_unit, meta=self.meta, mask=self.mask, missing_axes=self.missing_axes, scaled=self.scaled, extra_coords=convert_extra_coords_dict_to_input_format( self.extra_coords, self.missing_axes))