Commit 952e3d8f07394e67498b318c70f112f833568bba

Authored by Goutte
1 parent 0af09c17

Move to another spacepy for CDF generation, and clean up the python dependencies.

Showing 2 changed files with 67 additions and 47 deletions   Show diff stats
requirements.txt
1   -## The following requirements were added by pip freeze:
2   -appdirs==1.4.3
3   -click==6.7
4   -dateutils==0.6.6
  1 +## The following requirements were originally generated with `pip freeze`.
  2 +
  3 +
  4 +## MAIN DEPENDENCIES
  5 +
5 6 Flask==0.12
6   -h5py==2.3.1
7   -itsdangerous==0.24
8 7 Jinja2==2.9.5
9 8 Markdown==2.6.8
10 9 MarkupSafe==1.0
  10 +python-slugify==1.2.4
  11 +
  12 +
  13 +## SECOND LEVEL DEPS
  14 +# (We could probably comment them out, but hey)
  15 +
  16 +appdirs==1.4.3
  17 +click==6.7
  18 +dateutils==0.6.6
  19 +itsdangerous==0.24
11 20 mglob==0.4
12   -netCDF4==1.2.7
13   -numpy==1.12.0
14   -packaging==16.8
15   -#pkg-resources==0.0.0
16 21 pyparsing==2.2.0
17   -python-slugify==1.2.4
18   -PyYAML==3.12
  22 +packaging==16.8
19 23 six==1.10.0
20 24 Werkzeug==0.12
21   -# spacepy==0.7 # requires a lot of system deps, like fortran
22   -CDF==0.32
23 25 \ No newline at end of file
  26 +
  27 +
  28 +## FILE FORMATS
  29 +
  30 +PyYAML==3.12
  31 +netCDF4==1.2.7
  32 +h5py==2.3.1
  33 +# We only use pycdf from spacepy.
  34 +spacepy==0.1.*
  35 +# spacepy does not like recent numpy versions (1.7 looks ok)
  36 +numpy==1.7.*
  37 +
  38 +
  39 +## WEIRD STUFF
  40 +
  41 +# This version number makes pip yell on the prod server (?)
  42 +#pkg-resources==0.0.0
... ...
web/run.py
... ... @@ -9,7 +9,6 @@ import random
9 9 import tarfile
10 10 import time
11 11 import urllib
12   -import cdf
13 12 from csv import writer as csv_writer
14 13 from math import sqrt
15 14 from os import environ, remove as removefile
... ... @@ -61,6 +60,9 @@ log.addHandler(logHandler)
61 60  
62 61 # HARDCODED CONFIGURATION #####################################################
63 62  
  63 +# Absolute path to the installed CDF library from https://cdf.gsfc.nasa.gov/
  64 +CDF_LIB = '/usr/local/lib/libcdf'
  65 +
64 66 # Absolute path to the data cache directory
65 67 CACHE_DIR = get_path('../cache')
66 68  
... ... @@ -930,13 +932,15 @@ def download_targets_cdf(targets, started_at, stopped_at):
930 932  
931 933 if not isfile(cdf_path):
932 934 log.debug("Creating the CDF file '%s'..." % cdf_filename)
  935 + environ['CDF_LIB'] = CDF_LIB
  936 + from spacepy import pycdf
933 937 try:
934   - cdf_handle = cdf.archive()
  938 + cdf_handle = pycdf.CDF(cdf_path, masterpath='')
935 939 description = "Model and orbit data for %s." % \
936 940 ', '.join([t['name'] for t in targets_configs])
937   - cdf_handle.attributes['Description'] = description
938   - cdf_handle.attributes['Author'] = "Heliopropa.irap.omp.eu (CDPP)"
939   - cdf_handle.attributes['Created'] = str(time.ctime(time.time()))
  941 + cdf_handle.attrs['Description'] = description
  942 + cdf_handle.attrs['Author'] = "Heliopropa.irap.omp.eu (CDPP)"
  943 + cdf_handle.attrs['Created'] = str(time.ctime(time.time()))
