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