Repository: DestinE-Climate-DT/AQUA
Pull request #1791: Remove usage of generator option 
Author: login: silviacaprioli
Labels: name: framework
description: functions common to all diagnostics
Created: 2025-03-03T19:39:08Z | Merged: 2025-03-13T16:08:05Z

## PR description:

This PR remove the generator options from the Reader since it is unused.
The OPA_generator in the LRA folder is also removed

## Issues closed by this pull request:

Close  #1770 


----

Please leave the checkboxes that apply to this pull request.
If you find a missing checkbox, please add it to the list.
Make sure to complete the checkboxes before applying the "ready to merge" label.
Please apply the "run tests" label if you want to trigger CI tests.

 - [x] Tests are included if a new feature is included.
 - [x] Documentation is included if a new feature is included.
 - [x] Docstrings are updated if needed.
 - [x] Changelog is updated.
 - [x] Notebooks which requires changes are updated. 


Linked issue #1770: Remove generator option from the Reader
We're going to remove the generator options from the Reader since it is unused.
A PR will be open and the removal evaluated to check if it is a consistent advantage or the code can be left.
Linked issue comments: user: login: mnurisso
created_at: 2025-02-28T10:12:03Z
body: Remove also the OPA_generator in the LRA folder
author_association: COLLABORATOR

Diff:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e195f88ab8..0b169f6d40 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,7 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 Unreleased in the current development version (target v0.14):
 
 AQUA core complete list:
