from collections import namedtuple import pytest import ale from ale.drivers import base from ale import util import pvl import numpy as np import quaternion import struct @pytest.fixture def test_cube(monkeypatch): label = """ Object = IsisCube Object = Core StartByte = 65537 Format = Tile TileSamples = 512 TileLines = 512 Group = Dimensions Samples = 1024 Lines = 1024 Bands = 1 End_Group Group = Pixels Type = Real ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object Group = Instrument SpacecraftName = Messenger InstrumentName = "MERCURY DUAL IMAGING SYSTEM NARROW ANGLE CAMERA" InstrumentId = MDIS-NAC TargetName = Venus OriginalTargetName = VENUS StartTime = 2007-06-06T00:22:10.751814 StopTime = 2007-06-06T00:22:10.768814 SpacecraftClockCount = 1/0089576657:973000 MissionPhaseName = "VENUS 2 FLYBY" ExposureDuration = 17 ExposureType = AUTO DetectorTemperature = -43.65 FocalPlaneTemperature = -23.63 FilterTemperature = N/A OpticsTemperature = -24.72 AttitudeQuality = Ok FilterWheelPosition = 28320 PivotPosition = -6847 FpuBinningMode = 0 PixelBinningMode = 0 SubFrameMode = 0 JailBars = 0 DpuId = DPU-A PivotAngle = -18.805847167969 Unlutted = 1 LutInversionTable = $messenger/calibration/LUT_INVERT/MDISLUTINV_0.TAB End_Group Group = Archive DataSetId = MESS-E/V/H-MDIS-2-EDR-RAWDATA-V1.0 DataQualityId = 0000000000000000 ProducerId = "APPLIED COHERENT TECHNOLOGY CORPORATION" EdrSourceProductId = 0089576657_IM4WV ProductId = EN0089576657M SequenceName = 07157_DEP_NAC_MOSAIC_1 ObservationId = 3276 ObservationType = N/A SiteId = N/A MissionElapsedTime = 89576657 EdrProductCreationTime = 2011-11-21T22:38:34 ObservationStartTime = 2007-06-06T00:22:10.751814 SpacecraftClockStartCount = 1/0089576657:973000 SpacecraftClockStopCount = 1/0089576657:990000 Exposure = 17 CCDTemperature = 1022 OriginalFilterNumber = 0 OrbitNumber = 0 YearDoy = 2007157 SourceProductId = (EN0089576657M, MDISLUTINV_0) End_Group Group = BandBin Name = "748 BP 53" Number = 2 Center = 747.7 Width = 52.6 End_Group Group = Kernels NaifIkCode = -236820 LeapSecond = $base/kernels/lsk/naif0012.tls TargetAttitudeShape = $base/kernels/pck/pck00009.tpc TargetPosition = (Table, $base/kernels/spk/de405.bsp) InstrumentPointing = (Table, $messenger/kernels/ck/msgr_0706_v04.bc, $messenger/kernels/ck/msgr_mdis_sc040812_1504- 30v1.bc, $messenger/kernels/ck/msgr_mdis_sc050727_1003- 02_sub_v1.bc, $messenger/kernels/ck/msgr_mdis_gm040819_1504- 30v1.bc, $messenger/kernels/fk/msgr_v231.tf) Instrument = $messenger/kernels/ik/msgr_mdis_v160.ti SpacecraftClock = $messenger/kernels/sclk/messenger_2548.tsc InstrumentPosition = (Table, $messenger/kernels/spk/msgr_040803_150430_150- 430_od431sc_2.bsp) InstrumentAddendum = $messenger/kernels/iak/mdisAddendum009.ti ShapeModel = Null InstrumentPositionQuality = Reconstructed InstrumentPointingQuality = Reconstructed CameraVersion = 2 End_Group End_Object Object = Label Bytes = 65536 End_Object Object = Table Name = InstrumentPointing StartByte = 4267529 Bytes = 64 Records = 1 ByteOrder = Lsb TimeDependentFrames = (-236890, -236892, -236880, -236000, 1) ConstantFrames = (-236820, -236800, -236890) ConstantRotation = (0.001686595916635, 0.99996109494739, 0.0086581745086423, 6.3008625209968e-04, -0.0086592477671008, 0.99996230949942, 0.99999837919145, -0.0016810769512645, -6.44666390486019e-04) CkTableStartTime = 234361395.94511 CkTableEndTime = 234361395.94511 CkTableOriginalSize = 1 FrameTypeCode = 3 Description = "Created by spiceinit" Kernels = ($messenger/kernels/ck/msgr_0706_v04.bc, $messenger/kernels/ck/msgr_mdis_sc040812_150430v1.bc, $messenger/kernels/ck/msgr_mdis_sc050727_100302_sub_v- 1.bc, $messenger/kernels/ck/msgr_mdis_gm040819_150430v1.bc, $messenger/kernels/fk/msgr_v231.tf) Group = Field Name = J2000Q0 Type = Double Size = 1 End_Group Group = Field Name = J2000Q1 Type = Double Size = 1 End_Group Group = Field Name = J2000Q2 Type = Double Size = 1 End_Group Group = Field Name = J2000Q3 Type = Double Size = 1 End_Group Group = Field Name = AV1 Type = Double Size = 1 End_Group Group = Field Name = AV2 Type = Double Size = 1 End_Group Group = Field Name = AV3 Type = Double Size = 1 End_Group Group = Field Name = ET Type = Double Size = 1 End_Group End_Object Object = Table Name = InstrumentPosition StartByte = 4267593 Bytes = 56 Records = 1 ByteOrder = Lsb CacheType = Linear SpkTableStartTime = 234361395.94511 SpkTableEndTime = 234361395.94511 SpkTableOriginalSize = 1.0 Description = "Created by spiceinit" Kernels = $messenger/kernels/spk/msgr_040803_150430_150430_od4- 31sc_2.bsp Group = Field Name = J2000X Type = Double Size = 1 End_Group Group = Field Name = J2000Y Type = Double Size = 1 End_Group Group = Field Name = J2000Z Type = Double Size = 1 End_Group Group = Field Name = J2000XV Type = Double Size = 1 End_Group Group = Field Name = J2000YV Type = Double Size = 1 End_Group Group = Field Name = J2000ZV Type = Double Size = 1 End_Group Group = Field Name = ET Type = Double Size = 1 End_Group End_Object Object = Table Name = BodyRotation StartByte = 4267649 Bytes = 64 Records = 1 ByteOrder = Lsb TimeDependentFrames = (10012, 1) CkTableStartTime = 234361395.94511 CkTableEndTime = 234361395.94511 CkTableOriginalSize = 1 FrameTypeCode = 2 PoleRa = (272.76, 0.0, 0.0) PoleDec = (67.16, 0.0, 0.0) PrimeMeridian = (160.2, -1.4813688, 0.0) Description = "Created by spiceinit" Kernels = ($base/kernels/spk/de405.bsp, $base/kernels/pck/pck00009.tpc) SolarLongitude = 330.75268490609 Group = Field Name = J2000Q0 Type = Double Size = 1 End_Group Group = Field Name = J2000Q1 Type = Double Size = 1 End_Group Group = Field Name = J2000Q2 Type = Double Size = 1 End_Group Group = Field Name = J2000Q3 Type = Double Size = 1 End_Group Group = Field Name = AV1 Type = Double Size = 1 End_Group Group = Field Name = AV2 Type = Double Size = 1 End_Group Group = Field Name = AV3 Type = Double Size = 1 End_Group Group = Field Name = ET Type = Double Size = 1 End_Group End_Object Object = Table Name = SunPosition StartByte = 4267713 Bytes = 56 Records = 1 ByteOrder = Lsb CacheType = Linear SpkTableStartTime = 234361395.94511 SpkTableEndTime = 234361395.94511 SpkTableOriginalSize = 1.0 Description = "Created by spiceinit" Kernels = $base/kernels/spk/de405.bsp Group = Field Name = J2000X Type = Double Size = 1 End_Group Group = Field Name = J2000Y Type = Double Size = 1 End_Group Group = Field Name = J2000Z Type = Double Size = 1 End_Group Group = Field Name = J2000XV Type = Double Size = 1 End_Group Group = Field Name = J2000YV Type = Double Size = 1 End_Group Group = Field Name = J2000ZV Type = Double Size = 1 End_Group Group = Field Name = ET Type = Double Size = 1 End_Group End_Object Object = History Name = IsisCube StartByte = 4267769 Bytes = 914 End_Object Object = OriginalLabel Name = IsisCube StartByte = 4259841 Bytes = 7688 End_Object Object = NaifKeywords BODY299_RADII = (6051.8, 6051.8, 6051.8) BODY_FRAME_CODE = 10012 INS-236820_SWAP_OBSERVER_TARGET = TRUE INS-236820_LIGHTTIME_CORRECTION = LT+S INS-236820_LT_SURFACE_CORRECT = FALSE INS-236820_REFERENCE_FRAME = MSGR_SPACECRAFT INS-236820_FRAME = MSGR_MDIS_NAC INS-236820_FOCAL_LENGTH = 549.11781953727 INS-236820_FL_TEMP_COEFFS = (549.51204973417, 0.010185643391234, 0.0, 0.0, 0.0, 0.0) TempDependentFocalLength = 549.27136298083462 INS-236820_PIXEL_PITCH = 0.014 CLOCK_ET_-236_1/0089576657:973000_COMPUTED = 0000000000002040 INS-236820_TRANSX = (0.0, 0.014, 0.0) INS-236820_TRANSY = (0.0, 0.0, 0.014) INS-236820_ITRANSS = (0.0, 71.42857143, 0.0) INS-236820_ITRANSL = (0.0, 0.0, 71.42857143) INS-236820_BORESIGHT_SAMPLE = 512.5 INS-236820_BORESIGHT_LINE = 512.5 INS-236820_OD_T_X = (0.0, 1.0018542696238, 0.0, 0.0, -5.09444047494111e-04, 0.0, 1.00401047146886e-05, 0.0, 1.00401047146886e-05, 0.0) INS-236820_OD_T_Y = (0.0, 0.0, 1.0, 9.06001059499675e-04, 0.0, 3.57484262662076e-04, 0.0, 1.00401047146886e-05, 0.0, 1.00401047146886e-05) End_Object End """ def test_table_data(table_label, file): count = table_label['Records'] * len(table_label.getlist('Field')) doubles = list(range(count)) return struct.pack('d' * count, *doubles) monkeypatch.setattr(base, 'read_table_data', test_table_data) def test_label(file): return pvl.loads(label) monkeypatch.setattr(pvl, 'load', test_label) test_image = type('TestCubeDriver', (base.Driver, base.IsisSpice), {})(label) # test_image._file = 'testfile.cub' return test_image def test_read(test_cube): assert isinstance(test_cube.label, pvl.PVLModule) def test_number_of_quaternions(test_cube): assert test_cube.number_of_quaternions == 1 def test_number_of_ephemerides(test_cube): assert test_cube.number_of_ephemerides == 1 def test_starting_ephemeris_time(test_cube): assert test_cube.starting_ephemeris_time == 8.0 def test_detector_center(test_cube): assert [test_cube._detector_center_line, test_cube._detector_center_sample] == [512.5, 512.5] def test_ikid(test_cube): assert test_cube.ikid == -236820 def test_focal2pixel_lines(test_cube): assert test_cube.focal2pixel_lines == [0.0, 0.0, 71.42857143] def test_focal2pixel_samples(test_cube): assert test_cube.focal2pixel_samples == [0.0, 71.42857143, 0.0] def test_focal_length(test_cube): assert test_cube._focal_length == 549.11781953727 def test_body_radii(test_cube): assert test_cube._body_radii == [6051.8, 6051.8, 6051.8] def test_semimajor(test_cube): assert test_cube._semimajor == 6051.8 def test_semiminor(test_cube): assert test_cube._semiminor == 6051.8 def test_reference_frame(test_cube): assert test_cube.reference_frame == 10012 def test_sun_position(test_cube): assert np.array_equal(test_cube._sun_position, np.array([[0, 1, 2]])) def test_sun_velocity(test_cube): assert np.array_equal(test_cube._sun_velocity, np.array([[3, 4, 5]])) def test_sensor_position(test_cube): assert np.array_equal(test_cube._sensor_position, np.array([[0, 1, 2]])) def test_sensor_velocity(test_cube): assert np.array_equal(test_cube._sensor_velocity, np.array([[3, 4, 5]])) def test_sensor_orientation(test_cube): assert np.array_equal(test_cube._sensor_orientation, np.asarray([[0, 1, 2, 3]])) def test_body_orientation(test_cube): assert np.array_equal(test_cube.body_orientation, np.asarray([[0, 1, 2, 3]])) def test_naif_keywords(test_cube): assert isinstance(test_cube.naif_keywords, pvl.PVLObject)