Exemplo n.º 1
0
# read altim
print 'reading altim...'
f2 = tb.openFile(FILE_ALTIM, 'a')
h_altim = f2.root.dh_mean_mixed_const_xcal[:-1,...]  # minus last to agree with firn ts
t_altim = ap.num2year(f2.root.time_xcal[:-1])  # years
lat_altim = f2.root.lat[:]      # 1d
lon_altim = f2.root.lon[:]      # 1d
lon_altim = ap.lon_180_360(lon_altim, inverse=True)

# get lon/lat only of complete (no gaps) altim ts
h_altim = h_altim.sum(axis=0)                    # 3d -> 2d
i_altim, j_altim = np.where(~np.isnan(h_altim))  # 2d indices
lonlat_altim = np.column_stack((lon_altim[j_altim], lat_altim[i_altim]))

# find nearest lon/lat in the firn model
i_firn, j_firn = ap.find_nearest2(lon_firn, lat_firn, lonlat_altim)

# find nearest altim times in the firn times
k_firn, = ap.find_nearest(t_firn, t_altim)

# new firn grid => same altim resolution with original firn time
nt, ny, nx = h_firn.shape[0], h_altim.shape[0], h_altim.shape[1]
h_firn_new = np.full((nt, ny, nx), np.nan, dtype='f8')

# space interpolation (out-of-core)
#h_firn_new[:, i_altim, j_altim] = h_firn[:, i_firn, j_firn]
h_firn_new = array_to_array(h_firn_new, h_firn, i_altim, j_altim, i_firn, j_firn)

del h_firn

# 3-month average, and time interpolation
Exemplo n.º 2
0
if len(sys.argv) < 2:
    raise IOError('no input file!')

fname = sys.argv[1]

fin = nc.Dataset(fname)
d = fin.variables

firn = d['zs']
year = d['time'][:]
lon = d['lon'][:]
lat = d['lat'][:]
ism = d['ism']

j, i = ap.find_nearest2(lon, lat, points)

k, = np.where((year > 1992) & (year < 2012))

'''
plt.figure()
m = ap.viz.make_proj_stere((lon[-1,0], lat[-1,0], lon[0,-1], lat[0,-1]), lat_ts=-90)
px, py = m(lon[i,j], lat[i,j])

m.imshow(firn[1000,...], origin='lower', interpolation='nearest')
m.plot(px, py, 'o')
plt.title('lon, lat = %.3f, %.3f' % (plon, plat))
'''

for ii, jj in zip(i,j):
    print lon[jj,ii], lat[jj,ii]