-
+- Remove generators from Reader (#1791)
 - Fix tcc grib code and add some cmor codes in the convention file (#1800)
 - Add a regrid option to cli of relevant diagnostics (#1792)
 - Limit estimation of time for weight generation only to regular lon/lat grids (#1786)
diff --git a/docs/sphinx/source/advanced_topics.rst b/docs/sphinx/source/advanced_topics.rst
index 8ce608e1dc..7d9474a618 100644
--- a/docs/sphinx/source/advanced_topics.rst
+++ b/docs/sphinx/source/advanced_topics.rst
@@ -179,34 +179,6 @@ It is also possible to specify vertical chunking by passing a dictionary with th
 In this case ``time`` will follow the notation discussed above, while ``vertical`` specifies the number of vertical
 levels to use for each chunk.
 
-.. _iterators:
-
-Iterator access to data
------------------------
-
-In alternative to the lazy access it is also possible to ask the reader to return an *iterator/generator* object passing the ``stream_generator=True`` 
-keyword to the ``retrieve()`` method.
-In that case the next block of data can be read from the iterator with ``next()`` as follows:
-
-.. code-block:: python
-
-    reader = Reader(model="IFS", exp="fdb-tco399", source="fdb-long", aggregation="D",
-                    regrid="r025")
-    data = reader.retrieve(startdate='20200120', enddate='20200413', var='ci',
-                           stream_generator=True)
-    dd = next(data)
-
-or with a loop iterating over ``data``. The result of these operations is in turn a regular xarray.Dataset containg the data.
-Since this is a data stream the user should also specify the desired initial time and the final time (the latter can be omitted and will default to the end of the dataset).
-When using an iterator it is possible to specify the size of the data blocks read at each iteration with the ``aggregation`` keyword
-(``M`` is month, ``D`` is day etc.). 
-The default is ``S`` (step), i.e. single saved timesteps are read at each iteration.
-
-Please notice that the resulting object obtained at each iteration is not a lazy dask array, but is instead entirely loaded into memory.
-Please consider memory usage in choosing an appropriate value for the ``aggregation`` keyword.
-
-In the special case where the source is FDB/GSV and iterator access is requested, ``aggregation`` takes precedence over ``chunks`` and chunking is set to the value specified by it.
-
 .. _lev-selection-regrid:
 
 Level selection and regridding
diff --git a/docs/sphinx/source/other_components.rst b/docs/sphinx/source/other_components.rst
index 913ac93600..80474c59f4 100644
--- a/docs/sphinx/source/other_components.rst
+++ b/docs/sphinx/source/other_components.rst
@@ -156,26 +156,6 @@ the internal state of the streaming process.
 
 If we want to reset the state of the streaming process, we can call the ``reset_stream()`` method.
 
-Iterator streaming
-^^^^^^^^^^^^^^^^^^
-
-Another possibility to deal with data streaming is to use the argument
-``stream_generator=True`` in the Reader initialization:
-
-.. code-block:: python
-
-    reader = Reader(model="IFS", exp= "tco2559-ng5", source="ICMGG_atm2d",
-                    stream_generator = 'True', aggregation = 'monthly')
-    data_gen = reader.retrieve()
-    
-``data_gen`` is now a generator object that yields the requested one-month-long chunks of data
-(See :ref:`iterators` for more info).
-We can do operations with them by iterating on the generator object like:
-
-.. code-block:: python
-
-    for data in data_gen:
-        # Do something with the data
 
 .. _accessors:
 
diff --git a/docs/sphinx/source/reader.rst b/docs/sphinx/source/reader.rst
index 5d573d5b16..9694882c53 100644
--- a/docs/sphinx/source/reader.rst
+++ b/docs/sphinx/source/reader.rst
@@ -105,8 +105,8 @@ by the users, but things can be speed up if we target a specific catalog. This c
     reader = Reader(model='IFS-NEMO', exp='historical-1990', source='lra-r100-monthly', catalog='climatedt-phase1')
     data = reader.retrieve()
 
-Dask and Iterator access
-^^^^^^^^^^^^^^^^^^^^^^^^
+Dask and streaming capabilities
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 The standard usage of the ``Reader`` class will load metadata in memory and
 make the data available for processing.
@@ -117,7 +117,7 @@ This allows to fully process also large datasets using dask lazy and parallel pr
 However, for specific testing or development needs,
 the ``Reader`` class is also able to allow a streaming of data, 
 where the data are loaded in chunks and processed step by step.
-Please check the :ref:`iterators` section for more details.
+Please check the :ref:`streaming` section for more details.
 
 .. note::
     Dask access to data is available also for FDB data.
diff --git a/notebooks/reader/datasets_lumi.ipynb b/notebooks/reader/datasets_lumi.ipynb
index b3bb6a0f99..ded5b57e62 100644
--- a/notebooks/reader/datasets_lumi.ipynb
+++ b/notebooks/reader/datasets_lumi.ipynb
@@ -1910,7 +1910,7 @@
     "\n",
     "For develpment integrations, a 'mock dataset' has been created in this format: the \"fdb-long\" dataset, including four years of IFS hourly data for some common climate variables. As described in the [GSV Reader fdb-long documentation](https://earth.bsc.es/gitlab/digital-twins/de_340/gsv_interface/-/wikis/Specifications-of-fdb-long).\n",
     "\n",
-    "The default is now returning a standard dask-enabled xarray thanks to recent improvements to the interface which allow lazy dask access also for FDB/GSV data sources. It is still possible to obtain an iterator instead, specifying the `stream_generator=True` keyword.\n",
+    "The default is now returning a standard dask-enabled xarray thanks to recent improvements to the interface which allow lazy dask access also for FDB/GSV data sources. \n",
     "\n",
     "Xarray/dask access (the default) is the recommended data access form, since it is the same used also for other data sources.\n"
    ]
@@ -2458,1186 +2458,6 @@
     "plot_single_map(reader.regrid(data.tcc.isel(time=1)), cmap='Blues_r', contour=False)\n"
    ]
   },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "**Access to the fdb-test dataset using an iterator**\n"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "It is also possible to get an iterator instead of a dask array using the keyword `stream_generator=True`. For FDB sources this actually uses an iterator created directly by the GSV intake driver, instead of the streaming simulator. Notice the use, in this example, of the `chunks` keyword, to specify time chunking, i.e. how much data to retrieve at each iteration. This keyword, if specified, has actually also a meaning for dask access, specifying chunk size, but is better to just use the defaults read from the catalogue and not to specify it. The defaults take into account memory limitations in chunking. Please check the documentation for further information on how to add a source from FDB."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from aqua import Reader\n",
-    "reader = Reader(model=\"IFS\", exp=\"fdb-tco399\", source=\"fdb-long-2d\", regrid=\"r200\", chunks=\"D\", stream_generator=True )"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 34,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "data = reader.retrieve(startdate=\"20200125\", enddate=\"20200129\", var=\"tcc\")"
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "The result is now an 'iterator'"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "<generator object FixerMixin._fixergen at 0x7f468ed8c140>"
-      ]
-     },
-     "execution_count": 4,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "data"
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "We can either loop over the iterator or just get the next value. It is only now that the reader will actually retrieve the field(s) from FDB:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "data0 = next(data)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
-       "<defs>\n",
-       "<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
-       "<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
-       "<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
-       "<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
-       "</symbol>\n",
-       "<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
-       "<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
-       "<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
-       "<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
-       "<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
-       "</symbol>\n",
-       "</defs>\n",
-       "</svg>\n",
-       "<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
-       " *\n",
-       " */\n",
-       "\n",
-       ":root {\n",
-       "  --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
-       "  --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
-       "  --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
-       "  --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
-       "  --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
-       "  --xr-background-color: var(--jp-layout-color0, white);\n",
-       "  --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
-       "  --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
-       "}\n",
-       "\n",
-       "html[theme=dark],\n",
-       "body[data-theme=dark],\n",
-       "body.vscode-dark {\n",
-       "  --xr-font-color0: rgba(255, 255, 255, 1);\n",
-       "  --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
-       "  --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
-       "  --xr-border-color: #1F1F1F;\n",
-       "  --xr-disabled-color: #515151;\n",
-       "  --xr-background-color: #111111;\n",
-       "  --xr-background-color-row-even: #111111;\n",
-       "  --xr-background-color-row-odd: #313131;\n",
-       "}\n",
-       "\n",
-       ".xr-wrap {\n",
-       "  display: block !important;\n",
-       "  min-width: 300px;\n",
-       "  max-width: 700px;\n",
-       "}\n",
-       "\n",
-       ".xr-text-repr-fallback {\n",
-       "  /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
-       "  display: none;\n",
-       "}\n",
-       "\n",
-       ".xr-header {\n",
-       "  padding-top: 6px;\n",
-       "  padding-bottom: 6px;\n",
-       "  margin-bottom: 4px;\n",
-       "  border-bottom: solid 1px var(--xr-border-color);\n",
-       "}\n",
-       "\n",
-       ".xr-header > div,\n",
-       ".xr-header > ul {\n",
-       "  display: inline;\n",
-       "  margin-top: 0;\n",
-       "  margin-bottom: 0;\n",
-       "}\n",
-       "\n",
-       ".xr-obj-type,\n",
-       ".xr-array-name {\n",
-       "  margin-left: 2px;\n",
-       "  margin-right: 10px;\n",
-       "}\n",
-       "\n",
-       ".xr-obj-type {\n",
-       "  color: var(--xr-font-color2);\n",
-       "}\n",
-       "\n",
-       ".xr-sections {\n",
-       "  padding-left: 0 !important;\n",
-       "  display: grid;\n",
-       "  grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
-       "}\n",
-       "\n",
-       ".xr-section-item {\n",
-       "  display: contents;\n",
-       "}\n",
-       "\n",
-       ".xr-section-item input {\n",
-       "  display: none;\n",
-       "}\n",
-       "\n",
-       ".xr-section-item input + label {\n",
-       "  color: var(--xr-disabled-color);\n",
-       "}\n",
-       "\n",
-       ".xr-section-item input:enabled + label {\n",
-       "  cursor: pointer;\n",
-       "  color: var(--xr-font-color2);\n",
-       "}\n",
-       "\n",
-       ".xr-section-item input:enabled + label:hover {\n",
-       "  color: var(--xr-font-color0);\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary {\n",
-       "  grid-column: 1;\n",
-       "  color: var(--xr-font-color2);\n",
-       "  font-weight: 500;\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary > span {\n",
-       "  display: inline-block;\n",
-       "  padding-left: 0.5em;\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary-in:disabled + label {\n",
-       "  color: var(--xr-font-color2);\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary-in + label:before {\n",
-       "  display: inline-block;\n",
-       "  content: '►';\n",
-       "  font-size: 11px;\n",
-       "  width: 15px;\n",
-       "  text-align: center;\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary-in:disabled + label:before {\n",
-       "  color: var(--xr-disabled-color);\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary-in:checked + label:before {\n",
-       "  content: '▼';\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary-in:checked + label > span {\n",
-       "  display: none;\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary,\n",
-       ".xr-section-inline-details {\n",
-       "  padding-top: 4px;\n",
-       "  padding-bottom: 4px;\n",
-       "}\n",
-       "\n",
-       ".xr-section-inline-details {\n",
-       "  grid-column: 2 / -1;\n",
-       "}\n",
-       "\n",
-       ".xr-section-details {\n",
-       "  display: none;\n",
-       "  grid-column: 1 / -1;\n",
-       "  margin-bottom: 5px;\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary-in:checked ~ .xr-section-details {\n",
-       "  display: contents;\n",
-       "}\n",
-       "\n",
-       ".xr-array-wrap {\n",
-       "  grid-column: 1 / -1;\n",
-       "  display: grid;\n",
-       "  grid-template-columns: 20px auto;\n",
-       "}\n",
-       "\n",
-       ".xr-array-wrap > label {\n",
-       "  grid-column: 1;\n",
-       "  vertical-align: top;\n",
-       "}\n",
-       "\n",
-       ".xr-preview {\n",
-       "  color: var(--xr-font-color3);\n",
-       "}\n",
-       "\n",
-       ".xr-array-preview,\n",
-       ".xr-array-data {\n",
-       "  padding: 0 5px !important;\n",
-       "  grid-column: 2;\n",
-       "}\n",
-       "\n",
-       ".xr-array-data,\n",
-       ".xr-array-in:checked ~ .xr-array-preview {\n",
-       "  display: none;\n",
-       "}\n",
-       "\n",
-       ".xr-array-in:checked ~ .xr-array-data,\n",
-       ".xr-array-preview {\n",
-       "  display: inline-block;\n",
-       "}\n",
-       "\n",
-       ".xr-dim-list {\n",
-       "  display: inline-block !important;\n",
-       "  list-style: none;\n",
-       "  padding: 0 !important;\n",
-       "  margin: 0;\n",
-       "}\n",
-       "\n",
-       ".xr-dim-list li {\n",
-       "  display: inline-block;\n",
-       "  padding: 0;\n",
-       "  margin: 0;\n",
-       "}\n",
-       "\n",
-       ".xr-dim-list:before {\n",
-       "  content: '(';\n",
-       "}\n",
-       "\n",
-       ".xr-dim-list:after {\n",
-       "  content: ')';\n",
-       "}\n",
-       "\n",
-       ".xr-dim-list li:not(:last-child):after {\n",
-       "  content: ',';\n",
-       "  padding-right: 5px;\n",
-       "}\n",
-       "\n",
-       ".xr-has-index {\n",
-       "  font-weight: bold;\n",
-       "}\n",
-       "\n",
-       ".xr-var-list,\n",
-       ".xr-var-item {\n",
-       "  display: contents;\n",
-       "}\n",
-       "\n",
-       ".xr-var-item > div,\n",
-       ".xr-var-item label,\n",
-       ".xr-var-item > .xr-var-name span {\n",
-       "  background-color: var(--xr-background-color-row-even);\n",
-       "  margin-bottom: 0;\n",
-       "}\n",
-       "\n",
-       ".xr-var-item > .xr-var-name:hover span {\n",
-       "  padding-right: 5px;\n",
-       "}\n",
-       "\n",
-       ".xr-var-list > li:nth-child(odd) > div,\n",
-       ".xr-var-list > li:nth-child(odd) > label,\n",
-       ".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
-       "  background-color: var(--xr-background-color-row-odd);\n",
-       "}\n",
-       "\n",
-       ".xr-var-name {\n",
-       "  grid-column: 1;\n",
-       "}\n",
-       "\n",
-       ".xr-var-dims {\n",
-       "  grid-column: 2;\n",
-       "}\n",
-       "\n",
-       ".xr-var-dtype {\n",
-       "  grid-column: 3;\n",
-       "  text-align: right;\n",
-       "  color: var(--xr-font-color2);\n",
-       "}\n",
-       "\n",
-       ".xr-var-preview {\n",
-       "  grid-column: 4;\n",
-       "}\n",
-       "\n",
-       ".xr-index-preview {\n",
-       "  grid-column: 2 / 5;\n",
-       "  color: var(--xr-font-color2);\n",
-       "}\n",
-       "\n",
-       ".xr-var-name,\n",
-       ".xr-var-dims,\n",
-       ".xr-var-dtype,\n",
-       ".xr-preview,\n",
-       ".xr-attrs dt {\n",
-       "  white-space: nowrap;\n",
-       "  overflow: hidden;\n",
-       "  text-overflow: ellipsis;\n",
-       "  padding-right: 10px;\n",
-       "}\n",
-       "\n",
-       ".xr-var-name:hover,\n",
-       ".xr-var-dims:hover,\n",
-       ".xr-var-dtype:hover,\n",
-       ".xr-attrs dt:hover {\n",
-       "  overflow: visible;\n",
-       "  width: auto;\n",
-       "  z-index: 1;\n",
-       "}\n",
-       "\n",
-       ".xr-var-attrs,\n",
-       ".xr-var-data,\n",
-       ".xr-index-data {\n",
-       "  display: none;\n",
-       "  background-color: var(--xr-background-color) !important;\n",
-       "  padding-bottom: 5px !important;\n",
-       "}\n",
-       "\n",
-       ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
-       ".xr-var-data-in:checked ~ .xr-var-data,\n",
-       ".xr-index-data-in:checked ~ .xr-index-data {\n",
-       "  display: block;\n",
-       "}\n",
-       "\n",
-       ".xr-var-data > table {\n",
-       "  float: right;\n",
-       "}\n",
-       "\n",
-       ".xr-var-name span,\n",
-       ".xr-var-data,\n",
-       ".xr-index-name div,\n",
-       ".xr-index-data,\n",
-       ".xr-attrs {\n",
-       "  padding-left: 25px !important;\n",
-       "}\n",
-       "\n",
-       ".xr-attrs,\n",
-       ".xr-var-attrs,\n",
-       ".xr-var-data,\n",
-       ".xr-index-data {\n",
-       "  grid-column: 1 / -1;\n",
-       "}\n",
-       "\n",
-       "dl.xr-attrs {\n",
-       "  padding: 0;\n",
-       "  margin: 0;\n",
-       "  display: grid;\n",
-       "  grid-template-columns: 125px auto;\n",
-       "}\n",
-       "\n",
-       ".xr-attrs dt,\n",
-       ".xr-attrs dd {\n",
-       "  padding: 0;\n",
-       "  margin: 0;\n",
-       "  float: left;\n",
-       "  padding-right: 10px;\n",
-       "  width: auto;\n",
-       "}\n",
-       "\n",
-       ".xr-attrs dt {\n",
-       "  font-weight: normal;\n",
-       "  grid-column: 1;\n",
-       "}\n",
-       "\n",
-       ".xr-attrs dt:hover span {\n",
-       "  display: inline-block;\n",
-       "  background: var(--xr-background-color);\n",
-       "  padding-right: 10px;\n",
-       "}\n",
-       "\n",
-       ".xr-attrs dd {\n",
-       "  grid-column: 2;\n",
-       "  white-space: pre-wrap;\n",
-       "  word-break: break-all;\n",
-       "}\n",
-       "\n",
-       ".xr-icon-database,\n",
-       ".xr-icon-file-text2,\n",
-       ".xr-no-icon {\n",
-       "  display: inline-block;\n",
-       "  vertical-align: middle;\n",
-       "  width: 1em;\n",
-       "  height: 1.5em !important;\n",
-       "  stroke-width: 0;\n",
-       "  stroke: currentColor;\n",
-       "  fill: currentColor;\n",
-       "}\n",
-       "</style><pre class='xr-text-repr-fallback'>&lt;xarray.Dataset&gt; Size: 178MB\n",
-       "Dimensions:     (ncells: 654400, cell_corners: 4, time: 24)\n",
-       "Coordinates:\n",
-       "    lon         (ncells) float64 5MB 0.0 0.3142 0.6283 ... -0.6283 -0.3142\n",
-       "    lat         (ncells) float64 5MB 1.568 1.568 1.568 ... -1.568 -1.568 -1.568\n",
-       "    lon_bounds  (ncells, cell_corners) float64 21MB -0.1571 0.1571 ... -0.4712\n",
-       "    lat_bounds  (ncells, cell_corners) float64 21MB 1.57 1.57 ... -1.57 -1.57\n",
-       "  * time        (time) datetime64[ns] 192B 2020-01-25 ... 2020-01-25T23:00:00\n",
-       "Dimensions without coordinates: ncells, cell_corners\n",
-       "Data variables:\n",
-       "    tcc         (time, ncells) float64 126MB 1.0 1.0 1.0 ... 1.0 0.9991 0.9974\n",
-       "Attributes:\n",
-       "    history:  2024-03-12 21:17:57 Dataset retrieved by GSV interface;\\n2024-0...</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-e32edc61-57a6-4c5f-bb74-2533e4b28fb1' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-e32edc61-57a6-4c5f-bb74-2533e4b28fb1' class='xr-section-summary'  title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span>ncells</span>: 654400</li><li><span>cell_corners</span>: 4</li><li><span class='xr-has-index'>time</span>: 24</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-bb0070cb-6fe8-48e9-b0ba-a4cddce46493' class='xr-section-summary-in' type='checkbox'  checked><label for='section-bb0070cb-6fe8-48e9-b0ba-a4cddce46493' class='xr-section-summary' >Coordinates: <span>(5)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>lon</span></div><div class='xr-var-dims'>(ncells)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>0.0 0.3142 ... -0.6283 -0.3142</div><input id='attrs-862f1b4a-102c-442f-9a89-a4d79f1a4238' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-862f1b4a-102c-442f-9a89-a4d79f1a4238' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-ae543475-bfc5-4c87-ae1d-a3b44a266731' class='xr-var-data-in' type='checkbox'><label for='data-ae543475-bfc5-4c87-ae1d-a3b44a266731' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>longitude</dd><dt><span>units :</span></dt><dd>radian</dd><dt><span>bounds :</span></dt><dd>lon_bounds</dd></dl></div><div class='xr-var-data'><pre>array([ 0.        ,  0.31415927,  0.62831853, ..., -0.9424778 ,\n",
-       "       -0.62831853, -0.31415927])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>lat</span></div><div class='xr-var-dims'>(ncells)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>1.568 1.568 1.568 ... -1.568 -1.568</div><input id='attrs-5dfa3ad2-670b-43fa-ae05-dc2a8b45eab7' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-5dfa3ad2-670b-43fa-ae05-dc2a8b45eab7' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-b22d0dd8-55c8-452b-9306-64a485de099b' class='xr-var-data-in' type='checkbox'><label for='data-b22d0dd8-55c8-452b-9306-64a485de099b' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>latitudes</dd><dt><span>units :</span></dt><dd>radian</dd><dt><span>bounds :</span></dt><dd>lat_bounds</dd></dl></div><div class='xr-var-data'><pre>array([ 1.56779217,  1.56779217,  1.56779217, ..., -1.56779217,\n",
-       "       -1.56779217, -1.56779217])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>lon_bounds</span></div><div class='xr-var-dims'>(ncells, cell_corners)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>-0.1571 0.1571 ... -0.1571 -0.4712</div><input id='attrs-c64282f4-2ea9-469b-9efc-b15e18a35946' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-c64282f4-2ea9-469b-9efc-b15e18a35946' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-ed19c0e5-5f20-4f9d-a6b9-b5ba6263d0bf' class='xr-var-data-in' type='checkbox'><label for='data-ed19c0e5-5f20-4f9d-a6b9-b5ba6263d0bf' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>units :</span></dt><dd>radian</dd></dl></div><div class='xr-var-data'><pre>array([[-0.15707963,  0.15707963,  0.15707963, -0.15707963],\n",
-       "       [ 0.15707963,  0.4712389 ,  0.4712389 ,  0.15707963],\n",
-       "       [ 0.4712389 ,  0.78539816,  0.78539816,  0.4712389 ],\n",
-       "       ...,\n",
-       "       [-1.09955743, -0.78539816, -0.78539816, -1.09955743],\n",
-       "       [-0.78539816, -0.4712389 , -0.4712389 , -0.78539816],\n",
-       "       [-0.4712389 , -0.15707963, -0.15707963, -0.4712389 ]])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>lat_bounds</span></div><div class='xr-var-dims'>(ncells, cell_corners)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>1.57 1.57 1.566 ... -1.57 -1.57</div><input id='attrs-c0c3c0c5-ad84-4cb2-b142-8076665a3b94' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-c0c3c0c5-ad84-4cb2-b142-8076665a3b94' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-b8707b20-4842-4d83-b306-1b047384c543' class='xr-var-data-in' type='checkbox'><label for='data-b8707b20-4842-4d83-b306-1b047384c543' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>units :</span></dt><dd>radian</dd></dl></div><div class='xr-var-data'><pre>array([[ 1.56973799,  1.56973799,  1.56585785,  1.56585785],\n",
-       "       [ 1.56973799,  1.56973799,  1.56585785,  1.56585785],\n",
-       "       [ 1.56973799,  1.56973799,  1.56585785,  1.56585785],\n",
-       "       ...,\n",
-       "       [-1.56585785, -1.56585785, -1.56973799, -1.56973799],\n",
-       "       [-1.56585785, -1.56585785, -1.56973799, -1.56973799],\n",
-       "       [-1.56585785, -1.56585785, -1.56973799, -1.56973799]])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>time</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2020-01-25 ... 2020-01-25T23:00:00</div><input id='attrs-12ada5bf-c038-42d2-b5d7-269633756ee4' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-12ada5bf-c038-42d2-b5d7-269633756ee4' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-0ce4b3e4-6427-4929-8715-3fc35fba677d' class='xr-var-data-in' type='checkbox'><label for='data-0ce4b3e4-6427-4929-8715-3fc35fba677d' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>time</dd></dl></div><div class='xr-var-data'><pre>array([&#x27;2020-01-25T00:00:00.000000000&#x27;, &#x27;2020-01-25T01:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-01-25T02:00:00.000000000&#x27;, &#x27;2020-01-25T03:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-01-25T04:00:00.000000000&#x27;, &#x27;2020-01-25T05:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-01-25T06:00:00.000000000&#x27;, &#x27;2020-01-25T07:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-01-25T08:00:00.000000000&#x27;, &#x27;2020-01-25T09:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-01-25T10:00:00.000000000&#x27;, &#x27;2020-01-25T11:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-01-25T12:00:00.000000000&#x27;, &#x27;2020-01-25T13:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-01-25T14:00:00.000000000&#x27;, &#x27;2020-01-25T15:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-01-25T16:00:00.000000000&#x27;, &#x27;2020-01-25T17:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-01-25T18:00:00.000000000&#x27;, &#x27;2020-01-25T19:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-01-25T20:00:00.000000000&#x27;, &#x27;2020-01-25T21:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-01-25T22:00:00.000000000&#x27;, &#x27;2020-01-25T23:00:00.000000000&#x27;],\n",
-       "      dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-4a6cba3f-a095-4f54-861a-e432f167490c' class='xr-section-summary-in' type='checkbox'  checked><label for='section-4a6cba3f-a095-4f54-861a-e432f167490c' class='xr-section-summary' >Data variables: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>tcc</span></div><div class='xr-var-dims'>(time, ncells)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>1.0 1.0 1.0 ... 1.0 0.9991 0.9974</div><input id='attrs-2c35798a-4531-4b01-99c1-2801d7de8d6b' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-2c35798a-4531-4b01-99c1-2801d7de8d6b' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-7ab280c1-3cb9-4fe2-aabb-267e304c482d' class='xr-var-data-in' type='checkbox'><label for='data-7ab280c1-3cb9-4fe2-aabb-267e304c482d' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>Total cloud cover</dd><dt><span>units :</span></dt><dd>(0 - 1)</dd><dt><span>standard_name :</span></dt><dd>cloud_area_fraction</dd><dt><span>GRIB_paramId :</span></dt><dd>164</dd><dt><span>GRIB_shortName :</span></dt><dd>tcc</dd><dt><span>GRIB_units :</span></dt><dd>(0 - 1)</dd><dt><span>GRIB_name :</span></dt><dd>Total cloud cover</dd><dt><span>GRIB_cfName :</span></dt><dd>cloud_area_fraction</dd><dt><span>GRIB_cfVarName :</span></dt><dd>tcc</dd><dt><span>GRIB_dataType :</span></dt><dd>fc</dd><dt><span>GRIB_missingValue :</span></dt><dd>9999</dd><dt><span>GRIB_numberOfPoints :</span></dt><dd>654400</dd><dt><span>GRIB_totalNumber :</span></dt><dd>0</dd><dt><span>GRIB_typeOfLevel :</span></dt><dd>surface</dd><dt><span>GRIB_NV :</span></dt><dd>0</dd><dt><span>GRIB_stepUnits :</span></dt><dd>1</dd><dt><span>GRIB_stepType :</span></dt><dd>instant</dd><dt><span>GRIB_gridType :</span></dt><dd>reduced_gg</dd><dt><span>GRIB_gridDefinitionDescription :</span></dt><dd>Gaussian Latitude/Longitude Grid</dd><dt><span>gridtype :</span></dt><dd>reduced_gg</dd></dl></div><div class='xr-var-data'><pre>array([[1.        , 1.        , 1.        , ..., 0.9999907 , 0.99999797,\n",
-       "        0.99999857],\n",
-       "       [1.        , 1.        , 1.        , ..., 0.9999882 , 0.99996459,\n",
-       "        0.99990439],\n",
-       "       [1.        , 1.        , 1.        , ..., 1.        , 1.        ,\n",
-       "        0.99988604],\n",
-       "       ...,\n",
-       "       [1.        , 1.        , 1.        , ..., 0.99942195, 1.        ,\n",
-       "        0.99964535],\n",
-       "       [1.        , 1.        , 1.        , ..., 0.99998832, 0.99988174,\n",
-       "        0.99864197],\n",
-       "       [1.        , 0.99999988, 0.99999988, ..., 1.        , 0.99910724,\n",
-       "        0.99743497]])</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-a31b60ed-990a-44d4-9c57-a1ddf39dfbf5' class='xr-section-summary-in' type='checkbox'  ><label for='section-a31b60ed-990a-44d4-9c57-a1ddf39dfbf5' class='xr-section-summary' >Indexes: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-index-name'><div>time</div></div><div class='xr-index-preview'>PandasIndex</div><div></div><input id='index-43c517bb-309a-462b-9212-89f90b5b0ba3' class='xr-index-data-in' type='checkbox'/><label for='index-43c517bb-309a-462b-9212-89f90b5b0ba3' title='Show/Hide index repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-index-data'><pre>PandasIndex(DatetimeIndex([&#x27;2020-01-25 00:00:00&#x27;, &#x27;2020-01-25 01:00:00&#x27;,\n",
-       "               &#x27;2020-01-25 02:00:00&#x27;, &#x27;2020-01-25 03:00:00&#x27;,\n",
-       "               &#x27;2020-01-25 04:00:00&#x27;, &#x27;2020-01-25 05:00:00&#x27;,\n",
-       "               &#x27;2020-01-25 06:00:00&#x27;, &#x27;2020-01-25 07:00:00&#x27;,\n",
-       "               &#x27;2020-01-25 08:00:00&#x27;, &#x27;2020-01-25 09:00:00&#x27;,\n",
-       "               &#x27;2020-01-25 10:00:00&#x27;, &#x27;2020-01-25 11:00:00&#x27;,\n",
-       "               &#x27;2020-01-25 12:00:00&#x27;, &#x27;2020-01-25 13:00:00&#x27;,\n",
-       "               &#x27;2020-01-25 14:00:00&#x27;, &#x27;2020-01-25 15:00:00&#x27;,\n",
-       "               &#x27;2020-01-25 16:00:00&#x27;, &#x27;2020-01-25 17:00:00&#x27;,\n",
-       "               &#x27;2020-01-25 18:00:00&#x27;, &#x27;2020-01-25 19:00:00&#x27;,\n",
-       "               &#x27;2020-01-25 20:00:00&#x27;, &#x27;2020-01-25 21:00:00&#x27;,\n",
-       "               &#x27;2020-01-25 22:00:00&#x27;, &#x27;2020-01-25 23:00:00&#x27;],\n",
-       "              dtype=&#x27;datetime64[ns]&#x27;, name=&#x27;time&#x27;, freq=None))</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-b8fbf818-619d-450f-ad2e-962bf79e3092' class='xr-section-summary-in' type='checkbox'  checked><label for='section-b8fbf818-619d-450f-ad2e-962bf79e3092' class='xr-section-summary' >Attributes: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>history :</span></dt><dd>2024-03-12 21:17:57 Dataset retrieved by GSV interface;\n",
-       "2024-03-12 21:17:57 AQUA💧: Retrieved from IFS_fdb-tco399_fdb-long-2d using FDB;\n",
-       "2024-03-12 21:17:57 AQUA💧: Coordinates adjusted to ifs by fixer;\n",
-       "</dd></dl></div></li></ul></div></div>"
-      ],
-      "text/plain": [
-       "<xarray.Dataset> Size: 178MB\n",
-       "Dimensions:     (ncells: 654400, cell_corners: 4, time: 24)\n",
-       "Coordinates:\n",
-       "    lon         (ncells) float64 5MB 0.0 0.3142 0.6283 ... -0.6283 -0.3142\n",
-       "    lat         (ncells) float64 5MB 1.568 1.568 1.568 ... -1.568 -1.568 -1.568\n",
-       "    lon_bounds  (ncells, cell_corners) float64 21MB -0.1571 0.1571 ... -0.4712\n",
-       "    lat_bounds  (ncells, cell_corners) float64 21MB 1.57 1.57 ... -1.57 -1.57\n",
-       "  * time        (time) datetime64[ns] 192B 2020-01-25 ... 2020-01-25T23:00:00\n",
-       "Dimensions without coordinates: ncells, cell_corners\n",
-       "Data variables:\n",
-       "    tcc         (time, ncells) float64 126MB 1.0 1.0 1.0 ... 1.0 0.9991 0.9974\n",
-       "Attributes:\n",
-       "    history:  2024-03-12 21:17:57 Dataset retrieved by GSV interface;\\n2024-0..."
-      ]
-     },
-     "execution_count": 6,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "data0"
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "This is the first day. Let's instead loop over the next ones:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "0.6781007398342421\n",
-      "0.6781657240011126\n",
-      "0.6806634944743126\n",
-      "0.683525501616497\n"
-     ]
-    }
-   ],
-   "source": [
-    "for d in data:\n",
-    "    dm = reader.fldmean(d).mean(dim=\"time\").tcc\n",
-    "    print(dm.values)"
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "The generator is now exhausted, let's get a fresh one"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "data = reader.retrieve(startdate=\"20200401\", enddate=\"20200404\", var=\"tcc\")"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 9,
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "<generator object FixerMixin._fixergen at 0x7f4228e17640>"
-      ]
-     },
-     "execution_count": 9,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "data"
-   ]
-  },
-  {
-   "attachments": {},
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "The regridder can also operate on iterators:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 10,
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "<generator object Reader._regridgen at 0x7f4204afbae0>"
-      ]
-     },
-     "execution_count": 10,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "datar = reader.regrid(data)\n",
-    "datar"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 11,
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
-       "<defs>\n",
-       "<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
-       "<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
-       "<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
-       "<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
-       "</symbol>\n",
-       "<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
-       "<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
-       "<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
-       "<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
-       "<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
-       "</symbol>\n",
-       "</defs>\n",
-       "</svg>\n",
-       "<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
-       " *\n",
-       " */\n",
-       "\n",
-       ":root {\n",
-       "  --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
-       "  --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
-       "  --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
-       "  --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
-       "  --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
-       "  --xr-background-color: var(--jp-layout-color0, white);\n",
-       "  --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
-       "  --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
-       "}\n",
-       "\n",
-       "html[theme=dark],\n",
-       "body[data-theme=dark],\n",
-       "body.vscode-dark {\n",
-       "  --xr-font-color0: rgba(255, 255, 255, 1);\n",
-       "  --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
-       "  --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
-       "  --xr-border-color: #1F1F1F;\n",
-       "  --xr-disabled-color: #515151;\n",
-       "  --xr-background-color: #111111;\n",
-       "  --xr-background-color-row-even: #111111;\n",
-       "  --xr-background-color-row-odd: #313131;\n",
-       "}\n",
-       "\n",
-       ".xr-wrap {\n",
-       "  display: block !important;\n",
-       "  min-width: 300px;\n",
-       "  max-width: 700px;\n",
-       "}\n",
-       "\n",
-       ".xr-text-repr-fallback {\n",
-       "  /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
-       "  display: none;\n",
-       "}\n",
-       "\n",
-       ".xr-header {\n",
-       "  padding-top: 6px;\n",
-       "  padding-bottom: 6px;\n",
-       "  margin-bottom: 4px;\n",
-       "  border-bottom: solid 1px var(--xr-border-color);\n",
-       "}\n",
-       "\n",
-       ".xr-header > div,\n",
-       ".xr-header > ul {\n",
-       "  display: inline;\n",
-       "  margin-top: 0;\n",
-       "  margin-bottom: 0;\n",
-       "}\n",
-       "\n",
-       ".xr-obj-type,\n",
-       ".xr-array-name {\n",
-       "  margin-left: 2px;\n",
-       "  margin-right: 10px;\n",
-       "}\n",
-       "\n",
-       ".xr-obj-type {\n",
-       "  color: var(--xr-font-color2);\n",
-       "}\n",
-       "\n",
-       ".xr-sections {\n",
-       "  padding-left: 0 !important;\n",
-       "  display: grid;\n",
-       "  grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
-       "}\n",
-       "\n",
-       ".xr-section-item {\n",
-       "  display: contents;\n",
-       "}\n",
-       "\n",
-       ".xr-section-item input {\n",
-       "  display: none;\n",
-       "}\n",
-       "\n",
-       ".xr-section-item input + label {\n",
-       "  color: var(--xr-disabled-color);\n",
-       "}\n",
-       "\n",
-       ".xr-section-item input:enabled + label {\n",
-       "  cursor: pointer;\n",
-       "  color: var(--xr-font-color2);\n",
-       "}\n",
-       "\n",
-       ".xr-section-item input:enabled + label:hover {\n",
-       "  color: var(--xr-font-color0);\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary {\n",
-       "  grid-column: 1;\n",
-       "  color: var(--xr-font-color2);\n",
-       "  font-weight: 500;\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary > span {\n",
-       "  display: inline-block;\n",
-       "  padding-left: 0.5em;\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary-in:disabled + label {\n",
-       "  color: var(--xr-font-color2);\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary-in + label:before {\n",
-       "  display: inline-block;\n",
-       "  content: '►';\n",
-       "  font-size: 11px;\n",
-       "  width: 15px;\n",
-       "  text-align: center;\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary-in:disabled + label:before {\n",
-       "  color: var(--xr-disabled-color);\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary-in:checked + label:before {\n",
-       "  content: '▼';\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary-in:checked + label > span {\n",
-       "  display: none;\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary,\n",
-       ".xr-section-inline-details {\n",
-       "  padding-top: 4px;\n",
-       "  padding-bottom: 4px;\n",
-       "}\n",
-       "\n",
-       ".xr-section-inline-details {\n",
-       "  grid-column: 2 / -1;\n",
-       "}\n",
-       "\n",
-       ".xr-section-details {\n",
-       "  display: none;\n",
-       "  grid-column: 1 / -1;\n",
-       "  margin-bottom: 5px;\n",
-       "}\n",
-       "\n",
-       ".xr-section-summary-in:checked ~ .xr-section-details {\n",
-       "  display: contents;\n",
-       "}\n",
-       "\n",
-       ".xr-array-wrap {\n",
-       "  grid-column: 1 / -1;\n",
-       "  display: grid;\n",
-       "  grid-template-columns: 20px auto;\n",
-       "}\n",
-       "\n",
-       ".xr-array-wrap > label {\n",
-       "  grid-column: 1;\n",
-       "  vertical-align: top;\n",
-       "}\n",
-       "\n",
-       ".xr-preview {\n",
-       "  color: var(--xr-font-color3);\n",
-       "}\n",
-       "\n",
-       ".xr-array-preview,\n",
-       ".xr-array-data {\n",
-       "  padding: 0 5px !important;\n",
-       "  grid-column: 2;\n",
-       "}\n",
-       "\n",
-       ".xr-array-data,\n",
-       ".xr-array-in:checked ~ .xr-array-preview {\n",
-       "  display: none;\n",
-       "}\n",
-       "\n",
-       ".xr-array-in:checked ~ .xr-array-data,\n",
-       ".xr-array-preview {\n",
-       "  display: inline-block;\n",
-       "}\n",
-       "\n",
-       ".xr-dim-list {\n",
-       "  display: inline-block !important;\n",
-       "  list-style: none;\n",
-       "  padding: 0 !important;\n",
-       "  margin: 0;\n",
-       "}\n",
-       "\n",
-       ".xr-dim-list li {\n",
-       "  display: inline-block;\n",
-       "  padding: 0;\n",
-       "  margin: 0;\n",
-       "}\n",
-       "\n",
-       ".xr-dim-list:before {\n",
-       "  content: '(';\n",
-       "}\n",
-       "\n",
-       ".xr-dim-list:after {\n",
-       "  content: ')';\n",
-       "}\n",
-       "\n",
-       ".xr-dim-list li:not(:last-child):after {\n",
-       "  content: ',';\n",
-       "  padding-right: 5px;\n",
-       "}\n",
-       "\n",
-       ".xr-has-index {\n",
-       "  font-weight: bold;\n",
-       "}\n",
-       "\n",
-       ".xr-var-list,\n",
-       ".xr-var-item {\n",
-       "  display: contents;\n",
-       "}\n",
-       "\n",
-       ".xr-var-item > div,\n",
-       ".xr-var-item label,\n",
-       ".xr-var-item > .xr-var-name span {\n",
-       "  background-color: var(--xr-background-color-row-even);\n",
-       "  margin-bottom: 0;\n",
-       "}\n",
-       "\n",
-       ".xr-var-item > .xr-var-name:hover span {\n",
-       "  padding-right: 5px;\n",
-       "}\n",
-       "\n",
-       ".xr-var-list > li:nth-child(odd) > div,\n",
-       ".xr-var-list > li:nth-child(odd) > label,\n",
-       ".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
-       "  background-color: var(--xr-background-color-row-odd);\n",
-       "}\n",
-       "\n",
-       ".xr-var-name {\n",
-       "  grid-column: 1;\n",
-       "}\n",
-       "\n",
-       ".xr-var-dims {\n",
-       "  grid-column: 2;\n",
-       "}\n",
-       "\n",
-       ".xr-var-dtype {\n",
-       "  grid-column: 3;\n",
-       "  text-align: right;\n",
-       "  color: var(--xr-font-color2);\n",
-       "}\n",
-       "\n",
-       ".xr-var-preview {\n",
-       "  grid-column: 4;\n",
-       "}\n",
-       "\n",
-       ".xr-index-preview {\n",
-       "  grid-column: 2 / 5;\n",
-       "  color: var(--xr-font-color2);\n",
-       "}\n",
-       "\n",
-       ".xr-var-name,\n",
-       ".xr-var-dims,\n",
-       ".xr-var-dtype,\n",
-       ".xr-preview,\n",
-       ".xr-attrs dt {\n",
-       "  white-space: nowrap;\n",
-       "  overflow: hidden;\n",
-       "  text-overflow: ellipsis;\n",
-       "  padding-right: 10px;\n",
-       "}\n",
-       "\n",
-       ".xr-var-name:hover,\n",
-       ".xr-var-dims:hover,\n",
-       ".xr-var-dtype:hover,\n",
-       ".xr-attrs dt:hover {\n",
-       "  overflow: visible;\n",
-       "  width: auto;\n",
-       "  z-index: 1;\n",
-       "}\n",
-       "\n",
-       ".xr-var-attrs,\n",
-       ".xr-var-data,\n",
-       ".xr-index-data {\n",
-       "  display: none;\n",
-       "  background-color: var(--xr-background-color) !important;\n",
-       "  padding-bottom: 5px !important;\n",
-       "}\n",
-       "\n",
-       ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
-       ".xr-var-data-in:checked ~ .xr-var-data,\n",
-       ".xr-index-data-in:checked ~ .xr-index-data {\n",
-       "  display: block;\n",
-       "}\n",
-       "\n",
-       ".xr-var-data > table {\n",
-       "  float: right;\n",
-       "}\n",
-       "\n",
-       ".xr-var-name span,\n",
-       ".xr-var-data,\n",
-       ".xr-index-name div,\n",
-       ".xr-index-data,\n",
-       ".xr-attrs {\n",
-       "  padding-left: 25px !important;\n",
-       "}\n",
-       "\n",
-       ".xr-attrs,\n",
-       ".xr-var-attrs,\n",
-       ".xr-var-data,\n",
-       ".xr-index-data {\n",
-       "  grid-column: 1 / -1;\n",
-       "}\n",
-       "\n",
-       "dl.xr-attrs {\n",
-       "  padding: 0;\n",
-       "  margin: 0;\n",
-       "  display: grid;\n",
-       "  grid-template-columns: 125px auto;\n",
-       "}\n",
-       "\n",
-       ".xr-attrs dt,\n",
-       ".xr-attrs dd {\n",
-       "  padding: 0;\n",
-       "  margin: 0;\n",
-       "  float: left;\n",
-       "  padding-right: 10px;\n",
-       "  width: auto;\n",
-       "}\n",
-       "\n",
-       ".xr-attrs dt {\n",
-       "  font-weight: normal;\n",
-       "  grid-column: 1;\n",
-       "}\n",
-       "\n",
-       ".xr-attrs dt:hover span {\n",
-       "  display: inline-block;\n",
-       "  background: var(--xr-background-color);\n",
-       "  padding-right: 10px;\n",
-       "}\n",
-       "\n",
-       ".xr-attrs dd {\n",
-       "  grid-column: 2;\n",
-       "  white-space: pre-wrap;\n",
-       "  word-break: break-all;\n",
-       "}\n",
-       "\n",
-       ".xr-icon-database,\n",
-       ".xr-icon-file-text2,\n",
-       ".xr-no-icon {\n",
-       "  display: inline-block;\n",
-       "  vertical-align: middle;\n",
-       "  width: 1em;\n",
-       "  height: 1.5em !important;\n",
-       "  stroke-width: 0;\n",
-       "  stroke: currentColor;\n",
-       "  fill: currentColor;\n",
-       "}\n",
-       "</style><pre class='xr-text-repr-fallback'>&lt;xarray.Dataset&gt; Size: 3MB\n",
-       "Dimensions:  (time: 24, lat: 90, lon: 180)\n",
-       "Coordinates:\n",
-       "  * time     (time) datetime64[ns] 192B 2020-04-01 ... 2020-04-01T23:00:00\n",
-       "  * lat      (lat) float64 720B -89.0 -87.0 -85.0 -83.0 ... 83.0 85.0 87.0 89.0\n",
-       "  * lon      (lon) float64 1kB 0.0 2.0 4.0 6.0 8.0 ... 352.0 354.0 356.0 358.0\n",
-       "Data variables:\n",
-       "    tcc      (time, lat, lon) float64 3MB dask.array&lt;chunksize=(24, 90, 180), meta=np.ndarray&gt;\n",
-       "Attributes:\n",
-       "    history:  2024-03-12 21:21:30 Dataset retrieved by GSV interface;\\n2024-0...</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-d914f3ea-fb90-4948-bf5a-d5e9046f5652' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-d914f3ea-fb90-4948-bf5a-d5e9046f5652' class='xr-section-summary'  title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span class='xr-has-index'>time</span>: 24</li><li><span class='xr-has-index'>lat</span>: 90</li><li><span class='xr-has-index'>lon</span>: 180</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-d7ecb3b3-462a-4c1f-91cc-fddc55ee2aab' class='xr-section-summary-in' type='checkbox'  checked><label for='section-d7ecb3b3-462a-4c1f-91cc-fddc55ee2aab' class='xr-section-summary' >Coordinates: <span>(3)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>time</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2020-04-01 ... 2020-04-01T23:00:00</div><input id='attrs-e0dae3d4-d299-4875-aa2f-6ca72d1e9bb2' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-e0dae3d4-d299-4875-aa2f-6ca72d1e9bb2' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-15728cd5-db38-46c3-977c-b1b739f82f85' class='xr-var-data-in' type='checkbox'><label for='data-15728cd5-db38-46c3-977c-b1b739f82f85' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>time</dd></dl></div><div class='xr-var-data'><pre>array([&#x27;2020-04-01T00:00:00.000000000&#x27;, &#x27;2020-04-01T01:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-04-01T02:00:00.000000000&#x27;, &#x27;2020-04-01T03:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-04-01T04:00:00.000000000&#x27;, &#x27;2020-04-01T05:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-04-01T06:00:00.000000000&#x27;, &#x27;2020-04-01T07:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-04-01T08:00:00.000000000&#x27;, &#x27;2020-04-01T09:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-04-01T10:00:00.000000000&#x27;, &#x27;2020-04-01T11:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-04-01T12:00:00.000000000&#x27;, &#x27;2020-04-01T13:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-04-01T14:00:00.000000000&#x27;, &#x27;2020-04-01T15:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-04-01T16:00:00.000000000&#x27;, &#x27;2020-04-01T17:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-04-01T18:00:00.000000000&#x27;, &#x27;2020-04-01T19:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-04-01T20:00:00.000000000&#x27;, &#x27;2020-04-01T21:00:00.000000000&#x27;,\n",
-       "       &#x27;2020-04-01T22:00:00.000000000&#x27;, &#x27;2020-04-01T23:00:00.000000000&#x27;],\n",
-       "      dtype=&#x27;datetime64[ns]&#x27;)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>lat</span></div><div class='xr-var-dims'>(lat)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>-89.0 -87.0 -85.0 ... 87.0 89.0</div><input id='attrs-4abbe459-1973-4bf8-960a-03e7849e50ea' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-4abbe459-1973-4bf8-960a-03e7849e50ea' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-56b3878c-1a44-4b38-ae8a-0d1b4b55742a' class='xr-var-data-in' type='checkbox'><label for='data-56b3878c-1a44-4b38-ae8a-0d1b4b55742a' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>units :</span></dt><dd>degrees_north</dd><dt><span>standard_name :</span></dt><dd>latitude</dd><dt><span>axis :</span></dt><dd>Y</dd></dl></div><div class='xr-var-data'><pre>array([-89., -87., -85., -83., -81., -79., -77., -75., -73., -71., -69., -67.,\n",
-       "       -65., -63., -61., -59., -57., -55., -53., -51., -49., -47., -45., -43.,\n",
-       "       -41., -39., -37., -35., -33., -31., -29., -27., -25., -23., -21., -19.,\n",
-       "       -17., -15., -13., -11.,  -9.,  -7.,  -5.,  -3.,  -1.,   1.,   3.,   5.,\n",
-       "         7.,   9.,  11.,  13.,  15.,  17.,  19.,  21.,  23.,  25.,  27.,  29.,\n",
-       "        31.,  33.,  35.,  37.,  39.,  41.,  43.,  45.,  47.,  49.,  51.,  53.,\n",
-       "        55.,  57.,  59.,  61.,  63.,  65.,  67.,  69.,  71.,  73.,  75.,  77.,\n",
-       "        79.,  81.,  83.,  85.,  87.,  89.])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>lon</span></div><div class='xr-var-dims'>(lon)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>0.0 2.0 4.0 ... 354.0 356.0 358.0</div><input id='attrs-91ce07e8-31f1-45f0-bf73-9d01914bbaf9' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-91ce07e8-31f1-45f0-bf73-9d01914bbaf9' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-b186f651-a165-42ee-b73c-0bf1b2bf1804' class='xr-var-data-in' type='checkbox'><label for='data-b186f651-a165-42ee-b73c-0bf1b2bf1804' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>units :</span></dt><dd>degrees_east</dd><dt><span>standard_name :</span></dt><dd>longitude</dd><dt><span>axis :</span></dt><dd>X</dd></dl></div><div class='xr-var-data'><pre>array([  0.,   2.,   4.,   6.,   8.,  10.,  12.,  14.,  16.,  18.,  20.,  22.,\n",
-       "        24.,  26.,  28.,  30.,  32.,  34.,  36.,  38.,  40.,  42.,  44.,  46.,\n",
-       "        48.,  50.,  52.,  54.,  56.,  58.,  60.,  62.,  64.,  66.,  68.,  70.,\n",
-       "        72.,  74.,  76.,  78.,  80.,  82.,  84.,  86.,  88.,  90.,  92.,  94.,\n",
-       "        96.,  98., 100., 102., 104., 106., 108., 110., 112., 114., 116., 118.,\n",
-       "       120., 122., 124., 126., 128., 130., 132., 134., 136., 138., 140., 142.,\n",
-       "       144., 146., 148., 150., 152., 154., 156., 158., 160., 162., 164., 166.,\n",
-       "       168., 170., 172., 174., 176., 178., 180., 182., 184., 186., 188., 190.,\n",
-       "       192., 194., 196., 198., 200., 202., 204., 206., 208., 210., 212., 214.,\n",
-       "       216., 218., 220., 222., 224., 226., 228., 230., 232., 234., 236., 238.,\n",
-       "       240., 242., 244., 246., 248., 250., 252., 254., 256., 258., 260., 262.,\n",
-       "       264., 266., 268., 270., 272., 274., 276., 278., 280., 282., 284., 286.,\n",
-       "       288., 290., 292., 294., 296., 298., 300., 302., 304., 306., 308., 310.,\n",
-       "       312., 314., 316., 318., 320., 322., 324., 326., 328., 330., 332., 334.,\n",
-       "       336., 338., 340., 342., 344., 346., 348., 350., 352., 354., 356., 358.])</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-90e3fd78-0a0f-452e-ae93-91e61ea33cd0' class='xr-section-summary-in' type='checkbox'  checked><label for='section-90e3fd78-0a0f-452e-ae93-91e61ea33cd0' class='xr-section-summary' >Data variables: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>tcc</span></div><div class='xr-var-dims'>(time, lat, lon)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>dask.array&lt;chunksize=(24, 90, 180), meta=np.ndarray&gt;</div><input id='attrs-2d2b59c2-5b6a-4598-a15b-dc6b4667cf7c' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-2d2b59c2-5b6a-4598-a15b-dc6b4667cf7c' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-f7bf2c7b-d445-4207-976b-8e8f48c9789b' class='xr-var-data-in' type='checkbox'><label for='data-f7bf2c7b-d445-4207-976b-8e8f48c9789b' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>Total cloud cover</dd><dt><span>units :</span></dt><dd>(0 - 1)</dd><dt><span>standard_name :</span></dt><dd>cloud_area_fraction</dd><dt><span>GRIB_paramId :</span></dt><dd>164</dd><dt><span>GRIB_shortName :</span></dt><dd>tcc</dd><dt><span>GRIB_units :</span></dt><dd>(0 - 1)</dd><dt><span>GRIB_name :</span></dt><dd>Total cloud cover</dd><dt><span>GRIB_cfName :</span></dt><dd>cloud_area_fraction</dd><dt><span>GRIB_cfVarName :</span></dt><dd>tcc</dd><dt><span>GRIB_dataType :</span></dt><dd>fc</dd><dt><span>GRIB_missingValue :</span></dt><dd>9999</dd><dt><span>GRIB_numberOfPoints :</span></dt><dd>654400</dd><dt><span>GRIB_totalNumber :</span></dt><dd>0</dd><dt><span>GRIB_typeOfLevel :</span></dt><dd>surface</dd><dt><span>GRIB_NV :</span></dt><dd>0</dd><dt><span>GRIB_stepUnits :</span></dt><dd>1</dd><dt><span>GRIB_stepType :</span></dt><dd>instant</dd><dt><span>GRIB_gridType :</span></dt><dd>reduced_gg</dd><dt><span>GRIB_gridDefinitionDescription :</span></dt><dd>Gaussian Latitude/Longitude Grid</dd><dt><span>gridtype :</span></dt><dd>reduced_gg</dd><dt><span>regridded :</span></dt><dd>1</dd></dl></div><div class='xr-var-data'><table>\n",
-       "    <tr>\n",
-       "        <td>\n",
-       "            <table style=\"border-collapse: collapse;\">\n",
-       "                <thead>\n",
-       "                    <tr>\n",
-       "                        <td> </td>\n",
-       "                        <th> Array </th>\n",
-       "                        <th> Chunk </th>\n",
-       "                    </tr>\n",
-       "                </thead>\n",
-       "                <tbody>\n",
-       "                    \n",
-       "                    <tr>\n",
-       "                        <th> Bytes </th>\n",
-       "                        <td> 2.97 MiB </td>\n",
-       "                        <td> 2.97 MiB </td>\n",
-       "                    </tr>\n",
-       "                    \n",
-       "                    <tr>\n",
-       "                        <th> Shape </th>\n",
-       "                        <td> (24, 90, 180) </td>\n",
-       "                        <td> (24, 90, 180) </td>\n",
-       "                    </tr>\n",
-       "                    <tr>\n",
-       "                        <th> Dask graph </th>\n",
-       "                        <td colspan=\"2\"> 1 chunks in 23 graph layers </td>\n",
-       "                    </tr>\n",
-       "                    <tr>\n",
-       "                        <th> Data type </th>\n",
-       "                        <td colspan=\"2\"> float64 numpy.ndarray </td>\n",
-       "                    </tr>\n",
-       "                </tbody>\n",
-       "            </table>\n",
-       "        </td>\n",
-       "        <td>\n",
-       "        <svg width=\"203\" height=\"133\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n",
-       "\n",
-       "  <!-- Horizontal lines -->\n",
-       "  <line x1=\"10\" y1=\"0\" x2=\"33\" y2=\"23\" style=\"stroke-width:2\" />\n",
-       "  <line x1=\"10\" y1=\"60\" x2=\"33\" y2=\"83\" style=\"stroke-width:2\" />\n",
-       "\n",
-       "  <!-- Vertical lines -->\n",
-       "  <line x1=\"10\" y1=\"0\" x2=\"10\" y2=\"60\" style=\"stroke-width:2\" />\n",
-       "  <line x1=\"33\" y1=\"23\" x2=\"33\" y2=\"83\" style=\"stroke-width:2\" />\n",
-       "\n",
-       "  <!-- Colored Rectangle -->\n",
-       "  <polygon points=\"10.0,0.0 33.60242404034126,23.60242404034126 33.60242404034126,83.60242404034126 10.0,60.0\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n",
-       "\n",
-       "  <!-- Horizontal lines -->\n",
-       "  <line x1=\"10\" y1=\"0\" x2=\"130\" y2=\"0\" style=\"stroke-width:2\" />\n",
-       "  <line x1=\"33\" y1=\"23\" x2=\"153\" y2=\"23\" style=\"stroke-width:2\" />\n",
-       "\n",
-       "  <!-- Vertical lines -->\n",
-       "  <line x1=\"10\" y1=\"0\" x2=\"33\" y2=\"23\" style=\"stroke-width:2\" />\n",
-       "  <line x1=\"130\" y1=\"0\" x2=\"153\" y2=\"23\" style=\"stroke-width:2\" />\n",
-       "\n",
-       "  <!-- Colored Rectangle -->\n",
-       "  <polygon points=\"10.0,0.0 130.0,0.0 153.60242404034125,23.60242404034126 33.60242404034126,23.60242404034126\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n",
-       "\n",
-       "  <!-- Horizontal lines -->\n",
-       "  <line x1=\"33\" y1=\"23\" x2=\"153\" y2=\"23\" style=\"stroke-width:2\" />\n",
-       "  <line x1=\"33\" y1=\"83\" x2=\"153\" y2=\"83\" style=\"stroke-width:2\" />\n",
-       "\n",
-       "  <!-- Vertical lines -->\n",
-       "  <line x1=\"33\" y1=\"23\" x2=\"33\" y2=\"83\" style=\"stroke-width:2\" />\n",
-       "  <line x1=\"153\" y1=\"23\" x2=\"153\" y2=\"83\" style=\"stroke-width:2\" />\n",
-       "\n",
-       "  <!-- Colored Rectangle -->\n",
-       "  <polygon points=\"33.60242404034126,23.60242404034126 153.60242404034125,23.60242404034126 153.60242404034125,83.60242404034126 33.60242404034126,83.60242404034126\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n",
-       "\n",
-       "  <!-- Text -->\n",
-       "  <text x=\"93.602424\" y=\"103.602424\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >180</text>\n",
-       "  <text x=\"173.602424\" y=\"53.602424\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,173.602424,53.602424)\">90</text>\n",
-       "  <text x=\"11.801212\" y=\"91.801212\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,11.801212,91.801212)\">24</text>\n",
-       "</svg>\n",
-       "        </td>\n",
-       "    </tr>\n",
-       "</table></div></li></ul></div></li><li class='xr-section-item'><input id='section-feaefdcc-3088-4fa3-b41c-a3270aeaf927' class='xr-section-summary-in' type='checkbox'  ><label for='section-feaefdcc-3088-4fa3-b41c-a3270aeaf927' class='xr-section-summary' >Indexes: <span>(3)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-index-name'><div>time</div></div><div class='xr-index-preview'>PandasIndex</div><div></div><input id='index-ed510233-ced5-43a7-a2ea-d3fa400636bc' class='xr-index-data-in' type='checkbox'/><label for='index-ed510233-ced5-43a7-a2ea-d3fa400636bc' title='Show/Hide index repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-index-data'><pre>PandasIndex(DatetimeIndex([&#x27;2020-04-01 00:00:00&#x27;, &#x27;2020-04-01 01:00:00&#x27;,\n",
-       "               &#x27;2020-04-01 02:00:00&#x27;, &#x27;2020-04-01 03:00:00&#x27;,\n",
-       "               &#x27;2020-04-01 04:00:00&#x27;, &#x27;2020-04-01 05:00:00&#x27;,\n",
-       "               &#x27;2020-04-01 06:00:00&#x27;, &#x27;2020-04-01 07:00:00&#x27;,\n",
-       "               &#x27;2020-04-01 08:00:00&#x27;, &#x27;2020-04-01 09:00:00&#x27;,\n",
-       "               &#x27;2020-04-01 10:00:00&#x27;, &#x27;2020-04-01 11:00:00&#x27;,\n",
-       "               &#x27;2020-04-01 12:00:00&#x27;, &#x27;2020-04-01 13:00:00&#x27;,\n",
-       "               &#x27;2020-04-01 14:00:00&#x27;, &#x27;2020-04-01 15:00:00&#x27;,\n",
-       "               &#x27;2020-04-01 16:00:00&#x27;, &#x27;2020-04-01 17:00:00&#x27;,\n",
-       "               &#x27;2020-04-01 18:00:00&#x27;, &#x27;2020-04-01 19:00:00&#x27;,\n",
-       "               &#x27;2020-04-01 20:00:00&#x27;, &#x27;2020-04-01 21:00:00&#x27;,\n",
-       "               &#x27;2020-04-01 22:00:00&#x27;, &#x27;2020-04-01 23:00:00&#x27;],\n",
-       "              dtype=&#x27;datetime64[ns]&#x27;, name=&#x27;time&#x27;, freq=None))</pre></div></li><li class='xr-var-item'><div class='xr-index-name'><div>lat</div></div><div class='xr-index-preview'>PandasIndex</div><div></div><input id='index-6fd4a033-5b68-4fab-9c0f-df893ca70475' class='xr-index-data-in' type='checkbox'/><label for='index-6fd4a033-5b68-4fab-9c0f-df893ca70475' title='Show/Hide index repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-index-data'><pre>PandasIndex(Index([-89.0, -87.0, -85.0, -83.0, -81.0, -79.0, -77.0, -75.0, -73.0, -71.0,\n",
-       "       -69.0, -67.0, -65.0, -63.0, -61.0, -59.0, -57.0, -55.0, -53.0, -51.0,\n",
-       "       -49.0, -47.0, -45.0, -43.0, -41.0, -39.0, -37.0, -35.0, -33.0, -31.0,\n",
-       "       -29.0, -27.0, -25.0, -23.0, -21.0, -19.0, -17.0, -15.0, -13.0, -11.0,\n",
-       "        -9.0,  -7.0,  -5.0,  -3.0,  -1.0,   1.0,   3.0,   5.0,   7.0,   9.0,\n",
-       "        11.0,  13.0,  15.0,  17.0,  19.0,  21.0,  23.0,  25.0,  27.0,  29.0,\n",
-       "        31.0,  33.0,  35.0,  37.0,  39.0,  41.0,  43.0,  45.0,  47.0,  49.0,\n",
-       "        51.0,  53.0,  55.0,  57.0,  59.0,  61.0,  63.0,  65.0,  67.0,  69.0,\n",
-       "        71.0,  73.0,  75.0,  77.0,  79.0,  81.0,  83.0,  85.0,  87.0,  89.0],\n",
-       "      dtype=&#x27;float64&#x27;, name=&#x27;lat&#x27;))</pre></div></li><li class='xr-var-item'><div class='xr-index-name'><div>lon</div></div><div class='xr-index-preview'>PandasIndex</div><div></div><input id='index-fdd7e1c6-8506-407b-82a6-b40e68083e78' class='xr-index-data-in' type='checkbox'/><label for='index-fdd7e1c6-8506-407b-82a6-b40e68083e78' title='Show/Hide index repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-index-data'><pre>PandasIndex(Index([  0.0,   2.0,   4.0,   6.0,   8.0,  10.0,  12.0,  14.0,  16.0,  18.0,\n",
-       "       ...\n",
-       "       340.0, 342.0, 344.0, 346.0, 348.0, 350.0, 352.0, 354.0, 356.0, 358.0],\n",
-       "      dtype=&#x27;float64&#x27;, name=&#x27;lon&#x27;, length=180))</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-0e737efb-7032-4aa1-9198-962208b803fa' class='xr-section-summary-in' type='checkbox'  checked><label for='section-0e737efb-7032-4aa1-9198-962208b803fa' class='xr-section-summary' >Attributes: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>history :</span></dt><dd>2024-03-12 21:21:30 Dataset retrieved by GSV interface;\n",
-       "2024-03-12 21:21:30 AQUA💧: Retrieved from IFS_fdb-tco399_fdb-long-2d using FDB;\n",
-       "2024-03-12 21:21:30 AQUA💧: Coordinates adjusted to ifs by fixer;\n",
-       "2024-03-12 21:21:30 AQUA💧: Regrid from tco399 to r200;\n",
-       "</dd></dl></div></li></ul></div></div>"
-      ],
-      "text/plain": [
-       "<xarray.Dataset> Size: 3MB\n",
-       "Dimensions:  (time: 24, lat: 90, lon: 180)\n",
-       "Coordinates:\n",
-       "  * time     (time) datetime64[ns] 192B 2020-04-01 ... 2020-04-01T23:00:00\n",
-       "  * lat      (lat) float64 720B -89.0 -87.0 -85.0 -83.0 ... 83.0 85.0 87.0 89.0\n",
-       "  * lon      (lon) float64 1kB 0.0 2.0 4.0 6.0 8.0 ... 352.0 354.0 356.0 358.0\n",
-       "Data variables:\n",
-       "    tcc      (time, lat, lon) float64 3MB dask.array<chunksize=(24, 90, 180), meta=np.ndarray>\n",
-       "Attributes:\n",
-       "    history:  2024-03-12 21:21:30 Dataset retrieved by GSV interface;\\n2024-0..."
-      ]
-     },
-     "execution_count": 11,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "next(datar)"
-   ]
-  },
   {
    "cell_type": "code",
    "execution_count": 22,
diff --git a/notebooks/reader/streaming.ipynb b/notebooks/reader/streaming.ipynb
index a6a2f8ba86..18540d3c8d 100644
--- a/notebooks/reader/streaming.ipynb
+++ b/notebooks/reader/streaming.ipynb
@@ -4409,93 +4409,6 @@
     "As requested, we got a chunk of 6 3-hours steps."
    ]
   },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Another possibility to deal with data streaming is to call the `generator` method of the `Streaming` class.\n",
