Mercurial > repos > climate > cds_essential_variability
diff ecv_retrieve.py @ 0:5c0ab9932311 draft
planemo upload for repository https://github.com/NordicESMhub/galaxy-tools/tree/master/tools/essential_climate_variables commit 49926d09bb7d28f07b24050d25c40f2ae875d6f7
author | climate |
---|---|
date | Fri, 03 May 2019 15:11:01 -0400 |
parents | |
children | b9d9fe0c2ce7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ecv_retrieve.py Fri May 03 15:11:01 2019 -0400 @@ -0,0 +1,145 @@ +# Retrieve Copernicus ECV +# (Essential climate Variables) + +import argparse +import os +import shutil +import tarfile +import tempfile +import warnings + +import cdsapi + + +class ECV (): + def __init__(self, archive, variable, product_type, year, + month, time_aggregation, area, format, output, + verbose=False + ): + self.archive = archive + self.variable = variable.split(',') + if product_type == '': + self.product_type = 'climatology' + else: + self.product_type = product_type + if year == '': + self.year = '2019' + else: + self.year = year.split(',') + if month == '': + self.month = '01' + else: + self.month = month.split(',') + if time_aggregation == '': + self.time_aggregation = '1_month' + else: + self.time_aggregation = time_aggregation + self.area = area + if format == '': + self.format = 'tgz' + else: + self.format = format + if output == '': + self.outputfile = "donwload." + self.format + else: + self.outputfile = output + if verbose: + print("archive: ", self.archive) + print("variable: ", self.variable) + print("year: ", self.year) + print("month: ", self.month) + self.cdsapi = cdsapi.Client() + + def retrieve(self): + + self.cdsapi.retrieve( + self.archive, { + 'variable': self.variable, + 'year': self.year, + 'month': self.month, + 'area': self.area, + 'format': self.format, + 'product_type': self.product_type, + 'time_aggregation': self.time_aggregation, + }, + self.outputfile) + + def checktar(self): + is_grib = False + with open(self.outputfile, 'rb') as ofile: + is_grib = ofile.read(4) + if (is_grib == b'GRIB' and self.format == 'tgz'): + # we create a tgz to be consistent + newfilename = tempfile.NamedTemporaryFile() + gribfile = os.path.basename(newfilename.name) + '.grib' + shutil.copyfile(self.outputfile, gribfile) + newfilename.close() + tar = tarfile.open(self.outputfile, 'w:gz') + tar.add(gribfile) + tar.close() + + +if __name__ == '__main__': + warnings.filterwarnings("ignore") + parser = argparse.ArgumentParser() + + remove_apikey = False + current_pwd = os.environ['HOME'] + if 'GALAXY_COPERNICUS_CDSAPIRC_KEY' in os.environ and \ + not os.path.isfile('.cdsapirc'): + with open(".cdsapirc", "w+") as apikey: + apikey.write("url: https://cds.climate.copernicus.eu/api/v2\n") + apikey.write( + "key: " + os.environ['GALAXY_COPERNICUS_CDSAPIRC_KEY']) + remove_apikey = True + + parser.add_argument( + 'archive', + help='Archive name' + ) + parser.add_argument( + 'variable', + help='Specify which variable to retrieve' + ) + parser.add_argument( + '--product_type', + help='Type of product (climatology or anomaly)' + ) + parser.add_argument( + '--year', + help='Year(s) to retrieve.' + ) + parser.add_argument( + '--month', + help='List of months to retrieve.' + ) + parser.add_argument( + '--time_aggregation', + help='Time range over which data is aggregated (monthly/yearly).' + ) + parser.add_argument( + '--area', + help='Desired sub-area to extract (North/West/South/East)' + ) + parser.add_argument( + '--format', + help='Output file format (GRIB or netCDF or tgz)' + ) + parser.add_argument( + '--output', + help='output filename' + ) + parser.add_argument( + "-v", "--verbose", + help="switch on verbose mode", + action="store_true") + args = parser.parse_args() + + p = ECV(args.archive, args.variable, args.product_type, + args.year, args.month, args.time_aggregation, args.area, + args.format, args.output, args.verbose) + p.retrieve() + p.checktar() + # remove api key file if it was created + if remove_apikey and os.getcwd() == current_pwd: + os.remove(os.path.join(current_pwd, '.cdsapirc'))