Skip to content
Snippets Groups Projects
Commit b612bd94 authored by Kelvin Rodriguez's avatar Kelvin Rodriguez Committed by GitHub
Browse files

single isd format + mro test conversion (#336)

* single isd format + mro test_conversion

* init

* isds

* we forget to add important files around here
parent 81e9de49
No related branches found
No related tags found
No related merge requests found
...@@ -16,6 +16,7 @@ from collections import OrderedDict ...@@ -16,6 +16,7 @@ from collections import OrderedDict
from ale.formatters.usgscsm_formatter import to_usgscsm from ale.formatters.usgscsm_formatter import to_usgscsm
from ale.formatters.isis_formatter import to_isis from ale.formatters.isis_formatter import to_isis
from ale.formatters.formatter import to_isd
from ale.base.data_isis import IsisSpice from ale.base.data_isis import IsisSpice
from abc import ABC from abc import ABC
...@@ -32,7 +33,8 @@ __all__ = [driver for driver in __all__ if driver not in __disabled_drivers__] ...@@ -32,7 +33,8 @@ __all__ = [driver for driver in __all__ if driver not in __disabled_drivers__]
__driver_modules__ = [importlib.import_module('.'+m, package='ale.drivers') for m in __all__] __driver_modules__ = [importlib.import_module('.'+m, package='ale.drivers') for m in __all__]
__formatters__ = {'usgscsm': to_usgscsm, __formatters__ = {'usgscsm': to_usgscsm,
'isis': to_isis} 'isis': to_isis,
'ale' : to_isd}
def sort_drivers(drivers=[]): def sort_drivers(drivers=[]):
return list(sorted(drivers, key=lambda x:IsisSpice in x.__bases__, reverse=False)) return list(sorted(drivers, key=lambda x:IsisSpice in x.__bases__, reverse=False))
...@@ -51,7 +53,7 @@ class AleJsonEncoder(json.JSONEncoder): ...@@ -51,7 +53,7 @@ class AleJsonEncoder(json.JSONEncoder):
return obj.isoformat() return obj.isoformat()
return json.JSONEncoder.default(self, obj) return json.JSONEncoder.default(self, obj)
def load(label, props={}, formatter='usgscsm', verbose=False): def load(label, props={}, formatter='ale', verbose=False):
""" """
Attempt to load a given label from all possible drivers Attempt to load a given label from all possible drivers
...@@ -86,6 +88,6 @@ def load(label, props={}, formatter='usgscsm', verbose=False): ...@@ -86,6 +88,6 @@ def load(label, props={}, formatter='usgscsm', verbose=False):
traceback.print_exc() traceback.print_exc()
raise Exception('No Such Driver for Label') raise Exception('No Such Driver for Label')
def loads(label, props='', formatter='usgscsm', verbose=False): def loads(label, props='', formatter='ale', verbose=False):
res = load(label, props, formatter, verbose=verbose) res = load(label, props, formatter, verbose=verbose)
return json.dumps(res, cls=AleJsonEncoder) return json.dumps(res, cls=AleJsonEncoder)
import json
import numpy as np
from scipy.interpolate import interp1d, BPoly
from networkx.algorithms.shortest_paths.generic import shortest_path
from ale.transformation import FrameChain
from ale.base.type_sensor import LineScanner, Framer
from ale.rotation import ConstantRotation, TimeDependentRotation
def to_isd(driver):
"""
Formatter to create sensor model meta data from a driver.
Parameters
----------
driver : Driver
Concrete driver for the image that meta data is being generated for.
Returns
-------
string
The ISIS compatible meta data as a JSON encoded string.
"""
meta_data = {}
meta_data['IsisCameraVersion'] = driver.sensor_model_version
# interiror orientation
meta_data['NaifKeywords'] = driver.naif_keywords
meta_data['detector_sample_summing'] = driver.sample_summing
meta_data['detector_line_summing'] = driver.line_summing
meta_data['focal_length_model'] = {
'focal_length' : driver.focal_length
}
meta_data['detector_center'] = {
'line' : driver.detector_center_line,
'sample' : driver.detector_center_sample
}
meta_data['starting_detector_line'] = driver.detector_start_line
meta_data['starting_detector_sample'] = driver.detector_start_sample
meta_data['focal2pixel_lines'] = driver.focal2pixel_lines
meta_data['focal2pixel_samples'] = driver.focal2pixel_samples
meta_data['optical_distortion'] = driver.usgscsm_distortion_model
# general information
meta_data['image_lines'] = driver.image_lines
meta_data['image_samples'] = driver.image_samples
meta_data['name_platform'] = driver.platform_name
meta_data['name_sensor'] = driver.sensor_name
meta_data['reference_height'] = {
"maxheight": 1000,
"minheight": -1000,
"unit": "m"
}
# line scan sensor model specifics
if isinstance(driver, LineScanner):
meta_data['name_model'] = 'USGS_ASTRO_LINE_SCANNER_SENSOR_MODEL'
meta_data['interpolation_method'] = 'lagrange'
start_lines, start_times, scan_rates = driver.line_scan_rate
center_time = driver.center_ephemeris_time
meta_data['line_scan_rate'] = [[line, time, rate] for line, time, rate in zip(start_lines, start_times, scan_rates)]
meta_data['starting_ephemeris_time'] = driver.ephemeris_start_time
meta_data['center_ephemeris_time'] = center_time
# frame sensor model specifics
if isinstance(driver, Framer):
meta_data['name_model'] = 'USGS_ASTRO_FRAME_SENSOR_MODEL'
meta_data['center_ephemeris_time'] = driver.center_ephemeris_time
frame_chain = driver.frame_chain
sensor_frame = driver.sensor_frame_id
target_frame = driver.target_frame_id
body_radii = driver.target_body_radii
meta_data['radii'] = {
'semimajor' : body_radii[0],
'semiminor' : body_radii[2],
'unit' : 'km'
}
instrument_pointing = {}
source_frame, destination_frame, time_dependent_sensor_frame = frame_chain.last_time_dependent_frame_between(1, sensor_frame)
# Reverse the frame order because ISIS orders frames as
# (destination, intermediate, ..., intermediate, source)
instrument_pointing['TimeDependentFrames'] = shortest_path(frame_chain, destination_frame, 1)
time_dependent_rotation = frame_chain.compute_rotation(1, destination_frame)
instrument_pointing['CkTableStartTime'] = time_dependent_rotation.times[0]
instrument_pointing['CkTableEndTime'] = time_dependent_rotation.times[-1]
instrument_pointing['CkTableOriginalSize'] = len(time_dependent_rotation.times)
instrument_pointing['EphemerisTimes'] = time_dependent_rotation.times
instrument_pointing['Quaternions'] = time_dependent_rotation.quats[:, [3, 0, 1, 2]]
instrument_pointing['AngularVelocity'] = time_dependent_rotation.av
# Reverse the frame order because ISIS orders frames as
# (destination, intermediate, ..., intermediate, source)
instrument_pointing['ConstantFrames'] = shortest_path(frame_chain, sensor_frame, destination_frame)
constant_rotation = frame_chain.compute_rotation(destination_frame, sensor_frame)
instrument_pointing['ConstantRotation'] = constant_rotation.rotation_matrix().flatten()
meta_data['InstrumentPointing'] = instrument_pointing
body_rotation = {}
source_frame, destination_frame, time_dependent_target_frame = frame_chain.last_time_dependent_frame_between(target_frame, 1)
if source_frame != 1:
# Reverse the frame order because ISIS orders frames as
# (destination, intermediate, ..., intermediate, source)
body_rotation['TimeDependentFrames'] = shortest_path(frame_chain, source_frame, 1)
time_dependent_rotation = frame_chain.compute_rotation(1, source_frame)
body_rotation['CkTableStartTime'] = time_dependent_rotation.times[0]
body_rotation['CkTableEndTime'] = time_dependent_rotation.times[-1]
body_rotation['CkTableOriginalSize'] = len(time_dependent_rotation.times)
body_rotation['EphemerisTimes'] = time_dependent_rotation.times
body_rotation['Quaternions'] = time_dependent_rotation.quats[:, [3, 0, 1, 2]]
body_rotation['AngularVelocity'] = time_dependent_rotation.av
if source_frame != target_frame:
# Reverse the frame order because ISIS orders frames as
# (destination, intermediate, ..., intermediate, source)
body_rotation['ConstantFrames'] = shortest_path(frame_chain, target_frame, source_frame)
constant_rotation = frame_chain.compute_rotation(source_frame, target_frame)
body_rotation['ConstantRotation'] = constant_rotation.rotation_matrix().flatten()
meta_data['BodyRotation'] = body_rotation
j2000_rotation = frame_chain.compute_rotation(target_frame, 1)
instrument_position = {}
positions, velocities, times = driver.sensor_position
instrument_position['SpkTableStartTime'] = times[0]
instrument_position['SpkTableEndTime'] = times[-1]
instrument_position['SpkTableOriginalSize'] = len(times)
instrument_position['EphemerisTimes'] = times
# Rotate positions and velocities into J2000 then scale into kilometers
velocities = j2000_rotation.rotate_velocity_at(positions, velocities, times)/1000
positions = j2000_rotation.apply_at(positions, times)/1000
instrument_position['Positions'] = positions
instrument_position['Velocities'] = velocities
meta_data['InstrumentPosition'] = instrument_position
sun_position = {}
positions, velocities, times = driver.sun_position
sun_position['SpkTableStartTime'] = times[0]
sun_position['SpkTableEndTime'] = times[-1]
sun_position['SpkTableOriginalSize'] = len(times)
sun_position['EphemerisTimes'] = times
# Rotate positions and velocities into J2000 then scale into kilometers
velocities = j2000_rotation.rotate_velocity_at(positions, velocities, times)/1000
positions = j2000_rotation.apply_at(positions, times)/1000
sun_position['Positions'] = positions
sun_position['Velocities'] = velocities
meta_data['SunPosition'] = sun_position
# check that there is a valid sensor model name
if 'name_model' not in meta_data:
raise Exception('No CSM sensor model name found!')
return meta_data
...@@ -3,6 +3,8 @@ import os ...@@ -3,6 +3,8 @@ import os
import re import re
import warnings import warnings
import numpy as np import numpy as np
import json
import ale import ale
from glob import glob from glob import glob
...@@ -93,6 +95,17 @@ def get_image_label(image, label_type='pds3'): ...@@ -93,6 +95,17 @@ def get_image_label(image, label_type='pds3'):
return label_file[0] return label_file[0]
def get_isd(instrument):
if not isinstance(instrument, str):
raise KeyError('instrument name is not a string')
label_file = glob(os.path.join(data_root, 'isds',f'{instrument}_isd.json'))
if not label_file:
raise Exception(f'Could not find label file for {instrument}')
return json.load(open(label_file[0]))
def get_image_kernels(image): def get_image_kernels(image):
""" """
Get the kernels to use with a test image. Get the kernels to use with a test image.
......
{
"IsisCameraVersion": 1,
"NaifKeywords": {
"BODY499_RADII": [
3396.19,
3396.19,
3376.2
],
"BODY_FRAME_CODE": 10014,
"BODY_CODE": 499,
"INS-74021_FOV_ANGLE_UNITS": "DEGREES",
"TKFRAME_-74021_UNITS": "DEGREES",
"INS-74021_FOV_ANGULAR_SIZE": [
5.73,
0.001146
],
"INS-74021_PIXEL_LINES": 1.0,
"TKFRAME_-74021_ANGLES": [
0.0,
0.0,
0.0
],
"INS-74021_IFOV": [
2e-05,
2e-05
],
"FRAME_-74021_CENTER": -74.0,
"INS-74021_F/RATIO": 3.25,
"INS-74021_PLATFORM_ID": -74000.0,
"INS-74021_CCD_CENTER": [
2500.5,
0.5
],
"INS-74021_PIXEL_SAMPLES": 5000.0,
"INS-74021_FOCAL_LENGTH": 352.9271664,
"INS-74021_FOV_CROSS_ANGLE": 0.00057296,
"INS-74021_TRANSX": [
0.0,
0.0,
0.007
],
"INS-74021_FOV_CLASS_SPEC": "ANGLES",
"INS-74021_TRANSY": [
0.0,
0.007,
0.0
],
"INS-74021_FOV_REF_VECTOR": [
0.0,
1.0,
0.0
],
"INS-74021_BORESIGHT": [
0.0,
0.0,
1.0
],
"FRAME_-74021_NAME": "MRO_CTX",
"INS-74021_PIXEL_PITCH": 0.007,
"TKFRAME_-74021_AXES": [
1.0,
2.0,
3.0
],
"TKFRAME_-74021_SPEC": "ANGLES",
"INS-74021_BORESIGHT_LINE": 0.430442527,
"INS-74021_FOV_SHAPE": "RECTANGLE",
"INS-74021_BORESIGHT_SAMPLE": 2543.46099,
"FRAME_-74021_CLASS": 4.0,
"INS-74021_CK_FRAME_ID": -74000.0,
"INS-74021_ITRANSL": [
0.0,
142.85714285714,
0.0
],
"INS-74021_FOV_REF_ANGLE": 2.86478898,
"INS-74021_ITRANSS": [
0.0,
0.0,
142.85714285714
],
"FRAME_-74021_CLASS_ID": -74021.0,
"INS-74021_OD_K": [
-0.0073433925920054505,
2.8375878636241697e-05,
1.2841989124027099e-08
],
"INS-74021_FOV_FRAME": "MRO_CTX",
"INS-74021_CK_REFERENCE_ID": -74900.0,
"TKFRAME_-74021_RELATIVE": "MRO_CTX_BASE",
"INS-74021_PIXEL_SIZE": [
0.007,
0.007
],
"SCLK_PARTITION_END_74999": [
52973626698957.0,
56987144678331.0,
58187590527162.99,
60316687182323.0,
60877152115000.0,
61228279788693.0,
61339176915162.99,
61899057915627.0,
63521451859691.0,
65622287643263.0
],
"SCLK01_N_FIELDS_74999": 2.0,
"SCLK01_OUTPUT_DELIM_74999": 1.0,
"BODY499_POLE_DEC": [
52.8865,
-0.0609,
0.0
],
"SCLK01_OFFSETS_74999": [
0.0,
0.0
],
"SCLK_DATA_TYPE_74999": 1.0,
"SCLK01_COEFFICIENTS_74999": [
0.0,
-631195148.816,
1.0,
3097283854336.0,
-583934347.816,
1.0,
5164027215872.0,
-552398346.816,
1.0,
7230770577408.0
],
"SCLK01_TIME_SYSTEM_74999": 2.0,
"SCLK_PARTITION_START_74999": [
0.0,
52973626982399.99,
56987144683520.0,
58187590533120.0,
60316687204352.01,
60877152124927.99,
61228279791616.0,
61339176927232.0,
61899057922048.0,
63521451868160.0
],
"BODY499_POLE_RA": [
317.68143,
-0.1061,
0.0
],
"BODY499_PM": [
176.63,
350.89198226,
0.0
],
"SCLK01_MODULI_74999": [
4294967296.0,
65536.0
]
},
"detector_sample_summing": 1,
"detector_line_summing": 1,
"focal_length_model": {
"focal_length": 352.9271664
},
"detector_center": {
"line": 0.430442527,
"sample": 2542.96099
},
"starting_detector_line": 0,
"starting_detector_sample": 0,
"focal2pixel_lines": [
0.0,
142.85714285714,
0.0
],
"focal2pixel_samples": [
0.0,
0.0,
142.85714285714
],
"optical_distortion": {
"radial": {
"coefficients": [
-0.0073433925920054505,
2.8375878636241697e-05,
1.2841989124027099e-08
]
}
},
"image_lines": 400,
"image_samples": 5056,
"name_platform": "Mars_Reconnaissance_Orbiter",
"name_sensor": "CONTEXT CAMERA",
"reference_height": {
"maxheight": 1000,
"minheight": -1000,
"unit": "m"
},
"name_model": "USGS_ASTRO_LINE_SCANNER_SENSOR_MODEL",
"interpolation_method": "lagrange",
"line_scan_rate": [
[
0.5,
-0.37540000677108765,
0.001877
]
],
"starting_ephemeris_time": 297088762.24158406,
"center_ephemeris_time": 297088762.61698407,
"radii": {
"semimajor": 3396.19,
"semiminor": 3376.2,
"unit": "km"
},
"InstrumentPointing": {
"TimeDependentFrames": [
-74000,
-74900,
1
],
"CkTableStartTime": 297088762.24158406,
"CkTableEndTime": 297088762.9923841,
"CkTableOriginalSize": 6,
"EphemerisTimes": [
297088762.24158406,
297088762.3917441,
297088762.5419041,
297088762.69206405,
297088762.84222406,
297088762.9923841
],
"Quaternions": [
[
0.42061124835443375,
0.1860622266332136,
-0.23980124331599867,
0.8549633847610767
],
[
0.42062260840195603,
0.186123564618581,
-0.23976950628253949,
0.8549533460089124
],
[
0.4206354696231763,
0.18618437842074986,
-0.23973759356053978,
0.8549427262458993
],
[
0.42064763332258537,
0.18624550650991442,
-0.23970570189408144,
0.8549323694681581
],
[
0.42065922954773666,
0.1863066728084066,
-0.23967381992970707,
0.8549222750073063
],
[
0.4206714374933977,
0.1863668684529047,
-0.23964184692167076,
0.8549121108185723
]
],
"AngularVelocity": [
[
-0.0006409728984903079,
0.0005054077299115119,
0.0004718267948468069
],
[
-0.0006410700774431097,
0.0005044862657976017,
0.0004731836236807216
],
[
-0.0006408186407087456,
0.0004992170698116158,
0.0004802237192760833
],
[
-0.0006363961683672021,
0.0004989647975959612,
0.00047654664046286975
],
[
-0.0006376443791903504,
0.0004996117504290811,
0.00047678850931380653
],
[
-0.0006404093657132724,
0.0005028749658176146,
0.0004805228583087444
]
],
"ConstantFrames": [
-74021,
-74020,
-74699,
-74690,
-74000
],
"ConstantRotation": [
0.9999995608798441,
-1.51960241928035e-05,
0.0009370214510594064,
1.5276552075356694e-05,
0.9999999961910578,
-8.593317911879532e-05,
-0.000937020141647677,
8.594745584079714e-05,
0.9999995573030465
]
},
"BodyRotation": {
"TimeDependentFrames": [
10014,
1
],
"CkTableStartTime": 297088762.24158406,
"CkTableEndTime": 297088762.9923841,
"CkTableOriginalSize": 6,
"EphemerisTimes": [
297088762.24158406,
297088762.3917441,
297088762.5419041,
297088762.69206405,
297088762.84222406,
297088762.9923841
],
"Quaternions": [
[
-0.8371209459443085,
0.2996928944391797,
0.10720760458181891,
0.4448811306448063
],
[
-0.8371185783490869,
0.2996934649760026,
0.1072060096645597,
0.4448855856569007
],
[
-0.8371162107293473,
0.2996940355045328,
0.10720441474371896,
0.44489004065791765
],
[
-0.8371138430875174,
0.2996946060241849,
0.1072028198209324,
0.44489449564328926
],
[
-0.8371114754203602,
0.2996951765357392,
0.10720122489401934,
0.44489895061910595
],
[
-0.8371091077303039,
0.29969574703861046,
0.10719962996461516,
0.4449034055807993
]
],
"AngularVelocity": [
[
3.16238646979841e-05,
-2.880432898124293e-05,
5.6520131658726165e-05
],
[
3.1623864697983686e-05,
-2.880432898124763e-05,
5.652013165872402e-05
],
[
3.162386469798325e-05,
-2.880432898125237e-05,
5.652013165872185e-05
],
[
3.162386469798283e-05,
-2.880432898125708e-05,
5.6520131658719694e-05
],
[
3.1623864697982405e-05,
-2.8804328981261782e-05,
5.6520131658717505e-05
],
[
3.162386469798195e-05,
-2.88043289812665e-05,
5.652013165871536e-05
]
]
},
"InstrumentPosition": {
"SpkTableStartTime": 297088762.24158406,
"SpkTableEndTime": 297088762.9923841,
"SpkTableOriginalSize": 6,
"EphemerisTimes": [
297088762.24158406,
297088762.3917441,
297088762.5419041,
297088762.69206405,
297088762.84222406,
297088762.9923841
],
"Positions": [
[
-1885.298067561683,
913.165223601331,
-2961.966828003069
],
[
-1885.5928012826328,
912.7436266030271,
-2961.910568238333
],
[
-1885.8874970695995,
912.3220111689507,
-2961.8542488448256
],
[
-1886.1821547735613,
911.9003774862961,
-2961.797869848145
],
[
-1886.47677475216,
911.4787252225885,
-2961.7414312040696
],
[
-1886.7713566477582,
911.0570545575632,
-2961.684932934942
]
],
"Velocities": [
[
-1.9629237646703683,
-2.80759072221274,
0.37446657801485306
],
[
-1.9626712192798401,
-2.807713482051373,
0.3748636774173111
],
[
-1.9624186346660286,
-2.807836185534424,
0.3752607691067297
],
[
-1.9621660109346446,
-2.8079588326107823,
0.37565785291714804
],
[
-1.9619133478903363,
-2.8080814233753033,
0.37605492915558875
],
[
-1.961660645638678,
-2.8082039577768683,
0.37645199765665144
]
]
},
"SunPosition": {
"SpkTableStartTime": 297088762.61698407,
"SpkTableEndTime": 297088762.61698407,
"SpkTableOriginalSize": 1,
"EphemerisTimes": [
297088762.61698407
],
"Positions": [
[
-208246643.08248276,
-7677087.066457123,
2103548.956999197
]
],
"Velocities": [
[
-0.21020163267146563,
-23.901883517440407,
-10.957471339412034
]
]
}
}
...@@ -10,276 +10,10 @@ import spiceypy as spice ...@@ -10,276 +10,10 @@ import spiceypy as spice
import ale import ale
from ale.drivers.mro_drivers import MroCtxPds3LabelNaifSpiceDriver, MroCtxIsisLabelNaifSpiceDriver, MroCtxIsisLabelIsisSpiceDriver from ale.drivers.mro_drivers import MroCtxPds3LabelNaifSpiceDriver, MroCtxIsisLabelNaifSpiceDriver, MroCtxIsisLabelIsisSpiceDriver
from conftest import get_image_kernels, convert_kernels, get_image_label, compare_dicts from conftest import get_image_kernels, get_isd, convert_kernels, get_image_label, compare_dicts
@pytest.fixture() #@pytest.fixture
def usgscsm_compare_dict(): # def ctx_isf
return {
'radii': {'semimajor': 3396.19, 'semiminor': 3376.2, 'unit': 'km'},
'sensor_position': {'positions': [[-615024.6029557, -97969.68743736, -3574019.26371975],
[-615533.14603391, -97907.93120584, -3573934.57376263],
[-616041.67554001, -97846.16219439, -3573849.81184277],
[-616550.19123687, -97784.38044738, -3573764.97799019],
[-617058.69359867, -97722.58582759, -3573680.07219406],
[-617567.18227279, -97660.77852259, -3573595.09438568]],
'velocities': [[-3386.71997092, 411.22641239, 563.75851535],
[-3386.62961915, 411.31156579, 564.23771317],
[-3386.53919809, 411.39670907, 564.71689945],
[-3386.44870778, 411.48184218, 565.19607397],
[-3386.35814814, 411.56696521, 565.6752371],
[-3386.26751923, 411.65207807, 566.15438866]],
'unit': 'm'},
'sun_position': {'positions': [[-127052102329.16032, 139728839049.65073, -88111530293.94502]],
'velocities': [[9883868.06162645, 8989183.29614645, 881.9339912834714]],
'unit': 'm'},
'sensor_orientation': {'quaternions': [[0.0839325155418464, 0.01773153459973093, 0.9946048838768001, 0.05832709905329942],
[0.08400255389846106, 0.017728573660888425, 0.9945982552324419, 0.05834020314559307],
[0.08407274386779334, 0.01772597983213095, 0.9945916990701015, 0.058351653947255444],
[0.08414295024563552, 0.01772323147647109, 0.9945850926215931, 0.05836389744430205],
[0.08421298603777544, 0.017720474751607096, 0.9945784602692478, 0.05837674302007029],
[0.08428244063999614, 0.017718270399902286, 0.9945719105583338, 0.05838876451978814]]},
'detector_sample_summing': 1,
'detector_line_summing': 1,
'focal_length_model': {'focal_length': 352.9271664},
'detector_center': {'line': 0.430442527, 'sample': 2542.96099},
'starting_detector_line': 0,
'starting_detector_sample': 0,
'focal2pixel_lines': [0.0, 142.85714285714, 0.0],
'focal2pixel_samples': [0.0, 0.0, 142.85714285714],
'optical_distortion': {'radial': {'coefficients': [-0.0073433925920054505, 2.8375878636241697e-05, 1.2841989124027099e-08]}},
'image_lines': 400,
'image_samples': 5056,
'name_platform': 'MARS_RECONNAISSANCE_ORBITER',
'name_sensor': 'CONTEXT CAMERA',
'reference_height': {'maxheight': 1000, 'minheight': -1000, 'unit': 'm'},
'name_model': 'USGS_ASTRO_LINE_SCANNER_SENSOR_MODEL',
'interpolation_method': 'lagrange',
'line_scan_rate': [[0.5, -0.37540000677108765, 0.001877]],
'starting_ephemeris_time': 297088762.24158406,
'center_ephemeris_time': 297088762.61698407,
't0_ephemeris': -0.37540000677108765,
'dt_ephemeris': 0.15016000270843505,
't0_quaternion': -0.37540000677108765,
'dt_quaternion': 0.15016000270843505}
@pytest.fixture()
def isis_compare_dict():
return {
'CameraVersion': 1,
"NaifKeywords": {
"BODY499_RADII": [
3396.19,
3396.19,
3376.2
],
"BODY_FRAME_CODE": 10014,
"BODY_CODE": 499,
"INS-74021_FOV_ANGLE_UNITS": "DEGREES",
"TKFRAME_-74021_UNITS": "DEGREES",
"INS-74021_FOV_ANGULAR_SIZE": [
5.73,
0.001146
],
"INS-74021_PIXEL_LINES": 1.0,
"TKFRAME_-74021_ANGLES": [
0.0,
0.0,
0.0
],
"INS-74021_IFOV": [
2e-05,
2e-05
],
"FRAME_-74021_CENTER": -74.0,
"INS-74021_F/RATIO": 3.25,
"INS-74021_PLATFORM_ID": -74000.0,
"INS-74021_CCD_CENTER": [
2500.5,
0.5
],
"INS-74021_PIXEL_SAMPLES": 5000.0,
"INS-74021_FOCAL_LENGTH": 352.9271664,
"INS-74021_FOV_CROSS_ANGLE": 0.00057296,
"INS-74021_TRANSX": [
0.0,
0.0,
0.007
],
"INS-74021_FOV_CLASS_SPEC": "ANGLES",
"INS-74021_TRANSY": [
0.0,
0.007,
0.0
],
"INS-74021_FOV_REF_VECTOR": [
0.0,
1.0,
0.0
],
"INS-74021_BORESIGHT": [
0.0,
0.0,
1.0
],
"FRAME_-74021_NAME": "MRO_CTX",
"INS-74021_PIXEL_PITCH": 0.007,
"TKFRAME_-74021_AXES": [
1.0,
2.0,
3.0
],
"TKFRAME_-74021_SPEC": "ANGLES",
"INS-74021_BORESIGHT_LINE": 0.430442527,
"INS-74021_FOV_SHAPE": "RECTANGLE",
"INS-74021_BORESIGHT_SAMPLE": 2543.46099,
"FRAME_-74021_CLASS": 4.0,
"INS-74021_CK_FRAME_ID": -74000.0,
"INS-74021_ITRANSL": [
0.0,
142.85714285714,
0.0
],
"INS-74021_FOV_REF_ANGLE": 2.86478898,
"INS-74021_ITRANSS": [
0.0,
0.0,
142.85714285714
],
"FRAME_-74021_CLASS_ID": -74021.0,
"INS-74021_OD_K": [
-0.0073433925920054505,
2.8375878636241697e-05,
1.2841989124027099e-08
],
"INS-74021_FOV_FRAME": "MRO_CTX",
"INS-74021_CK_REFERENCE_ID": -74900.0,
"TKFRAME_-74021_RELATIVE": "MRO_CTX_BASE",
"INS-74021_PIXEL_SIZE": [
0.007,
0.007
],
"SCLK_PARTITION_END_74999": [
52973626698957.0,
56987144678331.0,
58187590527162.99,
60316687182323.0,
60877152115000.0,
61228279788693.0,
61339176915162.99,
61899057915627.0,
63521451859691.0,
65622287643263.0
],
"SCLK01_N_FIELDS_74999": 2.0,
"SCLK01_OUTPUT_DELIM_74999": 1.0,
"BODY499_POLE_DEC": [
52.8865,
-0.0609,
0.0
],
"SCLK01_OFFSETS_74999": [
0.0,
0.0
],
"SCLK_DATA_TYPE_74999": 1.0,
"SCLK01_COEFFICIENTS_74999": [
0.0,
-631195148.816,
1.0,
3097283854336.0,
-583934347.816,
1.0,
5164027215872.0,
-552398346.816,
1.0,
7230770577408.0
],
"SCLK01_TIME_SYSTEM_74999": 2.0,
"SCLK_PARTITION_START_74999": [
0.0,
52973626982399.99,
56987144683520.0,
58187590533120.0,
60316687204352.01,
60877152124927.99,
61228279791616.0,
61339176927232.0,
61899057922048.0,
63521451868160.0
],
"BODY499_POLE_RA": [
317.68143,
-0.1061,
0.0
],
"BODY499_PM": [
176.63,
350.89198226,
0.0
],
"SCLK01_MODULI_74999": [
4294967296.0,
65536.0
]
},
'InstrumentPointing': {'TimeDependentFrames': [-74000, -74900, 1],
'ConstantFrames': [-74021, -74020, -74699, -74690, -74000],
'ConstantRotation': [0.9999995608798441, -1.51960241928035e-05, 0.0009370214510594064, 1.5276552075356694e-05, 0.9999999961910578, -8.593317911879532e-05, -0.000937020141647677, 8.594745584079714e-05, 0.9999995573030465],
'CkTableStartTime': 297088762.24158406,
'CkTableEndTime': 297088762.9923841,
'CkTableOriginalSize': 6,
'EphemerisTimes': [297088762.24158406, 297088762.3917441, 297088762.5419041, 297088762.69206405, 297088762.84222406, 297088762.9923841],
'Quaternions': [[0.42061125, 0.18606223, -0.23980124, 0.85496338],
[0.42062261, 0.18612356, -0.23976951, 0.85495335],
[0.42063547, 0.18618438, -0.23973759, 0.85494273],
[0.42064763, 0.18624551, -0.2397057 , 0.85493237],
[0.42065923, 0.18630667, -0.23967382, 0.85492228],
[0.42067144, 0.18636687, -0.23964185, 0.85491211]],
'AngularVelocity': [[-0.0006409728984903079, 0.0005054077299115119, 0.0004718267948468069],
[-0.0006410700774431097, 0.0005044862657976017, 0.0004731836236807216],
[-0.0006408186407087456, 0.0004992170698116158, 0.0004802237192760833],
[-0.0006363961683672021, 0.0004989647975959612, 0.00047654664046286975],
[-0.0006376443791903504, 0.0004996117504290811, 0.00047678850931380653],
[-0.0006404093657132724, 0.0005028749658176146, 0.0004805228583087444]]},
'BodyRotation': {'TimeDependentFrames': [10014, 1],
'CkTableStartTime': 297088762.24158406,
'CkTableEndTime': 297088762.9923841,
'CkTableOriginalSize': 6,
'EphemerisTimes': [297088762.24158406, 297088762.3917441, 297088762.5419041, 297088762.69206405, 297088762.84222406, 297088762.9923841],
'Quaternions': [[-0.8371209459443085, 0.2996928944391797, 0.10720760458181891, 0.4448811306448063],
[-0.8371185783490869, 0.2996934649760026, 0.1072060096645597, 0.4448855856569007],
[-0.8371162107293473, 0.2996940355045328, 0.10720441474371896, 0.44489004065791765],
[-0.8371138430875174, 0.2996946060241849, 0.1072028198209324, 0.44489449564328926],
[-0.8371114754203602, 0.2996951765357392, 0.10720122489401934, 0.44489895061910595],
[-0.8371091077303039, 0.29969574703861046, 0.10719962996461516, 0.4449034055807993]],
'AngularVelocity': [[3.16238646979841e-05, -2.880432898124293e-05, 5.6520131658726165e-05],
[3.1623864697983686e-05, -2.880432898124763e-05, 5.652013165872402e-05],
[3.162386469798325e-05, -2.880432898125237e-05, 5.652013165872185e-05],
[3.162386469798283e-05, -2.880432898125708e-05, 5.6520131658719694e-05],
[3.1623864697982405e-05, -2.8804328981261782e-05, 5.6520131658717505e-05],
[3.162386469798195e-05, -2.88043289812665e-05, 5.652013165871536e-05]]},
'InstrumentPosition': {'SpkTableStartTime': 297088762.24158406,
'SpkTableEndTime': 297088762.9923841,
'SpkTableOriginalSize': 6,
'EphemerisTimes': [297088762.24158406, 297088762.3917441, 297088762.5419041, 297088762.69206405, 297088762.84222406, 297088762.9923841],
'Positions': [[-1885.29806756, 913.1652236, -2961.966828],
[-1885.59280128, 912.7436266, -2961.91056824],
[-1885.88749707, 912.32201117, -2961.85424884],
[-1886.18215477, 911.90037749, -2961.79786985],
[-1886.47677475, 911.47872522, -2961.7414312],
[-1886.77135665, 911.05705456, -2961.68493293]],
'Velocities': [[-1.9629237646703683, -2.80759072221274, 0.37446657801485306],
[-1.9626712192798401, -2.807713482051373, 0.3748636774173111],
[-1.9624186346660286, -2.807836185534424, 0.3752607691067297],
[-1.9621660109346446, -2.8079588326107823, 0.37565785291714804],
[-1.9619133478903363, -2.8080814233753033, 0.37605492915558875],
[-1.961660645638678, -2.8082039577768683, 0.37645199765665144]]},
'SunPosition': {'SpkTableStartTime': 297088762.61698407,
'SpkTableEndTime': 297088762.61698407,
'SpkTableOriginalSize': 1,
'EphemerisTimes': [297088762.61698407],
'Positions': [[-208246643.00357282, -7677078.093689713, 2103553.070434019]],
'Velocities': [[-0.21020163267146563, -23.901883517440407, -10.957471339412034]]}}
@pytest.fixture(scope='module') @pytest.fixture(scope='module')
def test_kernels(): def test_kernels():
...@@ -290,24 +24,17 @@ def test_kernels(): ...@@ -290,24 +24,17 @@ def test_kernels():
os.remove(kern) os.remove(kern)
@pytest.mark.parametrize("label_type", ['pds3', 'isis3']) @pytest.mark.parametrize("label_type", ['pds3', 'isis3'])
@pytest.mark.parametrize("formatter", ['isis', 'usgscsm']) def test_mro_load(test_kernels, label_type):
def test_mro_load(test_kernels, label_type, formatter, usgscsm_compare_dict, isis_compare_dict):
label_file = get_image_label('B10_013341_1010_XN_79S172W', label_type) label_file = get_image_label('B10_013341_1010_XN_79S172W', label_type)
usgscsm_isd_str = ale.loads(label_file, props={'kernels': test_kernels}, formatter=formatter) isd_str = ale.loads(label_file, props={'kernels': test_kernels})
usgscsm_isd_obj = json.loads(usgscsm_isd_str) isd_obj = json.loads(isd_str)
print(json.dumps(usgscsm_isd_obj, indent=4))
if formatter=='usgscsm': compare_isd = get_isd('ctx')
# Check to change the line based on ISIS vs PDS3
# This is due to a processing step in mroctx2isis that removes samples
# based on some flags on the label
if label_type == 'isis3': if label_type == 'isis3':
usgscsm_compare_dict['image_samples'] = 5000 compare_isd['image_samples'] = 5000
assert compare_dicts(usgscsm_isd_obj, usgscsm_compare_dict) == []
else: assert compare_dicts(isd_obj, compare_isd) == []
assert compare_dicts(usgscsm_isd_obj, isis_compare_dict) == []
# ========= Test isislabel and isisspice driver ========= # ========= Test isislabel and isisspice driver =========
class test_isis_isis(unittest.TestCase): class test_isis_isis(unittest.TestCase):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment