# 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
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]
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
# 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()
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
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))
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]
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)
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
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)