Skip to content

Commit

Permalink
All tests passes now for Python 3.5
Browse files Browse the repository at this point in the history
  • Loading branch information
FrancescAlted committed Sep 13, 2016
1 parent 0e315ee commit 6b4c822
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 65 deletions.
88 changes: 44 additions & 44 deletions reflexible/base_read.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

"""
functions for reading fp data in reflexible.
Expand Down Expand Up @@ -36,20 +35,15 @@
import os
import datetime as dt


# Dependencies:
# Numpy
import numpy as np


from .data_structures import Trajectory




def read_trajectories(H, trajfile='trajectories.txt', \
ncluster=5, \
ageclasses=20):
def read_trajectories(H, trajfile='trajectories.txt', ncluster=5,
ageclasses=20):
"""
Reads the trajectories.txt file in a FLEXPART run output directory.
Expand Down Expand Up @@ -126,13 +120,12 @@ def read_trajectories(H, trajfile='trajectories.txt', \

if isinstance(H, str):
try:
alltraj = file(H, 'r').readlines()
alltraj = open(H, 'r').readlines()
except:
raise IOError('Could not open file: %s' % H)
else:
path = H.fp_path
alltraj = file(os.path.join(path, trajfile), 'r').readlines()

alltraj = open(os.path.join(path, trajfile), 'r').readlines()

try:
ibdate, ibtime, model, version = alltraj[0].strip().split()[:4]
Expand All @@ -142,33 +135,37 @@ def read_trajectories(H, trajfile='trajectories.txt', \
version = 'V.x'
tdelta = dt.datetime.strptime(ibdate + ibtime.zfill(6), '%Y%m%d%H%M%S')
numpoint = int(alltraj[2].strip())

RelTraj = Trajectory()
Trajectories = []
# format change?? Try block below because some trajectories.txt
# files have linebreaks, but seems more recent FP v10. does not.
try:
for i in range(3, 3 + (numpoint * 2), 3):
i1, i2, xp1, yp1, xp2 , = tuple([float(j) for j in alltraj[i].strip().split()])
yp2, zp1, zp2, k, npart , = tuple([float(j) for j in alltraj[i+1].strip().split()])
i1, i2, xp1, yp1, xp2, = tuple((float(j) for j in
alltraj[i].strip().split()))
yp2, zp1, zp2, k, npart, = tuple((float(j) for j in
alltraj[i + 1].strip().split()))
except:
for i in range(3, 3 + (numpoint * 2), 2):
i1, i2, xp1, yp1, xp2, yp2, zp1, zp2, k, npart , = \
tuple([float(j) for j in alltraj[i].strip().split()])
i1, i2, xp1, yp1, xp2, yp2, zp1, zp2, k, npart, = \
tuple([float(j) for j in alltraj[i].strip().split()])

itimerel1 = tdelta + dt.timedelta(seconds=i1)
itimerel2 = tdelta + dt.timedelta(seconds=i2)
Xp = (xp1 + xp2) / 2
Yp = (yp1 + yp2) / 2
Zp = (zp1 + zp2) / 2
RelTraj[alltraj[i + 1].strip()] = np.array((itimerel1, itimerel2, Xp, Yp, Zp, k, npart))
RelTraj[alltraj[i + 1].strip()] = np.array(
(itimerel1, itimerel2, Xp, Yp, Zp, k, npart))

for i in range(3 + (numpoint * 3), len(alltraj)):
raw = alltraj[i]
FMT = [0, 5, 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 6] + ncluster * [8, 8, 7, 6, 8]
FMT = [0, 5, 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 6] + \
ncluster * [8, 8, 7, 6, 8]

data = [raw[sum(FMT[:ii]):sum(FMT[:ii + 1])] for ii in range(1, len(FMT) - 1)] + \
[raw[sum(FMT[:-1]):]]
data = [raw[sum(FMT[:ii]):sum(FMT[:ii + 1])]
for ii in range(1, len(FMT) - 1)] + [raw[sum(FMT[:-1]):]]
### FIX ###
# ## To get rid of '******' that is now in trajectories.txt
data = [float(r.replace('********', 'NaN')) for r in data]
Expand All @@ -180,28 +177,31 @@ def read_trajectories(H, trajfile='trajectories.txt', \
RelTraj['date'] = tdelta
RelTraj['Trajectories'] = data
RelTraj['labels'] = \
['release number', 'seconds prior to release', 'lon', 'lat', 'height', 'mean topography', \
'mean mixing height', 'mean tropopause height', 'mean PV index', \
'rms distance', 'rms', 'zrms distance', 'zrms', \
'fraction mixing layer', 'fraction PV<2pvu', 'fraction in troposphere'] + \
ncluster * ['xcluster', 'ycluster', 'zcluster', 'fcluster', 'rmscluster']
['release number', 'seconds prior to release', 'lon', 'lat',
'height', 'mean topography',
'mean mixing height', 'mean tropopause height', 'mean PV index',
'rms distance', 'rms', 'zrms distance', 'zrms',
'fraction mixing layer', 'fraction PV<2pvu',
'fraction in troposphere'] + \
ncluster * ['xcluster', 'ycluster', 'zcluster', 'fcluster',
'rmscluster']
RelTraj['info'] = \
"""
Returns a dictionary:
R['Trajectories'] = array_of_floats(
releasenum,it1,xi,yi,zi,topoi,hmixi,tropoi,pvi,
rmsdisti,rmsi,zrmsdisti,zrmsi,hfri,pvfri,trfri,
(xclusti(k),yclusti(k),zclusti(k),fclusti(k),rmsclusti(k),k=1,5))
R['RELEASE_ID'] = (dt_i1,dt_i2,xp1,yp1,xp2,yp2,zp1,zp2,k,npart)
R['info'] = this message
To plot a trajectory timeseries:
RT = read_trajectories(H)
T = RT['Trajectories']
rel = 1
t = T[np.where(T[:,0]==rel),:][0]
plt.plot(t[:,1],t[:,14])
plt.savefig('trajectories.png')
"""
return RelTraj
"""
Returns a dictionary:
R['Trajectories'] = array_of_floats(
releasenum,it1,xi,yi,zi,topoi,hmixi,tropoi,pvi,
rmsdisti,rmsi,zrmsdisti,zrmsi,hfri,pvfri,trfri,
(xclusti(k),yclusti(k),zclusti(k),fclusti(k),rmsclusti(k),k=1,5))
R['RELEASE_ID'] = (dt_i1,dt_i2,xp1,yp1,xp2,yp2,zp1,zp2,k,npart)
R['info'] = this message
To plot a trajectory timeseries:
RT = read_trajectories(H)
T = RT['Trajectories']
rel = 1
t = T[np.where(T[:,0]==rel),:][0]
plt.plot(t[:,1],t[:,14])
plt.savefig('trajectories.png')
"""
return RelTraj
21 changes: 11 additions & 10 deletions reflexible/conv2netcdf4/flexpart_read.py
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,8 @@ def read_trajectories(H, trajfile='trajectories.txt',
ibdate, ibtime = alltraj[0].strip().split()[:2]
model = 'Flexpart'
version = 'V.x'
dt = datetime.datetime.strptime(ibdate + ibtime.zfill(6), '%Y%m%d%H%M%S')
dt = datetime.datetime.strptime(ibdate + ibtime.zfill(6),
'%Y%m%d%H%M%S')
numpoint = int(alltraj[2].strip())
# Fill a dictionary with the Release points and information keyed by name
# RelTraj['RelTraj_ID'] = (i1,i2,xp1,yp1,xp2,yp2,zp1,zp2,k,npart)
Expand Down Expand Up @@ -702,12 +703,12 @@ def _get_header_version(bf):

ret = bf.tell()
bf.seek(12) # start of version string
version = bf.read('13S')
version = bf.read('13S').decode()
# Somewhere in version 9.2 beta, the version length changed to 29
# However, one *must* check which is the final size for this
if '9.2 b' in version:
bf.seek(12)
version = bf.read('29S')
version = bf.read('29S').decode()
bf.seek(ret)

return version
Expand Down Expand Up @@ -874,7 +875,7 @@ def read_header(pathname, **kwargs):
h['jjjjmmdd'] = bf.read('i')
h['hhmmss'] = bf.read('i')
junk.append(bf.read('2i'))
h['nspec'] = bf.read('i') / 3 # why!?
h['nspec'] = bf.read('i') // 3 # why!?
h['numpointspec'] = bf.read('i')
junk.append(bf.read('2i'))

Expand All @@ -896,15 +897,15 @@ def read_header(pathname, **kwargs):
else:
junk.append(bf.read('i'))
h['wetdep'].append(
''.join([bf.read('c') for i in range(10)]).strip())
''.join([bf.read('c').decode() for i in range(10)]).strip())
junk.append(bf.read('2i'))
junk.append(bf.read('i'))
h['drydep'].append(
''.join([bf.read('c') for i in range(10)]).strip())
''.join([bf.read('c').decode() for i in range(10)]).strip())
junk.append(bf.read('2i'))
h['nz_list'].append(bf.read('i'))
h['species'].append(
''.join([bf.read('c') for i in range(10)]).strip())
''.join([bf.read('c').decode() for i in range(10)]).strip())
junk.append(bf.read('2i'))

if 'V6' in version:
Expand All @@ -922,7 +923,7 @@ def read_header(pathname, **kwargs):
I = {2: 'kindz', 3: 'xp1', 4: 'yp1', 5: 'xp2',
6: 'yp2', 7: 'zpoint1', 8: 'zpoint2', 9: 'npart', 10: 'mpart'}

for k, v in I.iteritems():
for k, v in I.items():
# create zero-filled lists in H dict
h[v] = np.zeros(h['numpoint'])

Expand Down Expand Up @@ -960,9 +961,9 @@ def read_header(pathname, **kwargs):
gt = bf.tell() + l # create 'goto' point
sp = ''
# collect the characters for the compoint
while re.search("\w", bf.read('c')):
while re.search(b"\w", bf.read('c')):
bf.seek(-1, 1)
sp = sp + bf.read('c')
sp = sp + bf.read('c').decode()

bf.seek(gt) # skip ahead to gt point

Expand Down
18 changes: 9 additions & 9 deletions reflexible/conv2netcdf4/tests/test_basics.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def __init__(self, fp_name):
self.fp_path = rf.datasets[fp_name]

def setup(self, tmpdir):
self.tmpdir = tmpdir # bring the fixture to the Dataset instance
self.tmpdir = tmpdir # bring the fixture to the Dataset instance
self.H = conv.Header(self.fp_path)
self.nc_path = tmpdir.join("%s.nc" % self.fp_name).strpath
return self.H, self.fp_path, self.nc_path
Expand All @@ -38,15 +38,15 @@ def test_nc_create(self):

def test_read_grid(self):
FD = conv.read_grid(self.H, time_ret=0, nspec_ret=0)
fdkeys = sorted(FD.keys())
assert fdkeys == ['grid_dates', 'options', (0, '20070121100000')]
fdkeys = sorted([k for k in FD.keys() if type(k) is str])
assert fdkeys == ['grid_dates', 'options']
fdkeys_ = sorted(FD[(0, '20070121100000')].keys())
assert fdkeys_ == fd_keys

def test_H_read_grid(self):
self.H.read_grid(time_ret=0, nspec_ret=0)
fdkeys = sorted(self.H.FD.keys())
assert fdkeys == ['grid_dates', 'options', (0, '20070121100000')]
fdkeys = sorted([k for k in self.H.FD.keys() if type(k) is str])
assert fdkeys == ['grid_dates', 'options']
fdkeys_ = sorted(self.H.FD[(0, '20070121100000')].keys())
assert fdkeys_ == fd_keys

Expand Down Expand Up @@ -74,14 +74,14 @@ def test_fill_backward(self):

def test_read_grid(self):
FD = conv.read_grid(self.H, time_ret=0, nspec_ret=0)
fdkeys = sorted(FD.keys())
assert fdkeys == ['grid_dates', 'options', (0, self.H.available_dates[0])]
fdkeys = sorted([k for k in FD.keys() if type(k) is str])
assert fdkeys == ['grid_dates', 'options']
fdkeys_ = sorted(FD[(0, self.H.available_dates[0])].keys())
assert fdkeys_ == fd_keys

def test_H_read_grid(self):
self.H.read_grid(time_ret=0, nspec_ret=0)
fdkeys = sorted(self.H.FD.keys())
assert fdkeys == ['grid_dates', 'options', (0, self.H.available_dates[0])]
fdkeys = sorted([k for k in self.H.FD.keys() if type(k) is str])
assert fdkeys == ['grid_dates', 'options']
fdkeys_ = sorted(self.H.FD[(0, self.H.available_dates[0])].keys())
assert fdkeys_ == fd_keys
4 changes: 2 additions & 2 deletions reflexible/data_structures.py
Original file line number Diff line number Diff line change
Expand Up @@ -735,11 +735,11 @@ def __init__(self, **options):
self._overrides = options

# set the default options as attributes
for key, value in self._OPTIONS.iteritems():
for key, value in self._OPTIONS.items():
setattr(self, key.lower(), value[0])

# override the attributes with options
for key, value in options.iteritems():
for key, value in options.items():
setattr(self, key.lower(), value)

if self.ibdate is None:
Expand Down

0 comments on commit 6b4c822

Please sign in to comment.