Skip to content

Commit 028d098

Browse files
author
Javier Vegas-Regidor
committed
Updated CDS datasets
1 parent 02610f9 commit 028d098

13 files changed

+246
-61
lines changed

esmvaltool/cmorizers/obs/download_scripts/download_cds_satellite_soil_moisture.py

+4-12
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,9 @@ def download_cds_satellite_sm():
8787
'11',
8888
'12',
8989
],
90-
'day':
91-
'01',
92-
'type_of_record':
93-
'cdr',
94-
'version':
95-
'v201912.0.0',
90+
'day': '01',
91+
'type_of_record': 'cdr',
92+
'version': 'v201912.0.0',
9693
**freq_specific_kwargs[args.frequency]
9794
}
9895
client.retrieve('satellite-soil-moisture', request_dictionary,
@@ -135,12 +132,7 @@ def download_cds_satellite_sm():
135132
'version': 'v201812.0.0',
136133
**freq_specific_kwargs[args.frequency]
137134
}, savename)
138-
# Unpack the file
139-
tar = tarfile.open(savename)
140-
tar.extractall(path=os.path.dirname(savename))
141-
tar.close()
142-
# Remove the tar file since it has been extracted
143-
os.remove(savename)
135+
144136

145137

146138
if __name__ == "__main__":

esmvaltool/cmorizers/obs/downloaders/cds.py

+24-13
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import os
44
import logging
5+
from collections.abc import Iterable
56
import cdsapi
67

78
from .downloader import BaseDownloader
@@ -12,37 +13,47 @@
1213
class CDSDownloader(BaseDownloader):
1314

1415
def __init__(self, product_name, config, request_dictionary, dataset,
15-
overwrite):
16+
overwrite, extra_name=''):
1617
super().__init__(config, dataset, overwrite)
1718
self._client = cdsapi.Client()
1819
self._product_name = product_name
1920
self._request_dict = request_dictionary
21+
self.extra_name = extra_name
2022

2123
def download(self, year, month, day=None):
2224
request_dict = self._request_dict.copy()
2325
request_dict['year'] = f'{year}'
2426
request_dict['month'] = f"{month:02d}"
2527
if day:
26-
request_dict['day'] = f"{day:02d}"
28+
if isinstance(day, Iterable):
29+
request_dict['day'] = day
30+
else:
31+
request_dict['day'] = f"{day:02d}"
2732

28-
date_str = f"{self.dataset}_{year}{month:02d}"
33+
date_str = f"{self.dataset}{self.extra_name}_{year}{month:02d}"
2934
if day:
30-
date_str += f"{day:02d}"
35+
if not isinstance(day, Iterable):
36+
date_str += f"{day:02d}"
3137

3238
os.makedirs(self.local_folder, exist_ok=True)
33-
file_path = os.path.join(
34-
self.local_folder,
35-
f"{self.dataset}_{date_str}.tar"
36-
)
37-
if os.path.exists(file_path):
39+
file_path = f"{self.dataset}_{date_str}.tar"
40+
self.download_request(file_path, request_dict)
41+
42+
def download_request(self, filename, request=None):
43+
if request is None:
44+
request = self._request_dict.copy()
45+
46+
os.makedirs(self.local_folder, exist_ok=True)
47+
filename = os.path.join(self.local_folder, filename)
48+
if os.path.exists(filename):
3849
if self.overwrite:
39-
os.remove(file_path)
50+
os.remove(filename)
4051
else:
4152
logger.info(
42-
'File %s already downloaded. Skipping...', file_path)
53+
'File %s already downloaded. Skipping...', filename)
4354
return
4455
self._client.retrieve(
4556
self._product_name,
46-
request_dict,
47-
file_path,
57+
request,
58+
filename,
4859
)

esmvaltool/cmorizers/obs/downloaders/datasets/aphro_ma.py

+3-30
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import logging
55

66
from esmvaltool.cmorizers.obs.downloaders.wget import WGetDownloader
7+
from esmvaltool.cmorizers.obs.utilities import unpack_files_in_folder
78

89
logger = logging.getLogger(__name__)
910

@@ -13,14 +14,6 @@
1314
import shutil
1415

1516

