From 90acc9b09fcd1ccea85cc7073680fc2b8915afd5 Mon Sep 17 00:00:00 2001
From: jlaura <jlaura@usgs.gov>
Date: Sun, 12 Jul 2020 09:41:22 -0700
Subject: [PATCH] Supports covar when some are empty (#148)

* Supports covar when some are empty

* Adds tests for aprioriCovar
---
 plio/io/io_controlnetwork.py            |  4 ++--
 plio/io/tests/test_io_controlnetwork.py | 32 +++++++++++++++----------
 2 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/plio/io/io_controlnetwork.py b/plio/io/io_controlnetwork.py
index 28a6cc2..1dc4d22 100644
--- a/plio/io/io_controlnetwork.py
+++ b/plio/io/io_controlnetwork.py
@@ -348,8 +348,8 @@ class IsisStore(object):
                         arr = g.iloc[0][df_attr]
                         if isinstance(arr, np.ndarray):
                             arr = arr.ravel().tolist()
-
-                        point_spec.aprioriCovar.extend(arr)
+                        if arr:
+                            point_spec.aprioriCovar.extend(arr)
                     # If field is repeated you must extend instead of assign
                     elif cnf._CONTROLPOINTFILEENTRYV0002.fields_by_name[attr].label == 3:
                         getattr(point_spec, attr).extend(g.iloc[0][df_attr])
diff --git a/plio/io/tests/test_io_controlnetwork.py b/plio/io/tests/test_io_controlnetwork.py
index 791d308..7c4f23c 100644
--- a/plio/io/tests/test_io_controlnetwork.py
+++ b/plio/io/tests/test_io_controlnetwork.py
@@ -4,6 +4,7 @@ import unittest
 from time import strftime, gmtime
 
 import pandas as pd
+import numpy as np
 import pvl
 
 from plio.io import io_controlnetwork
@@ -69,15 +70,20 @@ def cnet_dataframe(tmpdir):
     serial_times = {295: '1971-07-31T01:24:11.754',
                     296: '1971-07-31T01:24:36.970'}
     serials = {i:'APOLLO15/METRIC/{}'.format(j) for i, j in enumerate(serial_times.values())}
-    columns = ['id', 'pointType', 'serialnumber', 'measureType', 'sample', 'line', 'image_index', 'pointLog', 'measureLog']
+    columns = ['id', 'pointType', 'serialnumber', 'measureType',
+               'sample', 'line', 'image_index', 'pointLog', 'measureLog',
+               'aprioriCovar']
 
     data = []
     for i in range(npts):
-        data.append((i, 2, serials[0], 2, 0, 0, 0, [], []))
-        data.append((i, 2, serials[1], 2, 0, 0, 1, [], [io_controlnetwork.MeasureLog(2, 0.5)]))
+        aprioriCovar = None
+        if i == npts - 1:
+            aprioriCovar = np.ones((2,3))
+        data.append((i, 2, serials[0], 2, 0, 0, 0, [], [], aprioriCovar))
+        data.append((i, 2, serials[1], 2, 0, 0, 1, [], [io_controlnetwork.MeasureLog(2, 0.5)],aprioriCovar))
 
     df = pd.DataFrame(data, columns=columns)
-
+    
     df.creation_date = strftime("%Y-%m-%d %H:%M:%S", gmtime())
     df.modified_date = strftime("%Y-%m-%d %H:%M:%S", gmtime())
     io_controlnetwork.to_isis(df, tmpdir.join('test.net'), mode='wb', targetname='Moon')
@@ -85,9 +91,9 @@ def cnet_dataframe(tmpdir):
     df.header_message_size = 78
     df.point_start_byte = 65614 # 66949
     df.npts = npts
-    df.measure_size = 149  # Size of each measure in bytes
+    df.measure_size = [149, 149, 149, 149, 200]  # Size of each measure in bytes
     df.serials = serials
-    return df
+    return df 
 
 def test_create_buffer_header(cnet_dataframe, tmpdir):
     with open(tmpdir.join('test.net'), 'rb') as f:
@@ -104,22 +110,23 @@ def test_create_buffer_header(cnet_dataframe, tmpdir):
         assert 'None' == header_protocol.description
         assert cnet_dataframe.modified_date == header_protocol.lastModified
         #Repeating
-        assert [cnet_dataframe.measure_size] * cnet_dataframe.npts == header_protocol.pointMessageSizes
+        assert cnet_dataframe.measure_size == header_protocol.pointMessageSizes
 
 def test_create_point(cnet_dataframe, tmpdir):
     with open(tmpdir.join('test.net'), 'rb') as f:
         f.seek(cnet_dataframe.point_start_byte)
-        for i, length in enumerate([cnet_dataframe.measure_size] * cnet_dataframe.npts):
+        for i, length in enumerate(cnet_dataframe.measure_size):
             point_protocol = cnf.ControlPointFileEntryV0002()
             raw_point = f.read(length)
             point_protocol.ParseFromString(raw_point)
             assert str(i) == point_protocol.id
             assert 2 == point_protocol.type
-            print(len(point_protocol.measures))
-            for i, m in enumerate(point_protocol.measures):
+            if i == cnet_dataframe.npts - 1:
+                assert point_protocol.aprioriCovar == [1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
+            for j, m in enumerate(point_protocol.measures):
                 assert m.serialnumber in cnet_dataframe.serials.values()
                 assert 2 == m.type
-                assert len(m.log) == i
+                assert len(m.log) == j  # Only the second measure has a message
 
 def test_create_pvl_header(cnet_dataframe, tmpdir):
     with open(tmpdir.join('test.net'), 'rb') as f:
@@ -132,8 +139,7 @@ def test_create_pvl_header(cnet_dataframe, tmpdir):
     assert 10 == mpoints
 
     points_bytes = find_in_dict(pvl_header, 'PointsBytes')
-    assert 745 == points_bytes
+    assert 796 == points_bytes
 
     points_start_byte = find_in_dict(pvl_header, 'PointsStartByte')
     assert cnet_dataframe.point_start_byte == points_start_byte
-
-- 
GitLab