940 944  
941 945 available_params = list(PROPERTIES)
942 946 for target in targets_configs:
... ... @@ -945,15 +949,13 @@ def download_targets_cdf(targets, started_at, stopped_at):
945 949 dkeys = sorted(data)
946 950  
947 951 values = []
948   - units = "hours since 1970-01-01 00:00:00"
949   - calendar = "standard"
950 952 for dkey in dkeys:
951   - time_as_string = data[dkey][0][:-6] # remove +00:00 tail
952   - date = datetime.datetime.strptime(time_as_string, FILE_DATE_FMT)
953   - values.append(date2num(date, units=units, calendar=calendar))
954   - k = "%s_time" % target_slug
955   - cdf_handle[k] = values
956   - cdf_handle[k].attributes['units'] = units
  953 + time_str = data[dkey][0][:-6] # remove +00:00 tail
  954 + date = datetime.datetime.strptime(time_str, FILE_DATE_FMT)
  955 + values.append(date)
  956 + kt = "%s_time" % target_slug
  957 + cdf_handle[kt] = values
  958 + cdf_handle[kt].attrs['FIELDNAM'] = "Time since 0 A.D"
957 959  
958 960 for param in params:
959 961 k = "%s_%s" % (target_slug, param)
... ... @@ -962,10 +964,16 @@ def download_targets_cdf(targets, started_at, stopped_at):
962 964 for dkey in dkeys:
963 965 values.append(data[dkey][i])
964 966 cdf_handle[k] = values
965   - cdf_handle[k].attributes['units'] = PARAMETERS[param]['units']
966   -
967   - k_xhee = "%s_xhee" % target_slug
968   - k_yhee = "%s_yhee" % target_slug
  967 + attrs = cdf_handle[k].attrs
  968 + attrs['UNITS'] = PARAMETERS[param]['units']
  969 + attrs['LABLAXIS'] = PARAMETERS[param]['name']
  970 + attrs['FIELDNAM'] = PARAMETERS[param]['title']
  971 + if values:
  972 + attrs['VALIDMIN'] = min(values)
  973 + attrs['VALIDMAX'] = max(values)
  974 +
  975 + kx = "%s_xhee" % target_slug
  976 + ky = "%s_yhee" % target_slug
969 977 values_xhee = []
970 978 values_yhee = []
971 979 index_x = available_params.index('xhee')
... ... @@ -973,23 +981,21 @@ def download_targets_cdf(targets, started_at, stopped_at):
973 981 for dkey in dkeys:
974 982 values_xhee.append(data[dkey][index_x])
975 983 values_yhee.append(data[dkey][index_y])
976   - cdf_handle[k_xhee] = values_xhee
977   - cdf_handle[k_yhee] = values_yhee
978   - cdf_handle[k_xhee].attributes['units'] = 'Au'
979   - cdf_handle[k_yhee].attributes['units'] = 'Au'
  984 + cdf_handle[kx] = values_xhee
  985 + cdf_handle[ky] = values_yhee
  986 + cdf_handle[kx].attrs['UNITS'] = 'Au'
  987 + cdf_handle[ky].attrs['UNITS'] = 'Au'
980 988  
981 989 log.debug("Writing CDF '%s'..." % cdf_filename)
982   - cdf_handle.save(cdf_path)
  990 + cdf_handle.close()
  991 + log.debug("Wrote CDF '%s'." % cdf_filename)
983 992  
984 993 except Exception as e:
985 994 log.error("Failed to generate CDF '%s'." % cdf_filename)
986   - removefile(cdf_path)
  995 + if isfile(cdf_path):
  996 + removefile(cdf_path)
987 997 raise
988 998  
989   - finally:
990   - # cdf_handle.close()
991   - pass
992   -
993 999 if not isfile(cdf_path):
994 1000 abort(500, "No CDF to serve. Looked at '%s'." % cdf_path)
995 1001  
... ... @@ -1080,11 +1086,6 @@ def log_clear():
1080 1086 # MAIN ########################################################################
1081 1087  
1082 1088 if __name__ == "__main__":
1083   -
1084   - a = "2015171150000001"
1085   -
1086   -
1087   -
1088   - # Debug mode on, as the production server does not use this but run.wsgi
  1089 + # Debug mode is on, as the production server does not use this but run.wsgi
1089 1090 extra_files = [get_path('../config.yml')]
1090 1091 app.run(debug=True, extra_files=extra_files)
... ...