def to_protobuf(self, version=2): """ Return protobuf compliant measure log object representation of this class. Returns ------- log_message : obj MeasureLogData object suitable to append to a MeasureLog repeated field. """ # I do not see a better way to get to the inner MeasureLogData obj than this # imports were not working because it looks like these need to instantiate off # an object if version == 2: log_message = cnf.ControlPointFileEntryV0002().Measure( ).MeasureLogData() elif version == 5: log_message = cnp5.ControlPointFileEntryV0005().Measure( ).MeasureLogData() log_message.doubleDataValue = self.value log_message.doubleDataType = self.messagetype return log_message
def read(self): """ Given an ISIS store, read the underlying ISIS3 compatible control network and return an IsisControlNetwork dataframe. """ pvl_header = pvl.load(self._path) header_start_byte = find_in_dict(pvl_header, 'HeaderStartByte') header_bytes = find_in_dict(pvl_header, 'HeaderBytes') point_start_byte = find_in_dict(pvl_header, 'PointsStartByte') version = find_in_dict(pvl_header, 'Version') if version == 2: 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 ] cp = cnf.ControlPointFileEntryV0002() self._handle.seek(header_start_byte) pbuf_header = cnf.ControlNetFileHeaderV0002() pbuf_header.ParseFromString(self._handle.read(header_bytes)) self._handle.seek(point_start_byte) cp = cnf.ControlPointFileEntryV0002() pts = [] for s in pbuf_header.pointMessageSizes: cp.ParseFromString(self._handle.read(s)) 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) 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 # Some point and measure fields have the same name, so mangle them as point_ and measure_ point_cols = [ self.point_field_map[attr] if attr in self.point_field_map else attr for attr in self.point_attrs ] measure_cols = [ self.measure_field_map[attr] if attr in self.measure_field_map else attr for attr in self.measure_attrs ] cols = point_cols + measure_cols df = IsisControlNetwork(pts, columns=cols) # Convert the (0.5, 0.5) origin pixels back to (0,0) pixels df['line'] -= 0.5 df['sample'] -= 0.5 df.header = pvl_header return df
def read(self): """ Given an ISIS store, read the underlying ISIS3 compatible control network and return an IsisControlNetwork dataframe. """ pvl_header = pvl.load(self._path) header_start_byte = find_in_dict(pvl_header, 'HeaderStartByte') header_bytes = find_in_dict(pvl_header, 'HeaderBytes') point_start_byte = find_in_dict(pvl_header, 'PointsStartByte') version = find_in_dict(pvl_header, 'Version') if version == 2: 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 ] cp = cnf.ControlPointFileEntryV0002() self._handle.seek(header_start_byte) pbuf_header = cnf.ControlNetFileHeaderV0002() pbuf_header.ParseFromString(self._handle.read(header_bytes)) self._handle.seek(point_start_byte) cp = cnf.ControlPointFileEntryV0002() pts = [] for s in pbuf_header.pointMessageSizes: cp.ParseFromString(self._handle.read(s)) 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) 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 self.point_attrs = [ i if i != 'jigsawRejected' else 'pointJigsawRejected' for i in self.point_attrs ] cols = self.point_attrs + self.measure_attrs cols = self.point_attrs + self.measure_attrs df = IsisControlNetwork(pts, columns=cols) df.header = pvl_header return df