16-
def gunzip(file_name, work_dir):
17-
filename = os.path.split(file_name)[-1]
18-
filename = re.sub(r"\.gz$", "", filename, flags=re.IGNORECASE)
19-
20-
with gzip.open(file_name, 'rb') as f_in:
21-
with open(os.path.join(work_dir, filename), 'wb') as f_out:
22-
shutil.copyfileobj(f_in, f_out)
23-
2417
def download_dataset(config, dataset, start_date, end_date, overwrite):
2518
downloader = WGetDownloader(
2619
config=config,
@@ -41,25 +34,5 @@ def download_file(path):
4134
# download_file("APHRO_V1101EX_R1/APHRO_MA/050deg_nc/APHRO_MA_050deg_V1101_EXR1.nc.tgz")
4235

4336
shutil.register_unpack_format('gz', ['.gz', ], gunzip)
44-
decompress =True
45-
while decompress:
46-
decompress = False
47-
for filename in os.listdir(downloader.local_folder):
48-
full_path = os.path.join(downloader.local_folder, filename)
49-
if os.path.isdir(full_path):
50-
logger.info('Moving files from folder %s', filename)
51-
folder_files = os.listdir(full_path)
52-
for file_path in folder_files:
53-
shutil.move(
54-
os.path.join(full_path, file_path),
55-
downloader.local_folder
56-
)
57-
os.rmdir(full_path)
58-
decompress = True
59-
continue
60-
if not filename.endswith(('.gz', '.tgz', '.tar')):
61-
continue
62-
logger.info('Unpacking %s', filename)
63-
shutil.unpack_archive(full_path, downloader.local_folder)
64-
os.remove(full_path)
65-
decompress = True
37+
38+
unpack_files_in_folder(downloader.local_folder)

esmvaltool/cmorizers/obs/downloaders/datasets/cds_satellite_albedo.py

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from dateutil import relativedelta
44

55
from esmvaltool.cmorizers.obs.downloaders.cds import CDSDownloader
6+
from esmvaltool.cmorizers.obs.utilities import unpack_files_in_folder
67

78

89
def download_dataset(config, dataset, start_date, end_date, overwrite):
@@ -31,3 +32,5 @@ def download_dataset(config, dataset, start_date, end_date, overwrite):
3132
while loop_date <= end_date:
3233
downloader.download(loop_date.year, loop_date.month)
3334
loop_date += relativedelta.relativedelta(months=1)
35+
36+
unpack_files_in_folder(downloader.local_folder)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""Script to download cds-satellite-albedo from the Climate Data Store(CDS)"""
2+
3+
from dateutil import relativedelta
4+
import datetime
5+
6+
from esmvaltool.cmorizers.obs.downloaders.cds import CDSDownloader
7+
from esmvaltool.cmorizers.obs.utilities import unpack_files_in_folder
8+
9+
10+
def download_dataset(config, dataset, start_date, end_date, overwrite):
11+
"""Download dataset cds-satellite-albedo."""
12+
if not start_date:
13+
start_date = datetime.datetime(1998, 4, 1)
14+
if not end_date:
15+
end_date = datetime.datetime(2014, 5, 1)
16+
17+
loop_date = start_date
18+
downloader = CDSDownloader(
19+
product_name='satellite-lai-fapar',
20+
request_dictionary={
21+
'variable': [
22+
'fapar', 'lai',
23+
],
24+
'satellite': 'spot',
25+
'sensor': 'vgt',
26+
'horizontal_resolution': '1km',
27+
'product_version': 'V1',
28+
'nominal_day': '20',
29+
'format': 'tgz',
30+
},
31+
config=config,
32+
dataset=dataset,
33+
overwrite=overwrite,
34+
)
35+
36+
while loop_date <= end_date:
37+
downloader.download(loop_date.year, loop_date.month)
38+
loop_date += relativedelta.relativedelta(months=1)
39+
40+
unpack_files_in_folder(downloader.local_folder)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
"""Script to download cds-satellite-soil-moisture from the Climate Data Store(CDS)"""
2+
3+
from dateutil import relativedelta
4+
import datetime
5+
import calendar
6+
7+
from esmvaltool.cmorizers.obs.downloaders.cds import CDSDownloader
8+
from esmvaltool.cmorizers.obs.utilities import unpack_files_in_folder
9+
10+
11+
def download_dataset(config, dataset, start_date, end_date, overwrite):
12+
"""Download dataset cds-satellite-soil-moisture."""
13+
if not start_date:
14+
start_date = datetime.datetime(1978, 11, 1)
15+
if not end_date:
16+
end_date = datetime.datetime(2020, 6, 30)
17+
18+
# loop_date = start_date
19+
# downloader = CDSDownloader(
20+
# product_name='satellite-soil-moisture',
21+
# request_dictionary={
22+
# 'format': 'tgz',
23+
# 'variable': 'volumetric_surface_soil_moisture',
24+
# 'type_of_sensor': 'combined_passive_and_active',
25+
# 'type_of_record': 'cdr',
26+
# 'version': 'v201912.0.0',
27+
# 'time_aggregation': 'month_average',
28+
# 'day': ['01']
29+
# },
30+
# config=config,
31+
# dataset=dataset,
32+
# overwrite=overwrite,
33+
# )
34+
35+
# while loop_date <= end_date:
36+
# downloader.download(loop_date.year, loop_date.month)
37+
# loop_date += relativedelta.relativedelta(months=1)
38+
39+
downloader = CDSDownloader(
40+
product_name='satellite-soil-moisture',
41+
request_dictionary={
42+
'format': 'tgz',
43+
'variable': 'volumetric_surface_soil_moisture',
44+
'type_of_sensor': 'combined_passive_and_active',
45+
'day': '01',
46+
'type_of_record': 'cdr',
47+
'version': 'v201912.0.0',
48+
'time_aggregation': 'day_average',
49+
},
50+
config=config,
51+
dataset=dataset,
52+
overwrite=overwrite,
53+
extra_name='_monthly',
54+
)
55+
loop_date = start_date
56+
while loop_date <= end_date:
57+
downloader.download(
58+
loop_date.year, loop_date.month,
59+
[f'{i+1:02d}' for i in range(calendar.monthrange(loop_date.year, loop_date.month)[1])])
60+
loop_date += relativedelta.relativedelta(months=1)
61+
62+
unpack_files_in_folder(downloader.local_folder)
63+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""Script to download cds-satellite-albedo from the Climate Data Store(CDS)"""
2+
3+
from dateutil import relativedelta
4+
import datetime
5+
import calendar
6+
7+
from esmvaltool.cmorizers.obs.downloaders.cds import CDSDownloader
8+
from esmvaltool.cmorizers.obs.utilities import unpack_files_in_folder
9+
10+
11+
def download_dataset(config, dataset, start_date, end_date, overwrite):
12+
"""Download dataset cds-satellite-albedo."""
13+
if not start_date:
14+
start_date = datetime.datetime(1961, 1, 1)
15+
if not end_date:
16+
end_date = datetime.datetime(2019, 7, 1)
17+
18+
loop_date = start_date
19+
downloader = CDSDownloader(
20+
product_name='reanalysis-uerra-europe-soil-levels',
21+
request_dictionary={
22+
'format': 'netcdf',
23+
'origin': 'uerra_harmonie',
24+
'variable': 'volumetric_soil_moisture',
25+
'soil_level': ['1', '2', '3',],
26+
'time': ['00:00', '06:00', '12:00', '18:00'],
27+
},
28+
config=config,
29+
dataset=dataset,
30+
overwrite=overwrite,
31+
)
32+
33+
loop_date = start_date
34+
while loop_date <= end_date:
35+
downloader.download(
36+
loop_date.year, loop_date.month,
37+
[f'{i+1:02d}' for i in range(calendar.monthrange(loop_date.year, loop_date.month)[1])])
38+
loop_date += relativedelta.relativedelta(months=1)
39+
40+
unpack_files_in_folder(downloader.local_folder)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""Script to download cds-satellite-albedo from the Climate Data Store(CDS)"""
2+
3+
from dateutil import relativedelta
4+
import datetime
5+
import calendar
6+
7+
from esmvaltool.cmorizers.obs.downloaders.cds import CDSDownloader
8+
from esmvaltool.cmorizers.obs.utilities import unpack_files_in_folder
9+
10+
11+
def download_dataset(config, dataset, start_date, end_date, overwrite):
12+
"""Download dataset cds-satellite-albedo."""
13+
downloader = CDSDownloader(
14+
product_name='satellite-methane',
15+
request_dictionary={
16+
'format': 'tgz',
17+
'processing_level': 'level_3',
18+
'variable': 'xch4',
19+
'sensor_and_algorithm': 'merged_obs4mips',
20+
'version': '4.1',
21+
},
22+
config=config,
23+
dataset=dataset,
24+
overwrite=overwrite,
25+
)
26+
downloader.download_request("CDS-XCH4.tar")
27+
unpack_files_in_folder(downloader.local_folder)

esmvaltool/cmorizers/obs/formatters/datasets/aura_tes.ncl

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ begin
4444
GRIDTYPE = "Nadir"
4545

4646
; Period
47-
YEAR1 = 2005
48-
YEAR2 = 2011
47+
YEAR1 = get_year(start_year, 2005)
48+
YEAR2 = get_year(end_year, 2011)
4949

5050
; Selected variable
5151
VAR = "tro3"

esmvaltool/cmorizers/obs/formatters/datasets/cds_satellite_albedo.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ def _set_time_bnds(in_dir, var):
163163
return cubelist
164164

165165

166-
def cmorization(in_dir, out_dir, cfg, cfg_user):
166+
def cmorization(in_dir, out_dir, cfg, cfg_user, start, end):
167167
"""Cmorization func call."""
168168
# run the cmorization
169169
# Pass on the workdir to the cfg dictionary

esmvaltool/cmorizers/obs/formatters/datasets/cds_satellite_lai_fapar.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ def _set_time_bnds(in_dir, var):
170170
return cubelist
171171

172172

173-
def cmorization(in_dir, out_dir, cfg, cfg_user):
173+
def cmorization(in_dir, out_dir, cfg, cfg_user, start, end):
174174
"""Cmorization func call."""
175175
# run the cmorization
176176
# Pass on the workdir to the cfg dictionary

esmvaltool/cmorizers/obs/formatters/datasets/cds_satellite_soil_moisture.ncl

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ begin
3434
TIER = 3
3535

3636
; Period
37-
YEAR1 = 1978
38-
YEAR2 = 2020
37+
YEAR1 = get_year(start_year, 1978)
38+
YEAR2 = get_year(end_year, 2020)
3939

4040
; Selected variables (standard name)
4141
VAR = (/"sm", "sm"/)

0 commit comments

Comments
 (0)