Skip to content

Commit bc8e997

Browse files
committed
fix unexpected message layout in nexrad level2 reader
1 parent bb840f8 commit bc8e997

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

xradar/io/backends/nexrad_level2.py

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ def get_ldm(recnum):
318318
dec.decompress(compressed), dtype=np.uint8
319319
)
320320

321-
# rectrieve wanted record and put into self.rh
321+
# retrieve wanted record and put into self.rh
322322
if recnum < 134:
323323
start = recnum * RECORD_BYTES
324324
if not self.is_compressed:
@@ -540,8 +540,8 @@ def get_metadata_header(self):
540540
meta_headers = defaultdict(list)
541541
rec = 0
542542
# iterate over alle messages until type outside [2, 3, 5, 13, 15, 18, 32]
543-
while True:
544-
self.init_record(rec)
543+
544+
while self.init_record(rec):
545545
rec += 1
546546
filepos = self.filepos
547547
message_header = self.get_message_header()
@@ -559,7 +559,11 @@ def get_metadata_header(self):
559559
def get_msg_5_data(self):
560560
"""Get MSG5 data."""
561561
# get the record number from the meta header
562-
recnum = self.meta_header["msg_5"][0]["record_number"]
562+
# return False, if no msg_5 data is available
563+
if self.meta_header["msg_5"]:
564+
recnum = self.meta_header["msg_5"][0]["record_number"]
565+
else:
566+
return False
563567
self.init_record(recnum)
564568
# skip header
565569
self.rh.pos += LEN_MSG_HEADER + 12
@@ -630,7 +634,11 @@ def get_data_header(self):
630634
# get the record number from the meta header
631635
# message 2 is the last meta header, after which the
632636
# data records are located
633-
recnum = self.meta_header["msg_2"][0]["record_number"]
637+
if self.is_compressed:
638+
recnum = self.meta_header["msg_2"][0]["record_number"]
639+
else:
640+
# iterate over all records to retrieve data
641+
recnum = 0
634642
self.init_record(recnum)
635643
current_sweep = -1
636644
current_header = -1
@@ -1480,7 +1488,10 @@ def open_store_coordinates(self):
14801488
prt_mode = "not_set"
14811489
follow_mode = "not_set"
14821490

1483-
elev_data = self.root.msg_5["elevation_data"]
1491+
if self.root.msg_5:
1492+
elev_data = self.root.msg_5["elevation_data"]
1493+
else:
1494+
elev_data = False
14841495
# in some cases msg_5 doesn't contain meaningful data
14851496
# we extract the needed values from the data header instead
14861497
if elev_data:
@@ -1523,8 +1534,11 @@ def get_variables(self):
15231534
def get_attrs(self):
15241535
_attributes = [
15251536
("instrument_name", self.root.volume_header["icao"].decode()),
1526-
("scan_name", f"VCP-{self.root.msg_5['pattern_number']}"),
15271537
]
1538+
if self.root.msg_5:
1539+
_attributes.append(
1540+
("scan_name", f"VCP-{self.root.msg_5['pattern_number']}")
1541+
)
15281542

15291543
return FrozenDict(_attributes)
15301544

@@ -1721,7 +1735,10 @@ def open_nexradlevel2_datatree(
17211735
else:
17221736
with NEXRADLevel2File(filename_or_obj, loaddata=False) as nex:
17231737
# Expected number of elevation cuts from the VCP definition
1724-
exp_sweeps = nex.msg_5["number_elevation_cuts"]
1738+
if nex.msg_5:
1739+
exp_sweeps = nex.msg_5["number_elevation_cuts"]
1740+
else:
1741+
exp_sweeps = 0
17251742
# Actual number of sweeps recorded in the file
17261743
act_sweeps = len(nex.msg_31_data_header)
17271744
# Check for AVSET mode: If AVSET was active, the actual number of sweeps (act_sweeps)

0 commit comments

Comments
 (0)