Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions metpy/io/nexrad.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
exporter = Exporter(globals())

log = logging.getLogger("metpy.io.nexrad")
log.addHandler(logging.StreamHandler()) # Python 2.7 needs a handler set
log.setLevel(logging.WARNING)


Expand Down Expand Up @@ -241,6 +242,11 @@ def _read_data(self):
self._buffer.jump_to(msg_start,
self.CTM_HEADER_SIZE + 2 * msg_hdr.size_hw)

# Check if we have any message segments still in the buffer
if self._msg_buf:
log.warning('Remaining buffered messages segments for message type(s): %s',
' '.join(map(str, self._msg_buf.keys())))

del self._msg_buf

msg1_fmt = NamedStruct([('time_ms', 'L'), ('date', 'H'),
Expand Down Expand Up @@ -588,10 +594,19 @@ def _decode_msg31(self, msg_hdr):

def _buffer_segment(self, msg_hdr):
# Add to the buffer
bufs = self._msg_buf.setdefault(msg_hdr.msg_type, bytearray())
bufs.extend(self._buffer.read(2 * msg_hdr.size_hw - self.msg_hdr_fmt.size))
if msg_hdr.segment_num == msg_hdr.num_segments:
return bufs
bufs = self._msg_buf.setdefault(msg_hdr.msg_type, dict())
bufs[msg_hdr.segment_num] = self._buffer.read(2 * msg_hdr.size_hw -
self.msg_hdr_fmt.size)

# Warn for badly formatted data
if len(bufs) != msg_hdr.segment_num:
log.warning('Segment out of order (Got: %d Count: %d) for message type %d.',
msg_hdr.segment_num, len(bufs), msg_hdr.msg_type)

# If we're complete, return the full collection of data
if msg_hdr.num_segments == len(bufs):
self._msg_buf.pop(msg_hdr.msg_type)
return b''.join(bytes(item[1]) for item in sorted(bufs.items()))

def _add_sweep(self, hdr):
if not self.sweeps and not hdr.rad_status & START_VOLUME:
Expand Down
7 changes: 6 additions & 1 deletion metpy/io/tests/test_nexrad.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import glob
import logging
import os.path

import numpy as np
Expand All @@ -9,6 +10,9 @@

get_test_data = nose.tools.nottest(get_test_data)

# Turn off the warnings for tests
logging.getLogger("metpy.io.nexrad").setLevel(logging.CRITICAL)


def test_level3_generator():
datadir = get_test_data('nids', as_file_obj=False)
Expand All @@ -21,8 +25,9 @@ def read_level3_file(fname):

# 1999 file tests old message 1
# KFTG tests bzip compression and newer format for a part of message 31
# KTLX 2015 has missing segments for message 18, which was causing exception
level2_files = ['KTLX20130520_201643_V06.gz', 'KTLX19990503_235621.gz',
'Level2_KFTG_20150430_1419.ar2v']
'Level2_KFTG_20150430_1419.ar2v', 'KTLX20150530_000802_V06.bz2']


def test_level2_generator():
Expand Down
3 changes: 2 additions & 1 deletion metpy/io/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ def __call__(self, val):
if not val:
break

return l if len(l) > 1 else l[0]
# Return whole list if empty or multiple items, otherwise just single item
return l[0] if len(l) == 1 else l


class Array(object):
Expand Down
Binary file added testdata/KTLX20150530_000802_V06.bz2
Binary file not shown.