Skip to content

Commit

Permalink
BUG: Fix parsing message 13 in NEXRAD
Browse files Browse the repository at this point in the history
Commit f021338 refactored the offset handling, but left an
off-by-one error. This produced some warnings, but they were not
caught--so now add to the tests to check the amount of warnings that get
spit out.
  • Loading branch information
dopplershift committed Apr 27, 2021
1 parent 6ff8b8e commit a5f5d8b
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 12 deletions.
3 changes: 2 additions & 1 deletion src/metpy/io/nexrad.py
Original file line number Diff line number Diff line change
Expand Up @@ -459,8 +459,8 @@ def _decode_msg13(self, msg_hdr):
num_az = 360
chunk_size = 32
bit_conv = Bits(16)
offset = 0
for e in range(num_el):
offset = e * num_az * chunk_size
seg_num = data[offset]
if seg_num != (e + 1):
log.warning('Message 13 segments out of sync -- read {} but on {}'.format(
Expand All @@ -473,6 +473,7 @@ def _decode_msg13(self, msg_hdr):
gates.extend(bit_conv(data[offset + i]))
az_data.append(gates)
self.clutter_filter_bypass_map['data'].append(az_data)
offset += num_az * chunk_size + 1

if offset != len(data):
log.warning('Message 13 left data -- Used: %d Avail: %d', offset, len(data))
Expand Down
26 changes: 15 additions & 11 deletions tests/io/test_nexrad.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,28 +23,32 @@

# 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', datetime(2013, 5, 20, 20, 16, 46), 17, 4, 6),
('KTLX19990503_235621.gz', datetime(1999, 5, 3, 23, 56, 21), 16, 1, 3),
# KTLX 20150530 has missing segments for message 18, which was causing exception
# KICX has message type 29 (MDM)
level2_files = [('KTLX20130520_201643_V06.gz', datetime(2013, 5, 20, 20, 16, 46), 17, 4, 6, 0),
('KTLX19990503_235621.gz', datetime(1999, 5, 3, 23, 56, 21), 16, 1, 3, 0),
('Level2_KFTG_20150430_1419.ar2v', datetime(2015, 4, 30, 14, 19, 11),
12, 4, 6),
('KTLX20150530_000802_V06.bz2', datetime(2015, 5, 30, 0, 8, 3), 14, 4, 6),
('KICX_20170712_1458', datetime(2017, 7, 12, 14, 58, 5), 14, 4, 6),
('TDAL20191021021543V08.raw.gz', datetime(2019, 10, 21, 2, 15, 43), 10, 1, 3),
12, 4, 6, 0),
('KTLX20150530_000802_V06.bz2', datetime(2015, 5, 30, 0, 8, 3), 14, 4, 6, 2),
('KICX_20170712_1458', datetime(2017, 7, 12, 14, 58, 5), 14, 4, 6, 1),
('TDAL20191021021543V08.raw.gz', datetime(2019, 10, 21, 2, 15, 43), 10, 1,
3, 0),
('Level2_FOP1_20191223_003655.ar2v', datetime(2019, 12, 23, 0, 36, 55, 649000),
16, 5, 7)]
16, 5, 7, 0)]


# ids here fixes how things are presented in pycharm
@pytest.mark.parametrize('fname, voltime, num_sweeps, mom_first, mom_last', level2_files,
ids=[i[0].replace('.', '_') for i in level2_files])
def test_level2(fname, voltime, num_sweeps, mom_first, mom_last):
@pytest.mark.parametrize('fname, voltime, num_sweeps, mom_first, mom_last, expected_logs',
level2_files, ids=[i[0].replace('.', '_') for i in level2_files])
def test_level2(fname, voltime, num_sweeps, mom_first, mom_last, expected_logs, caplog):
"""Test reading NEXRAD level 2 files from the filename."""
caplog.set_level(logging.WARNING, 'metpy.io.nexrad')
f = Level2File(get_test_data(fname, as_file_obj=False))
assert f.dt == voltime
assert len(f.sweeps) == num_sweeps
assert len(f.sweeps[0][0][-1]) == mom_first
assert len(f.sweeps[-1][0][-1]) == mom_last
assert len(caplog.records) == expected_logs


@pytest.mark.parametrize('filename', ['Level2_KFTG_20150430_1419.ar2v',
Expand Down

0 comments on commit a5f5d8b

Please sign in to comment.