Commit 9227329f authored by Jesse Mapel's avatar Jesse Mapel Committed by jlaura
Browse files

Adds capability to read ISIS v5 binary control networks (#101)

* Added V5 protobuf files

* First pass at v5 control network reader

* parameterized cnet read test
parent f970c7ed
Loading
Loading
Loading
Loading
+249 KiB

File added.

No diff preview for this file type.

+119 −0
Original line number Diff line number Diff line
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: ControlNetFileHeaderV0005.proto

import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()




DESCRIPTOR = _descriptor.FileDescriptor(
  name='ControlNetFileHeaderV0005.proto',
  package='Isis',
  syntax='proto2',
  serialized_options=None,
  serialized_pb=_b('\n\x1f\x43ontrolNetFileHeaderV0005.proto\x12\x04Isis\"\xb8\x01\n\x19\x43ontrolNetFileHeaderV0005\x12\x11\n\tnetworkId\x18\x01 \x02(\t\x12\x12\n\ntargetName\x18\x02 \x02(\t\x12\x0f\n\x07\x63reated\x18\x03 \x01(\t\x12\x14\n\x0clastModified\x18\x04 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x05 \x01(\t\x12\x10\n\x08userName\x18\x06 \x01(\t\x12\x11\n\tnumPoints\x18\x07 \x01(\x05\x12\x13\n\x0btargetRadii\x18\n \x03(\x01')
)




_CONTROLNETFILEHEADERV0005 = _descriptor.Descriptor(
  name='ControlNetFileHeaderV0005',
  full_name='Isis.ControlNetFileHeaderV0005',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='networkId', full_name='Isis.ControlNetFileHeaderV0005.networkId', index=0,
      number=1, type=9, cpp_type=9, label=2,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='targetName', full_name='Isis.ControlNetFileHeaderV0005.targetName', index=1,
      number=2, type=9, cpp_type=9, label=2,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='created', full_name='Isis.ControlNetFileHeaderV0005.created', index=2,
      number=3, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='lastModified', full_name='Isis.ControlNetFileHeaderV0005.lastModified', index=3,
      number=4, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='description', full_name='Isis.ControlNetFileHeaderV0005.description', index=4,
      number=5, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='userName', full_name='Isis.ControlNetFileHeaderV0005.userName', index=5,
      number=6, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='numPoints', full_name='Isis.ControlNetFileHeaderV0005.numPoints', index=6,
      number=7, type=5, cpp_type=1, label=1,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='targetRadii', full_name='Isis.ControlNetFileHeaderV0005.targetRadii', index=7,
      number=10, type=1, cpp_type=5, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=42,
  serialized_end=226,
)

DESCRIPTOR.message_types_by_name['ControlNetFileHeaderV0005'] = _CONTROLNETFILEHEADERV0005
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

ControlNetFileHeaderV0005 = _reflection.GeneratedProtocolMessageType('ControlNetFileHeaderV0005', (_message.Message,), dict(
  DESCRIPTOR = _CONTROLNETFILEHEADERV0005,
  __module__ = 'ControlNetFileHeaderV0005_pb2'
  # @@protoc_insertion_point(class_scope:Isis.ControlNetFileHeaderV0005)
  ))
_sym_db.RegisterMessage(ControlNetFileHeaderV0005)


# @@protoc_insertion_point(module_scope)
+634 −0

File added.

Preview size limit exceeded, changes collapsed.

+43 −16
Original line number Diff line number Diff line
@@ -3,8 +3,11 @@ from time import gmtime, strftime
import pandas as pd
import numpy as np
import pvl
import struct

from plio.io import ControlNetFileV0002_pb2 as cnf
from plio.io import ControlNetFileHeaderV0005_pb2 as cnh5
from plio.io import ControlPointFileEntryV0005_pb2 as cnp5
from plio.utils.utils import xstr, find_in_dict

HEADERSTARTBYTE = 65536
@@ -192,8 +195,6 @@ class IsisStore(object):
            self.point_attrs = [i for i in cnf._CONTROLPOINTFILEENTRYV0002.fields_by_name if i != 'measures']
            self.measure_attrs = [i for i in cnf._CONTROLPOINTFILEENTRYV0002_MEASURE.fields_by_name]

        cols = self.point_attrs + self.measure_attrs

            cp = cnf.ControlPointFileEntryV0002()
            self._handle.seek(header_start_byte)
            pbuf_header = cnf.ControlNetFileHeaderV0002()
@@ -209,6 +210,32 @@ class IsisStore(object):
                for measure in cp.measures:
                    meas = pt + [getattr(measure, j) for j in self.measure_attrs]
                    pts.append(meas)

        elif version == 5:
            self.point_attrs = [i for i in cnp5._CONTROLPOINTFILEENTRYV0005.fields_by_name if i != 'measures']
            self.measure_attrs = [i for i in cnp5._CONTROLPOINTFILEENTRYV0005_MEASURE.fields_by_name]

            cp = cnp5.ControlPointFileEntryV0005()
            self._handle.seek(header_start_byte)
            pbuf_header = cnh5.ControlNetFileHeaderV0005()
            pbuf_header.ParseFromString(self._handle.read(header_bytes))

            self._handle.seek(point_start_byte)
            cp = cnp5.ControlPointFileEntryV0005()
            pts = []
            byte_count = 0;
            while byte_count < find_in_dict(pvl_header, 'PointsBytes'):
                message_size = struct.unpack('I', self._handle.read(4))[0]
                cp.ParseFromString(self._handle.read(message_size))
                pt = [getattr(cp, i) for i in self.point_attrs if i != 'measures']

                for measure in cp.measures:
                    meas = pt + [getattr(measure, j) for j in self.measure_attrs]
                    pts.append(meas)

                byte_count += 4 + message_size

        cols = self.point_attrs + self.measure_attrs
        df = IsisControlNetwork(pts, columns=cols)
        df.header = pvl_header
        return df
+5 −7
Original line number Diff line number Diff line
@@ -14,15 +14,13 @@ from plio.examples import get_path

import pytest

@pytest.fixture
def apollo_cnet():
    return get_path('apollo_out.net')

sys.path.insert(0, os.path.abspath('..'))


def test_cnet_read(apollo_cnet):
    df = io_controlnetwork.from_isis(apollo_cnet)
@pytest.mark.parametrize('cnet_file',
                         (get_path('apollo_out.net'), get_path('apollo_out_v5.net'))
)
def test_cnet_read(cnet_file):
    df = io_controlnetwork.from_isis(cnet_file)
    assert len(df) == find_in_dict(df.header, 'NumberOfMeasures')
    assert isinstance(df, io_controlnetwork.IsisControlNetwork)
    assert len(df.groupby('id')) == find_in_dict(df.header, 'NumberOfPoints')