-    "This can be done in the Reader initialization through the argument `stream_generator = True`."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 13,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from aqua import Reader"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 14,
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "<generator object Streaming.generator at 0x7f9e162d7520>"
-      ]
-     },
-     "execution_count": 14,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "reader = Reader(model='MSWEP',exp='past',source='3hourly', stream_generator = 'True', aggregation = 'monthly', startdate = '2019-01-01')\n",
-    "data_gen = reader.retrieve()\n",
-    "data_gen"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "`data_gen` is now a generator object that yields the requested one-month-long chunks of data. We can do operations with them by iterating on the generator object:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 15,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "start_date: 2019-01-01T00:00:00.000000000 stop_date: 2019-01-31T21:00:00.000000000\n",
-      "start_date: 2019-02-01T00:00:00.000000000 stop_date: 2019-02-28T21:00:00.000000000\n",
-      "start_date: 2019-03-01T00:00:00.000000000 stop_date: 2019-03-31T21:00:00.000000000\n",
-      "start_date: 2019-04-01T00:00:00.000000000 stop_date: 2019-04-30T21:00:00.000000000\n",
-      "start_date: 2019-05-01T00:00:00.000000000 stop_date: 2019-05-31T21:00:00.000000000\n",
-      "start_date: 2019-06-01T00:00:00.000000000 stop_date: 2019-06-30T21:00:00.000000000\n",
-      "start_date: 2019-07-01T00:00:00.000000000 stop_date: 2019-07-31T21:00:00.000000000\n",
-      "start_date: 2019-08-01T00:00:00.000000000 stop_date: 2019-08-31T21:00:00.000000000\n",
-      "start_date: 2019-09-01T00:00:00.000000000 stop_date: 2019-09-30T21:00:00.000000000\n",
-      "start_date: 2019-10-01T00:00:00.000000000 stop_date: 2019-10-31T21:00:00.000000000\n",
-      "start_date: 2019-11-01T00:00:00.000000000 stop_date: 2019-11-30T21:00:00.000000000\n",
-      "start_date: 2019-12-01T00:00:00.000000000 stop_date: 2019-12-31T21:00:00.000000000\n",
-      "start_date: 2020-01-01T00:00:00.000000000 stop_date: 2020-01-31T21:00:00.000000000\n",
-      "start_date: 2020-02-01T00:00:00.000000000 stop_date: 2020-02-29T21:00:00.000000000\n",
-      "start_date: 2020-03-01T00:00:00.000000000 stop_date: 2020-03-31T21:00:00.000000000\n",
-      "start_date: 2020-04-01T00:00:00.000000000 stop_date: 2020-04-30T21:00:00.000000000\n",
-      "start_date: 2020-05-01T00:00:00.000000000 stop_date: 2020-05-31T21:00:00.000000000\n",
-      "start_date: 2020-06-01T00:00:00.000000000 stop_date: 2020-06-30T21:00:00.000000000\n",
-      "start_date: 2020-07-01T00:00:00.000000000 stop_date: 2020-07-31T21:00:00.000000000\n",
-      "start_date: 2020-08-01T00:00:00.000000000 stop_date: 2020-08-31T21:00:00.000000000\n",
-      "start_date: 2020-09-01T00:00:00.000000000 stop_date: 2020-09-30T21:00:00.000000000\n",
-      "start_date: 2020-10-01T00:00:00.000000000 stop_date: 2020-10-31T21:00:00.000000000\n",
-      "start_date: 2020-11-01T00:00:00.000000000 stop_date: 2020-11-30T21:00:00.000000000\n",
-      "start_date: 2020-12-01T00:00:00.000000000 stop_date: 2020-12-31T00:00:00.000000000\n"
-     ]
-    }
-   ],
-   "source": [
-    "for data in data_gen:\n",
-    "    print(f\"start_date: {data.time[0].values} stop_date: {data.time[-1].values}\")"
-   ]
-  },
   {
    "attachments": {},
    "cell_type": "markdown",
@@ -5119,7 +5032,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "aqua",
+   "display_name": "Python 3",
    "language": "python",
    "name": "python3"
   },
