def two_order_image(): # generate 2 flat traces. traces = np.zeros((60, 20)) traces[[10, 11, 12], :] = 1 # the second trace that does not span the image entirely traces[[50, 51, 52], :] = 2 traces[[50, 51, 52], 0] = 0 traces[[50, 51, 52], -1] = 0 # generate test data with zero noise data = np.ones_like(traces, dtype=float) data[~np.isclose(traces, 0)] = 100. uncertainty = 1. * data wavelengths = (traces > 0).astype(float) * 5 image = NRESObservationFrame([ CCDData(data=data, uncertainty=uncertainty, meta={'OBJECTS': 'tung&tung&none'}) ], 'foo.fits') image.wavelengths = wavelengths image.traces = traces image.fibers = {'fiber': np.arange(2), 'order': np.arange(2)} image.blaze = { 'id': np.arange(2), 'blaze': [np.arange(20), np.arange(20)], 'blaze_error': [np.arange(20), np.arange(20)] } return image
def test_do_stage_on_empty_features(self): input_context = context.Context({}) image = NRESObservationFrame([CCDData(data=self.data, uncertainty=self.err, meta={'OBJECTS': 'tung&tung&none'})], 'foo.fits') image.traces = np.ones_like(self.data, dtype=int) image.blaze = {'blaze': np.ones_like(self.data, dtype=int)} stage = IdentifyFeatures(input_context) stage.fwhm, stage.nsigma = self.sigma, 1.5 image = stage.do_stage(image) assert len(image.features) == 0
def test_do_stage(self): blaze_factor = 0.5 input_context = context.Context({}) ccd_data = CCDData(data=self.data, uncertainty=self.err, meta={'OBJECTS': 'tung&tung&none'}) image = NRESObservationFrame([ccd_data], 'foo.fits') image.traces = np.ones_like(self.data, dtype=int) image.blaze = {'blaze': blaze_factor * np.ones((1, self.data.shape[1]), dtype=int)} stage = IdentifyFeatures(input_context) stage.fwhm, stage.nsigma = self.sigma, 0.5 image = stage.do_stage(image) image.features.sort('pixel') assert np.allclose(image.features['corrected_flux'], image.features['flux'] / blaze_factor, rtol=1E-4) assert np.allclose(image.features['pixel'], self.xcoords, atol=0.001) assert np.allclose(image.features['ycentroid'], self.ycoords, atol=0.001) assert np.allclose(image.features['id'], 1)
def five_hundred_square_image(maxflux, number_traces, trace_width, read_noise=10, seed=None): traces = np.zeros((500, 500)) data = np.ones_like(traces, dtype=float) profile = np.zeros_like(traces, dtype=float) ix = np.arange(trace_width) for i in range(1, number_traces + 1): traces[40 * i:40 * i + trace_width, :] = i for j in range(0, trace_width): data[40 * i + j, :] += maxflux * np.exp( (-1.) * (ix[j] - trace_width / 2.)**2 / (trace_width / 6.)**2) for j in range(0, trace_width): profile[40 * i + j, :] = data[40 * i + j, :] / np.sum( data[40 * i:40 * i + trace_width, 0]) np.random.seed(seed=seed) data += np.random.poisson(data) data += np.random.normal(0.0, read_noise, size=data.shape) uncertainty = np.sqrt(data + read_noise**2) wavelengths = np.ones_like( traces ) * 5 # dummy wavelengths image that has values distinct from flux and traces. image = NRESObservationFrame([ CCDData(data=data, uncertainty=uncertainty, meta={'OBJECTS': 'tung&tung&none'}) ], 'foo.fits') image.traces = traces image.profile = profile image.wavelengths = wavelengths image.blaze = { 'id': np.arange(number_traces) + 1, 'blaze': [np.ones(traces.shape[1]) for i in range(number_traces)], 'blaze_error': [np.ones(traces.shape[1]) for i in range(number_traces)] } image.fibers = { 'fiber': np.arange(number_traces) + 1, 'order': np.arange(number_traces) + 1 } return image