Exemplo n.º 3
0
def main():

    fname_in = sys.argv[1]

    din = GetData(fname_in, 'a')
    satname = din.satname
    time = change_day(din.time, 15)  # change all days (e.g. 14,15,16,17) to 15
    ts = getattr(din, VAR_TO_CALIBRATE)
    err = din.dh_error
    n_ad = din.n_ad
    n_da = din.n_da
    lon = din.lon
    lat = din.lat
    din.file.close()
    t = ap.num2year(time)

    if SUBSET:  # get subset
        ts, lon2, lat2 = ap.get_subset(ap.amundsen, ts, lon, lat)
        err, lon2, lat2 = ap.get_subset(ap.amundsen, err, lon, lat)
        n_ad, lon2, lat2 = ap.get_subset(ap.amundsen, n_ad, lon, lat)
        n_da, lon2, lat2 = ap.get_subset(ap.amundsen, n_da, lon, lat)
        lon, lat = lon2, lat2

    xx, yy = np.meshgrid(lon, lat)
    nt, ny, nx = ts.shape
    offset_12 = np.full((ny, nx), np.nan)
    offset_23 = np.full((ny, nx), np.nan)

    print 'cross-calibrating time series:', VAR_TO_CALIBRATE

    isfirst = True

    if SAT_NAMES is None:
        satnames = np.unique(din.satname)

    # iterate over every grid cell (all times)
    no_overlap_12 = 0
    no_overlap_23 = 0
    for i in xrange(ny):
        for j in xrange(nx):

            if 0:
                i, j = ap.find_nearest2(xx, yy, (LON, LAT))
                i -= 0
                j += 0

            print 'grid-cell:', i, j

            ts_ij = ts[:, i, j]
            if np.isnan(ts_ij).all(): continue

            # get all time series (all sats) in one df (per grid-cell)
            var = create_df_with_sats(time, ts_ij, satname, SAT_NAMES)

            if DETREND:
                var = var.apply(detrend)

            if FILTER:
                var = var.apply(ap.hp_filt, lamb=7, nan=True)

            if PLOT_TS and (var.count().sum() > 10):
                print 'grid-cell:', i, j
                var.plot(linewidth=3, figsize=(9, 3), legend=False)
                plt.title('Elevation change, dh  (lon=%.2f, lat=%.2f)' %
                          (xx[i, j], yy[i, j]))
                plt.ylabel('m')
                plt.show()

            # compute offset (if ts overlap)
            #---------------------------------------------------
            x = pd.notnull(var)
            overlap_12 = x['ers1'] & x['ers2']
            overlap_23 = x['ers2'] & x['envi']

            if np.sometrue(overlap_12):
                if SAT_BIAS:
                    s1 = var['ers1'][overlap_12]
                    s2 = var['ers2'][overlap_12]
                    if LINEAR_FIT:
                        # using linear fit
                        s1 = s1[s1.notnull() & s2.notnull()]
                        s2 = s2[s1.notnull() & s2.notnull()]
                        if len(s1) > 1 and len(s2) > 1:
                            s1.index, s1[:] = ap.linear_fit(
                                ap.date2year(s1.index), s1.values)
                            s2.index, s2[:] = ap.linear_fit(
                                ap.date2year(s2.index), s2.values)
                            offset = (s1.values[-1] - s1.values[0]) - (
                                s2.values[-1] - s2.values[0])
                        else:
                            pass
                    else:
                        # using absolute values
                        s1 = ap.referenced(s1, to='first')
                        s2 = ap.referenced(s2, to='first')
                        s1[0], s2[0] = np.nan, np.nan  # remove first values
                        offset = np.nanmean(s1 - s2)

                    #pd.concat((s1, s2), axis=1).plot(marker='o')
                else:
                    offset = np.nanmean(var['ers1'] - var['ers2'])
                offset_12[i, j] = offset
            else:
                no_overlap_12 += 1

            if np.sometrue(overlap_23):
                if SAT_BIAS:
                    s2 = var['ers2'][overlap_23]
                    s3 = var['envi'][overlap_23]
                    if LINEAR_FIT:
                        s2 = s2[s2.notnull() & s3.notnull()]
                        s3 = s3[s2.notnull() & s3.notnull()]
                        if len(s2) > 1 and len(s3) > 1:
                            s2.index, s2[:] = ap.linear_fit(
                                ap.date2year(s2.index), s2.values)
                            s3.index, s3[:] = ap.linear_fit(
                                ap.date2year(s3.index), s3.values)
                            offset = (s2.values[-1] - s2.values[0]) - (
                                s3.values[-1] - s3.values[0])
                        else:
                            pass
                    else:
                        s2 = ap.referenced(s2, to='first')
                        s3 = ap.referenced(s3, to='first')
                        s2[0], s3[0] = np.nan, np.nan
                        offset = np.nanmean(s2 - s3)
                    #pd.concat((s2, s3), axis=1).plot(marker='o')
                    #plt.show()
                else:
                    offset = np.nanmean(var['ers2'] - var['envi'])
                offset_23[i, j] = offset
            else:
                no_overlap_23 += 1

            #---------------------------------------------------

    mean_offset_12 = np.nanmean(offset_12)
    median_offset_12 = np.nanmedian(offset_12)
    mean_offset_23 = np.nanmean(offset_23)
    median_offset_23 = np.nanmedian(offset_23)

    if SAVE_TO_FILE:
        fout = tb.open_file(FNAME_OUT, 'w')
        fout.create_array('/', 'lon', lon)
        fout.create_array('/', 'lat', lat)
        fout.create_array('/', 'offset_12', offset_12)
        fout.create_array('/', 'offset_23', offset_23)
        fout.close()

    if PLOT:
        plt.figure()
        plt.subplot(211)
        offset_12 = ap.median_filt(offset_12, 3, 3)
        plt.imshow(offset_12,
                   origin='lower',
                   interpolation='nearest',
                   vmin=-.5,
                   vmax=.5)
        plt.title('ERS1-ERS2')
        plt.colorbar(shrink=0.8)
        plt.subplot(212)
        offset_23 = ap.median_filt(offset_23, 3, 3)
        plt.imshow(offset_23,
                   origin='lower',
                   interpolation='nearest',
                   vmin=-.5,
                   vmax=.5)
        plt.title('ERS2-Envisat')
        #plt.colorbar(shrink=0.3, orientation='h')
        plt.colorbar(shrink=0.8)
        plt.figure()
        plt.subplot(121)
        o12 = offset_12[~np.isnan(offset_12)]
        plt.hist(o12, bins=100)
        plt.title('ERS1-ERS2')
        ax = plt.gca()
        ap.intitle('mean/median = %.2f/%.2f m' %
                   (mean_offset_12, median_offset_12),
                   ax=ax,
                   loc=2)
        plt.xlim(-1, 1)
        plt.subplot(122)
        o23 = offset_23[~np.isnan(offset_23)]
        plt.hist(o23, bins=100)
        plt.title('ERS2-Envisat')
        ax = plt.gca()
        ap.intitle('mean/median = %.2f/%.2f m' %
                   (mean_offset_23, median_offset_23),
                   ax=ax,
                   loc=2)
        plt.xlim(-1, 1)
        plt.show()

    print 'calibrated variable:', VAR_TO_CALIBRATE
    print 'no overlaps:', no_overlap_12, no_overlap_23
    print 'mean offset:', mean_offset_12, mean_offset_23
    print 'median offset:', median_offset_12, median_offset_23
    print 'out file ->', FNAME_OUT
