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

Define and calculate composites with temporal dependencies #1748

Open
gerritholl opened this issue Jul 1, 2021 · 29 comments · May be fixed by #2495
Open

Define and calculate composites with temporal dependencies #1748

gerritholl opened this issue Jul 1, 2021 · 29 comments · May be fixed by #2495

Comments

@gerritholl
Copy link
Collaborator

Feature Request

Is your feature request related to a problem? Please describe.

Satpy can calculate composites from datasets within a single Scene. For some use cases, it would be desirable to calculate composites from datasets from multiple scenes, such as multiple time steps in a MultiScene. In nowcasting, the temporal component contains important information for forecasting the near future: rising air parcels may indicate convective initiation, a vertically growing cloud may indicate a rapidly developing thunderstorm, a cloud growing rapidly horizontally may tell us something about the expected lifetime of a convective system, and a rapid increase in lightning density likewise. Currently, it is difficult to build such time-dependent "composites" into Satpy.

Describe the solution you'd like

I would like to be able to define composites that need multiple time steps of a certain variable. Such composites could only be loaded from a MultiScene, or maybe from a blended Scene where the datasets have a time component.

In composites.yaml, we would define what time range or time steps are needed. Maybe a product that needs 6.2 µm and 7.3 µm for the present and the previous scene could be defined as:

prerequisites:
    - wavelength: 6.2
    - wavelength: 6.2
      time: -1
    - wavelength: 7.3
    - wavelength: 7.3
      time: -1

The compositor would be passed four inputs: two from the present scene, and two from the previous scene.

Or a composite that needs the last five minutes of flash extent density:

prerequisites:
    - name: flash_extent_density
      time_from: -5 minutes  # anything understood by `pandas.Timedelta`?
      time_to: 0  # alternative: now

The compositor would be passed a DataArray with a time dimension, containing the last five minutes of flash_extent_density.

Inevitably, there will be time steps, probably the first time steps, where those conditions cannot be met. For those time steps, the composite would be filled with fill values.

Compositors could also reduce the data. If we have a MultiScene with sixty Scenes containing flash_extent_density, one Scene for every minute, the second example above could be used to calculate a running average starting at t=5 minutes. But what if, instead of a running average, we want to get a MultiScene with only 12 scenes, each containing the summed flash_extent_density for a block of 5 minutes? It would be interesting if we could "load" this in Satpy as well, but this has more potential caveats than non-reducing operations. Maybe rather than a .load(...) operation that reduces the number of scenes in the MultiScene, this should have an API that returns a new, reduced MultiScene leaving the original intact.

Describe any changes to existing user workflow

In principle, there should be no backward compatibility concerns, as this concerns a new feature. However, it's possible that it would require such an overhaul of MultiScene and perhaps Scene, that user workflow or existing unit tests would need to be changed. I don't foresee right now what those changes would be.

Additional context

