def get_dataset(self, key, info): if self._data is None: self.read() if key.name in ['latitude', 'longitude']: lons, lats = self.get_lonlats() if key.name == 'latitude': return Projectable(lats, id=key) else: return Projectable(lons, id=key) avhrr_channel_index = {'1': 0, '2': 1, '3a': 2, '3b': 2, '4': 3, '5': 4} index = avhrr_channel_index[key.name] mask = False if key.name in ['3a', '3b'] and self._is3b is None: ch3a = bfield(self._data["id"]["id"], 10) self._is3b = np.logical_not(ch3a) if key.name == '3a': mask = np.tile(self._is3b, (1, 2048)) elif key.name == '3b': mask = np.tile(np.logical_not(self._is3b), (1, 2048)) data = self._data["image_data"][:, :, index] if key.calibration == 'counts': return Projectable(data, mask=mask, area=self.get_lonlats(), units='1') pg_spacecraft = ''.join(self.platform_name.split()).lower() jdays = (np.datetime64(self.start_time) - np.datetime64(str( self.year) + '-01-01T00:00:00Z')) / np.timedelta64(1, 'D') if index < 2 or key.name == '3a': data = calibrate_solar(data, index, self.year, jdays, pg_spacecraft) units = '%' if index > 2 or key.name == '3b': if self.times is None: self.times = time_seconds(self._data["timecode"], self.year) line_numbers = ( np.round((self.times - self.times[-1]) / np.timedelta64(166666667, 'ns'))).astype(np.int) line_numbers -= line_numbers[0] if self.prt is None: self.prt, self.ict, self.space = self.get_telemetry() chan = index + 1 data = calibrate_thermal(data, self.prt, self.ict[:, chan - 3], self.space[:, chan - 3], line_numbers, chan, pg_spacecraft) units = 'K' # TODO: check if entirely masked before returning return Projectable(data, mask=mask, units=units)
def get_calibrated_channels(self): channels = self.get_counts() self.get_times() year = self.times[0].year delta = self.times[0].date() - datetime.date(year, 1, 1) jday = delta.days + 1 # Earth-Sun distance correction factor corr = 1.0 - 0.0334 * np.cos(2.0 * np.pi * (jday - 2) / 365.25) # how many reflective channels are there ? tot_ref = channels.shape[2] - 3 channels[:, :, 0:tot_ref] = calibrate_solar(channels[:, :, 0:tot_ref], np.arange(tot_ref), year, jday, self.spacecraft_name, corr) prt, ict, space = self.get_telemetry() for chan in [3, 4, 5]: channels[:, :, chan - 6] = calibrate_thermal( channels[:, :, chan - 6], prt, ict[:, chan - 3], space[:, chan - 3], self.scans["scan_line_number"], chan, self.spacecraft_name) return channels
def get_dataset(self, key, info): if self._data is None: self.read() if key.name in ['latitude', 'longitude']: lons, lats = self.get_lonlats() if key.name == 'latitude': return Dataset(lats, id=key) else: return Dataset(lons, id=key) avhrr_channel_index = { '1': 0, '2': 1, '3a': 2, '3b': 2, '4': 3, '5': 4 } index = avhrr_channel_index[key.name] mask = False if key.name in ['3a', '3b'] and self._is3b is None: ch3a = bfield(self._data["id"]["id"], 10) self._is3b = np.logical_not(ch3a) if key.name == '3a': mask = np.tile(self._is3b, (1, 2048)) elif key.name == '3b': mask = np.tile(np.logical_not(self._is3b), (1, 2048)) data = self._data["image_data"][:, :, index] if key.calibration == 'counts': return Dataset(data, mask=mask, area=self.get_lonlats(), units='1') pg_spacecraft = ''.join(self.platform_name.split()).lower() jdays = (np.datetime64(self.start_time) - np.datetime64(str(self.year) + '-01-01T00:00:00Z')) / np.timedelta64(1, 'D') if index < 2 or key.name == '3a': data = calibrate_solar(data, index, self.year, jdays, pg_spacecraft) units = '%' if index > 2 or key.name == '3b': if self.times is None: self.times = time_seconds(self._data["timecode"], self.year) line_numbers = (np.round( (self.times - self.times[-1]) / np.timedelta64(166666667, 'ns'))).astype(np.int) line_numbers -= line_numbers[0] if self.prt is None: self.prt, self.ict, self.space = self.get_telemetry() chan = index + 1 data = calibrate_thermal(data, self.prt, self.ict[:, chan - 3], self.space[:, chan - 3], line_numbers, chan, pg_spacecraft) units = 'K' # TODO: check if entirely masked before returning return Dataset(data, mask=mask, units=units)
def test_calibration_vis(self): counts = np.array([[ 0, 0, 0, 0, 0, 512, 512, 512, 512, 512, 1023, 1023, 1023, 1023, 1023 ], [ 41, 41, 41, 41, 41, 150, 150, 150, 150, 150, 700, 700, 700, 700, 700 ]]) year = 1997 jday = 196 spacecraft_id = "noaa14" channel3_switch = 0 corr = 1 number_of_data_records = 2 channel = 0 ref1 = calibrate_solar(counts[:, channel::5], channel, year, jday, spacecraft_id, corr) channel = 1 ref2 = calibrate_solar(counts[:, channel::5], channel, year, jday, spacecraft_id, corr) channel = 2 data = np.ma.array(counts[:, channel::5], mask=True) ref3 = calibrate_solar(data, channel, year, jday, spacecraft_id, corr) expected = (np.array([[-5.34164812, 61.36381128, 127.93898657], [0., 14.20096694, 85.85722215]]), np.array([[-6.49947747, 74.66472898, 155.67041159], [0., 17.27909864, 104.46721104]]), np.array([[-32001., -32001., -32001.], [-32001., -32001., -32001.]])) self.assertTrue(np.allclose(ref1, expected[0])) self.assertTrue(np.allclose(ref2, expected[1])) self.assertTrue(np.allclose(ref3.filled(-32001), expected[2]))
def test_calibration_vis(self): counts = np.array([[0, 0, 0, 0, 0, 512, 512, 512, 512, 512, 1023, 1023, 1023, 1023, 1023], [41, 41, 41, 41, 41, 150, 150, 150, 150, 150, 700, 700, 700, 700, 700]]) year = 2010 jday = 1 spacecraft_id = "noaa19" channel3_switch = 0 corr = 1 number_of_data_records = 2 channel = 0 ref1 = calibrate_solar(counts[:, channel::5], channel, year, jday, spacecraft_id, corr) channel = 1 ref2 = calibrate_solar(counts[:, channel::5], channel, year, jday, spacecraft_id, corr) channel = 2 data = np.ma.array(counts[:, channel::5], mask=True) ref3 = calibrate_solar(data, channel, year, jday, spacecraft_id, corr) expected = (np.array([[-2.13225247, 27.71598482, 111.96193939], [0.12090091, 6.11099162, 58.71058259]]), np.array([[-2.41276542e+00, 3.06897170e+01, 1.25011705e+02], [1.23731560e-01, 6.86710159e+00, 6.53913486e+01]]), np.ones((2, 3)) * -32001) self.assertTrue(np.allclose(ref1, expected[0])) self.assertTrue(np.allclose(ref2, expected[1])) self.assertTrue(np.allclose(ref3.filled(-32001), expected[2]))