@@ -5133,14 +5046,9 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.11.8"
+   "version": "3.12.8"
   },
-  "orig_nbformat": 4,
-  "vscode": {
-   "interpreter": {
-    "hash": "88e88d32e8cfc2717744c3f75a836af9272880df87f5d09fc5f136c562603a80"
-   }
-  }
+  "orig_nbformat": 4
  },
  "nbformat": 4,
  "nbformat_minor": 2
diff --git a/pyproject.toml b/pyproject.toml
index d64b7fb719..8cf125dff8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -130,7 +130,6 @@ source = ["src/aqua"]
 omit = [
     "tests/*", 
     "**/__init__.py",
-    "src/aqua/lra_generator/opa_generator.py",
     "src/aqua/slurm/slurm.py",
     "src/aqua_diagnostics/dummy"
     ]
diff --git a/src/aqua/logger.py b/src/aqua/logger.py
index 974241214e..c7d731bbe9 100644
--- a/src/aqua/logger.py
+++ b/src/aqua/logger.py
@@ -105,58 +105,27 @@ def _check_loglevel(log_level=None):
 
     return log_level
 
-
 def log_history(data, msg):
-    """
-    Elementary provenance logger in the history attribute also for iterators.
-
-    Args:
-        data: a dataset or a iterator
-        msg: a string with the message to be logged
-
-    Returns:
-        The dataset or the iterator with the history attribute updated
-    """
-    if isinstance(data, types.GeneratorType):
-        data = _log_history_iter(data, msg)
-        return data
-    else:
-        _log_history(data, msg)
-        return data
-
-
-def _log_history_iter(data, msg):
-    """
-    Iterator loop convenience function for log_history_iter
-
-    Args:
-        data: an iterator
-        msg: a string with the message to be logged
-    """
-    for ds in data:
-        log_history(ds, msg)
-        yield ds
-
-
-def _log_history(data, msg):
     """
     Elementary provenance logger in the history attribute
 
     Args:
         data: a dataset or a dataarray
         msg: a string with the message to be logged
+    Returns:
+        The dataset with the history attribute updated
     """
