16
16
import logging
17
17
import os
18
18
import subprocess
19
+ import shutil
19
20
from pathlib import Path
20
21
21
22
import esmvalcore
@@ -160,7 +161,7 @@ def download_dataset(self, dataset, start_date, end_date, overwrite):
160
161
self .config , dataset , start_date , end_date , overwrite )
161
162
logger .info ('%s downloaded' , dataset )
162
163
163
- def format (self ):
164
+ def format (self , start , end , install ):
164
165
"""Format all available datasets."""
165
166
logger .info ("Running the CMORization scripts." )
166
167
# datsets dictionary of Tier keys
@@ -174,13 +175,12 @@ def format(self):
174
175
failed_datasets = []
175
176
for tier in datasets :
176
177
for dataset in datasets :
177
- if not self .format_dataset (dataset ):
178
+ if not self .format_dataset (dataset , start , end , install ):
178
179
failed_datasets .append (dataset )
179
180
180
181
if failed_datasets :
181
182
raise Exception (
182
- 'Could not find cmorizers for %s datasets ' %
183
- ' ' .join (failed_datasets )
183
+ f'Format failed for datasets { " " .join (failed_datasets )} '
184
184
)
185
185
186
186
def _assemble_datasets (self ):
@@ -205,7 +205,7 @@ def _assemble_datasets(self):
205
205
206
206
return datasets
207
207
208
- def format_dataset (self , dataset ):
208
+ def format_dataset (self , dataset , start , end , install ):
209
209
"""
210
210
Format a single dataset.
211
211
@@ -239,16 +239,37 @@ def format_dataset(self, dataset):
239
239
logger .info ("Reformat script: %s" , reformat_script_root )
240
240
if os .path .isfile (reformat_script_root + '.ncl' ):
241
241
reformat_script = reformat_script_root + '.ncl'
242
- return self ._run_ncl_script (
242
+ success = self ._run_ncl_script (
243
243
in_data_dir ,
244
244
out_data_dir ,
245
245
dataset ,
246
246
reformat_script ,
247
+ start ,
248
+ end
247
249
)
248
250
elif os .path .isfile (reformat_script_root + '.py' ):
249
- return self ._run_pyt_script (in_data_dir , out_data_dir , dataset )
250
- logger .error ('Could not find cmorizer for %s' , dataset )
251
- return False
251
+ success = self ._run_pyt_script (
252
+ in_data_dir , out_data_dir , dataset , start , end )
253
+ else :
254
+ logger .error ('Could not find formatter for %s' , dataset )
255
+ return False
256
+ if not success :
257
+ logger .error ('Foramtting failed for datset %s' , dataset )
258
+ return False
259
+ if install :
260
+ rootpath = self .config ['rootpath' ]
261
+ target_dir = rootpath .get ('OBS' , rootpath ['default' ])[0 ]
262
+ target_dir = os .path .join (target_dir , tier , dataset )
263
+ if os .path .isdir (target_dir ):
264
+ logger .info (
265
+ 'Automatic installation of dataset %s skipped: '
266
+ 'target folder %s already exists' ,
267
+ dataset , target_dir )
268
+ else :
269
+ logger .info (
270
+ 'Installing dataset %s in folder %s' , dataset , target_dir )
271
+ shutil .copytree (out_data_dir , target_dir )
272
+ return True
252
273
253
274
def _get_dataset_tier (self , dataset ):
254
275
for tier in [2 , 3 ]:
@@ -258,15 +279,25 @@ def _get_dataset_tier(self, dataset):
258
279
return None
259
280
260
281
def _write_ncl_settings (self , project_info , dataset , run_dir ,
261
- reformat_script ):
282
+ reformat_script , start_year , end_year ):
262
283
"""Write the information needed by the ncl reformat script."""
284
+ if start_year is None :
285
+ start_year = 0
286
+ else :
287
+ start_year = start_year .year
288
+ if end_year is None :
289
+ end_year = 0
290
+ else :
291
+ end_year = end_year .year
263
292
settings = {
264
293
'cmorization_script' : reformat_script ,
265
294
'input_dir_path' : project_info [dataset ]['indir' ],
266
295
'output_dir_path' : project_info [dataset ]['outdir' ],
267
296
'config_user_info' : {
268
297
'log_level' : self .config ['log_level' ],
269
298
},
299
+ 'start_year' : start_year ,
300
+ 'end_year' : end_year ,
270
301
}
271
302
settings_filename = os .path .join (run_dir , dataset , 'settings.ncl' )
272
303
if not os .path .isdir (os .path .join (run_dir , dataset )):
@@ -275,7 +306,7 @@ def _write_ncl_settings(self, project_info, dataset, run_dir,
275
306
write_ncl_settings (settings , settings_filename )
276
307
return settings_filename
277
308
278
- def _run_ncl_script (self , in_dir , out_dir , dataset , script ):
309
+ def _run_ncl_script (self , in_dir , out_dir , dataset , script , start , end ):
279
310
"""Run the NCL cmorization mechanism."""
280
311
logger .info ("CMORizing dataset %s using NCL script %s" ,
281
312
dataset , script )
@@ -284,7 +315,7 @@ def _run_ncl_script(self, in_dir, out_dir, dataset, script):
284
315
project [dataset ]['indir' ] = in_dir
285
316
project [dataset ]['outdir' ] = out_dir
286
317
settings_file = self ._write_ncl_settings (
287
- project , dataset , self .run_dir , script )
318
+ project , dataset , self .run_dir , script , start , end )
288
319
esmvaltool_root = os .path .dirname (
289
320
os .path .dirname (os .path .dirname (os .path .dirname (script ))))
290
321
@@ -306,17 +337,20 @@ def _run_ncl_script(self, in_dir, out_dir, dataset, script):
306
337
for oline in str (output .decode ('utf-8' )).split ('\n ' ):
307
338
logger .info ('[NCL] %s' , oline )
308
339
if err :
309
- logger .info ('[NCL][subprocess.Popen ERROR] %s' , err )
340
+ logger .error ('[NCL][subprocess.Popen ERROR] %s' , err )
341
+ return False
342
+ return True
310
343
311
- def _run_pyt_script (self , in_dir , out_dir , dataset ):
344
+ def _run_pyt_script (self , in_dir , out_dir , dataset , start , end ):
312
345
"""Run the Python cmorization mechanism."""
313
346
module_name = 'esmvaltool.cmorizers.obs.formatters.datasets.{}' .format (
314
347
dataset .lower ().replace ("-" , "_" ))
315
348
module = importlib .import_module (module_name )
316
349
logger .info ("CMORizing dataset %s using Python script %s" ,
317
350
dataset , module .__file__ )
318
351
cmor_cfg = read_cmor_config (dataset )
319
- module .cmorization (in_dir , out_dir , cmor_cfg , self .config )
352
+ module .cmorization (in_dir , out_dir , cmor_cfg , self .config , start , end )
353
+ return True
320
354
321
355
322
356
class DataCommand ():
@@ -340,14 +374,18 @@ def download(self, datasets, config_file=None, start=None, end=None,
340
374
formatter .start ('download' , datasets , config_file , kwargs )
341
375
formatter .download (start , end , overwrite )
342
376
343
- def format (self , datasets = None , config_file = None , ** kwargs ):
377
+ def format (self , datasets = None , config_file = None , start = None , end = None ,
378
+ install = False , ** kwargs ):
379
+ start = self ._parse_date (start )
380
+ end = self ._parse_date (end )
381
+
344
382
formatter = Formatter ()
345
383
formatter .start ('download' , datasets , config_file , kwargs )
346
- formatter .format ()
384
+ formatter .format (start , end , install )
347
385
348
386
def prepare (self , datasets = None , config_file = None ,
349
387
start = None , end = None ,
350
- overwrite = False , ** kwargs ):
388
+ overwrite = False , install = False , ** kwargs ):
351
389
"""
352
390
Download a format a set of datasets.
353
391
@@ -361,7 +399,7 @@ def prepare(self, datasets=None, config_file=None,
361
399
formatter = Formatter ()
362
400
formatter .start ('download' , datasets , config_file , kwargs )
363
401
formatter .download (start , end , overwrite )
364
- formatter .format ()
402
+ formatter .format (start , end , install )
365
403
366
404
@staticmethod
367
405
def _parse_date (date ):
0 commit comments