From 3cac5d912e6c7ab02049d9672a31ce2338677d60 Mon Sep 17 00:00:00 2001 From: Jay <jlaura@usgs.gov> Date: Mon, 2 Jul 2018 20:01:10 -0700 Subject: [PATCH] Adds CSM cameras --- plio/camera/__init__.py | 0 plio/camera/csm.py | 44 ++++++++++++++++++++++++++++++++++ plio/camera/tests/__init__.py | 0 plio/camera/tests/test_csm.py | 45 +++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 plio/camera/__init__.py create mode 100644 plio/camera/csm.py create mode 100644 plio/camera/tests/__init__.py create mode 100644 plio/camera/tests/test_csm.py diff --git a/plio/camera/__init__.py b/plio/camera/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/plio/camera/csm.py b/plio/camera/csm.py new file mode 100644 index 0000000..b555efc --- /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 0000000..e69de29 diff --git a/plio/camera/tests/test_csm.py b/plio/camera/tests/test_csm.py new file mode 100644 index 0000000..ce6cf12 --- /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) -- GitLab