+    now = datetime.datetime.now()
+    date_now = now.strftime("%Y-%m-%d %H:%M:%S")
+    hist = data.attrs.get("history", "")
 
-    if isinstance(data, (xr.DataArray, xr.Dataset)):
-        now = datetime.datetime.now()
-        date_now = now.strftime("%Y-%m-%d %H:%M:%S")
-        hist = data.attrs.get("history", "")
+    # check that there is a new line at the end of the current history
+    if not hist.endswith("\n"):
+        hist += "\n"
+    hist += f"{date_now} AQUA💧: {msg};\n"
+    data.attrs.update({"history": hist})
 
-        # check that there is a new line at the end of the current history
-        if not hist.endswith("\n"):
-            hist += "\n"
-        hist += f"{date_now} AQUA💧: {msg};\n"
-        data.attrs.update({"history": hist})
+    return data
 
 
 class CustomLogColors(logging.Formatter):
@@ -203,4 +172,4 @@ def format(self, record):
         datefmt = '%Y-%m-%d %H:%M:%S'
         formatter = logging.Formatter(fmt=log_fmt, datefmt=datefmt)
 
-        return formatter.format(record)
+        return formatter.format(record)
\ No newline at end of file
diff --git a/src/aqua/lra_generator/lra_generator.py b/src/aqua/lra_generator/lra_generator.py
index 41b49c7643..4a7435edb1 100644
--- a/src/aqua/lra_generator/lra_generator.py
+++ b/src/aqua/lra_generator/lra_generator.py
@@ -529,9 +529,6 @@ def _write_var(self, var):
         """Call write var for generator or catalog access"""
         t_beg = time()
 
