diff --git a/plio/camera/__init__.py b/plio/camera/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/plio/camera/csm.py b/plio/camera/csm.py new file mode 100644 index 0000000000000000000000000000000000000000..b555efc6f23a08a40f25835a0fe2e6960a4e6ff6 --- /dev/null +++ b/plio/camera/csm.py @@ -0,0 +1,44 @@ +import datetime +import json + +try: + import usgscam as cam + from cycsm.isd import Isd + camera_support = True +except: + camera_support = False +import requests + +from plio.utils.utils import find_in_dict +from plio.io.io_json import NumpyEncoder + + +def data_from_cube(header): + data = {} + data['START_TIME'] = find_in_dict(header, 'StartTime') + data['SPACECRAFT_NAME'] = find_in_dict(header, 'SpacecraftName') + data['INSTRUMENT_NAME'] = find_in_dict(header, 'InstrumentId') + data['SAMPLING_FACTOR'] = find_in_dict(header, 'SpatialSumming') + data['SAMPLE_FIRST_PIXEL'] = find_in_dict(header, 'SampleFirstPixel') + data['IMAGE'] = {} + data['IMAGE']['LINES'] = find_in_dict(header, 'Lines') + data['IMAGE']['SAMPLES'] = find_in_dict(header, 'Samples') + data['TARGET_NAME'] = find_in_dict(header, 'TargetName') + data['LINE_EXPOSURE_DURATION'] = find_in_dict(header, 'LineExposureDuration') + data['SPACECRAFT_CLOCK_START_COUNT'] = find_in_dict(header, 'SpacecraftClockCount') + return data + +def create_camera(obj, url='http://smalls:8002/api/1.0/missions/mars_reconnaissance_orbiter/csm_isd'): + if not camera_support: + print("Usgscam library not installed. Camera capabilities are disabled") + + data = json.dumps(data_from_cube(obj.metadata), cls=NumpyEncoder) + r = requests.post(url, data=data) + + # Get the ISD back and instantiate a local ISD for the image + isd = r.json()['data']['isd'] + i = Isd.loads(isd) + + # Create the plugin and camera as usual + plugin = cam.genericls.Plugin() + return plugin.from_isd(i, plugin.modelname(0)) \ No newline at end of file diff --git a/plio/camera/tests/__init__.py b/plio/camera/tests/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/plio/camera/tests/test_csm.py b/plio/camera/tests/test_csm.py new file mode 100644 index 0000000000000000000000000000000000000000..ce6cf12db5744def7593b0effe083b54fd5cd408 --- /dev/null +++ b/plio/camera/tests/test_csm.py @@ -0,0 +1,45 @@ +import datetime +import json +from unittest import mock + +import pytest +import pvl + +import usgscam + +from plio.camera import csm +from plio.examples import get_path + +def mock_requests_post(*args, **kwargs): + class MockResponse: + def __init__(self, json_data, status_code): + self.json_data = json_data + self.status_code = status_code + + def json(self): + return self.json_data + + if 'mars_reconnaissance_orbiter' in args[0]: + with open(get_path('ctx.response'), 'r') as f: + resp = json.load(f) + return MockResponse(resp, 200) + + return MockResponse(None, 404) + + +@pytest.fixture +def header(): + return pvl.load(get_path('ctx.pvl')) + +@pytest.fixture +def req_obj(): + return + +def test_data_from_cube(header): + data = csm.data_from_cube(header) + assert data['START_TIME'] == datetime.datetime(2008, 9, 17, 5, 8, 10, 820000) + +@mock.patch('requests.post', side_effect=mock_requests_post) +def test_create_camera(header): + cam = csm.create_camera(header) + assert isinstance(cam, usgscam.genericls.SensorModel)