From 43864e7670ad4c677ba4aebd287513b8a3fa16ba Mon Sep 17 00:00:00 2001 From: Kelvin Rodriguez <kr788@nau.edu> Date: Wed, 30 Oct 2019 11:02:06 -0700 Subject: [PATCH] Cassini driver update (#307) * updated Cassini driver with correct distortion, 180 rotation and focal lengths added to WAC * removed print * updated cassini tests * updated cassini tests * changed comment to mention center is based of ISIS and not the original kernelsw * updated tests --- ale/drivers/co_drivers.py | 63 +++++++++++++++++++++------ tests/pytests/test_cassini_drivers.py | 12 +++-- 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/ale/drivers/co_drivers.py b/ale/drivers/co_drivers.py index 725ac1b..b8e4a8f 100644 --- a/ale/drivers/co_drivers.py +++ b/ale/drivers/co_drivers.py @@ -77,6 +77,38 @@ class CassiniIssPds3LabelNaifSpiceDriver(Framer, Pds3Label, NaifSpice, RadialDis ("P120","UV3"):2002.71 } + + wac_filter_to_focal_length = { + ("B2","CL2"):200.85, + ("B2","IRP90"):200.83, + ("B2","IRP0"):200.82, + ("B3","CL2"):201.22, + ("B3","IRP90"):201.12, + ("B3","IRP0"):201.11, + ("L1","BL1"):200.86, + ("L1","CL2"):200.77, + ("L1","GRN"):200.71, + ("L1","HAL"):200.74, + ("L1","IR1"):200.80, + ("L1","RED"):200.74, + ("L1","VIO"):201.09, + ("R2","CL2"):200.97, + ("R2","IR"):200.95, + ("R2","IRP90"):200.95, + ("R3","CL2"):201.04, + ("R3","IRP90"):201.03, + ("R3","IRP0"):201.04, + ("R4","CL2"):201.22, + ("R4","IRP90"):201.16, + ("R4","IRP0"):201.15, + ("T2","CL2"):200.82, + ("T2","IRP0"):200.81, + ("T2","IRP90"):200.82, + ("T3","CL2"):201.04, + ("T3","IRP0"):201.06, + ("T3","IRP90"):201.07 + } + @property def instrument_id(self): """ @@ -157,7 +189,6 @@ class CassiniIssPds3LabelNaifSpiceDriver(Framer, Pds3Label, NaifSpice, RadialDis Expects instrument_id to be defined. This should be a string containing either CASSINI_ISS_WAC or CASSINI_ISIS_NAC - Returns ------- : list<float> @@ -165,40 +196,38 @@ class CassiniIssPds3LabelNaifSpiceDriver(Framer, Pds3Label, NaifSpice, RadialDis """ if self.instrument_id == 'CASSINI_ISS_WAC': # WAC - return [float('-6.2e-5'), 0, 0] + return [0, float('-6.2e-5'), 0] elif self.instrument_id == 'CASSINI_ISS_NAC': # NAC - return [float('-8e-6'), 0, 0] + return [0, float('-8e-6'), 0] @property # FOV_CENTER_PIXEL doesn't specify which coordinate is sample or line, but they are the same # number, so the order doesn't matter def detector_center_line(self): """ - Expects ikid to be defined. This should be an integer containing the Naif - ID code of the instrument + Dectector center based on ISIS's corrected values. Returns ------- : int The detector line of the principle point """ - return float(spice.gdpool('INS{}_FOV_CENTER_PIXEL'.format(self.ikid), 0, 2)[1]) + return 512 @property # FOV_CENTER_PIXEL doesn't specify which coordinate is sample or line, but they are the same # number, so the order doesn't matter def detector_center_sample(self): """ - Expects ikid to be defined. This should be an integer containing the Naif - ID code of the instrument + Dectector center based on ISIS's corrected values. Returns ------- : int The detector sample of the principle point """ - return float(spice.gdpool('INS{}_FOV_CENTER_PIXEL'.format(self.ikid), 0, 2)[0]) + return 512 @property def sensor_model_version(self): @@ -221,14 +250,18 @@ class CassiniIssPds3LabelNaifSpiceDriver(Framer, Pds3Label, NaifSpice, RadialDis """ # default focal defined by IK kernel - default_focal_len = super(CassiniIssPds3LabelNaifSpiceDriver, self).focal_length + try: + default_focal_len = super(CassiniIssPds3LabelNaifSpiceDriver, self).focal_length + except: + default_focal_len = float(spice.gdpool('INS{}_FOV_CENTER_PIXEL'.format(self.ikid), 0, 2)[0]) + + filters = tuple(self.label['FILTER_NAME']) if self.instrument_id == "CASSINI_ISS_NAC": - filters = tuple(self.label['FILTER_NAME']) return self.nac_filter_to_focal_length.get(filters, default_focal_len) elif self.instrument_id == "CASSINI_ISS_WAC": - return default_focal_len + return self.wac_filter_to_focal_length.get(filters, default_focal_len) @property def _original_naif_sensor_frame_id(self): @@ -252,7 +285,7 @@ class CassiniIssPds3LabelNaifSpiceDriver(Framer, Pds3Label, NaifSpice, RadialDis mounting point with a 180 degree rotation. ID was taken from ISIS's IAK kernel for Cassini. This is because NAC requires an extra rotation not in NAIF's Cassini kernels. Wac does not require an extra rotation so - se simply return original sensor frame id for Wac. + we simply return original sensor frame id for Wac. Returns ------- @@ -263,4 +296,6 @@ class CassiniIssPds3LabelNaifSpiceDriver(Framer, Pds3Label, NaifSpice, RadialDis if self.instrument_id == "CASSINI_ISS_NAC": return 14082360 elif self.instrument_id == "CASSINI_ISS_WAC": - return self._original_naif_sensor_frame_id + return 14082361 + + diff --git a/tests/pytests/test_cassini_drivers.py b/tests/pytests/test_cassini_drivers.py index 805221d..ca1173a 100644 --- a/tests/pytests/test_cassini_drivers.py +++ b/tests/pytests/test_cassini_drivers.py @@ -31,14 +31,14 @@ def usgscsm_compare_dict(): 'detector_sample_summing': 1, 'detector_line_summing': 1, 'focal_length_model': {'focal_length': 2003.09}, - 'detector_center': {'line': 511.5, 'sample': 511.5}, + 'detector_center': {'line': 512, 'sample': 512}, 'starting_detector_line': 0, 'starting_detector_sample': 0, 'focal2pixel_lines': [0.0, 0.0, 83.33333333333333], 'focal2pixel_samples': [0.0, 83.33333333333333, 0.0], 'optical_distortion': {'radial': - {'coefficients': [-8e-06, 0, 0]}}, + {'coefficients': [0, -8e-06, 0]}}, 'image_lines': 1024, 'image_samples': 1024, 'name_platform': 'CASSINI ORBITER', @@ -90,7 +90,7 @@ class test_cassini_pds3_naif(unittest.TestCase): gdpool.assert_called_with('INS-12345_PIXEL_SIZE', 0, 1) def test_odtk(self): - assert self.driver.odtk == [-8e-06, 0, 0] + assert self.driver.odtk == [0, -8e-06, 0] def test_instrument_id(self): assert self.driver.instrument_id == "CASSINI_ISS_NAC" @@ -111,14 +111,12 @@ class test_cassini_pds3_naif(unittest.TestCase): def test_detector_center_sample(self): with patch('ale.drivers.co_drivers.spice.gdpool', return_value=[511.5, 511.5]) as gdpool, \ patch('ale.base.data_naif.spice.bods2c', return_value=-12345) as bods2c: - assert self.driver.detector_center_sample == 511.5 - gdpool.assert_called_with('INS-12345_FOV_CENTER_PIXEL', 0, 2) + assert self.driver.detector_center_sample == 512 def test_detector_center_line(self): with patch('ale.drivers.co_drivers.spice.gdpool', return_value=[511.5, 511.5]) as gdpool, \ patch('ale.base.data_naif.spice.bods2c', return_value=-12345) as bods2c: - assert self.driver.detector_center_sample == 511.5 - gdpool.assert_called_with('INS-12345_FOV_CENTER_PIXEL', 0, 2) + assert self.driver.detector_center_sample == 512 def test_sensor_model_version(self): assert self.driver.sensor_model_version == 1 -- GitLab