Skip to content

Commit

Permalink
Merge pull request #2692 from ameraner/bugfix_add_filehandler_sorting…
Browse files Browse the repository at this point in the history
…_with_paddata_false
  • Loading branch information
mraspaud authored Dec 15, 2023
2 parents 7d1810b + 36aa471 commit eed1c1c
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 9 deletions.
22 changes: 17 additions & 5 deletions satpy/readers/yaml_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -1157,7 +1157,13 @@ class GEOSegmentYAMLReader(GEOFlippableFileYAMLReader):
"""

def create_filehandlers(self, filenames, fh_kwargs=None):
"""Create file handler objects and determine expected segments for each."""
"""Create file handler objects and determine expected segments for each.
Additionally, sort the filehandlers by segment number to avoid
issues with filenames where start_time or alphabetic sorting does not
produce the correct order.
"""
created_fhs = super(GEOSegmentYAMLReader, self).create_filehandlers(
filenames, fh_kwargs=fh_kwargs)

Expand All @@ -1171,8 +1177,16 @@ def create_filehandlers(self, filenames, fh_kwargs=None):
# add segment key-values for FCI filehandlers
if "segment" not in fh.filename_info:
fh.filename_info["segment"] = fh.filename_info.get("count_in_repeat_cycle", 1)

self._sort_segment_filehandler_by_segment_number()
return created_fhs

def _sort_segment_filehandler_by_segment_number(self):
if hasattr(self, "file_handlers"):
for file_type in self.file_handlers.keys():
self.file_handlers[file_type] = sorted(self.file_handlers[file_type],
key=lambda x: x.filename_info.get("segment", 0))

def _load_dataset(self, dsid, ds_info, file_handlers, dim="y", pad_data=True):
"""Load only a piece of the dataset."""
if not pad_data:
Expand Down Expand Up @@ -1322,11 +1336,9 @@ def _find_missing_segments(file_handlers, ds_info, dsid):
failure = True
counter = 1
expected_segments = 1
# get list of file handlers in segment order
# (ex. first segment, second segment, etc)
handlers = sorted(file_handlers, key=lambda x: x.filename_info.get("segment", 1))

projectable = None
for fh in handlers:
for fh in file_handlers:
if fh.filetype_info["file_type"] in ds_info["file_type"]:
expected_segments = fh.filetype_info["expected_segments"]

Expand Down
35 changes: 31 additions & 4 deletions satpy/tests/test_yaml_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -971,10 +971,11 @@ def _create_mocked_fh_and_areadef(aex, ashape, expected_segments, segment, chk_p
get_segment_position_info = MagicMock()
get_segment_position_info.return_value = chk_pos_info

fh = MagicMock()
filetype_info = {"expected_segments": expected_segments,
"file_type": "filetype1"}
filename_info = {"segment": segment}

fh = _create_mocked_basic_fh()
fh.filetype_info = filetype_info
fh.filename_info = filename_info
fh.get_area_def = get_area_def
Expand All @@ -983,6 +984,12 @@ def _create_mocked_fh_and_areadef(aex, ashape, expected_segments, segment, chk_p
return fh, seg_area


def _create_mocked_basic_fh():
fake_fh = MagicMock()
fake_fh.filename_info = {}
fake_fh.filetype_info = {}
return fake_fh

class TestGEOSegmentYAMLReader(unittest.TestCase):
"""Test GEOSegmentYAMLReader."""

Expand All @@ -993,9 +1000,7 @@ def test_get_expected_segments(self, cfh):
from satpy.readers.yaml_reader import GEOSegmentYAMLReader
reader = GEOSegmentYAMLReader()

fake_fh = MagicMock()
fake_fh.filename_info = {}
fake_fh.filetype_info = {}
fake_fh = _create_mocked_basic_fh()
cfh.return_value = {"ft1": [fake_fh]}

# default (1)
Expand Down Expand Up @@ -1030,6 +1035,28 @@ def test_get_expected_segments(self, cfh):
es = created_fhs["ft1"][0].filename_info["segment"]
assert es == 5

@patch.object(yr.FileYAMLReader, "__init__", lambda x: None)
@patch.object(yr.FileYAMLReader, "create_filehandlers")
def test_segments_sorting(self, cfh):
"""Test that segment filehandlers are sorted by segment number."""
from satpy.readers.yaml_reader import GEOSegmentYAMLReader
reader = GEOSegmentYAMLReader()

# create filehandlers with different segment numbers
fake_fh_1 = _create_mocked_basic_fh()
fake_fh_1.filename_info["segment"] = 1
fake_fh_2 = _create_mocked_basic_fh()
fake_fh_2.filename_info["segment"] = 2
fake_fh_3 = _create_mocked_basic_fh()
fake_fh_3.filename_info["segment"] = 3

# put the filehandlers in an unsorted order
reader.file_handlers = {"ft1": [fake_fh_1, fake_fh_3, fake_fh_2]}

# check that the created filehandlers are sorted by segment number
reader.create_filehandlers(["fake.nc"])
assert [fh.filename_info["segment"] for fh in reader.file_handlers["ft1"]] == [1, 2, 3]

@patch.object(yr.FileYAMLReader, "__init__", lambda x: None)
@patch("satpy.readers.yaml_reader.FileYAMLReader._load_dataset")
@patch("satpy.readers.yaml_reader.xr")
Expand Down

0 comments on commit eed1c1c

Please sign in to comment.