Mercurial > repos > climate > cds_essential_variability
comparison ecv_retrieve.py @ 0:edc85cde5f71 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:10:38 -0400 |
| parents | |
| children | f47873f1a4b3 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:edc85cde5f71 |
|---|---|
| 1 # Retrieve Copernicus ECV | |
| 2 # (Essential climate Variables) | |
| 3 | |
| 4 import argparse | |
| 5 import os | |
| 6 import shutil | |
| 7 import tarfile | |
| 8 import tempfile | |
| 9 import warnings | |
| 10 | |
| 11 import cdsapi | |
| 12 | |
| 13 | |
| 14 class ECV (): | |
| 15 def __init__(self, archive, variable, product_type, year, | |
| 16 month, time_aggregation, area, format, output, | |
| 17 verbose=False | |
| 18 ): | |
| 19 self.archive = archive | |
| 20 self.variable = variable.split(',') | |
| 21 if product_type == '': | |
| 22 self.product_type = 'climatology' | |
| 23 else: | |
| 24 self.product_type = product_type | |
| 25 if year == '': | |
| 26 self.year = '2019' | |
| 27 else: | |
| 28 self.year = year.split(',') | |
| 29 if month == '': | |
| 30 self.month = '01' | |
| 31 else: | |
| 32 self.month = month.split(',') | |
| 33 if time_aggregation == '': | |
| 34 self.time_aggregation = '1_month' | |
| 35 else: | |
| 36 self.time_aggregation = time_aggregation | |
| 37 self.area = area | |
| 38 if format == '': | |
| 39 self.format = 'tgz' | |
| 40 else: | |
| 41 self.format = format | |
| 42 if output == '': | |
| 43 self.outputfile = "donwload." + self.format | |
| 44 else: | |
| 45 self.outputfile = output | |
| 46 if verbose: | |
| 47 print("archive: ", self.archive) | |
| 48 print("variable: ", self.variable) | |
| 49 print("year: ", self.year) | |
| 50 print("month: ", self.month) | |
| 51 self.cdsapi = cdsapi.Client() | |
| 52 | |
| 53 def retrieve(self): | |
| 54 | |
| 55 self.cdsapi.retrieve( | |
| 56 self.archive, { | |
| 57 'variable': self.variable, | |
| 58 'year': self.year, | |
| 59 'month': self.month, | |
| 60 'area': self.area, | |
| 61 'format': self.format, | |
| 62 'product_type': self.product_type, | |
| 63 'time_aggregation': self.time_aggregation, | |
| 64 }, | |
| 65 self.outputfile) | |
| 66 | |
| 67 def checktar(self): | |
| 68 is_grib = False | |
| 69 with open(self.outputfile, 'rb') as ofile: | |
| 70 is_grib = ofile.read(4) | |
| 71 if (is_grib == b'GRIB' and self.format == 'tgz'): | |
| 72 # we create a tgz to be consistent | |
| 73 newfilename = tempfile.NamedTemporaryFile() | |
| 74 gribfile = os.path.basename(newfilename.name) + '.grib' | |
| 75 shutil.copyfile(self.outputfile, gribfile) | |
| 76 newfilename.close() | |
| 77 tar = tarfile.open(self.outputfile, 'w:gz') | |
| 78 tar.add(gribfile) | |
| 79 tar.close() | |
| 80 | |
| 81 | |
| 82 if __name__ == '__main__': | |
| 83 warnings.filterwarnings("ignore") | |
| 84 parser = argparse.ArgumentParser() | |
| 85 | |
| 86 remove_apikey = False | |
| 87 current_pwd = os.environ['HOME'] | |
| 88 if 'GALAXY_COPERNICUS_CDSAPIRC_KEY' in os.environ and \ | |
| 89 not os.path.isfile('.cdsapirc'): | |
| 90 with open(".cdsapirc", "w+") as apikey: | |
| 91 apikey.write("url: https://cds.climate.copernicus.eu/api/v2\n") | |
| 92 apikey.write( | |
| 93 "key: " + os.environ['GALAXY_COPERNICUS_CDSAPIRC_KEY']) | |
| 94 remove_apikey = True | |
| 95 | |
| 96 parser.add_argument( | |
| 97 'archive', | |
| 98 help='Archive name' | |
| 99 ) | |
| 100 parser.add_argument( | |
| 101 'variable', | |
| 102 help='Specify which variable to retrieve' | |
| 103 ) | |
| 104 parser.add_argument( | |
| 105 '--product_type', | |
| 106 help='Type of product (climatology or anomaly)' | |
| 107 ) | |
| 108 parser.add_argument( | |
| 109 '--year', | |
| 110 help='Year(s) to retrieve.' | |
| 111 ) | |
| 112 parser.add_argument( | |
| 113 '--month', | |
| 114 help='List of months to retrieve.' | |
| 115 ) | |
| 116 parser.add_argument( | |
| 117 '--time_aggregation', | |
| 118 help='Time range over which data is aggregated (monthly/yearly).' | |
| 119 ) | |
| 120 parser.add_argument( | |
| 121 '--area', | |
| 122 help='Desired sub-area to extract (North/West/South/East)' | |
| 123 ) | |
| 124 parser.add_argument( | |
| 125 '--format', | |
| 126 help='Output file format (GRIB or netCDF or tgz)' | |
| 127 ) | |
| 128 parser.add_argument( | |
| 129 '--output', | |
| 130 help='output filename' | |
| 131 ) | |
| 132 parser.add_argument( | |
| 133 "-v", "--verbose", | |
| 134 help="switch on verbose mode", | |
| 135 action="store_true") | |
| 136 args = parser.parse_args() | |
| 137 | |
| 138 p = ECV(args.archive, args.variable, args.product_type, | |
| 139 args.year, args.month, args.time_aggregation, args.area, | |
| 140 args.format, args.output, args.verbose) | |
| 141 p.retrieve() | |
| 142 p.checktar() | |
| 143 # remove api key file if it was created | |
| 144 if remove_apikey and os.getcwd() == current_pwd: | |
| 145 os.remove(os.path.join(current_pwd, '.cdsapirc')) |
