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_ir(self): counts = np.array([[ 0, 0, 612, 0, 0, 512, 512, 487, 512, 512, 923, 923, 687, 923, 923 ], [ 41, 41, 634, 41, 41, 150, 150, 461, 150, 150, 700, 700, 670, 700, 700 ], [ 241, 241, 656, 241, 241, 350, 350, 490, 350, 350, 600, 600, 475, 600, 600 ]]) prt_counts = np.array([0, 230, 230]) ict_counts = np.array([[745.3, 397.9, 377.8], [744.8, 398.1, 378.4], [745.7, 398., 378.3]]) space_counts = np.array([[987.3, 992.5, 989.4], [986.9, 992.8, 989.6], [986.3, 992.3, 988.9]]) spacecraft_id = "noaa14" number_of_data_records = 3 ch3 = calibrate_thermal(counts[:, 2::5], prt_counts, ict_counts[:, 0], space_counts[:, 0], line_numbers=np.array([1, 2, 3]), channel=3, spacecraft=spacecraft_id) expected_ch3 = np.array([[298.28524223, 305.16852862, 293.16212655], [296.87900835, 306.41526012, 294.41059746], [295.39720547, 305.02120845, 305.75051609]]) self.assertTrue(np.allclose(expected_ch3, ch3)) ch4 = calibrate_thermal(counts[:, 3::5], prt_counts, ict_counts[:, 1], space_counts[:, 1], line_numbers=np.array([1, 2, 3]), channel=4, spacecraft=spacecraft_id) expected_ch4 = np.array([[325.82572316, 275.41391816, 196.21443457], [322.35731456, 312.78320066, 249.38013251], [304.32522137, 293.48953883, 264.14732182]]) self.assertTrue(np.allclose(expected_ch4, ch4)) ch5 = calibrate_thermal(counts[:, 4::5], prt_counts, ict_counts[:, 2], space_counts[:, 2], line_numbers=np.array([1, 2, 3]), channel=5, spacecraft=spacecraft_id) expected_ch5 = np.array([[326.47287181, 272.14169523, 187.40907142], [322.72885806, 312.39588991, 244.22910864], [303.27173737, 291.59183911, 260.0459766]]) self.assertTrue(np.allclose(expected_ch5, ch5))
def test_calibration_ir(self): counts = np.array([[0, 0, 612, 0, 0, 512, 512, 487, 512, 512, 923, 923, 687, 923, 923], [41, 41, 634, 41, 41, 150, 150, 461, 150, 150, 700, 700, 670, 700, 700], [241, 241, 656, 241, 241, 350, 350, 490, 350, 350, 600, 600, 475, 600, 600]]) prt_counts = np.array([0, 230, 230]) ict_counts = np.array([[745.3, 397.9, 377.8], [744.8, 398.1, 378.4], [745.7, 398., 378.3]]) space_counts = np.array([[987.3, 992.5, 989.4], [986.9, 992.8, 989.6], [986.3, 992.3, 988.9]]) spacecraft_id = "noaa19" number_of_data_records = 3 ch3 = calibrate_thermal(counts[:, 2::5], prt_counts, ict_counts[:, 0], space_counts[:, 0], line_numbers=np.array([1, 2, 3]), channel=3, spacecraft=spacecraft_id) expected_ch3 = np.array([[298.36772477, 305.24899954, 293.23847375], [296.96053595, 306.49432811, 294.48914038], [295.47715016, 305.10182601, 305.83036782]]) self.assertTrue(np.allclose(expected_ch3, ch3)) ch4 = calibrate_thermal(counts[:, 3::5], prt_counts, ict_counts[:, 1], space_counts[:, 1], line_numbers=np.array([1, 2, 3]), channel=4, spacecraft=spacecraft_id) expected_ch4 = np.array([[326.57669548, 275.34893211, 197.68844955], [323.01324859, 313.20717645, 249.3633716], [304.58097221, 293.57932356, 264.0630027]]) self.assertTrue(np.allclose(expected_ch4, ch4)) ch5 = calibrate_thermal(counts[:, 4::5], prt_counts, ict_counts[:, 2], space_counts[:, 2], line_numbers=np.array([1, 2, 3]), channel=5, spacecraft=spacecraft_id) expected_ch5 = np.array([[326.96168274, 272.09013413, 188.26784127], [323.15638147, 312.67331324, 244.18437795], [303.43940924, 291.64944851, 259.97304154]]) self.assertTrue(np.allclose(expected_ch5, ch5))