-        if isinstance(self.data, types.GeneratorType):
-            raise ValueError('Generator no longer supported by AQUA LRA.')
-
         self._write_var_catalog(var)
 
         t_end = time()
diff --git a/src/aqua/lra_generator/opa_generator.py b/src/aqua/lra_generator/opa_generator.py
deleted file mode 100644
index 8366b61810..0000000000
--- a/src/aqua/lra_generator/opa_generator.py
+++ /dev/null
@@ -1,372 +0,0 @@
-"""OPA generator class to support OPA creation"""
-
-import os
-import copy
-import warnings
-import dask
-import numpy as np
-import xarray as xr
-from dask.distributed import Client, LocalCluster
-from one_pass.opa import Opa
-from aqua.logger import log_configure
-from aqua.util import create_folder, load_yaml, dump_yaml
-from aqua.util import ConfigPath
-from aqua.reader import Reader
-
-
-# Filter the specific warning
-warnings.filterwarnings(
-    "ignore",
-    message="Converting non-nanosecond precision datetime values to nanosecond precision",
-    category=UserWarning
-)
-
-
-class OPAgenerator():
-
-    """This class serves as wrapper of the OPA to be used within AQUA"""
-
-    @property
-    def dask(self):
-        """Check if dask is needed"""
-        return self.nproc > 1
-
-    def __init__(self,
-                 model=None, exp=None, source=None, zoom=None,
-                 var=None, frequency=None,
-                 checkpoint=True, stream_step=5,
-                 outdir=None, tmpdir=None, configdir=None,
-                 loglevel=None, overwrite=False, definitive=False,
-                 nproc=1):
-        """
-        Initialize the LRA_Generator class
-
-        Args:
-            model (string):          The model name from the catalog
-            exp (string):            The experiment name from the catalog
-            source (string):         The sourceid name from the catalog
-            zoom (int):              Healpix level of zoom
-            var (str, list):         Variable(s) to be processed
-            frequency (string):      The target frequency for averaging the OPA
-            checkpoint (bool, opt):  Whether OPA should use or not checkpointing
-            stream_step (int, opt):  How many days OPA should load at once
-            outdir (string):         Where the LRA is
-            tmpdir (string):         Where to store temporary files,
-                                     default is None.
-                                     Necessary for dask.distributed
-            configdir (string):      Configuration directory where the catalog
-                                     are found
-            loglevel (string, opt):  Logging level
-            overwrite (bool, opt):   True to overwrite existing files in LRA,
-                                     default is False
-            definitive (bool, opt):  True to create the output file,
-                                     False to just explore the reader
-                                     operations, default is False
-            nproc (int, opt):        Number of dask workers to use. default is 1
-        """
-
-        self.logger = log_configure(loglevel, 'opa_generator')
-        self.loglevel = loglevel
-        self.checkpoint = checkpoint
-        self.stream_step = stream_step
-
-        self.overwrite = overwrite
-        if self.overwrite:
-            self.logger.info('File will be overwritten if already existing.')
-
-        self.definitive = definitive
-        if not self.definitive:
-            self.logger.warning('IMPORTANT: no file will be created, this is a dry run')
-
-        if model:
-            self.model = model
-        else:
-            raise KeyError('Please specify model.')
-
-        if exp:
-            self.exp = exp
-        else:
-            raise KeyError('Please specify experiment.')
-
-        if source:
-            self.source = source
-        else:
-            raise KeyError('Please specify source.')
-
-        self.zoom = zoom
-        if zoom is not None:
-            self.logger.info('Zoom level set at: %s', str(zoom))
-
-        Configurer = ConfigPath(configdir=configdir)
-        self.configdir = Configurer.configdir
-        self.catalog = Configurer.catalog
-
-        # Initialize variable(s)
-        self.var = var
-
-        if not self.var:
-            raise KeyError('Please specify variable string or list.')
-        self.logger.warning('Variable(s) to be processed: %s', self.var)
-        if isinstance(self.var, str):
-            self.var = [self.var]
-
-        self.frequency = frequency
-
-        self.outdir = os.path.join(outdir, self.model, self.exp)
-        if self.frequency:
-            self.outdir = os.path.join(self.outdir, self.frequency)
-
-        self.tmpdir = tmpdir
-        # self.checkpoint = os.path.join(self.tmpdir, "checkpoint.pickle")
-
-        create_folder(self.outdir, loglevel=self.loglevel)
-        create_folder(self.tmpdir, loglevel=self.loglevel)
-
-        self.nproc = int(nproc)
-        self.opa_dict = None
-        self.checkpoint_file = None
-        self.reader = None
-        self.timedelta = 60
-        self.entry_name = f'tmp-opa-{self.frequency}'
-
-        if self.nproc > 1:
-            self.logger.info('Running dask.distributed with %s workers',
-                             self.nproc)
-
-        self.client = None
-        self.cluster = None
-
-    def retrieve(self):
-        """
-        Retrieve data from the catalog
-        """
-        self.logger.info('Accessing catalog for %s-%s-%s...',
-                         self.model, self.exp, self.source)
-
-        # Initialize the reader
-        self.reader = Reader(model=self.model, exp=self.exp,
-                             source=self.source, zoom=self.zoom,
-                             configdir=self.configdir,
-                             loglevel=self.loglevel)
-
-        self.logger.info('Getting the timedelta to inform the OPA...')
-        self._get_timedelta()
-
-    def _get_timedelta(self):
-        """
-        Get the timedelta from the catalog
-        """
-
-        data = self.reader.retrieve(var=self.var)
-        if not isinstance(data, xr.Dataset):
-            data = next(data)
-
-        time_diff = np.diff(data.time.values).astype('timedelta64[m]')
-        self.timedelta = time_diff[0].astype(int)
-        self.logger.info('Timedelta is %s minutes', str(self.timedelta))
-
-    def _configure_opa(self, var):
-        """
-        Set up the OPA
-        """
-
-        self.opa_dict = {
-            "stat": "mean",
-            # "percentile_list": None,
-            # "thresh_exceed" : None,
-            "stat_freq": self.frequency,
-            "output_freq": "monthly",
-            "time_step": self.timedelta,
-            "variable": var,
-            "save": True,
-            "checkpoint": self.checkpoint,
-            "save_filepath": self.outdir,
-            "checkpoint_filepath": self.tmpdir
-        }
-
-        return Opa(self.opa_dict)
-
-    def generate_opa(self, gsv=False, start=None, end=None):
-        """
-        Run the actual computation of the OPA looping on the dataset
-        and on the variables
-        """
-
-        self._set_dask()
-        for variable in self.var:
-            self.logger.warning('Setting up OPA at %s frequency for variable %s...',
-                                self.frequency, variable)
-
-            self.logger.warning('Initializing the OPA')
-            opa_mean = self._configure_opa(variable)
-
-            # get info on the checkpoint file
-            if self.checkpoint:
-                self.checkpoint_file = opa_mean.checkpoint_file
-                # HACK: solve the problem with one-pass @
-                # git+https://earth.bsc.es/gitlab/digital-twins/de_340/one_pass.git@3b90576652a8510171225af2de8d86fde3b315ff
-                opa_mean.checkpoint_file_zarr = opa_mean.checkpoint_file + ".zarr"
-
-            # self.checkpoint_file = opa_mean.checkpoint_file
-            # self.remove_checkpoint()
-            print(vars(opa_mean))
-
-            if not gsv:
-                self.logger.warning('Initializing the streaming generator...')
-                self.reader.reset_stream()
-                data_gen = self.reader.retrieve(stream_generator=True,
-                                                stream_step=self.stream_step,
-                                                stream_unit='days',
-                                                var=self.var)
-            else:
-                self.logger.warning('Initializing the FDB access...')
-                data_gen = self.reader.retrieve(startdate=start, enddate=end, var=self.var)
-
-            for data in data_gen:
-                self.logger.info(f"start_date: {data.time[0].values} stop_date: {data.time[-1].values}")
-
-                if self.definitive:
-                    mydata = data[variable]  # .load()
-                    # print(mydata)
-                    opa_mean.compute(mydata)
-                    if os.path.exists(self.checkpoint_file):
-                        file_size = os.path.getsize(self.checkpoint_file)
-                        formatted_size = format_size(file_size)
-                        self.logger.info('The size of the checkpoint file is %s', formatted_size)
-
-        self._close_dask()
-
-    def create_catalog_entry(self):
-        """
-        Create an entry in the catalog for the LRA in both source and
-        regrid yaml
-        """
-
-        self.logger.warning('Creating catalog entry %s %s %s',
-                            self.model, self.exp, self.entry_name)
-
-        # define the block to be uploaded into the catalog
-        block_cat = {
-            'driver': 'netcdf',
-            'args': {
-                'urlpath': os.path.join(self.outdir, f'*{self.frequency}_mean.nc'),
-                'chunks': {},
-                'xarray_kwargs': {
-                    'decode_times': True
-                }
-            }
-        }
-
-        if self.zoom:
-            block_zoom = {
-                'parameters': {
-                    'zoom': {
-                        'allowed': [self.zoom],
-                        'default': self.zoom,
-                        'description': 'zoom resolution of the dataset',
-                        'type': 'int'
-                    }
-                }
-            }
-            block_cat.update(block_zoom)
-
-        # find the catalog of my experiment
-        catalogfile = os.path.join(self.configdir, 'catalogs', self.catalog,
-                                   'catalog', self.model, self.exp + '.yaml')
-
-        # load, add the block and close
-        cat_file = load_yaml(catalogfile)
-        cat_file['sources'][self.entry_name] = block_cat
-        dump_yaml(outfile=catalogfile, cfg=cat_file)
-
-        # find the regrid of my experiment
-        regridfile = os.path.join(self.configdir, 'catalogs', self.catalog,
-                                  'regrid.yaml')
-        cat_file = load_yaml(regridfile)
-        dictexp = cat_file['sources'][self.model][self.exp]
-        if self.source in dictexp:
-            regrid_entry = dictexp[self.source]
-        elif 'default' in dictexp:
-            self.logger.warning('No entry found for source %s, assuming the default', self.source)
-            regrid_entry = dictexp['default']
-        else:
-            raise KeyError('Cannot find experiment information regrid file')
-
-        cat_file['sources'][self.model][self.exp][self.entry_name] = copy.deepcopy(regrid_entry)
-
-        dump_yaml(outfile=regridfile, cfg=cat_file)
-
-    def _remove_catalog_entry(self):
-        """Remove the entries"""
-
-        self.logger.warning('Removing catalog entry %s %s %s',
-                            self.model, self.exp, self.entry_name)
-
-        # find the catalog of my experiment
-        catalogfile = os.path.join(self.configdir, 'catalogs', self.catalog,
-                                   'catalog', self.model, self.exp + '.yaml')
-        cat_file = load_yaml(catalogfile)
-        if self.entry_name in cat_file['sources']:
-            del cat_file['sources'][self.entry_name]
-        dump_yaml(outfile=catalogfile, cfg=cat_file)
-
-    def _remove_checkpoint(self):
-        """Be sure that the checkpoint is removed"""
-
-        if os.path.exists(self.checkpoint_file):
-            self.logger.warning('Removing checkpoint file %s ',
-                                self.checkpoint_file)
-            os.remove(self.checkpoint_file)
-
-    def _remove_data(self):
-        """Clean the OPA data which are no longer necessary"""
-
-        for file_name in os.listdir(self.outdir):
-            if file_name.endswith('.nc'):
-                file_path = os.path.join(self.outdir, file_name)
-                self.logger.warning('Removing file %s ', file_path)
-                os.remove(file_path)
-
-    def clean(self):
-        """Clean after a OPA run"""
-
-        self._remove_catalog_entry()
-        if self.checkpoint:
-            self._remove_checkpoint()
-        self._remove_data()
-
-    def _set_dask(self):
-        """
-        Set up dask cluster
-        """
-        if self.dask:  # self.nproc > 1
-            self.logger.info('Setting up dask cluster with %s workers',
-                             self.nproc)
-            dask.config.set({'temporary_directory': self.tmpdir})
-            self.logger.info('Temporary directory: %s', self.tmpdir)
-            self.cluster = LocalCluster(n_workers=self.nproc,
-                                        threads_per_worker=1)
-            self.client = Client(self.cluster)
-        else:
-            self.logger.info('Dask is disabled...')
-            dask.config.set(scheduler='synchronous')
-
-    def _close_dask(self):
-        """
-        Close dask cluster
-        """
-        if self.dask:  # self.nproc > 1
-            self.client.shutdown()
-            self.cluster.close()
-            self.logger.info('Dask cluster closed')
-
-
-def format_size(size):
-    """Trivial function for formatting file size"""
-    power = 2**10
-    n = 0
-    units = ['bytes', 'KB', 'MB', 'GB', 'TB']
-    while size > power:
-        size /= power
-        n += 1
-    return f"{round(size, 2)} {units[n]}"
diff --git a/src/aqua/reader/fixer.py b/src/aqua/reader/fixer.py
index 3344b1a4f0..aa002f62a3 100644
--- a/src/aqua/reader/fixer.py
+++ b/src/aqua/reader/fixer.py
@@ -369,19 +369,7 @@ def _load_default_fixes(self, fix_model):
 
         return default_fixes
 