Exemplo n.º 4
0
# crop firn grid
# i1, j1 = ap.find_nearest2(lons1, lats1, points2)
k1, = np.where((dt1 > dt.datetime(1992, 1, 1)) & (dt1 < dt.datetime(2012, 1, 1)))
# i_min, i_max, j_min, j_max = i1.min(), i1.max(), j1.min(), j1.max()
##lons1, lats1 = lons1[i_min:i_max,j_min:j_max], lats1[i_min:i_max,j_min:j_max]
##firn = firn[k1,i_min:i_max,j_min:j_max]
# lons1, lats1 = lons1[130:160,30:65], lats1[130:160,30:65]
# firn = firn[k1,130:160,30:65]
# dt1 = dt1[k1]

# lons1 = lons1[::-1,:]
# lats1 = lats1[::-1,:]

# indices of cropped grid
i1, j1 = ap.find_nearest2(lons1, lats1, points2)
i2, j2 = ap.find_nearest2(lons2, lats2, points2)

print lons1[-1, 0], lats1[-1, 0], lons1[0, -1], lats1[0, -1]

for i_1, j_1, i_2, j_2 in zip(i1, j1, i2, j2):

    x1, y1 = lons1[i_1, j_1].round(3), lats1[i_1, j_1].round(3)
    x2, y2 = lons2[i_2, j_2].round(3), lats2[i_2, j_2].round(3)
    print "firn lon/lat:", x1, y1
    print "elev lon/lat:", x2, y2

    if np.alltrue(np.isnan(elev[:, i_2, j_2])):
        continue

    fig = plt.figure()
Exemplo n.º 5
0
print 'reading altim...'
f2 = tb.openFile(FILE_ALTIM, 'a')
h_altim = f2.root.dh_mean_mixed_const_xcal[:-1,
                                           ...]  # minus last to agree with firn ts
t_altim = ap.num2year(f2.root.time_xcal[:-1])  # years
lat_altim = f2.root.lat[:]  # 1d
lon_altim = f2.root.lon[:]  # 1d
lon_altim = ap.lon_180_360(lon_altim, inverse=True)

# get lon/lat only of complete (no gaps) altim ts
h_altim = h_altim.sum(axis=0)  # 3d -> 2d
i_altim, j_altim = np.where(~np.isnan(h_altim))  # 2d indices
lonlat_altim = np.column_stack((lon_altim[j_altim], lat_altim[i_altim]))

# find nearest lon/lat in the firn model
i_firn, j_firn = ap.find_nearest2(lon_firn, lat_firn, lonlat_altim)

