Loading ale/base/label_isis.py +12 −0 Original line number Diff line number Diff line Loading @@ -134,3 +134,15 @@ class IsisLabel(): # if no units are available, assume the exposure duration is given in milliseconds exposure_duration = self.label['IsisCube']['Instrument']['ExposureDuration'].value * 0.001 return exposure_duration @property def line_exposure_duration(self): """ The line exposure duration of the image, in seconds Returns ------- : float Line exposure duration in seconds """ return self.label['IsisCube']['Instrument']['LineExposureDuration'] * 0.001 # scale to seconds ale/drivers/mro_drivers.py +45 −9 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ class MroCtxIsisLabelIsisSpiceDriver(Driver, IsisSpice, LineScanner, RadialDisto return self.label["IsisCube"]["Instrument"]["LineExposureDuration"].value * 0.001 # Scale to seconds class MroCtxIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, LineScanner, RadialDistortion): class MroCtxIsisLabelNaifSpiceDriver(IsisLabel, NaifSpice, LineScanner, RadialDistortion, Driver): """ Driver for reading CTX ISIS labels. """ Loading @@ -70,7 +70,20 @@ class MroCtxIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, LineScanner, @property def instrument_id(self): return "MRO_CTX" """ Returns an instrument id for uniquely identifying the instrument, but often also used to be piped into Spice Kernels to acquire IKIDs. Therefore they the same ID the Spice expects in bods2c calls. Returns ------- : str instrument id """ id_lookup = { "CTX" : "MRO_CTX" } return id_lookup[super().instrument_id] @property def ephemeris_start_time(self): Loading @@ -80,15 +93,38 @@ class MroCtxIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, LineScanner, return self._ephemeris_start_time @property def line_exposure_duration(self): if not hasattr(self, '_line_exposure_duration'): self._line_exposure_duration = self.label['IsisCube']['Instrument']['LineExposureDuration'].value * 0.001 return self._line_exposure_duration def spacecraft_name(self): """ Returns the spacecraft name used in various Spice calls to acquire ephemeris data. Returns ------- : str spacecraft name """ name_lookup = { 'Mars_Reconnaissance_Orbiter': 'MRO' } return name_lookup[super().platform_name] @property def spacecraft_name(self): return "MRO" def detector_start_line(self): return 1 @property def detector_start_sample(self): return self.label['IsisCube']['Instrument']['SampleFirstPixel'] @property def sensor_model_version(self): """ Returns ------- : int sensor model version """ return 1 class MroCtxPds3LabelNaifSpiceDriver(Pds3Label, NaifSpice, LineScanner, RadialDistortion, Driver): """ Loading tests/pytests/test_isis_label.py +5 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,8 @@ DpuId = DPU-A PivotAngle = -18.805847167969 <Degrees> Unlutted = 1 LutInversionTable = $messenger/calibration/LUT_INVERT/MDISLUTINV_0.TAB # added to allow for testing LineExposureDuration = 1000 End_Group Group = Archive Loading Loading @@ -132,3 +134,6 @@ def test_platform_name(test_cube_label): def test_sensor_name(test_cube_label): assert test_cube_label.sensor_name.lower() == "mercury dual imaging system narrow angle camera" def test_line_exposure_duration(test_cube_label): assert test_cube_label.line_exposure_duration == 1 tests/pytests/test_mro_drivers.py +42 −12 Original line number Diff line number Diff line Loading @@ -17,29 +17,59 @@ mro_drivers.spice = simplespice label_pds3.spice = simplespice from ale.drivers.mro_drivers import MroCtxPds3LabelNaifSpiceDriver from ale.drivers.mro_drivers import MroCtxIsisLabelNaifSpiceDriver MroCtxPds3LabelNaifSpiceDriver.metakernel = get_mockkernels @pytest.fixture def driver(): def Pds3NaifDriver(): return MroCtxPds3LabelNaifSpiceDriver("") @pytest.fixture def IsisLabelNaifDriver(): return MroCtxIsisLabelNaifSpiceDriver("") @patch('ale.base.label_pds3.Pds3Label.instrument_id', 'CONTEXT CAMERA') def test_instrument_id(driver): assert driver.instrument_id == 'MRO_CTX' def test_instrument_id_pds3(Pds3NaifDriver): assert Pds3NaifDriver.instrument_id == 'MRO_CTX' @patch('ale.base.label_pds3.Pds3Label.spacecraft_name', 'MARS_RECONNAISSANCE_ORBITER') def test_spacecraft_name(driver): assert driver.spacecraft_name == 'MRO' def test_spacecraft_name_pds3(Pds3NaifDriver): assert Pds3NaifDriver.spacecraft_name == 'MRO' def test_detector_start_line(driver): assert driver.detector_start_line == 1 def test_detector_start_line_pds3(Pds3NaifDriver): assert Pds3NaifDriver.detector_start_line == 1 def test_detector_start_sample(driver): def test_detector_start_sample_pds3(Pds3NaifDriver): # I am not sure how to accomplish this with a fixture and # a decorator. Therefore, using a context with patch.dict(driver.label, SAMPLE_FIRST_PIXEL=0) as f: assert driver.detector_start_sample == 0 with patch.dict(Pds3NaifDriver.label, SAMPLE_FIRST_PIXEL=0) as f: assert Pds3NaifDriver.detector_start_sample == 0 def test_sensor_model_version_pds3(Pds3NaifDriver): assert Pds3NaifDriver.sensor_model_version == 1 @patch('ale.base.label_isis.IsisLabel.instrument_id', 'CTX') def test_instrument_id_isis(IsisLabelNaifDriver): assert IsisLabelNaifDriver.instrument_id == 'MRO_CTX' @patch('ale.base.label_isis.IsisLabel.platform_name', 'Mars_Reconnaissance_Orbiter') def test_spacecraft_name_isis(IsisLabelNaifDriver): assert IsisLabelNaifDriver.spacecraft_name == 'MRO' @patch('ale.base.label_isis.IsisLabel.platform_name', 'Mars_Reconnaissance_Orbiter') def test_ephemeris_start_time_isis(IsisLabelNaifDriver): with patch.dict(IsisLabelNaifDriver.label, {'IsisCube' : {'Instrument' : {'SpacecraftClockCount' : 800}}}) as f: assert IsisLabelNaifDriver.ephemeris_start_time == 0.1 def test_detector_start_line_isis(IsisLabelNaifDriver): assert IsisLabelNaifDriver.detector_start_line == 1 def test_detector_start_sample_isis(IsisLabelNaifDriver): with patch.dict(IsisLabelNaifDriver.label, {'IsisCube' : {'Instrument' : {'SampleFirstPixel' : 0}}}) as f: assert IsisLabelNaifDriver.detector_start_sample == 0 def test_sensor_model_version(driver): assert driver.sensor_model_version == 1 def test_sensor_model_version_isis(IsisLabelNaifDriver): assert IsisLabelNaifDriver.sensor_model_version == 1 Loading
ale/base/label_isis.py +12 −0 Original line number Diff line number Diff line Loading @@ -134,3 +134,15 @@ class IsisLabel(): # if no units are available, assume the exposure duration is given in milliseconds exposure_duration = self.label['IsisCube']['Instrument']['ExposureDuration'].value * 0.001 return exposure_duration @property def line_exposure_duration(self): """ The line exposure duration of the image, in seconds Returns ------- : float Line exposure duration in seconds """ return self.label['IsisCube']['Instrument']['LineExposureDuration'] * 0.001 # scale to seconds
ale/drivers/mro_drivers.py +45 −9 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ class MroCtxIsisLabelIsisSpiceDriver(Driver, IsisSpice, LineScanner, RadialDisto return self.label["IsisCube"]["Instrument"]["LineExposureDuration"].value * 0.001 # Scale to seconds class MroCtxIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, LineScanner, RadialDistortion): class MroCtxIsisLabelNaifSpiceDriver(IsisLabel, NaifSpice, LineScanner, RadialDistortion, Driver): """ Driver for reading CTX ISIS labels. """ Loading @@ -70,7 +70,20 @@ class MroCtxIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, LineScanner, @property def instrument_id(self): return "MRO_CTX" """ Returns an instrument id for uniquely identifying the instrument, but often also used to be piped into Spice Kernels to acquire IKIDs. Therefore they the same ID the Spice expects in bods2c calls. Returns ------- : str instrument id """ id_lookup = { "CTX" : "MRO_CTX" } return id_lookup[super().instrument_id] @property def ephemeris_start_time(self): Loading @@ -80,15 +93,38 @@ class MroCtxIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, LineScanner, return self._ephemeris_start_time @property def line_exposure_duration(self): if not hasattr(self, '_line_exposure_duration'): self._line_exposure_duration = self.label['IsisCube']['Instrument']['LineExposureDuration'].value * 0.001 return self._line_exposure_duration def spacecraft_name(self): """ Returns the spacecraft name used in various Spice calls to acquire ephemeris data. Returns ------- : str spacecraft name """ name_lookup = { 'Mars_Reconnaissance_Orbiter': 'MRO' } return name_lookup[super().platform_name] @property def spacecraft_name(self): return "MRO" def detector_start_line(self): return 1 @property def detector_start_sample(self): return self.label['IsisCube']['Instrument']['SampleFirstPixel'] @property def sensor_model_version(self): """ Returns ------- : int sensor model version """ return 1 class MroCtxPds3LabelNaifSpiceDriver(Pds3Label, NaifSpice, LineScanner, RadialDistortion, Driver): """ Loading
tests/pytests/test_isis_label.py +5 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,8 @@ DpuId = DPU-A PivotAngle = -18.805847167969 <Degrees> Unlutted = 1 LutInversionTable = $messenger/calibration/LUT_INVERT/MDISLUTINV_0.TAB # added to allow for testing LineExposureDuration = 1000 End_Group Group = Archive Loading Loading @@ -132,3 +134,6 @@ def test_platform_name(test_cube_label): def test_sensor_name(test_cube_label): assert test_cube_label.sensor_name.lower() == "mercury dual imaging system narrow angle camera" def test_line_exposure_duration(test_cube_label): assert test_cube_label.line_exposure_duration == 1
tests/pytests/test_mro_drivers.py +42 −12 Original line number Diff line number Diff line Loading @@ -17,29 +17,59 @@ mro_drivers.spice = simplespice label_pds3.spice = simplespice from ale.drivers.mro_drivers import MroCtxPds3LabelNaifSpiceDriver from ale.drivers.mro_drivers import MroCtxIsisLabelNaifSpiceDriver MroCtxPds3LabelNaifSpiceDriver.metakernel = get_mockkernels @pytest.fixture def driver(): def Pds3NaifDriver(): return MroCtxPds3LabelNaifSpiceDriver("") @pytest.fixture def IsisLabelNaifDriver(): return MroCtxIsisLabelNaifSpiceDriver("") @patch('ale.base.label_pds3.Pds3Label.instrument_id', 'CONTEXT CAMERA') def test_instrument_id(driver): assert driver.instrument_id == 'MRO_CTX' def test_instrument_id_pds3(Pds3NaifDriver): assert Pds3NaifDriver.instrument_id == 'MRO_CTX' @patch('ale.base.label_pds3.Pds3Label.spacecraft_name', 'MARS_RECONNAISSANCE_ORBITER') def test_spacecraft_name(driver): assert driver.spacecraft_name == 'MRO' def test_spacecraft_name_pds3(Pds3NaifDriver): assert Pds3NaifDriver.spacecraft_name == 'MRO' def test_detector_start_line(driver): assert driver.detector_start_line == 1 def test_detector_start_line_pds3(Pds3NaifDriver): assert Pds3NaifDriver.detector_start_line == 1 def test_detector_start_sample(driver): def test_detector_start_sample_pds3(Pds3NaifDriver): # I am not sure how to accomplish this with a fixture and # a decorator. Therefore, using a context with patch.dict(driver.label, SAMPLE_FIRST_PIXEL=0) as f: assert driver.detector_start_sample == 0 with patch.dict(Pds3NaifDriver.label, SAMPLE_FIRST_PIXEL=0) as f: assert Pds3NaifDriver.detector_start_sample == 0 def test_sensor_model_version_pds3(Pds3NaifDriver): assert Pds3NaifDriver.sensor_model_version == 1 @patch('ale.base.label_isis.IsisLabel.instrument_id', 'CTX') def test_instrument_id_isis(IsisLabelNaifDriver): assert IsisLabelNaifDriver.instrument_id == 'MRO_CTX' @patch('ale.base.label_isis.IsisLabel.platform_name', 'Mars_Reconnaissance_Orbiter') def test_spacecraft_name_isis(IsisLabelNaifDriver): assert IsisLabelNaifDriver.spacecraft_name == 'MRO' @patch('ale.base.label_isis.IsisLabel.platform_name', 'Mars_Reconnaissance_Orbiter') def test_ephemeris_start_time_isis(IsisLabelNaifDriver): with patch.dict(IsisLabelNaifDriver.label, {'IsisCube' : {'Instrument' : {'SpacecraftClockCount' : 800}}}) as f: assert IsisLabelNaifDriver.ephemeris_start_time == 0.1 def test_detector_start_line_isis(IsisLabelNaifDriver): assert IsisLabelNaifDriver.detector_start_line == 1 def test_detector_start_sample_isis(IsisLabelNaifDriver): with patch.dict(IsisLabelNaifDriver.label, {'IsisCube' : {'Instrument' : {'SampleFirstPixel' : 0}}}) as f: assert IsisLabelNaifDriver.detector_start_sample == 0 def test_sensor_model_version(driver): assert driver.sensor_model_version == 1 def test_sensor_model_version_isis(IsisLabelNaifDriver): assert IsisLabelNaifDriver.sensor_model_version == 1