I have code that takes a MultiScene and calculates a value based on the Δ between two subsequent scenes (akin to the first example above), and then manually assigns this to each Scene. That works, but it does not very well fit in the Satpy framework. The Scene class is not really aware of the resulting dataset (see also, for example, #1747), and I cannot define this procedure in a composites file. An even dirtier workaround that would be possible in present satpy is to create a reader that reads multiple time steps and defines datasets such as "BT73_1_minute_ago". That would be a bad solution for various reasons.

See also #1747 and #1469.

@djhoese
Copy link
Member

djhoese commented Jul 1, 2021

I'm very torn about how this could and how this should be implemented. From an xarray point of view the user should probably be in complete control over resampling, especially in time. It seems wrong to put that requirement/specification in something like a composite definition. However, I also see how a user might not know what's best and there should be a logical default and that that default could depend on the algorithm that will be applied.

The other part of this that is difficult is that this request involves a lot of various steps (grouping files, loading datasets, loading composites/composite definitions, temporal resampling/aggregation, time-based requests in composite-like definitions, etc) and it is hard to think of what parts should be something the user directly has control over and what parts are just kind of magically configured in this temporal-composite definition.

So I don't have any real solutions, just wanted to voice my concerns.

@gerritholl
Copy link
Collaborator Author

The user would remain in control. What I'm after is creating the infrastructure for the user to integrate time-dependent products into Satpy.

Today, a user-developer can create a custom Compositor and use that to implement any algorithm that is based on a single Scene. For example, fogpy creates the "composites" fls_day and fls_night, which are really quite complicated algorithms, a long way from a simple RGB image. The fogpy user can then load those products in the form of a composite. I also have products that need two subsequent scenes to be calculated, but I can't easily implement those in a way that ends up in a Scene or MultiScene that still has the full power of those classes. If I have an algorithm that needs 6.2 µm and 7.3 µm at "now" and "T-15 minutes", then I don't think it's wrong to put those specifications in a YAML file. If the user insists on passing other data they can still do that, but then it's a different algorithm.

@djhoese
Copy link
Member

djhoese commented Jul 1, 2021

To clarify, what I meant by user control, instead of something like scn.load(['time_based_composite']) or a similar interface, I would expect us to get to something like this for full flexibility even though it doesn't match the current magic-yaml-knows-everything interface:

mscn = MultiScene(...)
time_dataset = mscn.blend(time_series)
t_resampled_dataset = time_dataset.satpy.resample(method='temporal_average', threshold="T-15", align="left")

result = t_resampled_dataset.satpy.run_algorithm('some_name')
scn = Scene()
scn['my_result'] = result
scn.save_datasets()

This is an extremely bad example for what is probably better and more common practice with xarray objects, but it demonstrates the idea of "hide everything behind a single call" versus "break each step into a separate interface that the user has to control". I realize that this makes trollflow2 stuff harder as well. Maybe these interfaces exist, but are used by temporal composites underneath.

@gerritholl
Copy link
Collaborator Author

I suppose I should have opened two issues, as there are really two related but distinct cases here:

  1. Having a well-defined algorithm that needs data with a certain time range. Those could be defined in YAML-files. The user can of course wish to tweak this, just like they can wish to tweak the recipe of basic RGB composites. They can do that by defining other composites or calling compositors or underlying functions in code.
  2. Doing arbitrary time series management. There's excellent stuff in xarray/pandas already, no need to reinvent the wheel. Here of course the user should be free to choose rules and ranges. We just need to figure out how to interface what already exists in xarray/pandas.

@gerritholl
Copy link
Collaborator Author

This could also be used for "dynamic RGBs", such as R=10.8, G=10.8[t-30 minutes], B=10.8, which might help forecasters as an additional tool (in addition to loops) to highlight areas with (rapid) changes.

@hproe
Copy link

hproe commented May 15, 2023

Taking up the idea of @gerritholl 's 'dynamic RGB' that gives the forecaster the opportunity to judge/measure the evolution of a cloud system, here is a sample image of what it could look like if you assign cloud imagery at t0-2, t0-1,t0 to the R,G,B planes, respectively. The sample (HRV SEVIRI band) shows the evolution of a fog patch (and other low cloud patches) over the Caspian Sea - blue/red is most/least recent position/occurrence of the feature. If the time steps are equally spaced you glean acceleration(deceleration of the system in one go (in the sample the fog appears to move with constant speed while loosing its tail on the way).

2022205280300-0500-0700_HRV

@pnuu
Copy link
Member

pnuu commented May 15, 2023

I added this issue to the PCW 2023 project board.

I think this could be further split to the following sub-tasks:

  • Satpy Multiscene method as described by Dave above, or something similar
  • Trollflow2 plugin for operational use
  • "multi-collector" in pytroll-collectors for grouping and publishing of Scenes separated by N minutes

@gerritholl
Copy link
Collaborator Author

(Continuing the discussion from #2488 here)

True, but the composite loading happens at individual Scenes which have no information about other Scene objects, so the composite handling can't know about the other available time steps. I'll move over the discussion to #1748 for the additional stuff.

Unless we add a way for loading time-dependent composites directly from the MultiScene.

But as @djhoese pointed out, a MultiScene does not have to consist of multiple Scenes with the same area but different timesteps. It can also be multiple Scenes with the same time, but different areas. I keep forgetting that use case because I've never used it.

@pnuu
Copy link
Member

pnuu commented May 23, 2023

Oh, I didn't know that different area possibility!

I'll dig in to how dependencies are loaded/handled currently in Scene. Maybe that can be used here. Passing a "load dataset X if time matches the criteria" kwarg or something.

@djhoese
Copy link
Member

djhoese commented May 23, 2023

@pnuu So you're saying you want a criteria in the dependency loading to pull from the existing DataArrays in the Scene? Or to load time-specific things from readers? My thought was to have the user request the composite and if it detects that the DataArray doesn't have a time dimension it just fails in maybe a way similar to IncompatibleAreas...but resampling isn't going to fix the issue.

@pnuu
Copy link
Member

pnuu commented May 24, 2023

@pnuu So you're saying you want a criteria in the dependency loading to pull from the existing DataArrays in the Scene? Or to load time-specific things from readers? My thought was to have the user request the composite and if it detects that the DataArray doesn't have a time dimension it just fails in maybe a way similar to IncompatibleAreas...but resampling isn't going to fix the issue.

I guess was just thinking doing the usual Scene.load([composite]) or the same from MultiScene. In either case we'd need to do glob or something.

The blended timeseries Scene would have the knowledge of other time steps, but I don't know how the .load() call would work for time-composites where dependencies need to be loaded for individual Scenes but the composite the user wants is only possible after MultiScene.blend(timeseries). If blended.load([time_composite]) can use the pre-loaded composites, manual processing is usable. But for operational use that two-step loading isn't that easy to implement. Oh! Add the time_composite to wishlist. Just what you pointed to with IncompatibleAreas, but in this case the prereq operation would be .blend(timeseries) and not .resample().

@pnuu
Copy link
Member

pnuu commented May 24, 2023

Oh, I didn't know that different area possibility!

Actually I "knew" that existed because I had tested the temporal RGB stuff also with polar orbiter data, just didn't realise the inherently were from different areas 🙈

@gerritholl
Copy link
Collaborator Author

gerritholl commented May 24, 2023

I like the idea to first blend the MultiScene into a Scene as a timeseries, and then load the temperal composites. This requires to load from a blended scene — see #1749 (an issue I opened around 2 hours after this one, so probably I had this thought before). #1749 was closed as completed, but actually loading from a blended scene is still not possible (rather the use case in #1749 was covered in a different way):

import hdf5plugin
from glob import glob
from satpy.multiscene import MultiScene, timeseries
from satpy.utils import debug_on; debug_on()

ms = MultiScene.from_files(
        glob("/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC010[012]/*BODY*.nc"),
        reader="fci_l1c_nc",
        group_keys=["repeat_cycle_in_day"])
channels = ["ir_105", "ir_133", "wv_63", "wv_73"]
sc = ms.blend(blend_function=timeseries)
sc.load(channels)

this fails with

[DEBUG: 2023-05-24 14:23:18 : satpy.readers.yaml_reader] Reading ('/data/gholl/checkouts/satpy/satpy/etc/readers/fci_l1c_nc.yaml',)
[DEBUG: 2023-05-24 14:23:18 : satpy.multiscene._multiscene] Forcing iteration of generator-like object of Scenes
[DEBUG: 2023-05-24 14:23:18 : satpy.readers.yaml_reader] Reading ('/data/gholl/checkouts/satpy/satpy/etc/readers/fci_l1c_nc.yaml',)
[DEBUG: 2023-05-24 14:23:18 : satpy.readers.yaml_reader] Assigning to fci_l1c_nc: ['/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163515_GTT_DEV_20170920163008_20170920163015_N_JLS_T_0100_0001.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163951_GTT_DEV_20170920163426_20170920163451_N_JLS_T_0100_0020.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163826_GTT_DEV_20170920163302_20170920163326_N_JLS_T_0100_0015.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163559_GTT_DEV_20170920163036_20170920163059_N_JLS_T_0100_0005.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163701_GTT_DEV_20170920163120_20170920163201_N_JLS_T_0100_0009.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164200_GTT_DEV_20170920163614_20170920163700_N_JLS_T_0100_0027.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164141_GTT_DEV_20170920163555_20170920163641_N_JLS_T_0100_0026.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164344_GTT_DEV_20170920163803_20170920163844_N_JLS_T_0100_0035.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164043_GTT_DEV_20170920163512_20170920163543_N_JLS_T_0100_0023.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163644_GTT_DEV_20170920163116_20170920163144_N_JLS_T_0100_0008.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164204_GTT_DEV_20170920163630_20170920163704_N_JLS_T_0100_0028.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163738_GTT_DEV_20170920163212_20170920163238_N_JLS_T_0100_0012.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164310_GTT_DEV_20170920163728_20170920163810_N_JLS_T_0100_0032.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164256_GTT_DEV_20170920163711_20170920163756_N_JLS_T_0100_0031.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163724_GTT_DEV_20170920163154_20170920163224_N_JLS_T_0100_0011.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163855_GTT_DEV_20170920163337_20170920163355_N_JLS_T_0100_0017.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163546_GTT_DEV_20170920163023_20170920163046_N_JLS_T_0100_0004.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164422_GTT_DEV_20170920163912_20170920163922_N_JLS_T_0100_0040.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164407_GTT_DEV_20170920163835_20170920163907_N_JLS_T_0100_0037.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163845_GTT_DEV_20170920163317_20170920163345_N_JLS_T_0100_0016.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163816_GTT_DEV_20170920163245_20170920163316_N_JLS_T_0100_0014.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164122_GTT_DEV_20170920163535_20170920163622_N_JLS_T_0100_0025.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164340_GTT_DEV_20170920163800_20170920163840_N_JLS_T_0100_0034.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164421_GTT_DEV_20170920163900_20170920163921_N_JLS_T_0100_0039.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164325_GTT_DEV_20170920163743_20170920163825_N_JLS_T_0100_0033.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163541_GTT_DEV_20170920163019_20170920163041_N_JLS_T_0100_0003.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163708_GTT_DEV_20170920163137_20170920163208_N_JLS_T_0100_0010.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164357_GTT_DEV_20170920163819_20170920163857_N_JLS_T_0100_0036.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163757_GTT_DEV_20170920163228_20170920163257_N_JLS_T_0100_0013.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164239_GTT_DEV_20170920163652_20170920163739_N_JLS_T_0100_0030.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164009_GTT_DEV_20170920163436_20170920163509_N_JLS_T_0100_0021.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164024_GTT_DEV_20170920163455_20170920163524_N_JLS_T_0100_0022.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164222_GTT_DEV_20170920163648_20170920163722_N_JLS_T_0100_0029.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163527_GTT_DEV_20170920163009_20170920163027_N_JLS_T_0100_0002.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163614_GTT_DEV_20170920163047_20170920163114_N_JLS_T_0100_0006.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163917_GTT_DEV_20170920163352_20170920163417_N_JLS_T_0100_0018.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163627_GTT_DEV_20170920163101_20170920163127_N_JLS_T_0100_0007.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164103_GTT_DEV_20170920163530_20170920163603_N_JLS_T_0100_0024.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163935_GTT_DEV_20170920163406_20170920163435_N_JLS_T_0100_0019.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164411_GTT_DEV_20170920163849_20170920163911_N_JLS_T_0100_0038.nc']
[DEBUG: 2023-05-24 14:23:18 : satpy.readers.fci_l1c_nc] Reading: /media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920163515_GTT_DEV_20170920163008_20170920163015_N_JLS_T_0100_0001.nc
[DEBUG: 2023-05-24 14:23:18 : satpy.readers.fci_l1c_nc] Start: 2017-09-20 16:30:08
[DEBUG: 2023-05-24 14:23:18 : satpy.readers.fci_l1c_nc] End: 2017-09-20 16:30:15
[snip]
[DEBUG: 2023-05-24 14:23:25 : satpy.readers.fci_l1c_nc] Reading: /media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0100/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164411_GTT_DEV_20170920163849_20170920163911_N_JLS_T_0100_0038.nc
[DEBUG: 2023-05-24 14:23:25 : satpy.readers.fci_l1c_nc] Start: 2017-09-20 16:38:49
[DEBUG: 2023-05-24 14:23:25 : satpy.readers.fci_l1c_nc] End: 2017-09-20 16:39:11
[DEBUG: 2023-05-24 14:23:25 : satpy.readers.yaml_reader] Reading ('/data/gholl/checkouts/satpy/satpy/etc/readers/fci_l1c_nc.yaml',)
[DEBUG: 2023-05-24 14:23:25 : satpy.readers.yaml_reader] Assigning to fci_l1c_nc: ['/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165122_GTT_DEV_20170920164535_20170920164622_N_JLS_T_0101_0025.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165325_GTT_DEV_20170920164743_20170920164825_N_JLS_T_0101_0033.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164826_GTT_DEV_20170920164302_20170920164326_N_JLS_T_0101_0015.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165357_GTT_DEV_20170920164819_20170920164857_N_JLS_T_0101_0036.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164855_GTT_DEV_20170920164337_20170920164355_N_JLS_T_0101_0017.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164559_GTT_DEV_20170920164036_20170920164059_N_JLS_T_0101_0005.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164935_GTT_DEV_20170920164406_20170920164435_N_JLS_T_0101_0019.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165043_GTT_DEV_20170920164512_20170920164543_N_JLS_T_0101_0023.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164757_GTT_DEV_20170920164228_20170920164257_N_JLS_T_0101_0013.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164627_GTT_DEV_20170920164101_20170920164127_N_JLS_T_0101_0007.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164845_GTT_DEV_20170920164317_20170920164345_N_JLS_T_0101_0016.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164614_GTT_DEV_20170920164047_20170920164114_N_JLS_T_0101_0006.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165222_GTT_DEV_20170920164648_20170920164722_N_JLS_T_0101_0029.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165103_GTT_DEV_20170920164530_20170920164603_N_JLS_T_0101_0024.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164917_GTT_DEV_20170920164352_20170920164417_N_JLS_T_0101_0018.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164546_GTT_DEV_20170920164023_20170920164046_N_JLS_T_0101_0004.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165422_GTT_DEV_20170920164912_20170920164922_N_JLS_T_0101_0040.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164541_GTT_DEV_20170920164019_20170920164041_N_JLS_T_0101_0003.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165256_GTT_DEV_20170920164711_20170920164756_N_JLS_T_0101_0031.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165204_GTT_DEV_20170920164630_20170920164704_N_JLS_T_0101_0028.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165024_GTT_DEV_20170920164455_20170920164524_N_JLS_T_0101_0022.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164708_GTT_DEV_20170920164137_20170920164208_N_JLS_T_0101_0010.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165407_GTT_DEV_20170920164835_20170920164907_N_JLS_T_0101_0037.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164738_GTT_DEV_20170920164212_20170920164238_N_JLS_T_0101_0012.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165344_GTT_DEV_20170920164803_20170920164844_N_JLS_T_0101_0035.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164644_GTT_DEV_20170920164116_20170920164144_N_JLS_T_0101_0008.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164515_GTT_DEV_20170920164008_20170920164015_N_JLS_T_0101_0001.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165421_GTT_DEV_20170920164900_20170920164921_N_JLS_T_0101_0039.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164527_GTT_DEV_20170920164009_20170920164027_N_JLS_T_0101_0002.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165009_GTT_DEV_20170920164436_20170920164509_N_JLS_T_0101_0021.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164816_GTT_DEV_20170920164245_20170920164316_N_JLS_T_0101_0014.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164724_GTT_DEV_20170920164154_20170920164224_N_JLS_T_0101_0011.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164951_GTT_DEV_20170920164426_20170920164451_N_JLS_T_0101_0020.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165200_GTT_DEV_20170920164614_20170920164700_N_JLS_T_0101_0027.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165239_GTT_DEV_20170920164652_20170920164739_N_JLS_T_0101_0030.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920164701_GTT_DEV_20170920164120_20170920164201_N_JLS_T_0101_0009.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165411_GTT_DEV_20170920164849_20170920164911_N_JLS_T_0101_0038.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165310_GTT_DEV_20170920164728_20170920164810_N_JLS_T_0101_0032.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165141_GTT_DEV_20170920164555_20170920164641_N_JLS_T_0101_0026.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165340_GTT_DEV_20170920164800_20170920164840_N_JLS_T_0101_0034.nc']
[DEBUG: 2023-05-24 14:23:25 : satpy.readers.fci_l1c_nc] Reading: /media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165122_GTT_DEV_20170920164535_20170920164622_N_JLS_T_0101_0025.nc
[DEBUG: 2023-05-24 14:23:25 : satpy.readers.fci_l1c_nc] Start: 2017-09-20 16:45:35
[DEBUG: 2023-05-24 14:23:25 : satpy.readers.fci_l1c_nc] End: 2017-09-20 16:46:22
[snip]
[DEBUG: 2023-05-24 14:23:31 : satpy.readers.fci_l1c_nc] Reading: /media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0101/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165340_GTT_DEV_20170920164800_20170920164840_N_JLS_T_0101_0034.nc
[DEBUG: 2023-05-24 14:23:31 : satpy.readers.fci_l1c_nc] Start: 2017-09-20 16:48:00
[DEBUG: 2023-05-24 14:23:31 : satpy.readers.fci_l1c_nc] End: 2017-09-20 16:48:40
[DEBUG: 2023-05-24 14:23:32 : satpy.readers.yaml_reader] Reading ('/data/gholl/checkouts/satpy/satpy/etc/readers/fci_l1c_nc.yaml',)
[DEBUG: 2023-05-24 14:23:32 : satpy.readers.yaml_reader] Assigning to fci_l1c_nc: ['/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165826_GTT_DEV_20170920165302_20170920165326_N_JLS_T_0102_0015.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165644_GTT_DEV_20170920165116_20170920165144_N_JLS_T_0102_0008.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170239_GTT_DEV_20170920165652_20170920165739_N_JLS_T_0102_0030.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165724_GTT_DEV_20170920165154_20170920165224_N_JLS_T_0102_0011.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165757_GTT_DEV_20170920165228_20170920165257_N_JLS_T_0102_0013.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170421_GTT_DEV_20170920165900_20170920165921_N_JLS_T_0102_0039.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165541_GTT_DEV_20170920165019_20170920165041_N_JLS_T_0102_0003.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165855_GTT_DEV_20170920165337_20170920165355_N_JLS_T_0102_0017.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165627_GTT_DEV_20170920165101_20170920165127_N_JLS_T_0102_0007.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170222_GTT_DEV_20170920165648_20170920165722_N_JLS_T_0102_0029.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170325_GTT_DEV_20170920165743_20170920165825_N_JLS_T_0102_0033.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170357_GTT_DEV_20170920165819_20170920165857_N_JLS_T_0102_0036.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170422_GTT_DEV_20170920165912_20170920165922_N_JLS_T_0102_0040.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170009_GTT_DEV_20170920165436_20170920165509_N_JLS_T_0102_0021.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170310_GTT_DEV_20170920165728_20170920165810_N_JLS_T_0102_0032.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165527_GTT_DEV_20170920165009_20170920165027_N_JLS_T_0102_0002.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170411_GTT_DEV_20170920165849_20170920165911_N_JLS_T_0102_0038.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165935_GTT_DEV_20170920165406_20170920165435_N_JLS_T_0102_0019.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170340_GTT_DEV_20170920165800_20170920165840_N_JLS_T_0102_0034.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165614_GTT_DEV_20170920165047_20170920165114_N_JLS_T_0102_0006.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170407_GTT_DEV_20170920165835_20170920165907_N_JLS_T_0102_0037.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165701_GTT_DEV_20170920165120_20170920165201_N_JLS_T_0102_0009.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170344_GTT_DEV_20170920165803_20170920165844_N_JLS_T_0102_0035.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165951_GTT_DEV_20170920165426_20170920165451_N_JLS_T_0102_0020.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170043_GTT_DEV_20170920165512_20170920165543_N_JLS_T_0102_0023.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170103_GTT_DEV_20170920165530_20170920165603_N_JLS_T_0102_0024.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165845_GTT_DEV_20170920165317_20170920165345_N_JLS_T_0102_0016.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165515_GTT_DEV_20170920165008_20170920165015_N_JLS_T_0102_0001.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165917_GTT_DEV_20170920165352_20170920165417_N_JLS_T_0102_0018.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170256_GTT_DEV_20170920165711_20170920165756_N_JLS_T_0102_0031.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165738_GTT_DEV_20170920165212_20170920165238_N_JLS_T_0102_0012.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165816_GTT_DEV_20170920165245_20170920165316_N_JLS_T_0102_0014.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165546_GTT_DEV_20170920165023_20170920165046_N_JLS_T_0102_0004.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170024_GTT_DEV_20170920165455_20170920165524_N_JLS_T_0102_0022.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170141_GTT_DEV_20170920165555_20170920165641_N_JLS_T_0102_0026.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170200_GTT_DEV_20170920165614_20170920165700_N_JLS_T_0102_0027.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170204_GTT_DEV_20170920165630_20170920165704_N_JLS_T_0102_0028.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165559_GTT_DEV_20170920165036_20170920165059_N_JLS_T_0102_0005.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165708_GTT_DEV_20170920165137_20170920165208_N_JLS_T_0102_0010.nc', '/media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170122_GTT_DEV_20170920165535_20170920165622_N_JLS_T_0102_0025.nc']
[DEBUG: 2023-05-24 14:23:32 : satpy.readers.fci_l1c_nc] Reading: /media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920165826_GTT_DEV_20170920165302_20170920165326_N_JLS_T_0102_0015.nc
[DEBUG: 2023-05-24 14:23:32 : satpy.readers.fci_l1c_nc] Start: 2017-09-20 16:53:02
[DEBUG: 2023-05-24 14:23:32 : satpy.readers.fci_l1c_nc] End: 2017-09-20 16:53:26
[snip]
[DEBUG: 2023-05-24 14:23:38 : satpy.readers.fci_l1c_nc] Reading: /media/nas/x21308/MTG_test_data/2022_05_MTG_Testdata/RC0102/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20170920170122_GTT_DEV_20170920165535_20170920165622_N_JLS_T_0102_0025.nc
[DEBUG: 2023-05-24 14:23:38 : satpy.readers.fci_l1c_nc] Start: 2017-09-20 16:55:35
[DEBUG: 2023-05-24 14:23:38 : satpy.readers.fci_l1c_nc] End: 2017-09-20 16:56:22
Traceback (most recent call last):
  File "/data/gholl/checkouts/satpy/satpy/scene.py", line 1373, in _update_dependency_tree
    self._dependency_tree.populate_with_keys(needed_datasets, query)
  File "/data/gholl/checkouts/satpy/satpy/dependency_tree.py", line 262, in populate_with_keys
    raise MissingDependencies(unknown_datasets, "Unknown datasets:")
satpy.node.MissingDependencies: Unknown datasets: {DataQuery(name='wv_63')}, {DataQuery(name='ir_133')}, {DataQuery(name='wv_73')}, {DataQuery(name='ir_105')}

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/data/gholl/checkouts/protocode/load-from-blended-scene.py", line 12, in <module>
    sc.load(channels)
  File "/data/gholl/checkouts/satpy/satpy/scene.py", line 1361, in load
    self._update_dependency_tree(needed_datasets, query)
  File "/data/gholl/checkouts/satpy/satpy/scene.py", line 1375, in _update_dependency_tree
    raise KeyError(str(err))
KeyError: "Unknown datasets: {DataQuery(name='wv_63')}, {DataQuery(name='ir_133')}, {DataQuery(name='wv_73')}, {DataQuery(name='ir_105')}"

@gerritholl
Copy link
Collaborator Author

Oh! Add the time_composite to wishlist. Just what you pointed to with IncompatibleAreas, but in this case the prereq operation would be .blend(timeseries) and not .resample().

If I understand correctly, that would be something like:

>>> ms = MultiScene(...)
>>> ms.load(["chan", "regular_composite", "temporal_composite"])
Warning: The following datasets were not created and may require temporal blending to be generated: temporal_composite
>>> sc = ms.blend(timeseries)

then after blending the temporal composite would be generated?

@pnuu
Copy link
Member

pnuu commented May 24, 2023

Yes, that's what I was thinking.

@gerritholl
Copy link
Collaborator Author

We already have an IncompatibleTimes class :-O

class IncompatibleTimes(Exception):
"""Error raised upon compositing things from different times."""

@gerritholl
Copy link
Collaborator Author

My understanding based on the discussion we had earlier today: the initial mscn.load(...) would fail on time-dependent composites, such that those composites would end up in the scene missing_datasets property for each scene. After timeseries blending, mscn.blend would run .generate_possible_composites() on the new scene. This cannot be done by the timeseries blend function itself, because it would only run on successfully generated datasets.

A problem: on the new scene, .generate_possible_composites() would do nothing, because the new scene (created by MultiScene.blend) doesn't have a wishlist (and therefore no missing_datasets). There is currently no API to add anything to the wishlist from outside.

@gerritholl
Copy link
Collaborator Author

Possible solution: rather than starting with an empty scene, MultiScene.blend could start with self.first_scene.copy().

That might have consequences I do not currently oversee.

It also doesn't address the possibility of different wishlists between scenes. Would we ever expect different wishlists between scenes in a MultiScene?

@djhoese
Copy link
Member

djhoese commented May 25, 2023

This cannot be done by the timeseries blend function itself, because it would only run on successfully generated datasets.

More importantly the timeseries blend function gets DataArray objects as input, not a Scene, and it returns a DataArray.

Possible solution: rather than starting with an empty scene, MultiScene.blend could start with self.first_scene.copy()

I'm scared of this too. I think if we're really worried about making _wishlist setting public, then let's code it up in the "bad" way and assign to _wishlist directly and then after it is working we discuss whether or not to add a setter for the .wishlist property.

@gerritholl gerritholl linked a pull request May 25, 2023 that will close this issue
9 tasks
@gerritholl
Copy link
Collaborator Author

How would the MultiScene or the timeseries blend function recognise a temporal composite?

  • All temporal compositors have a common base class?
  • All temporal composites have in the prerequisite dict a key time?
  • Some other way?

@gerritholl
Copy link
Collaborator Author

gerritholl commented May 25, 2023

They could all derive from a common base class, which would check for a time dimension in __call__. On first call (before blending) it would fail, on second call (after blending) it would pass. That means that figuring out what times we need is up to the user, so we could not have, for example:

composites:
  temporal:
    compositor: !!python/name:satpy.tests.multiscene_tests.test_temporal_composites._TemporalCompositor
    prerequisites:
      - name: ir
        time: 0
      - name: ir
        time: -10 min
      - name: ir
        time: -20 min
    standard_name: temporal

with the Satpy requirement management figuring out the prerequisites. Rather, we would have

composites:
  temporal:
    compositor: !!python/name:satpy.tests.multiscene_tests.test_temporal_composites._TemporalCompositor
    prerequisites:
      - name: ir
    standard_name: temporal

with the temporal requirement being enforced in the code and not encoded in the YAML.

The downside of the second approach is that it makes it harder to experiment with different ways of combining time-steps in different RGBs or other composites, as this would be hardcoded in the compositor rather than configurable in YAML.

Unless a base TemporalCompositor class would somehow do a second pass of requirement processing...

@pnuu
Copy link
Member

pnuu commented May 25, 2023

The downside of the second approach is that it makes it harder to experiment with different ways of combining time-steps in different RGBs or other composites, as this would be hardcoded in the compositor rather than configurable in YAML.

Another option is to do it like I did in #2488 and assume a fixed number of inputs (currently in a specific order). This wouldn't be using the compositor configuration interface at all for the temporal part, though. The datasets/composites (in your example ir) used to build the temporal composite could of course be configured that way.

@gerritholl
Copy link
Collaborator Author

I am interested in a framework that allows the user to use the compositor configuration interface for the temporal part.

@djhoese
Copy link
Member

djhoese commented May 26, 2023

A base class sounds fine but as discussed in the meeting today (my morning, your afternoon), the MultiScene shouldn't need to know the type of the composite. It should "just try" by generating possible composites and if the composite can't be made it still raises the incompatible times (or whatever) or incompatible areas (if not resampled or can't handle time-based DataArrays) and those composites remain as "missing".

I think a base class would be nice for time-based composites. Possibly a questionable idea, but you could overwrite match_dataarrays to use the time-related composite config information (outside of prerequisites somewhere) to check for time requirements (ex. channels must be sorted by time, must be 10 minutes apart, etc). Before (or after) that time check you could call the parent classes match_dataarrays to get all the normal area checks.

@gerritholl
Copy link
Collaborator Author

By the time the compositor is called the second time, it is passed a 3-dimensional data-array coming from blend(blend_function=timeseries). If the scenes in the MultiScene are not sorted in time, then I think that's either the user's problem, or the user is on purpose doing something weird.

@djhoese
Copy link
Member

djhoese commented May 26, 2023

I don't think you can have a dimension coordinate that is not monotonic (always decreasing or always increasing) in an xarray DataArray.

@gerritholl
Copy link
Collaborator Author

Right, so there's nothing to do at the compositor stage, is there? If the input data have messed up times that should fail by the latest when calling MultiScene.blend(blend_function=timeseries).

@djhoese
Copy link
Member

djhoese commented May 26, 2023

I think that's correct, yes. Well...I guess if there was no time coordinate assigned and only a dimension with no coordinate values, then theoretically you could have them in any order and the composite could (should?) use .attrs['start_time'] of the DataArray...wait there would only be one DataArray so the composite wouldn't have the time available.

@gerritholl
Copy link
Collaborator Author

#2495 depends on a time coordinate being available.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: In Progress
Development

Successfully merging a pull request may close this issue.

4 participants