# find nearest altim times in the firn times
k_firn, = ap.find_nearest(t_firn, t_altim)

# new firn grid => same altim resolution with original firn time
nt, ny, nx = h_firn.shape[0], h_altim.shape[0], h_altim.shape[1]
h_firn_new = np.full((nt, ny, nx), np.nan, dtype='f8')

# space interpolation (out-of-core)
#h_firn_new[:, i_altim, j_altim] = h_firn[:, i_firn, j_firn]
h_firn_new = array_to_array(h_firn_new, h_firn, i_altim, j_altim, i_firn,
                            j_firn)

del h_firn
Exemplo n.º 6
0
    plt.imshow(data[10], origin='lower', interpolation='nearest', 
               extent=(lon.min(), lon.max(), lat.min(), lat.max()), 
               aspect='auto')
    plt.show()
    exit()
    '''

if 1: # (yes) filter time
    _, data = ap.time_filt(time, data, from_time=1994, to_time=2013)
    time, error = ap.time_filt(time, error, from_time=1994, to_time=2013)

dt = ap.year2date(time)

# remove bad grid cells (visual inspection)
if 1:
    ii, jj = ap.find_nearest2(xx, yy, lonlat)
    k = 0
    for i, j in zip(ii, jj):
        print k, lonlat[k]
        '''
        plt.plot(time, data[:,i,j])
        plt.show()
        '''
        data[:,i,j] = np.nan
        k += 1
    print 'removed grid cells:', k

# (NO) filter ts with xcal offset > 1.5  # offset of dh_mean!
if 0: 
    print 'xcalib filtering...'
    i, j = np.where((offset_12 > 2) | (offset_23 > 2))
Exemplo n.º 7
0
if len(sys.argv) < 2:
    raise IOError("no input file!")

fname = sys.argv[1]

fin = nc.Dataset(fname)
d = fin.variables

firn = d["zs"]
year = d["time"][:]
lon = d["lon"][:]
lat = d["lat"][:]
ism = d["ism"]

j, i = ap.find_nearest2(lon, lat, points)

k, = np.where((year > 1992) & (year < 2012))

"""
plt.figure()
m = ap.viz.make_proj_stere((lon[-1,0], lat[-1,0], lon[0,-1], lat[0,-1]), lat_ts=-90)
px, py = m(lon[i,j], lat[i,j])

m.imshow(firn[1000,...], origin='lower', interpolation='nearest')
m.plot(px, py, 'o')
plt.title('lon, lat = %.3f, %.3f' % (plon, plat))
"""

for ii, jj in zip(i, j):
    print lon[jj, ii], lat[jj, ii]
Exemplo n.º 8
0
hpfilt = hpfilt.apply(ap.referenced, to='first')

# smooth fields (sigma between 0.6-7)
print 'smoothing fields...'
hpfilt = hpfilt.T.to_panel()
hpfilt_grad = hpfilt_grad.T.to_panel()
apply_to_panel(ap.gfilter, hpfilt, .7)
apply_to_panel(ap.gfilter, hpfilt_grad, .7)

# plot time series: (1,161), (2,161), (3,161)
if PLOT:
    '''
    i, j = 1, 161
    '''
    xx, yy = np.meshgrid(lon, lat)
    i, j = ap.find_nearest2(xx, yy, [(116, -67)])
    a, b = xx[i,j], yy[i,j]
    print a, b
    '''
    plt.figure()
    ax1 = plt.subplot(211)
    plt.plot(time, h0[:,i,j], linewidth=2)
    ap.intitle('uncorr. elevation', ax=ax1)
    ax2 = plt.subplot(212)
    plt.plot(time, g[:,i,j], linewidth=2, c='k')
    ap.intitle('backscatter', ax=ax2)
    #plt.savefig('totten_d1.png')
    '''

    plt.plot(time, h[:,i,j], linewidth=1, label='seasonal')
    #plt.plot(time, h_cycle, linewidth=2)
Exemplo n.º 9
0
def main():

    fname_in = sys.argv[1] 

    din = GetData(fname_in, 'a')
    satname = din.satname
    time = change_day(din.time, 15)      # change all days (e.g. 14,15,16,17) to 15
    ts = getattr(din, VAR_TO_CALIBRATE)
    err = din.dh_error
    n_ad = din.n_ad
    n_da = din.n_da
    lon = din.lon
    lat = din.lat
    din.file.close()
    t = ap.num2year(time)

    if SUBSET: # get subset
        ts, lon2, lat2 = ap.get_subset(ap.amundsen, ts, lon, lat)
        err, lon2, lat2 = ap.get_subset(ap.amundsen, err, lon, lat)
        n_ad, lon2, lat2 = ap.get_subset(ap.amundsen, n_ad, lon, lat)
        n_da, lon2, lat2 = ap.get_subset(ap.amundsen, n_da, lon, lat)
        lon, lat = lon2, lat2

    xx, yy = np.meshgrid(lon, lat)
    nt, ny, nx = ts.shape
    offset_12 = np.full((ny,nx), np.nan)
    offset_23 = np.full((ny,nx), np.nan)

    print 'cross-calibrating time series:', VAR_TO_CALIBRATE

    isfirst = True

    if SAT_NAMES is None:
        satnames = np.unique(din.satname)

    # iterate over every grid cell (all times)
    no_overlap_12 = 0
    no_overlap_23 = 0
    for i in xrange(ny):
        for j in xrange(nx):

            if 0:
                i, j = ap.find_nearest2(xx, yy, (LON,LAT))
                i -= 0
                j += 0

            print 'grid-cell:', i, j

            ts_ij = ts[:,i,j]
            if np.isnan(ts_ij).all(): continue

            # get all time series (all sats) in one df (per grid-cell)
            var = create_df_with_sats(time, ts_ij, satname, SAT_NAMES)

            if DETREND:
                var = var.apply(detrend)

            if FILTER:
                var = var.apply(ap.hp_filt, lamb=7, nan=True)

            if PLOT_TS and (var.count().sum() > 10):
                print 'grid-cell:', i, j
                var.plot(linewidth=3, figsize=(9, 3), legend=False)
                plt.title('Elevation change, dh  (lon=%.2f, lat=%.2f)' % (xx[i,j], yy[i,j]))
                plt.ylabel('m')
                plt.show()

            # compute offset (if ts overlap)
            #---------------------------------------------------
            x = pd.notnull(var)
            overlap_12 = x['ers1'] & x['ers2']
            overlap_23 = x['ers2'] & x['envi']

            if np.sometrue(overlap_12):
                if SAT_BIAS:
                    s1 = var['ers1'][overlap_12]
                    s2 = var['ers2'][overlap_12]
                    if LINEAR_FIT:
                        # using linear fit
                        s1 = s1[s1.notnull() & s2.notnull()]
                        s2 = s2[s1.notnull() & s2.notnull()]
                        if len(s1) > 1 and len(s2) > 1:
                            s1.index, s1[:] = ap.linear_fit(ap.date2year(s1.index), s1.values)
                            s2.index, s2[:] = ap.linear_fit(ap.date2year(s2.index), s2.values)
                            offset = (s1.values[-1] - s1.values[0]) - (s2.values[-1] - s2.values[0])
                        else:
                            pass
                    else:
                        # using absolute values
                        s1 = ap.referenced(s1, to='first')
                        s2 = ap.referenced(s2, to='first')
                        s1[0], s2[0] = np.nan, np.nan # remove first values
                        offset = np.nanmean(s1 - s2)

                    #pd.concat((s1, s2), axis=1).plot(marker='o')
                else:
                    offset = np.nanmean(var['ers1'] - var['ers2'])
                offset_12[i,j] = offset
            else:
                no_overlap_12 += 1

            if np.sometrue(overlap_23):
                if SAT_BIAS:
                    s2 = var['ers2'][overlap_23]
                    s3 = var['envi'][overlap_23]
                    if LINEAR_FIT:
                        s2 = s2[s2.notnull() & s3.notnull()]
                        s3 = s3[s2.notnull() & s3.notnull()]
                        if len(s2) > 1 and len(s3) > 1:
                            s2.index, s2[:] = ap.linear_fit(ap.date2year(s2.index), s2.values)
                            s3.index, s3[:] = ap.linear_fit(ap.date2year(s3.index), s3.values)
                            offset = (s2.values[-1] - s2.values[0]) - (s3.values[-1] - s3.values[0])
                        else:
                            pass
                    else:
                        s2 = ap.referenced(s2, to='first')
                        s3 = ap.referenced(s3, to='first')
                        s2[0], s3[0] = np.nan, np.nan
                        offset = np.nanmean(s2 - s3)
                    #pd.concat((s2, s3), axis=1).plot(marker='o')
                    #plt.show()
                else:
                    offset = np.nanmean(var['ers2'] - var['envi'])
                offset_23[i,j] = offset 
            else:
                no_overlap_23 += 1

            #---------------------------------------------------

    mean_offset_12 = np.nanmean(offset_12)
    median_offset_12 = np.nanmedian(offset_12)
    mean_offset_23 = np.nanmean(offset_23)
    median_offset_23 = np.nanmedian(offset_23)

    if SAVE_TO_FILE:
        fout = tb.open_file(FNAME_OUT, 'w')
        fout.create_array('/', 'lon', lon)
        fout.create_array('/', 'lat', lat)
        fout.create_array('/', 'offset_12', offset_12)
        fout.create_array('/', 'offset_23', offset_23)
        fout.close()

    if PLOT:
        plt.figure()
        plt.subplot(211)
        offset_12 = ap.median_filt(offset_12, 3, 3)
        plt.imshow(offset_12, origin='lower', interpolation='nearest', vmin=-.5, vmax=.5)
        plt.title('ERS1-ERS2')
        plt.colorbar(shrink=0.8)
        plt.subplot(212)
        offset_23 = ap.median_filt(offset_23, 3, 3)
        plt.imshow(offset_23, origin='lower', interpolation='nearest', vmin=-.5, vmax=.5)
        plt.title('ERS2-Envisat')
        #plt.colorbar(shrink=0.3, orientation='h')
        plt.colorbar(shrink=0.8)
        plt.figure()
        plt.subplot(121)
        o12 = offset_12[~np.isnan(offset_12)]
        plt.hist(o12, bins=100)
        plt.title('ERS1-ERS2')
        ax = plt.gca()
        ap.intitle('mean/median = %.2f/%.2f m' % (mean_offset_12, median_offset_12), 
                    ax=ax, loc=2)
        plt.xlim(-1, 1)
        plt.subplot(122)
        o23 = offset_23[~np.isnan(offset_23)]
        plt.hist(o23, bins=100)
        plt.title('ERS2-Envisat')
        ax = plt.gca()
        ap.intitle('mean/median = %.2f/%.2f m' % (mean_offset_23, median_offset_23),
                    ax=ax, loc=2)
        plt.xlim(-1, 1)
        plt.show()

    print 'calibrated variable:', VAR_TO_CALIBRATE
    print 'no overlaps:', no_overlap_12, no_overlap_23
    print 'mean offset:', mean_offset_12, mean_offset_23
    print 'median offset:', median_offset_12, median_offset_23
    print 'out file ->', FNAME_OUT
Exemplo n.º 10
0
hpfilt = hpfilt.apply(ap.referenced, to='first')

# smooth fields (sigma between 0.6-7)
print 'smoothing fields...'
hpfilt = hpfilt.T.to_panel()
hpfilt_grad = hpfilt_grad.T.to_panel()
apply_to_panel(ap.gfilter, hpfilt, .7)
apply_to_panel(ap.gfilter, hpfilt_grad, .7)

# plot time series: (1,161), (2,161), (3,161)
if PLOT:
    '''
    i, j = 1, 161
    '''
    xx, yy = np.meshgrid(lon, lat)
    i, j = ap.find_nearest2(xx, yy, [(116, -67)])
    a, b = xx[i, j], yy[i, j]
    print a, b
    '''
    plt.figure()
    ax1 = plt.subplot(211)
    plt.plot(time, h0[:,i,j], linewidth=2)
    ap.intitle('uncorr. elevation', ax=ax1)
    ax2 = plt.subplot(212)
    plt.plot(time, g[:,i,j], linewidth=2, c='k')
    ap.intitle('backscatter', ax=ax2)
    #plt.savefig('totten_d1.png')
    '''

    plt.plot(time, h[:, i, j], linewidth=1, label='seasonal')
    #plt.plot(time, h_cycle, linewidth=2)