-    def fixer(self, data, var, **kwargs):
-        """Call the fixer function returning container or iterator"""
-        if isinstance(data, types.GeneratorType):
-            return self._fixergen(data, var, **kwargs)
-        else:
-            return self._fixer(data, var, **kwargs)
-
-    def _fixergen(self, data, var, **kwargs):
-        """Iterator version of the fixer"""
-        for ds in data:
-            yield self._fixer(ds, var, keep_memory=True, **kwargs)
-
-    def _fixer(self, data, destvar, apply_unit_fix=True, keep_memory=False):
+    def fixer(self, data, destvar, apply_unit_fix=True):
         """
         Perform fixes (var name, units, coord name adjustments) of the input dataset.
 
@@ -391,8 +379,6 @@ def _fixer(self, data, destvar, apply_unit_fix=True, keep_memory=False):
             apply_unit_fix (bool):  if to perform immediately unit conversions (which requite a product or an addition).
                                     The fixer sets anyway an offset or a multiplicative factor in the data attributes.
                                     These can be applied also later with the method `apply_unit_fix`. (true)
-            keep_memory (bool):     if to keep memory of the previous fields (used for decumulation of iterators)
-
         Returns:
             A xarray.Dataset containing the fixed data and target units, factors and offsets in variable attributes.
         """
@@ -596,7 +582,7 @@ def _fixer(self, data, destvar, apply_unit_fix=True, keep_memory=False):
 
         # decumulate if necessary and fix first of month if necessary
         if vars_to_fix:
-            data = self._wrapper_decumulate(data, vars_to_fix, varlist, keep_memory, jump)
+            data = self._wrapper_decumulate(data, vars_to_fix, varlist, jump)
             if nanfirst_enddate:  # This is a temporary fix for IFS data, run ony if an end date is specified
                 data = self._wrapper_nanfirst(data, vars_to_fix, varlist,
                                               startdate=nanfirst_startdate,
@@ -692,7 +678,7 @@ def _timeshifter(self, data):
 
         return field
 
-    def _wrapper_decumulate(self, data, variables, varlist, keep_memory, jump):
+    def _wrapper_decumulate(self, data, variables, varlist, jump):
         """
         Wrapper function for decumulation, which takes into account the requirement of
         keeping into memory the last step for streaming/fdb purposes
@@ -701,16 +687,12 @@ def _wrapper_decumulate(self, data, variables, varlist, keep_memory, jump):
             Data: Xarray Dataset
             variables: The fixes of the variables
             varlist: the variable dictionary with the old and new names
-            keep_memory: if to keep memory of the previous fields (used for decumulation of iterators)
             jump: the jump for decumulation
 
         Returns:
             Dataset with decumulated fixes
         """
 
-        fkeep = False
-        if keep_memory:
-            data1 = data.isel(time=-1)  # save last timestep for possible future use
         for var in variables:
             # Decumulate if required
             if variables[var].get("decumulate", None):
@@ -718,23 +700,10 @@ def _wrapper_decumulate(self, data, variables, varlist, keep_memory, jump):
                 if varname in data.variables:
                     self.logger.debug("Starting decumulation for variable %s", varname)
                     keep_first = variables[var].get("keep_first", True)
-                    if keep_memory:  # Special case for iterators
-                        fkeep = True  # We have decumulated at least once and we need to keep data
-                        if not self.previous_data:
-                            previous_data = xr.zeros_like(data[varname].isel(time=0))
-                        else:
-                            previous_data = self.previous_data[varname]
-                        data[varname] = self.simple_decumulate(data[varname],
-                                                               jump=jump,
-                                                               keep_first=keep_first,
-                                                               keep_memory=previous_data)
-                    else:
-                        data[varname] = self.simple_decumulate(data[varname],
-                                                               jump=jump,
-                                                               keep_first=keep_first)
+                    data[varname] = self.simple_decumulate(data[varname],
+                                                            jump=jump,
+                                                            keep_first=keep_first)
                     log_history(data[varname], f"Variable {varname} decumulated by fixer")
-        if fkeep:
-            self.previous_data = data1  # keep the last timestep for further decumulations
 
         return data
 
@@ -1031,7 +1000,7 @@ def get_fixer_varname(self, var):
         self.logger.debug("Variables to be loaded: %s", loadvar)
         return loadvar
 
-    def simple_decumulate(self, data, jump=None, keep_first=True, keep_memory=None):
+    def simple_decumulate(self, data, jump=None, keep_first=True):
         """
         Remove cumulative effect on IFS fluxes.
 
@@ -1040,7 +1009,6 @@ def simple_decumulate(self, data, jump=None, keep_first=True, keep_memory=None):
             jump (str):              used to fix periodic jumps (a very specific NextGEMS IFS issue)
                                      Examples: jump='month' (the NextGEMS case), jump='day')
             keep_first (bool):       if to keep the first value as it is (True) or place a 0 (False)
-            keep_memory (DataArray): data from previous step
 
         Returns:
             A xarray.DataArray where the cumulation has been removed
@@ -1055,10 +1023,6 @@ def simple_decumulate(self, data, jump=None, keep_first=True, keep_memory=None):
             zeros = data.isel(time=0)
         else:
             zeros = xr.zeros_like(data.isel(time=0))
-        if isinstance(keep_memory, xr.DataArray):
-            data0 = data.isel(time=0)
-            keep_memory = keep_memory.assign_coords(time=data0.time)  # We need them to have the same time
-            zeros = data0 - keep_memory
 
         deltas = xr.concat([zeros, deltas], dim='time').transpose('time', ...)
 
diff --git a/src/aqua/reader/reader.py b/src/aqua/reader/reader.py
index 177b65678d..1f32c1de5a 100644
--- a/src/aqua/reader/reader.py
+++ b/src/aqua/reader/reader.py
@@ -49,7 +49,7 @@ def __init__(self, model=None, exp=None, source=None, catalog=None,
                  fix=True,
                  regrid=None, regrid_method=None,
                  areas=True, datamodel=None,
-                 streaming=False, stream_generator=False,
+                 streaming=False,
                  startdate=None, enddate=None,
                  rebuild=False, loglevel=None, nproc=4,
                  aggregation=None, chunks=None,
@@ -73,7 +73,6 @@ def __init__(self, model=None, exp=None, source=None, catalog=None,
             datamodel (str, optional): Destination data model for coordinates, overrides the one in fixes.yaml.
                                        Defaults to None.
             streaming (bool, optional): If to retrieve data in a streaming mode. Defaults to False.
-            stream_generator (bool, optional): if to return a generator object for data streaming. Defaults to False
             startdate (str, optional): The starting date for reading/streaming the data (e.g. '2020-02-25'). Defaults to None.
             enddate (str, optional): The final date for reading/streaming the data (e.g. '2020-03-25'). Defaults to None.
             rebuild (bool, optional): Force rebuilding of area and weight files. Defaults to False.
@@ -122,9 +121,6 @@ def __init__(self, model=None, exp=None, source=None, catalog=None,
         self.src_grid_area = None
         self.dst_grid_area = None
 
-        if stream_generator:  # Stream generator also implies streaming
-            streaming = True
-
         if streaming:
             self.streamer = Streaming(startdate=startdate,
                                       enddate=enddate,
@@ -133,14 +129,11 @@ def __init__(self, model=None, exp=None, source=None, catalog=None,
             # Export streaming methods TO DO: probably useless
             self.reset_stream = self.streamer.reset
             self.stream = self.streamer.stream
-
-        self.stream_generator = stream_generator
         self.streaming = streaming
 
         self.startdate = startdate
         self.enddate = enddate
 
-        self.previous_data = None  # used for FDB iterator fixing
         self.sample_data = None  # used to avoid multiple calls of retrieve_plain
 
         # define configuration file and paths
@@ -506,9 +499,6 @@ def retrieve(self, var=None, level=None,
             A xarray.Dataset containing the required data.
         """
 
-        # Streaming emulator require these to be defined in __init__
-        if (self.streaming and not self.stream_generator) and (startdate or enddate):
-            raise KeyError("In case of streaming=true the arguments startdate/enddate have to be specified when initializing the class.")  # noqa E501
 
         if not startdate:  # In case the streaming startdate is used also for FDB copy it
             startdate = self.startdate
@@ -544,7 +534,6 @@ def retrieve(self, var=None, level=None,
             else:
                 loadvar = None
 
-        fiter = False
         ffdb = False
         # If this is an ESM-intake catalog use first dictionary value,
         if isinstance(self.esmcat, intake_esm.core.esm_datastore):
@@ -552,8 +541,7 @@ def retrieve(self, var=None, level=None,
         # If this is an fdb entry
         elif isinstance(self.esmcat, aqua.gsv.intake_gsv.GSVSource):
             data = self.reader_fdb(self.esmcat, loadvar, startdate, enddate,
-                                   dask=(not self.stream_generator), level=level)
-            fiter = self.stream_generator  # this returs an iterator unless dask is set
+                                   dask=True, level=level)
             ffdb = True  # These data have been read from fdb
         else:
             data = self.reader_intake(self.esmcat, var, loadvar)
@@ -578,14 +566,10 @@ def retrieve(self, var=None, level=None,
                 if not hasattr(data[var], 'units'):
                     self.logger.warning('Variable %s has no units!', var)
 
-        if not fiter:  # This is not needed if we already have an iterator
-            if self.streaming:
-                if self.stream_generator:
-                    data = self.streamer.generator(data, startdate=startdate, enddate=enddate)
-                else:
-                    data = self.streamer.stream(data)
-            elif startdate and enddate and not ffdb:  # do not select if data come from FDB (already done)
-                data = data.sel(time=slice(startdate, enddate))
+        if self.streaming:
+            data = self.streamer.stream(data)
+        elif startdate and enddate and not ffdb:  # do not select if data come from FDB (already done)
+            data = data.sel(time=slice(startdate, enddate))
 
         if isinstance(data, xr.Dataset):
             data.aqua.set_default(self)  # This links the dataset accessor to this instance of the Reader class
@@ -644,22 +628,7 @@ def set_default(self):
 
         Reader.instance = self  # Refresh the latest reader instance used
 
-    def regrid(self, data):
-        """Call the regridder function returning container or iterator"""
-
-        if self.dst_grid_name is None:
-            raise NoRegridError('regrid has not been initialized in the Reader, cannot perform any regrid.')
-
-        if isinstance(data, types.GeneratorType):
-            return self._regridgen(data)
-        else:
-            return self._regrid(data)
-
-    def _regridgen(self, data):
-        for ds in data:
-            yield self._regrid(ds)
-
-    def _regrid(self, datain):
+    def regrid(self, datain):
         """
         Perform regridding of the input dataset.
 
@@ -1050,18 +1019,18 @@ def reader_esm(self, esmcat, var):
 
     def reader_fdb(self, esmcat, var, startdate, enddate, dask=False, level=None):
         """
-        Read fdb data. Returns an iterator or dask array.
+        Read fdb data. Returns a dask array.
 
         Args:
             esmcat (intake catalog): the intake catalog to read
             var (str, int or list): the variable(s) to read
             startdate (str): a starting date and time in the format YYYYMMDD:HHTT
             enddate (str): an ending date and time in the format YYYYMMDD:HHTT
-            dask (bool): return directly a dask array instead of an iterator
+            dask (bool): return directly a dask array
             level (list, float, int): level to be read, overriding default in catalog
 
         Returns:
-            An xarray.Dataset or an iterator over datasets
+            An xarray.Dataset 
         """
         # Var can be a list or a single one of these cases:
         # - an int, in which case it is a paramid
diff --git a/src/aqua/reader/regrid.py b/src/aqua/reader/regrid.py
index 437860add2..9e993662d5 100644
--- a/src/aqua/reader/regrid.py
+++ b/src/aqua/reader/regrid.py
@@ -285,7 +285,7 @@ def _get_source_grid(self, source_grid, vert_coord):
     def _retrieve_plain(self, *args, **kwargs):
         """
         Retrieves making sure that no fixer and agregation are used,
-        read only first variable and converts iterator to data
+        read only first variable
         """
         if self.sample_data is not None:
             self.logger.debug('Sample data already availabe, avoid _retrieve_plain()')
@@ -320,9 +320,6 @@ def _retrieve_plain(self, *args, **kwargs):
         self.enddate = enddate
         self.preproc = preproc
 
-        if isinstance(data, types.GeneratorType):
-            data = next(data)
-
         # select only first relevant variable
         variables = [var for var in data.data_vars if
                 not var.endswith("_bnds") and not var.startswith("bounds") and not var.endswith("_bounds")]
diff --git a/src/aqua/reader/streaming.py b/src/aqua/reader/streaming.py
index 7ab9c15f0f..8ecdfd0625 100644
--- a/src/aqua/reader/streaming.py
+++ b/src/aqua/reader/streaming.py
@@ -118,30 +118,6 @@ def stream(self, data, startdate=None, enddate=None, aggregation=None,
             self.idx += 1
             return (data.sel(time=slice(date1, date2)))
 
-    def generator(self, data, startdate=None, enddate=None, aggregation=None):
-        """
-        The generator method is designed to split data into smaller chunks of data for
-        processing or analysis. It returns a generator object that yields the smaller chunks of data.
-        The method can split the data based on either a specific time interval or by a specific number of samples.
-        Aggregation (frequency/chunking) and starting and ending dates selected at class instantiation can
-        be overwritten.
-
-        Arguments:
-            data (xr.Dataset):      the input xarray.Dataset
-            startdate (str): the starting date for streaming the data (e.g. '2020-02-25') (None)
-            enddate (str): the ending date for streaming the data (e.g. '2021-01-01') (None)
-            aggregation (str): the streaming frequency in pandas style (1M, 7D etc.)
-        Returns:
-            A generator object that yields the smaller chunks of data.
-        """
-
-        timechunks = self.stream_chunk(data, startdate=startdate, enddate=enddate, aggregation=aggregation)
-
-        self.idx = 0  # reset in case stream has been called before
-        for idx in range(0, len(timechunks)):
-            yield self.stream(data, startdate=startdate, enddate=enddate,
-                              aggregation=aggregation, timechunks=timechunks)
-
     def reset(self):
         """
         Reset the state of the streaming process.
diff --git a/src/aqua/reader/timstat.py b/src/aqua/reader/timstat.py
index cd07b05f87..c6c48325bc 100644
--- a/src/aqua/reader/timstat.py
+++ b/src/aqua/reader/timstat.py
@@ -47,38 +47,6 @@ def timstd(self, data, freq=None, exclude_incomplete=False,
                             time_bounds=time_bounds, center_time=center_time)
 
     def timstat(self, data, stat='mean', freq=None, exclude_incomplete=False,
-                time_bounds=False, center_time=False):
-        """
-        Perform daily, monthly and yearly time statistics.
-        Wrapper for _timstat function, which is called differently if data is a generator or not.
-
-        Arguments:
-            data (xr.Dataset):  the input xarray.Dataset
-            stat (string):      the statistical operation to be performed ('mean' is default)
-                                supported also 'min', 'max' and 'std'
-            freq (str):         the frequency of the time averaging.
-                                Valid values are monthly, daily, yearly. Defaults to None.
-            exclude_incomplete (bool):  Check if averages is done on complete chunks, and remove from the output
-                                        chunks which have not all the expected records.
-            time_bound (bool):  option to create the time bounds.
-            center_time (bool): option to center the time coordinate to the middle of the averaging period.
-
-        Returns:
-            A xarray.Dataset containing the time averaged data.
-        """
-        if isinstance(data, types.GeneratorType):
-            return self._timstatgen(data, freq=freq, stat=stat, exclude_incomplete=exclude_incomplete,
-                                    time_bounds=time_bounds, center_time=center_time)
-        else:
-            return self._timstat(data, freq=freq, stat=stat, exclude_incomplete=exclude_incomplete,
-                                 time_bounds=time_bounds, center_time=center_time)
-
-    def _timstatgen(self, data, **kwargs):
-        """Call the timstat function for iterators"""
-        for ds in data:
-            yield self._timstat(ds, **kwargs)
-
-    def _timstat(self, data, stat='mean', freq=None, exclude_incomplete=False,
                  time_bounds=False, center_time=False):
         """
         Perform daily, monthly and yearly time statistics.
diff --git a/tests/test_catalog.py b/tests/test_catalog.py
index ef4a94ba07..22a475cf11 100644
--- a/tests/test_catalog.py
+++ b/tests/test_catalog.py
@@ -57,10 +57,8 @@ def test_catalog(reader):
     """
     aaa, bbb = reader
     assert isinstance(aaa, Reader)
-    try:
-        assert isinstance(bbb, xarray.Dataset)
-    except AssertionError: #fdb is a generator
-        assert isinstance(bbb, types.GeneratorType)
+    assert isinstance(bbb, xarray.Dataset)
+
 
 @pytest.mark.sbatch
 def test_catalog_reader(reader_regrid):
diff --git a/tests/test_gsv.py b/tests/test_gsv.py
index 4dff9d081b..356e0bd4ff 100644
--- a/tests/test_gsv.py
+++ b/tests/test_gsv.py
@@ -110,21 +110,16 @@ def test_gsv_read_chunked(self, gsv: GSVSource) -> None:
     def test_reader(self) -> None:
         """Simple test, to check that catalog access works and reads correctly"""
 
-        reader = Reader(model="IFS", exp="test-fdb", source="fdb", chunks="D",
-                        stream_generator=True, loglevel=loglevel)
+        reader = Reader(model="IFS", exp="test-fdb", source="fdb", loglevel=loglevel)
         data = reader.retrieve(startdate='20080101T1200', enddate='20080101T1200', var='t')
-        assert isinstance(data, types.GeneratorType), 'Reader does not return iterator'
-        dd = next(data)
-        assert dd.t.GRIB_paramId == 130, 'Wrong GRIB param in data'
+        assert data.t.GRIB_paramId == 130, 'Wrong GRIB param in data'
 
     def test_reader_novar(self) -> None:
         """Simple test, to check that catalog access works and reads correctly, no var"""
 
-        reader = Reader(model="IFS", exp="test-fdb", source="fdb",
-                        stream_generator=True, loglevel=loglevel)
+        reader = Reader(model="IFS", exp="test-fdb", source="fdb", loglevel=loglevel)
         data = reader.retrieve()
-        dd = next(data)
-        assert dd.t.GRIB_paramId == 130, 'Wrong GRIB param in data'
+        assert data.t.GRIB_paramId == 130, 'Wrong GRIB param in data'
 
     def test_reader_xarray(self) -> None:
         """Reading directly into xarray"""
@@ -133,7 +128,7 @@ def test_reader_xarray(self) -> None:
         data = reader.retrieve()
         assert isinstance(data, xr.Dataset), "Does not return a Dataset"
         assert data.t.mean().data == pytest.approx(279.3509), "Field values incorrect"
-
+        
     def test_reader_paramid(self) -> None:
         """
         Reading with the variable paramid, we use '130' instead of 't'
diff --git a/tests/test_streaming.py b/tests/test_streaming.py
index dc1d42160d..5e8653cf14 100644
--- a/tests/test_streaming.py
+++ b/tests/test_streaming.py
@@ -70,17 +70,4 @@ def test_stream(self, reader_instance_with_args):
         # Test if reset_stream works
         reader.reset_stream()
         data = reader.retrieve()
-        assert data.time.values[0] == start_date
-
-
-    def test_generator(self):
-        """
-        Test generator option of streaming mode
-        """
-        reader = Reader(model='IFS', exp='test-tco79', source='long', fix = False, stream_generator = True, startdate = '2020-05-01', aggregation = 'monthly')
-        data_gen = reader.retrieve()
-        start_dates = ["2020-05-01", "2020-06-01", "2020-07-01", "2020-08-01"]
-        i = 0
-        for data in data_gen:
-            assert data.time[0].values == pd.to_datetime(start_dates[i])
-            i+=1
+        assert data.time.values[0] == start_date
\ No newline at end of file


Reviews:
user: login: mnurisso
body: Everything seems fine.
However in the end there is no modification in the intake_gsv, I'd be for cleaning also there, cc @jhardenberg 
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-11T15:03:54Z
user: login: silviacaprioli
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-11T17:49:54Z
user: login: mnurisso
body: I'd be for a merge, the decision on the intake_gsv has been taken, if I don't see any complain I'll soon merge it.
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-03-13T14:23:19Z

Review comments:
diff_hunk: @@ -105,8 +105,8 @@ by the users, but things can be speed up if we target a specific catalog. This c
     reader = Reader(model='IFS-NEMO', exp='historical-1990', source='lra-r100-monthly', catalog='climatedt-phase1')
     data = reader.retrieve()
 
-Dask and Iterator access
-^^^^^^^^^^^^^^^^^^^^^^^^
+Dask and streaming capabilities
+^^^^^^^^^^
path: docs/sphinx/source/reader.rst
user: login: mnurisso
body: You need to match the title with the decoration to make it work while compiling
created_at: 2025-03-11T14:55:39Z
author_association: COLLABORATOR
diff_hunk: @@ -645,19 +629,13 @@ def set_default(self):
         Reader.instance = self  # Refresh the latest reader instance used
 
     def regrid(self, data):
path: src/aqua/reader/reader.py
user: login: mnurisso
body: This was a wrapper isn't it? There is need for the `regrid` and then the hidden `_regrid` methods?
created_at: 2025-03-11T15:00:51Z
author_association: COLLABORATOR
diff_hunk: @@ -645,19 +629,13 @@ def set_default(self):
         Reader.instance = self  # Refresh the latest reader instance used
 
     def regrid(self, data):
path: src/aqua/reader/reader.py
user: login: silviacaprioli
body: I agree, let's just rename the `_regrid` and remove the wrapper
created_at: 2025-03-11T17:49:54Z
author_association: COLLABORATOR

PR comments:
user: login: codecov[bot]
created_at: 2025-03-03T19:53:20Z
body: ## [Codecov](https://app.codecov.io/gh/DestinE-Climate-DT/AQUA/pull/1791?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DestinE-Climate-DT) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 57.91%. Comparing base [(`2c1481f`)](https://app.codecov.io/gh/DestinE-Climate-DT/AQUA/commit/2c1481fc21c9a97567a3884c6464f4861174f0be?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DestinE-Climate-DT) to head [(`e960ec1`)](https://app.codecov.io/gh/DestinE-Climate-DT/AQUA/commit/e960ec11570dc73909eff8afafd426ae5f70a8f8?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DestinE-Climate-DT).
> Report is 7 commits behind head on main.

:white_check_mark: All tests successful. No failed tests found.

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main    #1791      +/-   ##
==========================================
- Coverage   57.95%   57.91%   -0.05%     
==========================================
  Files          68       68              
  Lines        8701     8633      -68     
  Branches     1603     1581      -22     
==========================================
- Hits         5043     5000      -43     
+ Misses       3041     3025      -16     
+ Partials      617      608       -9     
```

</details>
author_association: NONE
user: login: silviacaprioli
created_at: 2025-03-04T17:21:53Z
body: Almost done here, but I have a couple of questions:

1. Not sure what to do with the `keep_memory` option in `fixer  `  
 `def fixer(self, data, destvar, apply_unit_fix=True, keep_memory=False)`
Is it only relevant for iterators, right? Should I remove it?

2. I haven't made any changes to intake_gsv.py; I only removed the usage of the iterator in Reader & co.
Is it fine? or should I revise also the intake_gsv?

@mnurisso @oloapinivad @jhardenberg 

author_association: COLLABORATOR
user: login: mnurisso
created_at: 2025-03-05T15:08:49Z
body: > Not sure what to do with the keep_memory option in fixer  
def fixer(self, data, destvar, apply_unit_fix=True, keep_memory=False)
Is it only relevant for iterators, right? Should I remove it?

`keep_memory` according to docstring is also for decumulation, so it is still needed. Anyway in _wrapper_decumulate there is still a special case for iterators. Tagging @oloapinivad since he's the last one that worked on that part of code (line 709 in `fixer.py` from this branch)

> I haven't made any changes to intake_gsv.py; I only removed the usage of the iterator in Reader & co.
Is it fine? or should I revise also the intake_gsv?

From my inspection there is some if else with `self.dask_access`, but this value is always true. Tagging @jhardenberg for a second opinion. I think the strategy is if `to_dask` is called then `self.dask_access` exists otherwise no, but I don't think not having a value in the `__init__` is a clean way to use it.

Other places to check:

- `self.previous_data = None  # used for FDB iterator fixing` probably linked to the decumulation above, to be checked (initialization in `reader.py`)
- Mention of iterators in `_retrieve_plain `docstrings.
author_association: COLLABORATOR
user: login: silviacaprioli
created_at: 2025-03-06T17:27:45Z
body: > * `self.previous_data = None  # used for FDB iterator fixing` probably linked to the decumulation above, to be checked (initialization in `reader.py`)

I see that it is used only in the  `_wrapper_decumulate` function. Actually, if ` keep_memory` is false, `simple_decumulate` is directly called, so I'm wandering if we can just remove the`_wrapper_decumulate` function entirely. 

> * Mention of iterators in `_retrieve_plain `docstrings.

Thanks, removed


author_association: COLLABORATOR
user: login: silviacaprioli
created_at: 2025-03-11T17:55:17Z
body: > Everything seems fine. However in the end there is no modification in the intake_gsv, I'd be for cleaning also there, cc @jhardenberg

me too, but since it's Jost creature I would wait for his green flag. Anyway he is on vacation until next monday...
author_association: COLLABORATOR
user: login: silviacaprioli
created_at: 2025-03-11T17:56:22Z
body: > > Everything seems fine. However in the end there is no modification in the intake_gsv, I'd be for cleaning also there, cc @jhardenberg
> 
> me too, but since it's Jost creature I would wait for his green flag. Anyway he is on vacation until next monday...

Actually on monday meeting he said that it's better not touch it. Maybe we can merge this PR without the intake_gsv cleaning and open a new issue specifically for that
author_association: COLLABORATOR
user: login: jhardenberg
created_at: 2025-03-11T18:09:20Z
body: Hmmm... is there actually any generator related code in intake-gsv?
Do you have an example?


author_association: COLLABORATOR
user: login: silviacaprioli
created_at: 2025-03-11T18:25:42Z
body: > Hmmm... is there actually any generator related code in intake-gsv? Do you have an example? 

[here ](https://github.com/DestinE-Climate-DT/AQUA/blob/476c78549f904800efbd87546a43f4e964799aea/src/aqua/gsv/intake_gsv.py#L644) for example

and there is also a `fstream_iterator` flag


author_association: COLLABORATOR
user: login: jhardenberg
created_at: 2025-03-11T20:04:11Z
body: `fstream_iterator` is a GSV interface thing defining a special mode to be used for bridge access. So, while in the future we may need to reconsider if it is still needed, it is not relevant for the issue here.

`read_chunked()` is a standard intake method providing an iterator. While it is true that we are not using it, I would keep it since I stll have not given up on the idea one day to make intake_gsv an independent intake driver and then this would be a method which it is useful to provide.


author_association: COLLABORATOR
user: login: mnurisso
created_at: 2025-03-12T09:00:00Z
body: @jhardenberg so is the _get_schema internally used by intake and it's why you have a dask true and false block?

However I'm also quite happy if in the future we can move the intake_gsv module outside, but at the same time to translate it to intake 2 will totally change the methods (to_dask is not a standard anymore for example afaik)

So if no intake_gsv modification is needed I'd do another review round and approve the PR, we can then merge it monday
author_association: COLLABORATOR
user: login: jhardenberg
created_at: 2025-03-12T17:54:05Z
body: yes, `_get_schema()` is called by `._load_metadata()` in `base.DataSource` of intake.
There is a `.read()`method which in theory loads data in memory, no dask. But I also admit that these parts are not used and not very much tested, so if we want to make this a separate driver it would require some work to investigate this.
author_association: COLLABORATOR
user: login: silviacaprioli
created_at: 2025-03-13T14:25:49Z
body: > I'd be for a merge, the decision on the intake_gsv has been taken, if I don't see any complain I'll soon merge it.

Yes I think this can be merged
author_association: COLLABORATOR
user: login: mnurisso
created_at: 2025-03-13T16:08:01Z
body: Merging
author_association: COLLABORATOR