Commit e76d251a authored by paarongiroux's avatar paarongiroux Committed by Stuart Sides
Browse files

Updated Messenger Drivers and tests (#180)

* renamed mdis tests

* updated messenger driver and tests

* changed comments, removed unnecessary property, moved id_lookup

* removed unnecessary values in id_lookup
parent b2a66d56
Loading
Loading
Loading
Loading
+19 −1
Original line number Diff line number Diff line
@@ -15,6 +15,24 @@ class IsisLabel():
                raise ValueError("{} is not a valid label".format(self._file))
        return self._label

    @property
    def instrument_id(self):
        """
        Returns
        -------
        : str
          instrument id
        """
        return self.label['IsisCube']['Instrument']['InstrumentId']

    @property
    def platform_name(self):
        return self.label['IsisCube']['Instrument']['SpacecraftName']

    @property
    def sensor_name(self):
        return self.label['IsisCube']['Instrument']['InstrumentName']

    @property
    def image_lines(self):
        """
+62 −51
Original line number Diff line number Diff line
@@ -12,20 +12,17 @@ from ale.base.label_pds3 import Pds3Label
from ale.base.label_isis import IsisLabel
from ale.base.type_sensor import Framer

ID_LOOKUP = {
    'MDIS-WAC': 'MSGR_MDIS_WAC',
    'MDIS-NAC':'MSGR_MDIS_NAC',
}

class MessengerMdisPds3NaifSpiceDriver(Pds3Label, Driver, NaifSpice, Framer):
class MessengerMdisPds3NaifSpiceDriver(Pds3Label, NaifSpice, Framer, Driver):
    """
    Driver for reading MDIS PDS3 labels. Requires a Spice mixin to acquire addtional
    ephemeris and instrument data located exclusively in spice kernels.
    """

    id_lookup = {
        'MDIS-WAC': 'MSGR_MDIS_WAC',
        'MDIS-NAC':'MSGR_MDIS_NAC',
        'MERCURY DUAL IMAGING SYSTEM NARROW ANGLE CAMERA':'MSGR_MDIS_NAC',
        'MERCURY DUAL IMAGING SYSTEM WIDE ANGLE CAMERA':'MSGR_MDIS_WAC'
    }

    @property
    def metakernel(self):
        """
@@ -45,16 +42,16 @@ class MessengerMdisPds3NaifSpiceDriver(Pds3Label, Driver, NaifSpice, Framer):
        return self._metakernel

    @property

    def fikid(self):
        if isinstance(self, Framer):
            fn = self.label["FILTER_NUMBER"]
            fn = super().filter_number
            if fn == 'N/A':
                fn = 0
        else:
            fn = 0
        return self.ikid - int(fn)

    @property
    def instrument_id(self):
        """
        Returns an instrument id for unquely identifying the instrument, but often
@@ -66,11 +63,10 @@ class MessengerMdisPds3NaifSpiceDriver(Pds3Label, Driver, NaifSpice, Framer):
        : str
          instrument id
        """
        return self.id_lookup[self.label['INSTRUMENT_ID']]
        return ID_LOOKUP[super().instrument_id]

    @property
    def focal_length(self):

        """
        Computes Focal Length from Kernels

@@ -89,11 +85,11 @@ class MessengerMdisPds3NaifSpiceDriver(Pds3Label, Driver, NaifSpice, Framer):
        # numpy wants them a_n, a_n-1, a_n-2 ... a_0
        f_t = np.poly1d(coeffs[::-1])

        # eval at the focal_plane_tempature
        return f_t(self._focal_plane_tempature)
        # eval at the focal_plane_temperature
        return f_t(self.label['FOCAL_PLANE_TEMPERATURE'].value)

    @property
    def starting_detector_sample(self):
    def detector_start_sample(self):
        """
        Returns starting detector sample quired from Spice Kernels.

@@ -105,9 +101,9 @@ class MessengerMdisPds3NaifSpiceDriver(Pds3Label, Driver, NaifSpice, Framer):
        return int(spice.gdpool('INS{}_FPUBIN_START_SAMPLE'.format(self.ikid), 0, 1)[0])

    @property
    def starting_detector_line(self):
    def detector_start_line(self):
        """
        Returns starting detector sample acquired from Spice Kernels.
        Returns starting detector line acquired from Spice Kernels.

        Returns
        -------
@@ -124,20 +120,32 @@ class MessengerMdisPds3NaifSpiceDriver(Pds3Label, Driver, NaifSpice, Framer):
    def detector_center_line(self):
        return float(spice.gdpool('INS{}_BORESIGHT'.format(self.ikid), 0, 3)[1])

    @property
    def sensor_model_version(self):
        """
        Returns
        -------
        : int
          model version
        """
        return 2

    @property
    def usgscsm_distortion_model(self):
        return {
            "transverse": {
                "x" : self.odtx,
                "y" : self.odty
                }
            }

class MessengerMdisIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, Framer):

class MessengerMdisIsisLabelNaifSpiceDriver(IsisLabel, NaifSpice, Framer, Driver):
    """
    Driver for reading MDIS ISIS3 Labels. These are Labels that have been ingested
    into ISIS from PDS EDR images but have not been spiceinit'd yet.
    """

    id_lookup = {
        'MDIS-WAC': 'MSGR_MDIS_WAC',
        'MDIS-NAC':'MSGR_MDIS_NAC',
        'MERCURY DUAL IMAGING SYSTEM NARROW ANGLE CAMERA':'MSGR_MDIS_NAC',
        'MERCURY DUAL IMAGING SYSTEM WIDE ANGLE CAMERA':'MSGR_MDIS_WAC'
    }

    @property
    def metakernel(self):
        """
@@ -156,10 +164,6 @@ class MessengerMdisIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, Framer
                    self._metakernel = mk
        return self._metakernel

    @property
    def ikid(self):
        return int(self.label["IsisCube"]["Kernels"]["NaifIkCode"])

    @property
    def instrument_id(self):
        """
@@ -172,30 +176,17 @@ class MessengerMdisIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, Framer
        : str
          instrument id
        """
        return self.id_lookup[self.label['IsisCube']['Instrument']['InstrumentId']]

    @property
    def _focal_plane_tempature(self):
        """
        Acquires focal plane tempature from a PDS3 label. Used exclusively in
        computing focal length.

        Returns
        -------
        : double
          focal plane tempature
        """
        return self.label['IsisCube']['Instrument']['FocalPlaneTemperature'].value
        return ID_LOOKUP[super().instrument_id]

    @property
    def ephemeris_start_time(self):
        if not hasattr(self, '_ephemeris_start_time'):
            sclock = self.label['IsisCube']['Archive']['SpacecraftClockStartCount']
            sclock = self.spacecraft_clock_start_count
            self._starting_ephemeris_time = spice.scs2e(self.spacecraft_id, sclock)
        return self._starting_ephemeris_time

    @property
    def optical_distortion(self):
    def usgscsm_distortion_model(self):
        return {
            "transverse": {
                "x" : self.odtx,
@@ -203,6 +194,17 @@ class MessengerMdisIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, Framer
                }
            }

    @property
    def fikid(self):
        if isinstance(self, Framer):
            fn = self.label['IsisCube']['BandBin']['Number']
            if fn == 'N/A':
                fn = 0
        else:
            fn = 0
        return self.ikid - int(fn)

    @property
    def focal_length(self):
        """
        Computes Focal Length from Kernels
@@ -217,16 +219,15 @@ class MessengerMdisIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, Framer
          focal length in meters
        """
        coeffs = spice.gdpool('INS{}_FL_TEMP_COEFFS '.format(self.fikid), 0, 5)

        # reverse coeffs, MDIS coeffs are listed a_0, a_1, a_2 ... a_n where
        # numpy wants them a_n, a_n-1, a_n-2 ... a_0
        f_t = np.poly1d(coeffs[::-1])

        # eval at the focal_plane_tempature
        return f_t(self._focal_plane_tempature)
        # eval at the focal_plane_temperature
        return f_t(self.label['IsisCube']['Instrument']['FocalPlaneTemperature'].value)

    @property
    def starting_detector_sample(self):
    def detector_start_sample(self):
        """
        Returns starting detector sample quired from Spice Kernels.

@@ -238,9 +239,9 @@ class MessengerMdisIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, Framer
        return int(spice.gdpool('INS{}_FPUBIN_START_SAMPLE'.format(self.ikid), 0, 1)[0])

    @property
    def starting_detector_line(self):
    def detector_start_line(self):
        """
        Returns starting detector sample acquired from Spice Kernels.
        Returns starting detector line acquired from Spice Kernels.

        Returns
        -------
@@ -257,3 +258,13 @@ class MessengerMdisIsisLabelNaifSpiceDriver(IsisLabel, Driver, NaifSpice, Framer
    @property
    def detector_center_line(self):
        return float(spice.gdpool('INS{}_BORESIGHT'.format(self.ikid), 0, 3)[1])

    @property
    def sensor_model_version(self):
        """
        Returns
        -------
        : int
          model version
        """
        return 2
+7 −0
Original line number Diff line number Diff line
@@ -124,4 +124,11 @@ def test_sample_summing(test_cube_label):
def test_line_summing(test_cube_label):
    assert test_cube_label.line_summing == 1

def test_instrument_id(test_cube_label):
    assert test_cube_label.instrument_id == "MDIS-NAC"

def test_platform_name(test_cube_label):
    assert test_cube_label.platform_name.lower() == "messenger"

def test_sensor_name(test_cube_label):
    assert test_cube_label.sensor_name.lower() == "mercury dual imaging system narrow angle camera"

tests/pytests/test_mdis_driver.py

deleted100644 → 0
+0 −254
Original line number Diff line number Diff line
from collections import namedtuple
from unittest import mock

import pytest

import ale
from ale.drivers import messenger_drivers
from ale.base import data_naif

from ale.drivers.messenger_drivers import MessengerMdisPds3NaifSpiceDriver


# 'Mock' the spice module where it is imported
from conftest import SimpleSpice, get_mockkernels

simplespice = SimpleSpice()
data_naif.spice = simplespice
messenger_drivers.spice = simplespice

MessengerMdisPds3NaifSpiceDriver.metakernel = get_mockkernels

@pytest.fixture
def mdislabel():
    return """
PDS_VERSION_ID       = PDS3

/*** FILE FORMAT ***/
RECORD_TYPE          = FIXED_LENGTH
RECORD_BYTES         = 2048
FILE_RECORDS          = 1028
LABEL_RECORDS         = 0004

/*** POINTERS TO START BYTE OFFSET OF OBJECTS IN IMAGE FILE ***/
^IMAGE                = 0005

/*** GENERAL DATA DESCRIPTION PARAMETERS ***/
MISSION_NAME         = "MESSENGER"
INSTRUMENT_HOST_NAME = "MESSENGER"
DATA_SET_ID          = "MESS-E/V/H-MDIS-2-EDR-RAWDATA-V1.0"
DATA_QUALITY_ID      = "0000000000000000"
PRODUCT_ID           = "EN0024934993M"
PRODUCT_VERSION_ID   = "3"
SOURCE_PRODUCT_ID    = ("0024934993_IM3WV")
PRODUCER_INSTITUTION_NAME = "APPLIED COHERENT TECHNOLOGY CORPORATION"
SOFTWARE_NAME        = "MDIS2EDR"
SOFTWARE_VERSION_ID  = "1.0"
MISSION_PHASE_NAME   = "EARTH CRUISE"
TARGET_NAME          = "EARTH"
SEQUENCE_NAME        = "05138_MLA_SUPP_1"
OBSERVATION_ID       = "703"
OBSERVATION_TYPE     = "N/A"
SITE_ID              = "N/A"

/*** TIME PARAMETERS ***/
START_TIME           = 2005-05-18T20:24:10.515023
STOP_TIME            = 2005-05-18T20:24:10.707023
SPACECRAFT_CLOCK_START_COUNT = "1/0024934993:798000"
SPACECRAFT_CLOCK_STOP_COUNT = "1/0024934993:990000"
ORBIT_NUMBER         = "N/A"
PRODUCT_CREATION_TIME = 2011-11-21T22:17:22

/***  INSTRUMENT ENGINEERING PARAMETERS ***/
INSTRUMENT_NAME      = "MERCURY DUAL IMAGING SYSTEM NARROW ANGLE CAMERA"
INSTRUMENT_ID        = "MDIS-NAC"
FILTER_NAME          = "748 BP 53"
FILTER_NUMBER        = "N/A"
CENTER_FILTER_WAVELENGTH = 747.7 <NM>
BANDWIDTH            = 52.6 <NM>
EXPOSURE_DURATION    = 192 <MS>
EXPOSURE_TYPE        = AUTO
DETECTOR_TEMPERATURE = -42.55 <DEGC>
FOCAL_PLANE_TEMPERATURE = -35.94 <DEGC>
FILTER_TEMPERATURE   = "N/A"
OPTICS_TEMPERATURE   = -37.36 <DEGC>

/*** INSTRUMENT RAW PARAMETERS ***/
MESS:MET_EXP         = 24934993
MESS:IMG_ID_LSB      = "N/A"
MESS:IMG_ID_MSB      = "N/A"
MESS:ATT_CLOCK_COUNT = 24934991
MESS:ATT_Q1          = 0.38073087
MESS:ATT_Q2          = -0.50538123
MESS:ATT_Q3          = 0.72235280
MESS:ATT_Q4          = 0.27899864
MESS:ATT_FLAG        = 7
MESS:PIV_POS_MOTOR   = "N/A"
MESS:PIV_GOAL        = 0
MESS:PIV_POS         = -1
MESS:PIV_READ        = 20740
MESS:PIV_CAL         = -26758
MESS:FW_GOAL         = 17376
MESS:FW_POS          = 17420
MESS:FW_READ         = 17420
MESS:CCD_TEMP        = 1026
MESS:CAM_T1          = 454
MESS:CAM_T2          = 478
MESS:EXPOSURE        = 192
MESS:DPU_ID          = 0
MESS:IMAGER          = 1
MESS:SOURCE          = 0
MESS:FPU_BIN         = 0
MESS:COMP12_8        = 0
MESS:COMP_ALG        = 2
MESS:COMP_FST        = 1
MESS:TIME_PLS        = 1
MESS:LATCH_UP        = 0
MESS:EXP_MODE        = 1
MESS:PIV_STAT        = 3
MESS:PIV_MPEN        = 0
MESS:PIV_PV          = 1
MESS:PIV_RV          = 1
MESS:FW_PV           = 1
MESS:FW_RV           = 1
MESS:AEX_STAT        = 256
MESS:AEX_STHR        = 0
MESS:AEX_TGTB        = 2800
MESS:AEX_BACB        = 240
MESS:AEX_MAXE        = 714
MESS:AEX_MINE        = 1
MESS:DLNKPRIO        = 3
MESS:WVLRATIO        = 4
MESS:PIXELBIN        = 0
MESS:SUBFRAME        = 0
MESS:SUBF_X1         = 4
MESS:SUBF_Y1         = 0
MESS:SUBF_DX1        = 0
MESS:SUBF_DY1        = 0
MESS:SUBF_X2         = 4
MESS:SUBF_Y2         = 0
MESS:SUBF_DX2        = 0
MESS:SUBF_DY2        = 0
MESS:SUBF_X3         = 0
MESS:SUBF_Y3         = 0
MESS:SUBF_DX3        = 0
MESS:SUBF_DY3        = 0
MESS:SUBF_X4         = 0
MESS:SUBF_Y4         = 0
MESS:SUBF_DX4        = 0
MESS:SUBF_DY4        = 0
MESS:SUBF_X5         = 0
MESS:SUBF_Y5         = 0
MESS:SUBF_DX5        = 0
MESS:SUBF_DY5        = 0
MESS:CRITOPNV        = 0
MESS:JAILBARS        = 0
MESS:JB_X0           = 0
MESS:JB_X1           = 0
MESS:JB_SPACE        = 0

/*** GEOMETRY INFORMATION ***/
RIGHT_ASCENSION      = 285.95273 <DEG>
DECLINATION          = 11.71507 <DEG>
TWIST_ANGLE          = 212.43017 <DEG>
RA_DEC_REF_PIXEL     = (512.00000,512.00000)
RETICLE_POINT_RA     = (286.18172 <DEG>,284.89969 <DEG>,287.00146 <DEG>,
  285.71292 <DEG>)
RETICLE_POINT_DECLINATION = (12.74731 <DEG>,11.95067 <DEG>,11.48768 <DEG>,
  10.68847 <DEG>)

/*** TARGET PARAMETERS ***/
SC_TARGET_POSITION_VECTOR = (-7282598.25457 <KM>,25612610.91152 <KM>,
  -5411326.66758 <KM>)
TARGET_CENTER_DISTANCE = 27172127.83986 <KM>

/*** TARGET WITHIN SENSOR FOV ***/
SLANT_DISTANCE       = "N/A"
CENTER_LATITUDE      = "N/A"
CENTER_LONGITUDE     = "N/A"
HORIZONTAL_PIXEL_SCALE = "N/A"
VERTICAL_PIXEL_SCALE = "N/A"
SMEAR_MAGNITUDE      = "N/A"
SMEAR_AZIMUTH        = "N/A"
NORTH_AZIMUTH        = "N/A"
RETICLE_POINT_LATITUDE = ("N/A","N/A","N/A","N/A")
RETICLE_POINT_LONGITUDE = ("N/A","N/A","N/A","N/A")

/*** SPACECRAFT POSITION WITH RESPECT TO CENTRAL BODY ***/
SUB_SPACECRAFT_LATITUDE = -11.49546 <DEG>
SUB_SPACECRAFT_LONGITUDE = 283.33197 <DEG>
SPACECRAFT_ALTITUDE  = 27165750.55671 <KM>
SUB_SPACECRAFT_AZIMUTH = "N/A"

/*** SPACECRAFT LOCATION ***/
SPACECRAFT_SOLAR_DISTANCE = 139069138.64129 <KM>
SC_SUN_POSITION_VECTOR = (-87690987.23333 <KM>,-92023335.85736 <KM>,
  -56411184.51298 <KM>)
SC_SUN_VELOCITY_VECTOR = (-24.04359 <KM/S>,19.51186 <KM/S>,7.92341 <KM/S>)

/*** VIEWING AND LIGHTING GEOMETRY (SUN ON TARGET) ***/
SOLAR_DISTANCE       = 151343022.60304 <KM>
SUB_SOLAR_AZIMUTH    = "N/A"
SUB_SOLAR_LATITUDE   = 19.70999 <DEG>
SUB_SOLAR_LONGITUDE  = 233.12030 <DEG>
INCIDENCE_ANGLE      = "N/A"
PHASE_ANGLE          = "N/A"
EMISSION_ANGLE       = "N/A"
LOCAL_HOUR_ANGLE     = "N/A"

/*** GEOMETRY FOR EACH SUBFRAME ***/
GROUP = SUBFRAME1_PARAMETERS
  RETICLE_POINT_LATITUDE = ("N/A","N/A","N/A","N/A")
  RETICLE_POINT_LONGITUDE = ("N/A","N/A","N/A","N/A")
END_GROUP = SUBFRAME1_PARAMETERS

GROUP = SUBFRAME2_PARAMETERS
  RETICLE_POINT_LATITUDE = ("N/A","N/A","N/A","N/A")
  RETICLE_POINT_LONGITUDE = ("N/A","N/A","N/A","N/A")
END_GROUP = SUBFRAME2_PARAMETERS

GROUP = SUBFRAME3_PARAMETERS
  RETICLE_POINT_LATITUDE = ("N/A","N/A","N/A","N/A")
  RETICLE_POINT_LONGITUDE = ("N/A","N/A","N/A","N/A")
END_GROUP = SUBFRAME3_PARAMETERS

GROUP = SUBFRAME4_PARAMETERS
  RETICLE_POINT_LATITUDE = ("N/A","N/A","N/A","N/A")
  RETICLE_POINT_LONGITUDE = ("N/A","N/A","N/A","N/A")
END_GROUP = SUBFRAME4_PARAMETERS

GROUP = SUBFRAME5_PARAMETERS
  RETICLE_POINT_LATITUDE = ("N/A","N/A","N/A","N/A")
  RETICLE_POINT_LONGITUDE = ("N/A","N/A","N/A","N/A")
END_GROUP = SUBFRAME5_PARAMETERS


OBJECT = IMAGE
  LINES              = 1024
  LINE_SAMPLES       = 1024
  SAMPLE_TYPE        = MSB_UNSIGNED_INTEGER
  SAMPLE_BITS        = 16
  UNIT               = "N/A"
  DARK_STRIP_MEAN    = 267.777

/*** IMAGE STATISTICS OF  ***/
/*** THE EXPOSED CCD AREA ***/
  MINIMUM            = 262.000
  MAXIMUM            = 2978.000
  MEAN               = 267.684
  STANDARD_DEVIATION = 17.810

/*** PIXEL COUNTS ***/
  SATURATED_PIXEL_COUNT = 0
  MISSING_PIXELS     = 0
END_OBJECT = IMAGE
END
    """

def test_mdis_creation(mdislabel):
    #with MessengerMdisPds3NaifSpiceDriver(mdislabel) as m:
    #    d = m.to_dict()
    #    assert isinstance(d, dict)

    # Need to insert new tests here, one for each property unique to this driver
    assert True
+125 −0
Original line number Diff line number Diff line
import pytest
import pvl

import ale
from ale.drivers import messenger_drivers
from ale.base import data_naif
from ale.base import label_pds3
from ale.base import label_isis

from unittest.mock import PropertyMock, patch

# 'Mock' the spice module where it is imported
from conftest import SimpleSpice, get_mockkernels

simplespice = SimpleSpice()

data_naif.spice = simplespice
messenger_drivers.spice = simplespice
label_pds3.spice = simplespice

from ale.drivers.messenger_drivers import MessengerMdisPds3NaifSpiceDriver
from ale.drivers.messenger_drivers import MessengerMdisIsisLabelNaifSpiceDriver

MessengerMdisPds3NaifSpiceDriver.metakernel = get_mockkernels
MessengerMdisIsisLabelNaifSpiceDriver.metakernel = get_mockkernels

@pytest.fixture
def Pds3Driver():
    return MessengerMdisPds3NaifSpiceDriver("")

@pytest.fixture
def IsisLabelDriver():
    return MessengerMdisIsisLabelNaifSpiceDriver("")

@patch('ale.base.label_pds3.Pds3Label.filter_number', 10)
@patch('ale.base.data_naif.NaifSpice.ikid', 100)
def test_fikid_pds3(Pds3Driver):
    assert Pds3Driver.fikid == 90

def test_instrument_id_pds3(Pds3Driver):
    with patch('ale.base.label_pds3.Pds3Label.instrument_id', new_callable=PropertyMock) as mock_id:
        mock_id.return_value = 'MDIS-WAC'
        assert Pds3Driver.instrument_id == 'MSGR_MDIS_WAC'
        mock_id.return_value = 'MDIS-NAC'
        assert Pds3Driver.instrument_id == 'MSGR_MDIS_NAC'    

@patch('ale.base.label_pds3.Pds3Label.filter_number', 10)
@patch('ale.base.data_naif.NaifSpice.ikid', 100)
def test_focal_length_pds3(Pds3Driver):
    with patch.dict(Pds3Driver.label, {'FOCAL_PLANE_TEMPERATURE':
    pvl._collections.Units(value=1, units='<DEGC>')}) as f:
        assert Pds3Driver.focal_length == 5

@patch('ale.base.data_naif.NaifSpice.ikid', 123)
def test_detector_start_sample_pds3(Pds3Driver):
    assert Pds3Driver.detector_start_sample == 1

@patch('ale.base.data_naif.NaifSpice.ikid', 123)
def test_detector_start_line_pds3(Pds3Driver):
    assert Pds3Driver.detector_start_line == 1

@patch('ale.base.data_naif.NaifSpice.ikid', 123)
def test_detector_center_sample_pds3(Pds3Driver):
    assert Pds3Driver.detector_center_sample == 1

@patch('ale.base.data_naif.NaifSpice.ikid', 123)
def test_detector_center_line_pds3(Pds3Driver):
    assert Pds3Driver.detector_center_line == 1

def test_sensor_model_version_pds3(Pds3Driver):
    assert Pds3Driver.sensor_model_version == 2

@patch('ale.base.data_naif.NaifSpice.odtx', 123)
@patch('ale.base.data_naif.NaifSpice.odty', 321)
def test_usgscsm_distortion_model_pds3(Pds3Driver):
    assert Pds3Driver.usgscsm_distortion_model['transverse']['x'] == 123
    assert Pds3Driver.usgscsm_distortion_model['transverse']['y'] == 321

def test_instrument_id_isis(IsisLabelDriver):
    with patch('ale.base.label_isis.IsisLabel.instrument_id', new_callable=PropertyMock) as mock_id:
        mock_id.return_value = 'MDIS-WAC'
        assert IsisLabelDriver.instrument_id == 'MSGR_MDIS_WAC'
        mock_id.return_value = 'MDIS-NAC'
        assert IsisLabelDriver.instrument_id == 'MSGR_MDIS_NAC'

@patch("ale.base.label_isis.IsisLabel.spacecraft_clock_start_count", 123)
@patch("ale.base.data_naif.NaifSpice.spacecraft_id", 321)
def test_ephemeris_start_time_isis(IsisLabelDriver):
    assert IsisLabelDriver.ephemeris_start_time == .1

@patch('ale.base.data_naif.NaifSpice.odtx', 123)
@patch('ale.base.data_naif.NaifSpice.odty', 321)
def test_usgscsm_distortion_model_isis(IsisLabelDriver):
    assert IsisLabelDriver.usgscsm_distortion_model['transverse']['x'] == 123
    assert IsisLabelDriver.usgscsm_distortion_model['transverse']['y'] == 321

@patch('ale.base.data_naif.NaifSpice.ikid', 100)
def test_fikid_isis(IsisLabelDriver):
    with patch.dict(IsisLabelDriver.label, {'IsisCube': {'BandBin' : {'Number' : 10 }}}) as f:
        assert IsisLabelDriver.fikid == 90

@patch('ale.drivers.messenger_drivers.MessengerMdisIsisLabelNaifSpiceDriver.fikid', 1)
def test_focal_length_isis(IsisLabelDriver):
    with patch.dict(IsisLabelDriver.label, {'IsisCube': {'Instrument': {'FocalPlaneTemperature':
    pvl._collections.Units(value=1, units='<DEGC>')}}}) as f:
        assert IsisLabelDriver.focal_length == 5

@patch('ale.base.data_naif.NaifSpice.ikid', 100)
def test_detector_start_sample_isis(IsisLabelDriver):
    assert IsisLabelDriver.detector_start_sample == 1

@patch('ale.base.data_naif.NaifSpice.ikid', 100)
def test_detector_start_line_isis(IsisLabelDriver):
    assert IsisLabelDriver.detector_start_line == 1

@patch('ale.base.data_naif.NaifSpice.ikid', 100)
def test_detector_center_line_isis(IsisLabelDriver):
    assert IsisLabelDriver.detector_center_line == 1

@patch('ale.base.data_naif.NaifSpice.ikid', 100)
def detector_center_sample_isis(IsisLabelDriver):
    assert IsisLabelDriver.detector_center_sample == 1

def test_sensor_model_version_isis(IsisLabelDriver):
    assert IsisLabelDriver.sensor_model_version == 2