Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Anticipate filehandler sorting in GEOSegmentYAMLReader to have sorted handlers also with pad_data=False #2692

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
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