diff --git a/IS2_velocity/__init__.py b/IS2_velocity/__init__.py new file mode 100644 index 0000000..3916844 --- /dev/null +++ b/IS2_velocity/__init__.py @@ -0,0 +1,4 @@ +from . import readers +from . import correlation_processing +from . import extract_alongtrack +from . import atl03_reprocessing diff --git a/IS2_velocity/atl03_reprocessing.py b/IS2_velocity/atl03_reprocessing.py new file mode 100644 index 0000000..9c99c1b --- /dev/null +++ b/IS2_velocity/atl03_reprocessing.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import numpy as np + +def reinterpolate_atl03(x_in,h_in,x_step=5,x_win=10): + r"""Recreate an ATL06-like product at finer resolution. + + The ICESat-2 ATL06 product is created by linear regression + on the ATL03 photon cloud every 20 meters; then, the ATL06 + elevation is evaluated at the center-point of the regression. + This funtion is meant to recrate this processing flow but for any + arbitrary step size. + + Parameters + ------ + x_in : array + along-track photon locations + h_in : array + along-track photon height + x_step : float; optional + along-track step between points in the desired output array + x_win : float; optional + window over which the liner fit is done (window is in both directions) + + Output + ------ + xs : array + along-track distance for reinterpolated points + hs : array + heights corresponding to the distances in 'xs' + """ + + # Set up the output arrays to be filled + xs = np.arange(np.nanmin(x_in),np.nanmax(x_in),x_step) + hs = np.empty_like(xs) + print('Total Length:',len(xs)) + + for i,x in enumerate(xs): + if i%100 == 0: + print(i) + # Find all the points within x_win meters of the current x location + idxs = np.logical_and(x_in>x-x_win,x_in= corr_threshold: + idx_peak = np.arange(len(corr))[corr == correlation_value][0] + best_shift = shift_vec[idx_peak] + velocities[xi] = best_shift/(dt/365) + correlations[xi] = correlation_value + else: + velocities[xi] = np.nan + correlations[xi] = correlation_value + + return velocities,correlations + +# ------------------------------------------------------------------------------------------- + +def smooth_and_diff(x_in,h_in,win=None): + r"""Smooth and differentiate an along-track height array. + + Parameters + ------ + x_in : array + along-track distance + h_in : array + along-track elevation + win : float; default None + smoothing window (in meters) + for example, if win=60 m, the smoothing window is a 3 point running average smoothed dataset, because each point is 20 m apart + + Output + ------ + h : array + along-track height (smoothed if win is not None) + dh : array + surface slope + """ + + # Default is no smoothing + if win is None: + # calculate the surface slope + dh = np.gradient(h_in,x_in) + return h_in,dh + + # running average smoother / filter + else: + # calculate the step between x points + dx = np.mean(np.gradient(x_in)) + # number of points (meters / dx) + N = int(np.round(win/dx)) + # smooth + h_smooth = np.nan*np.ones_like(x_in) + h_smooth[N//2:-N//2+1] = np.convolve(h_in,np.ones(N)/N, mode='valid') + # calculate the surface slope + dh = np.gradient(h_smooth,x_in) + return h_smooth,dh + +# ------------------------------------------------------------------------------------------- + +def fill_seg_ids(x_in,h_in,seg_ids,dx=20): + r"""Fill the along-track vector so that there are no skipped points + + Parameters + ------ + x_in : array + along-track distance + h_in : array + along-track elevation + seg_ids : array + segment ids as imported with atl06_to_dict function + dx : float; default 20 + step between points (20 m is the default for atl06) + + Output + ------ + x_full : array + filled array of along-track distance + h_full : array + filled array of alont-track elevation + """ + + # make a monotonically increasing x vector + ind = seg_ids - np.nanmin(seg_ids) # indices starting at zero, using the segment_id field, so any skipped segment will be kept in correct location + x_full = np.arange(np.max(ind)+1) * dx + x_in[0] + h_full = np.zeros(np.max(ind)+1) + np.NaN + h_full[ind] = h_in + + return x_full,h_full + +# ------------------------------------------------------------------------------------------- + +def time_diff(D1,D2): + r"""Get the time difference between two cycles + + Parameters + ------ + D1 : Dictionary 1 + D2 : Dictionary 2 + + Output + ------ + dt : float + time step + """ + + # get time strings + t1_string = D1['data_start_utc'].astype(str) #figure out later if just picking the first one it ok + t2_string = D2['data_start_utc'].astype(str) #figure out later if just picking hte first one it ok + # use astropy to get time from strings + t1 = Time(t1_string) + t2 = Time(t2_string) + # time step to julien days + dt = (t2 - t1).jd + + return dt + +# ------------------------------------------------------------------------------------------- diff --git a/IS2_velocity/draft_functions.py b/IS2_velocity/draft_functions.py new file mode 100644 index 0000000..8e928bc --- /dev/null +++ b/IS2_velocity/draft_functions.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import numpy as np + +### UNFINISHED FUNCTION - basic structure is good +### working on debugging problems with peaks at edges for the sub-sample routine + +def find_correlation_peak(lagvec, shift_vec, corr_normed, max_width, min_width, dx_interp, fit_type, plotting): + # max_width = how many SAMPLES wide the half peak can be, max, samples + # min_width = the narrowest the half peak can be, samples + # dx_interp = interpolated sample spacing, in units of SAMPLES + + from scipy.interpolate import interp1d + + # peak of un-interpolated data + ix_peak = np.arange(len(corr_normed))[corr_normed == np.nanmax(corr_normed)][0] + ix_peak = np.where(corr_normed == np.nanmax(corr_normed))[0][0] + + if fit_type == 'raw': + best_lag = lagvec[ix_peak] + best_shift = shift_vec[ix_peak] + peak_corr_value = corr_normed[ix_peak] + + else: + ### Assume we're doing a sub-sample fit + # find troughs before and after peak + + corr_diff = corr_normed[1:] - corr_normed[:-1] # to find troughs, zero-crossings + + # cases: + # ix_peak is too close to the start (ix_peak < min_width) + # calculate right width by finding trough or max/min, use ix_peak as left width + if ix_peak < min_width: + left_width = ix_peak # go to left edge + # determine right width + if ix_peak == 0: + ix_next_trough = np.where(corr_diff[ix_peak:] > 0)[0][0] + ix_peak + else: + ix_next_trough = np.where(corr_diff[ix_peak-1:] > 0)[0][0] + ix_peak + width_next_trough = -(ix_peak - ix_next_trough) + if width_next_trough < min_width: + right_width = min_width + elif width_next_trough > max_width: + right_width = max_width + else: + right_width = width_next_trough + + # ix_peak is too close to the end (len(corr_normed) - ix_peak < min_width) + # calculate left width by finding trough or max/min, use len(corr_normed) - ix_peak as right width + elif len(corr_normed) - ix_peak < min_width: + right_width = len(corr_normed) - ix_peak -1 + #determine left width + ix_prev_trough = ix_peak - np.where(np.flip(corr_diff[:ix_peak-1]) < 0)[0][0] + width_prev_trough = ix_peak - ix_prev_trough + if width_prev_trough < min_width: + left_width = min_width + elif width_prev_trough > max_width: + left_width = max_width + else: + left_width = width_prev_trough + + # other + else: + # calculate both left and right width + ix_next_trough = np.where(corr_diff[ix_peak-1:] > 0)[0][0] + ix_peak + ix_prev_trough = ix_peak - np.where(np.flip(corr_diff[:ix_peak-1]) < 0)[0][0] + # if width is greater than min, pick smaller width, so is same on both sides + width = np.min([ix_peak - ix_prev_trough, -(ix_peak - ix_next_trough)]) + if width > max_width: + width = max_width + elif width < min_width: + width = min_width + left_width = width + right_width = width + +# # deal with edges; just go to edge +# if ix_peak + width >= len(corr_normed): +# right_width = len(corr_normed) - ix_peak -1 +# else: +# right_width = width + +# if width>= ix_peak: +# left_width = ix_peak +# else: +# left_width = width + + # cut out data and an x vector before and after the peak (for plotting) + dcut = corr_normed[ix_peak - left_width: ix_peak + right_width +1] + xvec_cut = np.arange(ix_peak - left_width, ix_peak + right_width + 1) + lagvec_cut = lagvec[xvec_cut] + + if fit_type == 'parabola': + # fit parabola; in these data, usually a poor fit + fit_coeffs = np.polyfit(xvec_cut, dcut, deg=2, full = True) + + # create xvec to interpolate the parabola onto and compute + interp_xvec = np.arange(ix_peak - left_width, ix_peak + right_width + 1, 0.01) + fit = np.polyval(p = fit_coeffs[0], x = interp_xvec) + + # interp lagvec + lagvec_interp = np.arange(lagvec[ix_peak - left_width], lagvec[ix_peak + right_width + 1], dx_interp) + + # compute peak + ix_peak_interp = np.where(fit == np.max(fit))[0][0] + best_lag = interp_xvec[ix_peak_interp] + peak_corr_value = fit[ix_peak_interp] + + elif fit_type == 'cubic': +# # find troughs before and after peak +# corr_diff = corr_normed[1:] - corr_normed[:-1] +# ix_next_trough = np.where(corr_diff[ix_peak:] > 0)[0][0] + ix_peak +# ix_prev_trough = ix_peak - np.where(np.flip(corr_diff[:ix_peak]) < 0)[0][0] +# width = np.min([ix_peak - ix_prev_trough, -(ix_peak - ix_next_trough)]) +# if width > max_width: +# width = max_width +# elif width < min_width: +# width = min_width + +# # cut out data and an x vector before and after the peak (for plotting) +# dcut = corr_normed[ix_peak - width: ix_peak + width +1] +# xvec_cut = np.arange(ix_peak - width, ix_peak + width + 1) +# lagvec_cut = lagvec[xvec_cut] + +# if np.sum(np.isnan(dcut)) >0: +# print(str(np.sum(np.isnan(dcut))) + ' nans') + + # cubic spline interpolation + # create xvector to interpolate onto + interp_xvec = np.arange(ix_peak - left_width, ix_peak + right_width , dx_interp) + # create interpolation function + f = interp1d(xvec_cut, dcut, kind = 'cubic') + # evaluate interpolation function on new xvector + fit = f(interp_xvec) + + # interpolate lagvec + lagvec_interp = np.arange(lagvec[ix_peak - left_width], lagvec[ix_peak + right_width], dx_interp) + + # compute peak + ix_peak_interp = np.where(fit == np.max(fit))[0][0] + best_lag = lagvec_interp[ix_peak_interp] + peak_corr_value = fit[ix_peak_interp] + + return best_lag, peak_corr_value diff --git a/IS2_velocity/extract_alongtrack.py b/IS2_velocity/extract_alongtrack.py new file mode 100644 index 0000000..c584917 --- /dev/null +++ b/IS2_velocity/extract_alongtrack.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import numpy as np +import pointCollection as pc +import os, pyproj + +def add_surface_velocity_to_is2_dict(is2_dict, spatial_extent, path, vel_x, vel_y ): + """ + + is2_dict: Python dictionary with ATL06 track data + spatial_extent: bounding box of the interest area in the format: + (e.g. [-65, -86, -55, -81] == [min_lon, min_lat, max_lon, max_lat]) + path: local path to velocity data + vel_x: tif velocity raster with x component + vel_y: tif velocity raster with y component + + """ + data_root = path + + spatial_extent = np.array([spatial_extent]) + lat=spatial_extent[[1, 3, 3, 1, 1]] + lon=spatial_extent[[2, 2, 0, 0, 2]] + print(lat) + print(lon) + # project the coordinates to Antarctic polar stereographic + xy=np.array(pyproj.Proj(3031)(lon, lat)) + # get the bounds of the projected coordinates + XR=[np.nanmin(xy[0,:]), np.nanmax(xy[0,:])] + YR=[np.nanmin(xy[1,:]), np.nanmax(xy[1,:])] + + Measures_vx=pc.grid.data().from_geotif(os.path.join(data_root,vel_x), bounds=[XR, YR]) + Measures_vy=pc.grid.data().from_geotif(os.path.join(data_root,vel_y), bounds=[XR, YR]) + + vx = Measures_vx.interp(is2_dict['x'],is2_dict['y']) + vy = Measures_vy.interp(is2_dict['x'],is2_dict['y']) + + #Solve for angle to rotate Vy to be along track and Vx to be across track + import math + xL=abs((is2_dict['x'][0])-(is2_dict['x'][1])) + yL=abs((is2_dict['y'][0])-(is2_dict['y'][1])) + + #decides if is descending or ascending path + if is2_dict['x'][0]-is2_dict['x'][1] < 0: + + theta_rad=math.atan(xL/yL) + #theta_deg=theta_rad*180/math.pi + is2_dict['v_along']=vy/math.cos(theta_rad) + is2_dict['v_across']=vx/math.cos(theta_rad) + + else: + + theta_rad=math.atan(xL/yL) + #theta_deg=theta_rad*180/math.pi + is2_dict['v_along']=vy/math.sin(theta_rad) + is2_dict['v_across']=vx/math.sin(theta_rad) + + return is2_dict + + +def get_measures_along_track_velocity(x_ps_beam, y_ps_beam , spatial_extent, vel_x_path, vel_y_path): + """ + + is2_dict: Python dictionary with ATL06 track data + spatial_extent: bounding box of the interest area in the format: + (e.g. [-65, -86, -55, -81] == [min_lon, min_lat, max_lon, max_lat]) + path: local path to velocity data + vel_x: tif velocity raster with x component + vel_y: tif velocity raster with y component + + """ + + #fix with if statement about type of list or array DONE + + if type(spatial_extent) == type([]): + + spatial_extent = np.array([spatial_extent]) + + + lat=spatial_extent[[1, 3, 3, 1, 1]] + lon=spatial_extent[[2, 2, 0, 0, 2]] + + # project the coordinates to Antarctic polar stereographic + xy=np.array(pyproj.Proj(3031)(lon, lat)) + # get the bounds of the projected coordinates + XR=[np.nanmin(xy[0,:]), np.nanmax(xy[0,:])] + YR=[np.nanmin(xy[1,:]), np.nanmax(xy[1,:])] + + #Measures_vx=pc.grid.data().from_geotif(os.path.join(data_root,vel_x), bounds=[XR, YR]) + #Measures_vy=pc.grid.data().from_geotif(os.path.join(data_root,vel_y), bounds=[XR, YR]) + + Measures_vx=pc.grid.data().from_geotif(vel_x_path, bounds=[XR, YR]) + Measures_vy=pc.grid.data().from_geotif(vel_y_path, bounds=[XR, YR]) + + vx = Measures_vx.interp(x_ps_beam,y_ps_beam) + vy = Measures_vy.interp(x_ps_beam,y_ps_beam) + + #Solve for angle to rotate Vy to be along track and Vx to be across track + import math + xL=abs((x_ps_beam[0])-(x_ps_beam[1])) + yL=abs((y_ps_beam[0])-(y_ps_beam[1])) + + #decides if is descending or ascending path + if x_ps_beam[0]-x_ps_beam[1] < 0: + + theta_rad=math.atan(xL/yL) + #theta_deg=theta_rad*180/math.pi + v_along=vy/math.cos(theta_rad) + #v_across=vx/math.cos(theta_rad) + + else: + + theta_rad=math.atan(xL/yL) + #theta_deg=theta_rad*180/math.pi + v_along=vy/math.sin(theta_rad) + #v_across=vx/math.sin(theta_rad) + + #Vdiff=vy-v_along + return v_along + diff --git a/IS2_velocity/readers.py b/IS2_velocity/readers.py new file mode 100644 index 0000000..00ae9fc --- /dev/null +++ b/IS2_velocity/readers.py @@ -0,0 +1,408 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import numpy as np +import os,re,h5py,pyproj + +def atl06_to_dict(filename, beam, field_dict=None, index=None, epsg=None): + """ + Read selected datasets from an ATL06 file + + Input arguments: + filename: ATl06 file to read + beam: a string specifying which beam is to be read (ex: gt1l, gt1r, gt2l, etc) + field_dict: A dictinary describing the fields to be read + keys give the group names to be read, + entries are lists of datasets within the groups + index: which entries in each field to read + epsg: an EPSG code specifying a projection (see www.epsg.org). Good choices are: + for Greenland, 3413 (polar stereographic projection, with Greenland along the Y axis) + for Antarctica, 3031 (polar stereographic projection, centered on the Pouth Pole) + Output argument: + D6: dictionary containing ATL06 data. Each dataset in + dataset_dict has its own entry in D6. Each dataset + in D6 contains a numpy array containing the + data + """ + if field_dict is None: + field_dict={None:['latitude','longitude','h_li', 'atl06_quality_summary'],\ + 'ground_track':['x_atc','y_atc'],\ + 'fit_statistics':['dh_fit_dx', 'dh_fit_dy']} + D={} + file_re=re.compile('ATL06_(?P\d+)_(?P\d\d\d\d)(?P\d\d)(?P\d\d)_(?P\d\d\d)_(?P\d\d).h5') + with h5py.File(filename,'r') as h5f: + for key in field_dict: + for ds in field_dict[key]: + if key is not None: + ds_name=beam+'/land_ice_segments/'+key+'/'+ds + else: + ds_name=beam+'/land_ice_segments/'+ds + if index is not None: + D[ds]=np.array(h5f[ds_name][index]) + else: + D[ds]=np.array(h5f[ds_name]) + if '_FillValue' in h5f[ds_name].attrs: + bad_vals=D[ds]==h5f[ds_name].attrs['_FillValue'] + D[ds]=D[ds].astype(float) + D[ds][bad_vals]=np.NaN + D['data_start_utc'] = h5f['/ancillary_data/data_start_utc'][:] + D['delta_time'] = h5f['/' + beam + '/land_ice_segments/delta_time'][:] + D['segment_id'] = h5f['/' + beam + '/land_ice_segments/segment_id'][:] + if epsg is not None: + xy=np.array(pyproj.proj.Proj(epsg)(D['longitude'], D['latitude'])) + D['x']=xy[0,:].reshape(D['latitude'].shape) + D['y']=xy[1,:].reshape(D['latitude'].shape) + temp=file_re.search(filename) + D['rgt']=int(temp['rgt']) + D['cycle']=int(temp['cycle']) + D['beam']=beam + return D + + + +### Some functions +# MISSING HERE: mask by data quality? +def load_data_by_rgt(rgt, smoothing, smoothing_window_size, dx, path_to_data, product): + """ + rgt: repeat ground track number of desired data + smoothing: if true, a centered running avergae filter of smoothing_window_size will be used + smoothing_window_size: how large a smoothing window to use (in meters) + dx: desired spacing + path_to_data: + product: ex., ATL06 + """ + + # hard code these for now: + cycles = ['03','04','05','06','07'] # not doing 1 and 2, because don't overlap exactly + beams = ['gt1l','gt1r','gt2l','gt2r','gt3l','gt3r'] + + ### extract data from all available cycles + x_atc = {} + lats = {} + lons = {} + h_li_raw = {} # unsmoothed data; equally spaced x_atc, still has nans + h_li_raw_NoNans = {} # unsmoothed data; equally spaced x_atc, nans filled with noise + h_li = {} # smoothed data, equally spaced x_atc, nans filled with noise + h_li_diff = {} + times = {} + min_seg_ids = {} + segment_ids = {} + x_ps= {} + y_ps= {} + + cycles_this_rgt = [] + for cycle in cycles: # loop over all available cycles + Di = {} + x_atc[cycle] = {} + lats[cycle] = {} + lons[cycle] = {} + h_li_raw[cycle] = {} + h_li_raw_NoNans[cycle] = {} + h_li[cycle] = {} + h_li_diff[cycle] = {} + times[cycle] = {} + min_seg_ids[cycle] = {} + segment_ids[cycle] = {} + x_ps[cycle]= {} + y_ps[cycle]= {} + + + filenames = glob.glob(os.path.join(path_to_data, f'*{product}_*_{rgt}{cycle}*_003*.h5')) + error_count=0 + + + for filename in filenames: # try and load any available files; hopefully is just one + try: + for beam in beams: + Di[filename]=atl06_to_dict(filename,'/'+ beam, index=None, epsg=3031) + + + + times[cycle][beam] = Di[filename]['data_start_utc'] + + # extract h_li and x_atc, and lat/lons for that section + x_atc_tmp = Di[filename]['x_atc'] + h_li_tmp = Di[filename]['h_li']#[ixs] + lats_tmp = Di[filename]['latitude'] + lons_tmp = Di[filename]['longitude'] + x_ps_tmp = Di[filename]['x'] + y_ps_tmp= Di[filename]['y'] + + + # segment ids: + seg_ids = Di[filename]['segment_id'] + min_seg_ids[cycle][beam] = seg_ids[0] + #print(len(seg_ids), len(x_atc_tmp)) + + # make a monotonically increasing x vector + # assumes dx = 20 exactly, so be carefull referencing back + ind = seg_ids - np.nanmin(seg_ids) # indices starting at zero, using the segment_id field, so any skipped segment will be kept in correct location + x_full = np.arange(np.max(ind)+1) * 20 + x_atc_tmp[0] + h_full = np.zeros(np.max(ind)+1) + np.NaN + h_full[ind] = h_li_tmp + lats_full = np.zeros(np.shape(x_full)) * np.nan + lats_full[ind] = lats_tmp + lons_full = np.zeros(np.shape(x_full)) * np.nan + lons_full[ind] = lons_tmp + x_ps_full = np.zeros(np.shape(x_full)) * np.nan + x_ps_full[ind] = x_ps_tmp + y_ps_full = np.zeros(np.shape(x_full)) * np.nan + y_ps_full[ind] = y_ps_tmp + + ## save the segment id's themselves, with gaps filled in + segment_ids[cycle][beam] = np.zeros(np.max(ind)+1) + np.NaN + segment_ids[cycle][beam][ind] = seg_ids + + + x_atc[cycle][beam] = x_full + h_li_raw[cycle][beam] = h_full # preserves nan values + lons[cycle][beam] = lons_full + lats[cycle][beam] = lats_full + x_ps[cycle][beam] = x_ps_full + y_ps[cycle][beam] = y_ps_full + + ### fill in nans with noise h_li datasets + # h = ma.array(h_full,mask =np.isnan(h_full)) # created a masked array, mask is where the nans are + # h_full_filled = h.mask * (np.random.randn(*h.shape)) # fill in all the nans with random noise + + ### interpolate nans in pandas + # put in dataframe for just this step; eventually rewrite to use only dataframes? + data = {'x_full': x_full, 'h_full': h_full} + df = pd.DataFrame(data, columns = ['x_full','h_full']) + #df.plot(x='x_full',y='h_full') + # linear interpolation for now + df['h_full'].interpolate(method = 'linear', inplace = True) + h_full_interp = df['h_full'].values + h_li_raw_NoNans[cycle][beam] = h_full_interp # has filled nan values + + + # running average smoother /filter + if smoothing == True: + h_smoothed = (1/smoothing_window_size) * np.convolve(filt, h_full_interp, mode = 'same') + h_li[cycle][beam] = h_smoothed + + # differentiate that section of data + h_diff = (h_smoothed[1:] - h_smoothed[0:-1]) / (x_full[1:] - x_full[0:-1]) + else: + h_li[cycle][beam] = h_full_interp + h_diff = (h_full_interp[1:] - h_full_interp[0:-1]) / (x_full[1:] - x_full[0:-1]) + h_li_diff[cycle][beam] = h_diff + + + + #print(len(x_full), len(h_full), len(lats_full), len(seg_ids), len(h_full_interp), len(h_diff)) + + + cycles_this_rgt+=[cycle] + except KeyError as e: + print(f'file {filename} encountered error {e}') + error_count += 1 + + print('Cycles available: ' + ','.join(cycles_this_rgt)) + return x_atc, lats, lons, h_li_raw, h_li_raw_NoNans, h_li, h_li_diff, \ + times, min_seg_ids, segment_ids, cycles_this_rgt, x_ps, y_ps + + + + +def read_HDF5_ATL03(FILENAME, ATTRIBUTES=True, VERBOSE=False): + """ + ### Adapted from a notebook by Tyler Sutterly 6/14/2910 ### + + #-- PURPOSE: read ICESat-2 ATL03 HDF5 data files + + """ + #-- Open the HDF5 file for reading + fileID = h5py.File(os.path.expanduser(FILENAME), 'r') + + #-- Output HDF5 file information + if VERBOSE: + print(fileID.filename) + print(list(fileID.keys())) + + #-- allocate python dictionaries for ICESat-2 ATL03 variables and attributes + IS2_atl03_mds = {} + IS2_atl03_attrs = {} if ATTRIBUTES else None + + #-- read each input beam within the file + IS2_atl03_beams = [k for k in fileID.keys() if bool(re.match('gt\d[lr]',k))] + for gtx in IS2_atl03_beams: + IS2_atl03_mds[gtx] = {} + IS2_atl03_mds[gtx]['heights'] = {} + IS2_atl03_mds[gtx]['geolocation'] = {} + # IS2_atl03_mds[gtx]['bckgrd_atlas'] = {} + IS2_atl03_mds[gtx]['geophys_corr'] = {} + #-- get each HDF5 variable + #-- ICESat-2 Measurement Group + for key,val in fileID[gtx]['heights'].items(): + IS2_atl03_mds[gtx]['heights'][key] = val[:] + #-- ICESat-2 Geolocation Group + for key,val in fileID[gtx]['geolocation'].items(): + IS2_atl03_mds[gtx]['geolocation'][key] = val[:] + # #-- ICESat-2 Background Photon Rate Group + # for key,val in fileID[gtx]['bckgrd_atlas'].items(): + # IS2_atl03_mds[gtx]['bckgrd_atlas'][key] = val[:] + #-- ICESat-2 Geophysical Corrections Group: Values for tides (ocean, + #-- solid earth, pole, load, and equilibrium), inverted barometer (IB) + #-- effects, and range corrections for tropospheric delays + for key,val in fileID[gtx]['geophys_corr'].items(): + IS2_atl03_mds[gtx]['geophys_corr'][key] = val[:] + + #-- Getting attributes of included variables + if ATTRIBUTES: + #-- Getting attributes of IS2_atl03_mds beam variables + IS2_atl03_attrs[gtx] = {} + IS2_atl03_attrs[gtx]['heights'] = {} + IS2_atl03_attrs[gtx]['geolocation'] = {} + # IS2_atl03_attrs[gtx]['bckgrd_atlas'] = {} + IS2_atl03_attrs[gtx]['geophys_corr'] = {} + IS2_atl03_attrs[gtx]['Atlas_impulse_response'] = {} + #-- Global Group Attributes + for att_name,att_val in fileID[gtx].attrs.items(): + IS2_atl03_attrs[gtx][att_name] = att_val + #-- ICESat-2 Measurement Group + for key,val in fileID[gtx]['heights'].items(): + IS2_atl03_attrs[gtx]['heights'][key] = {} + for att_name,att_val in val.attrs.items(): + IS2_atl03_attrs[gtx]['heights'][key][att_name]=att_val + #-- ICESat-2 Geolocation Group + for key,val in fileID[gtx]['geolocation'].items(): + IS2_atl03_attrs[gtx]['geolocation'][key] = {} + for att_name,att_val in val.attrs.items(): + IS2_atl03_attrs[gtx]['geolocation'][key][att_name]=att_val + # #-- ICESat-2 Background Photon Rate Group + # for key,val in fileID[gtx]['bckgrd_atlas'].items(): + # IS2_atl03_attrs[gtx]['bckgrd_atlas'][key] = {} + # for att_name,att_val in val.attrs.items(): + # IS2_atl03_attrs[gtx]['bckgrd_atlas'][key][att_name]=att_val + #-- ICESat-2 Geophysical Corrections Group + for key,val in fileID[gtx]['geophys_corr'].items(): + IS2_atl03_attrs[gtx]['geophys_corr'][key] = {} + for att_name,att_val in val.attrs.items(): + IS2_atl03_attrs[gtx]['geophys_corr'][key][att_name]=att_val + + #-- ICESat-2 spacecraft orientation at time + IS2_atl03_mds['orbit_info'] = {} + IS2_atl03_attrs['orbit_info'] = {} if ATTRIBUTES else None + for key,val in fileID['orbit_info'].items(): + IS2_atl03_mds['orbit_info'][key] = val[:] + #-- Getting attributes of group and included variables + if ATTRIBUTES: + #-- Global Group Attributes + for att_name,att_val in fileID['orbit_info'].attrs.items(): + IS2_atl03_attrs['orbit_info'][att_name] = att_val + #-- Variable Attributes + IS2_atl03_attrs['orbit_info'][key] = {} + for att_name,att_val in val.attrs.items(): + IS2_atl03_attrs['orbit_info'][key][att_name] = att_val + + #-- number of GPS seconds between the GPS epoch (1980-01-06T00:00:00Z UTC) + #-- and ATLAS Standard Data Product (SDP) epoch (2018-01-01:T00:00:00Z UTC) + #-- Add this value to delta time parameters to compute full gps_seconds + #-- could alternatively use the Julian day of the ATLAS SDP epoch: 2458119.5 + #-- and add leap seconds since 2018-01-01:T00:00:00Z UTC (ATLAS SDP epoch) + IS2_atl03_mds['ancillary_data'] = {} + IS2_atl03_attrs['ancillary_data'] = {} if ATTRIBUTES else None + for key in ['atlas_sdp_gps_epoch']: + #-- get each HDF5 variable + IS2_atl03_mds['ancillary_data'][key] = fileID['ancillary_data'][key][:] + #-- Getting attributes of group and included variables + if ATTRIBUTES: + #-- Variable Attributes + IS2_atl03_attrs['ancillary_data'][key] = {} + for att_name,att_val in fileID['ancillary_data'][key].attrs.items(): + IS2_atl03_attrs['ancillary_data'][key][att_name] = att_val + + #-- get ATLAS impulse response variables for the transmitter echo path (TEP) + tep1,tep2 = ('atlas_impulse_response','tep_histogram') + IS2_atl03_mds[tep1] = {} + IS2_atl03_attrs[tep1] = {} if ATTRIBUTES else None + for pce in ['pce1_spot1','pce2_spot3']: + IS2_atl03_mds[tep1][pce] = {tep2:{}} + IS2_atl03_attrs[tep1][pce] = {tep2:{}} if ATTRIBUTES else None + #-- for each TEP variable + for key,val in fileID[tep1][pce][tep2].items(): + IS2_atl03_mds[tep1][pce][tep2][key] = val[:] + #-- Getting attributes of included variables + if ATTRIBUTES: + #-- Global Group Attributes + for att_name,att_val in fileID[tep1][pce][tep2].attrs.items(): + IS2_atl03_attrs[tep1][pce][tep2][att_name] = att_val + #-- Variable Attributes + IS2_atl03_attrs[tep1][pce][tep2][key] = {} + for att_name,att_val in val.attrs.items(): + IS2_atl03_attrs[tep1][pce][tep2][key][att_name] = att_val + + #-- Global File Attributes + if ATTRIBUTES: + for att_name,att_val in fileID.attrs.items(): + IS2_atl03_attrs[att_name] = att_val + + #-- Closing the HDF5 file + fileID.close() + #-- Return the datasets and variables + return (IS2_atl03_mds,IS2_atl03_attrs,IS2_atl03_beams) + + + +def get_ATL03_x_atc(IS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams): + """ + # Adapted from a notebook by Tyler Sutterly 6/14/2910 + """ + # calculate the along-track and across-track coordinates for ATL03 photons + + Segment_ID = {} + Segment_Index_begin = {} + Segment_PE_count = {} + Segment_Distance = {} + Segment_Length = {} + + #-- background photon rate + background_rate = {} + + #-- for each input beam within the file + for gtx in sorted(IS2_atl03_beams): + #-- data and attributes for beam gtx + val = IS2_atl03_mds[gtx] + val['heights']['x_atc']=np.zeros_like(val['heights']['h_ph'])+np.NaN + val['heights']['y_atc']=np.zeros_like(val['heights']['h_ph'])+np.NaN + attrs = IS2_atl03_attrs[gtx] + #-- ATL03 Segment ID + Segment_ID[gtx] = val['geolocation']['segment_id'] + n_seg = len(Segment_ID[gtx]) + #-- first photon in the segment (convert to 0-based indexing) + Segment_Index_begin[gtx] = val['geolocation']['ph_index_beg'] - 1 + #-- number of photon events in the segment + Segment_PE_count[gtx] = val['geolocation']['segment_ph_cnt'] + #-- along-track distance for each ATL03 segment + Segment_Distance[gtx] = val['geolocation']['segment_dist_x'] + #-- along-track length for each ATL03 segment + Segment_Length[gtx] = val['geolocation']['segment_length'] + #-- Transmit time of the reference photon + delta_time = val['geolocation']['delta_time'] + + #-- iterate over ATL03 segments to calculate 40m means + #-- in ATL03 1-based indexing: invalid == 0 + #-- here in 0-based indexing: invalid == -1 + segment_indices, = np.nonzero((Segment_Index_begin[gtx][:-1] >= 0) & + (Segment_Index_begin[gtx][1:] >= 0)) + for j in segment_indices: + #-- index for segment j + idx = Segment_Index_begin[gtx][j] + #-- number of photons in segment (use 2 ATL03 segments) + c1 = np.copy(Segment_PE_count[gtx][j]) + c2 = np.copy(Segment_PE_count[gtx][j+1]) + cnt = c1 + c2 + #-- time of each Photon event (PE) + segment_delta_times = val['heights']['delta_time'][idx:idx+cnt] + #-- Photon event lat/lon and elevation (WGS84) + segment_heights = val['heights']['h_ph'][idx:idx+cnt] + segment_lats = val['heights']['lat_ph'][idx:idx+cnt] + segment_lons = val['heights']['lon_ph'][idx:idx+cnt] + #-- Along-track and Across-track distances + distance_along_X = np.copy(val['heights']['dist_ph_along'][idx:idx+cnt]) + distance_along_X[:c1] += Segment_Distance[gtx][j] + distance_along_X[c1:] += Segment_Distance[gtx][j+1] + distance_along_Y = np.copy(val['heights']['dist_ph_across'][idx:idx+cnt]) + val['heights']['x_atc'][idx:idx+cnt]=distance_along_X + val['heights']['y_atc'][idx:idx+cnt]=distance_along_Y diff --git a/README.md b/README.md index eb09afd..237b32d 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,9 @@ -# Surface Velocity - -Scripts for estimating ice velocity from ICESat-2 data. +# ICESat-2 Surface Velocity Surface ice velocity from repeat passes using the across slope between beams and the slope between points on the same track. Cross overs could also be used. Which product?, maybe ATL06 or ATL03. It should be interesting to compare different areas (e.g. Antarctica, Greenland, Patagonia). Surface ice velocity from laser altimetry has been done with ICESat 1 over the Ross Ice Shelf. The smaller footprint could improve the accuracy and the precise repeat passes could account for seasonality over certain regions. -## Files - -* `.gitignore` -
Globally ignored files by `git` for the project. -* `environment.yml` -
`conda` environment description needed to run this project. -* `README.md` -
Description of the project. [Sample](https://geohackweek.github.io/wiki/github_project_management.html#project-guidelines) - -## Folders - -### `contributors` -Each team member has it's own folder under contributors, where he/she can -work on their contribution. Having a dedicated folder for one-self helps to -prevent conflicts when merging with master. - -### `notebooks` -Notebooks that are considered delivered results for the project should go in -here. +This project was started at the 2020 ICESat-2 hackweek. The idea is that repeat altimetry can be used to infer ice velocity by correlating the surface slopes between acquisitions. The idea is based on similar work with the ICESat-1 GLAS altimeter (Marsh and Rack, 2010). -### `scripts` -Helper utilities that are shared with the team +References +- Marsh, O.J., Rack, W., 2010. A method of calculating ice-shelf surface velocity using ICESat altimetry. J. Geophys. Res. Earth Surf. 115, 25–30. https://doi.org/10.1029/2009JF001311 diff --git a/contributors/ben_hills/Corr_Coeff_Experimentation.ipynb b/contributors/ben_hills/Corr_Coeff_Experimentation.ipynb deleted file mode 100644 index 7515db8..0000000 --- a/contributors/ben_hills/Corr_Coeff_Experimentation.ipynb +++ /dev/null @@ -1,1017 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 1, -======= - "execution_count": 22, ->>>>>>> 335f0dd2e487b3a7cefc2a7ef89239fdd1b6c674 - "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('
');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '
');\n", - " var titletext = $(\n", - " '
');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('
');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('
');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the landice elevation along the pass.\n", + "plt.figure(figsize=(8,4))\n", + "\n", + "plt.plot(D1['x_atc']/1000.,D1['h_li'],c='indianred')\n", + "plt.plot(D2['x_atc']/1000.,D2['h_li'],c='steelblue')\n", + "plt.ylabel('Elevation (m)')\n", + "plt.xlabel('Along-Track Distance (km)')\n", + "\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preprocessing - Smooth and Differentiate" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Import funcitons for the velocity calculation and a time differencing step\n", + "from IS2_velocity.correlation_processing import velocity, time_diff\n", + "\n", + "# Calculate time offset\n", + "dt = time_diff(D1,D2)\n", + "# Where to calculate the velocities\n", + "vel_xs = np.linspace(np.min(x1)+1000,np.max(x1)-1000,1000)\n", + "# Do the velocity calculation\n", + "velocities,correlations = velocity(x1,dh1,dh2,dt,vel_xs,search_width=1000,segment_length=5000)\n", + "\n", + "# ------------------------------------------\n", + "\n", + "from matplotlib.gridspec import GridSpec\n", + "\n", + "plt.figure(figsize=(8,4))\n", + "gs = GridSpec(2,2)\n", + "\n", + "# Plot the elevation profiles again\n", + "plt.subplot(gs[0,0])\n", + "plt.tick_params(bottom=False,labelbottom=False)\n", + "plt.plot(x1/1000.-29000,h1,'.',c='indianred')\n", + "plt.plot(x2/1000.-29000,h2,'.',c='steelblue',ms=3)\n", + "plt.ylabel('Elevation (m)')\n", + "plt.title('ATL06',fontweight='bold')\n", + "plt.xlim(80,580)\n", + "\n", + "# Plot the slopes again\n", + "plt.subplot(gs[1,0])\n", + "plt.tick_params(bottom=False,labelbottom=False)\n", + "plt.plot(x1/1000.-29000,dh1,'.',c='indianred')\n", + "plt.plot(x2/1000.-29000,dh2,'.',c='steelblue',ms=3)\n", + "plt.ylim(-.05,.05)\n", + "plt.ylabel('Surface Slope (m/m)')\n", + "plt.xlim(80,580)\n", + "\n", + "# Plot the calculated velocities along track\n", + "ax5 = plt.subplot(gs[:,1])\n", + "plt.plot(vel_xs/1000.-29000,velocities,'.',c='k',label='ATL06')\n", + "plt.ylabel('Velocity (m/yr)')\n", + "plt.xlabel('Along-Track Distance (km)')\n", + "plt.xlim(80,580)\n", + "plt.ylim(-500,1500)\n", + "\n", + "plt.tight_layout()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/contributors/david_polashenski/Test Notebook.ipynb b/notebooks/Uncertainty_Analysis_Tutorial.ipynb similarity index 77% rename from contributors/david_polashenski/Test Notebook.ipynb rename to notebooks/Uncertainty_Analysis_Tutorial.ipynb index 16a0205..3034949 100644 --- a/contributors/david_polashenski/Test Notebook.ipynb +++ b/notebooks/Uncertainty_Analysis_Tutorial.ipynb @@ -10,9 +10,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python [conda env:notebook] *", + "display_name": "Python 3", "language": "python", - "name": "conda-env-notebook-py" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -24,9 +24,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.7.3" } }, "nbformat": 4, - "nbformat_minor": 4 + "nbformat_minor": 2 } diff --git a/notebooks/fittopo.py b/notebooks/fittopo.py deleted file mode 100644 index 97f53d6..0000000 --- a/notebooks/fittopo.py +++ /dev/null @@ -1,699 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" - -Surface topography detrending of satellite and airborne altimetry - -Program computes surface elevation residuals, containing only the temporal -component, by removing the static topography. - -Depending on the number of observations in each solution one of three models -are used to solve for the topography (1) Bi-quadratic, (2) Bilinear and (3) -the average. - -User specifies a grid resolution, search radius and the number of -relocations that should be used to detrend the observations. Inside each -search area the model is centered (relocated) to the centroid of the data, -given the provided number of allowed relocations. - -Given the possible overlap between solutions the solution with the smallest -RMS is used and data of poorer quality overwritten. - -Notes: - For mission in reference track configuration a dx = dy = 250 m and a - search radius of 350 m is appropriate, and less than n=3 relocations is - usually needed to center the data (depends on search radius) - - This program can be run in parallel to processes several files at the same - time (tiles or missions etc). - - Good threshold ("-m" option) for switching from biquadratic to bilinear - model is around 10-15 points. - -Example: - - python fittopo.py /path/to/files/*.h5 -v lon lat t_year h_cor \ - -d 1 1 -r 1 -q 3 -i 5 -z 5 -m 15 -k 1 -t 2012 -j 3031 -n 2 - -Credits: - captoolkit - JPL Cryosphere Altimetry Processing Toolkit - - Johan Nilsson (johan.nilsson@jpl.nasa.gov) - Fernando Paolo (paolofer@jpl.nasa.gov) - Alex Gardner (alex.s.gardner@jpl.nasa.gov) - - Jet Propulsion Laboratory, California Institute of Technology - -""" - -import warnings -warnings.filterwarnings("ignore") -import os -import h5py -import pyproj -import argparse -import numpy as np -import statsmodels.api as sm -from datetime import datetime -from scipy.spatial import cKDTree -from statsmodels.robust.scale import mad - -# Defaul grid spacing in x and y (km) -DXY = [1, 1] - -# Defaul min and max search radius (km) -RADIUS = [1] - -# Default min obs within search radius to compute solution -MINOBS = 10 - -# Default number of iterations for solution -NITER = 5 - -# Default ref time for solution: 'year' | 'fixed'=full mean t | 'variable'=cap mean t -TREF = 'fixed' - -# Default projection EPSG for solution (AnIS=3031, GrIS=3413) -PROJ = 3031 - -# Default data columns (lon,lat,time,height,error,id) -COLS = ['lon', 'lat', 't_sec', 'h_cor', 'h_rms'] - -# Default expression to transform time variable -EXPR = None - -# Default order of the surface fit model -ORDER = 2 - -# Default numbe rof obs. to change to mean solution -MLIM = 10 - -# Default njobs for parallel processing of *tiles* -NJOBS = 1 - -# Maximum slope allowed from the solution, replaced by SLOPE -SLOPE = 1.0 - -# Output description of solution -description = ('Compute surface elevation residuals ' - 'from satellite/airborne altimetry.') - -# Define command-line arguments -parser = argparse.ArgumentParser(description=description) - -parser.add_argument( - 'files', metavar='file', type=str, nargs='+', - help='file(s) to process (HDF5)') - -parser.add_argument( - '-d', metavar=('dx','dy'), dest='dxy', type=float, nargs=2, - help=('spatial resolution for grid-solution (deg or km)'), - default=DXY,) - -parser.add_argument( - '-r', metavar=('radius'), dest='radius', type=float, nargs=1, - help=('min and max search radius (km)'), - default=RADIUS,) - -parser.add_argument( - '-q', metavar=('n_reloc'), dest='nreloc', type=int, nargs=1, - help=('number of relocations for search radius'), - default=[0],) - -parser.add_argument( - '-i', metavar='n_iter', dest='niter', type=int, nargs=1, - help=('maximum number of iterations for model solution'), - default=[NITER],) - -parser.add_argument( - '-z', metavar='min_obs', dest='minobs', type=int, nargs=1, - help=('minimum obs to compute solution'), - default=[MINOBS],) - -parser.add_argument( - '-m', metavar=('mod_lim'), dest='mlim', type=int, nargs=1, - help=('minimum obs for higher order models'), - default=[MLIM],) - -parser.add_argument( - '-k', metavar=('mod_order'), dest='order', type=int, nargs=1, - help=('order of the surface fit model: 1=lin or 2=quad'), - default=[ORDER],) - -parser.add_argument( - '-t', metavar=('ref_time'), dest='tref', type=str, nargs=1, - help=('time to reference the solution to: year|fixed|variable'), - default=[TREF],) - -parser.add_argument( - '-j', metavar=('epsg_num'), dest='proj', type=str, nargs=1, - help=('projection: EPSG number (AnIS=3031, GrIS=3413)'), - default=[str(PROJ)],) - -parser.add_argument( - '-v', metavar=('x','y','t','h'), dest='vnames', type=str, nargs=4, - help=('name of lon/lat/t/h in the HDF5'), - default=COLS,) - -parser.add_argument( - '-x', metavar=('expr'), dest='expr', type=str, nargs=1, - help="expression to apply to time (e.g. 't + 2000'), optional", - default=[EXPR],) - -parser.add_argument( - '-n', metavar=('n_jobs'), dest='njobs', type=int, nargs=1, - help="for parallel processing of multiple tiles, optional", - default=[NJOBS],) - -parser.add_argument( - '-s', metavar=('slope_lim'), dest='slplim', type=float, nargs=1, - help="slope limit for x/y direction (deg)", - default=[SLOPE],) - -parser.add_argument( - '-p', dest='pshow', action='store_true', - help=('print diagnostic information to terminal'), - default=False) - -args = parser.parse_args() - -# Pass arguments -files = args.files # input file(s) -dx = args.dxy[0] * 1e3 # grid spacing in x (km -> m) -dy = args.dxy[1] * 1e3 # grid spacing in y (km -> m) -dmax = args.radius[0] * 1e3 # min search radius (km -> m) -nreloc = args.nreloc[0] # number of relocations -nlim = args.minobs[0] # min obs for solution -mlim = args.mlim[0] # minimum value for parametric verusu men model -niter = args.niter[0] # number of iterations for solution -tref_ = args.tref[0] # ref time for solution (d.yr) -proj = args.proj[0] # EPSG number (GrIS=3413, AnIS=3031) -icol = args.vnames[:] # data input cols (x,y,t,h,err,id) [4] -expr = args.expr[0] # expression to transform time -njobs = args.njobs[0] # for parallel processing of tiles -order = args.order[0] # max order of the surface fit model -slplim = args.slplim[0] # max allowed surface slope in deg. -diag = args.pshow # print diagnostics to terminal - -print('parameters:') -for p in list(vars(args).items()): - print(p) - -def make_grid(xmin, xmax, ymin, ymax, dx, dy): - """Construct output grid-coordinates.""" - - # Setup grid dimensions - Nn = int((np.abs(ymax - ymin)) / dy) + 1 - Ne = int((np.abs(xmax - xmin)) / dx) + 1 - - # Initiate x/y vectors for grid - x_i = np.linspace(xmin, xmax, num=Ne) - y_i = np.linspace(ymin, ymax, num=Nn) - - return np.meshgrid(x_i, y_i) - - -def transform_coord(proj1, proj2, x, y): - """Transform coordinates from proj1 to proj2 (EPSG num).""" - - # Set full EPSG projection strings - proj1 = pyproj.Proj("+init=EPSG:"+proj1) - proj2 = pyproj.Proj("+init=EPSG:"+proj2) - - # Convert coordinates - return pyproj.transform(proj1, proj2, x, y) - - -def mad_std(x, axis=None): - """ Robust standard deviation (using MAD). """ - return 1.4826 * np.nanmedian(np.abs(x - np.nanmedian(x, axis)), axis) - - -def get_radius_idx(x, y, x0, y0, r, Tree, n_reloc=0, - min_months=24, max_reloc=3, time=None, height=None): - """ Get indices of all data points inside radius. """ - - # Query the Tree from the center of cell - idx = Tree.query_ball_point((x0, y0), r) - - #print 'query #: 1 ( first search )' - - if len(idx) < 2: - return idx - - if time is not None: - n_reloc = max_reloc - - if n_reloc < 1: - return idx - - # Relocate center of search radius and query again - for k in range(n_reloc): - - # Compute new search location => relocate initial center - x0_new, y0_new = np.median(x[idx]), np.median(y[idx]) - - # Compute relocation distance - reloc_dist = np.hypot(x0_new-x0, y0_new-y0) - - # Do not allow total relocation to be larger than the search radius - if reloc_dist > r: - break - - #print 'query #:', k+2, '( reloc #:', k+1, ')' - #print 'relocation dist:', reloc_dist - - idx = Tree.query_ball_point((x0_new, y0_new), r) - - # If max number of relocations reached, exit - if n_reloc == k+1: - break - - # If time provided, keep relocating until time-coverage is sufficient - if time is not None: - - t_b, x_b = binning(time[idx], height[idx], dx=1/12., window=1/12.)[:2] - - print(('months #:', np.sum(~np.isnan(x_b)))) - - # If sufficient coverage, exit - if np.sum(~np.isnan(x_b)) >= min_months: - break - - return idx - - -def rlsq(x, y, n=1): - """ Fit a robust polynomial of n:th deg.""" - - # Test solution - if len(x[~np.isnan(y)]) <= (n + 1): - - if n == 0: - p = np.nan - s = np.nan - else: - p = np.zeros((1, n)) * np.nan - s = np.nan - - return p, s - - # Empty array - A = np.empty((0, len(x))) - - # Create counter - i = 0 - - # Determine if we need centering - if n > 1: - # Center x-axis - x -= np.nanmean(x) - - # Special case - if n == 0: - - # Mean offset - A = np.ones(len(x)) - - else: - - # Make design matrix - while i <= n: - # Stack coefficients - A = np.vstack((A, x ** i)) - - # Update counter - i += 1 - - # Test to see if we can solve the system - try: - - # Robust least squares fit - fit = sm.RLM(y, A.T, missing='drop').fit(maxiter=5, tol=0.001) - - # polynomial coefficients - p = fit.params - - # RMS of the residuals - s = mad_std(fit.resid) - - except: - - # Set output to NaN - if n == 0: - p = np.nan - s = np.nan - else: - p = np.zeros((1, n)) * np.nan - s = np.nan - - return p[::-1], s - - -# Main function for computing parameters -def main(ifile, n=''): - - # Check for empty file - if os.stat(ifile).st_size == 0: - print('input file is empty!') - return - - # Start timing of script - startTime = datetime.now() - - print('loading data ...') - - # Determine input file type - if not ifile.endswith(('.h5', '.H5', '.hdf', '.hdf5')): - print("Input file must be in hdf5-format") - return - - # Input variables - xvar, yvar, tvar, zvar = icol - - # Load all 1d variables needed - with h5py.File(ifile, 'r') as fi: - - lon = fi[xvar][:] - lat = fi[yvar][:] - time = fi[tvar][:] - height = fi[zvar][:] - - # EPSG number for lon/lat proj - projGeo = '4326' - - # EPSG number for grid proj - projGrd = proj - - print('converting lon/lat to x/y ...') - - # Convert into stereographic coordinates - (x, y) = transform_coord(projGeo, projGrd, lon, lat) - - # Get bbox from data - (xmin, xmax, ymin, ymax) = x.min(), x.max(), y.min(), y.max() - - # Apply transformation to time - if expr: time = eval(expr.replace('t', 'time')) - - # Overall (fixed) mean time - t_mean = np.round(np.nanmean(time), 2) - - # Grid solution - defined by nodes - (Xi, Yi) = make_grid(xmin, xmax, ymin, ymax, dx, dy) - - # Flatten prediction grid - xi = Xi.ravel() - yi = Yi.ravel() - - # Zip data to vector - coord = list(zip(x.ravel(), y.ravel())) - - # Construct cKDTree - print('building the k-d tree ...') - Tree = cKDTree(coord) - - # Create output containers - dh_topo = np.full(height.shape, np.nan) - de_topo = np.full(height.shape, 999999.) - mi_topo = np.full(height.shape, np.nan) - hm_topo = np.full(height.shape, np.nan) - sx_topo = np.full(height.shape, np.nan) - sy_topo = np.full(height.shape, np.nan) - tr_topo = np.full(height.shape, np.nan) - - # Set slope limit - slp_lim = np.tan(np.deg2rad(slplim)) - - # Enter prediction loop - print('predicting values ...') - for i in range(len(xi)): - - x0, y0 = xi[i], yi[i] - - # Get indexes of data within search radius or cell bbox - idx = get_radius_idx( - x, y, x0, y0, dmax, Tree, n_reloc=nreloc, - min_months=18, max_reloc=3, time=None, height=None) - - # Length of data in search cap - nobs = len(x[idx]) - - # Check data density - if (nobs < nlim): continue - - # Parameters for model-solution - xcap = x[idx] - ycap = y[idx] - tcap = time[idx] - hcap = height[idx] - - # Copy original height vector - h_org = hcap.copy() - - # Centroid node - xc = np.median(xcap) - yc = np.median(ycap) - - # If reference time not given, use fixed or variable mean - if tref_ == 'fixed': - tref = t_mean - elif tref_ == 'variable': - tref = np.nanmean(tcap) - else: - tref = np.float(tref_) - - # Design matrix elements - c0 = np.ones(len(xcap)) - c1 = xcap - xc - c2 = ycap - yc - c3 = c1 * c2 - c4 = c1 * c1 - c5 = c2 * c2 - c6 = tcap - tref - - # Length before editing - nb = len(hcap) - - # Determine model order - if order == 2 and nb >= mlim * 2: - - # Biquadratic surface and linear trend - Acap = np.vstack((c0, c1, c2, c3, c4, c5, c6)).T - - # Model identifier - mi = 1 - - # Set model order - elif nb >= mlim: - - # Bilinear surface and linear trend - Acap = np.vstack((c0, c1, c2, c6)).T - - # Model identifier - mi = 2 - - else: - - # Model identifier - mi = 3 - - # Modelled topography - if mi == 1: - - # Construct model object - linear_model = sm.RLM(hcap, Acap, M=sm.robust.norms.HuberT(), missing='drop') - - # Fit the model to the data, - linear_model_fit = linear_model.fit(maxiter=niter, tol=0.001) - - # Coefficients - Cm = linear_model_fit.params - - # Biquadratic surface - h_model = np.dot(np.vstack((c0, c1, c2, c3, c4, c5)).T, Cm[[0, 1, 2, 3, 4, 5]]) - - # Compute along and across track slope - sx = np.sign(Cm[1]) * slp_lim if np.abs(Cm[1]) > slp_lim else Cm[1] - sy = np.sign(Cm[2]) * slp_lim if np.abs(Cm[2]) > slp_lim else Cm[2] - - # Mean height - h_avg = Cm[0] - - elif mi == 2: - - # Construct model object - linear_model = sm.RLM(hcap, Acap, M=sm.robust.norms.HuberT(), missing='drop') - - # Fit the model to the data, - linear_model_fit = linear_model.fit(maxiter=niter, tol=0.001) - - # Coefficients - Cm = linear_model_fit.params - - # Bilinear surface - h_model = np.dot(np.vstack((c0, c1, c2)).T, Cm[[0, 1, 2]]) - - # Compute along and across track slope - sx = np.sign(Cm[1]) * slp_lim if np.abs(Cm[1]) > slp_lim else Cm[1] - sy = np.sign(Cm[2]) * slp_lim if np.abs(Cm[2]) > slp_lim else Cm[2] - - # Mean height - h_avg = Cm[0] - - else: - - # Mean surface from median - h_avg = np.median(hcap) - - # Compute distance estimates from centroid - s_dx = (xcap - xc) + 1e-3 - s_dy = (ycap - yc) + 1e-3 - - # Center surface height - dh_i = h_org - h_avg - - # Compute along-track slope - px, rms_x = rlsq(s_dx, dh_i, 1) - py, rms_x = rlsq(s_dy, dh_i, 1) - - # Set along-track slope - s_x = 0 if np.isnan(px[0]) else px[0] - - # Set across-track slope to zero - s_y = 0 if np.isnan(py[0]) else py[0] - - # Compute along and across track slope - sx = np.sign(s_x) * slp_lim if np.abs(s_x) > slp_lim else s_x - sy = np.sign(s_y) * slp_lim if np.abs(s_y) > slp_lim else s_y - - # Compute the surface height correction - h_model = h_avg + (sx * s_dx) + (sy * s_dy) - - # Compute full slope - slope = np.arctan(np.sqrt(sx**2 + sy**2)) * (180 / np.pi) - - # Compute residual - dh = h_org - h_model - - # Number of observations - na = len(dh) - - # RMSE of the residuals - RMSE = mad_std(dh) - - # Overwrite errors - iup = RMSE < de_topo[idx] - - # Create temporary variables - dh_cap = dh_topo[idx].copy() - de_cap = de_topo[idx].copy() - hm_cap = hm_topo[idx].copy() - mi_cap = mi_topo[idx].copy() - tr_cap = tr_topo[idx].copy() - - # Update variables - dh_cap[iup] = dh[iup] - de_cap[iup] = RMSE - hm_cap[iup] = h_avg - mi_cap[iup] = mi - tr_cap[iup] = tref - - # Update with current solution - dh_topo[idx] = dh_cap - de_topo[idx] = de_cap - hm_topo[idx] = hm_cap - mi_topo[idx] = mi_cap - tr_topo[idx] = tr_cap - sx_topo[idx] = np.arctan(sx) * (180 / np.pi) - sy_topo[idx] = np.arctan(sy) * (180 / np.pi) - - # Print progress (every N iterations) - if (i % 100) == 0 and diag is True: - - # Print message every i:th solution - print(('%s %i %s %2i %s %i %s %03d %s %.3f %s %.3f' % \ - ('#',i,'/',len(xi),'Model:',mi,'Nobs:',nb,'Slope:',\ - np.around(slope,3),'Residual:',np.around(mad_std(dh),3)))) - - # Print percentage of not filled - print(('Total NaNs (percent): %.2f' % \ - (100 * float(len(dh_topo[np.isnan(dh_topo)])) / float(len(dh_topo))))) - - # Print percentage of each model - one = np.sum(mi_topo == 1) - two = np.sum(mi_topo == 2) - tre = np.sum(mi_topo == 3) - N = float(len(mi_topo)) - - print(('Model types (percent): 1 = %.2f, 2 = %.2f, 3 = %.2f' % \ - (100 * one/N, 100 * two/N, 100 * tre/N))) - - # Append new columns to original file - with h5py.File(ifile, 'a') as fi: - - # Check if we have variables in file - try: - - # Save variables - fi['h_res'] = dh_topo - fi['h_mod'] = hm_topo - fi['e_res'] = de_topo - fi['m_deg'] = mi_topo - fi['t_ref'] = tr_topo - fi['slp_x'] = sx_topo - fi['slp_y'] = sy_topo - - except: - - # Update variables - fi['h_res'][:] = dh_topo - fi['h_mod'][:] = hm_topo - fi['e_res'][:] = de_topo - fi['m_deg'][:] = mi_topo - fi['t_ref'][:] = tr_topo - fi['slp_x'][:] = sx_topo - fi['slp_y'][:] = sy_topo - - # Rename file - if ifile.find('TOPO') < 0: - os.rename(ifile, ifile.replace('.h5', '_TOPO.h5')) - - # Print some statistics - print(('*' * 75)) - print(('%s %s %.5f %s %.2f %s %.2f %s %.2f %s %.2f' % \ - ('Statistics', - 'Mean:', np.nanmedian(dh_topo), - 'Std.dev:', mad_std(dh_topo), - 'Min:', np.nanmin(dh_topo), - 'Max:', np.nanmax(dh_topo), - 'RMSE:', np.nanmedian(de_topo[dh_topo!=999999]),))) - print(('*' * 75)) - print('') - - # Print execution time of algorithm - print(('Execution time: '+ str(datetime.now()-startTime))) - -if njobs == 1: - print('running sequential code ...') - [main(f, n) for n,f in enumerate(files)] - -else: - print(('running parallel code (%d jobs) ...' % njobs)) - from joblib import Parallel, delayed - Parallel(n_jobs=njobs, verbose=5)(delayed(main)(f, n) for n, f in enumerate(files)) - - ''' - from dask import compute, delayed - from distributed import Client, LocalCluster - - cluster = LocalCluster(n_workers=8, threads_per_worker=None, - scheduler_port=8002, diagnostics_port=8003) - client = Client(cluster) # connect to cluster - print client - - #values = [delayed(main)(f) for f in files] - #results = compute(*values, get=client.get) - values = [client.submit(main, f) for f in files] - results = client.gather(values) - ''' diff --git a/notebooks/interpgaus3d.py b/notebooks/interpgaus3d.py deleted file mode 100644 index f8936ff..0000000 --- a/notebooks/interpgaus3d.py +++ /dev/null @@ -1,375 +0,0 @@ -#!/usr/bin/env python -""" -Spatio-temporal interpolation of scattered data using an gaussian and -exponential kernel. - -The program uses a search radius for interpolation and selects data from four -quadrants around the prediction point, with correlation lengths provided by -the user. - -Provides the possibility of pre-cleaning of the data using a spatial n-sigma -filter before interpolation. - -Takes as input a h5df file with needed data in geographical coordinates and -a-priori error if needed. The user provides the wanted projection using -the EPSG projection format. - -Output consists of an hdf5 file containing the predictions, rmse and the -number of points used in the prediction, the epsg number for the -projection and the time vector. - -Notes: - If the error/std.dev is not provided as input the variable name should be - set a dummy name. Then the error is set as an array of ones. - If the error/std.dev is provided as input the prediction rmse is the RSS of - the a-priori error and the variability of the data used for the prediction - (if no a-priori error provided the array is set to zero before RSS). As - most altimetry datasets are of monthly resolution the program expects - that the temporal resolution/correlation is given as a monthly integer - which is divided by 12 internally: monthly = 1/12 -> input as 1. - -Example: - python interpgaus.py ifile.h5 ofile.h5 -d 10 10 -r 50 -a 25 -p 3031\ - -c 50 10 -v lon lat dh time dummy -s 10 - python interpgaus.py ifile.h5 ofile.h5 -d 10 10 -r 50 -a 25 -p 3031\ - -c 50 10 -v lon lat dh time rmse -s 10 - -Credits: - captoolkit - JPL Cryosphere Altimetry Processing Toolkit - - Johan Nilsson (johan.nilsson@jpl.nasa.gov) - Fernando Paolo (paolofer@jpl.nasa.gov) - Alex Gardner (alex.s.gardner@jpl.nasa.gov) - - Jet Propulsion Laboratory, California Institute of Technology -""" -import warnings -warnings.filterwarnings("ignore") -import h5py -import pyproj -import numpy as np -import argparse -from scipy import stats -from scipy.spatial import cKDTree -from numba import jit - -def transform_coord(proj1, proj2, x, y): - """Transform coordinates from proj1 to proj2 (EPSG num).""" - - # Set full EPSG projection strings - proj1 = pyproj.Proj("+init=EPSG:"+proj1) - proj2 = pyproj.Proj("+init=EPSG:"+proj2) - - # Convert coordinates - return pyproj.transform(proj1, proj2, x, y) - - -def make_grid(xmin, xmax, ymin, ymax, dx, dy): - """ Construct output grid-coordinates. """ - Nn = int((np.abs(ymax - ymin)) / dy) + 1 # ny - Ne = int((np.abs(xmax - xmin)) / dx) + 1 # nx - xi = np.linspace(xmin, xmax, num=Ne) - yi = np.linspace(ymin, ymax, num=Nn) - return np.meshgrid(xi, yi) - - -def spatial_filter(x, y, z, dx, dy, sigma=5.0, vmax=100): - """ Cleaning of spatial data """ - - # Grid dimensions - Nn = int((np.abs(y.max() - y.min())) / dy) + 1 - Ne = int((np.abs(x.max() - x.min())) / dx) + 1 - - # Bin data - f_bin = stats.binned_statistic_2d(x, y, z, bins=(Ne,Nn)) - - # Get bin numbers for the data - index = f_bin.binnumber - - # Unique indexes - ind = np.unique(index) - - # Create output - zo = z.copy() - - # Number of unique index - for i in range(len(ind)): - - # index for each bin - idx, = np.where(index == ind[i]) - - # Get data - zb = z[idx] - - # Make sure we have enough - if len(zb[~np.isnan(zb)]) == 0: - continue - - # Set to median of values - dh = zb - np.nanmedian(zb) - - # Identify outliers - foo = np.abs(dh) > sigma*np.nanstd(dh) - - # Set to nan-value - zb[foo] = np.nan - - # Replace data - zo[idx] = zb - - # Return filtered array - return zo - -@jit(nopython=True) -def fwavg(w, z): - return np.nansum(w*z)/np.nansum(w) - -@jit(nopython=True) -def fwstd(w, z, zm): - return np.nansum(w*(z-zm)**2)/np.nansum(w) - -@jit(nopython=True) -def make_weights(dr, dt, ad, at): - ed = np.exp(-(dr ** 2)/(2 * ad ** 2)) - et = np.exp(-(dt ** 2)/(2 * at ** 2)) - return ed, et - -@jit(nopython=True) -def square_dist(x, y, xi, yi): - return np.sqrt((x - xi)**2 + (y - yi)**2) - -@jit(nopython=True) -def fast_sort(x): - return np.argsort(x) - -# Description of algorithm -des = 'Spatio-temporal interpolation of irregular data' - -# Define command-line arguments -parser = argparse.ArgumentParser(description=des) - -parser.add_argument( - 'ifile', metavar='ifile', type=str, nargs='+', - help='name of input file (h5-format)') - -parser.add_argument( - 'ofile', metavar='ofile', type=str, nargs='+', - help='name of ouput file (h5-format)') - -parser.add_argument( - '-b', metavar=('w','e','s','n'), dest='bbox', type=float, nargs=4, - help=('bounding box for geograph. region (deg or m), optional'), - default=[None],) - -parser.add_argument( - '-d', metavar=('dx','dy'), dest='dxy', type=float, nargs=2, - help=('spatial resolution for grid (deg or km)'), - default=[1, 1],) - -parser.add_argument( - '-t', metavar=('tmin','tmax','dt'), dest='time', type=float, nargs=3, - help=('temporal resolution for grid (months)'), - default=[-9999, 9999, 1],) - -parser.add_argument( - '-r', metavar='radius', dest='radius', type=float, nargs=1, - help=('search radius (km)'), - default=[None],) - -parser.add_argument( - '-a', metavar=('alpha_d','alpha_t'), dest='alpha', type=float, nargs=2, - help=('spatial and temporal corr. length (km and months)'), - default=[None,None],) - -parser.add_argument( - '-p', metavar=('epsg_num'), dest='proj', type=str, nargs=1, - help=('EPSG proj number (AnIS=3031, GrIS=3413)'), - default=['3031'],) - -parser.add_argument( - '-s', metavar=('n_sample'), dest='n_sample', type=int, nargs=1, - help=('sample every n:th point in dataset'), - default=[1],) - -parser.add_argument( - '-c', metavar=('dim','thres','max'), dest='filter', type=float, nargs=3, - help=('dim. of filter in km, sigma thres and max-value'), - default=[0,0,9999],) - -parser.add_argument( - '-v', metavar=('x','y','z','t','s'), dest='vnames', type=str, nargs=5, - help=('name of varibales in the HDF5-file'), - default=['lon','lat','h_cor','t_year','h_rms'],) - -# Parser argument to variable -args = parser.parse_args() - -# Read input from terminal -ifile = args.ifile[0] -ofile = args.ofile[0] -bbox = args.bbox -dx = args.dxy[0] * 1e3 -dy = args.dxy[1] * 1e3 -proj = args.proj[0] -dmax = args.radius[0] * 1e3 -alpha_d = args.alpha[0] * 1e3 -alpha_t = args.alpha[1] / 12. -vicol = args.vnames[:] -dxy = args.filter[0] * 1e3 -thres = args.filter[1] -vmax = args.filter[2] -tmin = args.time[0] -tmax = args.time[1] -tres = args.time[2]/12. -nsam = args.n_sample[0] - -# Print parameters to screen -print('parameters:') -for p in vars(args).items(): print(p) - -print("-> reading data ...") - -# Get variable names -xvar, yvar, zvar, tvar, svar = vicol - -# Load all 1d variables needed -with h5py.File(ifile, 'r') as fi: - - # Get variables and sub-sample if needed - lon = fi[xvar][::nsam] - lat = fi[yvar][::nsam] - zp = fi[zvar][::nsam] - tp = fi[tvar][::nsam] - sp = fi[svar][::nsam] if svar in fi else np.ones(lon.shape) - - # Find all NaNs and do not select them - no_nan = ~np.isnan(zp) - - # Remove data wiht NaN's - lon, lat, zp, tp, sp = lon[no_nan], lat[no_nan], zp[no_nan],\ - tp[no_nan], sp[no_nan] - -# Transform coordinates to wanted projection -xp, yp = transform_coord('4326', proj, lon, lat) - -# Test for different types of input -if bbox[0] is not None: - - # Extract bounding box elements - (xmin, xmax, ymin, ymax) = bbox - -else: - - # Create bounding box limits - xmin, xmax, ymin, ymax = xp.min(), xp.max(), yp.min(), yp.max() - -# Time vector -ti = np.arange(tmin, tmax + tres, tres) - -# Construct the grid -Xi, Yi = make_grid(xmin, xmax, ymin, ymax, dx, dy) - -# Shape of grid -Nx, Ny = Xi.shape - -# Length of time vector -Nt = len(ti) - -# Output vectors -Zi = np.ones((Nt, Nx, Ny)) * np.nan -Ei = np.ones((Nt, Nx, Ny)) * np.nan -Ni = np.ones((Nt, Nx, Ny)) * np.nan - -# Check if we should filter -if dxy != 0: - - print('-> cleaning data ...') - - # Global filtering before cleaning - i_o = np.abs(zp) < vmax - - # Remove all NaNs - xp, yp, zp, tp, sp = xp[i_o], yp[i_o], zp[i_o], tp[i_o], sp[i_o] - - # Clean the data in the spatial domain - zp = spatial_filter(xp.copy(), yp.copy(), zp.copy(), dxy, dxy, sigma=thres) - -print("-> creating kdtree ...") - -# Construct cKDTree -tree = cKDTree(np.c_[xp, yp]) - -print('-> interpolating data ...') - -import matplotlib.pyplot as plt - -# Enter prediction loop -for i in range(int(Nx)): - for j in range(int(Ny)): - - # Find closest observations for entire stack - idx = tree.query_ball_point([Xi[i,j], Yi[i,j]], r=dmax) - - # Test if empty - if len(idx) == 0: continue - - # Extract data for solution - xt = xp[idx] - yt = yp[idx] - zt = zp[idx] - tt = tp[idx] - st = sp[idx] - - # Loop trough time - for k in range(int(Nt)): - - # Difference in time - dt = np.abs(tt - ti[k]) - - # Distance from center - dr = square_dist(xt, yt, Xi[i,j], Yi[i,j]) - - # Compute the weighting factors - ed, et = make_weights(dr, dt, alpha_d, alpha_t) - - # Combine weights and scale with error - w = (1. / st ** 2) * ed * et - - # Add something small to avoid division by zero - w += 1e-6 - - # Predicted value - zi = fwavg(w, zt) - - # Test for signular values - if np.abs(zi) < 1e-6: continue - - # Compute random error - sigma_r = fwstd(w, zt, zi) - - # Compute systematic error - sigma_s = 0 if np.all(st == 1) else np.nanmean(st) - - # Prediction error at grid node - ei = np.sqrt(sigma_r ** 2 + sigma_s ** 2) - - # Number of obs. in solution - ni = len(zt) - - # Save data to output - Zi[k,i,j] = zi - Ei[k,i,j] = ei - Ni[k,i,j] = ni - -print('-> saving predictions to file...') - -# Save data to file -with h5py.File(ofile, 'w') as foo: - - foo['X'] = Xi - foo['Y'] = Yi - foo['time'] = ti - foo['Z_pred'] = Zi - foo['Z_rmse'] = Ei - foo['Z_nobs'] = Ni - foo['epsg'] = int(proj) diff --git a/notebooks/land_ice_applications.ipynb b/notebooks/land_ice_applications.ipynb deleted file mode 100644 index a508f6c..0000000 --- a/notebooks/land_ice_applications.ipynb +++ /dev/null @@ -1,1109 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "## Imports\n", - "\n", - "# utility modules\n", - "import glob\n", - "import os\n", - "import sys\n", - "import re\n", - "\n", - "# the usual suspects:\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "# specialty modules\n", - "import h5py\n", - "import pyproj\n", - "\n", - "# run matplotlib in 'widget' mode\n", - "%matplotlib widget\n", - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Land ice applications: Getting familiar with ICESat-2 products over land ice\n", - "\n", - "## 1. Introduction\n", - "In this tutorial, we're going to take a first look at some of the ICESat-2 data over land ice. We're going to demonstrate how ALT06 segments correspond to ATL03 photons, and demonstrate the repeat-track structure of ATL06 data. '\n", - "\n", - "## 1.1 Learning goals\n", - "Our learning goals include understanding:\n", - "* how ice-sheet surfaces are represented by ATL03 photons\n", - "* how ATL06 elevations correpond to ATL03 photon clouds\n", - "* how small-scale features appear in ATL06\n", - "* the repeat structure of ATL06\n", - "* how cross-track slope can affect elevation differences\n", - "and we'll also give:\n", - "* a sneak peak at the ATL11 product.\n", - "\n", - "## 1.2 Tools presented and developed:\n", - "Along the way, we'll present:\n", - "* A reader for ATL03\n", - "* A reader for ATL06\n", - "* Geographic projections with pyproj\n", - "* Filtering ATL06 elevations using slope and quality parameters\n", - "* Mapping surface elevations and profiles with matplotlib\n", - "* Visualizing ATL03 and ATL06 together." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.2.1 Modules Used:\n", - "If you look at the first cell in the notebook, you can see that we're importing:\n", - "* h5py: a library to read (and write) hdf5 data\n", - "* pyproj: a library of geographic corrections\n", - "\n", - "We'll also us my pointCollection package, which contains code to read a variety of datatypes, which we'll use to read image data and to take a first look at the ATL11 product." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "! cd ..; [ -d pointCollection ] || git clone https://www.github.com/smithB/pointCollection.git\n", - "sys.path.append(os.path.join(os.getcwd(), '..'))\n", - "import pointCollection as pc" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll also use Tyler Sutterley's excellent read_HDF5_ATL03 package (stored in the 'readers' directory, one level above the current directory." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "from readers.read_HDF5_ATL03 import read_HDF5_ATL03\n", - "from readers.get_ATL03_x_atc import get_ATL03_x_atc" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.2.2 Data used\n", - "Data for this tutorial are stored in a shared drive, accessible to all tutorial participants. If you're getting data for yourself, you'll need to put it in a consistent place, and change this cell to match your directory." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "data='/srv/tutorial-data/land_ice_applications/'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Image background\n", - "\n", - "We'll also use an image mosaic as background for Antarcitca. It's available in the shared space on jovyan in the MOA subdirectory\n", - "\n", - "If you're running the script outside the hackweek.io world, you'll need to download the files from NSIDC. I've posted a 1-km downscale of the raw (125-meter) mosaic, but the 750-meter mosaic here will do nicely:\n", - "\n", - "https://daacdata.apps.nsidc.org/pub/DATASETS/nsidc0593_moa2009/geotiff/moa750_2009_hp1_v01.1.tif.gz\n", - "\n", - "[Note that if you've gotten your own version of the MOA from NSIDC, you'll need to change the path to the file later in the tutorial to match where you've stored it]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### ATL06 data\n", - "A set of data for the Pine Island Glacier are stored in the /PIG_ATL03 folder, under data-root folder on the Jupyter hub.\n", - "They cover a bounding box:\n", - "102 W to 98 W, 76 S to -75.4 S. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### ATL03 data\n", - "Two granules of ATL03 data from the same region are stored in the /PIG_ATL03 folder, under data-root folder on the Jupyter hub." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1.3 Geographic setting\n", - "\n", - "Let's read the the Mosaic of Antarctica for the region around Pine Island Glacier. The mosaic is in polar-stereographic coordinates, so we'll need to project the geographic coordinates of the box into that projection to decide what part of the mosaic to read." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[-86 -81 -81 -86 -86]\n", - "[-55 -55 -65 -65 -55]\n" - ] - }, - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'GetGeoTransform'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mXR\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnanmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxy\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnanmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxy\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mYR\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnanmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxy\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnanmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxy\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mMOA\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgrid\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_geotif\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_root\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'MOA'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'moa_2009_1km.tif'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbounds\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mYR\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;31m# show the mosaic:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/surface_velocity/notebooks/../pointCollection/grid/data.py\u001b[0m in \u001b[0;36mfrom_geotif\u001b[0;34m(self, file, field, bands, bounds, extent, skip, min_res, date_format)\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 97\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mgdal\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOpen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgdalconst\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGA_ReadOnly\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 98\u001b[0;31m \u001b[0mGT\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGetGeoTransform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 99\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 100\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmin_res\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'GetGeoTransform'" - ] - } - ], - "source": [ - "#spatial_extent = np.array([-102, -76, -98, -74.5])\n", - "spatial_extent = np.array([-65, -86, -55, -81])\n", - "lat=spatial_extent[[1, 3, 3, 1, 1]]\n", - "lon=spatial_extent[[2, 2, 0, 0, 2]]\n", - "print(lat)\n", - "print(lon)\n", - "# project the coordinates to Antarctic polar stereographic\n", - "xy=np.array(pyproj.Proj(3031)(lon, lat))\n", - "# get the bounds of the projected coordinates \n", - "XR=[np.nanmin(xy[0,:]), np.nanmax(xy[0,:])]\n", - "YR=[np.nanmin(xy[1,:]), np.nanmax(xy[1,:])]\n", - "MOA=pc.grid.data().from_geotif(os.path.join(data_root, 'MOA','moa_2009_1km.tif'), bounds=[XR, YR])\n", - "\n", - "# show the mosaic:\n", - "plt.figure()\n", - "MOA.show(cmap='gray', clim=[14000, 17000])\n", - "plt.plot(xy[0,:], xy[1,:])\n", - "plt.title('Mosaic of Antarctica for Pine Island Glacier')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is the Pine Island Glacier. It flows from the top of the map to the bottom (actually east to west, but it's rotated in the Polar Stereographic projection used here). The striped area running from the middle of the page to the bottom is the Pine Island Ice Shelf, where the ice is floating. We expect to see crevasses at the edges of the ice shelf (or really, anywhere in the ice shelf). This area is often cloudy, so we expect to have trouble seeing the surface a lot of the time.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 2. Data in along-track format\n", - "\n", - "# 2.1 ATL03 elevations\n", - "\n", - "Before we start looking at the ATL06 data we've downloaded, let's have a look at some of the ATL03 data that were used to make them. One of the source ATL03 files is in the shared folder, and we'll read it with Tyler Sutterley's excellent \"read_HDF5_ATL03\" function." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\\n# read the data:\\nrgt=\"0027\"\\ncycle=\"06\"\\n# read the IS2 data with Tyler\\'s ATL03 reader:\\nATL03_file=glob.glob(os.path.join(data_root, \\'PIG_ATL03\\', f\\'*{rgt}{cycle}*.h5\\'))[0]\\nIS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams =read_HDF5_ATL03(ATL03_file)\\n'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\"\"\"\n", - "# read the data:\n", - "rgt=\"0027\"\n", - "cycle=\"06\"\n", - "# read the IS2 data with Tyler's ATL03 reader:\n", - "ATL03_file=glob.glob(os.path.join(data_root, 'PIG_ATL03', f'*{rgt}{cycle}*.h5'))[0]\n", - "IS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams =read_HDF5_ATL03(ATL03_file)\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The data are returned in a set of dictionaries that mimic the structure of an ATL03 file. To help visualize the data, we're going to calculate an along-track coordinate for every photon in the cloud (x_atc). This is a slightly complex job, and there's a helper function in the readers directory that you can look at if you want the details." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\\n# add x_atc to the ATL03 data structure (this function adds to the LS2_ATL03_mds dictionary)\\nget_ATL03_x_atc(IS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams)\\n'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\"\"\"\n", - "# add x_atc to the ATL03 data structure (this function adds to the LS2_ATL03_mds dictionary)\n", - "get_ATL03_x_atc(IS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams)\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.1.1 Plotting ATL03 photons\n", - "Now let's plot the ATL03 photons. We'll plot all the photon heights as small black dots, then plot the photons that the ATL03 land-ice signal finder designates as surface (with low, medium, or high confidence) in green. " - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"\\n#-- select the 2l beam from ATL03\\nD3 = IS2_atl03_mds['gt2l']\\n\\n#-- create scatter plot of photon data (e.g., photon elevation vs x_atc)\\nfig=plt.figure(figsize=(6,4))\\nax = fig.add_subplot(111)\\nax.plot(D3['heights']['x_atc'], D3['heights']['h_ph'],'k.',markersize=0.25, label='all photons')\\nLMH=D3['heights']['signal_conf_ph'][:,3] >= 2\\nax.plot(D3['heights']['x_atc'][LMH], D3['heights']['h_ph'][LMH],'g.',markersize=0.5, label='flagged photons')\\nh_leg=ax.legend()\\n\\nax.set_xlabel('x_atc, m')\\nax.set_ylabel('h, m')\\nplt.show()\\n\"" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\"\"\"\n", - "#-- select the 2l beam from ATL03\n", - "D3 = IS2_atl03_mds['gt2l']\n", - "\n", - "#-- create scatter plot of photon data (e.g., photon elevation vs x_atc)\n", - "fig=plt.figure(figsize=(6,4))\n", - "ax = fig.add_subplot(111)\n", - "ax.plot(D3['heights']['x_atc'], D3['heights']['h_ph'],'k.',markersize=0.25, label='all photons')\n", - "LMH=D3['heights']['signal_conf_ph'][:,3] >= 2\n", - "ax.plot(D3['heights']['x_atc'][LMH], D3['heights']['h_ph'][LMH],'g.',markersize=0.5, label='flagged photons')\n", - "h_leg=ax.legend()\n", - "\n", - "ax.set_xlabel('x_atc, m')\n", - "ax.set_ylabel('h, m')\n", - "plt.show()\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "What we see here is a fat black bar, representing all the photons that were close to the surface (in a ~200 m window), with a green line representing the photons flagged by ATL03 as representing the surface. If we zoom in (using the square button on the right) we can see that the black bar is made up of lots of individual photons, with a darker line that represents the surface. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2.2 ATL06 elevations\n", - "\n", - "ATL03 can show where the surface is, but it doesn't explicitly report a surface height. It's also a bulky product that can be slow to load. ATL06 reduces elevation data to a 20-meter posting, and gives one elevation per 20 meters (instead of hundreds in ATL03). \n", - "\n", - "### 2.2.1 simple ATL06 reader\n", - "To help work with ATL06 data, we'll use a simple piece of code that reads ATL06 data one beam at a time and stores it in a dictionary. The code has a default set of fields to be read from an ATL06 file, and stores the data from each field in the output dictionary. It also takes care of removing bad data, by setting values that are marked as invalid in the file to NaN. It also uses hte \n" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def atl06_to_dict(filename, beam, field_dict=None, index=None, epsg=None):\n", - " \"\"\"\n", - " Read selected datasets from an ATL06 file\n", - "\n", - " Input arguments:\n", - " filename: ATl06 file to read\n", - " beam: a string specifying which beam is to be read (ex: gt1l, gt1r, gt2l, etc)\n", - " field_dict: A dictinary describing the fields to be read\n", - " keys give the group names to be read, \n", - " entries are lists of datasets within the groups\n", - " index: which entries in each field to read\n", - " epsg: an EPSG code specifying a projection (see www.epsg.org). Good choices are:\n", - " for Greenland, 3413 (polar stereographic projection, with Greenland along the Y axis)\n", - " for Antarctica, 3031 (polar stereographic projection, centered on the Pouth Pole)\n", - " Output argument:\n", - " D6: dictionary containing ATL06 data. Each dataset in \n", - " dataset_dict has its own entry in D6. Each dataset \n", - " in D6 contains a numpy array containing the \n", - " data\n", - " \"\"\"\n", - " if field_dict is None:\n", - " field_dict={None:['latitude','longitude','h_li', 'atl06_quality_summary'],\\\n", - " 'ground_track':['x_atc','y_atc'],\\\n", - " 'fit_statistics':['dh_fit_dx', 'dh_fit_dy']}\n", - " D={}\n", - " file_re=re.compile('ATL06_(?P\\d+)_(?P\\d\\d\\d\\d)(?P\\d\\d)(?P\\d\\d)_(?P\\d\\d\\d)_(?P\\d\\d).h5')\n", - " with h5py.File(filename,'r') as h5f:\n", - " for key in field_dict:\n", - " for ds in field_dict[key]:\n", - " if key is not None:\n", - " ds_name=beam+'/land_ice_segments/'+key+'/'+ds\n", - " else:\n", - " ds_name=beam+'/land_ice_segments/'+ds\n", - " if index is not None:\n", - " D[ds]=np.array(h5f[ds_name][index])\n", - " else:\n", - " D[ds]=np.array(h5f[ds_name])\n", - " if '_FillValue' in h5f[ds_name].attrs:\n", - " bad_vals=D[ds]==h5f[ds_name].attrs['_FillValue']\n", - " D[ds]=D[ds].astype(float)\n", - " D[ds][bad_vals]=np.NaN\n", - " if epsg is not None:\n", - " xy=np.array(pyproj.proj.Proj(epsg)(D['longitude'], D['latitude']))\n", - " D['x']=xy[0,:].reshape(D['latitude'].shape)\n", - " D['y']=xy[1,:].reshape(D['latitude'].shape)\n", - " temp=file_re.search(filename)\n", - " D['rgt']=int(temp['rgt'])\n", - " D['cycle']=int(temp['cycle'])\n", - " D['beam']=beam\n", - " return D" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll use this to read the ATL06 data that correspond to the ATL03 data in the previous cell, and will plot the ATL06 elevations on top of the ATL03 photons." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"\\n# find the matching ATL06 file\\nATL06_file=glob.glob(os.path.join(data_root, 'PIG_ATL06', f'*{rgt}{cycle}*.h5'))[0]\\nD6=atl06_to_dict(ATL06_file,'/gt2l', index=None, epsg=3031)\\n\\n# plot the elevations on top of the previous axes. You should be able to scroll up to the previous plot and see the ATL06 points.\\nax.plot(D6['x_atc'], D6['h_li'],'r.', label='ATL06')\\nax.legend();\\n\"" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\"\"\"\n", - "# find the matching ATL06 file\n", - "ATL06_file=glob.glob(os.path.join(data_root, 'PIG_ATL06', f'*{rgt}{cycle}*.h5'))[0]\n", - "D6=atl06_to_dict(ATL06_file,'/gt2l', index=None, epsg=3031)\n", - "\n", - "# plot the elevations on top of the previous axes. You should be able to scroll up to the previous plot and see the ATL06 points.\n", - "ax.plot(D6['x_atc'], D6['h_li'],'r.', label='ATL06')\n", - "ax.legend();\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.1.2 Cloudy tracks and singnal-finding blunders" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Cycle 6 happened in pretty nice weather. Not so much cycle 5. Let's take a look at the ATL03 and the ATL06 for cycle 5 and see what happens when things don't go well for ICESat-2." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\\nrgt=\"0027\"\\ncycle=\"05\"\\nbeam=\\'gt2r\\'\\n\\n# read the IS2 data with Tyler\\'s ATL03 reader:\\nATL03_file=glob.glob(os.path.join(data_root, \\'PIG_ATL03\\', f\\'*{rgt}{cycle}*.h5\\'))[0]\\nprint(ATL03_file)\\nIS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams =read_HDF5_ATL03(ATL03_file)\\n# add x_atc to the ATL03 data structure (this function adds to the LS2_ATL03_mds dictionary)\\nget_ATL03_x_atc(IS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams)\\n\\n#-- select the 2r beam from ATL03\\nD3 = IS2_atl03_mds[beam]\\n\\n# find the matching ATL06 file\\nATL06_file=glob.glob(os.path.join(data_root, \\'PIG_ATL06\\', f\\'*{rgt}{cycle}*.h5\\'))[0]\\nD6=atl06_to_dict(ATL06_file, beam, index=None, epsg=3031)\\n#-- create scatter plot of photon data (e.g., photon elevation vs x_atc)\\n%matplotlib widget\\nf1,ax = plt.subplots(num=1,figsize=(6,4))\\nTEP=(D3[\\'heights\\'][\\'signal_conf_ph\\'][:,3] <-1) \\nax.plot(D3[\\'heights\\'][\\'x_atc\\'][TEP], D3[\\'heights\\'][\\'h_ph\\'][TEP],\\'b.\\',markersize=0.25, label=\\'TEP\\')\\nBG=(D3[\\'heights\\'][\\'signal_conf_ph\\'][:,3] ==0) | (D3[\\'heights\\'][\\'signal_conf_ph\\'][:,3] ==1)\\nax.plot(D3[\\'heights\\'][\\'x_atc\\'][BG], D3[\\'heights\\'][\\'h_ph\\'][BG],\\'k.\\',markersize=0.25, label=\\'Background\\')\\nLMH=D3[\\'heights\\'][\\'signal_conf_ph\\'][:,3] >= 2\\nax.plot(D3[\\'heights\\'][\\'x_atc\\'][LMH], D3[\\'heights\\'][\\'h_ph\\'][LMH],\\'g.\\',markersize=0.5, label=\\'flagged photons\\')\\nax.plot(D6[\\'x_atc\\'], D6[\\'h_li\\'],\\'r.\\', label=\\'ATL06\\')\\nh_leg=ax.legend()\\n\\nplt.title(os.path.basename(ATL03_file))\\n\\nax.set_xlabel(\\'x_atc, m\\')\\nax.set_ylabel(\\'h, m\\')\\nplt.show()\\n'" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\"\"\"\n", - "rgt=\"0027\"\n", - "cycle=\"05\"\n", - "beam='gt2r'\n", - "\n", - "# read the IS2 data with Tyler's ATL03 reader:\n", - "ATL03_file=glob.glob(os.path.join(data_root, 'PIG_ATL03', f'*{rgt}{cycle}*.h5'))[0]\n", - "print(ATL03_file)\n", - "IS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams =read_HDF5_ATL03(ATL03_file)\n", - "# add x_atc to the ATL03 data structure (this function adds to the LS2_ATL03_mds dictionary)\n", - "get_ATL03_x_atc(IS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams)\n", - "\n", - "#-- select the 2r beam from ATL03\n", - "D3 = IS2_atl03_mds[beam]\n", - "\n", - "# find the matching ATL06 file\n", - "ATL06_file=glob.glob(os.path.join(data_root, 'PIG_ATL06', f'*{rgt}{cycle}*.h5'))[0]\n", - "D6=atl06_to_dict(ATL06_file, beam, index=None, epsg=3031)\n", - "#-- create scatter plot of photon data (e.g., photon elevation vs x_atc)\n", - "%matplotlib widget\n", - "f1,ax = plt.subplots(num=1,figsize=(6,4))\n", - "TEP=(D3['heights']['signal_conf_ph'][:,3] <-1) \n", - "ax.plot(D3['heights']['x_atc'][TEP], D3['heights']['h_ph'][TEP],'b.',markersize=0.25, label='TEP')\n", - "BG=(D3['heights']['signal_conf_ph'][:,3] ==0) | (D3['heights']['signal_conf_ph'][:,3] ==1)\n", - "ax.plot(D3['heights']['x_atc'][BG], D3['heights']['h_ph'][BG],'k.',markersize=0.25, label='Background')\n", - "LMH=D3['heights']['signal_conf_ph'][:,3] >= 2\n", - "ax.plot(D3['heights']['x_atc'][LMH], D3['heights']['h_ph'][LMH],'g.',markersize=0.5, label='flagged photons')\n", - "ax.plot(D6['x_atc'], D6['h_li'],'r.', label='ATL06')\n", - "h_leg=ax.legend()\n", - "\n", - "plt.title(os.path.basename(ATL03_file))\n", - "\n", - "ax.set_xlabel('x_atc, m')\n", - "ax.set_ylabel('h, m')\n", - "plt.show()\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now the window of photons around the surface is much more scattered, there are some places where ATL06 is reporting heights for something that's probably not the surface, and there's a stripe of extra photons below the surface that doesn't make any obvious sense. The new (blue) stripe of photons is the TEP or Transmitter Echo Pulse, which records a packet of photons that are looped from the transmit to the receive side of ATLAS to help monitor its impulse response. ATL06 ignores these photons, and we should too. \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2.1.3 Filtering out bad returns with ATL06_quality summary and with along-track differencing.\n", - "\n", - "ATL06 \"points\" aren't just points, though. They contain a variety of different flags that can help us filter out bad data. Two of those that we can use are:\n", - "\n", - "-- atl06_quality_summary : a flag that evaluates whether any problems have been found for a particular segment. A 'zero' value indicates that the automatic filters haven't found anything wrong with the segment.\n", - "-- dh_fit_dx : The surface slope estimated for the segment in the along-track direction. We can use this to check whether each segment is consistent with its neighbors.\n", - "\n", - "Let's add two helper functions that we can use to try these ideas out. \n", - "\n", - "The first helper function plots the along-track slopes for each segment:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_segs(D6, ind=None, **kwargs):\n", - " \"\"\"\n", - " Plot a sloping line for each ATL06 segment\n", - " \"\"\"\n", - " if ind is None:\n", - " ind=np.ones_like(D6['h_li'], dtype=bool)\n", - " #define the heights of the segment endpoints. Leave a row of NaNs so that the endpoints don't get joined\n", - " h_ep=np.zeros([3, D6['h_li'][ind].size])+np.NaN\n", - " h_ep[0, :]=D6['h_li'][ind]-D6['dh_fit_dx'][ind]*20\n", - " h_ep[1, :]=D6['h_li'][ind]+D6['dh_fit_dx'][ind]*20\n", - " # define the x coordinates of the segment endpoints\n", - " x_ep=np.zeros([3,D6['h_li'][ind].size])+np.NaN\n", - " x_ep[0, :]=D6['x_atc'][ind]-20\n", - " x_ep[1, :]=D6['x_atc'][ind]+20\n", - "\n", - " plt.plot(x_ep.T.ravel(), h_ep.T.ravel(), **kwargs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The second helper function calculates how close the endpoints of each segment are to centerpoints of that segment's neighbors:\n", - "\n", - "\n", - "\n", - "If we look at the difference between $h_m$ - 20 dh_fit_dx and $h_{m-1}$ and at the difference between $h_m$ + 20 dh_fit_dx and $h_{m+1}$, we can get an idea of whether segments $m-1$, $m$, and $m+1$ are consistent. We'll report the minimum of $|h_m - 20 dh\\_fit\\_dx - h_{m-1}|$ and $|h_m + 20 dh\\_fit\\_dx - h_{m+1}|$. A small value indicates that a segment is consistent with at least one of its neighbors." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def min_seg_difference(D6):\n", - " \"\"\"\n", - " seg_difference_filter: Use elevations and slopes to find bad ATL06 segments\n", - " \n", - " \n", - " Inputs: \n", - " D6: a granule of ATL06 data, in dictionary format. Must have entries:\n", - " x_atc, h_li, dh_fit_dx\n", - " \n", - " Returns:\n", - " delta_h_seg: the minimum absolute difference between each segment's endpoints and those of its two neighbors\n", - " \"\"\"\n", - " h_ep=np.zeros([2, D6['h_li'].size])+np.NaN\n", - " h_ep[0, :]=D6['h_li']-D6['dh_fit_dx']*20\n", - " h_ep[1, :]=D6['h_li']+D6['dh_fit_dx']*20\n", - " delta_h_seg=np.zeros_like(D6['h_li'])\n", - " delta_h_seg[1:]=np.abs(D6['h_li'][1:]-h_ep[1, :-1])\n", - " delta_h_seg[:-1]=np.minimum(delta_h_seg[:-1], np.abs(D6['h_li'][:-1]-h_ep[0, 1:]))\n", - " return delta_h_seg\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's see how each of these helps find bad data:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"\\nfig=plt.figure(figsize=[6, 6])\\nh1=fig.add_subplot(211)\\nplt.plot(D3['heights']['x_atc'], D3['heights']['h_ph'],'k.', markersize=0.25)\\n# plot the segments:\\nplot_segs(D6, color='b', label='atl06 segments')\\ngood=D6['atl06_quality_summary']==0\\n#plot the bad-flagged points\\nplt.plot(D6['x_atc'][~good], D6['h_li'][~good],'y.', label='atl06_quality_summary==1')\\nplt.plot(D6['x_atc'][good], D6['h_li'][good],'r.', label='atl06_quality_summary==0')\\nplt.legend()\\nplt.title('flagging with atl06_qualiy_summary')\\n\\nh2=fig.add_subplot(212, sharex=h1, sharey=h1)\\ndelta_h_seg=min_seg_difference(D6)\\nplt.plot(D3['heights']['x_atc'], D3['heights']['h_ph'],'k.', markersize=0.25, zorder=1)\\nplot_segs(D6, color='b', label='atl06 segments', zorder=2)\\ncm=plt.scatter(D6['x_atc'], D6['h_li'], 4, c=delta_h_seg, vmin=0, vmax=1, cmap='autumn', zorder=3); \\nplt.colorbar(cm, ax=[h1, h2],label='min_seg_difference, m')\\nplt.title('min_seg_difference');\\n\"" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\"\"\"\n", - "fig=plt.figure(figsize=[6, 6])\n", - "h1=fig.add_subplot(211)\n", - "plt.plot(D3['heights']['x_atc'], D3['heights']['h_ph'],'k.', markersize=0.25)\n", - "# plot the segments:\n", - "plot_segs(D6, color='b', label='atl06 segments')\n", - "good=D6['atl06_quality_summary']==0\n", - "#plot the bad-flagged points\n", - "plt.plot(D6['x_atc'][~good], D6['h_li'][~good],'y.', label='atl06_quality_summary==1')\n", - "plt.plot(D6['x_atc'][good], D6['h_li'][good],'r.', label='atl06_quality_summary==0')\n", - "plt.legend()\n", - "plt.title('flagging with atl06_qualiy_summary')\n", - "\n", - "h2=fig.add_subplot(212, sharex=h1, sharey=h1)\n", - "delta_h_seg=min_seg_difference(D6)\n", - "plt.plot(D3['heights']['x_atc'], D3['heights']['h_ph'],'k.', markersize=0.25, zorder=1)\n", - "plot_segs(D6, color='b', label='atl06 segments', zorder=2)\n", - "cm=plt.scatter(D6['x_atc'], D6['h_li'], 4, c=delta_h_seg, vmin=0, vmax=1, cmap='autumn', zorder=3); \n", - "plt.colorbar(cm, ax=[h1, h2],label='min_seg_difference, m')\n", - "plt.title('min_seg_difference');\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Selecting segments with atl06_quality_summary==0 or selecting segments with min_seg_difference < 1 is a good way to remove bad points from a plot like this, and combining the two can reduce the blunder rate further. We'll use the summary flag in this tutorial, but keep both in mind!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3. Repeat track data from ATL06\n", - "Next, let's look at the big picture, combining data from multiple tracks around Pine Island Glacier. We'll use the projected coordinates and plot on top of the image mosaic.\n", - "\n", - "First, we'll every 25th point from one of the center-beam pairs for all files in our data directory. We'll print an error if the reading fails, but will let the code continue anyway:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "read 13 data files of which 0 gave errors\n" - ] - } - ], - "source": [ - "# find all the files in the directory:\n", - "#ATL06_files=glob.glob(os.path.join(data_root, 'PIG_ATL06', '*.h5'))\n", - "data_root='/srv/shared/surface_velocity/'\n", - "ATL06_files=glob.glob(os.path.join(data_root, 'FIS_ATL06_small', '*.h5'))\n", - "D_dict={}\n", - "error_count=0\n", - "for file in ATL06_files:\n", - " try:\n", - " D_dict[file]=atl06_to_dict(file, '/gt2l', index=slice(0, -1, 25), epsg=3031)\n", - " except KeyError as e:\n", - " print(f'file {file} encountered error {e}')\n", - " error_count += 1\n", - "print(f\"read {len(D_dict)} data files of which {error_count} gave errors\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "About 20 of the files had problems, likely because clouds obscured the surface for gt2l. That's too bad, but we can still work with the data we have. \n", - "\n", - "## 3.1. Repeat structure by cycle\n", - "\n", - "Let's map the ground tracks for cycles 1 and 2 (not on repeat tracks) and for cycles 3 and later (measured on the repeat tracks)." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "59debc31b5dc4b5da37254d51c31f15f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'cmap': 'gray', 'clim': [14000, 17000], 'extent': array([-887950., -356950., 183825., 561825.]), 'origin': 'lower'}\n", - "{'cmap': 'gray', 'clim': [14000, 17000], 'extent': array([-887950., -356950., 183825., 561825.]), 'origin': 'lower'}\n" - ] - } - ], - "source": [ - "plt.figure(figsize=[8,8])\n", - "hax0=plt.gcf().add_subplot(211, aspect='equal')\n", - "MOA.show(ax=hax0, cmap='gray', clim=[14000, 17000]);\n", - "hax1=plt.gcf().add_subplot(212, aspect='equal', sharex=hax0, sharey=hax0)\n", - "MOA.show(ax=hax1, cmap='gray', clim=[14000, 17000]);\n", - "for fname, Di in D_dict.items():\n", - " cycle=Di['cycle']\n", - " if cycle <= 2:\n", - " ax=hax0\n", - " else:\n", - " ax=hax1\n", - " #print(fname)\n", - " #print(f'\\t{rgt}, {cycle}, {region}')\n", - " ax.plot(Di['x'], Di['y'])\n", - " if True:\n", - " try:\n", - " if cycle < 3:\n", - " ax.text(Di['x'][0], Di['y'][0], f\"rgt={Di['rgt']}, cyc={cycle}\", clip_on=True)\n", - " elif cycle==3:\n", - " ax.text(Di['x'][0], Di['y'][0], f\"rgt={Di['rgt']}, cyc={cycle}+\", clip_on=True)\n", - " except IndexError:\n", - " pass\n", - "hax0.set_title('cycles 1 and 2');\n", - "hax1.set_title('cycle 3+');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice that cycles 1 and 2 were not precicely repeated, but all data from cycles 3 and onwards follow an exact set of repeats. We've labeled the start of each track. In this area, ascending tracks are labeled on the right (true South) side of the plot, while descending tracks are labeled on the left (true North) side." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3.2 A map-view look at elevations\n", - "Now let's map the elevations associated with these plots." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7481601444bd4a5ba186a7110e43b0a9", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'cmap': 'gray', 'clim': [14000, 17000], 'extent': array([-887950., -356950., 183825., 561825.]), 'origin': 'lower'}\n" - ] - } - ], - "source": [ - "map_fig=plt.figure()\n", - "map_ax=map_fig.add_subplot(111)\n", - "MOA.show(ax=map_ax, cmap='gray', clim=[14000, 17000])\n", - "for fname, Di in D_dict.items():\n", - " # select elevations with good quality_summary\n", - " good=Di['atl06_quality_summary']==0\n", - " ms=map_ax.scatter( Di['x'][good], Di['y'][good], 2, c=Di['h_li'][good], \\\n", - " vmin=0, vmax=1000, label=fname)\n", - "map_ax._aspect='equal'\n", - "plt.colorbar(ms, label='elevation');\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Elevations run from low (blue) on the ice shelf, to high (yellow) on the surrounding ridges. There are a few elevation blunders here, but nothing to cry about, and most of the tracks seem to have fairly good coverage." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3.3 Plotting a repeat-track elevation profile\n", - "Next, let's plot a single profile for the black line in the figure above. We'll plot the surface height (h_li) as a function of the along-track coordinate, x_atc. Since when we read in the elevations to make the survey plot we only read every 100th elevation, we'll reread the data at full resolution before plotting it:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "f3475dd50b14495ca271c72c165937af", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "D_2l={}\n", - "D_2r={}\n", - "\n", - "# specify the rgt here:\n", - "rgt=\"1092\"\n", - "# iterate over the repeat cycles\n", - "for cycle in ['03','04','05','06','07']:\n", - " for filename in glob.glob(os.path.join(data_root, 'FIS_ATL06_small', f'*ATL06_*_{rgt}{cycle}*_003*.h5')):\n", - " try:\n", - " # read the left-beam data\n", - " D_2l[filename]=atl06_to_dict(filename,'/gt2l', index=None, epsg=3031)\n", - " # read the right-beam data\n", - " D_2r[filename]=atl06_to_dict(filename,'/gt2r', index=None, epsg=3031)\n", - " # plot the locations in the previous plot\n", - " map_ax.plot(D_2r[filename]['x'], D_2r[filename]['y'],'k'); \n", - " map_ax.plot(D_2l[filename]['x'], D_2l[filename]['y'],'k');\n", - " except Exception as e:\n", - " print(f'filename={filename}, exception={e}')\n", - "\n", - "plt.figure();\n", - "for filename, Di in D_2l.items():\n", - " #Plot only points that have ATL06_quality_summary==0 (good points)\n", - " hl=plot_segs(Di, ind=Di['atl06_quality_summary']==0, label=f\"cycle={Di['cycle']}\")\n", - " #hl=plt.plot(Di['x_atc'][Di['atl06_quality_summary']==0], Di['h_li'][Di['atl06_quality_summary']==0], '.', label=f\"cycle={Di['cycle']}\")\n", - " \n", - "plt.legend()\n", - "plt.xlabel('x_atc')\n", - "plt.ylabel('elevation');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We see here that we have elevations from cycles 3, 5, and 6, but cycle 4 is missing. That's likely because of clouds, and it's a fact of life in places where glaciers are found." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# BREAKOUT: [15 minutes of participant work]\n", - "\n", - "We're going to move into breakout rooms for a few minutes. Introduce yourselves, then take a look at the ATL03 data and at the ATL06 data.\n", - "\n", - "1. Take some time to explore the PIG ATL03 data set. There are two repeat measurements of the same rgt from two different cycles. We have looked at one beam from each, but you can explore the different beams (strong and weak) and the different pairs (1, 2, and 3.) Combine the first cell from 2.1.2 with the second cell from 2.1.3 to find examples where:\n", - "\n", - "- ATL03 didn't capture the surface\n", - "- ATL06 is locked on something that's not the surface\n", - "- The quality-summary filtering strategy didn't work well\n", - "\n", - "Please find at least one example of each, and post a screen grab in the #questions channel\n", - "\n", - "2. Explore the ATL06 dataset. The maps in 3.2 show where each track in the data set covers. You can change the track number in the cell from 3.3, and can use the zoom button to look at different areas of each plot. Also try looking at different beams (we've mapped only the center pair, but the other two pairs are there as well!)\n", - "\n", - "Within your breakout rooms, work together to look at tracks from different parts of the dataset:\n", - "- inland ice (the sides of the ice stream)\n", - "- Ice-stream margins with crevasses (found at the edges of the ice stream)\n", - "- Ridged ice-shelf terrain (roughly the bottom third of the map)\n", - "- Rifts (cracks within the ice shelf)\n", - "- Data collected over sea ice\n", - "\n", - "Again, post an example to the slack channel, and feel free to post anything else of intrest that you find!\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3.4 an repeat-track example with substantial cross-track slope\n", - "Let's have a look at one of the tracks (rgt 652). This time we're going to plot both the left and right beams in the central beam pair. We'll plot the left beam with a dot and the right beam with plus." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "35f9ce8fdf3e40c6823d369770a07ef8", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "No handles with labels found to put in legend.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'cmap': 'gray', 'clim': [14000, 17000], 'extent': array([-887950., -356950., 183825., 561825.]), 'origin': 'lower'}\n" - ] - } - ], - "source": [ - "D_2l={}\n", - "D_2r={}\n", - "\n", - "# specify the rgt here:\n", - "rgt=\"0469\"\n", - "for cycle in ['03','04','05','06','07']:\n", - " for filename in glob.glob(os.path.join(data_root, 'PIG_ATL06', f'*ATL06_*_{rgt}{cycle}*_003*.h5')):\n", - " print(filename)\n", - " try:\n", - " # read the left-beam data\n", - " D_2l[filename]=atl06_to_dict(filename,'/gt2l', index=None, epsg=3031)\n", - " # read the right-beam data\n", - " D_2r[filename]=atl06_to_dict(filename,'/gt2r', index=None, epsg=3031)\n", - " except Exception as e:\n", - " print(f'filename={filename}, exception={e}')\n", - "\n", - "plt.figure(figsize=[5, 8]);\n", - "ax1=plt.subplot(311)\n", - "MOA.show(cmap='gray', clim=[14000, 17000])\n", - "ax2=plt.subplot(312)\n", - "ax3=plt.subplot(313, sharex=ax2)\n", - "for filename, Dl in D_2l.items():\n", - " print(filename)\n", - " good=Dl['atl06_quality_summary']==0\n", - " hl=ax2.plot(Dl['x_atc'][good], Dl['h_li'][good],'.', label=f\"cycle={Dl['cycle']}\")\n", - " ax1.plot(Dl['x'][::10], Dl['y'][::10], '.', color=hl[0]._color)\n", - " Dr=D_2r[filename]\n", - " good=Dr['atl06_quality_summary']==0\n", - " ax2.plot(Dr['x_atc'][good], Dr['h_li'][good],'+', color=hl[0]._color)\n", - " ax1.plot(Dr['x'][::10], Dr['y'][::10], '+', color=hl[0]._color)\n", - " \n", - " ax3.plot(Dr['x_atc'][::10], Dr['y_atc'][::10],'.', color=hl[0]._color)\n", - " ax3.plot(Dl['x_atc'][::10], Dl['y_atc'][::10],'+', color=hl[0]._color)\n", - " \n", - "ax2.legend()\n", - "for ax in [ax2, ax3]:\n", - " ax.set_xlabel('x_atc') \n", - "ax2.set_ylabel('elevation');\n", - "ax3.set_ylabel('y_atc');\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that cycles 3, 4, and 6 are misaligned from one another. Zooming , we can see that the terrain is higher to the left (plusses) than to the left. This is very likely biasing the apparent elevation differences. \n", - "# 3.5.1 : Correcting repeat elevations for cross-track slope\n", - "\n", - "The ATL11 product will soon be available to sort this out, but in the meantime, we can do a basic correction using the across-track slope estimate in ATL06. Since this is a middle pair, we should be able to use the slope to correct both beams' elevations to y_atc=0. If it were left or a right pair, we'd correct it back to + or - 3200 m." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig=plt.figure()\n", - "ax1=fig.add_subplot(211)\n", - "ax2=fig.add_subplot(212, sharex=ax1, sharey=ax1)\n", - "color_dict={}\n", - "for filename, Dl in D_2l.items():\n", - " print(filename)\n", - " good=Dl['atl06_quality_summary']==0\n", - " Dr=D_2r[filename]\n", - "\n", - " hl=ax1.plot(Dl['x_atc'][good], Dl['h_li'][good],'.', markersize=3, label=f\"cycle={Dl['cycle']}\")\n", - " # save the color for this cycle so we can use it again\n", - " color_dict[int(Dl['cycle'])]=hl[0]._color\n", - " atc_corr=Dl['y_atc']*Dl['dh_fit_dy']\n", - " ax2.plot(Dl['x_atc'][good], Dl['h_li'][good]-atc_corr[good], '.', markersize=3,color=color_dict[int(Dl['cycle'])])\n", - " \n", - " good=Dr['atl06_quality_summary']==0\n", - " ax1.plot(Dr['x_atc'][good], Dr['h_li'][good], '+', markersize=4, color=color_dict[int(Dl['cycle'])])\n", - " atc_corr=Dr['y_atc']*Dr['dh_fit_dy']\n", - " ax2.plot(Dr['x_atc'][good], Dr['h_li'][good]-atc_corr[good], '+', markersize=4, color=color_dict[int(Dl['cycle'])])\n", - " \n", - "ax1.legend()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The elevations from each cycle now lie directly on top of each other. Note that there are far fewer elevations from cycle 3, because the dh_fit_dy variable is only available when both beams in a pair have good-quality elevations (based on atl06_quality summary). \n", - "\n", - "### 3.5.2 A look at ATL11 cross-track slope corrections\n", - "ATL11 takes care of this problem by creating a common surface that can correct the elevations for all available cycles." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "D11=pc.ATL11.data().from_h5(os.path.join(data_root,'PIG_ATL11','ATL11_046910_0306_02_vU07.h5'))\n", - "fig=plt.figure(); \n", - "ax_atl11_1=fig.add_subplot(211, sharex=ax1, sharey=ax1)\n", - "ax_atl11_2=fig.add_subplot(212, sharex=ax1)\n", - "for col in range(D11.h_corr.shape[1]):\n", - " if col+3 in color_dict:\n", - " ax_atl11_1.plot(D11.x_atc[:,0], D11.h_corr[:,col],'.', markersize=2, color=color_dict[col+3], label=f\"cycle {col+3}\")\n", - " ax_atl11_2.plot(D11.x_atc[:,0], D11.h_corr[:,col]-D11.h_corr[:, 3],'.', markersize=2, color=color_dict[col+3])\n", - "ax_atl11_1.set_ylabel('height')\n", - "ax_atl11_1.legend()\n", - "ax_atl11_2.set_ylabel('height difference from cycle 6')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With a bit of zoom work, you can see that there have been 2 or 3 meters of drawdown between cycle 3 (April-June, 2019) and cycle 6 (October-December, 2020)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python [conda env:notebook] *", - "language": "python", - "name": "conda-env-notebook-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/merge.py b/notebooks/merge.py deleted file mode 100644 index 196050c..0000000 --- a/notebooks/merge.py +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/env python -""" -Merges several HDF5 files into a single file or multiple larger files. - -Example - merge.py ifiles_*.h5 -o ofile.h5 - merge.py ifiles_*.h5 -o ofile.h5 -m 5 -n 5 - -Notes - - The parallel option (-n) only works for multiple outputs (-m)! - - If no 'key' is given, it merges files in the order they are passed/read. - - If receive "Argument list too long", pass a string. - - See complementary program: split.py - -Use case: - (ERS-2 over Ross Ice Shelf, ice mode asc) - python merge.py '/mnt/devon-r0/shared_data/ers/floating_/latest/*_ICE_*_A_*.h5' -o /mnt/devon-r0/shared_data/ers/floating_/latest/AntIS_ERS2_ICE_READ_A_ROSS_RM_IBE.h5 -m 8 -n 8 - -""" -import warnings -warnings.filterwarnings("ignore") -import os -import sys -import h5py -import argparse -import numpy as np -from glob import glob - - -def get_args(): - """ Pass command-line arguments. """ - parser = argparse.ArgumentParser( - description='Merges several HDF5 files.') - parser.add_argument( - 'file', metavar='file', type=str, nargs='+', - help='HDF5 files to merge') - parser.add_argument( - '-o', metavar='ofile', dest='ofile', type=str, nargs=1, - help=('output file name'), - default=[None], required=True,) - parser.add_argument( - '-m', metavar='nfiles', dest='nfiles', type=int, nargs=1, - help=('number of merged files (blocks)'), - default=[1],) - parser.add_argument( - '-v', metavar='var', dest='vnames', type=str, nargs='+', - help=('only merge specific vars if given, otherwise merge all'), - default=[],) - parser.add_argument( - '-z', metavar=None, dest='comp', type=str, nargs=1, - help=('compress merged file(s)'), - choices=('lzf', 'gzip'), default=[None],) - parser.add_argument( - '-k', metavar='key', dest='key', type=str, nargs=1, - help=('sort files by numbers after `key` in file name'), - default=[None],) - parser.add_argument( - '-n', metavar='njobs', dest='njobs', type=int, nargs=1, - help=('number of jobs for parallel processing when using -m'), - default=[1],) - return parser.parse_args() - - -def get_total_len(ifiles): - """ Get total output length from all input files. """ - N = 0 - for fn in ifiles: - with h5py.File(fn) as f: - N += list(f.values())[0].shape[0] - return N - - -def get_var_names(ifile): - """ Return all '/variable' names in the HDF5. """ - with h5py.File(ifile, 'r') as f: - vnames = list(f.keys()) - return vnames - - -def get_multi_io(ifiles, ofile, nfiles): - """ Construct multiple input/output file names. """ - # List of groups of input files - ifiles = [list(arr) for arr in np.array_split(ifiles, nfiles)] - # List of output file names - fname = os.path.splitext(ofile)[0] + '_%02d.h5' - ofiles = [(fname % k) for k in range(len(ifiles))] - return ifiles, ofiles - - -def merge(ifiles, ofile, vnames, comp): - """ - Merge variables from several input files into a single file. - - Args: - ifiles (list): input file names. - ofile (str): output file name. - vnames (list): name of vars to merge. - """ - # Get length of output containers (from all input files) - print('Calculating lenght of output from all input files ...') - N = get_total_len(ifiles) - - with h5py.File(ofile, 'w') as f: - - # Create empty output containers (w/compression optimized for speed) - [f.create_dataset(key, (N,), dtype='float64', compression=comp) - for key in vnames] - - # Iterate over the input files - k1 = 0 - for ifile in ifiles: - print(('reading', ifile)) - - # Write next chunk (the input file) - with h5py.File(ifile) as f2: - k2 = k1 + list(f2.values())[0].shape[0] # first var/first dim - - # Iterate over all variables - for key in vnames: - f[key][k1:k2] = f2[key][:] - - k1 = k2 - - print(('merged', len(ifiles), 'files')) - print(('output ->', ofile)) - - -# Sort input files by key -def sort_files(ifiles, key=None): - """ Sort files by numbers *after* the key in the file name. """ - if key: - import re - print('sorting input files ...') - natkey = lambda s: int(re.findall(key+'_\d+', s)[0].split('_')[-1]) - ifiles.sort(key=natkey) - - -if __name__ == '__main__': - - args = get_args() - ifile = args.file[:] # list - ofile = args.ofile[0] # str - nfiles = args.nfiles[0] - vnames = args.vnames - comp = args.comp[0] - key = args.key[0] - njobs = args.njobs[0] - - # In case a string is passed to avoid "Argument list too long" - if len(ifile) == 1: - ifile = glob(ifile[0]) - - # Sort files before merging - sort_files(ifile, key=key) - - # Get var names from first file, if not provided - vnames = get_var_names(ifile[0]) if not vnames else vnames - - # Groups of input files -> multiple output files - if nfiles > 1: - ifile, ofile = get_multi_io(ifile, ofile, nfiles) - else: - ifile, ofile = [ifile], [ofile] - - if njobs > 1 and nfiles > 1: - print(('Running parallel code (%d jobs) ...' % njobs)) - from joblib import Parallel, delayed - Parallel(n_jobs=njobs, verbose=5)( - delayed(merge)(fi, fo, vnames, comp) \ - for fi,fo in zip(ifile, ofile)) - else: - print('Running sequential code ...') - [merge(fi, fo, vnames, comp) for fi,fo in zip(ifile, ofile)] - diff --git a/notebooks/remove_static_surface.ipynb b/notebooks/remove_static_surface.ipynb deleted file mode 100644 index de8f70d..0000000 --- a/notebooks/remove_static_surface.ipynb +++ /dev/null @@ -1,1035 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "import h5py\n", - "import numpy as np\n", - "import cartopy.crs as ccrs\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from utils import transform_coord\n", - "from utils import make_grid\n", - "from utils import mad_std\n", - "from utils import spatial_filter\n", - "from utils import interp2d\n", - "from utils import tiffread\n", - "from utils import binning\n", - "from scipy.ndimage.filters import generic_filter\n", - "import re\n", - "import pyproj" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "datapath='/home/jovyan/shared/surface_velocity/FIS_ATL06_small/processed_ATL06_20191129105346_09700511_003_01.h5'" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/ Group\n", - "/METADATA Group\n", - "/METADATA/AcquisitionInformation Group\n", - "/METADATA/AcquisitionInformation/lidar Group\n", - "/METADATA/AcquisitionInformation/lidarDocument Group\n", - "/METADATA/AcquisitionInformation/platform Group\n", - "/METADATA/AcquisitionInformation/platformDocument Group\n", - "/METADATA/DataQuality Group\n", - "/METADATA/DataQuality/CompletenessOmission Group\n", - "/METADATA/DataQuality/DomainConsistency Group\n", - "/METADATA/DatasetIdentification Group\n", - "/METADATA/Extent Group\n", - "/METADATA/Lineage Group\n", - "/METADATA/Lineage/ANC06-01 Group\n", - "/METADATA/Lineage/ANC06-02 Group\n", - "/METADATA/Lineage/ANC06-03 Group\n", - "/METADATA/Lineage/ANC17 Group\n", - "/METADATA/Lineage/ANC19 Group\n", - "/METADATA/Lineage/ANC25-06 Group\n", - "/METADATA/Lineage/ANC26-06 Group\n", - "/METADATA/Lineage/ANC28 Group\n", - "/METADATA/Lineage/ANC36-06 Group\n", - "/METADATA/Lineage/ANC38-06 Group\n", - "/METADATA/Lineage/ATL03 Group\n", - "/METADATA/Lineage/ATL09 Group\n", - "/METADATA/Lineage/Control Group\n", - "/METADATA/ProcessStep Group\n", - "/METADATA/ProcessStep/Browse Group\n", - "/METADATA/ProcessStep/Metadata Group\n", - "/METADATA/ProcessStep/PGE Group\n", - "/METADATA/ProcessStep/QA Group\n", - "/METADATA/ProductSpecificationDocument Group\n", - "/METADATA/QADatasetIdentification Group\n", - "/METADATA/SeriesIdentification Group\n", - "/ancillary_data Group\n", - "/ancillary_data/atlas_sdp_gps_epoch Dataset {1}\n", - "/ancillary_data/control Dataset {1}\n", - "/ancillary_data/data_end_utc Dataset {1}\n", - "/ancillary_data/data_start_utc Dataset {1}\n", - "/ancillary_data/end_cycle Dataset {1}\n", - "/ancillary_data/end_delta_time Dataset {1}\n", - "/ancillary_data/end_geoseg Dataset {1}\n", - "/ancillary_data/end_gpssow Dataset {1}\n", - "/ancillary_data/end_gpsweek Dataset {1}\n", - "/ancillary_data/end_orbit Dataset {1}\n", - "/ancillary_data/end_region Dataset {1}\n", - "/ancillary_data/end_rgt Dataset {1}\n", - "/ancillary_data/granule_end_utc Dataset {1}\n", - "/ancillary_data/granule_start_utc Dataset {1}\n", - "/ancillary_data/land_ice Group\n", - "/ancillary_data/land_ice/dt_hist Dataset {1}\n", - "/ancillary_data/land_ice/fit_maxiter Dataset {1}\n", - "/ancillary_data/land_ice/fpb_maxiter Dataset {1}\n", - "/ancillary_data/land_ice/max_res_ids Dataset {1}\n", - "/ancillary_data/land_ice/maxiter Dataset {1}\n", - "/ancillary_data/land_ice/min_dist Dataset {1}\n", - "/ancillary_data/land_ice/min_gain_th Dataset {1}\n", - "/ancillary_data/land_ice/min_n_pe Dataset {1}\n", - "/ancillary_data/land_ice/min_n_sel Dataset {1}\n", - "/ancillary_data/land_ice/min_signal_conf Dataset {1}\n", - "/ancillary_data/land_ice/n_hist Dataset {1}\n", - "/ancillary_data/land_ice/n_sigmas Dataset {1}\n", - "/ancillary_data/land_ice/nhist_bins Dataset {1}\n", - "/ancillary_data/land_ice/proc_interval Dataset {1}\n", - "/ancillary_data/land_ice/qs_lim_bsc Dataset {1}\n", - "/ancillary_data/land_ice/qs_lim_hrs Dataset {1}\n", - "/ancillary_data/land_ice/qs_lim_hsigma Dataset {1}\n", - "/ancillary_data/land_ice/qs_lim_msw Dataset {1}\n", - "/ancillary_data/land_ice/qs_lim_snr Dataset {1}\n", - "/ancillary_data/land_ice/qs_lim_sss Dataset {1}\n", - "/ancillary_data/land_ice/rbin_width Dataset {1}\n", - "/ancillary_data/land_ice/sigma_beam Dataset {1}\n", - "/ancillary_data/land_ice/sigma_tx Dataset {1}\n", - "/ancillary_data/land_ice/t_dead Dataset {1}\n", - "/ancillary_data/qa_at_interval Dataset {1}\n", - "/ancillary_data/release Dataset {1}\n", - "/ancillary_data/start_cycle Dataset {1}\n", - "/ancillary_data/start_delta_time Dataset {1}\n", - "/ancillary_data/start_geoseg Dataset {1}\n", - "/ancillary_data/start_gpssow Dataset {1}\n", - "/ancillary_data/start_gpsweek Dataset {1}\n", - "/ancillary_data/start_orbit Dataset {1}\n", - "/ancillary_data/start_region Dataset {1}\n", - "/ancillary_data/start_rgt Dataset {1}\n", - "/ancillary_data/version Dataset {1}\n", - "/gt1l Group\n", - "/gt1l/land_ice_segments Group\n", - "/gt1l/land_ice_segments/atl06_quality_summary Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/bias_correction Group\n", - "/gt1l/land_ice_segments/bias_correction/fpb_mean_corr Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/bias_correction/fpb_mean_corr_sigma Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/bias_correction/fpb_med_corr Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/bias_correction/fpb_med_corr_sigma Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/bias_correction/fpb_n_corr Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/bias_correction/med_r_fit Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/bias_correction/tx_mean_corr Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/bias_correction/tx_med_corr Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/delta_time Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/dem Group\n", - "/gt1l/land_ice_segments/dem/dem_flag Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/dem/dem_h Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/dem/geoid_h Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics Group\n", - "/gt1l/land_ice_segments/fit_statistics/dh_fit_dx Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/dh_fit_dx_sigma Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/dh_fit_dy Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/h_expected_rms Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/h_mean Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/h_rms_misfit Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/h_robust_sprd Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/n_fit_photons Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/n_seg_pulses Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/sigma_h_mean Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/signal_selection_source Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/signal_selection_source_status Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/snr Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/snr_significance Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/fit_statistics/w_surface_window_final Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical Group\n", - "/gt1l/land_ice_segments/geophysical/bckgrd Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/bsnow_conf Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/bsnow_h Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/bsnow_od Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/cloud_flg_asr Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/cloud_flg_atm Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/dac Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/e_bckgrd Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/layer_flag Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/msw_flag Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/neutat_delay_total Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/r_eff Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/solar_azimuth Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/solar_elevation Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/tide_earth Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/tide_equilibrium Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/tide_load Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/tide_ocean Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/geophysical/tide_pole Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/ground_track Group\n", - "/gt1l/land_ice_segments/ground_track/ref_azimuth Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/ground_track/ref_coelv Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/ground_track/seg_azimuth Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/ground_track/sigma_geo_at Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/ground_track/sigma_geo_r Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/ground_track/sigma_geo_xt Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/ground_track/x_atc Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/ground_track/y_atc Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/h_li Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/h_li_sigma Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/latitude Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/longitude Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/segment_id Dataset {5678/Inf}\n", - "/gt1l/land_ice_segments/sigma_geo_h Dataset {5678/Inf}\n", - "/gt1l/residual_histogram Group\n", - "/gt1l/residual_histogram/bckgrd_per_m Dataset {567/Inf}\n", - "/gt1l/residual_histogram/bin_top_h Dataset {748}\n", - "/gt1l/residual_histogram/count Dataset {567/Inf, 748}\n", - "/gt1l/residual_histogram/delta_time Dataset {567/Inf}\n", - "/gt1l/residual_histogram/ds_segment_id Dataset {10}\n", - "/gt1l/residual_histogram/lat_mean Dataset {567/Inf}\n", - "/gt1l/residual_histogram/lon_mean Dataset {567/Inf}\n", - "/gt1l/residual_histogram/pulse_count Dataset {567/Inf}\n", - "/gt1l/residual_histogram/segment_id_list Dataset {567/Inf, 10}\n", - "/gt1l/residual_histogram/x_atc_mean Dataset {567/Inf}\n", - "/gt1l/segment_quality Group\n", - "/gt1l/segment_quality/delta_time Dataset {5678/Inf}\n", - "/gt1l/segment_quality/record_number Dataset {5678/Inf}\n", - "/gt1l/segment_quality/reference_pt_lat Dataset {5678/Inf}\n", - "/gt1l/segment_quality/reference_pt_lon Dataset {5678/Inf}\n", - "/gt1l/segment_quality/segment_id Dataset {5678/Inf}\n", - "/gt1l/segment_quality/signal_selection_source Dataset {5678/Inf}\n", - "/gt1l/segment_quality/signal_selection_status Group\n", - "/gt1l/segment_quality/signal_selection_status/signal_selection_status_all Dataset {5678/Inf}\n", - "/gt1l/segment_quality/signal_selection_status/signal_selection_status_backup Dataset {5678/Inf}\n", - "/gt1l/segment_quality/signal_selection_status/signal_selection_status_confident Dataset {5678/Inf}\n", - "/gt1r Group\n", - "/gt1r/land_ice_segments Group\n", - "/gt1r/land_ice_segments/atl06_quality_summary Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/bias_correction Group\n", - "/gt1r/land_ice_segments/bias_correction/fpb_mean_corr Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/bias_correction/fpb_mean_corr_sigma Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/bias_correction/fpb_med_corr Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/bias_correction/fpb_med_corr_sigma Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/bias_correction/fpb_n_corr Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/bias_correction/med_r_fit Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/bias_correction/tx_mean_corr Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/bias_correction/tx_med_corr Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/delta_time Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/dem Group\n", - "/gt1r/land_ice_segments/dem/dem_flag Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/dem/dem_h Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/dem/geoid_h Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics Group\n", - "/gt1r/land_ice_segments/fit_statistics/dh_fit_dx Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/dh_fit_dx_sigma Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/dh_fit_dy Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/h_expected_rms Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/h_mean Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/h_rms_misfit Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/h_robust_sprd Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/n_fit_photons Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/n_seg_pulses Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/sigma_h_mean Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/signal_selection_source Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/signal_selection_source_status Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/snr Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/snr_significance Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/fit_statistics/w_surface_window_final Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical Group\n", - "/gt1r/land_ice_segments/geophysical/bckgrd Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/bsnow_conf Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/bsnow_h Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/bsnow_od Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/cloud_flg_asr Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/cloud_flg_atm Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/dac Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/e_bckgrd Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/layer_flag Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/msw_flag Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/neutat_delay_total Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/r_eff Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/solar_azimuth Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/solar_elevation Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/tide_earth Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/tide_equilibrium Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/tide_load Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/tide_ocean Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/geophysical/tide_pole Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/ground_track Group\n", - "/gt1r/land_ice_segments/ground_track/ref_azimuth Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/ground_track/ref_coelv Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/ground_track/seg_azimuth Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/ground_track/sigma_geo_at Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/ground_track/sigma_geo_r Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/ground_track/sigma_geo_xt Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/ground_track/x_atc Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/ground_track/y_atc Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/h_li Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/h_li_sigma Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/latitude Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/longitude Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/segment_id Dataset {5678/Inf}\n", - "/gt1r/land_ice_segments/sigma_geo_h Dataset {5678/Inf}\n", - "/gt1r/residual_histogram Group\n", - "/gt1r/residual_histogram/bckgrd_per_m Dataset {567/Inf}\n", - "/gt1r/residual_histogram/bin_top_h Dataset {748}\n", - "/gt1r/residual_histogram/count Dataset {567/Inf, 748}\n", - "/gt1r/residual_histogram/delta_time Dataset {567/Inf}\n", - "/gt1r/residual_histogram/ds_segment_id Dataset {10}\n", - "/gt1r/residual_histogram/lat_mean Dataset {567/Inf}\n", - "/gt1r/residual_histogram/lon_mean Dataset {567/Inf}\n", - "/gt1r/residual_histogram/pulse_count Dataset {567/Inf}\n", - "/gt1r/residual_histogram/segment_id_list Dataset {567/Inf, 10}\n", - "/gt1r/residual_histogram/x_atc_mean Dataset {567/Inf}\n", - "/gt1r/segment_quality Group\n", - "/gt1r/segment_quality/delta_time Dataset {5678/Inf}\n", - "/gt1r/segment_quality/record_number Dataset {5678/Inf}\n", - "/gt1r/segment_quality/reference_pt_lat Dataset {5678/Inf}\n", - "/gt1r/segment_quality/reference_pt_lon Dataset {5678/Inf}\n", - "/gt1r/segment_quality/segment_id Dataset {5678/Inf}\n", - "/gt1r/segment_quality/signal_selection_source Dataset {5678/Inf}\n", - "/gt1r/segment_quality/signal_selection_status Group\n", - "/gt1r/segment_quality/signal_selection_status/signal_selection_status_all Dataset {5678/Inf}\n", - "/gt1r/segment_quality/signal_selection_status/signal_selection_status_backup Dataset {5678/Inf}\n", - "/gt1r/segment_quality/signal_selection_status/signal_selection_status_confident Dataset {5678/Inf}\n", - "/gt2l Group\n", - "/gt2l/land_ice_segments Group\n", - "/gt2l/land_ice_segments/atl06_quality_summary Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/bias_correction Group\n", - "/gt2l/land_ice_segments/bias_correction/fpb_mean_corr Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/bias_correction/fpb_mean_corr_sigma Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/bias_correction/fpb_med_corr Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/bias_correction/fpb_med_corr_sigma Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/bias_correction/fpb_n_corr Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/bias_correction/med_r_fit Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/bias_correction/tx_mean_corr Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/bias_correction/tx_med_corr Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/delta_time Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/dem Group\n", - "/gt2l/land_ice_segments/dem/dem_flag Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/dem/dem_h Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/dem/geoid_h Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics Group\n", - "/gt2l/land_ice_segments/fit_statistics/dh_fit_dx Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/dh_fit_dx_sigma Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/dh_fit_dy Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/h_expected_rms Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/h_mean Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/h_rms_misfit Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/h_robust_sprd Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/n_fit_photons Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/n_seg_pulses Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/sigma_h_mean Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/signal_selection_source Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/signal_selection_source_status Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/snr Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/snr_significance Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/fit_statistics/w_surface_window_final Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical Group\n", - "/gt2l/land_ice_segments/geophysical/bckgrd Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/bsnow_conf Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/bsnow_h Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/bsnow_od Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/cloud_flg_asr Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/cloud_flg_atm Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/dac Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/e_bckgrd Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/layer_flag Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/msw_flag Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/neutat_delay_total Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/r_eff Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/solar_azimuth Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/solar_elevation Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/tide_earth Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/tide_equilibrium Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/tide_load Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/tide_ocean Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/geophysical/tide_pole Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/ground_track Group\n", - "/gt2l/land_ice_segments/ground_track/ref_azimuth Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/ground_track/ref_coelv Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/ground_track/seg_azimuth Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/ground_track/sigma_geo_at Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/ground_track/sigma_geo_r Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/ground_track/sigma_geo_xt Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/ground_track/x_atc Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/ground_track/y_atc Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/h_li Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/h_li_sigma Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/latitude Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/longitude Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/segment_id Dataset {5681/Inf}\n", - "/gt2l/land_ice_segments/sigma_geo_h Dataset {5681/Inf}\n", - "/gt2l/residual_histogram Group\n", - "/gt2l/residual_histogram/bckgrd_per_m Dataset {568/Inf}\n", - "/gt2l/residual_histogram/bin_top_h Dataset {748}\n", - "/gt2l/residual_histogram/count Dataset {568/Inf, 748}\n", - "/gt2l/residual_histogram/delta_time Dataset {568/Inf}\n", - "/gt2l/residual_histogram/ds_segment_id Dataset {10}\n", - "/gt2l/residual_histogram/lat_mean Dataset {568/Inf}\n", - "/gt2l/residual_histogram/lon_mean Dataset {568/Inf}\n", - "/gt2l/residual_histogram/pulse_count Dataset {568/Inf}\n", - "/gt2l/residual_histogram/segment_id_list Dataset {568/Inf, 10}\n", - "/gt2l/residual_histogram/x_atc_mean Dataset {568/Inf}\n", - "/gt2l/segment_quality Group\n", - "/gt2l/segment_quality/delta_time Dataset {5681/Inf}\n", - "/gt2l/segment_quality/record_number Dataset {5681/Inf}\n", - "/gt2l/segment_quality/reference_pt_lat Dataset {5681/Inf}\n", - "/gt2l/segment_quality/reference_pt_lon Dataset {5681/Inf}\n", - "/gt2l/segment_quality/segment_id Dataset {5681/Inf}\n", - "/gt2l/segment_quality/signal_selection_source Dataset {5681/Inf}\n", - "/gt2l/segment_quality/signal_selection_status Group\n", - "/gt2l/segment_quality/signal_selection_status/signal_selection_status_all Dataset {5681/Inf}\n", - "/gt2l/segment_quality/signal_selection_status/signal_selection_status_backup Dataset {5681/Inf}\n", - "/gt2l/segment_quality/signal_selection_status/signal_selection_status_confident Dataset {5681/Inf}\n", - "/gt2r Group\n", - "/gt2r/land_ice_segments Group\n", - "/gt2r/land_ice_segments/atl06_quality_summary Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/bias_correction Group\n", - "/gt2r/land_ice_segments/bias_correction/fpb_mean_corr Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/bias_correction/fpb_mean_corr_sigma Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/bias_correction/fpb_med_corr Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/bias_correction/fpb_med_corr_sigma Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/bias_correction/fpb_n_corr Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/bias_correction/med_r_fit Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/bias_correction/tx_mean_corr Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/bias_correction/tx_med_corr Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/delta_time Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/dem Group\n", - "/gt2r/land_ice_segments/dem/dem_flag Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/dem/dem_h Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/dem/geoid_h Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics Group\n", - "/gt2r/land_ice_segments/fit_statistics/dh_fit_dx Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/dh_fit_dx_sigma Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/dh_fit_dy Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/h_expected_rms Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/h_mean Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/h_rms_misfit Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/h_robust_sprd Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/n_fit_photons Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/n_seg_pulses Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/sigma_h_mean Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/signal_selection_source Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/signal_selection_source_status Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/snr Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/snr_significance Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/fit_statistics/w_surface_window_final Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical Group\n", - "/gt2r/land_ice_segments/geophysical/bckgrd Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/bsnow_conf Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/bsnow_h Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/bsnow_od Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/cloud_flg_asr Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/cloud_flg_atm Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/dac Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/e_bckgrd Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/layer_flag Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/msw_flag Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/neutat_delay_total Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/r_eff Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/solar_azimuth Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/solar_elevation Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/tide_earth Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/tide_equilibrium Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/tide_load Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/tide_ocean Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/geophysical/tide_pole Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/ground_track Group\n", - "/gt2r/land_ice_segments/ground_track/ref_azimuth Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/ground_track/ref_coelv Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/ground_track/seg_azimuth Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/ground_track/sigma_geo_at Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/ground_track/sigma_geo_r Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/ground_track/sigma_geo_xt Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/ground_track/x_atc Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/ground_track/y_atc Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/h_li Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/h_li_sigma Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/latitude Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/longitude Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/segment_id Dataset {5682/Inf}\n", - "/gt2r/land_ice_segments/sigma_geo_h Dataset {5682/Inf}\n", - "/gt2r/residual_histogram Group\n", - "/gt2r/residual_histogram/bckgrd_per_m Dataset {567/Inf}\n", - "/gt2r/residual_histogram/bin_top_h Dataset {748}\n", - "/gt2r/residual_histogram/count Dataset {567/Inf, 748}\n", - "/gt2r/residual_histogram/delta_time Dataset {567/Inf}\n", - "/gt2r/residual_histogram/ds_segment_id Dataset {10}\n", - "/gt2r/residual_histogram/lat_mean Dataset {567/Inf}\n", - "/gt2r/residual_histogram/lon_mean Dataset {567/Inf}\n", - "/gt2r/residual_histogram/pulse_count Dataset {567/Inf}\n", - "/gt2r/residual_histogram/segment_id_list Dataset {567/Inf, 10}\n", - "/gt2r/residual_histogram/x_atc_mean Dataset {567/Inf}\n", - "/gt2r/segment_quality Group\n", - "/gt2r/segment_quality/delta_time Dataset {5682/Inf}\n", - "/gt2r/segment_quality/record_number Dataset {5682/Inf}\n", - "/gt2r/segment_quality/reference_pt_lat Dataset {5682/Inf}\n", - "/gt2r/segment_quality/reference_pt_lon Dataset {5682/Inf}\n", - "/gt2r/segment_quality/segment_id Dataset {5682/Inf}\n", - "/gt2r/segment_quality/signal_selection_source Dataset {5682/Inf}\n", - "/gt2r/segment_quality/signal_selection_status Group\n", - "/gt2r/segment_quality/signal_selection_status/signal_selection_status_all Dataset {5682/Inf}\n", - "/gt2r/segment_quality/signal_selection_status/signal_selection_status_backup Dataset {5682/Inf}\n", - "/gt2r/segment_quality/signal_selection_status/signal_selection_status_confident Dataset {5682/Inf}\n", - "/gt3l Group\n", - "/gt3l/land_ice_segments Group\n", - "/gt3l/land_ice_segments/atl06_quality_summary Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/bias_correction Group\n", - "/gt3l/land_ice_segments/bias_correction/fpb_mean_corr Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/bias_correction/fpb_mean_corr_sigma Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/bias_correction/fpb_med_corr Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/bias_correction/fpb_med_corr_sigma Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/bias_correction/fpb_n_corr Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/bias_correction/med_r_fit Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/bias_correction/tx_mean_corr Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/bias_correction/tx_med_corr Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/delta_time Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/dem Group\n", - "/gt3l/land_ice_segments/dem/dem_flag Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/dem/dem_h Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/dem/geoid_h Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics Group\n", - "/gt3l/land_ice_segments/fit_statistics/dh_fit_dx Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/dh_fit_dx_sigma Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/dh_fit_dy Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/h_expected_rms Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/h_mean Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/h_rms_misfit Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/h_robust_sprd Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/n_fit_photons Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/n_seg_pulses Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/sigma_h_mean Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/signal_selection_source Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/signal_selection_source_status Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/snr Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/snr_significance Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/fit_statistics/w_surface_window_final Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical Group\n", - "/gt3l/land_ice_segments/geophysical/bckgrd Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/bsnow_conf Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/bsnow_h Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/bsnow_od Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/cloud_flg_asr Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/cloud_flg_atm Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/dac Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/e_bckgrd Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/layer_flag Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/msw_flag Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/neutat_delay_total Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/r_eff Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/solar_azimuth Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/solar_elevation Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/tide_earth Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/tide_equilibrium Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/tide_load Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/tide_ocean Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/geophysical/tide_pole Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/ground_track Group\n", - "/gt3l/land_ice_segments/ground_track/ref_azimuth Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/ground_track/ref_coelv Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/ground_track/seg_azimuth Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/ground_track/sigma_geo_at Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/ground_track/sigma_geo_r Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/ground_track/sigma_geo_xt Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/ground_track/x_atc Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/ground_track/y_atc Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/h_li Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/h_li_sigma Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/latitude Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/longitude Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/segment_id Dataset {5685/Inf}\n", - "/gt3l/land_ice_segments/sigma_geo_h Dataset {5685/Inf}\n", - "/gt3l/residual_histogram Group\n", - "/gt3l/residual_histogram/bckgrd_per_m Dataset {568/Inf}\n", - "/gt3l/residual_histogram/bin_top_h Dataset {748}\n", - "/gt3l/residual_histogram/count Dataset {568/Inf, 748}\n", - "/gt3l/residual_histogram/delta_time Dataset {568/Inf}\n", - "/gt3l/residual_histogram/ds_segment_id Dataset {10}\n", - "/gt3l/residual_histogram/lat_mean Dataset {568/Inf}\n", - "/gt3l/residual_histogram/lon_mean Dataset {568/Inf}\n", - "/gt3l/residual_histogram/pulse_count Dataset {568/Inf}\n", - "/gt3l/residual_histogram/segment_id_list Dataset {568/Inf, 10}\n", - "/gt3l/residual_histogram/x_atc_mean Dataset {568/Inf}\n", - "/gt3l/segment_quality Group\n", - "/gt3l/segment_quality/delta_time Dataset {5685/Inf}\n", - "/gt3l/segment_quality/record_number Dataset {5685/Inf}\n", - "/gt3l/segment_quality/reference_pt_lat Dataset {5685/Inf}\n", - "/gt3l/segment_quality/reference_pt_lon Dataset {5685/Inf}\n", - "/gt3l/segment_quality/segment_id Dataset {5685/Inf}\n", - "/gt3l/segment_quality/signal_selection_source Dataset {5685/Inf}\n", - "/gt3l/segment_quality/signal_selection_status Group\n", - "/gt3l/segment_quality/signal_selection_status/signal_selection_status_all Dataset {5685/Inf}\n", - "/gt3l/segment_quality/signal_selection_status/signal_selection_status_backup Dataset {5685/Inf}\n", - "/gt3l/segment_quality/signal_selection_status/signal_selection_status_confident Dataset {5685/Inf}\n", - "/gt3r Group\n", - "/gt3r/land_ice_segments Group\n", - "/gt3r/land_ice_segments/atl06_quality_summary Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/bias_correction Group\n", - "/gt3r/land_ice_segments/bias_correction/fpb_mean_corr Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/bias_correction/fpb_mean_corr_sigma Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/bias_correction/fpb_med_corr Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/bias_correction/fpb_med_corr_sigma Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/bias_correction/fpb_n_corr Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/bias_correction/med_r_fit Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/bias_correction/tx_mean_corr Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/bias_correction/tx_med_corr Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/delta_time Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/dem Group\n", - "/gt3r/land_ice_segments/dem/dem_flag Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/dem/dem_h Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/dem/geoid_h Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics Group\n", - "/gt3r/land_ice_segments/fit_statistics/dh_fit_dx Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/dh_fit_dx_sigma Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/dh_fit_dy Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/h_expected_rms Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/h_mean Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/h_rms_misfit Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/h_robust_sprd Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/n_fit_photons Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/n_seg_pulses Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/sigma_h_mean Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/signal_selection_source Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/signal_selection_source_status Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/snr Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/snr_significance Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/fit_statistics/w_surface_window_final Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical Group\n", - "/gt3r/land_ice_segments/geophysical/bckgrd Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/bsnow_conf Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/bsnow_h Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/bsnow_od Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/cloud_flg_asr Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/cloud_flg_atm Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/dac Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/e_bckgrd Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/layer_flag Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/msw_flag Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/neutat_delay_total Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/r_eff Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/solar_azimuth Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/solar_elevation Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/tide_earth Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/tide_equilibrium Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/tide_load Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/tide_ocean Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/geophysical/tide_pole Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/ground_track Group\n", - "/gt3r/land_ice_segments/ground_track/ref_azimuth Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/ground_track/ref_coelv Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/ground_track/seg_azimuth Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/ground_track/sigma_geo_at Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/ground_track/sigma_geo_r Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/ground_track/sigma_geo_xt Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/ground_track/x_atc Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/ground_track/y_atc Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/h_li Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/h_li_sigma Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/latitude Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/longitude Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/segment_id Dataset {5686/Inf}\n", - "/gt3r/land_ice_segments/sigma_geo_h Dataset {5686/Inf}\n", - "/gt3r/residual_histogram Group\n", - "/gt3r/residual_histogram/bckgrd_per_m Dataset {568/Inf}\n", - "/gt3r/residual_histogram/bin_top_h Dataset {748}\n", - "/gt3r/residual_histogram/count Dataset {568/Inf, 748}\n", - "/gt3r/residual_histogram/delta_time Dataset {568/Inf}\n", - "/gt3r/residual_histogram/ds_segment_id Dataset {10}\n", - "/gt3r/residual_histogram/lat_mean Dataset {568/Inf}\n", - "/gt3r/residual_histogram/lon_mean Dataset {568/Inf}\n", - "/gt3r/residual_histogram/pulse_count Dataset {568/Inf}\n", - "/gt3r/residual_histogram/segment_id_list Dataset {568/Inf, 10}\n", - "/gt3r/residual_histogram/x_atc_mean Dataset {568/Inf}\n", - "/gt3r/segment_quality Group\n", - "/gt3r/segment_quality/delta_time Dataset {5686/Inf}\n", - "/gt3r/segment_quality/record_number Dataset {5686/Inf}\n", - "/gt3r/segment_quality/reference_pt_lat Dataset {5686/Inf}\n", - "/gt3r/segment_quality/reference_pt_lon Dataset {5686/Inf}\n", - "/gt3r/segment_quality/segment_id Dataset {5686/Inf}\n", - "/gt3r/segment_quality/signal_selection_source Dataset {5686/Inf}\n", - "/gt3r/segment_quality/signal_selection_status Group\n", - "/gt3r/segment_quality/signal_selection_status/signal_selection_status_all Dataset {5686/Inf}\n", - "/gt3r/segment_quality/signal_selection_status/signal_selection_status_backup Dataset {5686/Inf}\n", - "/gt3r/segment_quality/signal_selection_status/signal_selection_status_confident Dataset {5686/Inf}\n", - "/orbit_info Group\n", - "/orbit_info/crossing_time Dataset {1/Inf}\n", - "/orbit_info/cycle_number Dataset {1/Inf}\n", - "/orbit_info/lan Dataset {1/Inf}\n", - "/orbit_info/orbit_number Dataset {1/Inf}\n", - "/orbit_info/rgt Dataset {1/Inf}\n", - "/orbit_info/sc_orient Dataset {1/Inf}\n", - "/orbit_info/sc_orient_time Dataset {1/Inf}\n", - "/quality_assessment Group\n", - "/quality_assessment/gt1l Group\n", - "/quality_assessment/gt1l/delta_time Dataset {243/Inf}\n", - "/quality_assessment/gt1l/lat_mean Dataset {243/Inf}\n", - "/quality_assessment/gt1l/lon_mean Dataset {243/Inf}\n", - "/quality_assessment/gt1l/signal_selection_source_fraction_0 Dataset {243/Inf}\n", - "/quality_assessment/gt1l/signal_selection_source_fraction_1 Dataset {243/Inf}\n", - "/quality_assessment/gt1l/signal_selection_source_fraction_2 Dataset {243/Inf}\n", - "/quality_assessment/gt1l/signal_selection_source_fraction_3 Dataset {243/Inf}\n", - "/quality_assessment/gt1r Group\n", - "/quality_assessment/gt1r/delta_time Dataset {243/Inf}\n", - "/quality_assessment/gt1r/lat_mean Dataset {243/Inf}\n", - "/quality_assessment/gt1r/lon_mean Dataset {243/Inf}\n", - "/quality_assessment/gt1r/signal_selection_source_fraction_0 Dataset {243/Inf}\n", - "/quality_assessment/gt1r/signal_selection_source_fraction_1 Dataset {243/Inf}\n", - "/quality_assessment/gt1r/signal_selection_source_fraction_2 Dataset {243/Inf}\n", - "/quality_assessment/gt1r/signal_selection_source_fraction_3 Dataset {243/Inf}\n", - "/quality_assessment/gt2l Group\n", - "/quality_assessment/gt2l/delta_time Dataset {242/Inf}\n", - "/quality_assessment/gt2l/lat_mean Dataset {242/Inf}\n", - "/quality_assessment/gt2l/lon_mean Dataset {242/Inf}\n", - "/quality_assessment/gt2l/signal_selection_source_fraction_0 Dataset {242/Inf}\n", - "/quality_assessment/gt2l/signal_selection_source_fraction_1 Dataset {242/Inf}\n", - "/quality_assessment/gt2l/signal_selection_source_fraction_2 Dataset {242/Inf}\n", - "/quality_assessment/gt2l/signal_selection_source_fraction_3 Dataset {242/Inf}\n", - "/quality_assessment/gt2r Group\n", - "/quality_assessment/gt2r/delta_time Dataset {242/Inf}\n", - "/quality_assessment/gt2r/lat_mean Dataset {242/Inf}\n", - "/quality_assessment/gt2r/lon_mean Dataset {242/Inf}\n", - "/quality_assessment/gt2r/signal_selection_source_fraction_0 Dataset {242/Inf}\n", - "/quality_assessment/gt2r/signal_selection_source_fraction_1 Dataset {242/Inf}\n", - "/quality_assessment/gt2r/signal_selection_source_fraction_2 Dataset {242/Inf}\n", - "/quality_assessment/gt2r/signal_selection_source_fraction_3 Dataset {242/Inf}\n", - "/quality_assessment/gt3l Group\n", - "/quality_assessment/gt3l/delta_time Dataset {243/Inf}\n", - "/quality_assessment/gt3l/lat_mean Dataset {243/Inf}\n", - "/quality_assessment/gt3l/lon_mean Dataset {243/Inf}\n", - "/quality_assessment/gt3l/signal_selection_source_fraction_0 Dataset {243/Inf}\n", - "/quality_assessment/gt3l/signal_selection_source_fraction_1 Dataset {243/Inf}\n", - "/quality_assessment/gt3l/signal_selection_source_fraction_2 Dataset {243/Inf}\n", - "/quality_assessment/gt3l/signal_selection_source_fraction_3 Dataset {243/Inf}\n", - "/quality_assessment/gt3r Group\n", - "/quality_assessment/gt3r/delta_time Dataset {243/Inf}\n", - "/quality_assessment/gt3r/lat_mean Dataset {243/Inf}\n", - "/quality_assessment/gt3r/lon_mean Dataset {243/Inf}\n", - "/quality_assessment/gt3r/signal_selection_source_fraction_0 Dataset {243/Inf}\n", - "/quality_assessment/gt3r/signal_selection_source_fraction_1 Dataset {243/Inf}\n", - "/quality_assessment/gt3r/signal_selection_source_fraction_2 Dataset {243/Inf}\n", - "/quality_assessment/gt3r/signal_selection_source_fraction_3 Dataset {243/Inf}\n", - "/quality_assessment/qa_granule_fail_reason Dataset {1}\n", - "/quality_assessment/qa_granule_pass_fail Dataset {1}\n" - ] - } - ], - "source": [ - "!h5ls -r /home/jovyan/shared/surface_velocity/FIS_ATL06_small/processed_ATL06_20191129105346_09700511_003_01.h5" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1450950 1450951 1450952 ... 1456628 1456629 1456630]\n" - ] - } - ], - "source": [ - "with h5py.File(datapath, 'r') as f:\n", - " segment_id = f['/gt2l/land_ice_segments/segment_id'][:]\n", - "print(segment_id)\n", - "# /gt2l/land_ice_segments/segment_id" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "def atl06_to_dict(filename, beam, field_dict=None, index=None, epsg=None):\n", - " \"\"\"\n", - " Read selected datasets from an ATL06 file\n", - "\n", - " Input arguments:\n", - " filename: ATl06 file to read\n", - " beam: a string specifying which beam is to be read (ex: gt1l, gt1r, gt2l, etc)\n", - " field_dict: A dictinary describing the fields to be read\n", - " keys give the group names to be read, \n", - " entries are lists of datasets within the groups\n", - " index: which entries in each field to read\n", - " epsg: an EPSG code specifying a projection (see www.epsg.org). Good choices are:\n", - " for Greenland, 3413 (polar stereographic projection, with Greenland along the Y axis)\n", - " for Antarctica, 3031 (polar stereographic projection, centered on the Pouth Pole)\n", - " Output argument:\n", - " D6: dictionary containing ATL06 data. Each dataset in \n", - " dataset_dict has its own entry in D6. Each dataset \n", - " in D6 contains a numpy array containing the \n", - " data\n", - " \"\"\"\n", - " if field_dict is None:\n", - " field_dict={None:['latitude','longitude','h_li', 'atl06_quality_summary'],\\\n", - " 'ground_track':['x_atc','y_atc'],\\\n", - " 'fit_statistics':['dh_fit_dx', 'dh_fit_dy']}\n", - " D={}\n", - " file_re=re.compile('ATL06_(?P\\d+)_(?P\\d\\d\\d\\d)(?P\\d\\d)(?P\\d\\d)_(?P\\d\\d\\d)_(?P\\d\\d).h5')\n", - " with h5py.File(filename,'r') as h5f:\n", - " for key in field_dict:\n", - " for ds in field_dict[key]:\n", - " if key is not None:\n", - " ds_name=beam+'/land_ice_segments/'+key+'/'+ds\n", - " else:\n", - " ds_name=beam+'/land_ice_segments/'+ds\n", - " if index is not None:\n", - " D[ds]=np.array(h5f[ds_name][index])\n", - " else:\n", - " D[ds]=np.array(h5f[ds_name])\n", - " if '_FillValue' in h5f[ds_name].attrs:\n", - " bad_vals=D[ds]==h5f[ds_name].attrs['_FillValue']\n", - " D[ds]=D[ds].astype(float)\n", - " D[ds][bad_vals]=np.NaN\n", - " D['data_start_utc'] = h5f['/ancillary_data/data_start_utc'][:]\n", - " D['delta_time'] = h5f['/gt2l/land_ice_segments/delta_time'][:]\n", - "\n", - " if epsg is not None:\n", - " xy=np.array(pyproj.proj.Proj(epsg)(D['longitude'], D['latitude']))\n", - " D['x']=xy[0,:].reshape(D['latitude'].shape)\n", - " D['y']=xy[1,:].reshape(D['latitude'].shape)\n", - " temp=file_re.search(filename)\n", - " D['rgt']=int(temp['rgt'])\n", - " D['cycle']=int(temp['cycle'])\n", - " D['beam']=beam\n", - " return D" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "ATL06_track = atl06_to_dict(datapath, 'gt2l', epsg=3031)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "dict_keys(['latitude', 'longitude', 'h_li', 'atl06_quality_summary', 'x_atc', 'y_atc', 'dh_fit_dx', 'dh_fit_dy', 'data_start_utc', 'x', 'y', 'rgt', 'cycle', 'beam'])" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ATL06_track.keys()" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[60260046.62119763 60260046.6240197 60260046.62684182 ...\n", - " 60260062.62573686 60260062.62856199 60260062.63138753]\n", - "[b'2019-11-29T10:53:45.845255Z']\n" - ] - }, - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEFCAYAAAAYKqc0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3deZQU1fnG8e87DKvswuCAIqIg4AoCisoii7IkMerRuCQ/NAti3DUqCBoVFzQxmk2NiYiJRqNo1CgoiAGNsg2rgICgyM4Mi6wOzPL+/uiinWF6Bmat7p7nc46nq25Vd78yxTOXW1W3zN0REZHkkhJ2ASIiUvEU7iIiSUjhLiKShBTuIiJJSOEuIpKEUsMuAKBZs2bepk2bsMsQEUkoc+fO3eLuzWNti4twb9OmDRkZGWGXISKSUMzs6+K2aVhGRCQJKdxFRJKQwl1EJAkp3EVEkpDCXUQkCSncRUSSkMJdRCQJKdxFREKwd38u/X83nclLNlXK5yvcRUSq2Ecrsuh07/uszNzN45NXVMp3KNxFRKpQdk4e/zdudnR9/E+7Vcr3xMX0AyIi1UWHe96LLq8eO6TSvkc9dxGRKjJh7rro8rIxAyv1uw7ZczezccD3gEx3Pzloawr8C2gDrAYuc/ftZtYG+BxYHrx9prsPr/CqRUQSxJ59ufR9fBqbd+6Ltr308zOpU7NGpX7v4fTcxwMH/4oZAUx193bA1GD9gFXufnrwn4JdRKoNd+edRRvIzskDIuPrJ/36/ULBfnKrhpxzQrNKr+WQPXd3/yjokRd0IdAnWH4BmAbcVYF1iYgknB/9ZSazV28DYMWDgwqNr/ftkMZzQ7tiZlVSS1nH3Fu4+0aA4DWtwLbjzGy+mU03s57FfYCZDTOzDDPLyMrKKmMZIiLxYdOO7GiwA7QfPSm6fNfADoy7uluVBTtU/AnVjUBrd+8M3Ab808waxtrR3Z91967u3rV585gPEhERiWubdmRz7qMf8uLMrznrkakA9O/YotA+z1/Tjev6HF/ltZX1UsjNZpbu7hvNLB3IBHD3fcC+YHmuma0C2gN6zJKIJA13p8uYKWzfmwPA6DcXR7f9+arObN+Tw1mPTGXMD0/mvBPTivuYSlXWcH8bGAqMDV7fAjCz5sA2d88zs7ZAO+DLiihURCReTJi7LhrsBX1wWy9qp9bgqEY1KvUa9sNxOJdCvkzk5GkzM1sH/JpIqL9qZj8D1gCXBrv3Ah4ws1wgDxju7tuKfqqISGLauz+XOyYsiq6/c+O5NKtfm3x3WjauG2JlhR3O1TJXFLOpX4x9XwdeL29RIiLxYse3OfzypbkMPiWd3dm5PDJpWXTblw8PJiWl6k6SloamHxARKcboNz/jxZlrAPhk5dZC214ZdlbcBjso3EVEYrr0mU+Zs3p7zG2L77+A+rXjOz41t4yIyEH27MuNBnuTejVZNmYgPds1o0fbI5l3z4C4D3ZQz11EpJAXPl3Nr99eAkDt1BTm33s+AP/42ZlhllVqCncRESA/33nigxX88cOV0bYl918QYkXlo3AXEQF6jJ1aaIKvFQ8OIrVG4o5cK9xFpFpyd/IdDPhs/Y5osDeuV5N5owfE9ZUwh0PhLiLV0mV/mVHkaphfnd+eG/q2C6miipW4/+YQESmjddv3xrzMMVmCHRTuIlLNzFuznXMf/W+htk7pDfnioUEhVVQ5NCwjItVC5s5szn/yI74pMOFX2JN7VSaFu4gkNXfnuJETi7RPurnYZwklBYW7iCQddyc339m7P4/T7p9caFvLRnWYdHMvGtWrGVJ1VUPhLiJJ55rxc5i2vPDjO4f3Pp6b+p1AvVrVI/aqx/+liFQrBwf75Ft70b5Fg5CqCYeulhGRhJebl88z01exd38uyzbtjLZ3a9OE2Xf3q3bBDuq5i0gSOGHUJADGTlrGJV2OBuC9W3rS4aiGYZYVKvXcRSShzV9T+Gak1+etA6jWwQ4KdxFJcC/NijwpqWP6d2F+58ATwyonbmhYRkQS2oS5kZ76f244h5w8p26tGiFXFB8U7iKScNydZz/6kjz3aFtqjRRSletRCncRSTi/eX85T01bFV0ff023EKuJTwp3EUkYuXn5zPpqW6FgB+jVrnlIFcUvhbuIxLUXZ37NaxlrWbhuR5Ftb11/Dkc1qpPwD9aoDAp3EYlb7y3eyOg3F8fc9s6N53Jyq0ZVXFHiULiLSFzal5vH8Bfnxdy28qHEfr5pVVC4i0hc+nTV1ujy45eeRvsWDTjlaPXUD9chf/WZ2TgzyzSzxQXamprZFDP7InhtUmDbSDNbaWbLzeyCyipcRJLbNc/PAWD6HX245IyjFeyldDj/rhkPDDyobQQw1d3bAVODdcysE3A5cFLwnqfMTFeeikip/HdZZnT52COPCLGSxHXIcHf3j4BtBzVfCLwQLL8A/LBA+yvuvs/dvwJWAt0rqFYRqQby851rxkd67Z1bNw65msRV1jMSLdx9I0Dwmha0twLWFthvXdAmInJYfvH3jOjyG9edHWIlia2iT6jGutjUY7RhZsOAYQCtW7eu4DJEJFG4O5t2ZlOvZiqnPfDdI/EmDO+Bma5fL6uyhvtmM0t3941mlg4cGCBbBxxTYL+jgQ2xPsDdnwWeBejatWvMXwAiktzOGDOFrXv2F2m/5pw2dG3TNISKkkdZh2XeBoYGy0OBtwq0X25mtc3sOKAdMLt8JYpIMlq7bW/MYH/7hnP49fdPCqGi5HLInruZvQz0AZqZ2Trg18BY4FUz+xmwBrgUwN2XmNmrwFIgF7je3fMqqXYRSWA9H/tvdLldWn1Sa6Tw5ys707Z5/RCrSh6HDHd3v6KYTf2K2f8h4KHyFCUiyWll5m5+9sIcvt66N9q2euyQECtKXrpDVUQqnbvzrzlrGfHGZ4XaH77olJAqSn4KdxGpVO7OcSMnFmlv3bQel3U9OoSKqgeFu4hUqp8GNyQdkDG6P83q1w6pmupD4S4iFW7iZxuZ/dU2zmrblP8uzwKge5umvDzsLGpo7vUqoXAXkQr15/+u5DfvLwdg/Kero+2vDu8RUkXVkyZEFpEKM/6Tr6LBXtDHd54XQjXVm8JdRCpEfr5z33+WRtcfu+RUAH532Wkc07ReWGVVWxqWEZEK8eQHK6LLXz48mJQU47Jux5TwDqlM6rmLSLm5O3/4cCUAH9zWWw+sjgMKdxEptyemfNdrPyFN0wfEAw3LiEipuTtPTVvFb95fTs92zfj4iy0ATLypZ8iVyQEKdxEptYJ3nB4IdoBOLRuGUY7EoGEZESmVxet3xGwff023Kq5ESqJwF5FS+d4f/wfAnQNPZO7o/gC0bX4EfU5MK+ltUsU0LCMih23emu3R5eG9jiclxTRlb5xSz11EDtsvX5wHwM392ulyxzinnruIHNKOvTn89eMv2bQzG4BbB7QPuSI5FIW7iBSRl+9s37s/OjXvaQ9Mjm5rXK9mWGVJKSjcRSSquAdrFDT/ngFVVI2Uh8JdRKIuefrTYrfdcN4J3H5+e8w01p4IdEJVRIDIlTDz1nwDwLW92xba9vRVXfjVBScq2BOIeu4iwvJNu7j4qUiv/aiGdRg5qCMjB3UEIkM1CvXEo567SDU3bXkmFzz5UXT9nZvOLbRdwZ6Y1HMXqaby8522dxc+efrMj7vo4dVJQuEuUg3t3Z9Lp3vfL9T2+nU9OOPYpiFVJBVN4S5SzUxesolh/5gbXX/6qi4MOiU9xIqkMijcRaqZgsH+3i096XCUpulNRuU6oWpmN5vZYjNbYma3BG33mdl6M1sQ/De4YkoVkfK67dUF0eUZI/sq2JNYmXvuZnYy8AugO7AfeM/M3g02P+Huv62A+kSkgkxfkcUb89YDcP8PTiK9Ud2QK5LKVJ5hmY7ATHffC2Bm04GLKqQqEalQq7J2M3Tc7Oj6//U4NsRqpCqUZ1hmMdDLzI40s3rAYOCYYNsNZrbIzMaZWZNyVykiZZKf75z58Af0e3x6tG3Vw4N17Xo1UOZwd/fPgUeBKcB7wEIgF3gaOB44HdgIPB7r/WY2zMwyzCwjKyurrGWISAna3j2RzTv3RdeH9WpLDc3DXi2U64Squz/n7l3cvRewDfjC3Te7e5675wN/JTImH+u9z7p7V3fv2rx58/KUISIxXPbMjELr79x4LiMHdQipGqlq5boU0szS3D3TzFoDFwM9zCzd3TcGu1xEZPhGRKrQsk07mb16GwCPX3oal5xxdMgVSVUr73Xur5vZkUAOcL27bzezf5jZ6YADq4Fry/kdIlIKO77NYeCTHwNwcedWCvZqqlzh7u49Y7T9pDyfKSJlt277Xs599L/R9QcvOjnEaiRMukNVJMHd9/YSxn+6mqvPbsP4T1dH25c/OJDaqTXCK0xCpSl/RRLY/f9ZEg30gsGeMbq/gr2aU89dJEG9tWA9z3+yukj7vHsG0PSIWlVfkMQVhbtIAsrPd25+JTJPTJfWjXn+6u78b+UWBp9ylG5QEkDDMiIJY39uPlOWbiZzV3ahh2y88ctzaFSvJkNOTVewS5R67iJxzt15be467pywqMi2STcXuWBNBFC4i8S13Lx8Thg1Kea22we0p2O6puyV2BTuInHs3/PXF1ofcmo6Azq2oG/HNBrWqRlSVZIIFO4iceyOYCjm4i6teOySU0mtodNkcngU7iJxasHab6LLv7vs9BArkUSkcBeJQ8P+nsHkpZsBuK7P8SFXI4lI/8YTiTN3vLYwGuwAN/VtF2I1kqjUcxeJA+6Rm5LeXrihUPvU23tTt5amEZDSU7iLhGza8kyufn5Oobb0RnWYMbJfSBVJMtCwjEiIsnPyigT7909rqWCXclPPXSREv3xpXnR53NVd6duhRYjVSDJRuIuEaMXmXUDk+aYnt2oUcjWSTBTuIiFwd2Z8uZV127+lWf1aCnapcAp3kSr0xJQV/H7qF4XaND+MVAadUBWpInn5XiTYAZ78ke4+lYqncBepJHv35zJj1VYA9uXmcXyBOdgBTmrZkKUPXMCR9WuHUZ4kOQ3LiFSC3Lx8Ot37fsxtGaP700yBLpVMPXeRCrYyc1exc7A/fNEpCnapEuq5i1SQnLx82h0U6r+//PTos04X3Xe+5mCXKqNwF6kgd7y2sND6rLv70aJhHS48vVVIFUl1pnAXqQCZO7N5c0Fk0q9PR/TlqIZ1SEnRw6olPAp3kTJwd8Z9spqXZ69hZebuaPtJLRvSsnHdECsTiVC4i5TSm/PXc8u/FsTc9s6N51ZxNSKxlSvczexm4BeAAX919yfNrCnwL6ANsBq4zN23l7NOkdDk5uVz+gNT2L0vl/4dW/DB55uL7PPBbb1p3bQeZhqKkfhQ5nA3s5OJBHt3YD/wnpm9G7RNdfexZjYCGAHcVRHFioShy5hIsAOFgn3OqP5s3bOPDkdp+gCJP+XpuXcEZrr7XgAzmw5cBFwI9An2eQGYhsJdElTWrn3szM4t0r7yoUGk1kiheQNdsy7xqTzhvhh4yMyOBL4FBgMZQAt33wjg7hvNLC3Wm81sGDAMoHXr1uUoQ6RyLFj7DdcH863/8PSWPHl5Z56Zvor0RnVIraH7/yS+mbuX/c1mPwOuB3YDS4mE/DXu3rjAPtvdvUlJn9O1a1fPyMgocx0iFcXduemVBfznoGeZLn9wILVT9SxTiS9mNtfdu8baVq4Tqu7+HPBc8CUPA+uAzWaWHvTa04HM8nyHSFWYv2Y7v3l/OZ8GE30VdG3vtgp2STjlvVomzd0zzaw1cDHQAzgOGAqMDV7fKneVIhXE3Xnuf1/xyKRlDO3Rhnu/34nNO7O56KlPi+z7i57HsT83n5GDOoZQqUj5lHdY5mPgSCAHuM3dpwZj8K8CrYE1wKXuvq2kz9GwjFQFd2dl5m4GPPFRiftNurmnHqAhCaEyh2V6xmjbCujR7RJ3Rr25mH/OWlPs9vn3DKBxvZq6Vl2Sgk75S9J7Z9EG2ox4t1CwL77/Aq7t3Ta6vvDX59PkiFoKdkkamn5Akla7URPJySs87JjeqA4PX3wK9WunMnJQR42nS9JSuEtSytyVXSTYJwzvQdc2TUOqSKRqaVhGksbqLXu46KlPWLD2G7o/NDXaPrTHsXz1yGAFu1Qr6rlL0ujz22kA/PDPn0TbvnpksMbRpVpSz12SQpcxU4q0zRnVX8Eu1ZZ67pLwMndls23PfgDevP4cTj+m8SHeIZL81HOXhLMvN493Fm3g2/15APzgj5FhmFv7t1ewiwTUc5e4lZOXz4xVW+nVvnm0bVd2DqfcNznm/jf3b1dVpYnEPYW7xK12oyZFl1ePHQJA1wc/iLnvn67sXCU1iSQKDctIXLrhn/MKrfd7fBptRrzLvtx8AOrUTOGmfpGeeq0aKQw5Jb3KaxSJZ+q5S9xYsXkXH63Ion2LBryzaCMAD110MqP+vZhVWXui+/3xis58/7SWANw2oH0otYrEO4W7hM7dyXc4/6DZGi8942iuOvNYvti8m/GfrgZgyf0XcERtHbYih1KuKX8riqb8rX4emfQ5f5n+JQCXdzuGV+asLbKPbkASKVmlTfkrUha3v7qQ1+eti64XDPbpd/Th2COPCKMskaSicJcK878vtvDj52YBMHtUP9Ia1CE3L58aKYY7tL17YqH9f3LWsfxj5tcA9O+Yxt+GdqvymkWSlYZlpFzy8iPHz5Slmxn+4txC20YP6ciD734e8319O6Qx7upu5Oc7H6/cwlltm+o5pSKlpGEZqXDPfrSKhycuK3GfWME+7Vd9qJWaQsvGdQFISTF6F7hJSUQqhsJdYtq7P5eNO7JZtnEX1/9zHjNG9uX+t5fy3pJNxb7nteE96NamKV9m7abv49MBaFKvJtv35gBw7/c60aaZxtNFqoKGZaSIn78whw8+zzzkfs3q1+aVYWdyXLP67Pw2hyZH1KqC6kTkgJKGZXSHqrAzO4elG3aSn+88Pnl5icHetvkRpBicd2Jz5ozqxwlpDaiRYgp2kTijYZlqbtue/THnQv/TlZ0Z0KkF3+zNoUXDOizftItjmtalXi0dMiKJQH9Tqxl3Z/POfaQ1qM3+vPyYwT7mwpP43qmR2/tbNIxcwXLiUQ2qtE4RKR+FezWyMzuHC//0CV9t2VNk28qHBrF51z5qp6bQrH7tEKoTkYqkcE9i2Tl5dLjnvUPuN/2OPqTWSKFVcHmiiCQ+hXsSu+wvM2K2j7nwJP6zcCNd2zThpn7tqFNTNw+JJBuFe5Jydxat2wHAxZ1bMXHxRp6+6gz6nNgcM+MnPdqEW6CIVKpyXQppZrea2RIzW2xmL5tZHTO7z8zWm9mC4L/BFVWsFG/x+h2c++iHtBnxLlt274sGe/sW9fndj05n2ZhBnNchTbMsilQTZe65m1kr4Cagk7t/a2avApcHm59w999WRIFSvOkrshg6bnaR9oKPovvLT2Le3yAiSa68NzGlAnXNLBWoB2wof0lyODbvzI4Z7AVdeWZrjtPt/iLVUpl77u6+3sx+C6wBvgUmu/tkMzsbuMHM/g/IAG539+0Hv9/MhgHDAFq3bl3WMqqtu9/4LLrcvEFt3rjubI5pWg+ANVv3YkZ0XUSqnzLPLWNmTYDXgR8B3wCvAROAKcAWwIExQLq7/7Skz9LcMqWzMzuHU++bDMDqsUNCrkZEwlJZc8v0B75y9yx3zwHeAM52983unufu+cBfge7l+A45iLtHg/2ugR1CrkZE4lV5wn0NcJaZ1bPIJRj9gM/NLL3APhcBi8tTYHX27f48pizdzM7syJS5+fnOcSO/e5rR8N5twypNROJcecbcZ5nZBGAekAvMB54F/mZmpxMZllkNXFsBdVY7BedEB3j6qi5c99K86Prff9pdlzWKSLE0n3scyst3jj/oeaMFLX9woB5JJyKazz3RvDl/fXR51t39osvN6tdixYODFOwickiafiDO5Oc7D0/8nI7pDXn3xnNJSTFdESMipaaee5z5cFkmW/fs56LOLUlJ0Zi6iJSNwj2O5OU7P/975NzDFd11Y5eIlJ3CPY788qW50eUGdWqGWImIJDqNuYdo2aadLFjzDX07pvGr1xbx0YosABbff0HIlYlIolO4hyBzZzbdH54ac9uIQR2oX1s/FhEpHw3LVLG8fC822O8ceCLDex9fxRWJSDJSF7EKuTun3T85uj5jZF/SG9XF3XW3qYhUKIV7JdqxN4fbX1vI0g07yHfYtDM7um3Vw4OpEVzqqGAXkYqmcK8ku/flctoDk2Num35Hn2iwi4hUBoV7JekyZkp0uVf75ny9dQ/t0urz9I/PoGYNneoQkcqlcK9g7oWn5dXUASISBnUhK1B2Tl6hYM8Y3T/EakSkOlO4VxB3p8M970XXp97em2b1a4dYkYhUZxqWKYclG3Yw5A//K9Ku+dZFJGzquZdRdk5ezGD/+M7zFOwiEjr13Mvg4CGYGSP7Uju1Brl5+aQ1rBNiZSIiEQr3Mij4bNN3bjyX9EZ1Q6xGRKQohXspfbpyC19t2QNETpoe37x+yBWJiBSlMfdSuvJvswB4/upuCnYRiVvquR8md+faf3z3MI3zOqSFWI2ISMkU7iXYuz+XujVrsCprD/1/9904+9IH9DANEYlvCvcY8vOdtndPjLltzqj+1KulPzYRiW9KqYPs2JsTczbHE1s04L1bemp6XhFJCNUy3N+cv55b/rUguj7l1l6ckFafK/86ixlfbo22zxnVnylLN7Mqazf3fK9TGKWKiJRJtQr3vHzn+BjDLQOe+KhI28yR/WjeoDZXntm6KkoTEalQ5boU0sxuNbMlZrbYzF42szpm1tTMppjZF8Frk4oqtrz++vGXhdY/uuM8Dh5lWfnQIFaPHcJRjXSnqYgkLnP3sr3RrBXwP6CTu39rZq8CE4FOwDZ3H2tmI4Am7n5XSZ/VtWtXz8jIKFMdhytzZ3b0wdQHT+x108vzaVKvJvdfeHKl1iAiUpHMbK67d421rbzDMqlAXTPLAeoBG4CRQJ9g+wvANKDEcK8KB4J95KAORSb2+sMVncMoSUSk0pR5WMbd1wO/BdYAG4Ed7j4ZaOHuG4N9NgIx7/Yxs2FmlmFmGVlZWWUt47DMLHCS9Nrex1fqd4mIxIMyh3swln4hcBzQEjjCzH58uO9392fdvau7d23evHlZy4hp+5797M/Nj64/MmkZAAvuHVCh3yMiEq/KMyzTH/jK3bMAzOwN4Gxgs5mlu/tGM0sHMiugzsO2aUc2Zz0SGYIZ0KkFN/drx8K13zB6SEca16tVlaWIiISmPOG+BjjLzOoB3wL9gAxgDzAUGBu8vlXeIkuj52MfRpenLN3MlKWbAfhh51ZVWYaISKjKM+Y+C5gAzAM+Cz7rWSKhPsDMvgAGBOtVYu22veTkOQ3rpDJheA8Gn3IUAOeccKSeZyoi1UqZL4WsSBV1KWS7URPJyXP+/cuz6dw6bi6vFxGpFCVdCpk087nvys4hJy/yi0rBLiLVXdKE+zPTVwHwl5+cEXIlIiLhS/i5ZT5ctpmfjv9uSKd/xxYhViMiEh8Suue+dMPOQsE+/ppu1EjRlLwiIgndc29yRE0AatVIYfaofrqOXUQkkNDhnt6oLqvHDgm7DBGRuJPQwzIiIhKbwl1EJAkp3EVEkpDCXUQkCSncRUSSkMJdRCQJKdxFRJKQwl1EJAnFxZS/ZpYFfF2gqRmwJaRySqK6Skd1lY7qKh3VBce6e8znlMZFuB/MzDKKm6M4TKqrdFRX6aiu0lFdJdOwjIhIElK4i4gkoXgN92fDLqAYqqt0VFfpqK7SUV0liMsxdxERKZ947bmLiEg5KNxFRJJQXIS7mdUws/lm9k6BthvNbLmZLTGzx+KhLjM73cxmmtkCM8sws+4h1LTazD47UEPQ1tTMppjZF8Frkzip6zdmtszMFpnZv82scTzUVWDbr8zMzaxZvNQV9nFfzM8xHo77xmY2ITiePjezHnFy3MeqK/TjHgB3D/0/4Dbgn8A7wfp5wAdA7WA9LU7qmgwMCpYHA9NCqGk10OygtseAEcHyCODROKnrfCA1WH40XuoK2o8B3idy81yR7SH9eYV+3BdTVzwc9y8APw+WawGN4+S4j1VX6Me9u4ffczezo4EhwN8KNF8HjHX3fQDunhkndTnQMFhuBGyo6rqKcSGRg4zg9Ych1hLl7pPdPTdYnQkcHWY9B3kCuJPIzzRehH7cFyPU497MGgK9gOcA3H2/u39DyMd9cXXFy3EfergDTxL5S5ZfoK090NPMZpnZdDPrFid13QL8xszWAr8FRoZQlwOTzWyumQ0L2lq4+0aA4DUtTuoq6KfApCquCWLUZWY/ANa7+8IQ6im2LuLjuI9VV9jHfVsgC3g+GCb9m5kdQfjHfXF1FRTWcR/usAzwPeCpYLkP3w1/LAb+ABjQHfiK4LLNkOv6A3BJsHwZ8EEIf2Ytg9c0YCGRnsM3B+2zPR7qKrBtFPDvqvwZHuLPaxbQKGhfTTjDMrHqCvW4L6GuUI97oCuQC5wZrP8eGBP2cV9cXQW2h3bcu4c/LHMO8AMzWw28AvQ1sxeBdcAbHjGbSO+5Kk96FVfXUOCNYJ/XiPwFrFLuviF4zSRy4HQHNptZOkDwWuX/nC+mLsxsKJFflld5cMSHXFdv4DhgYfDzPRqYZ2ZHhVxXd8I/7ourK+zjfh2wzt1nBesTgC6Ef9wXV1foxz2EPCzj7iPd/Wh3bwNcDnzo7j8G3gT6AphZeyInKqps9rcS6tpAJBwI6vuiqmoCMLMjzKzBgWUiJ24WA28T+QtI8PpWPNRlZgOBu4AfuPveqqyphLrmuHuau7cJfr7rgC7uvinkuhYT8nFfQl2hHvfBz2atmZ0YNPUDlhLycV9cXWEf9wekhvXFhzAOGGdmi4H9wNCwfvsd5BfA780sFcgGYo0tV6YWwL/NDCI/u3+6+3tmNgd41cx+BqwBLo2TulYCtYEpwbaZ7j487Lqq8PuLU9yfVy3CPe6Lq2s34R73ADcCLwV/Rl8C1xDpnIZ53BdX1xzCPe4BTT8gIpKUwh5zFxGRSqBwFxFJQgp3EZEkpHAXEUlCCncRkWIczkRuZjYw2GelmY0o0F7sBGJmdqqZzQg+9zMzq3OIOiZrxsYAAAI7SURBVD4OJm5bYGYbzOzNQ9auq2VEpLozsz7A1e5+dYG284jcZTrE3feZWZofNN+PmdUAVgADiNwzMQe4wt2Xmtn5RO6RyTWzRwHc/a7gktJ5wE/cfaGZHUnkbtu8w6z1deAtd/97Sfup5y4iEtvhTOTWHVjp7l+6+34id7RfGOxf3ARi5wOLPJjbyN23Hgh2Mzs/6NHPM7PXzKx+wS8LbjLrS+SGtxIp3EVEYjucidxaAWsLrK8L2g5WcAKx9oCb2ftBiN8JYJHnCowG+rt7FyCDyLTjBV0ETHX3nYcqPl7vUBURqXRmNovI3aT1gaZmtiDYdBeRfGwCnAV0I3I3bNuD7hq2GB9baKzbzEYRmWDspaApFTg3+My9wFQzmwvUBToBnwR3ttYCZhz02VdQeBryYincRaTacvczodgx91sJJnIDZpvZgYncsgp8xDoiD3454GgKzHdfYAKxfgV+KawDprv7lmCfiUQmHFsGTHH3K2LVGozNdyfSez8kDcuIiMR2OBO5zQHamdlxwfwylxOZ0IwSJhB7HzjVzOoFJ1d7E5kIbSZwjpmdELy/XvC9B1xKZPrx7MMpXuEuIhLbOKBtMJHbKwQTuZlZy6C3TXDC9AYigf058Kq7Lwne/yegAZEJxBaY2TPBe7YDvyPyi2EBMM/d33X3LOBq4GUzW0Qk7DsUqOdy4OXDLV6XQoqIJCH13EVEkpDCXUQkCSncRUSSkMJdRCQJKdxFRJKQwl1EJAkp3EVEktD/A1Io0ImzTmnIAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "print(ATL06_track['delta_time'])\n", - "print(ATL06_track['data_start_utc'])\n", - "\n", - "plt.plot(ATL06_track['delta_time'], ATL06_track['h_li'])\n", - "# plt.scatter(ATL06_track['x'],ATL06_track['y'],1,ATL06_track['h_li'])\n", - "# plt.colorbar()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Try fittopo.py" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "module 'datetime' has no attribute 'strptime'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mtimevector\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mATL06_track\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'delta_time'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mATL06_track\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'delta_time'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mdatetime\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrptime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mATL06_track\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'data_start_utc'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: module 'datetime' has no attribute 'strptime'" - ] - } - ], - "source": [ - "timevector = ATL06_track['delta_time'] - ATL06_track['delta_time'][0]\n", - "import datetime\n", - "# logic: turn into decimal years, somehow" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "usage: fittopo.py [-h] [-d dx dy] [-r radius] [-q n_reloc] [-i n_iter]\n", - " [-z min_obs] [-m mod_lim] [-k mod_order] [-t ref_time]\n", - " [-j epsg_num] [-v x y t h] [-x expr] [-n n_jobs]\n", - " [-s slope_lim] [-p]\n", - " file [file ...]\n", - "\n", - "Compute surface elevation residuals from satellite/airborne altimetry.\n", - "\n", - "positional arguments:\n", - " file file(s) to process (HDF5)\n", - "\n", - "optional arguments:\n", - " -h, --help show this help message and exit\n", - " -d dx dy spatial resolution for grid-solution (deg or km)\n", - " -r radius min and max search radius (km)\n", - " -q n_reloc number of relocations for search radius\n", - " -i n_iter maximum number of iterations for model solution\n", - " -z min_obs minimum obs to compute solution\n", - " -m mod_lim minimum obs for higher order models\n", - " -k mod_order order of the surface fit model: 1=lin or 2=quad\n", - " -t ref_time time to reference the solution to: year|fixed|variable\n", - " -j epsg_num projection: EPSG number (AnIS=3031, GrIS=3413)\n", - " -v x y t h name of lon/lat/t/h in the HDF5\n", - " -x expr expression to apply to time (e.g. 't + 2000'), optional\n", - " -n n_jobs for parallel processing of multiple tiles, optional\n", - " -s slope_lim slope limit for x/y direction (deg)\n", - " -p print diagnostic information to terminal\n" - ] - } - ], - "source": [ - "!python fittopo.py -h" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "t_year is decimal years" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!python ./fittopo.py /home/jovyan/shared/surface_velocity/FIS_ATL06_small/processed_ATL06_20191129105346_09700511_003_01.h5 -d 1 1 -r 1.0 -q 3 -i 5 -z 10 -m 100 \\\n", - "-k 2 -t 2020 -j 3031 -v lon lat t_year h_li -s 10 -p" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "970" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/utils.py b/notebooks/utils.py deleted file mode 100644 index d415c23..0000000 --- a/notebooks/utils.py +++ /dev/null @@ -1,758 +0,0 @@ -""" -High-level functions used across the CAP-Toolkit package. - -""" -import h5py -import numpy as np -import pyproj -import xarray as xr -import pandas as pd -from scipy.spatial import cKDTree -from scipy.spatial.distance import cdist -from scipy import stats -from scipy.ndimage import map_coordinates -from gdalconst import * -from osgeo import gdal, osr -from scipy import signal - -def print_args(args): - """Print arguments passed to argparse.""" - print("Input arguments:") - for arg in list(vars(args).items()): - print(arg) - - -def read_h5(fname, vnames): - """Generic HDF5 reader. - - vnames : ['var1', 'var2', 'var3'] - """ - with h5py.File(fname, "r") as f: - variables = [f[v][()] for v in vnames] - - return variables if len(vnames) > 1 else variables[0] - - -def save_h5(fname, vardict, mode="a"): - """Generic HDF5 writer. - - vardict : {'name1': var1, 'name2': va2, 'name3': var3} - """ - with h5py.File(fname, mode) as f: - for k, v in list(vardict.items()): - if k in f: - f[k][:] = np.squeeze(v) - else: - f[k] = np.squeeze(v) - - -def is_empty(ifile): - """Test if file is corruted or empty""" - try: - with h5py.File(ifile, "r") as f: - if bool(list(f.keys())): - return False - else: - return True - except IOError: - return True - - -def find_nearest(arr, val): - """Find index of 'nearest' value(s). - - Args: - arr (nd array) : The array to search in (nd). No need to be sorted. - val (scalar or array) : Value(s) to find. - - Returns: - out (tuple or scalar) : The index (or tuple if nd array) of nearest - entry found. If `val` is a list of values then a tuple of ndarray - with the indices of each value is return. - - See also: - find_nearest2 - - """ - idx = [] - - if np.ndim(val) == 0: - val = np.array([val]) - - for v in val: - idx.append((np.abs(arr - v)).argmin()) - idx = np.unravel_index(idx, arr.shape) - - return idx if val.ndim > 1 else idx[0] - - - -def make_grid(xmin, xmax, ymin, ymax, dx, dy, return_2d=True): - """ - Construct 2D-grid given input boundaries - - :param xmin: x-coord. min - :param xmax: x-coord. max - :param ymin: y-coors. min - :param ymax: y-coord. max - :param dx: x-resolution - :param dy: y-resolution - :param return_2d: if true return grid otherwise vector - :return: 2D grid or 1D vector - """ - - Nn = int((np.abs(ymax - ymin)) / dy) + 1 - Ne = int((np.abs(xmax - xmin)) / dx) + 1 - - xi = np.linspace(xmin, xmax, num=Ne) - yi = np.linspace(ymin, ymax, num=Nn) - - if return_2d: - return np.meshgrid(xi, yi) - else: - return xi, yi - -def transform_coord(proj1, proj2, x, y): - """ - Transform coordinates from proj1 to proj2 - usgin EPSG number - - :param proj1: current projection (4326) - :param proj2: target projection (3031) - :param x: x-coord in current proj1 - :param y: y-coord in current proj1 - :return: x and y now in proj2 - """ - - proj1 = pyproj.Proj("+init=EPSG:" + str(proj1)) - proj2 = pyproj.Proj("+init=EPSG:" + str(proj2)) - - return pyproj.transform(proj1, proj2, x, y) - - -def mad_std(x, axis=None): - """ - Robust std.dev using median absolute deviation - - :param x: data values - :param axis: target axis for computation - :return: std.dev (MAD) - """ - return 1.4826 * np.nanmedian(np.abs(x - np.nanmedian(x, axis)), axis) - - -def interpmed(x, y, z, Xi, Yi, n, d): - """ - 2D median interpolation of scattered data - - :param x: x-coord (m) - :param y: y-coord (m) - :param z: values - :param Xi: x-coord. grid (2D) - :param Yi: y-coord. grid (2D) - :param n: number of nearest neighbours - :param d: maximum distance allowed (m) - :return: 1D array of interpolated values - """ - - xi = Xi.ravel() - yi = Yi.ravel() - - zi = np.zeros(len(xi)) * np.nan - - tree = cKDTree(np.c_[x, y]) - - for i in range(len(xi)): - - (dxy, idx) = tree.query((xi[i], yi[i]), k=n) - - if n == 1: - pass - elif dxy.min() > d: - continue - else: - pass - - zc = z[idx] - - zi[i] = np.median(zc) - - return zi - - -def interpgaus(x, y, z, s, Xi, Yi, n, d, a): - """ - 2D interpolation using a gaussian kernel - weighted by distance and error - - :param x: x-coord (m) - :param y: y-coord (m) - :param z: values - :param s: obs. errors - :param Xi: x-coord. interp. point(s) (m) - :param Yi: y-coord. interp. point(s) (m) - :param n: number of nearest neighbours - :param d: maximum distance allowed (m) - :param a: correlation length in distance (m) - :return: 1D vec. of prediction, sigma and nobs - """ - - xi = Xi.ravel() - yi = Yi.ravel() - - zi = np.zeros(len(xi)) * np.nan - ei = np.zeros(len(xi)) * np.nan - ni = np.zeros(len(xi)) * np.nan - - tree = cKDTree(np.c_[x, y]) - - if np.all(np.isnan(s)): s = np.ones(s.shape) - - for i in range(len(xi)): - - (dxy, idx) = tree.query((xi[i], yi[i]), k=n) - - if n == 1: - pass - elif dxy.min() > d: - continue - else: - pass - - zc = z[idx] - sc = s[idx] - - if len(zc[~np.isnan(zc)]) == 0: continue - - # Weights - wc = (1./sc**2) * np.exp(-(dxy**2)/(2*a**2)) - - # Avoid singularity - wc += 1e-6 - - # Predicted value - zi[i] = np.nansum(wc * zc) / np.nansum(wc) - - # Weighted rmse - sigma_r = np.nansum(wc * (zc - zi[i])**2) / np.nansum(wc) - - # Obs. error - sigma_s = 0 if np.all(s == 1) else np.nanmean(sc) - - # Prediction error - ei[i] = np.sqrt(sigma_r ** 2 + sigma_s ** 2) - - # Number of points in prediction - ni[i] = 1 if n == 1 else len(zc) - - return zi, ei, ni - - -def interpkrig(x, y, z, s, Xi, Yi, d, a, n): - """ - 2D interpolation using ordinary kriging/collocation - with second-order markov covariance model. - - :param x: x-coord (m) - :param y: y-coord (m) - :param z: values - :param s: obs. error added to diagonal - :param Xi: x-coord. interp. point(s) (m) - :param Yi: y-coord. interp. point(s) (m) - :param d: maximum distance allowed (m) - :param a: correlation length in distance (m) - :param n: number of nearest neighbours - :return: 1D vec. of prediction, sigma and nobs - """ - - n = int(n) - - # Check - if n == 1: - print('n > 1 needed!') - return - - xi = Xi.ravel() - yi = Yi.ravel() - - zi = np.zeros(len(xi)) * np.nan - ei = np.zeros(len(xi)) * np.nan - ni = np.zeros(len(xi)) * np.nan - - tree = cKDTree(np.c_[x, y]) - - # Convert to meters - a *= 0.595 * 1e3 - d *= 1e3 - - for i in range(len(xi)): - - (dxy, idx) = tree.query((xi[i], yi[i]), k=n) - - if dxy.min() > d: - continue - - xc = x[idx] - yc = y[idx] - zc = z[idx] - sc = s[idx] - - if len(zc) < 2: continue - - m0 = np.median(zc) - c0 = np.var(zc) - - # Covariance function for Dxy - Cxy = c0 * (1 + (dxy / a)) * np.exp(-dxy / a) - - # Compute pair-wise distance - dxx = cdist(np.c_[xc, yc], np.c_[xc, yc], "euclidean") - - # Covariance function Dxx - Cxx = c0 * (1 + (dxx / a)) * np.exp(-dxx / a) - - # Measurement noise matrix - N = np.eye(len(Cxx)) * sc * sc - - # Solve for the inverse - CxyCxxi = np.linalg.solve((Cxx + N).T, Cxy.T) - - # Predicted value - zi[i] = np.dot(CxyCxxi, zc) + (1 - np.sum(CxyCxxi)) * m0 - - # Predicted error - ei[i] = np.sqrt(np.abs(c0 - np.dot(CxyCxxi, Cxy.T))) - - # Number of points in prediction - ni[i] = len(zc) - - return zi, ei, ni - - -def spatial_filter(x, y, z, dx, dy, n_sigma=3.0): - """ - Spatial outlier editing filter - - :param x: x-coord (m) - :param y: y-coord (m) - :param z: values - :param dx: filter res. in x (m) - :param dy: filter res. in y (m) - :param n_sigma: cutt-off value - :param thres: max absolute value of data - :return: filtered array containing nan-values - """ - - Nn = int((np.abs(y.max() - y.min())) / dy) + 1 - Ne = int((np.abs(x.max() - x.min())) / dx) + 1 - - f_bin = stats.binned_statistic_2d(x, y, x, bins=(Ne, Nn)) - - index = f_bin.binnumber - - ind = np.unique(index) - - zo = z.copy() - - for i in range(len(ind)): - - # index for each bin - idx, = np.where(index == ind[i]) - - zb = z[idx] - - if len(zb[~np.isnan(zb)]) == 0: - continue - - dh = zb - np.nanmedian(zb) - - foo = np.abs(dh) > n_sigma * np.nanstd(dh) - - zb[foo] = np.nan - - zo[idx] = zb - - return zo - - -def interp2d(x, y, z, xi, yi, **kwargs): - """ - Raster to point interpolation based on - scipy.ndimage import map_coordinates - - :param x: x-coord. in 2D (m) - :param y: x-coord. in 2D (m) - :param z: values in 2D - :param xi: interp. point in x (m) - :param yi: interp. point in y (m) - :param kwargs: see map_coordinates - :return: array of interp. values - """ - - x = np.flipud(x) - y = np.flipud(y) - z = np.flipud(z) - - x = x[0,:] - y = y[:,0] - - nx, ny = x.size, y.size - - x_s, y_s = x[1] - x[0], y[1] - y[0] - - if np.size(xi) == 1 and np.size(yi) > 1: - xi = xi * ones(yi.size) - elif np.size(yi) == 1 and np.size(xi) > 1: - yi = yi * ones(xi.size) - - xp = (xi - x[0]) * (nx - 1) / (x[-1] - x[0]) - yp = (yi - y[0]) * (ny - 1) / (y[-1] - y[0]) - - coord = np.vstack([yp, xp]) - - zi = map_coordinates(z, coord, **kwargs) - - return zi - - -def tiffread(ifile): - """ - Reading tif-file to memory - - :param ifile: path+name of tif file - :return: X, Y, Z, dx, dy and proj - """ - - file = gdal.Open(ifile, GA_ReadOnly) - metaData = file.GetMetadata() - projection = file.GetProjection() - src = osr.SpatialReference() - src.ImportFromWkt(projection) - proj = src.ExportToWkt() - - Nx = file.RasterXSize - Ny = file.RasterYSize - - trans = file.GetGeoTransform() - - dx = trans[1] - dy = trans[5] - - Xp = np.arange(Nx) - Yp = np.arange(Ny) - - (Xp, Yp) = np.meshgrid(Xp, Yp) - - X = trans[0] + (Xp + 0.5) * trans[1] + (Yp + 0.5) * trans[2] - Y = trans[3] + (Xp + 0.5) * trans[4] + (Yp + 0.5) * trans[5] - - band = file.GetRasterBand(1) - - Z = band.ReadAsArray() - - dx = np.abs(dx) - dy = np.abs(dy) - - return X, Y, Z, dx, dy, proj - - -def tiffwrite(ofile, X, Y, Z, dx, dy, proj, otype='float'): - """ - Writing raster to a tif-file - - :param ofile: name of ofile - :param X: x-coord of raster (2D) - :param Y: y-coord of raster (2D) - :param Z: values (2D) - :param dx: grid-spacing x - :param dy: grid-spacing y - :param proj: projection (epsg number) - :param dtype: save as 'int' or 'float' - :return: written file to memory - """ - - proj = int(proj) - - N, M = Z.shape - - driver = gdal.GetDriverByName("GTiff") - - if otype == 'int': - datatype = gdal.GDT_Int32 - - if otype == 'float': - datatype = gdal.GDT_Float32 - - ds = driver.Create(ofile, M, N, 1, datatype) - - src = osr.SpatialReference() - - src.ImportFromEPSG(proj) - - ulx = np.min(np.min(X)) - 0.5 * dx - - uly = np.max(np.max(Y)) + 0.5 * dy - - geotransform = [ulx, dx, 0, uly, 0, -dy] - - ds.SetGeoTransform(geotransform) - - ds.SetProjection(src.ExportToWkt()) - - ds.GetRasterBand(1).SetNoDataValue(np.nan) - - ds.GetRasterBand(1).WriteArray(Z) - - ds = None - - -def binning(x, y, xmin=None, xmax=None, dx=1 / 12., - window=3 / 12., interp=False, median=False): - """Time-series binning (w/overlapping windows). - - Args: - x,y: time and value of time series. - xmin,xmax: time span of returned binned series. - dx: time step of binning. - window: size of binning window. - interp: interpolate binned values to original x points. - """ - if xmin is None: - xmin = np.nanmin(x) - if xmax is None: - xmax = np.nanmax(x) - - steps = np.arange(xmin, xmax, dx) # time steps - bins = [(ti, ti + window) for ti in steps] # bin limits - - N = len(bins) - yb = np.full(N, np.nan) - xb = np.full(N, np.nan) - eb = np.full(N, np.nan) - nb = np.full(N, np.nan) - sb = np.full(N, np.nan) - - for i in range(N): - - t1, t2 = bins[i] - idx, = np.where((x >= t1) & (x <= t2)) - - if len(idx) == 0: - xb[i] = 0.5 * (t1 + t2) - continue - - ybv = y[idx] - - if median: - yb[i] = np.nanmedian(ybv) - else: - yb[i] = np.nanmean(ybv) - - xb[i] = 0.5 * (t1 + t2) - eb[i] = mad_std(ybv) - nb[i] = np.sum(~np.isnan(ybv)) - sb[i] = np.sum(ybv) - - if interp: - try: - yb = np.interp(x, xb, yb) - eb = np.interp(x, xb, eb) - sb = np.interp(x, xb, sb) - xb = x - except: - pass - - return xb, yb, eb, nb, sb - - -def hampel_filter1d(x, k, t0=3): - """ - Hampel-filter for outlier editing - - :param x: values - :param k: window size (int) - :param t0: sigma threshold value - :return: filtered array with nan's - """ - - x = np.pad(x, k, 'constant', constant_values=9999) - x[x == 9999] = np.nan - n = len(x) - y = x.copy() - L = 1.4826 - - for i in range((k + 1),(n - k)): - if np.isnan(x[(i - k):(i + k+1)]).all(): - continue - x0 = np.nanmedian(x[(i - k):(i + k+1)]) - S0 = L * np.nanmedian(np.abs(x[(i - k):(i + k+1)] - x0)) - - if np.abs(x[i] - x0) > t0 * S0: - y[i] = np.nan - - y = y[k:-k] - - return y - - -def sgolay1d(h, window=3, order=1, deriv=0, dt=1.0, mode="nearest", time=None): - """Savitztky-Golay filter with support for NaNs. - - If time is given, interpolate NaNs otherwise pad w/zeros. - If time is given, calculate dt as t[1]-t[0]. - - Args: - dt (int): spacing between samples (for correct units). - - Notes: - Works with numpy, pandas and xarray objects. - - """ - if isinstance(h, (pd.Series, xr.DataArray)): - h = h.values - if isinstance(time, (pd.Series, xr.DataArray)): - time = time.values - - _h = h.copy() - (i_nan,) = np.where(np.isnan(_h)) - (i_valid,) = np.where(np.isfinite(_h)) - - if i_valid.size < 5: - return _h - elif time is not None: - _h[i_nan] = np.interp(time[i_nan], time[i_valid], _h[i_valid]) - dt = np.abs(time[1] - time[0]) - else: - _h[i_nan] = 0 - - return signal.savgol_filter(_h, window, order, deriv, delta=dt, mode=mode) - - -def sgolay2d(z, window_size, order, derivative=None): - """Two dimensional data smoothing and least-square gradient estimate. - - Code from: - http://scipy-cookbook.readthedocs.io/items/SavitzkyGolay.html - - Reference: - A. Savitzky, M. J. E. Golay, Smoothing and Differentiation of - Data by Simplified Least Squares Procedures. Analytical - Chemistry, 1964, 36 (8), pp 1627-1639. - - """ - # number of terms in the polynomial expression - # TODO: Double check this (changed for Py3) - n_terms = (order + 1) * (order + 2) // 2 - - if window_size % 2 == 0: - raise ValueError("window_size must be odd") - - if window_size ** 2 < n_terms: - raise ValueError("order is too high for the window size") - - half_size = window_size // 2 - - # exponents of the polynomial. - # p(x,y) = a0 + a1*x + a2*y + a3*x^2 + a4*y^2 + a5*x*y + ... - # this line gives a list of two item tuple. Each tuple contains - # the exponents of the k-th term. First element of tuple is for x - # second element for y. - # Ex. exps = [(0,0), (1,0), (0,1), (2,0), (1,1), (0,2), ...] - exps = [(k - n, n) for k in range(order + 1) for n in range(k + 1)] - - # coordinates of points - ind = np.arange(-half_size, half_size + 1, dtype=np.float64) - dx = np.repeat(ind, window_size) - dy = np.tile(ind, [window_size, 1]).reshape(window_size ** 2,) - - # build matrix of system of equation - A = np.empty((window_size ** 2, len(exps))) - - for i, exp in enumerate(exps): - A[:, i] = (dx ** exp[0]) * (dy ** exp[1]) - - # pad input array with appropriate values at the four borders - new_shape = z.shape[0] + 2 * half_size, z.shape[1] + 2 * half_size - Z = np.zeros((new_shape)) - # top band - band = z[0, :] - Z[:half_size, half_size:-half_size] = band - np.abs( - np.flipud(z[1 : half_size + 1, :]) - band - ) - # bottom band - band = z[-1, :] - Z[-half_size:, half_size:-half_size] = band + np.abs( - np.flipud(z[-half_size - 1 : -1, :]) - band - ) - # left band - band = np.tile(z[:, 0].reshape(-1, 1), [1, half_size]) - Z[half_size:-half_size, :half_size] = band - np.abs( - np.fliplr(z[:, 1 : half_size + 1]) - band - ) - # right band - band = np.tile(z[:, -1].reshape(-1, 1), [1, half_size]) - Z[half_size:-half_size, -half_size:] = band + np.abs( - np.fliplr(z[:, -half_size - 1 : -1]) - band - ) - # central band - Z[half_size:-half_size, half_size:-half_size] = z - - # top left corner - band = z[0, 0] - Z[:half_size, :half_size] = band - np.abs( - np.flipud(np.fliplr(z[1 : half_size + 1, 1 : half_size + 1])) - band - ) - # bottom right corner - band = z[-1, -1] - Z[-half_size:, -half_size:] = band + np.abs( - np.flipud(np.fliplr(z[-half_size - 1 : -1, -half_size - 1 : -1])) - - band - ) - - # top right corner - band = Z[half_size, -half_size:] - Z[:half_size, -half_size:] = band - np.abs( - np.flipud(Z[half_size + 1 : 2 * half_size + 1, -half_size:]) - band - ) - # bottom left corner - band = Z[-half_size:, half_size].reshape(-1, 1) - Z[-half_size:, :half_size] = band - np.abs( - np.fliplr(Z[-half_size:, half_size + 1 : 2 * half_size + 1]) - band - ) - - # solve system and convolve - - if derivative is None: - m = np.linalg.pinv(A)[0].reshape((window_size, -1)) - - return signal.fftconvolve(Z, m, mode="valid") - elif derivative == "col": - c = np.linalg.pinv(A)[1].reshape((window_size, -1)) - - return signal.fftconvolve(Z, -c, mode="valid") - elif derivative == "row": - r = np.linalg.pinv(A)[2].reshape((window_size, -1)) - - return signal.fftconvolve(Z, -r, mode="valid") - elif derivative == "both": - c = np.linalg.pinv(A)[1].reshape((window_size, -1)) - r = np.linalg.pinv(A)[2].reshape((window_size, -1)) - - return ( - signal.fftconvolve(Z, -r, mode="valid"), - signal.fftconvolve(Z, -c, mode="valid"), - ) - -# Some edge test cases (for the 3-km grid) -test_ij_3km = [ - (845, 365), # 0 PIG Floating 1 - (831, 364), # 1 PIG Floating 2 - (1022, 840), # 2 CS-2 only 1 - (970, 880), # 3 CS-2 only 2 - (100, 1170), # 4 fig1 large peaks at mission overlaps - (100, 766), # 5 fig2 peak at mission overlap - (7, 893), # 6 step change at beguining - (8, 892), # 7 with hole - (9, 889), # 8 with large hole - (11, 893), # 9 step in divergence -] diff --git a/notebooks/xover.py b/notebooks/xover.py deleted file mode 100644 index d34c8a1..0000000 --- a/notebooks/xover.py +++ /dev/null @@ -1,888 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -import glob -import numpy as np -import pyproj -import h5py -import argparse -import warnings -import matplotlib.pyplot as plt -from scipy.interpolate import InterpolatedUnivariateSpline -from datetime import datetime -from scipy import stats -from mpl_toolkits.axes_grid1.inset_locator import inset_axes - -""" - -Program for computing satellite crossovers from ascending and -descending orbits using linear or cubic interpolation. - -The program takes as input two files separated into asc. and des. orbits -with a minimum a number of variables: orbit number, lon ,lat, time and -height. The user can provide three extra variables if needed. For radar -this might be waveform parameters needed to perform account for changed in -the scattering regime. - -The software uses internal tiling to speed up computation of the crossovers, -with dimensions specified by the user. It can further process data divided -into external tiles provided by "tile.py". To further speed up processing the -user can downsample the tracks. This allows for a faster computation of the -crossing point, but the difference is computed using the native sampling. - -Notes: - For external tile processing please use "tile.py" with the same extent - for the A and D files. This as the program uses the tile numbering to - determine which of the tiles should be crossed together. - - When running in external tile-mode the saved file with crossovers - will be appended with "_XOVERS_AD/DA". Please use "_A" or "_D" in the - filename to indicate Asc or Des tracks when running in tile mode. - -Example: - - python xover.py a.h5 d.h5 -o xover.h5 -r 350 -p 3031 -d 100 -k 1 1\ - -m linear -v orb lon lat time height dum dum dum -b 10 - - python xover.py ./tiles/*_a.h5 ./tiles/*_d.h5 -r 350 -p 3031 -d 100 -k\ - 1 1 -m linear -v orb lon lat time height dum dum dum -f -b 10 - -Credits: - captoolkit - JPL Cryosphere Altimetry Processing Toolkit - - Johan Nilsson (johan.nilsson@jpl.nasa.gov) - Fernando Paolo (paolofer@jpl.nasa.gov) - Alex Gardner (alex.s.gardner@jpl.nasa.gov) - - Jet Propulsion Laboratory, California Institute of Technology - -""" - -# Ignore all warnings -warnings.filterwarnings("ignore") - -def get_args(): - """ Get command-line arguments. """ - parser = argparse.ArgumentParser( - description='Program for computing satellite/airborne crossovers.') - parser.add_argument( - 'input', metavar='ifile', type=str, nargs=2, - help='name of two input files to cross (HDF5)') - parser.add_argument( - '-o', metavar='ofile', dest='output', type=str, nargs=1, - help='name of output file (HDF5)', - default=[None]) - parser.add_argument( - '-r', metavar=('radius'), dest='radius', type=float, nargs=1, - help='maximum interpolation distance from crossing location (m)', - default=[350],) - parser.add_argument( - '-p', metavar=('epsg_num'), dest='proj', type=str, nargs=1, - help=('projection: EPSG number (AnIS=3031, GrIS=3413)'), - default=['4326'],) - parser.add_argument( - '-d', metavar=('tile_size'), dest='dxy', type=int, nargs=1, - help='tile size (km)', - default=[None],) - parser.add_argument( - '-k', metavar=('na','nd'), dest='nres', type=int, nargs=2, - help='along-track subsampling every k:th pnt for each file', - default=[1],) - parser.add_argument( - '-b', metavar=('buffer'), dest='buff', type=int, nargs=1, - help=('tile buffer (km)'), - default=[0],) - parser.add_argument( - '-m', metavar=None, dest='mode', type=str, nargs=1, - help='interpolation method, "linear" or "cubic"', - choices=('linear', 'cubic'), default=['linear'],) - parser.add_argument( - '-v', metavar=('o','x','y','t','h','b','l','t'), dest='vnames', type=str, nargs=8, - help=('main vars: names if HDF5, orbit/lon/lat/time/height/bs/lew/tes'), - default=[None],) - parser.add_argument( - '-t', metavar=('t1','t2'), dest='tspan', type=float, nargs=2, - help='only compute crossovers for given time span', - default=[None,None],) - parser.add_argument( - '-f', dest='tile', action='store_true', - help=('run in tile mode'), - default=False) - parser.add_argument( - '-q', dest='plot', action='store_true', - help=('plot for inspection'), - default=False) - parser.add_argument( - '-i', dest='diff', action='store_true', - help=('do not interpolate vars just take diff'), - default=False) - - return parser.parse_args() - - -def intersect(x_down, y_down, x_up, y_up): - """ Find orbit crossover locations. - Link to algorithm - - https://stackoverflow.com/questions/ - 17928452/find-all-intersections-of- - xy-data-point-graph-with-numpy - - """ - p = np.column_stack((x_down, y_down)) - q = np.column_stack((x_up, y_up)) - - (p0, p1, q0, q1) = p[:-1], p[1:], q[:-1], q[1:] - rhs = q0 - p0[:, np.newaxis, :] - - mat = np.empty((len(p0), len(q0), 2, 2)) - mat[..., 0] = (p1 - p0)[:, np.newaxis] - mat[..., 1] = q0 - q1 - mat_inv = -mat.copy() - mat_inv[..., 0, 0] = mat[..., 1, 1] - mat_inv[..., 1, 1] = mat[..., 0, 0] - - det = mat[..., 0, 0] * mat[..., 1, 1] - mat[..., 0, 1] * mat[..., 1, 0] - mat_inv /= det[..., np.newaxis, np.newaxis] - - import numpy.core.umath_tests as ut - - params = ut.matrix_multiply(mat_inv, rhs[..., np.newaxis]) - intersection = np.all((params >= 0) & (params <= 1), axis=(-1, -2)) - p0_s = params[intersection, 0, :] * mat[intersection, :, 0] - - return p0_s + p0[np.where(intersection)[0]] - - -def transform_coord(proj1, proj2, x, y): - """ Transform coordinates from proj1 to proj2 (EPSG num). """ - - # Set full EPSG projection strings - proj1 = pyproj.Proj("+init=EPSG:"+str(proj1)) - proj2 = pyproj.Proj("+init=EPSG:"+str(proj2)) - - # Convert coordinates - return pyproj.transform(proj1, proj2, x, y) - - -def get_bboxs_old(xmin, xmax, ymin, ymax, dxy): - """ - Define blocks (bbox) for speeding up the processing. - - Args: - xmin/xmax/ymin/ymax: must be in grid projection: stereographic (m). - dxy: grid-cell size. - """ - # Number of tile edges on each dimension - Nns = int(np.abs(ymax - ymin) / dxy) + 1 - New = int(np.abs(xmax - xmin) / dxy) + 1 - - # Coord of tile edges for each dimension - xg = np.linspace(xmin, xmax, New) - yg = np.linspace(ymin, ymax, Nns) - - # Vector of bbox for each cell - bboxs = [(w,e,s,n) for w,e in zip(xg[:-1], xg[1:]) - for s,n in zip(yg[:-1], yg[1:])] - del xg, yg - - return bboxs - - -def get_bboxs(x, y, xmin, xmax, ymin, ymax, dxy, buff): - """ - Define blocks (bbox) for speeding up the processing. - - Args: - xmin/xmax/ymin/ymax: must be in grid projection: stereographic (m). - dxy: grid-cell size. - """ - - # Number of tile edges on each dimension - Nns = int(np.abs(ymax - ymin) / dxy) + 1 - New = int(np.abs(xmax - xmin) / dxy) + 1 - - # Coord of tile edges for each dimension - xg = np.linspace(xmin-buff, xmax+buff, New) - yg = np.linspace(ymin-buff, ymax+buff, Nns) - - # Indicies for each grid-cell - bboxs = stats.binned_statistic_2d(x, y, np.ones(x.shape),'count', bins=[xg,yg]).binnumber - - return bboxs - -def mad_std(x, axis=None): - """ Robust standard deviation (using MAD). """ - return 1.4826 * np.nanmedian(np.abs(x - np.nanmedian(x, axis)), axis) - - -def interp1D(x, y, xi, n=1): - """ 1D interpolation """ - - # Sort data - idx = np.argsort(x) - - # Sort arrays - x, y = x[idx], y[idx] - - # Create interpolator - Fi = InterpolatedUnivariateSpline(x, y, k=n) - - # Interpolated value - yi = Fi(xi) - - return yi - -def tile_num(fname): - """ Extract tile number from file name. """ - l = os.path.splitext(fname)[0].split('_') # fname -> list - i = l.index('tile') - return int(l[i+1]) - -def match_tiles(str1,str2,key): - """ Matches tile indices """ - - # Get file names - files1 = glob.glob(str1) - files2 = glob.glob(str2) - - # Create output list - f1out = [] - f2out = [] - - # Loop trough files-1 - for file1 in files1: - - # Get tile index - f1 = tile_num(file1) - - # Loop trough files-2 - for file2 in files2: - - # Get tile index - f2 = tile_num(file2) - - # Check if tiles have same index - if f1 == f2: - - # Save if true - f1out.append(file1) - f2out.append(file2) - break - - return f1out, f2out - -# Read in parameters -args = get_args() -ifiles = args.input[:] -ofile_ = args.output[0] -radius = args.radius[0] -proj = args.proj[0] -dxy = args.dxy[0] -nres_a = args.nres[0] -nres_d = args.nres[1] -buff = args.buff[0] -mode = args.mode[0] -vnames = args.vnames[:] -tspan = args.tspan[:] -tile = args.tile -plot = args.plot -diff = args.diff - -print('parameters:') -for arg in vars(args).items(): print(arg) - -# Get variable names -ovar, xvar, yvar, tvar, zvar, bvar, lvar, svar = vnames - -# Create output names -oovar_a = ovar+'_1' -oovar_d = ovar+'_2' -oxvar_x = xvar -oyvar_x = yvar -otvar_a = tvar+'_1' -otvar_d = tvar+'_2' -otvar_x = 'd'+tvar -ozvar_a = zvar+'_1' -ozvar_d = zvar+'_2' -ozvar_x = 'd'+zvar - -obvar_a = bvar+'_1' -obvar_d = bvar+'_2' -obvar_x = 'd'+bvar -olvar_a = lvar+'_1' -olvar_d = lvar+'_2' -olvar_x = 'd'+lvar -osvar_a = svar+'_1' -osvar_d = svar+'_2' -osvar_x = 'd'+svar - -# Test names -if ozvar_x == osvar_x or ozvar_x == obvar_x or ozvar_x == olvar_x: - print("****************************************************************") - print("Extra parameters can't have the same name as the main parameter!") - print("****************************************************************") - sys.exit() - -# Test for stereographic -if proj != "4326": - - # Convert to meters - dxy *= 1e3 - -def main(ifile1, ifile2): - """ Find and compute crossover values. """ - - # Start time of program - startTime = datetime.now() - - print('crossing files:', ifile1, ifile2, '...') - - # Load all 1d variables needed - with h5py.File(ifile1, 'r') as f1, \ - h5py.File(ifile2, 'r') as f2: - - # File 1 - orbit1 = f1[ovar][:] - lon1 = f1[xvar][:] - lat1 = f1[yvar][:] - time1 = f1[tvar][:] - height1 = f1[zvar][:] - bs1 = f1[bvar][:] if bvar in f1 else np.zeros(lon1.shape) - lew1 = f1[lvar][:] if lvar in f1 else np.zeros(lon1.shape) - tes1 = f1[svar][:] if svar in f1 else np.zeros(lon1.shape) - - # File 2 - orbit2 = f2[ovar][:] - lon2 = f2[xvar][:] - lat2 = f2[yvar][:] - time2 = f2[tvar][:] - height2 = f2[zvar][:] - bs2 = f2[bvar][:] if bvar in f2 else np.zeros(lon2.shape) - lew2 = f2[lvar][:] if lvar in f2 else np.zeros(lon2.shape) - tes2 = f2[svar][:] if svar in f2 else np.zeros(lon2.shape) - - # File 1 - orbit1 = orbit1[np.isfinite(height1)] - lon1 = lon1[np.isfinite(height1)] - lat1 = lat1[np.isfinite(height1)] - time1 = time1[np.isfinite(height1)] - bs1 = bs1[np.isfinite(height1)] - lew1 = lew1[np.isfinite(height1)] - tes1 = tes1[np.isfinite(height1)] - height1 = height1[np.isfinite(height1)] - - # File 2 - orbit2 = orbit2[np.isfinite(height2)] - lon2 = lon2[np.isfinite(height2)] - lat2 = lat2[np.isfinite(height2)] - time2 = time2[np.isfinite(height2)] - bs2 = bs2[np.isfinite(height2)] - lew2 = lew2[np.isfinite(height2)] - tes2 = tes2[np.isfinite(height2)] - height2 = height2[np.isfinite(height2)] - - # Set flags for extra parameters - if np.all(bs1 == 0): - flag_bs = False - else: - flag_bs = True - if np.all(lew1 == 0): - flag_le = False - else: - flag_le = True - if np.all(tes1 == 0): - flag_ts = False - else: - flag_ts = True - - # If time span given, filter out invalid data - if tspan[0] != None: - - t1, t2 = tspan - - idx, = np.where((time1 >= t1) & (time1 <= t2)) - orbit1 = orbit1[idx] - lon1 = lon1[idx] - lat1 = lat1[idx] - time1 = time1[idx] - height1 = height1[idx] - bs1 = bs1[idx] - lew1 = lew1[idx] - tes1 = tes1[idx] - - idx, = np.where((time2 >= t1) & (time2 <= t2)) - orbit2 = orbit2[idx] - lon2 = lon2[idx] - lat2 = lat2[idx] - time2 = time2[idx] - height2 = height2[idx] - bs2 = bs2[idx] - lew2 = lew2[idx] - tes2 = tes2[idx] - - if len(time1) < 3 or len(time2) < 3: - print('no points within time-span!') - sys.exit() - - # Transform to wanted coordinate system - (xp1, yp1) = transform_coord(4326, proj, lon1, lat1) - (xp2, yp2) = transform_coord(4326, proj, lon2, lat2) - - # Time limits: the largest time span (yr) - tmin = min(np.nanmin(time1), np.nanmin(time2)) - tmax = max(np.nanmax(time1), np.nanmax(time2)) - - # Boundary limits: the smallest spatial domain (m) - xmin = max(np.nanmin(xp1), np.nanmin(xp2)) - xmax = min(np.nanmax(xp1), np.nanmax(xp2)) - ymin = max(np.nanmin(yp1), np.nanmin(yp2)) - ymax = min(np.nanmax(yp1), np.nanmax(yp2)) - - # Interpolation type and number of needed points - if mode == "linear": - - # Linear interpolation - nobs = 2 - order = 1 - - else: - - # Cubic interpolation - nobs = 6 - order = 3 - - # Tiling option - "on" or "off" - if dxy: - - print('tileing asc/des data...') - - # Get bounding box - bboxs1 = get_bboxs(xp1, yp1, xmin, xmax, ymin, ymax, dxy, buff*1e3) - bboxs2 = get_bboxs(xp2, yp2, xmin, xmax, ymin, ymax, dxy, buff*1e3) - - # Copy box for conviniance - bboxs = bboxs1 - - else: - - # Get bounding box from full domain - bboxs = [(xmin, xmax, ymin, ymax)] - - # Start time of program - startTime = datetime.now() - - # Initiate output container - out = [] - - # Initiate xover counter - i_xover = 0 - - # Counter - ki = 0 - - # Unique boxes - ibox = np.unique(bboxs) - - print('computing crossovers ...') - - # Loop through each sub-tile - for k in ibox: - - # Get the tile indices - idx1, = np.where(bboxs1 == k) - idx2, = np.where(bboxs2 == k) - - # Extract tile data from each set - orbits1 = orbit1[idx1] - lons1 = lon1[idx1] - lats1 = lat1[idx1] - x1 = xp1[idx1] - y1 = yp1[idx1] - h1 = height1[idx1] - t1 = time1[idx1] - b1 = bs1[idx1] - l1 = lew1[idx1] - s1 = tes1[idx1] - - orbits2 = orbit2[idx2] - lons2 = lon2[idx2] - lats2 = lat2[idx2] - x2 = xp2[idx2] - y2 = yp2[idx2] - h2 = height2[idx2] - t2 = time2[idx2] - b2 = bs2[idx2] - l2 = lew2[idx2] - s2 = tes2[idx2] - - # Get unique orbits - orb_ids1 = np.unique(orbits1) - orb_ids2 = np.unique(orbits2) - - # Test if tile has no crossovers - if len(orbits1) == 0 or len(orbits2) == 0: - - # Go to next track - continue - - # Loop through orbits from file #1 - for orb_id1 in orb_ids1: - - # Index for single ascending orbit - i_trk1 = orbits1 == orb_id1 - - # Extract points from single orbit (a track) - xa = x1[i_trk1] - ya = y1[i_trk1] - ta = t1[i_trk1] - ha = h1[i_trk1] - ba = b1[i_trk1] - la = l1[i_trk1] - sa = s1[i_trk1] - - # Loop through tracks from file #2 - for orb_id2 in orb_ids2: - - # Index for single descending orbit - i_trk2 = orbits2 == orb_id2 - - # Extract single orbit - xb = x2[i_trk2] - yb = y2[i_trk2] - tb = t2[i_trk2] - hb = h2[i_trk2] - bb = b2[i_trk2] - lb = l2[i_trk2] - sb = s2[i_trk2] - - # Test length of vector - if len(xa) < 3 or len(xb) < 3: continue - - # Compute exact crossing location - cxy_main = intersect(xa[::nres_a], ya[::nres_a], \ - xb[::nres_d], yb[::nres_d]) - - # Test again for crossing - if len(cxy_main) == 0: continue - - """ - SUPPORT SHOULD BE ADDED FOR MULTIPLE CROSSOVERS FOR SAME TRACK! - - """ - - # Extract crossing coordinates - xi = cxy_main[0][0] - yi = cxy_main[0][1] - - # Get start coordinates of orbits - xa0 = xa[0] - ya0 = ya[0] - xb0 = xb[0] - yb0 = yb[0] - - # Compute distance from crossing node to each arc - da = (xa - xi) * (xa - xi) + (ya - yi) * (ya - yi) - db = (xb - xi) * (xb - xi) + (yb - yi) * (yb - yi) - - # Sort according to distance - Ida = np.argsort(da) - Idb = np.argsort(db) - - # Sort arrays - A - xa = xa[Ida] - ya = ya[Ida] - ta = ta[Ida] - ha = ha[Ida] - da = da[Ida] - ba = ba[Ida] - la = la[Ida] - sa = sa[Ida] - - # Sort arrays - B - xb = xb[Idb] - yb = yb[Idb] - tb = tb[Idb] - hb = hb[Idb] - db = db[Idb] - bb = bb[Idb] - lb = lb[Idb] - sb = sb[Idb] - - # Get distance of four closest observations - dab = np.vstack((da[[0, 1]], db[[0, 1]])) - - # Test if any point is too far away - if np.any(np.sqrt(dab) > radius): - continue - # Test if enough obs. are available for interpolation - elif (len(xa) < nobs) or (len(xb) < nobs): - continue - else: - # Accepted - pass - - # Compute distance again from the furthest point - da0 = (xa - xa0) * (xa - xa0) + (ya - ya0) * (ya - ya0) - db0 = (xb - xb0) * (xb - xb0) + (yb - yb0) * (yb - yb0) - - # Compute distance again from the furthest point - dai = (xi - xa0) * (xi - xa0) + (yi - ya0) * (yi - ya0) - dbi = (xi - xb0) * (xi - xb0) + (yi - yb0) * (yi - yb0) - - # Interpolate height to crossover location - hai = interp1D(da0[0:nobs], ha[0:nobs], dai, order) - hbi = interp1D(db0[0:nobs], hb[0:nobs], dbi, order) - - # Interpolate time to crossover location - tai = interp1D(da0[0:nobs], ta[0:nobs], dai, order) - tbi = interp1D(db0[0:nobs], tb[0:nobs], dbi, order) - - # Test interpolate time values - if (tai > tmax) or (tai < tmin) or \ - (tbi > tmax) or (tbi < tmin): - continue - - # Create output array - out_i = np.full(20, np.nan) - - # Compute differences and save parameters - out_i[0] = xi - out_i[1] = yi - out_i[2] = hai - hbi - out_i[3] = tai - tbi - out_i[4] = tai - out_i[5] = tbi - out_i[6] = hai - out_i[7] = hbi - out_i[8] = (hai - hbi) / (tai - tbi) - out_i[18] = orb_id1 - out_i[19] = orb_id2 - - # Test for more parameters to difference - if flag_bs: - - if diff is True: - - # Save paramters - bai = ba[0] - bbi = bb[0] - - # Save difference - out_i[9] = bai - bbi - out_i[10] = bai - out_i[11] = bbi - - else: - - # Interpolate sigma0 to crossover location - bai = interp1D(da0[0:nobs], ba[0:nobs], order) - bbi = interp1D(db0[0:nobs], bb[0:nobs], order) - - # Save difference - out_i[9] = bai - bbi - out_i[10] = bai - out_i[11] = bbi - - if flag_le: - - if diff is True: - - # Get paramters - lai = la[0] - lbi = lb[0] - - # Save difference - out_i[12] = lai - lbi - out_i[13] = lai - out_i[14] = lbi - - else: - - # Interpolate leading edge width to crossover location - lai = interp1D(da0[0:nobs], la[0:nobs], order) - lbi = interp1D(db0[0:nobs], lb[0:nobs], order) - - # Save difference - out_i[12] = lai - lbi - out_i[13] = lai - out_i[14] = lbi - - if flag_ts: - - if diff is True: - - # Get parameters - sai = sa[0] - sbi = sb[0] - - # Save difference - out_i[15] = sai - sbi - out_i[16] = sai - out_i[17] = sbi - - else: - - # Interpolate trailing edge slope to crossover location - sai = interp1D(da0[0:nobs], sa[0:nobs], order) - sbi = interp1D(db0[0:nobs], sb[0:nobs], order) - - # Save difference - out_i[15] = sai - sbi - out_i[16] = sai - out_i[17] = sbi - - # Add to list - out.append(out_i) - - # Operating on current tile - # print('tile:', ki, len(ibox)) - - # Update counter - ki += 1 - - # Change back to numpy array - out = np.asarray(out) - - # Remove invalid rows - out = out[~np.isnan(out[:,2]),:] - - # Test if output container is empty - if len(out) == 0: - print('no crossovers found!') - return - - # Remove the two id columns if they are empty - out = out[:,:-2] if np.isnan(out[:,-1]).all() else out - - # Copy ouput arrays - xs, ys = out[:,0].copy(), out[:,1].copy() - - # Transform coords back to lat/lon - out[:,0], out[:,1] = transform_coord(proj, '4326', out[:,0], out[:,1]) - - # Create output file name if not given - if ofile_ is None: - path, ext = os.path.splitext(ifile1) - if tile: - tilenum = str(tile_num(ifile1)) - else: - tilenum = '' - if ifile1.find('_A_') > 0: - fnam = '_XOVERS_AD_' - else: - fnam = '_XOVERS_DA_' - ofile = path + fnam + tilenum + ext - else: - ofile = ofile_ - - # Create h5 file - with h5py.File(ofile, 'w') as f: - - # Add standard parameters - f[oxvar_x] = out[:,0] - f[oyvar_x] = out[:,1] - f[ozvar_x] = out[:,2] - f[otvar_x] = out[:,3] - f[otvar_a] = out[:,4] - f[otvar_d] = out[:,5] - f[ozvar_a] = out[:,6] - f[ozvar_d] = out[:,7] - f[oovar_a] = out[:,18] - f[oovar_d] = out[:,19] - f['dhdt'] = out[:,8] - - # Add extra parameters - if flag_bs: - f[obvar_x] = out[:,9] - f[obvar_a] = out[:,10] - f[obvar_d] = out[:,11] - if flag_le: - f[olvar_x] = out[:,12] - f[olvar_a] = out[:,13] - f[olvar_d] = out[:,14] - if flag_ts: - f[osvar_x] = out[:,15] - f[osvar_a] = out[:,16] - f[osvar_d] = out[:,17] - - # Stat. variables - dh = out[:,2] - dt = out[:,3] - dhdt = out[:,8] - - # Compute statistics - med0 = np.around(np.median(dh[np.abs(dt)<=1./12]),3) - std0 = np.around(mad_std(dh[np.abs(dt)<=1./12]),3) - med1 = np.around(np.median(dhdt),3) - std1 = np.around(mad_std(dhdt),3) - - # Print some statistics to screen - print('') - print('execution time: ' + str(datetime.now() - startTime)) - print('number of crossovers found:',str(len(out))) - print('statistics -> mean:',med0,'std.dev:',std0, '(m) (dt<30d)') - print('statistics -> mean:',med1,'std.dev:',std1, '(dvar/yr)') - print('ofile name ->', ofile) - - if plot: - - # Some light filtering for plotting - io = np.abs(dh) < 3.0*mad_std(dh) - - gridsize = (3, 2) - fig = plt.figure(figsize=(12, 8)) - ax1 = plt.subplot2grid(gridsize, (0, 0), colspan=2, rowspan=2) - ax2 = plt.subplot2grid(gridsize, (2, 0)) - ax3 = plt.subplot2grid(gridsize, (2, 1)) - # Plot main difference variable - ax1.scatter(xs*1e-3,ys*1e-3,s=10,c=dh,cmap='jet',vmin=-20,vmax=20) - #plt.subplot(211) - ax2.plot(dt[io], dh[io], '.') - ax2.set_ylabel(ozvar_x) - ax2.set_xlabel(otvar_x) - #plt.subplot(212) - ax3.hist(dh[io],50) - ax3.set_ylabel('Frequency') - ax3.set_xlabel(ozvar_x) - #plt.subplots_adjust(hspace=.5) - plt.show() - -# -# Running main program! -# - -# Read file names -str1, str2 = ifiles - -# Check for tile mode -if tile: - - # Get matching tiles - files1, files2 = match_tiles(str1, str2, 'tile') - - # Loop trough tiles - for i in range(len(files1)): - - # Run main program - main(files1[i], files2[i]) - -# Run as single files -else: - - # File names - file1, file2 = str1, str2 - - # Run main program - main(file1, file2) - - - - - - - - - - diff --git a/readers/get_ATL03_x_atc.py b/readers/get_ATL03_x_atc.py deleted file mode 100644 index bbb812c..0000000 --- a/readers/get_ATL03_x_atc.py +++ /dev/null @@ -1,65 +0,0 @@ -import numpy as np - - -# Adapted from a notebook by Tyler Sutterly 6/14/2910 - - - -def get_ATL03_x_atc(IS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams): - # calculate the along-track and across-track coordinates for ATL03 photons - - Segment_ID = {} - Segment_Index_begin = {} - Segment_PE_count = {} - Segment_Distance = {} - Segment_Length = {} - - #-- background photon rate - background_rate = {} - - #-- for each input beam within the file - for gtx in sorted(IS2_atl03_beams): - #-- data and attributes for beam gtx - val = IS2_atl03_mds[gtx] - val['heights']['x_atc']=np.zeros_like(val['heights']['h_ph'])+np.NaN - val['heights']['y_atc']=np.zeros_like(val['heights']['h_ph'])+np.NaN - attrs = IS2_atl03_attrs[gtx] - #-- ATL03 Segment ID - Segment_ID[gtx] = val['geolocation']['segment_id'] - n_seg = len(Segment_ID[gtx]) - #-- first photon in the segment (convert to 0-based indexing) - Segment_Index_begin[gtx] = val['geolocation']['ph_index_beg'] - 1 - #-- number of photon events in the segment - Segment_PE_count[gtx] = val['geolocation']['segment_ph_cnt'] - #-- along-track distance for each ATL03 segment - Segment_Distance[gtx] = val['geolocation']['segment_dist_x'] - #-- along-track length for each ATL03 segment - Segment_Length[gtx] = val['geolocation']['segment_length'] - #-- Transmit time of the reference photon - delta_time = val['geolocation']['delta_time'] - - #-- iterate over ATL03 segments to calculate 40m means - #-- in ATL03 1-based indexing: invalid == 0 - #-- here in 0-based indexing: invalid == -1 - segment_indices, = np.nonzero((Segment_Index_begin[gtx][:-1] >= 0) & - (Segment_Index_begin[gtx][1:] >= 0)) - for j in segment_indices: - #-- index for segment j - idx = Segment_Index_begin[gtx][j] - #-- number of photons in segment (use 2 ATL03 segments) - c1 = np.copy(Segment_PE_count[gtx][j]) - c2 = np.copy(Segment_PE_count[gtx][j+1]) - cnt = c1 + c2 - #-- time of each Photon event (PE) - segment_delta_times = val['heights']['delta_time'][idx:idx+cnt] - #-- Photon event lat/lon and elevation (WGS84) - segment_heights = val['heights']['h_ph'][idx:idx+cnt] - segment_lats = val['heights']['lat_ph'][idx:idx+cnt] - segment_lons = val['heights']['lon_ph'][idx:idx+cnt] - #-- Along-track and Across-track distances - distance_along_X = np.copy(val['heights']['dist_ph_along'][idx:idx+cnt]) - distance_along_X[:c1] += Segment_Distance[gtx][j] - distance_along_X[c1:] += Segment_Distance[gtx][j+1] - distance_along_Y = np.copy(val['heights']['dist_ph_across'][idx:idx+cnt]) - val['heights']['x_atc'][idx:idx+cnt]=distance_along_X - val['heights']['y_atc'][idx:idx+cnt]=distance_along_Y \ No newline at end of file diff --git a/readers/read_HDF5_ATL03.py b/readers/read_HDF5_ATL03.py deleted file mode 100644 index 0d348a8..0000000 --- a/readers/read_HDF5_ATL03.py +++ /dev/null @@ -1,141 +0,0 @@ -import h5py -import numpy as np -import os -import re - -# Adapted from a notebook by Tyler Sutterly 6/14/2910 - - - -#-- PURPOSE: read ICESat-2 ATL03 HDF5 data files -def read_HDF5_ATL03(FILENAME, ATTRIBUTES=True, VERBOSE=False): - #-- Open the HDF5 file for reading - fileID = h5py.File(os.path.expanduser(FILENAME), 'r') - - #-- Output HDF5 file information - if VERBOSE: - print(fileID.filename) - print(list(fileID.keys())) - - #-- allocate python dictionaries for ICESat-2 ATL03 variables and attributes - IS2_atl03_mds = {} - IS2_atl03_attrs = {} if ATTRIBUTES else None - - #-- read each input beam within the file - IS2_atl03_beams = [k for k in fileID.keys() if bool(re.match('gt\d[lr]',k))] - for gtx in IS2_atl03_beams: - IS2_atl03_mds[gtx] = {} - IS2_atl03_mds[gtx]['heights'] = {} - IS2_atl03_mds[gtx]['geolocation'] = {} -# IS2_atl03_mds[gtx]['bckgrd_atlas'] = {} - IS2_atl03_mds[gtx]['geophys_corr'] = {} - #-- get each HDF5 variable - #-- ICESat-2 Measurement Group - for key,val in fileID[gtx]['heights'].items(): - IS2_atl03_mds[gtx]['heights'][key] = val[:] - #-- ICESat-2 Geolocation Group - for key,val in fileID[gtx]['geolocation'].items(): - IS2_atl03_mds[gtx]['geolocation'][key] = val[:] -# #-- ICESat-2 Background Photon Rate Group -# for key,val in fileID[gtx]['bckgrd_atlas'].items(): -# IS2_atl03_mds[gtx]['bckgrd_atlas'][key] = val[:] - #-- ICESat-2 Geophysical Corrections Group: Values for tides (ocean, - #-- solid earth, pole, load, and equilibrium), inverted barometer (IB) - #-- effects, and range corrections for tropospheric delays - for key,val in fileID[gtx]['geophys_corr'].items(): - IS2_atl03_mds[gtx]['geophys_corr'][key] = val[:] - - #-- Getting attributes of included variables - if ATTRIBUTES: - #-- Getting attributes of IS2_atl03_mds beam variables - IS2_atl03_attrs[gtx] = {} - IS2_atl03_attrs[gtx]['heights'] = {} - IS2_atl03_attrs[gtx]['geolocation'] = {} -# IS2_atl03_attrs[gtx]['bckgrd_atlas'] = {} - IS2_atl03_attrs[gtx]['geophys_corr'] = {} - IS2_atl03_attrs[gtx]['Atlas_impulse_response'] = {} - #-- Global Group Attributes - for att_name,att_val in fileID[gtx].attrs.items(): - IS2_atl03_attrs[gtx][att_name] = att_val - #-- ICESat-2 Measurement Group - for key,val in fileID[gtx]['heights'].items(): - IS2_atl03_attrs[gtx]['heights'][key] = {} - for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[gtx]['heights'][key][att_name]=att_val - #-- ICESat-2 Geolocation Group - for key,val in fileID[gtx]['geolocation'].items(): - IS2_atl03_attrs[gtx]['geolocation'][key] = {} - for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[gtx]['geolocation'][key][att_name]=att_val -# #-- ICESat-2 Background Photon Rate Group -# for key,val in fileID[gtx]['bckgrd_atlas'].items(): -# IS2_atl03_attrs[gtx]['bckgrd_atlas'][key] = {} -# for att_name,att_val in val.attrs.items(): -# IS2_atl03_attrs[gtx]['bckgrd_atlas'][key][att_name]=att_val - #-- ICESat-2 Geophysical Corrections Group - for key,val in fileID[gtx]['geophys_corr'].items(): - IS2_atl03_attrs[gtx]['geophys_corr'][key] = {} - for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[gtx]['geophys_corr'][key][att_name]=att_val - - #-- ICESat-2 spacecraft orientation at time - IS2_atl03_mds['orbit_info'] = {} - IS2_atl03_attrs['orbit_info'] = {} if ATTRIBUTES else None - for key,val in fileID['orbit_info'].items(): - IS2_atl03_mds['orbit_info'][key] = val[:] - #-- Getting attributes of group and included variables - if ATTRIBUTES: - #-- Global Group Attributes - for att_name,att_val in fileID['orbit_info'].attrs.items(): - IS2_atl03_attrs['orbit_info'][att_name] = att_val - #-- Variable Attributes - IS2_atl03_attrs['orbit_info'][key] = {} - for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs['orbit_info'][key][att_name] = att_val - - #-- number of GPS seconds between the GPS epoch (1980-01-06T00:00:00Z UTC) - #-- and ATLAS Standard Data Product (SDP) epoch (2018-01-01:T00:00:00Z UTC) - #-- Add this value to delta time parameters to compute full gps_seconds - #-- could alternatively use the Julian day of the ATLAS SDP epoch: 2458119.5 - #-- and add leap seconds since 2018-01-01:T00:00:00Z UTC (ATLAS SDP epoch) - IS2_atl03_mds['ancillary_data'] = {} - IS2_atl03_attrs['ancillary_data'] = {} if ATTRIBUTES else None - for key in ['atlas_sdp_gps_epoch']: - #-- get each HDF5 variable - IS2_atl03_mds['ancillary_data'][key] = fileID['ancillary_data'][key][:] - #-- Getting attributes of group and included variables - if ATTRIBUTES: - #-- Variable Attributes - IS2_atl03_attrs['ancillary_data'][key] = {} - for att_name,att_val in fileID['ancillary_data'][key].attrs.items(): - IS2_atl03_attrs['ancillary_data'][key][att_name] = att_val - - #-- get ATLAS impulse response variables for the transmitter echo path (TEP) - tep1,tep2 = ('atlas_impulse_response','tep_histogram') - IS2_atl03_mds[tep1] = {} - IS2_atl03_attrs[tep1] = {} if ATTRIBUTES else None - for pce in ['pce1_spot1','pce2_spot3']: - IS2_atl03_mds[tep1][pce] = {tep2:{}} - IS2_atl03_attrs[tep1][pce] = {tep2:{}} if ATTRIBUTES else None - #-- for each TEP variable - for key,val in fileID[tep1][pce][tep2].items(): - IS2_atl03_mds[tep1][pce][tep2][key] = val[:] - #-- Getting attributes of included variables - if ATTRIBUTES: - #-- Global Group Attributes - for att_name,att_val in fileID[tep1][pce][tep2].attrs.items(): - IS2_atl03_attrs[tep1][pce][tep2][att_name] = att_val - #-- Variable Attributes - IS2_atl03_attrs[tep1][pce][tep2][key] = {} - for att_name,att_val in val.attrs.items(): - IS2_atl03_attrs[tep1][pce][tep2][key][att_name] = att_val - - #-- Global File Attributes - if ATTRIBUTES: - for att_name,att_val in fileID.attrs.items(): - IS2_atl03_attrs[att_name] = att_val - - #-- Closing the HDF5 file - fileID.close() - #-- Return the datasets and variables - return (IS2_atl03_mds,IS2_atl03_attrs,IS2_atl03_beams) \ No newline at end of file diff --git a/results_0848.txt b/results_0848.txt deleted file mode 100644 index f091b14..0000000 --- a/results_0848.txt +++ /dev/null @@ -1,1770 +0,0 @@ -segment_length=2000,segment_step=200.0m,search_width=800m -x_atc_segment_middle,gt1l_veloc,gt1l_correlationValue,gt1r_veloc,gt1r_correlationValue,gt2l_veloc,gt2l_correlationValue,gt2r_veloc,gt2r_correlationValue,gt3l_veloc,gt3l_correlationValue,gt3r_veloc,gt3r_correlationValue -29140498.504,-482.28,0.92,-401.9,0.924,1527.21,0.929,1607.59,0.93,3215.18,0.878,3215.18,0.868 -29140698.504,0.0,0.94,-80.38,0.942,2170.24,0.923,2250.62,0.923,3215.18,0.852,3215.18,0.839 -29140898.504,321.52,0.95,321.52,0.949,2893.66,0.914,2974.04,0.914,3215.18,0.806,3215.18,0.787 -29141098.504,401.9,0.949,482.28,0.945,3215.18,0.91,3215.18,0.905,3215.18,0.736,3215.18,0.702 -29141298.504,964.55,0.94,884.17,0.934,3215.18,0.896,3215.18,0.881,nan,0.627,nan,0.583 -29141498.504,1366.45,0.925,1446.83,0.921,3215.18,0.861,3215.18,0.841,nan,0.452,nan,0.387 -29141698.504,1929.11,0.906,1929.11,0.907,3215.18,0.797,3215.18,0.778,nan,0.174,nan,0.184 -29141898.504,2491.76,0.892,2572.14,0.898,3215.18,0.702,3215.18,0.68,nan,0.204,nan,0.234 -29142098.504,3215.18,0.899,3215.18,0.907,nan,0.574,nan,0.55,nan,0.325,nan,0.357 -29142298.504,3215.18,0.915,3215.18,0.921,nan,0.456,nan,0.469,nan,0.449,nan,0.407 -29142498.504,3215.18,0.929,3215.18,0.932,nan,0.394,nan,0.406,nan,0.521,nan,0.363 -29142698.504,3215.18,0.934,3215.18,0.933,nan,0.431,nan,0.439,nan,0.582,nan,0.432 -29142898.504,3215.18,0.902,3215.18,0.895,nan,0.547,nan,0.542,nan,0.599,nan,0.529 -29143098.504,3215.18,0.844,3215.18,0.827,nan,0.639,nan,0.609,nan,0.584,nan,0.547 -29143298.504,3215.18,0.768,3215.18,0.737,-160.76,0.676,nan,0.641,nan,0.575,nan,0.64 -29143498.504,3215.18,0.653,-3215.18,0.668,-401.9,0.712,-884.17,0.692,nan,0.536,401.9,0.661 -29143698.504,-3215.18,0.753,-3215.18,0.784,-884.17,0.749,-562.66,0.744,nan,0.559,-2411.38,0.709 -29143898.504,-3215.18,0.853,-3215.18,0.879,-884.17,0.779,-884.17,0.781,241.14,0.668,401.9,0.77 -29144098.504,-3215.18,0.907,-3215.18,0.921,-3215.18,0.828,-884.17,0.812,241.14,0.734,321.52,0.815 -29144298.504,-3215.18,0.933,-3215.18,0.934,-3215.18,0.857,-1687.97,0.828,241.14,0.867,401.9,0.881 -29144498.504,-3215.18,0.932,-3215.18,0.928,-3215.18,0.862,-3215.18,0.84,241.14,0.874,401.9,0.897 -29144698.504,-3215.18,0.916,-3134.8,0.908,-3215.18,0.854,-3215.18,0.829,241.14,0.86,401.9,0.871 -29144898.504,-2411.38,0.9,-2411.38,0.895,-3215.18,0.84,-3215.18,0.803,241.14,0.82,401.9,0.861 -29145098.504,-1687.97,0.895,-1607.59,0.894,-3215.18,0.831,-3215.18,0.782,241.14,0.803,401.9,0.829 -29145298.504,-964.55,0.894,-884.17,0.899,-3215.18,0.831,-3215.18,0.768,241.14,0.756,562.66,0.748 -29145498.504,-562.66,0.885,-241.14,0.893,-3215.18,0.842,-3215.18,0.776,241.14,0.695,nan,0.648 -29145698.504,-160.76,0.871,321.52,0.879,-3215.18,0.859,-3215.18,0.8,nan,0.509,nan,0.473 -29145898.504,0.0,0.849,401.9,0.858,-3215.18,0.877,-3215.18,0.828,nan,0.311,nan,0.293 -29146098.504,321.52,0.828,643.04,0.835,-3215.18,0.887,-3215.18,0.852,nan,0.207,nan,0.191 -29146298.504,562.66,0.804,884.17,0.812,-3215.18,0.892,-3215.18,0.876,nan,0.296,nan,0.279 -29146498.504,723.41,0.781,1286.07,0.787,-3215.18,0.901,-3215.18,0.899,nan,0.55,nan,0.527 -29146698.504,1044.93,0.751,1768.35,0.754,-3215.18,0.91,-3215.18,0.913,-3215.18,0.685,-3215.18,0.668 -29146898.504,1848.73,0.717,2089.86,0.717,-3215.18,0.915,-3215.18,0.923,-3215.18,0.757,-2974.04,0.746 -29147098.504,-3215.18,0.71,-3215.18,0.691,-3215.18,0.921,-3215.18,0.931,-3215.18,0.803,-3215.18,0.789 -29147298.504,-3215.18,0.766,-3215.18,0.756,-3215.18,0.922,-3215.18,0.934,-3215.18,0.835,-3215.18,0.826 -29147498.504,-3215.18,0.815,-3215.18,0.817,-3215.18,0.915,-3215.18,0.929,-3215.18,0.858,-3215.18,0.849 -29147698.504,-3215.18,0.852,-3215.18,0.865,-3215.18,0.904,-3215.18,0.913,-3215.18,0.88,-3215.18,0.871 -29147898.504,-3215.18,0.88,-3215.18,0.893,-3215.18,0.891,-3215.18,0.898,-2893.66,0.89,-2893.66,0.88 -29148098.504,-3215.18,0.9,-3215.18,0.912,-3134.8,0.878,-3215.18,0.886,-2250.62,0.893,-2411.38,0.888 -29148298.504,-3215.18,0.907,-3215.18,0.919,-2813.28,0.866,-2813.28,0.873,-2089.86,0.897,-1768.35,0.891 -29148498.504,-3215.18,0.895,-3215.18,0.906,-2009.48,0.861,-2170.24,0.867,-1286.07,0.897,-1366.45,0.893 -29148698.504,-2491.76,0.88,-2491.76,0.89,-1446.83,0.856,-1607.59,0.863,-562.66,0.891,-562.66,0.888 -29148898.504,-1687.97,0.875,-1687.97,0.883,-723.41,0.853,-884.17,0.861,241.14,0.887,241.14,0.886 -29149098.504,-964.55,0.876,-964.55,0.882,-160.76,0.849,-321.52,0.857,562.66,0.883,803.79,0.883 -29149298.504,-401.9,0.882,-401.9,0.887,482.28,0.844,321.52,0.854,1286.07,0.884,1607.59,0.884 -29149498.504,160.76,0.887,80.38,0.889,1205.69,0.839,884.17,0.848,2009.48,0.889,1768.35,0.89 -29149698.504,562.66,0.884,401.9,0.885,1848.73,0.838,1527.21,0.846,2331.0,0.9,2491.76,0.902 -29149898.504,884.17,0.876,884.17,0.874,2572.14,0.842,2250.62,0.848,3134.8,0.913,3054.42,0.912 -29150098.504,1205.69,0.863,1286.07,0.861,3215.18,0.855,3054.42,0.859,3215.18,0.923,3215.18,0.923 -29150298.504,1687.97,0.848,1607.59,0.847,3215.18,0.866,3215.18,0.873,3215.18,0.931,3215.18,0.928 -29150498.504,2411.38,0.837,2331.0,0.838,3215.18,0.872,3215.18,0.881,3215.18,0.938,3215.18,0.933 -29150698.504,3215.18,0.837,3134.8,0.839,3215.18,0.873,3215.18,0.886,3215.18,0.947,3215.18,0.941 -29150898.504,3215.18,0.844,3215.18,0.849,3215.18,0.87,3215.18,0.883,3215.18,0.946,3215.18,0.934 -29151098.504,3215.18,0.849,3215.18,0.859,3215.18,0.861,3215.18,0.874,3215.18,0.94,3215.18,0.926 -29151298.504,3215.18,0.848,3215.18,0.859,3215.18,0.844,3215.18,0.857,3215.18,0.916,3215.18,0.89 -29151498.504,3215.18,0.836,3215.18,0.847,3215.18,0.819,3215.18,0.833,3215.18,0.873,3215.18,0.827 -29151698.504,3215.18,0.819,3215.18,0.828,3215.18,0.783,3215.18,0.797,3215.18,0.76,3215.18,0.698 -29151898.504,3215.18,0.792,3215.18,0.8,3215.18,0.738,3215.18,0.75,nan,0.627,-3215.18,0.709 -29152098.504,3215.18,0.742,3215.18,0.749,-3215.18,0.732,-3215.18,0.719,-3215.18,0.77,-3215.18,0.818 -29152298.504,3215.18,0.684,3215.18,0.684,-3215.18,0.782,-3215.18,0.773,-3215.18,0.875,-3215.18,0.898 -29152498.504,-3215.18,0.682,-3215.18,0.685,-3215.18,0.828,-3215.18,0.824,-3215.18,0.933,-3215.18,0.938 -29152698.504,-3215.18,0.729,-3215.18,0.735,-3215.18,0.864,-3215.18,0.865,-3215.18,0.962,-3215.18,0.96 -29152898.504,-3215.18,0.774,-3215.18,0.781,-3215.18,0.888,-3215.18,0.89,-3215.18,0.965,-3215.18,0.963 -29153098.504,-3215.18,0.82,-3215.18,0.824,-3215.18,0.898,-3215.18,0.902,-3215.18,0.964,-3215.18,0.958 -29153298.504,-3215.18,0.856,-3215.18,0.858,-3215.18,0.898,-3215.18,0.904,-3215.18,0.953,-3215.18,0.941 -29153498.504,-3215.18,0.878,-3215.18,0.877,-3215.18,0.889,-3215.18,0.898,-3215.18,0.941,-3215.18,0.927 -29153698.504,-3215.18,0.889,-3215.18,0.887,-3134.8,0.874,-3215.18,0.886,-3215.18,0.922,-3215.18,0.906 -29153898.504,-3215.18,0.892,-3215.18,0.889,-2652.52,0.861,-2974.04,0.871,-3215.18,0.901,-2491.76,0.886 -29154098.504,-3215.18,0.882,-3215.18,0.878,-1929.11,0.854,-2170.24,0.859,-3215.18,0.887,-3215.18,0.869 -29154298.504,-2331.0,0.866,-2652.52,0.862,-1205.69,0.85,-1527.21,0.852,-2974.04,0.872,-2491.76,0.859 -29154498.504,-1446.83,0.85,-1768.35,0.846,-482.28,0.846,-803.79,0.845,-2170.24,0.863,-2009.48,0.858 -29154698.504,-723.41,0.838,-964.55,0.835,160.76,0.841,-160.76,0.84,-1446.83,0.848,-1527.21,0.848 -29154898.504,80.38,0.829,-160.76,0.826,803.79,0.836,321.52,0.835,-884.17,0.84,-723.41,0.843 -29155098.504,241.14,0.825,562.66,0.822,1446.83,0.831,1044.93,0.83,-80.38,0.831,-160.76,0.837 -29155298.504,964.55,0.823,1366.45,0.82,1768.35,0.827,1607.59,0.825,241.14,0.824,643.04,0.831 -29155498.504,1607.59,0.824,1929.11,0.82,2572.14,0.827,2411.38,0.822,1044.93,0.819,1366.45,0.824 -29155698.504,2411.38,0.828,2893.66,0.824,3215.18,0.832,3215.18,0.823,1848.73,0.816,2250.62,0.822 -29155898.504,3215.18,0.835,3054.42,0.832,3215.18,0.831,3215.18,0.822,2652.52,0.822,2974.04,0.832 -29156098.504,3215.18,0.844,3215.18,0.839,3215.18,0.826,3215.18,0.817,3215.18,0.83,3215.18,0.839 -29156298.504,3215.18,0.85,3215.18,0.844,3215.18,0.816,3215.18,0.806,3215.18,0.837,3215.18,0.846 -29156498.504,3215.18,0.853,3215.18,0.844,3215.18,0.804,3215.18,0.791,3215.18,0.834,3215.18,0.841 -29156698.504,3215.18,0.844,3215.18,0.83,3215.18,0.791,3215.18,0.775,3215.18,0.818,3215.18,0.826 -29156898.504,3215.18,0.822,3215.18,0.805,3215.18,0.777,3215.18,0.756,3215.18,0.804,3215.18,0.809 -29157098.504,3215.18,0.792,3215.18,0.774,3215.18,0.767,3215.18,0.739,3215.18,0.784,3215.18,0.786 -29157298.504,3215.18,0.758,3215.18,0.74,3215.18,0.76,-3215.18,0.749,3215.18,0.767,3215.18,0.761 -29157498.504,3215.18,0.729,-3215.18,0.73,3215.18,0.759,-2572.14,0.761,3215.18,0.748,3215.18,0.742 -29157698.504,-2813.28,0.732,-3215.18,0.751,2893.66,0.767,-1768.35,0.771,3215.18,0.746,3215.18,0.731 -29157898.504,-1929.11,0.752,-2813.28,0.767,3054.42,0.782,-964.55,0.781,3215.18,0.756,-1286.07,0.747 -29158098.504,-1125.31,0.77,-3215.18,0.779,3215.18,0.8,-160.76,0.795,-160.76,0.785,-482.28,0.779 -29158298.504,-401.9,0.784,-2652.52,0.787,3215.18,0.823,643.04,0.812,241.14,0.83,321.52,0.827 -29158498.504,0.0,0.793,-1848.73,0.796,3215.18,0.848,1286.07,0.833,803.79,0.863,643.04,0.864 -29158698.504,321.52,0.797,-1044.93,0.802,3215.18,0.874,1929.11,0.856,1366.45,0.88,1286.07,0.884 -29158898.504,-160.76,0.801,-241.14,0.808,3215.18,0.898,2652.52,0.879,1929.11,0.89,1527.21,0.892 -29159098.504,482.28,0.807,321.52,0.813,3215.18,0.916,3134.8,0.899,1527.21,0.891,1446.83,0.894 -29159298.504,1205.69,0.81,723.41,0.817,3215.18,0.926,3215.18,0.915,2009.48,0.883,1768.35,0.885 -29159498.504,1768.35,0.816,1527.21,0.823,3215.18,0.93,3215.18,0.926,2250.62,0.858,2331.0,0.865 -29159698.504,2572.14,0.827,2331.0,0.834,3215.18,0.93,3215.18,0.933,2732.9,0.834,2170.24,0.84 -29159898.504,3215.18,0.848,3134.8,0.856,3215.18,0.931,3215.18,0.939,2732.9,0.807,2813.28,0.824 -29160098.504,3215.18,0.871,3215.18,0.879,3215.18,0.935,3215.18,0.945,3215.18,0.773,3215.18,0.811 -29160298.504,3215.18,0.886,3215.18,0.893,3215.18,0.935,3215.18,0.949,3215.18,0.698,3215.18,0.773 -29160498.504,3215.18,0.89,3215.18,0.897,3215.18,0.918,3215.18,0.944,nan,0.588,3215.18,0.723 -29160698.504,3215.18,0.876,3215.18,0.887,3215.18,0.893,3215.18,0.934,nan,0.343,nan,0.562 -29160898.504,3215.18,0.84,3215.18,0.857,3215.18,0.848,3215.18,0.915,nan,0.225,nan,0.352 -29161098.504,3215.18,0.798,3215.18,0.822,3215.18,0.762,3215.18,0.882,nan,0.333,nan,0.512 -29161298.504,3215.18,0.749,3215.18,0.779,3215.18,0.654,3215.18,0.824,nan,0.488,321.52,0.686 -29161498.504,3215.18,0.678,3215.18,0.71,nan,0.636,3215.18,0.743,nan,0.646,321.52,0.811 -29161698.504,nan,0.597,nan,0.604,-3215.18,0.747,3215.18,0.676,241.14,0.771,321.52,0.884 -29161898.504,-3215.18,0.678,-3215.18,0.659,-3215.18,0.818,-3215.18,0.723,241.14,0.795,321.52,0.818 -29162098.504,-3215.18,0.747,-3215.18,0.732,-3215.18,0.849,-3215.18,0.799,241.14,0.663,321.52,0.742 -29162298.504,-3215.18,0.788,-3215.18,0.779,-3215.18,0.864,-3215.18,0.846,nan,0.508,nan,0.539 -29162498.504,-3134.8,0.808,-3215.18,0.8,-3215.18,0.873,-3215.18,0.869,nan,0.313,nan,0.329 -29162698.504,-2250.62,0.825,-1929.11,0.821,-3215.18,0.876,-3215.18,0.886,nan,0.208,nan,0.196 -29162898.504,-1527.21,0.847,-1687.97,0.847,-3215.18,0.876,-3215.18,0.891,nan,0.372,nan,0.513 -29163098.504,-1125.31,0.865,-1125.31,0.865,-3215.18,0.872,-3215.18,0.89,nan,0.631,-3215.18,0.714 -29163298.504,-562.66,0.87,-562.66,0.87,-2572.14,0.86,-3215.18,0.883,-2974.04,0.733,-3215.18,0.768 -29163498.504,160.76,0.867,80.38,0.867,-1768.35,0.848,-3215.18,0.868,-2491.76,0.76,-3054.42,0.774 -29163698.504,562.66,0.862,723.41,0.863,-884.17,0.832,-3215.18,0.848,-2250.62,0.792,-2491.76,0.793 -29163898.504,1366.45,0.857,1446.83,0.859,-160.76,0.824,-2652.52,0.833,-1687.97,0.813,-1848.73,0.813 -29164098.504,2170.24,0.859,2250.62,0.86,321.52,0.825,-1848.73,0.83,-1286.07,0.831,-1687.97,0.824 -29164298.504,2974.04,0.87,3054.42,0.873,643.04,0.83,-1044.93,0.837,-1125.31,0.85,-1527.21,0.84 -29164498.504,3215.18,0.886,3215.18,0.887,1446.83,0.842,-482.28,0.852,-964.55,0.87,-1125.31,0.858 -29164698.504,3215.18,0.896,3215.18,0.896,1125.31,0.852,321.52,0.869,-964.55,0.896,-964.55,0.879 -29164898.504,3215.18,0.899,3215.18,0.899,1768.35,0.858,1044.93,0.88,-562.66,0.916,-964.55,0.907 -29165098.504,3215.18,0.899,3215.18,0.897,2572.14,0.852,1768.35,0.883,-160.76,0.931,-401.9,0.924 -29165298.504,3215.18,0.894,3215.18,0.89,3215.18,0.823,2250.62,0.873,241.14,0.935,160.76,0.927 -29165498.504,3215.18,0.89,3215.18,0.883,2009.48,0.767,2572.14,0.84,884.17,0.924,803.79,0.916 -29165698.504,3215.18,0.889,3215.18,0.883,1366.45,0.714,2491.76,0.796,1527.21,0.908,1607.59,0.9 -29165898.504,3215.18,0.887,3215.18,0.875,884.17,0.686,2089.86,0.744,2331.0,0.896,2089.86,0.878 -29166098.504,3215.18,0.888,3215.18,0.875,562.66,0.682,1125.31,0.698,3134.8,0.9,2974.04,0.877 -29166298.504,3215.18,0.887,3215.18,0.873,643.04,0.698,964.55,0.69,3215.18,0.912,3215.18,0.888 -29166498.504,3215.18,0.885,3215.18,0.869,723.41,0.718,964.55,0.687,3215.18,0.907,3215.18,0.874 -29166698.504,3215.18,0.886,3215.18,0.875,562.66,0.73,964.55,0.676,3215.18,0.884,3215.18,0.848 -29166898.504,3215.18,0.881,3215.18,0.866,401.9,0.733,nan,0.639,3215.18,0.856,3215.18,0.816 -29167098.504,3215.18,0.86,3215.18,0.845,321.52,0.739,nan,0.614,3215.18,0.834,3215.18,0.792 -29167298.504,3215.18,0.811,3215.18,0.793,321.52,0.761,nan,0.625,3215.18,0.813,3215.18,0.77 -29167498.504,3215.18,0.715,1527.21,0.711,401.9,0.755,321.52,0.662,3215.18,0.783,3215.18,0.75 -29167698.504,nan,0.621,nan,0.63,964.55,0.714,321.52,0.684,3215.18,0.736,3215.18,0.706 -29167898.504,nan,0.529,nan,0.508,nan,0.646,160.76,0.689,-3215.18,0.704,-3215.18,0.73 -29168098.504,nan,0.393,nan,0.408,nan,0.603,321.52,0.69,-3215.18,0.748,-3215.18,0.768 -29168298.504,nan,0.524,nan,0.509,nan,0.587,321.52,0.673,-2893.66,0.764,-3054.42,0.78 -29168498.504,0.0,0.675,nan,0.644,-3215.18,0.652,-3215.18,0.735,-1205.69,0.772,-1768.35,0.777 -29168698.504,80.38,0.76,241.14,0.735,-3215.18,0.736,-3215.18,0.783,-401.9,0.796,-964.55,0.79 -29168898.504,321.52,0.813,321.52,0.77,-3215.18,0.788,-3215.18,0.803,241.14,0.822,0.0,0.809 -29169098.504,321.52,0.822,241.14,0.783,-3134.8,0.83,-3215.18,0.823,241.14,0.85,321.52,0.837 -29169298.504,241.14,0.853,160.76,0.835,-2250.62,0.853,-1929.11,0.822,723.41,0.856,562.66,0.845 -29169498.504,241.14,0.878,241.14,0.873,-1366.45,0.875,-884.17,0.839,803.79,0.852,643.04,0.852 -29169698.504,321.52,0.879,321.52,0.871,-482.28,0.89,-321.52,0.854,723.41,0.838,803.79,0.841 -29169898.504,321.52,0.862,321.52,0.86,321.52,0.898,321.52,0.864,723.41,0.805,401.9,0.822 -29170098.504,321.52,0.835,401.9,0.842,1044.93,0.882,562.66,0.865,321.52,0.787,884.17,0.806 -29170298.504,321.52,0.803,321.52,0.82,884.17,0.858,401.9,0.86,803.79,0.74,884.17,0.772 -29170498.504,401.9,0.735,482.28,0.776,1205.69,0.832,964.55,0.856,1205.69,0.695,1607.59,0.741 -29170698.504,401.9,0.667,482.28,0.69,1205.69,0.812,803.79,0.86,nan,0.642,2089.86,0.707 -29170898.504,321.52,0.658,321.52,0.7,884.17,0.809,723.41,0.873,nan,0.598,3215.18,0.674 -29171098.504,321.52,0.717,321.52,0.747,803.79,0.816,803.79,0.879,-3215.18,0.68,-3215.18,0.658 -29171298.504,401.9,0.774,643.04,0.781,723.41,0.82,1125.31,0.876,-3215.18,0.739,-3215.18,0.727 -29171498.504,562.66,0.792,643.04,0.747,1125.31,0.794,1446.83,0.841,-3215.18,0.804,-3215.18,0.786 -29171698.504,321.52,0.736,321.52,0.664,1125.31,0.724,1768.35,0.77,-2732.9,0.839,-2732.9,0.821 -29171898.504,321.52,0.663,nan,0.598,nan,0.597,nan,0.648,-1929.11,0.864,-1929.11,0.843 -29172098.504,nan,0.575,nan,0.546,nan,0.481,nan,0.486,-1125.31,0.873,-1044.93,0.857 -29172298.504,nan,0.492,nan,0.464,nan,0.405,nan,0.352,-321.52,0.859,-401.9,0.85 -29172498.504,nan,0.434,nan,0.403,nan,0.479,nan,0.274,160.76,0.832,321.52,0.829 -29172698.504,nan,0.546,nan,0.532,nan,0.606,nan,0.463,241.14,0.782,401.9,0.781 -29172898.504,-482.28,0.694,-482.28,0.691,-3215.18,0.673,nan,0.606,-3215.18,0.758,-3215.18,0.742 -29173098.504,-241.14,0.791,-80.38,0.798,-1527.21,0.732,-964.55,0.688,-3215.18,0.748,-3215.18,0.731 -29173298.504,80.38,0.868,80.38,0.877,-1366.45,0.782,-1044.93,0.742,-3215.18,0.759,-3215.18,0.738 -29173498.504,241.14,0.913,241.14,0.919,-1044.93,0.814,-1125.31,0.787,-3215.18,0.784,-3215.18,0.775 -29173698.504,321.52,0.936,241.14,0.941,-803.79,0.837,-964.55,0.814,-3215.18,0.816,-3215.18,0.812 -29173898.504,321.52,0.945,321.52,0.95,-643.04,0.853,-964.55,0.835,-3215.18,0.843,-3215.18,0.841 -29174098.504,321.52,0.936,321.52,0.929,-321.52,0.863,-643.04,0.851,-3215.18,0.858,-3215.18,0.865 -29174298.504,321.52,0.929,321.52,0.924,-482.28,0.855,-803.79,0.859,-2813.28,0.856,-2893.66,0.864 -29174498.504,401.9,0.898,401.9,0.892,-321.52,0.837,-643.04,0.856,-2089.86,0.858,-2572.14,0.859 -29174698.504,723.41,0.839,643.04,0.828,321.52,0.819,80.38,0.845,-1366.45,0.868,-1768.35,0.869 -29174898.504,964.55,0.749,723.41,0.738,964.55,0.798,884.17,0.83,-964.55,0.88,-1125.31,0.881 -29175098.504,nan,0.633,nan,0.61,1366.45,0.781,1446.83,0.816,-241.14,0.889,-643.04,0.885 -29175298.504,nan,0.494,nan,0.471,2170.24,0.767,2491.76,0.808,241.14,0.886,0.0,0.881 -29175498.504,nan,0.571,nan,0.586,3054.42,0.766,3054.42,0.809,803.79,0.874,482.28,0.872 -29175698.504,-3215.18,0.746,-3215.18,0.749,3134.8,0.762,3215.18,0.81,1366.45,0.86,1286.07,0.856 -29175898.504,-3215.18,0.822,-3215.18,0.828,3215.18,0.762,3215.18,0.807,2089.86,0.853,1848.73,0.847 -29176098.504,-3054.42,0.847,-3054.42,0.849,3215.18,0.761,3215.18,0.803,2732.9,0.851,2652.52,0.845 -29176298.504,-2652.52,0.879,-2331.0,0.876,3215.18,0.762,3215.18,0.793,3215.18,0.863,3215.18,0.855 -29176498.504,-1848.73,0.896,-1527.21,0.895,-482.28,0.765,3215.18,0.783,3215.18,0.874,3215.18,0.87 -29176698.504,-1044.93,0.901,-643.04,0.895,321.52,0.782,3215.18,0.768,3215.18,0.88,3215.18,0.882 -29176898.504,-482.28,0.902,-401.9,0.897,321.52,0.789,3215.18,0.755,3215.18,0.889,3215.18,0.898 -29177098.504,0.0,0.899,-80.38,0.898,1044.93,0.786,2893.66,0.743,3215.18,0.892,3215.18,0.902 -29177298.504,321.52,0.888,241.14,0.887,1848.73,0.781,3134.8,0.733,3215.18,0.878,3215.18,0.893 -29177498.504,321.52,0.881,241.14,0.877,2491.76,0.777,-3215.18,0.746,3215.18,0.847,3215.18,0.868 -29177698.504,401.9,0.883,321.52,0.88,3215.18,0.771,-3215.18,0.754,3215.18,0.804,3215.18,0.834 -29177898.504,803.79,0.882,723.41,0.878,3215.18,0.744,-3215.18,0.77,3215.18,0.734,3215.18,0.773 -29178098.504,1205.69,0.876,1286.07,0.871,-3215.18,0.714,-3215.18,0.785,nan,0.643,3215.18,0.682 -29178298.504,1607.59,0.869,1607.59,0.862,-3215.18,0.733,-3215.18,0.789,nan,0.578,nan,0.608 -29178498.504,2411.38,0.864,2411.38,0.856,-3215.18,0.751,-3215.18,0.798,nan,0.608,nan,0.572 -29178698.504,3215.18,0.853,3215.18,0.845,-3215.18,0.773,-3215.18,0.8,-2331.0,0.675,-2652.52,0.657 -29178898.504,3215.18,0.794,3215.18,0.793,-3215.18,0.785,-3215.18,0.799,-1446.83,0.728,-1848.73,0.716 -29179098.504,3215.18,0.709,3215.18,0.717,-3215.18,0.789,-2572.14,0.793,-1125.31,0.767,-1044.93,0.755 -29179298.504,nan,0.626,nan,0.643,-3215.18,0.795,-3215.18,0.789,-3215.18,0.79,-401.9,0.78 -29179498.504,nan,0.541,nan,0.563,-3215.18,0.806,-3215.18,0.79,-3215.18,0.818,-3215.18,0.811 -29179698.504,nan,0.642,-160.76,0.66,-3215.18,0.811,-3215.18,0.792,-3215.18,0.817,-3215.18,0.809 -29179898.504,241.14,0.717,241.14,0.737,-2974.04,0.8,-2572.14,0.783,-3215.18,0.807,-3215.18,0.795 -29180098.504,241.14,0.748,321.52,0.757,-2974.04,0.788,-1848.73,0.774,-3215.18,0.793,-3215.18,0.778 -29180298.504,241.14,0.719,241.14,0.726,-3215.18,0.775,-1044.93,0.76,-3215.18,0.784,-3215.18,0.77 -29180498.504,321.52,0.671,321.52,0.678,-3215.18,0.772,-3215.18,0.751,-3215.18,0.79,-3215.18,0.78 -29180698.504,nan,0.641,241.14,0.65,-3215.18,0.774,-3215.18,0.759,-3215.18,0.812,-3215.18,0.804 -29180898.504,nan,0.648,-80.38,0.67,-2974.04,0.777,-3134.8,0.765,-3215.18,0.84,-3215.18,0.831 -29181098.504,-562.66,0.757,-562.66,0.771,-2250.62,0.777,-2893.66,0.769,-3215.18,0.855,-3215.18,0.845 -29181298.504,-482.28,0.836,-241.14,0.853,-1366.45,0.783,-1366.45,0.771,-3215.18,0.864,-3215.18,0.855 -29181498.504,-80.38,0.867,241.14,0.876,-562.66,0.793,-643.04,0.781,-3215.18,0.875,-3215.18,0.867 -29181698.504,321.52,0.856,482.28,0.857,241.14,0.804,241.14,0.788,-3215.18,0.885,-3215.18,0.876 -29181898.504,643.04,0.797,803.79,0.793,321.52,0.815,401.9,0.793,-3215.18,0.883,-3215.18,0.876 -29182098.504,401.9,0.741,643.04,0.727,1125.31,0.816,1044.93,0.792,-3215.18,0.868,-2813.28,0.861 -29182298.504,321.52,0.712,401.9,0.699,1848.73,0.812,1607.59,0.782,-2411.38,0.849,-2009.48,0.844 -29182498.504,-80.38,0.72,-80.38,0.705,2652.52,0.802,2732.9,0.766,-1286.07,0.836,-1205.69,0.832 -29182698.504,-321.52,0.758,-80.38,0.747,3215.18,0.779,3215.18,0.74,-803.79,0.827,-401.9,0.825 -29182898.504,80.38,0.785,80.38,0.767,3215.18,0.747,-3215.18,0.707,-80.38,0.821,321.52,0.819 -29183098.504,321.52,0.775,321.52,0.756,3215.18,0.716,-3215.18,0.739,321.52,0.814,321.52,0.817 -29183298.504,964.55,0.739,723.41,0.72,-3215.18,0.723,-3215.18,0.776,803.79,0.806,1125.31,0.812 -29183498.504,-3215.18,0.725,-3215.18,0.737,-3215.18,0.761,-3215.18,0.807,1527.21,0.793,1848.73,0.8 -29183698.504,-2089.86,0.741,-1848.73,0.753,-3215.18,0.789,-3215.18,0.824,964.55,0.783,2652.52,0.79 -29183898.504,-1205.69,0.77,-1044.93,0.782,-3215.18,0.808,-3215.18,0.837,1446.83,0.775,3215.18,0.78 -29184098.504,-401.9,0.817,-321.52,0.828,-3215.18,0.828,-3215.18,0.85,2572.14,0.768,3215.18,0.774 -29184298.504,241.14,0.863,0.0,0.868,-3215.18,0.847,-3215.18,0.862,3054.42,0.773,2813.28,0.778 -29184498.504,562.66,0.88,321.52,0.878,-3215.18,0.855,-3215.18,0.866,3215.18,0.781,3215.18,0.788 -29184698.504,1044.93,0.869,1044.93,0.863,-3215.18,0.849,-3215.18,0.86,3215.18,0.79,3215.18,0.796 -29184898.504,1848.73,0.853,1607.59,0.841,-3215.18,0.838,-3215.18,0.845,3215.18,0.796,3215.18,0.8 -29185098.504,2893.66,0.838,2652.52,0.82,-3215.18,0.826,-2974.04,0.83,3215.18,0.809,3215.18,0.814 -29185298.504,3215.18,0.825,3215.18,0.802,-2331.0,0.813,-2089.86,0.819,3215.18,0.825,3215.18,0.83 -29185498.504,3215.18,0.803,3215.18,0.776,-1687.97,0.801,-1366.45,0.807,1848.73,0.843,2572.14,0.85 -29185698.504,3215.18,0.778,3215.18,0.754,-884.17,0.79,-562.66,0.797,2652.52,0.862,2411.38,0.871 -29185898.504,3215.18,0.766,3215.18,0.741,-80.38,0.785,321.52,0.789,3054.42,0.873,3215.18,0.885 -29186098.504,3215.18,0.748,3215.18,0.733,643.04,0.782,1044.93,0.785,3215.18,0.885,3215.18,0.895 -29186298.504,3215.18,0.727,-1125.31,0.715,1527.21,0.788,1848.73,0.787,3215.18,0.886,3215.18,0.898 -29186498.504,-321.52,0.729,-482.28,0.746,2250.62,0.797,2652.52,0.794,3215.18,0.887,3215.18,0.899 -29186698.504,321.52,0.769,241.14,0.783,3054.42,0.806,3215.18,0.804,3215.18,0.898,3215.18,0.91 -29186898.504,321.52,0.804,723.41,0.814,3215.18,0.819,3215.18,0.813,3215.18,0.915,3215.18,0.932 -29187098.504,884.17,0.82,401.9,0.832,2974.04,0.832,3215.18,0.822,3215.18,0.923,3215.18,0.947 -29187298.504,1205.69,0.823,964.55,0.835,3134.8,0.843,3215.18,0.831,3215.18,0.923,3215.18,0.95 -29187498.504,321.52,0.825,1768.35,0.837,3215.18,0.856,3215.18,0.84,3215.18,0.924,3215.18,0.943 -29187698.504,964.55,0.832,2491.76,0.839,3215.18,0.868,3215.18,0.847,3215.18,0.918,3215.18,0.919 -29187898.504,1768.35,0.837,3215.18,0.845,3215.18,0.873,3215.18,0.851,3215.18,0.863,3215.18,0.817 -29188098.504,2652.52,0.838,2893.66,0.847,3215.18,0.872,3215.18,0.848,3215.18,0.756,nan,0.648 -29188298.504,3215.18,0.843,3215.18,0.855,3215.18,0.868,3215.18,0.841,3215.18,0.659,nan,0.493 -29188498.504,3215.18,0.848,3215.18,0.857,3215.18,0.854,3215.18,0.833,nan,0.535,nan,0.334 -29188698.504,3215.18,0.858,3215.18,0.858,3215.18,0.834,3215.18,0.821,nan,0.465,nan,0.35 -29188898.504,3215.18,0.853,3215.18,0.846,3215.18,0.809,3215.18,0.809,-3215.18,0.666,nan,0.528 -29189098.504,3215.18,0.815,3215.18,0.807,3215.18,0.784,3215.18,0.798,-3215.18,0.784,-3215.18,0.692 -29189298.504,3215.18,0.758,3215.18,0.759,3215.18,0.757,3215.18,0.785,-3215.18,0.84,-3054.42,0.762 -29189498.504,3215.18,0.722,3215.18,0.721,3215.18,0.736,3215.18,0.773,-3054.42,0.851,-2411.38,0.801 -29189698.504,643.04,0.672,884.17,0.681,-2411.38,0.732,3215.18,0.768,-2331.0,0.866,-1848.73,0.843 -29189898.504,241.14,0.68,241.14,0.702,-2009.48,0.748,3215.18,0.763,-1607.59,0.891,-1366.45,0.882 -29190098.504,80.38,0.71,-80.38,0.739,-803.79,0.757,3215.18,0.752,-1125.31,0.927,-884.17,0.928 -29190298.504,321.52,0.714,160.76,0.754,-3215.18,0.763,-3215.18,0.742,-562.66,0.955,-401.9,0.96 -29190498.504,321.52,0.69,241.14,0.728,-3215.18,0.772,-3215.18,0.759,-80.38,0.97,80.38,0.98 -29190698.504,nan,0.648,321.52,0.68,-3215.18,0.762,-3215.18,0.771,241.14,0.971,401.9,0.982 -29190898.504,nan,0.613,nan,0.624,-3215.18,0.759,-3215.18,0.785,562.66,0.952,643.04,0.959 -29191098.504,nan,0.602,nan,0.577,-3215.18,0.782,-3215.18,0.813,803.79,0.91,643.04,0.915 -29191298.504,nan,0.586,nan,0.548,-3215.18,0.816,-3215.18,0.839,964.55,0.857,884.17,0.862 -29191498.504,nan,0.58,nan,0.541,-3215.18,0.847,-3215.18,0.86,1366.45,0.806,1286.07,0.81 -29191698.504,nan,0.596,nan,0.562,-3215.18,0.865,-3215.18,0.87,1687.97,0.751,1607.59,0.747 -29191898.504,nan,0.627,nan,0.615,-3215.18,0.876,-3215.18,0.872,1929.11,0.685,1446.83,0.675 -29192098.504,-964.55,0.695,-2009.48,0.711,-3215.18,0.878,-3215.18,0.868,nan,0.606,nan,0.59 -29192298.504,-1366.45,0.802,-1527.21,0.816,-3134.8,0.872,-2732.9,0.864,nan,0.564,nan,0.539 -29192498.504,-964.55,0.881,-884.17,0.883,-2411.38,0.872,-2009.48,0.867,nan,0.572,nan,0.54 -29192698.504,-401.9,0.927,-482.28,0.924,-1768.35,0.881,-1205.69,0.88,-1527.21,0.652,nan,0.616 -29192898.504,241.14,0.952,80.38,0.947,-1125.31,0.894,-643.04,0.897,-1205.69,0.738,-562.66,0.727 -29193098.504,562.66,0.954,321.52,0.952,-562.66,0.906,-241.14,0.91,-723.41,0.815,-562.66,0.816 -29193298.504,723.41,0.925,723.41,0.932,0.0,0.915,321.52,0.921,-723.41,0.884,-401.9,0.894 -29193498.504,562.66,0.893,723.41,0.905,723.41,0.919,1044.93,0.923,-321.52,0.927,-160.76,0.937 -29193698.504,643.04,0.874,723.41,0.886,1205.69,0.918,1687.97,0.915,160.76,0.94,321.52,0.941 -29193898.504,723.41,0.863,803.79,0.874,1768.35,0.914,2250.62,0.9,723.41,0.936,1044.93,0.927 -29194098.504,1044.93,0.843,1125.31,0.863,2491.76,0.906,2732.9,0.873,1366.45,0.927,1848.73,0.917 -29194298.504,1366.45,0.802,1607.59,0.833,3054.42,0.894,3054.42,0.84,2089.86,0.905,2331.0,0.876 -29194498.504,1768.35,0.751,2170.24,0.803,3215.18,0.872,2974.04,0.789,2893.66,0.858,2732.9,0.808 -29194698.504,3215.18,0.697,3215.18,0.8,3215.18,0.827,2893.66,0.713,3215.18,0.805,884.17,0.753 -29194898.504,3215.18,0.652,3215.18,0.792,3134.8,0.756,nan,0.636,1527.21,0.768,884.17,0.745 -29195098.504,nan,0.566,3215.18,0.737,2170.24,0.689,nan,0.589,1446.83,0.751,1125.31,0.729 -29195298.504,nan,0.597,3215.18,0.744,nan,0.626,nan,0.551,1687.97,0.695,884.17,0.67 -29195498.504,3215.18,0.7,3215.18,0.806,nan,0.554,nan,0.531,nan,0.624,nan,0.614 -29195698.504,321.52,0.808,803.79,0.807,nan,0.491,-3215.18,0.674,nan,0.543,nan,0.536 -29195898.504,1205.69,0.8,1607.59,0.83,nan,0.591,-3215.18,0.792,nan,0.403,nan,0.458 -29196098.504,2170.24,0.726,2250.62,0.799,-3215.18,0.756,-3215.18,0.859,nan,0.301,nan,0.451 -29196298.504,2893.66,0.682,2572.14,0.73,-3215.18,0.852,-3215.18,0.884,nan,0.41,nan,0.56 -29196498.504,nan,0.632,3215.18,0.687,-3215.18,0.896,-3215.18,0.891,nan,0.553,nan,0.647 -29196698.504,-3215.18,0.663,nan,0.463,-3215.18,0.906,-3215.18,0.888,160.76,0.726,643.04,0.676 -29196898.504,-3215.18,0.706,nan,0.467,-3215.18,0.903,-3215.18,0.879,241.14,0.813,321.52,0.711 -29197098.504,-3215.18,0.752,nan,0.589,-3215.18,0.884,-3215.18,0.863,241.14,0.77,321.52,0.686 -29197298.504,-3215.18,0.813,-160.76,0.676,-2491.76,0.855,-3054.42,0.844,241.14,0.778,321.52,0.76 -29197498.504,-3215.18,0.843,-3215.18,0.656,-3215.18,0.838,-3215.18,0.831,241.14,0.805,321.52,0.845 -29197698.504,-3215.18,0.855,-3215.18,0.706,-3215.18,0.837,-3215.18,0.829,241.14,0.856,321.52,0.843 -29197898.504,-3215.18,0.855,-3215.18,0.741,-3215.18,0.834,-3215.18,0.825,241.14,0.925,321.52,0.84 -29198098.504,-2732.9,0.854,-2974.04,0.77,-3215.18,0.821,-3215.18,0.812,241.14,0.943,321.52,0.805 -29198298.504,-1607.59,0.844,-643.04,0.806,-3054.42,0.801,-2732.9,0.795,321.52,0.895,401.9,0.686 -29198498.504,-803.79,0.846,-321.52,0.841,-1446.83,0.787,-1607.59,0.784,321.52,0.806,nan,0.578 -29198698.504,-80.38,0.853,80.38,0.871,-723.41,0.774,-803.79,0.776,643.04,0.669,nan,0.518 -29198898.504,321.52,0.854,321.52,0.89,-80.38,0.764,-321.52,0.768,nan,0.532,nan,0.434 -29199098.504,401.9,0.843,321.52,0.874,241.14,0.758,401.9,0.763,nan,0.524,nan,0.461 -29199298.504,562.66,0.848,321.52,0.874,-3215.18,0.753,884.17,0.758,nan,0.567,nan,0.579 -29199498.504,321.52,0.863,321.52,0.879,-2652.52,0.753,1527.21,0.756,241.14,0.654,-2089.86,0.659 -29199698.504,562.66,0.879,321.52,0.884,-1205.69,0.759,2813.28,0.761,241.14,0.758,-1366.45,0.748 -29199898.504,723.41,0.893,321.52,0.883,-401.9,0.773,3215.18,0.77,241.14,0.718,-643.04,0.828 -29200098.504,884.17,0.901,321.52,0.867,321.52,0.79,401.9,0.783,241.14,0.746,-482.28,0.875 -29200298.504,1446.83,0.891,884.17,0.823,562.66,0.813,1205.69,0.802,241.14,0.746,0.0,0.891 -29200498.504,2250.62,0.884,1768.35,0.784,1286.07,0.832,1527.21,0.82,241.14,0.791,321.52,0.898 -29200698.504,2732.9,0.843,2170.24,0.673,2089.86,0.84,2009.48,0.831,241.14,0.846,321.52,0.907 -29200898.504,3215.18,0.775,nan,0.469,2893.66,0.845,2813.28,0.839,241.14,0.697,321.52,0.877 -29201098.504,nan,0.622,nan,0.455,3215.18,0.853,3215.18,0.847,nan,0.546,321.52,0.84 -29201298.504,nan,0.443,nan,0.391,3215.18,0.858,3215.18,0.847,nan,0.444,401.9,0.796 -29201498.504,nan,0.299,nan,0.331,3215.18,0.862,3215.18,0.849,nan,0.403,1125.31,0.757 -29201698.504,nan,0.388,nan,0.409,3215.18,0.868,3215.18,0.85,nan,0.524,964.55,0.707 -29201898.504,nan,0.573,nan,0.564,3215.18,0.867,3215.18,0.846,-803.79,0.702,nan,0.647 -29202098.504,-884.17,0.691,-803.79,0.677,3215.18,0.85,3215.18,0.829,-482.28,0.768,nan,0.582 -29202298.504,-643.04,0.774,-643.04,0.755,3215.18,0.816,3215.18,0.799,0.0,0.719,nan,0.514 -29202498.504,-321.52,0.837,-321.52,0.818,3215.18,0.761,3215.18,0.757,241.14,0.663,nan,0.448 -29202698.504,-241.14,0.896,-321.52,0.877,-3215.18,0.702,-3215.18,0.727,nan,0.617,nan,0.423 -29202898.504,-160.76,0.924,-160.76,0.908,-3215.18,0.749,-3215.18,0.764,nan,0.627,nan,0.504 -29203098.504,80.38,0.905,80.38,0.897,-3215.18,0.804,-3215.18,0.808,-160.76,0.729,nan,0.649 -29203298.504,241.14,0.852,241.14,0.844,-3215.18,0.852,-3215.18,0.842,-80.38,0.838,-241.14,0.787 -29203498.504,321.52,0.796,321.52,0.794,-3215.18,0.888,-3215.18,0.875,80.38,0.909,0.0,0.883 -29203698.504,401.9,0.754,321.52,0.756,-3215.18,0.917,-3215.18,0.901,241.14,0.941,241.14,0.934 -29203898.504,482.28,0.728,321.52,0.736,-3215.18,0.935,-3215.18,0.92,401.9,0.917,321.52,0.952 -29204098.504,80.38,0.726,80.38,0.75,-3215.18,0.942,-3215.18,0.928,482.28,0.867,401.9,0.949 -29204298.504,241.14,0.741,241.14,0.762,-3215.18,0.938,-3215.18,0.926,321.52,0.809,321.52,0.935 -29204498.504,321.52,0.719,321.52,0.748,-3215.18,0.924,-3215.18,0.91,241.14,0.816,321.52,0.943 -29204698.504,401.9,0.682,321.52,0.708,-2572.14,0.906,-2411.38,0.895,160.76,0.863,401.9,0.957 -29204898.504,nan,0.637,401.9,0.66,-1848.73,0.904,-1607.59,0.896,321.52,0.905,643.04,0.948 -29205098.504,nan,0.619,nan,0.635,-1125.31,0.91,-884.17,0.905,803.79,0.895,1205.69,0.912 -29205298.504,-80.38,0.684,0.0,0.684,-401.9,0.919,-241.14,0.915,1205.69,0.804,1768.35,0.834 -29205498.504,-160.76,0.797,-80.38,0.789,160.76,0.926,401.9,0.923,nan,0.64,2491.76,0.717 -29205698.504,0.0,0.891,0.0,0.882,643.04,0.929,803.79,0.926,nan,0.441,nan,0.561 -29205898.504,321.52,0.935,321.52,0.931,1044.93,0.925,1125.31,0.92,nan,0.301,nan,0.318 -29206098.504,562.66,0.919,562.66,0.91,1286.07,0.916,1366.45,0.908,nan,0.321,nan,0.581 -29206298.504,723.41,0.84,723.41,0.838,1527.21,0.906,1446.83,0.897,nan,0.48,-3134.8,0.707 -29206498.504,562.66,0.747,562.66,0.745,1848.73,0.893,1768.35,0.884,nan,0.622,-2572.14,0.757 -29206698.504,321.52,0.693,401.9,0.693,2250.62,0.874,2089.86,0.865,-1286.07,0.7,-2089.86,0.784 -29206898.504,321.52,0.694,321.52,0.703,2411.38,0.852,2411.38,0.837,-1044.93,0.739,-1848.73,0.81 -29207098.504,241.14,0.721,241.14,0.739,2813.28,0.832,2732.9,0.81,-1044.93,0.765,-3215.18,0.831 -29207298.504,321.52,0.738,321.52,0.763,3215.18,0.82,3054.42,0.779,-1687.97,0.776,-3215.18,0.852 -29207498.504,241.14,0.74,321.52,0.754,3215.18,0.784,3215.18,0.713,-3215.18,0.813,-3215.18,0.862 -29207698.504,401.9,0.723,562.66,0.716,nan,0.624,nan,0.489,-3215.18,0.842,-3215.18,0.859 -29207898.504,401.9,0.701,562.66,0.666,nan,0.296,nan,0.279,-3215.18,0.855,-3215.18,0.85 -29208098.504,321.52,0.726,321.52,0.658,nan,0.392,nan,0.407,-3215.18,0.855,-3215.18,0.839 -29208298.504,321.52,0.791,321.52,0.713,nan,0.569,nan,0.602,-3215.18,0.841,-3215.18,0.823 -29208498.504,321.52,0.879,241.14,0.817,-241.14,0.772,-321.52,0.798,-3215.18,0.825,-3215.18,0.81 -29208698.504,321.52,0.93,241.14,0.905,-80.38,0.881,-80.38,0.875,-3215.18,0.812,-3215.18,0.801 -29208898.504,321.52,0.915,321.52,0.925,160.76,0.892,321.52,0.871,-3134.8,0.799,-3134.8,0.791 -29209098.504,562.66,0.867,482.28,0.898,321.52,0.877,321.52,0.855,-2331.0,0.792,-2331.0,0.787 -29209298.504,803.79,0.799,562.66,0.828,321.52,0.855,321.52,0.837,-1527.21,0.794,-1527.21,0.794 -29209498.504,1125.31,0.711,803.79,0.73,401.9,0.832,401.9,0.813,-723.41,0.795,-723.41,0.801 -29209698.504,nan,0.567,nan,0.574,321.52,0.815,321.52,0.799,80.38,0.792,-80.38,0.801 -29209898.504,nan,0.481,nan,0.509,562.66,0.776,401.9,0.761,562.66,0.78,321.52,0.796 -29210098.504,nan,0.548,nan,0.584,401.9,0.721,482.28,0.711,1125.31,0.767,1125.31,0.788 -29210298.504,nan,0.633,321.52,0.68,482.28,0.686,482.28,0.676,1848.73,0.755,1848.73,0.78 -29210498.504,321.52,0.655,321.52,0.68,643.04,0.652,nan,0.647,2732.9,0.746,2732.9,0.775 -29210698.504,nan,0.615,nan,0.584,nan,0.619,nan,0.627,80.38,0.745,3215.18,0.774 -29210898.504,nan,0.604,nan,0.507,nan,0.628,nan,0.649,482.28,0.746,3215.18,0.764 -29211098.504,nan,0.649,nan,0.555,-2411.38,0.723,-2250.62,0.737,1125.31,0.738,3215.18,0.759 -29211298.504,-803.79,0.72,-723.41,0.664,-964.55,0.82,-1286.07,0.832,-3215.18,0.739,3215.18,0.756 -29211498.504,-643.04,0.777,-321.52,0.747,-160.76,0.874,-643.04,0.879,-3215.18,0.752,3215.18,0.756 -29211698.504,-401.9,0.819,-160.76,0.813,321.52,0.881,321.52,0.883,-2331.0,0.757,3215.18,0.756 -29211898.504,0.0,0.846,80.38,0.851,723.41,0.859,643.04,0.873,-1446.83,0.773,3215.18,0.759 -29212098.504,321.52,0.859,160.76,0.866,723.41,0.82,884.17,0.836,-723.41,0.792,-562.66,0.774 -29212298.504,321.52,0.854,321.52,0.854,482.28,0.796,562.66,0.812,80.38,0.81,241.14,0.797 -29212498.504,321.52,0.838,321.52,0.829,401.9,0.811,401.9,0.82,643.04,0.823,1044.93,0.815 -29212698.504,321.52,0.804,321.52,0.791,401.9,0.824,482.28,0.828,1366.45,0.829,1366.45,0.825 -29212898.504,321.52,0.748,241.14,0.741,643.04,0.811,723.41,0.804,2170.24,0.831,2170.24,0.829 -29213098.504,321.52,0.68,321.52,0.682,643.04,0.775,723.41,0.766,3054.42,0.843,3054.42,0.843 -29213298.504,nan,0.611,nan,0.615,723.41,0.727,803.79,0.707,3215.18,0.862,3215.18,0.861 -29213498.504,nan,0.549,nan,0.559,nan,0.65,nan,0.64,3215.18,0.875,3215.18,0.873 -29213698.504,nan,0.541,nan,0.556,nan,0.54,nan,0.541,3215.18,0.888,3215.18,0.884 -29213898.504,nan,0.642,-1768.35,0.655,nan,0.49,nan,0.494,3215.18,0.897,3215.18,0.891 -29214098.504,-1768.35,0.731,-1446.83,0.742,nan,0.517,nan,0.521,3215.18,0.908,3215.18,0.901 -29214298.504,-1286.07,0.801,-1205.69,0.805,nan,0.548,nan,0.545,3215.18,0.921,3215.18,0.911 -29214498.504,-1044.93,0.854,-884.17,0.854,nan,0.565,nan,0.558,3215.18,0.92,3215.18,0.907 -29214698.504,-723.41,0.893,-723.41,0.895,nan,0.64,nan,0.631,3215.18,0.89,3215.18,0.873 -29214898.504,-482.28,0.915,-241.14,0.915,-3215.18,0.754,-3215.18,0.758,3215.18,0.831,3215.18,0.796 -29215098.504,0.0,0.92,0.0,0.921,-3215.18,0.843,-3215.18,0.844,3215.18,0.743,3215.18,0.698 -29215298.504,321.52,0.914,321.52,0.918,-3215.18,0.903,-3215.18,0.905,nan,0.627,nan,0.582 -29215498.504,884.17,0.901,964.55,0.906,-3215.18,0.927,-3215.18,0.931,nan,0.571,nan,0.611 -29215698.504,1205.69,0.888,1286.07,0.893,-3215.18,0.929,-3215.18,0.937,-2893.66,0.675,-3134.8,0.709 -29215898.504,1848.73,0.877,1768.35,0.883,-3215.18,0.924,-3215.18,0.932,-2089.86,0.741,-2572.14,0.759 -29216098.504,2572.14,0.868,2331.0,0.874,-3215.18,0.915,-3215.18,0.922,-1366.45,0.801,-1768.35,0.805 -29216298.504,3215.18,0.863,3054.42,0.869,-3215.18,0.903,-3215.18,0.911,-964.55,0.857,-1044.93,0.848 -29216498.504,3215.18,0.867,3215.18,0.87,-3215.18,0.888,-3215.18,0.898,-482.28,0.91,-562.66,0.894 -29216698.504,3215.18,0.86,3215.18,0.859,-3215.18,0.867,-3215.18,0.878,80.38,0.94,-241.14,0.918 -29216898.504,3215.18,0.844,3215.18,0.836,-3215.18,0.848,-3215.18,0.858,160.76,0.959,-80.38,0.933 -29217098.504,3215.18,0.81,3215.18,0.787,-2411.38,0.828,-2572.14,0.839,241.14,0.963,321.52,0.939 -29217298.504,3215.18,0.76,3215.18,0.721,-3215.18,0.815,-3215.18,0.824,723.41,0.954,401.9,0.934 -29217498.504,3215.18,0.716,321.52,0.718,-3215.18,0.807,-3215.18,0.813,1205.69,0.936,803.79,0.925 -29217698.504,723.41,0.708,482.28,0.711,-3215.18,0.803,-3215.18,0.805,1687.97,0.918,1527.21,0.916 -29217898.504,-3215.18,0.725,884.17,0.674,-3215.18,0.797,-3215.18,0.796,2411.38,0.899,2331.0,0.912 -29218098.504,-3215.18,0.735,-3215.18,0.671,-3215.18,0.793,-3215.18,0.786,3054.42,0.883,3054.42,0.92 -29218298.504,-3215.18,0.745,-3215.18,0.692,-3215.18,0.792,-3215.18,0.781,3215.18,0.87,3215.18,0.94 -29218498.504,-3215.18,0.77,-3215.18,0.725,-3215.18,0.793,-3215.18,0.777,3215.18,0.809,3215.18,0.953 -29218698.504,-3215.18,0.8,-3215.18,0.766,-3215.18,0.804,-3215.18,0.785,3215.18,0.686,3215.18,0.959 -29218898.504,-3215.18,0.834,-3215.18,0.809,-3215.18,0.82,-3215.18,0.798,nan,0.49,3215.18,0.94 -29219098.504,-3054.42,0.844,-2974.04,0.828,-3215.18,0.836,-3215.18,0.817,nan,0.414,3215.18,0.905 -29219298.504,-2170.24,0.848,-2170.24,0.839,-3215.18,0.845,-3215.18,0.829,nan,0.545,3215.18,0.859 -29219498.504,-1125.31,0.865,-1044.93,0.867,-3215.18,0.848,-3215.18,0.835,-3215.18,0.71,3215.18,0.774 -29219698.504,-401.9,0.895,-562.66,0.901,-3215.18,0.846,-3215.18,0.835,-3215.18,0.85,nan,0.622 -29219898.504,0.0,0.932,-80.38,0.937,-3215.18,0.845,-3215.18,0.837,-3215.18,0.913,nan,0.389 -29220098.504,321.52,0.958,321.52,0.966,-3215.18,0.846,-3215.18,0.84,-3215.18,0.941,nan,0.634 -29220298.504,643.04,0.959,482.28,0.97,-3215.18,0.841,-3215.18,0.838,-3215.18,0.954,-3215.18,0.802 -29220498.504,803.79,0.932,643.04,0.948,-3054.42,0.829,-3054.42,0.828,-3215.18,0.958,-3215.18,0.846 -29220698.504,803.79,0.898,562.66,0.913,-2250.62,0.819,-2250.62,0.817,-3215.18,0.942,-2732.9,0.857 -29220898.504,803.79,0.865,723.41,0.877,-1446.83,0.816,-1446.83,0.812,-2732.9,0.912,-2009.48,0.863 -29221098.504,884.17,0.835,964.55,0.834,-803.79,0.816,-643.04,0.811,-1929.11,0.887,-1446.83,0.859 -29221298.504,1286.07,0.787,1205.69,0.777,0.0,0.82,80.38,0.811,-3215.18,0.869,-964.55,0.834 -29221498.504,1366.45,0.724,1446.83,0.696,723.41,0.821,803.79,0.81,-3215.18,0.877,-3215.18,0.847 -29221698.504,nan,0.601,nan,0.571,1446.83,0.818,1527.21,0.805,-3215.18,0.867,-3215.18,0.849 -29221898.504,nan,0.421,nan,0.409,2170.24,0.815,2170.24,0.8,-3215.18,0.843,-3215.18,0.829 -29222098.504,nan,0.353,nan,0.412,2974.04,0.817,2974.04,0.799,-3215.18,0.831,-3215.18,0.822 -29222298.504,nan,0.452,nan,0.51,3215.18,0.822,3215.18,0.802,-3215.18,0.829,-3215.18,0.828 -29222498.504,nan,0.624,-3215.18,0.664,3215.18,0.823,3215.18,0.801,-3215.18,0.824,-3215.18,0.83 -29222698.504,-3215.18,0.792,-3215.18,0.802,3215.18,0.821,3215.18,0.797,-3215.18,0.822,-3215.18,0.83 -29222898.504,-3215.18,0.878,-3215.18,0.877,3215.18,0.814,3215.18,0.788,-3215.18,0.827,-3215.18,0.839 -29223098.504,-2250.62,0.879,-2572.14,0.886,3215.18,0.799,3215.18,0.772,-3215.18,0.839,-3215.18,0.853 -29223298.504,-1446.83,0.873,-1768.35,0.877,3215.18,0.778,3215.18,0.751,-3215.18,0.841,-3215.18,0.858 -29223498.504,-723.41,0.882,-964.55,0.88,3215.18,0.751,-3215.18,0.734,-3215.18,0.835,-3215.18,0.852 -29223698.504,-321.52,0.894,-321.52,0.882,-3215.18,0.725,-3215.18,0.754,-2331.0,0.829,-3215.18,0.848 -29223898.504,0.0,0.903,321.52,0.885,-3215.18,0.747,-3215.18,0.771,-1607.59,0.831,-3215.18,0.844 -29224098.504,321.52,0.91,321.52,0.889,-3215.18,0.769,-3215.18,0.785,-1205.69,0.828,-2813.28,0.836 -29224298.504,401.9,0.905,1044.93,0.885,-3215.18,0.784,-3215.18,0.793,-401.9,0.818,-1929.11,0.817 -29224498.504,884.17,0.869,1044.93,0.866,-3215.18,0.792,-3215.18,0.795,321.52,0.8,-3215.18,0.799 -29224698.504,1044.93,0.794,1446.83,0.819,-2411.38,0.797,-2250.62,0.799,803.79,0.781,-3215.18,0.786 -29224898.504,1044.93,0.668,1527.21,0.716,-1607.59,0.809,-1527.21,0.809,1607.59,0.768,-3215.18,0.778 -29225098.504,nan,0.539,nan,0.596,-884.17,0.826,-803.79,0.824,2813.28,0.763,-3215.18,0.77 -29225298.504,nan,0.427,nan,0.481,-482.28,0.845,-241.14,0.84,3215.18,0.768,-2813.28,0.767 -29225498.504,nan,0.538,nan,0.482,160.76,0.865,321.52,0.857,3215.18,0.767,-3215.18,0.767 -29225698.504,-2170.24,0.67,nan,0.617,884.17,0.879,964.55,0.872,3215.18,0.76,-3215.18,0.767 -29225898.504,-1768.35,0.755,-1768.35,0.719,1446.83,0.891,1527.21,0.884,3215.18,0.746,-3215.18,0.773 -29226098.504,-1205.69,0.817,-1205.69,0.799,2250.62,0.903,2250.62,0.897,-3215.18,0.746,-3215.18,0.781 -29226298.504,-803.79,0.871,-643.04,0.861,2974.04,0.917,2893.66,0.914,-3215.18,0.755,-3215.18,0.785 -29226498.504,-401.9,0.919,-321.52,0.908,3215.18,0.936,3215.18,0.934,-3215.18,0.767,-3215.18,0.789 -29226698.504,-160.76,0.955,-80.38,0.949,3215.18,0.945,3215.18,0.945,-3215.18,0.78,-3215.18,0.797 -29226898.504,80.38,0.978,80.38,0.977,3215.18,0.939,3215.18,0.945,-3215.18,0.797,-3215.18,0.809 -29227098.504,321.52,0.989,241.14,0.988,3215.18,0.923,3215.18,0.935,-3215.18,0.816,-3215.18,0.825 -29227298.504,482.28,0.987,401.9,0.988,3215.18,0.9,3215.18,0.917,-3215.18,0.837,-3215.18,0.845 -29227498.504,723.41,0.972,643.04,0.974,3215.18,0.867,3215.18,0.891,-3215.18,0.848,-3215.18,0.857 -29227698.504,1044.93,0.951,884.17,0.95,3215.18,0.793,3215.18,0.838,-3134.8,0.845,-3215.18,0.857 -29227898.504,1527.21,0.924,1366.45,0.918,3215.18,0.661,3215.18,0.74,-2331.0,0.845,-2652.52,0.849 -29228098.504,2009.48,0.901,1929.11,0.884,nan,0.49,nan,0.61,-1527.21,0.851,-1848.73,0.849 -29228298.504,2732.9,0.892,2491.76,0.853,nan,0.551,nan,0.577,-803.79,0.864,-1125.31,0.856 -29228498.504,3215.18,0.912,2974.04,0.841,-1446.83,0.66,-3215.18,0.672,-80.38,0.877,-401.9,0.863 -29228698.504,3215.18,0.927,3215.18,0.824,-1125.31,0.752,-1929.11,0.74,562.66,0.885,241.14,0.867 -29228898.504,3215.18,0.922,3215.18,0.749,-884.17,0.834,-1527.21,0.813,1125.31,0.889,964.55,0.867 -29229098.504,3215.18,0.891,nan,0.55,-803.79,0.903,-1125.31,0.882,1768.35,0.89,1527.21,0.866 -29229298.504,3215.18,0.684,nan,0.334,-241.14,0.947,-562.66,0.928,2331.0,0.89,2089.86,0.863 -29229498.504,nan,0.185,nan,0.439,0.0,0.95,80.38,0.94,2974.04,0.894,2652.52,0.867 -29229698.504,nan,0.268,nan,0.572,643.04,0.911,643.04,0.916,3215.18,0.904,3215.18,0.876 -29229898.504,nan,0.376,nan,0.642,1205.69,0.853,1125.31,0.872,3215.18,0.915,3215.18,0.887 -29230098.504,nan,0.445,nan,0.596,1768.35,0.787,1768.35,0.82,3215.18,0.928,3215.18,0.901 -29230298.504,nan,0.576,nan,0.559,1848.73,0.711,2089.86,0.756,3215.18,0.948,3215.18,0.914 -29230498.504,321.52,0.741,nan,0.594,321.52,0.652,1125.31,0.687,3215.18,0.965,3215.18,0.926 -29230698.504,321.52,0.771,nan,0.638,80.38,0.678,401.9,0.69,3215.18,0.972,3215.18,0.934 -29230898.504,321.52,0.758,0.0,0.683,80.38,0.715,321.52,0.712,3215.18,0.965,3215.18,0.939 -29231098.504,321.52,0.678,321.52,0.699,321.52,0.725,482.28,0.71,3215.18,0.945,3215.18,0.944 -29231298.504,nan,0.587,321.52,0.659,482.28,0.703,643.04,0.674,3215.18,0.912,3215.18,0.951 -29231498.504,nan,0.536,nan,0.618,482.28,0.661,nan,0.616,3215.18,0.855,3215.18,0.953 -29231698.504,nan,0.522,nan,0.593,nan,0.645,nan,0.579,3215.18,0.74,3215.18,0.954 -29231898.504,nan,0.549,nan,0.583,0.0,0.699,nan,0.632,nan,0.571,3215.18,0.951 -29232098.504,nan,0.609,nan,0.634,0.0,0.782,-80.38,0.726,nan,0.451,3215.18,0.945 -29232298.504,-803.79,0.688,-241.14,0.694,80.38,0.849,0.0,0.808,nan,0.641,3215.18,0.932 -29232498.504,-723.41,0.767,-241.14,0.753,401.9,0.876,321.52,0.855,-3215.18,0.818,3215.18,0.889 -29232698.504,-401.9,0.811,80.38,0.799,562.66,0.863,482.28,0.864,-3215.18,0.907,3215.18,0.796 -29232898.504,-160.76,0.826,321.52,0.802,643.04,0.824,643.04,0.846,-3215.18,0.947,nan,0.614 -29233098.504,80.38,0.857,321.52,0.815,643.04,0.789,562.66,0.832,-3215.18,0.963,nan,0.433 -29233298.504,321.52,0.882,321.52,0.841,401.9,0.8,401.9,0.846,-3215.18,0.966,-3215.18,0.67 -29233498.504,-160.76,0.814,321.52,0.77,321.52,0.85,321.52,0.886,-3215.18,0.968,-3215.18,0.816 -29233698.504,160.76,0.669,nan,0.594,562.66,0.887,562.66,0.915,-3215.18,0.969,-3215.18,0.896 -29233898.504,nan,0.538,nan,0.464,964.55,0.88,1044.93,0.911,-3215.18,0.967,-3215.18,0.932 -29234098.504,nan,0.452,nan,0.385,1527.21,0.827,1446.83,0.869,-3215.18,0.963,-3215.18,0.949 -29234298.504,nan,0.435,nan,0.394,2089.86,0.744,2170.24,0.811,-3215.18,0.955,-3215.18,0.959 -29234498.504,nan,0.588,nan,0.583,nan,0.621,2652.52,0.743,-3215.18,0.942,-3215.18,0.954 -29234698.504,-482.28,0.726,-562.66,0.725,nan,0.501,nan,0.637,-3215.18,0.927,-3215.18,0.945 -29234898.504,-160.76,0.825,-241.14,0.823,nan,0.536,nan,0.538,-3215.18,0.913,-3215.18,0.934 -29235098.504,0.0,0.893,-80.38,0.899,nan,0.592,nan,0.536,-3215.18,0.9,-3215.18,0.924 -29235298.504,241.14,0.936,160.76,0.945,nan,0.606,nan,0.545,-3215.18,0.887,-3215.18,0.914 -29235498.504,321.52,0.941,321.52,0.955,nan,0.576,nan,0.542,-3215.18,0.874,-3215.18,0.903 -29235698.504,401.9,0.897,321.52,0.923,nan,0.586,nan,0.513,-3215.18,0.86,-3215.18,0.89 -29235898.504,321.52,0.835,321.52,0.874,-3215.18,0.683,nan,0.497,-3215.18,0.847,-3215.18,0.877 -29236098.504,321.52,0.774,321.52,0.822,-3215.18,0.744,nan,0.574,-3215.18,0.834,-3215.18,0.865 -29236298.504,401.9,0.711,401.9,0.763,-3215.18,0.761,nan,0.64,-3215.18,0.823,-3215.18,0.853 -29236498.504,nan,0.639,643.04,0.687,-3215.18,0.774,-1527.21,0.696,-3215.18,0.817,-3215.18,0.846 -29236698.504,nan,0.555,nan,0.588,-3215.18,0.787,-1044.93,0.743,-3215.18,0.815,-3215.18,0.844 -29236898.504,nan,0.521,nan,0.478,-1929.11,0.805,-884.17,0.785,-3215.18,0.817,-3215.18,0.845 -29237098.504,-3215.18,0.707,-3215.18,0.656,-1205.69,0.828,-964.55,0.818,-3215.18,0.822,-3215.18,0.847 -29237298.504,-3215.18,0.835,-3215.18,0.805,-803.79,0.844,-562.66,0.843,-3215.18,0.828,-3215.18,0.85 -29237498.504,-3215.18,0.906,-3215.18,0.893,-643.04,0.837,-401.9,0.841,-3215.18,0.833,-3215.18,0.852 -29237698.504,-3215.18,0.935,-3215.18,0.929,-482.28,0.797,-401.9,0.788,-3215.18,0.836,-3215.18,0.854 -29237898.504,-3215.18,0.935,-3215.18,0.93,-3215.18,0.77,-3215.18,0.76,-3215.18,0.839,-3215.18,0.854 -29238098.504,-3215.18,0.929,-3215.18,0.927,-3215.18,0.743,-3215.18,0.726,-3215.18,0.839,-3215.18,0.853 -29238298.504,-3215.18,0.922,-3215.18,0.921,-3215.18,0.749,-3215.18,0.73,-3215.18,0.837,-3215.18,0.85 -29238498.504,-3215.18,0.913,-3215.18,0.913,-3215.18,0.784,-3215.18,0.78,-3215.18,0.831,-3215.18,0.844 -29238698.504,-3215.18,0.901,-3215.18,0.902,-3215.18,0.822,-3215.18,0.829,-3215.18,0.826,-3215.18,0.837 -29238898.504,-3215.18,0.884,-3215.18,0.886,-3215.18,0.84,-3215.18,0.849,-3215.18,0.821,-3215.18,0.831 -29239098.504,-3215.18,0.864,-3215.18,0.866,-3215.18,0.846,-3215.18,0.853,-3215.18,0.817,-3215.18,0.829 -29239298.504,-2813.28,0.843,-2652.52,0.846,-3215.18,0.854,-3215.18,0.862,-3215.18,0.816,-3215.18,0.827 -29239498.504,-1929.11,0.827,-1848.73,0.831,-3215.18,0.863,-3215.18,0.873,-3215.18,0.813,-3215.18,0.825 -29239698.504,-1125.31,0.815,-1044.93,0.819,-3215.18,0.869,-3215.18,0.88,-3215.18,0.81,-3215.18,0.823 -29239898.504,-321.52,0.807,-241.14,0.811,-3215.18,0.868,-3215.18,0.882,-3215.18,0.805,-3215.18,0.818 -29240098.504,482.28,0.803,562.66,0.806,-3215.18,0.86,-3215.18,0.876,-3215.18,0.798,-3215.18,0.812 -29240298.504,1286.07,0.805,1286.07,0.807,-2491.76,0.848,-2732.9,0.864,-3215.18,0.791,-3215.18,0.805 -29240498.504,2089.86,0.812,2170.24,0.815,-1607.59,0.837,-1848.73,0.853,-2652.52,0.784,-3215.18,0.799 -29240698.504,2813.28,0.827,2974.04,0.831,-884.17,0.825,-1044.93,0.84,-1848.73,0.779,-3215.18,0.792 -29240898.504,3215.18,0.848,3215.18,0.852,-80.38,0.811,-241.14,0.824,-1044.93,0.775,-2652.52,0.785 -29241098.504,3215.18,0.869,3215.18,0.872,643.04,0.793,482.28,0.803,-321.52,0.772,-1848.73,0.778 -29241298.504,3215.18,0.889,3215.18,0.891,1446.83,0.769,1286.07,0.776,-160.76,0.768,-1125.31,0.771 -29241498.504,3215.18,0.908,3215.18,0.909,-3215.18,0.746,-3215.18,0.747,482.28,0.763,-321.52,0.765 -29241698.504,3215.18,0.925,3215.18,0.925,-3215.18,0.747,-3215.18,0.744,1044.93,0.76,-241.14,0.76 -29241898.504,3215.18,0.939,3215.18,0.94,-3215.18,0.755,-3215.18,0.749,1687.97,0.757,482.28,0.757 -29242098.504,3215.18,0.952,3215.18,0.952,-3215.18,0.771,-3215.18,0.765,2491.76,0.754,1286.07,0.754 -29242298.504,3215.18,0.962,3215.18,0.96,-3215.18,0.789,-3215.18,0.786,3215.18,0.754,1607.59,0.752 -29242498.504,3215.18,0.964,3215.18,0.963,-3215.18,0.8,-3215.18,0.8,3215.18,0.754,2411.38,0.754 -29242698.504,3215.18,0.955,3215.18,0.956,-2572.14,0.8,-2572.14,0.801,3215.18,0.756,3215.18,0.758 -29242898.504,3215.18,0.93,3215.18,0.934,-1687.97,0.814,-1768.35,0.814,3215.18,0.761,3215.18,0.764 -29243098.504,3215.18,0.882,3215.18,0.893,-1044.93,0.838,-1125.31,0.837,3215.18,0.767,3215.18,0.77 -29243298.504,3215.18,0.8,3215.18,0.818,-482.28,0.867,-562.66,0.866,3215.18,0.774,3215.18,0.776 -29243498.504,3215.18,0.667,3215.18,0.689,0.0,0.896,-80.38,0.895,3215.18,0.779,3215.18,0.779 -29243698.504,nan,0.444,nan,0.468,401.9,0.92,401.9,0.919,3215.18,0.782,3215.18,0.781 -29243898.504,-3215.18,0.683,-3215.18,0.694,723.41,0.932,723.41,0.93,3215.18,0.783,3215.18,0.78 -29244098.504,-3215.18,0.799,-3215.18,0.815,964.55,0.93,964.55,0.927,3215.18,0.78,3215.18,0.776 -29244298.504,-3215.18,0.841,-3215.18,0.855,1286.07,0.912,1286.07,0.909,3215.18,0.772,3215.18,0.767 -29244498.504,-3215.18,0.862,-3215.18,0.873,1687.97,0.884,1687.97,0.88,3215.18,0.761,3215.18,0.756 -29244698.504,-3215.18,0.88,-3215.18,0.89,2089.86,0.856,2170.24,0.854,3215.18,0.745,3215.18,0.741 -29244898.504,-3215.18,0.903,-3215.18,0.911,2652.52,0.834,2652.52,0.835,-3215.18,0.738,-3215.18,0.746 -29245098.504,-3215.18,0.921,-3215.18,0.927,3215.18,0.815,3215.18,0.823,-3215.18,0.762,-3215.18,0.767 -29245298.504,-3215.18,0.927,-3215.18,0.933,3215.18,0.765,3215.18,0.78,-3215.18,0.784,-3215.18,0.787 -29245498.504,-3215.18,0.923,-3215.18,0.93,3215.18,0.659,3215.18,0.697,-3215.18,0.802,-3215.18,0.804 -29245698.504,-3215.18,0.918,-3215.18,0.926,nan,0.535,nan,0.61,-3215.18,0.818,-3215.18,0.818 -29245898.504,-3215.18,0.918,-3215.18,0.925,nan,0.594,nan,0.64,-3215.18,0.829,-3215.18,0.829 -29246098.504,-3215.18,0.918,-3215.18,0.925,321.52,0.704,482.28,0.739,-3215.18,0.836,-3215.18,0.835 -29246298.504,-3215.18,0.914,-3215.18,0.92,321.52,0.821,482.28,0.837,-3215.18,0.837,-3215.18,0.837 -29246498.504,-3215.18,0.904,-3215.18,0.909,321.52,0.892,401.9,0.895,-3215.18,0.835,-3215.18,0.835 -29246698.504,-3215.18,0.89,-3215.18,0.894,401.9,0.898,482.28,0.902,-3215.18,0.829,-3215.18,0.83 -29246898.504,-2974.04,0.875,-2974.04,0.877,562.66,0.866,723.41,0.873,-3215.18,0.82,-3215.18,0.821 -29247098.504,-2170.24,0.87,-2250.62,0.871,803.79,0.816,884.17,0.827,-2491.76,0.811,-2491.76,0.812 -29247298.504,-1527.21,0.873,-1607.59,0.873,964.55,0.745,1125.31,0.759,-1768.35,0.804,-1687.97,0.805 -29247498.504,-1044.93,0.881,-1044.93,0.88,964.55,0.661,1286.07,0.675,-964.55,0.799,-964.55,0.801 -29247698.504,-482.28,0.889,-562.66,0.887,nan,0.592,nan,0.58,-241.14,0.798,-482.28,0.8 -29247898.504,0.0,0.893,0.0,0.891,nan,0.573,nan,0.539,482.28,0.8,321.52,0.803 -29248098.504,562.66,0.895,562.66,0.891,nan,0.618,nan,0.583,1286.07,0.806,1044.93,0.808 -29248298.504,1205.69,0.893,1125.31,0.889,321.52,0.722,321.52,0.693,2009.48,0.814,1848.73,0.817 -29248498.504,1848.73,0.891,1768.35,0.887,321.52,0.841,321.52,0.83,2652.52,0.825,2652.52,0.829 -29248698.504,2491.76,0.892,2411.38,0.888,321.52,0.927,321.52,0.917,3215.18,0.838,3215.18,0.842 -29248898.504,3215.18,0.901,3134.8,0.897,241.14,0.957,321.52,0.926,3215.18,0.847,3215.18,0.851 -29249098.504,3215.18,0.909,3215.18,0.907,401.9,0.944,401.9,0.88,3215.18,0.852,3215.18,0.855 -29249298.504,3215.18,0.907,3215.18,0.904,723.41,0.898,803.79,0.814,3215.18,0.851,3215.18,0.854 -29249498.504,3215.18,0.891,3215.18,0.889,1205.69,0.808,1366.45,0.73,3215.18,0.845,3215.18,0.848 -29249698.504,3215.18,0.862,3215.18,0.861,1446.83,0.66,nan,0.621,3215.18,0.833,3215.18,0.835 -29249898.504,3215.18,0.818,3215.18,0.819,nan,0.443,nan,0.465,3215.18,0.815,3215.18,0.816 -29250098.504,3215.18,0.76,3215.18,0.763,nan,0.4,nan,0.515,3215.18,0.792,3215.18,0.791 -29250298.504,-3215.18,0.703,3215.18,0.703,nan,0.519,nan,0.628,3215.18,0.77,3215.18,0.768 -29250498.504,-3215.18,0.766,-3215.18,0.763,321.52,0.687,-241.14,0.732,3215.18,0.752,3215.18,0.748 -29250698.504,-3215.18,0.81,-3215.18,0.806,482.28,0.791,-321.52,0.806,3215.18,0.74,3215.18,0.734 -29250898.504,-3215.18,0.835,-3215.18,0.832,723.41,0.771,-160.76,0.835,-3215.18,0.745,-3215.18,0.752 -29251098.504,-3215.18,0.842,-3215.18,0.841,321.52,0.737,-401.9,0.86,-2331.0,0.757,-3215.18,0.765 -29251298.504,-2491.76,0.84,-2491.76,0.84,80.38,0.758,-241.14,0.878,-1607.59,0.763,-3215.18,0.774 -29251498.504,-1768.35,0.837,-1929.11,0.837,-241.14,0.826,160.76,0.887,-3215.18,0.767,-3215.18,0.779 -29251698.504,-1286.07,0.833,-1366.45,0.834,160.76,0.868,401.9,0.893,-3215.18,0.768,-3215.18,0.782 -29251898.504,-643.04,0.829,-643.04,0.83,723.41,0.87,1125.31,0.888,-3215.18,0.768,-3215.18,0.783 -29252098.504,80.38,0.824,-160.76,0.824,1125.31,0.842,1687.97,0.884,-3215.18,0.77,-3215.18,0.785 -29252298.504,643.04,0.814,562.66,0.816,964.55,0.749,2491.76,0.87,-3215.18,0.774,-3215.18,0.79 -29252498.504,1286.07,0.802,1286.07,0.804,321.52,0.698,3215.18,0.841,-3215.18,0.783,-3215.18,0.796 -29252698.504,2009.48,0.785,1848.73,0.788,241.14,0.712,3215.18,0.79,-3215.18,0.793,-3215.18,0.804 -29252898.504,2572.14,0.766,2652.52,0.77,321.52,0.704,3215.18,0.729,-3215.18,0.806,-3215.18,0.813 -29253098.504,3215.18,0.748,3215.18,0.752,nan,0.639,nan,0.647,-3215.18,0.816,-3215.18,0.82 -29253298.504,3215.18,0.722,3215.18,0.727,nan,0.547,nan,0.568,-3215.18,0.821,-3215.18,0.822 -29253498.504,-3215.18,0.744,-3215.18,0.74,nan,0.439,nan,0.521,-3215.18,0.82,-3215.18,0.818 -29253698.504,-3215.18,0.778,-3215.18,0.774,nan,0.38,nan,0.626,-2732.9,0.814,-2732.9,0.812 -29253898.504,-3215.18,0.81,-3215.18,0.806,nan,0.427,-3215.18,0.77,-2009.48,0.812,-1929.11,0.808 -29254098.504,-3215.18,0.835,-3215.18,0.832,nan,0.644,-3215.18,0.852,-1205.69,0.814,-1125.31,0.809 -29254298.504,-3215.18,0.849,-3215.18,0.847,-3215.18,0.777,-3215.18,0.899,-482.28,0.819,-482.28,0.812 -29254498.504,-3215.18,0.853,-3215.18,0.853,-3215.18,0.875,-3215.18,0.938,160.76,0.824,321.52,0.817 -29254698.504,-3215.18,0.85,-3215.18,0.851,-3215.18,0.94,-3215.18,0.958,884.17,0.83,1044.93,0.823 -29254898.504,-3215.18,0.842,-3215.18,0.844,-3215.18,0.972,-3215.18,0.963,1527.21,0.837,1687.97,0.832 -29255098.504,-3215.18,0.832,-3215.18,0.836,-3215.18,0.984,-3215.18,0.968,2250.62,0.847,2411.38,0.843 -29255298.504,-3215.18,0.82,-3215.18,0.824,-3215.18,0.986,-3215.18,0.971,2974.04,0.858,3134.8,0.857 -29255498.504,-2974.04,0.804,-2652.52,0.808,-3215.18,0.985,-3215.18,0.97,3215.18,0.872,3215.18,0.871 -29255698.504,-2170.24,0.787,-1848.73,0.792,-3215.18,0.976,-3215.18,0.965,3215.18,0.882,3215.18,0.88 -29255898.504,-1366.45,0.772,-1044.93,0.777,-3215.18,0.957,-3215.18,0.946,3215.18,0.886,3215.18,0.884 -29256098.504,-562.66,0.758,-401.9,0.764,-3215.18,0.927,-3054.42,0.917,3215.18,0.882,3215.18,0.881 -29256298.504,-3215.18,0.751,321.52,0.753,-2491.76,0.904,-2331.0,0.898,3215.18,0.869,3215.18,0.868 -29256498.504,-3215.18,0.749,-3215.18,0.747,-1848.73,0.899,-1687.97,0.898,3215.18,0.843,3215.18,0.845 -29256698.504,-3054.42,0.749,-2572.14,0.746,-1205.69,0.904,-1044.93,0.907,3215.18,0.804,3215.18,0.807 -29256898.504,-2250.62,0.752,-1768.35,0.751,-643.04,0.91,-562.66,0.916,3215.18,0.755,3215.18,0.761 -29257098.504,-1446.83,0.762,-964.55,0.762,-241.14,0.911,-80.38,0.92,-3215.18,0.71,3215.18,0.714 -29257298.504,-643.04,0.777,-160.76,0.777,160.76,0.9,321.52,0.908,-3215.18,0.754,-3215.18,0.745 -29257498.504,80.38,0.795,643.04,0.797,482.28,0.876,723.41,0.88,-2974.04,0.779,-2893.66,0.771 -29257698.504,884.17,0.815,1446.83,0.819,884.17,0.838,964.55,0.836,-2089.86,0.799,-2089.86,0.793 -29257898.504,1607.59,0.836,2170.24,0.84,1205.69,0.795,1366.45,0.784,-1366.45,0.821,-1286.07,0.817 -29258098.504,2089.86,0.856,2652.52,0.862,1687.97,0.752,1848.73,0.731,-723.41,0.842,-643.04,0.839 -29258298.504,2732.9,0.877,3215.18,0.884,2250.62,0.714,2491.76,0.683,-80.38,0.859,0.0,0.856 -29258498.504,3215.18,0.898,3215.18,0.904,3215.18,0.684,nan,0.64,401.9,0.866,482.28,0.865 -29258698.504,3215.18,0.916,3215.18,0.921,-3215.18,0.674,-3215.18,0.681,884.17,0.862,964.55,0.863 -29258898.504,3215.18,0.931,3215.18,0.934,-2893.66,0.709,-3215.18,0.724,1286.07,0.851,1527.21,0.853 -29259098.504,3215.18,0.942,3215.18,0.945,-2009.48,0.744,-2009.48,0.76,1768.35,0.835,2009.48,0.84 -29259298.504,3215.18,0.952,3215.18,0.954,-1205.69,0.783,-1366.45,0.801,2411.38,0.818,2491.76,0.825 -29259498.504,3215.18,0.961,3215.18,0.965,-723.41,0.817,-884.17,0.837,3215.18,0.801,3215.18,0.811 -29259698.504,3215.18,0.97,3215.18,0.973,-321.52,0.838,-482.28,0.858,3215.18,0.779,3215.18,0.789 -29259898.504,3215.18,0.974,3215.18,0.979,80.38,0.837,-80.38,0.857,3215.18,0.744,3215.18,0.753 -29260098.504,3215.18,0.972,3215.18,0.979,401.9,0.815,160.76,0.836,3215.18,0.694,3215.18,0.703 -29260298.504,3215.18,0.957,3215.18,0.969,803.79,0.774,562.66,0.796,-3215.18,0.759,-3215.18,0.755 -29260498.504,3215.18,0.928,3215.18,0.946,1286.07,0.723,1125.31,0.747,-3215.18,0.816,-3215.18,0.814 -29260698.504,3215.18,0.881,3215.18,0.907,-3215.18,0.691,1527.21,0.694,-3215.18,0.854,-3215.18,0.853 -29260898.504,3215.18,0.797,3215.18,0.828,-3215.18,0.727,-3215.18,0.707,-3215.18,0.872,-3215.18,0.871 -29261098.504,nan,0.648,3215.18,0.654,-3215.18,0.782,-3215.18,0.757,-3215.18,0.872,-3215.18,0.872 -29261298.504,-3215.18,0.723,-3215.18,0.662,-3215.18,0.834,-3215.18,0.812,-2732.9,0.862,-2813.28,0.862 -29261498.504,-3215.18,0.822,-3215.18,0.792,-3215.18,0.87,-3215.18,0.854,-1929.11,0.857,-2009.48,0.857 -29261698.504,-3215.18,0.886,-3215.18,0.866,-3215.18,0.889,-3215.18,0.878,-1286.07,0.858,-1366.45,0.858 -29261898.504,-3215.18,0.913,-3215.18,0.898,-3215.18,0.893,-3215.18,0.885,-723.41,0.862,-803.79,0.863 -29262098.504,-3215.18,0.913,-3215.18,0.9,-3054.42,0.885,-3054.42,0.88,-241.14,0.866,-241.14,0.868 -29262298.504,-3215.18,0.901,-3215.18,0.892,-2331.0,0.881,-2331.0,0.878,241.14,0.867,241.14,0.871 -29262498.504,-3215.18,0.895,-3215.18,0.891,-1687.97,0.884,-1607.59,0.882,723.41,0.862,723.41,0.868 -29262698.504,-3215.18,0.893,-3215.18,0.897,-1044.93,0.89,-964.55,0.889,1286.07,0.851,1286.07,0.859 -29262898.504,-3215.18,0.885,-3215.18,0.892,-401.9,0.896,-401.9,0.897,1768.35,0.838,1848.73,0.849 -29263098.504,-3215.18,0.871,-3215.18,0.876,241.14,0.902,241.14,0.903,2491.76,0.83,2572.14,0.844 -29263298.504,-3215.18,0.858,-3215.18,0.859,803.79,0.906,803.79,0.908,3215.18,0.834,3215.18,0.851 -29263498.504,-3215.18,0.855,-3215.18,0.853,1366.45,0.908,1286.07,0.911,3215.18,0.84,3215.18,0.863 -29263698.504,-3215.18,0.861,-3215.18,0.855,1929.11,0.908,1929.11,0.912,3215.18,0.837,3215.18,0.864 -29263898.504,-3215.18,0.872,-3215.18,0.865,2491.76,0.908,2411.38,0.912,3215.18,0.831,3215.18,0.86 -29264098.504,-3215.18,0.884,-3215.18,0.878,3054.42,0.909,2974.04,0.912,3215.18,0.832,3215.18,0.861 -29264298.504,-3215.18,0.892,-3215.18,0.888,3215.18,0.911,3215.18,0.913,3215.18,0.843,3215.18,0.867 -29264498.504,-3215.18,0.893,-3215.18,0.892,3215.18,0.903,3215.18,0.906,3215.18,0.846,3215.18,0.862 -29264698.504,-3215.18,0.888,-3215.18,0.888,3215.18,0.881,3215.18,0.886,3215.18,0.826,3215.18,0.831 -29264898.504,-3215.18,0.88,-3215.18,0.88,3215.18,0.838,3215.18,0.845,1044.93,0.822,1205.69,0.796 -29265098.504,-3215.18,0.872,-3215.18,0.873,3215.18,0.766,3215.18,0.77,884.17,0.833,964.55,0.809 -29265298.504,-3215.18,0.863,-3215.18,0.865,3215.18,0.663,3215.18,0.657,1044.93,0.831,1044.93,0.813 -29265498.504,-3215.18,0.851,-3215.18,0.853,-3215.18,0.694,-3215.18,0.676,1205.69,0.809,1205.69,0.795 -29265698.504,-3215.18,0.836,-3215.18,0.837,-3215.18,0.761,-3215.18,0.753,1527.21,0.755,1366.45,0.746 -29265898.504,-3215.18,0.819,-3215.18,0.819,-2572.14,0.805,-2572.14,0.802,1687.97,0.663,1607.59,0.651 -29266098.504,-3215.18,0.806,-3215.18,0.805,-1848.73,0.842,-1929.11,0.841,nan,0.499,nan,0.492 -29266298.504,-3215.18,0.798,-3215.18,0.796,-1366.45,0.868,-1446.83,0.87,nan,0.293,nan,0.338 -29266498.504,-3215.18,0.796,-3215.18,0.791,-803.79,0.883,-884.17,0.887,nan,0.363,nan,0.338 -29266698.504,-3215.18,0.792,-3215.18,0.787,-321.52,0.886,-482.28,0.892,nan,0.599,nan,0.466 -29266898.504,-2411.38,0.791,-2491.76,0.786,160.76,0.879,80.38,0.884,-3215.18,0.772,-3215.18,0.664 -29267098.504,-1607.59,0.799,-1527.21,0.794,723.41,0.862,562.66,0.866,-3215.18,0.867,-3215.18,0.807 -29267298.504,-803.79,0.815,-884.17,0.81,1286.07,0.837,1125.31,0.839,-3215.18,0.909,-3215.18,0.877 -29267498.504,-80.38,0.836,-160.76,0.831,1929.11,0.812,1768.35,0.808,-3215.18,0.922,-3215.18,0.903 -29267698.504,482.28,0.858,562.66,0.853,2652.52,0.791,2491.76,0.782,-3215.18,0.923,-3215.18,0.912 -29267898.504,1044.93,0.875,1125.31,0.87,3215.18,0.775,3215.18,0.761,-3215.18,0.916,-3215.18,0.908 -29268098.504,1446.83,0.883,1527.21,0.878,3215.18,0.746,3215.18,0.73,-2813.28,0.906,-2732.9,0.901 -29268298.504,1848.73,0.882,1848.73,0.876,3215.18,0.702,-3215.18,0.712,-2250.62,0.901,-2250.62,0.899 -29268498.504,2250.62,0.872,2411.38,0.866,-3215.18,0.753,-3215.18,0.767,-1687.97,0.904,-1687.97,0.902 -29268698.504,2813.28,0.855,2893.66,0.847,-3215.18,0.805,-3215.18,0.821,-1205.69,0.911,-1125.31,0.909 -29268898.504,3215.18,0.836,3215.18,0.827,-3215.18,0.846,-3215.18,0.862,-643.04,0.918,-723.41,0.916 -29269098.504,3215.18,0.811,3215.18,0.798,-3215.18,0.872,-3215.18,0.888,-160.76,0.921,-160.76,0.92 -29269298.504,3215.18,0.776,3215.18,0.759,-3215.18,0.885,-3215.18,0.899,401.9,0.919,401.9,0.918 -29269498.504,3215.18,0.72,3215.18,0.7,-3215.18,0.888,-3215.18,0.899,964.55,0.912,964.55,0.911 -29269698.504,nan,0.647,-3215.18,0.671,-3215.18,0.883,-3215.18,0.892,1527.21,0.901,1527.21,0.902 -29269898.504,-3215.18,0.739,-3215.18,0.755,-3215.18,0.873,-3215.18,0.878,2089.86,0.892,2170.24,0.892 -29270098.504,-3215.18,0.811,-3215.18,0.818,-3215.18,0.858,-2813.28,0.86,2732.9,0.891,2732.9,0.89 -29270298.504,-3215.18,0.863,-3215.18,0.866,-2652.52,0.843,-2009.48,0.846,3215.18,0.903,3215.18,0.902 -29270498.504,-3215.18,0.894,-3215.18,0.892,-1848.73,0.831,-1607.59,0.837,3215.18,0.917,3215.18,0.916 -29270698.504,-3215.18,0.903,-3215.18,0.9,-1446.83,0.824,-884.17,0.83,3215.18,0.924,3215.18,0.923 -29270898.504,-3215.18,0.9,-3215.18,0.896,-803.79,0.817,-321.52,0.824,3215.18,0.923,3215.18,0.924 -29271098.504,-3215.18,0.893,-3215.18,0.888,-321.52,0.81,241.14,0.816,3215.18,0.92,3215.18,0.921 -29271298.504,-3215.18,0.886,-3215.18,0.881,241.14,0.801,803.79,0.807,3215.18,0.915,3215.18,0.918 -29271498.504,-3215.18,0.881,-3215.18,0.876,884.17,0.791,1286.07,0.798,3215.18,0.904,3215.18,0.911 -29271698.504,-3215.18,0.878,-3215.18,0.874,1527.21,0.782,1929.11,0.79,3215.18,0.887,3215.18,0.901 -29271898.504,-3215.18,0.875,-3215.18,0.872,2250.62,0.778,2732.9,0.787,3215.18,0.866,3215.18,0.891 -29272098.504,-3215.18,0.868,-3215.18,0.866,3054.42,0.781,3215.18,0.79,3215.18,0.838,3215.18,0.874 -29272298.504,-3215.18,0.856,-3215.18,0.856,3215.18,0.788,3215.18,0.794,3215.18,0.798,3215.18,0.846 -29272498.504,-2652.52,0.843,-2732.9,0.843,3215.18,0.798,3215.18,0.8,1768.35,0.781,3215.18,0.813 -29272698.504,-1929.11,0.837,-1929.11,0.837,3215.18,0.813,3215.18,0.811,1929.11,0.753,2572.14,0.784 -29272898.504,-1205.69,0.835,-1205.69,0.835,3215.18,0.833,3215.18,0.829,2331.0,0.675,2732.9,0.727 -29273098.504,-482.28,0.836,-562.66,0.835,3215.18,0.858,3215.18,0.853,nan,0.504,nan,0.64 -29273298.504,80.38,0.837,0.0,0.837,3215.18,0.882,3215.18,0.877,nan,0.237,nan,0.487 -29273498.504,723.41,0.838,562.66,0.838,3215.18,0.9,3215.18,0.895,nan,0.145,nan,0.496 -29273698.504,1366.45,0.84,1205.69,0.839,3215.18,0.909,3215.18,0.905,nan,0.414,-3215.18,0.727 -29273898.504,2009.48,0.842,1768.35,0.842,3215.18,0.909,3215.18,0.906,nan,0.631,-3215.18,0.788 -29274098.504,2572.14,0.847,2491.76,0.846,3215.18,0.901,3215.18,0.899,-2813.28,0.722,-3215.18,0.807 -29274298.504,3215.18,0.857,3215.18,0.854,3215.18,0.887,3215.18,0.884,-2491.76,0.77,-2813.28,0.817 -29274498.504,3215.18,0.869,3215.18,0.867,3215.18,0.856,3215.18,0.853,-2009.48,0.802,-2331.0,0.829 -29274698.504,3215.18,0.881,3215.18,0.878,3215.18,0.794,3215.18,0.79,-1607.59,0.83,-1929.11,0.843 -29274898.504,3215.18,0.89,3215.18,0.887,3215.18,0.686,3215.18,0.683,-1366.45,0.851,-1446.83,0.858 -29275098.504,3215.18,0.896,3215.18,0.892,nan,0.591,nan,0.605,-1044.93,0.863,-1286.07,0.866 -29275298.504,3215.18,0.902,3215.18,0.897,-3215.18,0.774,-3215.18,0.783,-884.17,0.86,-1044.93,0.859 -29275498.504,3215.18,0.91,3215.18,0.905,-3215.18,0.866,-3215.18,0.874,-803.79,0.844,-3215.18,0.841 -29275698.504,3215.18,0.922,3215.18,0.916,-3215.18,0.893,-3215.18,0.898,-3215.18,0.824,-3215.18,0.829 -29275898.504,3215.18,0.934,3215.18,0.928,-3215.18,0.897,-3215.18,0.9,-3215.18,0.803,-3215.18,0.807 -29276098.504,3215.18,0.941,3215.18,0.939,-3054.42,0.892,-3054.42,0.895,-3215.18,0.779,-3215.18,0.784 -29276298.504,3215.18,0.939,3215.18,0.942,-2411.38,0.893,-2491.76,0.892,-1929.11,0.763,-2250.62,0.767 -29276498.504,3215.18,0.921,3215.18,0.934,-1848.73,0.897,-1929.11,0.895,-1205.69,0.76,-1286.07,0.764 -29276698.504,3215.18,0.885,3215.18,0.913,-1286.07,0.904,-1366.45,0.902,-562.66,0.766,-723.41,0.77 -29276898.504,3215.18,0.831,3215.18,0.88,-803.79,0.911,-884.17,0.909,0.0,0.778,-160.76,0.784 -29277098.504,3215.18,0.757,3215.18,0.834,-321.52,0.915,-321.52,0.914,241.14,0.798,321.52,0.804 -29277298.504,3134.8,0.654,3215.18,0.763,241.14,0.916,241.14,0.915,562.66,0.823,643.04,0.83 -29277498.504,nan,0.532,nan,0.645,803.79,0.914,723.41,0.914,723.41,0.85,884.17,0.857 -29277698.504,nan,0.471,nan,0.499,1366.45,0.911,1286.07,0.911,964.55,0.874,1044.93,0.879 -29277898.504,-3215.18,0.671,nan,0.525,1929.11,0.909,1929.11,0.909,1044.93,0.89,1205.69,0.894 -29278098.504,-3215.18,0.83,-3215.18,0.74,2652.52,0.914,2572.14,0.913,1286.07,0.897,1366.45,0.9 -29278298.504,-3215.18,0.913,-3215.18,0.872,3215.18,0.929,3215.18,0.927,1687.97,0.895,1687.97,0.899 -29278498.504,-3215.18,0.949,-3215.18,0.932,3215.18,0.947,3215.18,0.945,2170.24,0.89,2170.24,0.893 -29278698.504,-3215.18,0.949,-3215.18,0.94,3215.18,0.957,3215.18,0.958,2732.9,0.891,2813.28,0.891 -29278898.504,-3215.18,0.925,-3215.18,0.913,3215.18,0.957,3215.18,0.961,3215.18,0.913,3215.18,0.91 -29279098.504,-3215.18,0.891,-3054.42,0.876,3215.18,0.94,3215.18,0.948,3215.18,0.934,3215.18,0.93 -29279298.504,-2411.38,0.869,-2250.62,0.86,3215.18,0.897,3215.18,0.915,3215.18,0.935,3215.18,0.936 -29279498.504,-1768.35,0.863,-1607.59,0.86,3215.18,0.817,3215.18,0.848,3215.18,0.888,3215.18,0.904 -29279698.504,-1286.07,0.866,-1205.69,0.867,3215.18,0.668,3215.18,0.722,3215.18,0.77,3215.18,0.809 -29279898.504,-1044.93,0.872,-964.55,0.876,nan,0.525,nan,0.52,nan,0.574,nan,0.634 -29280098.504,-803.79,0.874,-723.41,0.881,-482.28,0.651,nan,0.619,nan,0.433,nan,0.411 -29280298.504,-482.28,0.867,-482.28,0.876,-160.76,0.756,-160.76,0.728,nan,0.571,nan,0.519 -29280498.504,-80.38,0.847,-160.76,0.857,80.38,0.837,160.76,0.813,-2652.52,0.695,nan,0.647 -29280698.504,241.14,0.815,241.14,0.824,321.52,0.893,321.52,0.877,-2411.38,0.776,-2170.24,0.74 -29280898.504,803.79,0.777,803.79,0.784,321.52,0.93,401.9,0.92,-2089.86,0.829,-1848.73,0.803 -29281098.504,1366.45,0.74,1446.83,0.744,321.52,0.955,401.9,0.948,-1527.21,0.873,-1527.21,0.856 -29281298.504,-3215.18,0.714,2089.86,0.708,321.52,0.975,321.52,0.97,-1125.31,0.917,-1044.93,0.907 -29281498.504,-3215.18,0.738,-3215.18,0.732,401.9,0.981,401.9,0.977,-643.04,0.952,-562.66,0.946 -29281698.504,-3215.18,0.77,-3215.18,0.766,643.04,0.958,643.04,0.959,-160.76,0.962,-80.38,0.957 -29281898.504,-3215.18,0.802,-3215.18,0.802,964.55,0.904,964.55,0.91,160.76,0.939,241.14,0.936 -29282098.504,-3215.18,0.832,-3215.18,0.834,1366.45,0.822,1366.45,0.831,482.28,0.886,482.28,0.883 -29282298.504,-3215.18,0.853,-3215.18,0.857,1687.97,0.716,1687.97,0.73,723.41,0.811,723.41,0.81 -29282498.504,-3215.18,0.862,-3215.18,0.867,nan,0.556,nan,0.582,803.79,0.727,723.41,0.727 -29282698.504,-3215.18,0.861,-3215.18,0.867,nan,0.322,nan,0.356,nan,0.649,803.79,0.652 -29282898.504,-3215.18,0.856,-3215.18,0.863,nan,0.333,nan,0.33,nan,0.596,nan,0.598 -29283098.504,-3215.18,0.849,-3215.18,0.856,nan,0.448,nan,0.435,nan,0.58,nan,0.583 -29283298.504,-3215.18,0.84,-3215.18,0.848,nan,0.52,nan,0.491,nan,0.611,nan,0.608 -29283498.504,-3215.18,0.831,-3215.18,0.839,nan,0.465,nan,0.449,-803.79,0.674,-803.79,0.669 -29283698.504,-3215.18,0.821,-3215.18,0.829,nan,0.441,nan,0.442,-803.79,0.742,-803.79,0.743 -29283898.504,-3215.18,0.813,-3215.18,0.821,nan,0.505,nan,0.517,-884.17,0.805,-643.04,0.805 -29284098.504,-3215.18,0.806,-3215.18,0.815,nan,0.559,nan,0.569,-723.41,0.855,-562.66,0.855 -29284298.504,-3215.18,0.802,-3215.18,0.81,nan,0.606,nan,0.62,-482.28,0.882,-321.52,0.885 -29284498.504,-3215.18,0.798,-3215.18,0.806,-3215.18,0.697,-3215.18,0.71,-160.76,0.89,-80.38,0.894 -29284698.504,-3134.8,0.792,-3215.18,0.8,-3215.18,0.785,-3215.18,0.791,241.14,0.885,321.52,0.889 -29284898.504,-2331.0,0.788,-2572.14,0.794,-3215.18,0.856,-3215.18,0.856,723.41,0.874,723.41,0.879 -29285098.504,-1527.21,0.785,-1848.73,0.789,-3215.18,0.903,-3215.18,0.9,1125.31,0.866,1286.07,0.87 -29285298.504,-803.79,0.784,-1125.31,0.785,-3215.18,0.921,-3215.18,0.916,1687.97,0.864,1929.11,0.867 -29285498.504,-160.76,0.781,-401.9,0.78,-2572.14,0.922,-2491.76,0.918,2411.38,0.871,2652.52,0.874 -29285698.504,643.04,0.778,160.76,0.774,-1768.35,0.923,-1687.97,0.923,3215.18,0.894,3215.18,0.897 -29285898.504,1366.45,0.772,964.55,0.766,-1044.93,0.927,-964.55,0.928,3215.18,0.916,3215.18,0.919 -29286098.504,2089.86,0.763,1527.21,0.756,-241.14,0.932,-241.14,0.932,3215.18,0.922,3215.18,0.925 -29286298.504,2893.66,0.752,2331.0,0.744,241.14,0.938,321.52,0.935,3215.18,0.914,3215.18,0.916 -29286498.504,3215.18,0.739,-3215.18,0.74,643.04,0.937,803.79,0.93,3215.18,0.897,3215.18,0.899 -29286698.504,-3215.18,0.737,-3215.18,0.748,964.55,0.925,1044.93,0.914,3215.18,0.879,3215.18,0.881 -29286898.504,-3215.18,0.75,-3215.18,0.759,1125.31,0.904,1125.31,0.891,3215.18,0.853,3215.18,0.854 -29287098.504,-3215.18,0.764,-3215.18,0.772,1286.07,0.879,1366.45,0.864,3215.18,0.82,3215.18,0.818 -29287298.504,-3215.18,0.773,-3215.18,0.78,1446.83,0.852,1366.45,0.836,3215.18,0.788,3215.18,0.782 -29287498.504,-2732.9,0.778,-2893.66,0.784,1527.21,0.821,1527.21,0.804,3215.18,0.762,3215.18,0.75 -29287698.504,-1929.11,0.786,-2089.86,0.788,1607.59,0.785,1446.83,0.77,3215.18,0.721,3215.18,0.673 -29287898.504,-1205.69,0.796,-1366.45,0.796,1687.97,0.736,1607.59,0.719,nan,0.576,nan,0.461 -29288098.504,-562.66,0.806,-723.41,0.805,1929.11,0.652,nan,0.637,nan,0.298,nan,0.188 -29288298.504,80.38,0.815,0.0,0.811,nan,0.493,nan,0.491,nan,0.592,nan,0.271 -29288498.504,723.41,0.821,643.04,0.815,nan,0.309,nan,0.354,-3215.18,0.768,nan,0.599 -29288698.504,1366.45,0.823,1366.45,0.816,nan,0.371,nan,0.4,-3215.18,0.831,-3215.18,0.737 -29288898.504,2009.48,0.825,1929.11,0.816,nan,0.543,nan,0.534,-3215.18,0.851,-3215.18,0.801 -29289098.504,2732.9,0.827,2652.52,0.817,-964.55,0.665,nan,0.642,-3215.18,0.854,-3215.18,0.824 -29289298.504,3215.18,0.834,3215.18,0.822,-803.79,0.723,-643.04,0.696,-3215.18,0.852,-3134.8,0.832 -29289498.504,3215.18,0.841,3215.18,0.827,-723.41,0.742,-562.66,0.715,-2732.9,0.857,-2813.28,0.843 -29289698.504,3215.18,0.846,3215.18,0.831,-723.41,0.745,-803.79,0.716,-2250.62,0.866,-2572.14,0.857 -29289898.504,3215.18,0.848,3215.18,0.833,-3215.18,0.789,-3215.18,0.784,-2009.48,0.876,-2089.86,0.869 -29290098.504,3215.18,0.852,3215.18,0.836,-3215.18,0.842,-3215.18,0.847,-1768.35,0.875,-2009.48,0.871 -29290298.504,3215.18,0.859,3215.18,0.843,-3215.18,0.87,-3215.18,0.88,-3215.18,0.866,-3215.18,0.872 -29290498.504,3215.18,0.871,3215.18,0.856,-3215.18,0.881,-3215.18,0.895,-3215.18,0.854,-3215.18,0.863 -29290698.504,3215.18,0.888,3215.18,0.873,-3215.18,0.883,-3215.18,0.899,-3215.18,0.833,-3215.18,0.843 -29290898.504,3215.18,0.904,3215.18,0.891,-3215.18,0.886,-3215.18,0.903,-3215.18,0.807,-3215.18,0.818 -29291098.504,3215.18,0.918,3215.18,0.906,-3215.18,0.895,-3215.18,0.909,-3215.18,0.785,-3215.18,0.795 -29291298.504,3215.18,0.926,3215.18,0.916,-3215.18,0.899,-3215.18,0.91,-3215.18,0.773,-3215.18,0.78 -29291498.504,3215.18,0.928,3215.18,0.921,-3215.18,0.888,-3215.18,0.897,-3215.18,0.771,-3215.18,0.773 -29291698.504,3215.18,0.927,3215.18,0.922,-2652.52,0.867,-2732.9,0.874,-3215.18,0.775,-3215.18,0.773 -29291898.504,3215.18,0.925,3215.18,0.919,-1848.73,0.869,-1929.11,0.873,-3215.18,0.784,-3215.18,0.776 -29292098.504,3215.18,0.923,3215.18,0.915,-1125.31,0.887,-1205.69,0.887,-3215.18,0.791,-3215.18,0.778 -29292298.504,3215.18,0.921,3215.18,0.909,-562.66,0.908,-643.04,0.906,-3215.18,0.793,-3215.18,0.777 -29292498.504,3215.18,0.908,3215.18,0.892,0.0,0.925,-80.38,0.922,-3215.18,0.795,-3215.18,0.777 -29292698.504,3215.18,0.867,3215.18,0.849,401.9,0.935,401.9,0.932,-3215.18,0.797,-3215.18,0.778 -29292898.504,3215.18,0.794,3215.18,0.785,803.79,0.936,803.79,0.934,-2813.28,0.795,-2411.38,0.778 -29293098.504,3215.18,0.725,3215.18,0.736,1044.93,0.928,1125.31,0.926,-1848.73,0.796,-1446.83,0.783 -29293298.504,3215.18,0.701,3215.18,0.728,1366.45,0.916,1446.83,0.912,-803.79,0.803,-643.04,0.794 -29293498.504,723.41,0.724,884.17,0.764,1768.35,0.902,1848.73,0.899,-80.38,0.817,160.76,0.809 -29293698.504,562.66,0.808,803.79,0.83,2170.24,0.893,2331.0,0.892,401.9,0.835,803.79,0.829 -29293898.504,562.66,0.864,723.41,0.875,2732.9,0.891,2893.66,0.894,1044.93,0.855,1446.83,0.852 -29294098.504,562.66,0.885,723.41,0.897,3215.18,0.903,3215.18,0.906,1768.35,0.873,2170.24,0.875 -29294298.504,643.04,0.88,884.17,0.898,3215.18,0.907,3215.18,0.905,2411.38,0.884,2893.66,0.894 -29294498.504,884.17,0.856,1205.69,0.883,3215.18,0.892,3215.18,0.881,2893.66,0.881,3215.18,0.9 -29294698.504,1286.07,0.808,1687.97,0.864,3215.18,0.855,3215.18,0.835,3134.8,0.849,3215.18,0.878 -29294898.504,1607.59,0.723,2331.0,0.856,3215.18,0.781,3215.18,0.77,1446.83,0.803,3215.18,0.833 -29295098.504,nan,0.575,3215.18,0.89,3215.18,0.707,3215.18,0.715,1286.07,0.801,1527.21,0.812 -29295298.504,nan,0.359,3215.18,0.921,nan,0.645,3215.18,0.681,1527.21,0.783,1687.97,0.8 -29295498.504,nan,0.325,3215.18,0.852,-643.04,0.712,-482.28,0.731,1687.97,0.738,2009.48,0.757 -29295698.504,nan,0.43,3215.18,0.765,-241.14,0.795,-241.14,0.813,1768.35,0.66,2089.86,0.685 -29295898.504,nan,0.562,3215.18,0.683,241.14,0.753,241.14,0.824,nan,0.544,nan,0.566 -29296098.504,nan,0.617,nan,0.557,nan,0.642,643.04,0.762,nan,0.428,nan,0.417 -29296298.504,nan,0.616,nan,0.569,nan,0.526,884.17,0.666,nan,0.395,nan,0.305 -29296498.504,nan,0.613,nan,0.645,nan,0.45,nan,0.565,nan,0.468,nan,0.342 -29296698.504,-241.14,0.658,0.0,0.753,nan,0.491,nan,0.528,nan,0.586,nan,0.482 -29296898.504,-803.79,0.745,241.14,0.846,nan,0.574,nan,0.566,321.52,0.683,nan,0.626 -29297098.504,-482.28,0.824,321.52,0.867,nan,0.636,nan,0.616,241.14,0.731,0.0,0.758 -29297298.504,80.38,0.893,723.41,0.836,-964.55,0.683,-562.66,0.652,241.14,0.757,160.76,0.824 -29297498.504,321.52,0.949,964.55,0.756,-1125.31,0.734,-643.04,0.694,321.52,0.782,321.52,0.867 -29297698.504,321.52,0.964,401.9,0.662,-1125.31,0.79,-803.79,0.746,321.52,0.743,321.52,0.848 -29297898.504,321.52,0.902,nan,0.599,-1044.93,0.842,-723.41,0.806,nan,0.632,401.9,0.754 -29298098.504,482.28,0.72,nan,0.477,-803.79,0.894,-643.04,0.866,nan,0.557,401.9,0.696 -29298298.504,nan,0.509,nan,0.337,-482.28,0.934,-401.9,0.914,nan,0.533,321.52,0.675 -29298498.504,nan,0.357,nan,0.246,-80.38,0.946,-80.38,0.928,nan,0.644,0.0,0.7 -29298698.504,nan,0.261,nan,0.314,401.9,0.932,401.9,0.912,-160.76,0.743,0.0,0.763 -29298898.504,nan,0.44,nan,0.581,964.55,0.907,803.79,0.882,160.76,0.772,321.52,0.774 -29299098.504,nan,0.629,-2331.0,0.696,1286.07,0.868,1125.31,0.84,241.14,0.755,482.28,0.731 -29299298.504,-1848.73,0.704,-1929.11,0.734,1125.31,0.817,884.17,0.791,160.76,0.734,401.9,0.679 -29299498.504,-1607.59,0.746,-1768.35,0.761,884.17,0.783,643.04,0.768,80.38,0.742,321.52,0.664 -29299698.504,-1527.21,0.782,-2009.48,0.793,884.17,0.769,643.04,0.763,80.38,0.761,160.76,0.673 -29299898.504,-1205.69,0.817,-1848.73,0.824,964.55,0.755,803.79,0.758,0.0,0.778,80.38,0.692 -29300098.504,-1125.31,0.847,-1607.59,0.85,1044.93,0.724,884.17,0.741,-80.38,0.793,-3215.18,0.736 -29300298.504,-964.55,0.868,-1366.45,0.863,1044.93,0.676,884.17,0.709,0.0,0.808,-241.14,0.769 -29300498.504,-723.41,0.874,-1044.93,0.861,nan,0.631,723.41,0.685,321.52,0.81,80.38,0.789 -29300698.504,-401.9,0.866,-803.79,0.845,nan,0.609,562.66,0.685,803.79,0.797,482.28,0.791 -29300898.504,-80.38,0.849,-321.52,0.821,241.14,0.654,321.52,0.735,1527.21,0.777,-884.17,0.806 -29301098.504,401.9,0.831,80.38,0.802,241.14,0.74,321.52,0.803,-160.76,0.781,-80.38,0.822 -29301298.504,1044.93,0.818,401.9,0.789,482.28,0.787,643.04,0.831,321.52,0.813,241.14,0.851 -29301498.504,1687.97,0.812,-723.41,0.785,803.79,0.784,964.55,0.81,723.41,0.869,562.66,0.903 -29301698.504,2732.9,0.812,80.38,0.787,1044.93,0.729,1205.69,0.735,1125.31,0.908,803.79,0.934 -29301898.504,3215.18,0.82,482.28,0.79,643.04,0.674,nan,0.646,1286.07,0.904,1125.31,0.923 -29302098.504,3215.18,0.823,1205.69,0.791,401.9,0.685,nan,0.623,1446.83,0.88,1286.07,0.891 -29302298.504,3215.18,0.817,1768.35,0.784,321.52,0.727,401.9,0.666,1687.97,0.846,1607.59,0.847 -29302498.504,3215.18,0.809,2813.28,0.775,321.52,0.764,321.52,0.719,2009.48,0.8,1929.11,0.793 -29302698.504,3215.18,0.806,3215.18,0.776,482.28,0.768,482.28,0.751,2250.62,0.742,2170.24,0.724 -29302898.504,3215.18,0.799,3215.18,0.772,884.17,0.761,964.55,0.756,2411.38,0.675,nan,0.635 -29303098.504,3215.18,0.777,160.76,0.773,1446.83,0.747,1446.83,0.743,nan,0.567,nan,0.521 -29303298.504,562.66,0.789,482.28,0.804,0.0,0.736,-160.76,0.742,nan,0.434,nan,0.49 -29303498.504,964.55,0.81,884.17,0.823,160.76,0.767,160.76,0.774,nan,0.585,nan,0.648 -29303698.504,1446.83,0.811,1366.45,0.822,562.66,0.798,482.28,0.803,-401.9,0.725,-482.28,0.767 -29303898.504,1929.11,0.787,1929.11,0.8,803.79,0.816,803.79,0.817,80.38,0.832,0.0,0.85 -29304098.504,3215.18,0.764,3215.18,0.778,723.41,0.807,803.79,0.798,321.52,0.888,321.52,0.892 -29304298.504,3215.18,0.753,3215.18,0.77,562.66,0.809,562.66,0.791,321.52,0.916,401.9,0.912 -29304498.504,643.04,0.782,723.41,0.786,401.9,0.839,482.28,0.821,241.14,0.923,321.52,0.921 -29304698.504,723.41,0.81,723.41,0.802,401.9,0.889,401.9,0.875,160.76,0.923,241.14,0.929 -29304898.504,1044.93,0.8,1044.93,0.792,482.28,0.919,482.28,0.919,401.9,0.9,482.28,0.922 -29305098.504,1446.83,0.771,1527.21,0.766,723.41,0.909,643.04,0.915,562.66,0.819,723.41,0.868 -29305298.504,2089.86,0.734,2170.24,0.731,1044.93,0.838,964.55,0.845,643.04,0.695,884.17,0.759 -29305498.504,2974.04,0.691,3134.8,0.7,1527.21,0.674,1366.45,0.676,nan,0.553,nan,0.628 -29305698.504,nan,0.646,3215.18,0.672,nan,0.431,nan,0.381,nan,0.444,nan,0.513 -29305898.504,-160.76,0.671,-160.76,0.689,nan,0.521,nan,0.528,nan,0.493,nan,0.407 -29306098.504,321.52,0.756,80.38,0.771,-3215.18,0.779,-3215.18,0.66,-1044.93,0.67,nan,0.596 -29306298.504,401.9,0.779,401.9,0.799,-2652.52,0.77,-3215.18,0.748,-482.28,0.804,-482.28,0.731 -29306498.504,643.04,0.718,884.17,0.764,-1768.35,0.786,-2009.48,0.738,0.0,0.902,0.0,0.82 -29306698.504,nan,0.638,1205.69,0.703,-1044.93,0.849,-1205.69,0.809,321.52,0.946,321.52,0.868 -29306898.504,nan,0.569,nan,0.64,-482.28,0.899,-562.66,0.889,321.52,0.933,482.28,0.874 -29307098.504,nan,0.615,nan,0.622,0.0,0.937,0.0,0.944,241.14,0.875,160.76,0.859 -29307298.504,-3215.18,0.704,-3215.18,0.692,321.52,0.954,321.52,0.972,321.52,0.781,241.14,0.809 -29307498.504,-3215.18,0.804,-3215.18,0.787,401.9,0.956,401.9,0.978,401.9,0.721,401.9,0.78 -29307698.504,-3215.18,0.884,-3215.18,0.869,321.52,0.96,401.9,0.974,401.9,0.701,401.9,0.773 -29307898.504,-3215.18,0.927,-3215.18,0.914,321.52,0.97,401.9,0.974,80.38,0.704,321.52,0.771 -29308098.504,-3215.18,0.941,-3215.18,0.932,321.52,0.983,401.9,0.98,80.38,0.771,241.14,0.809 -29308298.504,-3215.18,0.931,-3215.18,0.923,482.28,0.978,482.28,0.978,321.52,0.796,482.28,0.817 -29308498.504,-3054.42,0.907,-2813.28,0.897,643.04,0.935,643.04,0.944,482.28,0.747,643.04,0.755 -29308698.504,-2089.86,0.894,-1848.73,0.89,803.79,0.853,884.17,0.874,321.52,0.695,562.66,0.677 -29308898.504,-1446.83,0.898,-1125.31,0.9,1044.93,0.728,1205.69,0.759,321.52,0.699,401.9,0.66 -29309098.504,-803.79,0.905,-562.66,0.909,nan,0.529,nan,0.571,321.52,0.714,482.28,0.656 -29309298.504,-160.76,0.906,0.0,0.912,nan,0.367,nan,0.332,241.14,0.683,nan,0.61 -29309498.504,321.52,0.898,401.9,0.903,nan,0.418,nan,0.349,nan,0.569,nan,0.527 -29309698.504,562.66,0.877,643.04,0.879,nan,0.453,nan,0.399,nan,0.517,nan,0.628 -29309898.504,723.41,0.853,803.79,0.848,nan,0.394,nan,0.38,nan,0.603,-3215.18,0.701 -29310098.504,884.17,0.83,803.79,0.816,nan,0.492,nan,0.335,-3215.18,0.755,-3215.18,0.811 -29310298.504,1205.69,0.805,1125.31,0.777,-3215.18,0.714,nan,0.575,-3215.18,0.803,-3215.18,0.839 -29310498.504,1687.97,0.767,1607.59,0.72,-3215.18,0.837,-3215.18,0.77,-1446.83,0.775,-1527.21,0.793 -29310698.504,2170.24,0.716,nan,0.646,-3215.18,0.908,-3215.18,0.882,-723.41,0.796,-803.79,0.799 -29310898.504,3215.18,0.656,-3215.18,0.678,-3215.18,0.926,-3215.18,0.911,-401.9,0.831,-401.9,0.824 -29311098.504,-3215.18,0.735,-3215.18,0.79,-3215.18,0.911,-3215.18,0.896,-241.14,0.859,-241.14,0.844 -29311298.504,-3215.18,0.821,-3215.18,0.88,-3215.18,0.893,-3215.18,0.877,-80.38,0.873,-80.38,0.854 -29311498.504,-3215.18,0.889,-3215.18,0.935,-3215.18,0.884,-3215.18,0.868,-160.76,0.888,-160.76,0.864 -29311698.504,-3215.18,0.928,-3215.18,0.959,-3215.18,0.882,-3215.18,0.866,-80.38,0.906,-160.76,0.881 -29311898.504,-3215.18,0.947,-3215.18,0.964,-3054.42,0.886,-2813.28,0.874,0.0,0.923,0.0,0.901 -29312098.504,-3215.18,0.95,-3215.18,0.956,-2572.14,0.89,-2250.62,0.884,241.14,0.933,241.14,0.913 -29312298.504,-3215.18,0.936,-3215.18,0.937,-2009.48,0.888,-1768.35,0.887,643.04,0.929,643.04,0.912 -29312498.504,-3215.18,0.908,-3134.8,0.909,-1366.45,0.883,-1125.31,0.885,1205.69,0.915,1205.69,0.901 -29312698.504,-2491.76,0.885,-2411.38,0.89,-723.41,0.88,-482.28,0.883,2009.48,0.91,2009.48,0.895 -29312898.504,-1848.73,0.878,-1768.35,0.883,-80.38,0.878,0.0,0.882,2974.04,0.926,2974.04,0.909 -29313098.504,-1366.45,0.878,-1205.69,0.882,482.28,0.876,643.04,0.881,3215.18,0.948,3215.18,0.931 -29313298.504,-884.17,0.881,-723.41,0.882,1205.69,0.878,1286.07,0.882,3215.18,0.951,3215.18,0.937 -29313498.504,-482.28,0.885,-321.52,0.883,1929.11,0.883,2009.48,0.888,3215.18,0.945,3215.18,0.933 -29313698.504,-80.38,0.891,80.38,0.886,2732.9,0.895,2813.28,0.901,3215.18,0.924,3215.18,0.915 -29313898.504,241.14,0.896,562.66,0.889,3215.18,0.915,3215.18,0.923,3215.18,0.884,3215.18,0.886 -29314098.504,723.41,0.901,964.55,0.892,3215.18,0.932,3215.18,0.937,3215.18,0.806,3215.18,0.821 -29314298.504,1205.69,0.904,1527.21,0.897,3215.18,0.941,3215.18,0.944,3215.18,0.668,3215.18,0.708 -29314498.504,1848.73,0.908,2170.24,0.904,3215.18,0.941,3215.18,0.943,nan,0.469,nan,0.538 -29314698.504,2491.76,0.918,2893.66,0.92,3215.18,0.935,3215.18,0.934,nan,0.476,nan,0.45 -29314898.504,3215.18,0.935,3215.18,0.94,3215.18,0.916,3215.18,0.914,nan,0.604,nan,0.562 -29315098.504,3215.18,0.944,3215.18,0.948,3215.18,0.879,3215.18,0.874,-1848.73,0.71,-1527.21,0.677 -29315298.504,3215.18,0.937,3215.18,0.941,3215.18,0.815,3215.18,0.807,-1607.59,0.793,-1366.45,0.767 -29315498.504,3215.18,0.917,3215.18,0.922,3215.18,0.731,3215.18,0.715,-1205.69,0.855,-1044.93,0.835 -29315698.504,3215.18,0.885,3215.18,0.895,nan,0.648,nan,0.636,-723.41,0.903,-562.66,0.89 -29315898.504,3215.18,0.844,3215.18,0.858,nan,0.593,nan,0.574,-321.52,0.935,-241.14,0.931 -29316098.504,3215.18,0.788,3215.18,0.81,nan,0.577,nan,0.548,0.0,0.952,80.38,0.955 -29316298.504,2732.9,0.721,3215.18,0.752,nan,0.601,nan,0.579,321.52,0.955,401.9,0.965 -29316498.504,nan,0.631,2813.28,0.671,401.9,0.684,321.52,0.684,562.66,0.945,643.04,0.961 -29316698.504,nan,0.457,nan,0.487,321.52,0.802,241.14,0.825,723.41,0.927,884.17,0.945 -29316898.504,nan,0.333,nan,0.28,482.28,0.883,401.9,0.903,1044.93,0.906,1125.31,0.925 -29317098.504,nan,0.425,nan,0.355,723.41,0.841,643.04,0.844,1446.83,0.885,1607.59,0.904 -29317298.504,nan,0.621,nan,0.566,884.17,0.737,803.79,0.726,1929.11,0.87,2170.24,0.888 -29317498.504,-401.9,0.783,-321.52,0.776,nan,0.618,nan,0.605,2652.52,0.866,2652.52,0.886 -29317698.504,0.0,0.858,160.76,0.867,nan,0.486,nan,0.512,3215.18,0.887,3215.18,0.909 -29317898.504,401.9,0.88,401.9,0.881,nan,0.495,nan,0.587,3215.18,0.901,3215.18,0.932 -29318098.504,643.04,0.869,562.66,0.856,nan,0.607,241.14,0.744,3215.18,0.878,3215.18,0.923 -29318298.504,562.66,0.856,482.28,0.839,nan,0.644,401.9,0.818,3215.18,0.822,3215.18,0.852 -29318498.504,482.28,0.869,401.9,0.855,nan,0.567,562.66,0.761,3215.18,0.747,3215.18,0.731 -29318698.504,401.9,0.893,401.9,0.873,nan,0.452,nan,0.615,nan,0.638,nan,0.572 -29318898.504,482.28,0.904,401.9,0.866,nan,0.415,nan,0.501,nan,0.477,nan,0.371 -29319098.504,562.66,0.868,482.28,0.81,nan,0.453,nan,0.485,nan,0.586,nan,0.478 -29319298.504,723.41,0.81,643.04,0.741,nan,0.558,nan,0.541,-3215.18,0.751,-3215.18,0.698 -29319498.504,1044.93,0.746,964.55,0.669,-643.04,0.719,-401.9,0.69,-3215.18,0.864,-3215.18,0.829 -29319698.504,1527.21,0.659,nan,0.56,-321.52,0.794,-80.38,0.788,-3215.18,0.902,-3215.18,0.863 -29319898.504,nan,0.502,nan,0.586,-80.38,0.802,160.76,0.787,-3215.18,0.9,-3215.18,0.866 -29320098.504,nan,0.551,-3215.18,0.709,160.76,0.765,401.9,0.722,-3215.18,0.901,-3215.18,0.877 -29320298.504,-3215.18,0.704,-3215.18,0.811,-3215.18,0.742,-3215.18,0.652,-3215.18,0.921,-3215.18,0.905 -29320498.504,-3215.18,0.823,-3215.18,0.877,-3215.18,0.771,-3215.18,0.719,-3215.18,0.939,-3215.18,0.93 -29320698.504,-3215.18,0.87,-3215.18,0.888,-3215.18,0.779,-3215.18,0.764,-3215.18,0.944,-3215.18,0.942 -29320898.504,-3215.18,0.868,-3215.18,0.88,-2250.62,0.772,-3215.18,0.771,-3215.18,0.939,-3215.18,0.94 -29321098.504,-3215.18,0.865,-3215.18,0.878,-1125.31,0.793,-1286.07,0.791,-3215.18,0.923,-3215.18,0.928 -29321298.504,-3215.18,0.862,-3215.18,0.877,-482.28,0.795,-643.04,0.802,-3215.18,0.905,-3215.18,0.915 -29321498.504,-2411.38,0.851,-2572.14,0.862,-3215.18,0.777,-3215.18,0.785,-3215.18,0.893,-3215.18,0.906 -29321698.504,-1607.59,0.858,-1768.35,0.865,-3215.18,0.812,-3215.18,0.819,-3215.18,0.888,-3215.18,0.9 -29321898.504,-803.79,0.871,-964.55,0.878,-3215.18,0.816,-3215.18,0.821,-3215.18,0.883,-3215.18,0.894 -29322098.504,-80.38,0.88,-241.14,0.889,-3215.18,0.812,-3215.18,0.813,-3215.18,0.869,-3215.18,0.878 -29322298.504,401.9,0.892,241.14,0.903,-3215.18,0.818,-3215.18,0.817,-2491.76,0.847,-2491.76,0.856 -29322498.504,482.28,0.902,482.28,0.919,-3215.18,0.823,-3215.18,0.823,-1527.21,0.839,-1527.21,0.847 -29322698.504,562.66,0.914,562.66,0.932,-3215.18,0.828,-3215.18,0.827,-723.41,0.846,-723.41,0.852 -29322898.504,643.04,0.926,643.04,0.934,-3215.18,0.841,-3215.18,0.839,-80.38,0.861,-80.38,0.866 -29323098.504,803.79,0.905,884.17,0.897,-3215.18,0.857,-3215.18,0.855,562.66,0.875,562.66,0.879 -29323298.504,964.55,0.835,1125.31,0.812,-3215.18,0.862,-3215.18,0.86,1125.31,0.884,1125.31,0.888 -29323498.504,1044.93,0.714,1446.83,0.692,-3215.18,0.851,-3215.18,0.849,1768.35,0.888,1768.35,0.893 -29323698.504,nan,0.573,nan,0.561,-2893.66,0.833,-2411.38,0.831,2491.76,0.889,2411.38,0.894 -29323898.504,nan,0.442,nan,0.432,-1527.21,0.826,-1446.83,0.827,3215.18,0.892,3134.8,0.895 -29324098.504,nan,0.334,nan,0.456,-3215.18,0.821,-723.41,0.825,3215.18,0.887,3215.18,0.89 -29324298.504,nan,0.563,nan,0.641,-3215.18,0.815,-80.38,0.815,3215.18,0.87,3215.18,0.874 -29324498.504,-1607.59,0.676,-1848.73,0.723,-3215.18,0.802,-3215.18,0.797,2572.14,0.85,2732.9,0.85 -29324698.504,-1366.45,0.756,-1527.21,0.785,-3215.18,0.784,-3215.18,0.777,2893.66,0.812,2974.04,0.808 -29324898.504,-964.55,0.823,-1044.93,0.841,-2572.14,0.766,-2331.0,0.76,3134.8,0.739,3215.18,0.732 -29325098.504,-562.66,0.866,-643.04,0.877,-1687.97,0.76,-1446.83,0.754,nan,0.626,nan,0.623 -29325298.504,-241.14,0.897,-321.52,0.899,-803.79,0.765,-643.04,0.76,nan,0.492,nan,0.507 -29325498.504,0.0,0.923,-160.76,0.917,-80.38,0.777,160.76,0.774,nan,0.484,nan,0.476 -29325698.504,80.38,0.945,0.0,0.934,643.04,0.792,884.17,0.79,-3215.18,0.676,-3215.18,0.664 -29325898.504,160.76,0.964,160.76,0.947,1366.45,0.807,1607.59,0.807,-3215.18,0.813,-3215.18,0.81 -29326098.504,401.9,0.972,482.28,0.95,2170.24,0.821,2331.0,0.822,-3215.18,0.882,-3215.18,0.885 -29326298.504,723.41,0.967,884.17,0.944,2974.04,0.835,3215.18,0.837,-3215.18,0.902,-3215.18,0.908 -29326498.504,1286.07,0.949,1446.83,0.933,3215.18,0.843,3215.18,0.844,-3215.18,0.899,-3215.18,0.904 -29326698.504,1929.11,0.928,2089.86,0.925,3215.18,0.838,3215.18,0.838,-2572.14,0.888,-2893.66,0.888 -29326898.504,2572.14,0.906,2813.28,0.924,3215.18,0.823,3215.18,0.82,-1929.11,0.88,-2170.24,0.875 -29327098.504,3215.18,0.893,3215.18,0.935,3215.18,0.803,3215.18,0.796,-1205.69,0.875,-1446.83,0.867 -29327298.504,3215.18,0.873,3215.18,0.931,3215.18,0.777,3215.18,0.766,-562.66,0.873,-803.79,0.865 -29327498.504,3215.18,0.818,3215.18,0.898,3215.18,0.739,3215.18,0.723,0.0,0.874,-160.76,0.867 -29327698.504,3215.18,0.727,3215.18,0.833,3215.18,0.692,3215.18,0.672,562.66,0.875,401.9,0.87 -29327898.504,nan,0.576,3215.18,0.709,-3215.18,0.692,-3215.18,0.705,1044.93,0.871,964.55,0.869 -29328098.504,nan,0.515,nan,0.546,-3215.18,0.742,-3215.18,0.752,1687.97,0.863,1527.21,0.864 -29328298.504,nan,0.635,nan,0.462,-2732.9,0.772,-2572.14,0.781,2411.38,0.855,2170.24,0.859 -29328498.504,-3215.18,0.786,-3215.18,0.658,-1848.73,0.798,-1687.97,0.808,3134.8,0.853,2732.9,0.859 -29328698.504,-3215.18,0.854,-3215.18,0.803,-1125.31,0.811,-964.55,0.823,3215.18,0.851,3215.18,0.862 -29328898.504,-3215.18,0.897,-3215.18,0.894,-482.28,0.804,-401.9,0.817,3215.18,0.838,3215.18,0.855 -29329098.504,-3215.18,0.919,-3215.18,0.933,-3215.18,0.799,80.38,0.794,3215.18,0.818,3215.18,0.841 -29329298.504,-3215.18,0.929,-3215.18,0.947,-3215.18,0.784,-3215.18,0.775,3215.18,0.792,3215.18,0.82 -29329498.504,-3215.18,0.935,-3215.18,0.952,-2572.14,0.767,-2491.76,0.756,3215.18,0.77,3215.18,0.801 -29329698.504,-3215.18,0.945,-3215.18,0.957,-1446.83,0.768,-1125.31,0.758,3215.18,0.762,3215.18,0.785 -29329898.504,-3215.18,0.953,-3215.18,0.962,-562.66,0.782,-401.9,0.772,3215.18,0.768,3215.18,0.782 -29330098.504,-3215.18,0.956,-3215.18,0.962,0.0,0.801,80.38,0.79,1125.31,0.791,3215.18,0.785 -29330298.504,-3215.18,0.955,-3215.18,0.959,562.66,0.822,562.66,0.811,1527.21,0.813,3215.18,0.789 -29330498.504,-3215.18,0.953,-3215.18,0.956,964.55,0.841,1044.93,0.83,1687.97,0.82,3215.18,0.789 -29330698.504,-3215.18,0.95,-3215.18,0.951,1366.45,0.851,1366.45,0.842,1848.73,0.812,3215.18,0.777 -29330898.504,-3215.18,0.945,-3215.18,0.944,1607.59,0.85,1687.97,0.844,1607.59,0.79,3215.18,0.747 -29331098.504,-3215.18,0.937,-3215.18,0.936,1607.59,0.84,1687.97,0.838,2089.86,0.754,3215.18,0.701 -29331298.504,-3215.18,0.928,-3215.18,0.927,1205.69,0.828,1205.69,0.832,2652.52,0.708,-3215.18,0.693 -29331498.504,-3215.18,0.917,-3215.18,0.915,1205.69,0.818,1125.31,0.828,3215.18,0.657,-3215.18,0.742 -29331698.504,-3215.18,0.906,-3215.18,0.904,1527.21,0.797,1527.21,0.815,-3215.18,0.731,-3215.18,0.801 -29331898.504,-3215.18,0.896,-3215.18,0.893,2089.86,0.767,2089.86,0.792,-3215.18,0.813,-3215.18,0.856 -29332098.504,-3215.18,0.887,-3215.18,0.883,2813.28,0.731,2813.28,0.764,-3215.18,0.872,-3215.18,0.892 -29332298.504,-3215.18,0.879,-3215.18,0.874,3215.18,0.672,3215.18,0.72,-3215.18,0.906,-3215.18,0.914 -29332498.504,-3215.18,0.869,-3215.18,0.864,-3215.18,0.671,nan,0.63,-3215.18,0.928,-3215.18,0.927 -29332698.504,-3215.18,0.859,-3215.18,0.853,-3215.18,0.783,-3215.18,0.748,-3215.18,0.937,-3215.18,0.932 -29332898.504,-3215.18,0.848,-3215.18,0.842,-3215.18,0.864,-3215.18,0.839,-3215.18,0.937,-3215.18,0.931 -29333098.504,-3215.18,0.837,-3215.18,0.831,-3215.18,0.907,-3215.18,0.893,-3215.18,0.932,-3215.18,0.925 -29333298.504,-3215.18,0.827,-3215.18,0.82,-3215.18,0.919,-3215.18,0.912,-3215.18,0.927,-3215.18,0.919 -29333498.504,-3215.18,0.816,-3215.18,0.811,-3215.18,0.914,-3215.18,0.91,-3215.18,0.921,-3215.18,0.913 -29333698.504,-2652.52,0.805,-2491.76,0.801,-3215.18,0.901,-3215.18,0.898,-3215.18,0.915,-3215.18,0.907 -29333898.504,-1848.73,0.799,-1768.35,0.796,-3215.18,0.889,-3215.18,0.886,-3215.18,0.908,-3215.18,0.9 -29334098.504,-1125.31,0.8,-964.55,0.798,-3215.18,0.879,-3215.18,0.876,-3215.18,0.9,-3215.18,0.891 -29334298.504,-401.9,0.806,-241.14,0.805,-3215.18,0.865,-3215.18,0.864,-3215.18,0.89,-3215.18,0.88 -29334498.504,401.9,0.816,562.66,0.815,-2572.14,0.851,-2411.38,0.852,-3215.18,0.879,-3215.18,0.868 -29334698.504,1044.93,0.829,1286.07,0.828,-1768.35,0.849,-1607.59,0.853,-3215.18,0.868,-3215.18,0.857 -29334898.504,1768.35,0.843,1929.11,0.843,-1044.93,0.856,-964.55,0.864,-3215.18,0.857,-3215.18,0.844 -29335098.504,2331.0,0.86,2572.14,0.859,-401.9,0.869,-321.52,0.879,-3215.18,0.845,-2572.14,0.832 -29335298.504,2974.04,0.878,3215.18,0.877,241.14,0.88,241.14,0.892,-2491.76,0.833,-1768.35,0.824 -29335498.504,3215.18,0.894,3215.18,0.893,884.17,0.887,884.17,0.899,-1768.35,0.826,-1044.93,0.823 -29335698.504,3215.18,0.905,3215.18,0.904,1607.59,0.89,1607.59,0.903,-1044.93,0.824,-321.52,0.824 -29335898.504,3215.18,0.91,3215.18,0.908,2331.0,0.895,2250.62,0.907,-321.52,0.824,321.52,0.828 -29336098.504,3215.18,0.909,3215.18,0.905,2974.04,0.906,2893.66,0.917,401.9,0.826,964.55,0.833 -29336298.504,3215.18,0.902,3215.18,0.897,3215.18,0.923,3215.18,0.932,1044.93,0.83,1687.97,0.84 -29336498.504,3215.18,0.888,3215.18,0.884,3215.18,0.932,3215.18,0.939,1768.35,0.835,2331.0,0.849 -29336698.504,3215.18,0.869,3215.18,0.864,3215.18,0.935,3215.18,0.938,2491.76,0.843,3054.42,0.862 -29336898.504,3215.18,0.842,3215.18,0.838,3215.18,0.935,3215.18,0.932,3215.18,0.857,3215.18,0.877 -29337098.504,3215.18,0.802,3215.18,0.799,3215.18,0.939,3215.18,0.927,3215.18,0.868,3215.18,0.886 -29337298.504,3215.18,0.757,3215.18,0.756,3215.18,0.938,3215.18,0.914,3215.18,0.874,3215.18,0.889 -29337498.504,-3215.18,0.721,-3215.18,0.726,3215.18,0.921,3215.18,0.875,3215.18,0.877,3215.18,0.89 -29337698.504,-3215.18,0.766,-3215.18,0.769,3215.18,0.866,3215.18,0.771,3215.18,0.874,3215.18,0.888 -29337898.504,-3215.18,0.8,-3215.18,0.8,3215.18,0.777,nan,0.615,3215.18,0.866,3215.18,0.88 -29338098.504,-3215.18,0.821,-3215.18,0.82,3215.18,0.667,nan,0.531,3215.18,0.852,3215.18,0.864 -29338298.504,-3215.18,0.833,-3215.18,0.833,nan,0.598,nan,0.572,3215.18,0.83,3215.18,0.842 -29338498.504,-3215.18,0.841,-3215.18,0.843,nan,0.554,nan,0.549,3215.18,0.804,3215.18,0.815 -29338698.504,-3215.18,0.848,-3215.18,0.851,nan,0.518,-3215.18,0.708,3215.18,0.772,3215.18,0.784 -29338898.504,-3215.18,0.856,-3215.18,0.859,-3215.18,0.727,-3215.18,0.835,3215.18,0.735,3215.18,0.747 -29339098.504,-3215.18,0.862,-3215.18,0.864,-3215.18,0.855,-3215.18,0.898,-3215.18,0.75,-3215.18,0.741 -29339298.504,-3215.18,0.863,-3215.18,0.864,-3215.18,0.889,-3215.18,0.902,-3215.18,0.781,-3215.18,0.774 -29339498.504,-3215.18,0.86,-3215.18,0.859,-3215.18,0.874,-2813.28,0.874,-3215.18,0.807,-3215.18,0.803 -29339698.504,-3215.18,0.856,-3215.18,0.855,-2089.86,0.856,-1687.97,0.861,-3215.18,0.824,-3215.18,0.825 -29339898.504,-3215.18,0.852,-3215.18,0.85,-1286.07,0.855,-964.55,0.864,-3215.18,0.834,-3215.18,0.84 -29340098.504,-3215.18,0.846,-3215.18,0.842,-803.79,0.858,-401.9,0.872,-3215.18,0.84,-3215.18,0.849 -29340298.504,-2813.28,0.836,-2491.76,0.832,-562.66,0.859,-80.38,0.88,-3215.18,0.841,-3215.18,0.852 -29340498.504,-2009.48,0.828,-1768.35,0.826,-401.9,0.857,160.76,0.883,-3215.18,0.841,-3215.18,0.853 -29340698.504,-1286.07,0.822,-1044.93,0.821,-160.76,0.848,321.52,0.879,-3215.18,0.839,-3215.18,0.851 -29340898.504,-562.66,0.817,-401.9,0.817,160.76,0.837,562.66,0.872,-3215.18,0.834,-3215.18,0.846 -29341098.504,80.38,0.813,321.52,0.813,401.9,0.829,884.17,0.865,-3215.18,0.83,-3215.18,0.84 -29341298.504,803.79,0.81,1044.93,0.812,964.55,0.822,1366.45,0.858,-3215.18,0.83,-3215.18,0.837 -29341498.504,1527.21,0.811,1848.73,0.816,1607.59,0.818,1929.11,0.853,-3215.18,0.831,-3215.18,0.834 -29341698.504,2331.0,0.819,2652.52,0.827,2331.0,0.82,2732.9,0.857,-3215.18,0.831,-3215.18,0.829 -29341898.504,3134.8,0.836,3215.18,0.846,3215.18,0.833,3215.18,0.876,-3215.18,0.83,-3215.18,0.824 -29342098.504,3215.18,0.856,3215.18,0.866,3215.18,0.852,3215.18,0.889,-3215.18,0.828,-3215.18,0.818 -29342298.504,3215.18,0.874,3215.18,0.883,3215.18,0.869,3215.18,0.895,-3215.18,0.826,-3215.18,0.814 -29342498.504,3215.18,0.89,3215.18,0.899,3215.18,0.879,3215.18,0.893,-3215.18,0.823,-3215.18,0.809 -29342698.504,3215.18,0.904,3215.18,0.914,3215.18,0.879,3215.18,0.879,-3215.18,0.82,-3215.18,0.805 -29342898.504,3215.18,0.917,3215.18,0.925,3215.18,0.871,3215.18,0.857,-3215.18,0.813,-3215.18,0.8 -29343098.504,3215.18,0.927,3215.18,0.934,3215.18,0.854,3215.18,0.823,-3054.42,0.806,-2893.66,0.794 -29343298.504,3215.18,0.933,3215.18,0.94,3215.18,0.829,3215.18,0.776,-2331.0,0.799,-2089.86,0.791 -29343498.504,3215.18,0.938,3215.18,0.944,3215.18,0.798,1768.35,0.734,-1527.21,0.795,-1286.07,0.791 -29343698.504,3215.18,0.942,3215.18,0.948,3215.18,0.765,2089.86,0.681,-803.79,0.794,-562.66,0.793 -29343898.504,3215.18,0.946,3215.18,0.953,3215.18,0.721,nan,0.598,-80.38,0.794,160.76,0.797 -29344098.504,3215.18,0.95,3215.18,0.959,nan,0.644,nan,0.591,643.04,0.797,803.79,0.804 -29344298.504,3215.18,0.953,3215.18,0.963,-3215.18,0.753,-3215.18,0.758,1366.45,0.803,1527.21,0.813 -29344498.504,3215.18,0.954,3215.18,0.964,-3215.18,0.846,-3215.18,0.862,2089.86,0.812,2331.0,0.824 -29344698.504,3215.18,0.955,3215.18,0.964,-3215.18,0.904,-3215.18,0.921,2893.66,0.826,3134.8,0.84 -29344898.504,3215.18,0.959,3215.18,0.967,-3215.18,0.931,-3215.18,0.948,3215.18,0.845,3215.18,0.86 -29345098.504,3215.18,0.962,3215.18,0.963,-3215.18,0.936,-3215.18,0.953,3215.18,0.863,3215.18,0.879 -29345298.504,3215.18,0.962,3215.18,0.951,-3215.18,0.93,-3215.18,0.942,3215.18,0.882,3215.18,0.897 -29345498.504,3215.18,0.961,3215.18,0.932,-3215.18,0.919,-3215.18,0.93,3215.18,0.899,3215.18,0.913 -29345698.504,3215.18,0.954,3215.18,0.91,-3215.18,0.913,-3215.18,0.922,3215.18,0.915,3215.18,0.928 -29345898.504,3215.18,0.927,3215.18,0.87,-3215.18,0.906,-3215.18,0.913,3215.18,0.927,3215.18,0.94 -29346098.504,3215.18,0.84,3215.18,0.749,-3215.18,0.894,-3134.8,0.899,3215.18,0.937,3215.18,0.948 -29346298.504,3215.18,0.683,nan,0.529,-2652.52,0.88,-2331.0,0.887,3215.18,0.943,3215.18,0.954 -29346498.504,nan,0.517,nan,0.311,-1848.73,0.876,-1527.21,0.888,3215.18,0.948,3215.18,0.957 -29346698.504,nan,0.341,nan,0.185,-964.55,0.881,-723.41,0.897,3215.18,0.952,3215.18,0.96 -29346898.504,nan,0.411,nan,0.271,-241.14,0.893,-80.38,0.906,3215.18,0.953,3215.18,0.961 -29347098.504,nan,0.597,nan,0.478,401.9,0.9,562.66,0.897,3215.18,0.951,3215.18,0.959 -29347298.504,-2652.52,0.686,nan,0.599,964.55,0.889,1125.31,0.855,3215.18,0.944,3215.18,0.952 -29347498.504,-2411.38,0.738,-1687.97,0.681,1446.83,0.849,1527.21,0.778,3215.18,0.936,3215.18,0.942 -29347698.504,-2250.62,0.774,-1687.97,0.732,1848.73,0.782,1687.97,0.677,3215.18,0.921,3215.18,0.928 -29347898.504,-2089.86,0.802,-1687.97,0.771,1929.11,0.688,nan,0.561,3215.18,0.907,3215.18,0.909 -29348098.504,-1848.73,0.829,-1607.59,0.805,nan,0.584,nan,0.496,3215.18,0.887,3215.18,0.889 -29348298.504,-1687.97,0.856,-1607.59,0.84,nan,0.522,nan,0.489,3215.18,0.879,3215.18,0.88 -29348498.504,-1366.45,0.876,-1366.45,0.868,nan,0.492,nan,0.544,3215.18,0.881,3215.18,0.891 -29348698.504,-964.55,0.889,-1044.93,0.887,nan,0.545,-3215.18,0.676,3215.18,0.891,3215.18,0.906 -29348898.504,-482.28,0.894,-562.66,0.895,-3215.18,0.692,-3215.18,0.784,3215.18,0.892,3215.18,0.915 -29349098.504,160.76,0.891,0.0,0.895,-3215.18,0.799,-3215.18,0.856,3215.18,0.897,3215.18,0.915 -29349298.504,803.79,0.887,643.04,0.892,-3215.18,0.869,-3215.18,0.9,3215.18,0.91,3215.18,0.92 -29349498.504,1527.21,0.885,1366.45,0.889,-3215.18,0.909,-3215.18,0.923,3215.18,0.914,3215.18,0.933 -29349698.504,2250.62,0.888,2089.86,0.891,-3215.18,0.927,-3215.18,0.932,3215.18,0.918,3215.18,0.932 -29349898.504,2974.04,0.901,2732.9,0.901,-3215.18,0.93,-3215.18,0.927,3215.18,0.919,3215.18,0.927 -29350098.504,3215.18,0.922,3215.18,0.921,-3215.18,0.922,-3215.18,0.914,3215.18,0.931,3215.18,0.927 -29350298.504,3215.18,0.937,3215.18,0.936,-3215.18,0.908,-3215.18,0.898,3215.18,0.935,3215.18,0.919 -29350498.504,3215.18,0.947,3215.18,0.945,-3215.18,0.891,-3215.18,0.879,3215.18,0.939,3215.18,0.843 -29350698.504,3215.18,0.954,3215.18,0.947,-3215.18,0.871,-3215.18,0.858,3215.18,0.938,3215.18,0.682 -29350898.504,3215.18,0.959,3215.18,0.947,-3134.8,0.85,-2572.14,0.837,3215.18,0.916,nan,0.417 -29351098.504,3215.18,0.962,3215.18,0.942,-2411.38,0.831,-1848.73,0.821,3215.18,0.85,nan,0.641 -29351298.504,3215.18,0.944,3215.18,0.906,-1768.35,0.814,-1125.31,0.808,3215.18,0.728,-3134.8,0.753 -29351498.504,3215.18,0.889,3215.18,0.817,-964.55,0.8,-401.9,0.799,nan,0.578,-2411.38,0.822 -29351698.504,3215.18,0.806,3215.18,0.697,-241.14,0.788,321.52,0.791,nan,0.453,-3134.8,0.846 -29351898.504,3215.18,0.72,nan,0.612,562.66,0.779,1125.31,0.785,nan,0.57,-2411.38,0.836 -29352098.504,nan,0.597,nan,0.587,1286.07,0.772,1848.73,0.782,nan,0.626,-2331.0,0.852 -29352298.504,nan,0.546,nan,0.581,2009.48,0.768,2652.52,0.781,-2009.48,0.696,-2331.0,0.885 -29352498.504,nan,0.566,nan,0.585,2813.28,0.768,3215.18,0.784,-2652.52,0.775,-1607.59,0.893 -29352698.504,nan,0.536,nan,0.548,3215.18,0.771,3215.18,0.786,-1768.35,0.841,-803.79,0.919 -29352898.504,nan,0.485,nan,0.527,3215.18,0.773,3215.18,0.786,-1446.83,0.88,0.0,0.93 -29353098.504,nan,0.503,nan,0.56,3215.18,0.777,3215.18,0.787,-1527.21,0.914,723.41,0.934 -29353298.504,nan,0.577,nan,0.6,3215.18,0.786,3215.18,0.792,-643.04,0.936,803.79,0.923 -29353498.504,nan,0.642,nan,0.626,3215.18,0.798,3215.18,0.801,562.66,0.919,803.79,0.904 -29353698.504,160.76,0.729,-482.28,0.692,3215.18,0.813,3215.18,0.813,643.04,0.912,884.17,0.852 -29353898.504,0.0,0.826,-482.28,0.798,3215.18,0.829,3215.18,0.827,643.04,0.88,1446.83,0.788 -29354098.504,241.14,0.889,-80.38,0.874,3215.18,0.846,3215.18,0.842,723.41,0.846,1446.83,0.716 -29354298.504,562.66,0.928,241.14,0.942,3215.18,0.862,3215.18,0.857,723.41,0.806,803.79,0.671 -29354498.504,643.04,0.933,482.28,0.982,3215.18,0.874,3215.18,0.87,643.04,0.762,803.79,0.692 -29354698.504,562.66,0.913,562.66,0.979,3215.18,0.883,3215.18,0.879,723.41,0.738,723.41,0.693 -29354898.504,643.04,0.887,723.41,0.942,3215.18,0.889,3215.18,0.885,723.41,0.706,723.41,0.708 -29355098.504,884.17,0.828,964.55,0.876,3215.18,0.889,3215.18,0.886,723.41,0.66,1205.69,0.666 -29355298.504,1205.69,0.732,1286.07,0.789,3215.18,0.884,3215.18,0.882,nan,0.543,723.41,0.661 -29355498.504,nan,0.612,1607.59,0.685,3215.18,0.873,3215.18,0.871,nan,0.492,nan,0.636 -29355698.504,nan,0.499,nan,0.581,3215.18,0.854,3215.18,0.852,nan,0.482,562.66,0.685 -29355898.504,nan,0.426,nan,0.492,3215.18,0.825,3215.18,0.823,nan,0.537,401.9,0.711 -29356098.504,nan,0.473,nan,0.463,3215.18,0.788,3215.18,0.784,241.14,0.683,562.66,0.787 -29356298.504,nan,0.639,nan,0.633,3215.18,0.745,3215.18,0.737,401.9,0.783,643.04,0.78 -29356498.504,-3215.18,0.721,-3215.18,0.73,-3215.18,0.743,-3215.18,0.75,482.28,0.766,884.17,0.697 -29356698.504,-3215.18,0.773,-3215.18,0.788,-3215.18,0.788,-3215.18,0.796,482.28,0.663,nan,0.561 -29356898.504,-2572.14,0.821,-2893.66,0.833,-3215.18,0.823,-3215.18,0.831,nan,0.551,nan,0.444 -29357098.504,-2009.48,0.866,-2250.62,0.873,-3215.18,0.847,-3215.18,0.856,nan,0.46,nan,0.391 -29357298.504,-1527.21,0.9,-1607.59,0.903,-3215.18,0.865,-3215.18,0.873,nan,0.436,nan,0.424 -29357498.504,-884.17,0.92,-964.55,0.919,-3215.18,0.878,-3215.18,0.883,nan,0.52,nan,0.547 -29357698.504,-241.14,0.928,-241.14,0.925,-3215.18,0.886,-3215.18,0.889,nan,0.615,nan,0.63 -29357898.504,321.52,0.929,401.9,0.925,-3215.18,0.89,-3215.18,0.889,-884.17,0.696,-1125.31,0.695 -29358098.504,884.17,0.92,964.55,0.915,-3215.18,0.889,-3215.18,0.886,-803.79,0.751,-884.17,0.752 -29358298.504,1527.21,0.904,1527.21,0.898,-3215.18,0.885,-3215.18,0.879,-562.66,0.8,-643.04,0.792 -29358498.504,2089.86,0.886,2009.48,0.88,-3215.18,0.879,-3215.18,0.871,-321.52,0.831,-723.41,0.833 -29358698.504,2652.52,0.868,2572.14,0.863,-3215.18,0.87,-3215.18,0.86,-401.9,0.864,-321.52,0.865 -29358898.504,3215.18,0.856,3215.18,0.849,-3215.18,0.859,-3215.18,0.847,-241.14,0.891,-401.9,0.894 -29359098.504,3215.18,0.833,3215.18,0.825,-3215.18,0.846,-3054.42,0.832,0.0,0.906,-80.38,0.905 -29359298.504,3215.18,0.794,3215.18,0.787,-2974.04,0.831,-2250.62,0.819,321.52,0.907,321.52,0.903 -29359498.504,3215.18,0.74,3215.18,0.739,-2170.24,0.82,-1527.21,0.81,723.41,0.888,803.79,0.885 -29359698.504,3215.18,0.678,3215.18,0.681,-1446.83,0.814,-803.79,0.806,1205.69,0.859,1366.45,0.853 -29359898.504,-3215.18,0.721,-3215.18,0.716,-723.41,0.812,-160.76,0.808,1848.73,0.827,2089.86,0.827 -29360098.504,-3215.18,0.814,-3215.18,0.807,0.0,0.814,562.66,0.811,2572.14,0.798,2813.28,0.797 -29360298.504,-3215.18,0.876,-3215.18,0.869,723.41,0.818,1286.07,0.818,3215.18,0.767,3215.18,0.76 -29360498.504,-3215.18,0.911,-3215.18,0.907,1527.21,0.826,2009.48,0.827,3215.18,0.723,3215.18,0.701 -29360698.504,-3215.18,0.924,-3215.18,0.921,2250.62,0.838,2813.28,0.84,-3215.18,0.729,-3215.18,0.731 -29360898.504,-3215.18,0.919,-3215.18,0.917,2974.04,0.853,3215.18,0.856,-3215.18,0.795,-3215.18,0.805 -29361098.504,-2974.04,0.899,-2893.66,0.899,3215.18,0.87,3215.18,0.87,-3215.18,0.856,-3215.18,0.862 -29361298.504,-2170.24,0.889,-2089.86,0.89,3215.18,0.884,3215.18,0.882,-3215.18,0.892,-3215.18,0.895 -29361498.504,-1446.83,0.889,-1366.45,0.893,3215.18,0.895,3215.18,0.889,-3215.18,0.907,-3215.18,0.908 -29361698.504,-803.79,0.898,-723.41,0.904,3215.18,0.903,3215.18,0.895,-3215.18,0.909,-3215.18,0.907 -29361898.504,-160.76,0.913,-80.38,0.919,3215.18,0.91,3215.18,0.899,-3215.18,0.902,-3215.18,0.903 -29362098.504,401.9,0.927,482.28,0.933,3215.18,0.916,3215.18,0.902,-3215.18,0.896,-3215.18,0.898 -29362298.504,884.17,0.935,964.55,0.94,3215.18,0.921,3215.18,0.904,-3215.18,0.882,-3215.18,0.887 -29362498.504,1366.45,0.937,1366.45,0.939,3215.18,0.925,3215.18,0.907,-3215.18,0.867,-3215.18,0.871 -29362698.504,1768.35,0.931,1768.35,0.93,3215.18,0.928,3215.18,0.909,-3215.18,0.853,-3215.18,0.853 -29362898.504,2170.24,0.919,2089.86,0.916,3215.18,0.93,3215.18,0.911,-3215.18,0.837,-3215.18,0.837 -29363098.504,2491.76,0.909,2411.38,0.9,3215.18,0.932,3215.18,0.912,-3215.18,0.821,-3215.18,0.821 -29363298.504,2974.04,0.902,2732.9,0.887,3215.18,0.933,3215.18,0.912,-3215.18,0.802,-3134.8,0.804 -29363498.504,3215.18,0.902,3054.42,0.877,3215.18,0.934,3215.18,0.911,-3215.18,0.784,-2331.0,0.79 -29363698.504,3215.18,0.9,3215.18,0.867,3215.18,0.932,3215.18,0.909,-3215.18,0.771,-1527.21,0.777 -29363898.504,3215.18,0.881,3215.18,0.835,3215.18,0.925,3215.18,0.901,-3215.18,0.765,-723.41,0.771 -29364098.504,3215.18,0.824,3215.18,0.76,3215.18,0.907,3215.18,0.886,-2813.28,0.759,80.38,0.77 -29364298.504,3215.18,0.711,nan,0.617,3215.18,0.877,3215.18,0.861,-2009.48,0.757,884.17,0.776 -29364498.504,nan,0.449,nan,0.261,3215.18,0.832,3215.18,0.826,-1205.69,0.762,1687.97,0.784 -29364698.504,nan,0.39,nan,0.557,3215.18,0.768,3215.18,0.778,-401.9,0.77,2491.76,0.799 -29364898.504,nan,0.554,-3215.18,0.674,3215.18,0.686,3215.18,0.717,401.9,0.786,3215.18,0.817 -29365098.504,-1527.21,0.656,-3215.18,0.734,-3215.18,0.761,-3215.18,0.754,1125.31,0.801,3215.18,0.833 -29365298.504,-1527.21,0.724,-2652.52,0.773,-3215.18,0.837,-3215.18,0.814,643.04,0.818,3215.18,0.854 -29365498.504,-1205.69,0.775,-2009.48,0.806,-3215.18,0.892,-3215.18,0.86,1446.83,0.835,3215.18,0.873 -29365698.504,-964.55,0.815,-1607.59,0.836,-3215.18,0.926,-3215.18,0.895,2089.86,0.857,3215.18,0.891 -29365898.504,-884.17,0.853,-1286.07,0.869,-3215.18,0.944,-3215.18,0.918,2893.66,0.873,3215.18,0.904 -29366098.504,-723.41,0.89,-964.55,0.9,-3215.18,0.95,-3215.18,0.929,3215.18,0.886,3215.18,0.915 -29366298.504,-401.9,0.918,-562.66,0.923,-3215.18,0.949,-3215.18,0.933,3215.18,0.891,3215.18,0.908 -29366498.504,0.0,0.929,-80.38,0.931,-3215.18,0.945,-3215.18,0.933,3215.18,0.879,3215.18,0.885 -29366698.504,562.66,0.926,562.66,0.927,-3215.18,0.937,-3215.18,0.929,3215.18,0.86,3215.18,0.852 -29366898.504,1125.31,0.911,1044.93,0.912,-3215.18,0.926,-3215.18,0.92,3215.18,0.83,3215.18,0.802 -29367098.504,1768.35,0.889,1687.97,0.891,-3215.18,0.912,-3215.18,0.908,3215.18,0.773,3215.18,0.738 -29367298.504,2411.38,0.867,2411.38,0.873,-3215.18,0.897,-3215.18,0.894,3215.18,0.708,-3215.18,0.657 -29367498.504,3134.8,0.854,3054.42,0.861,-3215.18,0.88,-3215.18,0.878,-3215.18,0.709,-3215.18,0.748 -29367698.504,3215.18,0.841,3215.18,0.853,-2813.28,0.861,-2813.28,0.861,-3215.18,0.778,-3215.18,0.815 -29367898.504,3215.18,0.813,3215.18,0.833,-2089.86,0.85,-2089.86,0.85,-3215.18,0.821,-3215.18,0.846 -29368098.504,3215.18,0.771,3215.18,0.798,-1366.45,0.843,-1366.45,0.845,-3215.18,0.837,-2572.14,0.859 -29368298.504,3215.18,0.712,3215.18,0.745,-643.04,0.841,-643.04,0.844,-2411.38,0.848,-1848.73,0.867 -29368498.504,-3215.18,0.741,-3215.18,0.702,80.38,0.843,80.38,0.847,-1768.35,0.86,-1286.07,0.878 -29368698.504,-3215.18,0.815,-3215.18,0.785,803.79,0.849,723.41,0.854,-1044.93,0.88,-643.04,0.893 -29368898.504,-3215.18,0.866,-3215.18,0.845,1527.21,0.859,1446.83,0.865,-401.9,0.898,-80.38,0.906 -29369098.504,-3215.18,0.898,-3215.18,0.886,2250.62,0.872,2089.86,0.879,160.76,0.909,562.66,0.914 -29369298.504,-3215.18,0.918,-3215.18,0.913,2893.66,0.89,2813.28,0.896,723.41,0.916,1125.31,0.917 -29369498.504,-3215.18,0.928,-3215.18,0.926,3215.18,0.912,3215.18,0.918,1286.07,0.92,1527.21,0.916 -29369698.504,-3215.18,0.93,-3215.18,0.931,3215.18,0.93,3215.18,0.934,2009.48,0.918,2089.86,0.917 -29369898.504,-3215.18,0.929,-3215.18,0.932,3215.18,0.943,3215.18,0.947,2652.52,0.916,2652.52,0.921 -29370098.504,-3215.18,0.928,-3215.18,0.932,3215.18,0.953,3215.18,0.956,3215.18,0.919,3134.8,0.929 -29370298.504,-3215.18,0.923,-3215.18,0.928,3215.18,0.959,3215.18,0.961,3215.18,0.928,3215.18,0.94 -29370498.504,-3215.18,0.916,-3215.18,0.921,3215.18,0.962,3215.18,0.965,3215.18,0.938,3215.18,0.948 -29370698.504,-3215.18,0.907,-3215.18,0.912,3215.18,0.965,3215.18,0.967,3215.18,0.942,3215.18,0.955 -29370898.504,-3215.18,0.896,-3215.18,0.899,3215.18,0.965,3215.18,0.967,3215.18,0.944,3215.18,0.962 -29371098.504,-3215.18,0.882,-3215.18,0.884,3215.18,0.958,3215.18,0.96,3215.18,0.938,3215.18,0.962 -29371298.504,-3215.18,0.866,-3215.18,0.867,3215.18,0.939,3215.18,0.94,3215.18,0.93,3215.18,0.956 -29371498.504,-3215.18,0.848,-3215.18,0.849,3215.18,0.901,3215.18,0.9,3215.18,0.899,3215.18,0.934 -29371698.504,-3215.18,0.832,-3215.18,0.832,3215.18,0.83,3215.18,0.817,3215.18,0.846,3215.18,0.897 -29371898.504,-3215.18,0.818,-3215.18,0.816,3215.18,0.73,3215.18,0.691,3215.18,0.798,3215.18,0.851 -29372098.504,-3215.18,0.807,-3215.18,0.802,-3215.18,0.704,-3215.18,0.716,3215.18,0.793,3215.18,0.818 -29372298.504,-3215.18,0.799,-3215.18,0.792,-3215.18,0.794,-3215.18,0.803,3215.18,0.798,3215.18,0.779 -29372498.504,-3215.18,0.795,-3215.18,0.786,-3215.18,0.836,-3134.8,0.84,3215.18,0.799,3215.18,0.73 -29372698.504,-3215.18,0.796,-3215.18,0.785,-3215.18,0.855,-2572.14,0.854,1044.93,0.789,nan,0.649 -29372898.504,-3215.18,0.801,-3215.18,0.789,-2813.28,0.858,-1848.73,0.865,1768.35,0.744,nan,0.63 -29373098.504,-3215.18,0.81,-3215.18,0.798,-2250.62,0.856,-1205.69,0.873,803.79,0.679,nan,0.605 -29373298.504,-3215.18,0.819,-3215.18,0.807,-1687.97,0.855,-723.41,0.882,nan,0.626,nan,0.614 -29373498.504,-3215.18,0.826,-3215.18,0.814,-964.55,0.853,-160.76,0.887,nan,0.573,80.38,0.657 -29373698.504,-3215.18,0.829,-3215.18,0.818,-321.52,0.85,482.28,0.887,nan,0.598,0.0,0.724 -29373898.504,-3215.18,0.828,-3215.18,0.818,321.52,0.844,964.55,0.879,241.14,0.669,401.9,0.757 -29374098.504,-3215.18,0.824,-3054.42,0.815,964.55,0.835,1687.97,0.869,80.38,0.724,482.28,0.728 -29374298.504,-2411.38,0.818,-2250.62,0.812,1687.97,0.822,2170.24,0.86,241.14,0.731,401.9,0.661 -29374498.504,-1687.97,0.813,-1527.21,0.809,2411.38,0.806,2813.28,0.848,482.28,0.671,nan,0.567 -29374698.504,-1044.93,0.808,-803.79,0.805,3215.18,0.79,3215.18,0.835,nan,0.593,nan,0.497 -29374898.504,-401.9,0.804,-160.76,0.802,3215.18,0.767,3215.18,0.803,nan,0.548,nan,0.482 -29375098.504,241.14,0.8,482.28,0.8,3215.18,0.732,3215.18,0.752,nan,0.539,nan,0.529 -29375298.504,964.55,0.799,1205.69,0.8,-3215.18,0.725,3215.18,0.688,nan,0.592,nan,0.599 -29375498.504,1687.97,0.802,1929.11,0.803,-3215.18,0.771,-3215.18,0.749,nan,0.634,-1044.93,0.654 -29375698.504,2491.76,0.81,2652.52,0.812,-3215.18,0.816,-3215.18,0.82,-643.04,0.683,-1044.93,0.715 -29375898.504,3215.18,0.824,3215.18,0.828,-3215.18,0.849,-3215.18,0.864,-643.04,0.734,-1044.93,0.77 -29376098.504,3215.18,0.842,3215.18,0.845,-3215.18,0.868,-3215.18,0.886,-723.41,0.788,-1044.93,0.823 -29376298.504,3215.18,0.858,3215.18,0.862,-3215.18,0.88,-3215.18,0.9,-482.28,0.836,-643.04,0.864 -29376498.504,3215.18,0.873,3215.18,0.877,-3215.18,0.881,-3215.18,0.903,-321.52,0.868,-482.28,0.889 -29376698.504,3215.18,0.886,3215.18,0.889,-3215.18,0.877,-3215.18,0.899,-80.38,0.885,-160.76,0.894 -29376898.504,3215.18,0.895,3215.18,0.898,-3215.18,0.867,-3215.18,0.886,241.14,0.878,241.14,0.878 -29377098.504,3215.18,0.899,3215.18,0.903,-2893.66,0.852,-3215.18,0.87,562.66,0.843,643.04,0.844 -29377298.504,3215.18,0.899,3215.18,0.903,-2170.24,0.839,-2732.9,0.851,1044.93,0.791,1286.07,0.797 -29377498.504,3215.18,0.896,3215.18,0.899,-1446.83,0.826,-2652.52,0.835,1687.97,0.729,2009.48,0.744 -29377698.504,3215.18,0.887,3215.18,0.891,-723.41,0.817,-1848.73,0.818,2411.38,0.667,2652.52,0.693 -29377898.504,3215.18,0.873,3215.18,0.876,80.38,0.809,-1044.93,0.803,-3215.18,0.699,-3215.18,0.693 -29378098.504,3215.18,0.85,3215.18,0.852,803.79,0.805,-321.52,0.791,-3215.18,0.766,-3215.18,0.75 -29378298.504,3215.18,0.817,3215.18,0.815,1446.83,0.803,482.28,0.782,-3215.18,0.83,-3215.18,0.809 -29378498.504,3215.18,0.777,3215.18,0.77,2170.24,0.805,803.79,0.776,-3215.18,0.872,-3215.18,0.854 -29378698.504,3215.18,0.735,3215.18,0.722,2974.04,0.809,1286.07,0.772,-3215.18,0.894,-3215.18,0.879 -29378898.504,-3215.18,0.756,-3215.18,0.765,3215.18,0.813,2089.86,0.768,-3215.18,0.901,-3215.18,0.889 -29379098.504,-3215.18,0.791,-3215.18,0.804,3215.18,0.815,2893.66,0.763,-3215.18,0.902,-3215.18,0.892 -29379298.504,-3215.18,0.815,-3215.18,0.829,3215.18,0.807,3215.18,0.756,-3215.18,0.899,-3215.18,0.89 -29379498.504,-3215.18,0.829,-3215.18,0.842,3215.18,0.791,3215.18,0.742,-3215.18,0.893,-3215.18,0.884 -29379698.504,-3215.18,0.835,-3215.18,0.847,3215.18,0.767,-3215.18,0.75,-3215.18,0.884,-3215.18,0.875 -29379898.504,-3215.18,0.835,-3215.18,0.847,3215.18,0.731,-3215.18,0.769,-3215.18,0.872,-3215.18,0.864 -29380098.504,-3215.18,0.833,-3215.18,0.842,-3215.18,0.748,-3215.18,0.794,-3215.18,0.859,-3215.18,0.852 -29380298.504,-3215.18,0.827,-3215.18,0.834,-3215.18,0.785,-3215.18,0.819,-3215.18,0.847,-3215.18,0.842 -29380498.504,-3215.18,0.818,-3215.18,0.823,-3215.18,0.824,-3215.18,0.844,-3215.18,0.84,-3215.18,0.837 -29380698.504,-3215.18,0.808,-3054.42,0.811,-3215.18,0.855,-3215.18,0.867,-3215.18,0.84,-3215.18,0.838 -29380898.504,-2732.9,0.797,-2572.14,0.799,-3215.18,0.879,-3215.18,0.883,-3215.18,0.845,-3215.18,0.845 -29381098.504,-2009.48,0.788,-1768.35,0.791,-3215.18,0.894,-3215.18,0.894,-3215.18,0.855,-3215.18,0.856 -29381298.504,-1205.69,0.781,-964.55,0.785,-3215.18,0.901,-3215.18,0.9,-3215.18,0.866,-3215.18,0.866 -29381498.504,-401.9,0.776,-160.76,0.782,-3215.18,0.901,-3215.18,0.901,-3215.18,0.875,nan,nan -29381698.504,321.52,0.774,643.04,0.781,-3215.18,0.897,-3215.18,0.896,-3215.18,0.88,nan,nan -29381898.504,1125.31,0.775,1446.83,0.784,-3215.18,0.888,nan,nan,-3215.18,0.879,nan,nan -29382098.504,1929.11,0.778,2250.62,0.791,-3215.18,0.875,nan,nan,-3215.18,0.874,nan,nan -29382298.504,2652.52,0.783,3054.42,0.799,-3215.18,0.86,nan,nan,-3215.18,0.865,nan,nan -29382498.504,3215.18,0.788,3215.18,0.805,-2732.9,0.843,nan,nan,-3215.18,0.855,nan,nan -29382698.504,3215.18,0.791,3215.18,0.808,-1929.11,0.829,nan,nan,-3215.18,0.843,nan,nan -29382898.504,3215.18,0.788,3215.18,0.804,-1205.69,0.818,nan,nan,-2652.52,0.828,nan,nan -29383098.504,3215.18,0.779,3215.18,0.793,-482.28,0.809,nan,nan,-1848.73,0.816,nan,nan -29383298.504,3215.18,0.764,3215.18,0.775,160.76,0.803,nan,nan,-1125.31,0.804,nan,nan -29383498.504,3215.18,0.742,3215.18,0.748,884.17,0.8,nan,nan,-401.9,0.792,nan,nan -29383698.504,-3215.18,0.741,-3215.18,0.729,1607.59,0.802,nan,nan,401.9,0.782,nan,nan -29383898.504,-3215.18,0.763,-3215.18,0.758,2411.38,0.805,nan,nan,1125.31,0.773,nan,nan -29384098.504,-3215.18,0.785,-3215.18,0.786,3134.8,0.811,nan,nan,1929.11,0.765,nan,nan -29384298.504,-3215.18,0.801,-3215.18,0.808,3215.18,0.816,nan,nan,2732.9,0.759,nan,nan -29384498.504,-3215.18,0.811,-3215.18,0.821,3215.18,0.817,nan,nan,3215.18,0.755,nan,nan -29384698.504,-3215.18,0.815,-3215.18,0.828,3215.18,0.812,nan,nan,3215.18,0.75,nan,nan -29384898.504,-3215.18,0.814,-3215.18,0.829,3215.18,0.802,nan,nan,3215.18,0.743,nan,nan -29385098.504,-3215.18,0.81,-3215.18,0.827,3215.18,0.782,nan,nan,-3215.18,0.747,nan,nan -29385298.504,-3215.18,0.803,-3215.18,0.821,3215.18,0.756,nan,nan,-3215.18,0.754,nan,nan -29385498.504,-2250.62,0.794,-3215.18,0.812,3215.18,0.728,nan,nan,-3215.18,0.761,nan,nan -29385698.504,-1446.83,0.782,-3215.18,0.8,-3215.18,0.756,nan,nan,-3215.18,0.766,nan,nan -29385898.504,-723.41,0.771,-3215.18,0.787,-3215.18,0.785,nan,nan,-3215.18,0.768,nan,nan -29386098.504,-160.76,0.76,-3215.18,0.775,-3215.18,0.811,nan,nan,-3215.18,0.769,nan,nan -29386298.504,482.28,0.751,-3215.18,0.766,-3215.18,0.833,nan,nan,-3215.18,0.768,nan,nan -29386498.504,884.17,0.744,-3215.18,0.761,-3215.18,0.849,nan,nan,-3215.18,0.767,nan,nan -29386698.504,803.79,0.741,-3215.18,0.759,-3215.18,0.86,nan,nan,-3215.18,0.764,nan,nan -29386898.504,-3215.18,0.743,-3215.18,0.759,-3215.18,0.864,nan,nan,-3215.18,0.761,nan,nan -29387098.504,-2491.76,0.746,-2491.76,0.759,-3215.18,0.861,nan,nan,-3215.18,0.758,nan,nan -29387298.504,-1366.45,0.75,-1607.59,0.761,-3215.18,0.855,nan,nan,-3215.18,0.757,nan,nan -29387498.504,-884.17,0.753,-884.17,0.761,-3215.18,0.846,nan,nan,-3215.18,0.756,nan,nan -29387698.504,-80.38,0.752,-80.38,0.759,-3215.18,0.834,nan,nan,-3215.18,0.758,nan,nan -29387898.504,-3215.18,0.75,241.14,0.753,-2732.9,0.821,nan,nan,-3215.18,0.761,nan,nan -29388098.504,-3215.18,0.751,-3215.18,0.75,-2009.48,0.81,nan,nan,-3215.18,0.764,nan,nan -29388298.504,-3215.18,0.754,-3215.18,0.751,-1205.69,0.8,nan,nan,-3215.18,0.769,nan,nan -29388498.504,-3215.18,0.762,-3215.18,0.757,-482.28,0.793,nan,nan,-3215.18,0.775,nan,nan -29388698.504,-3215.18,0.775,-3215.18,0.768,321.52,0.788,nan,nan,-3215.18,0.781,nan,nan -29388898.504,-3215.18,0.79,-3215.18,0.782,964.55,0.782,nan,nan,-3215.18,0.786,nan,nan -29389098.504,-3215.18,0.804,-3215.18,0.796,1768.35,0.777,nan,nan,-3215.18,0.79,nan,nan -29389298.504,-3215.18,0.817,-3215.18,0.808,2491.76,0.771,nan,nan,-3215.18,0.793,nan,nan -29389498.504,-3215.18,0.824,-3215.18,0.817,3215.18,0.765,nan,nan,-3215.18,0.795,nan,nan -29389698.504,-3215.18,0.827,-3215.18,0.821,3215.18,0.758,nan,nan,-3215.18,0.793,nan,nan -29389898.504,-3215.18,0.826,-3215.18,0.821,3215.18,0.748,nan,nan,-3215.18,0.788,nan,nan -29390098.504,-3215.18,0.822,-3215.18,0.818,-3215.18,0.739,nan,nan,-2491.76,0.784,nan,nan -29390298.504,-3215.18,0.814,-3215.18,0.811,-3215.18,0.755,nan,nan,-1768.35,0.78,nan,nan -29390498.504,-3215.18,0.803,-3215.18,0.802,-3215.18,0.772,nan,nan,-964.55,0.778,nan,nan -29390698.504,-2732.9,0.792,-3215.18,0.791,-3215.18,0.789,nan,nan,-160.76,0.776,nan,nan -29390898.504,-1929.11,0.78,-3215.18,0.781,-3215.18,0.804,nan,nan,643.04,0.773,nan,nan -29391098.504,-1125.31,0.77,-3215.18,0.772,-3215.18,0.816,nan,nan,1286.07,0.771,nan,nan -29391298.504,-3215.18,0.762,nan,nan,-3215.18,0.824,nan,nan,2089.86,0.769,nan,nan -29391498.504,-3215.18,0.756,nan,nan,-3215.18,0.828,nan,nan,2893.66,0.767,nan,nan -29391698.504,-3215.18,0.753,nan,nan,-3215.18,0.829,nan,nan,3215.18,0.766,nan,nan -29391898.504,-3215.18,0.753,nan,nan,-3215.18,0.829,nan,nan,3215.18,0.761,nan,nan -29392098.504,-3215.18,0.755,nan,nan,-3215.18,0.826,nan,nan,3215.18,0.753,nan,nan -29392298.504,-3215.18,0.758,nan,nan,-3215.18,0.821,nan,nan,3215.18,0.743,nan,nan -29392498.504,-3215.18,0.762,nan,nan,-3215.18,0.814,nan,nan,-3215.18,0.747,nan,nan -29392698.504,-3215.18,0.766,nan,nan,-3215.18,0.806,nan,nan,-3215.18,0.758,nan,nan -29392898.504,-3215.18,0.768,nan,nan,-2813.28,0.797,nan,nan,-3215.18,0.768,nan,nan -29393098.504,-3215.18,0.77,nan,nan,-2089.86,0.79,nan,nan,-3215.18,0.777,nan,nan -29393298.504,-3215.18,0.771,nan,nan,-1366.45,0.785,nan,nan,-3215.18,0.783,nan,nan -29393498.504,-3215.18,0.77,nan,nan,-562.66,0.782,nan,nan,-3215.18,0.789,nan,nan -29393698.504,-3215.18,0.768,nan,nan,160.76,0.781,nan,nan,-3215.18,0.794,nan,nan -29393898.504,-3215.18,0.766,nan,nan,964.55,0.783,nan,nan,-3215.18,0.796,nan,nan -29394098.504,-3215.18,0.763,nan,nan,1768.35,0.786,nan,nan,-3215.18,0.796,nan,nan -29394298.504,-3215.18,0.76,nan,nan,2572.14,0.791,nan,nan,-3215.18,0.797,nan,nan -29394498.504,-2572.14,0.758,nan,nan,3215.18,0.798,nan,nan,-3215.18,0.797,nan,nan -29394698.504,-1768.35,0.756,nan,nan,3215.18,0.805,nan,nan,-3215.18,0.797,nan,nan -29394898.504,-964.55,0.756,nan,nan,3215.18,0.809,nan,nan,-3215.18,0.798,nan,nan -29395098.504,-160.76,0.758,nan,nan,3215.18,0.811,nan,nan,-3215.18,0.801,nan,nan -29395298.504,643.04,0.761,nan,nan,3215.18,0.81,nan,nan,-3215.18,0.803,nan,nan -29395498.504,1446.83,0.763,nan,nan,3215.18,0.804,nan,nan,-3215.18,0.805,nan,nan -29395698.504,2250.62,0.765,nan,nan,3215.18,0.794,nan,nan,-3215.18,0.807,nan,nan -29395898.504,3054.42,0.765,nan,nan,3215.18,0.781,nan,nan,-3215.18,0.806,nan,nan -29396098.504,3215.18,0.764,nan,nan,3215.18,0.766,nan,nan,-3215.18,0.804,nan,nan -29396298.504,3215.18,0.758,nan,nan,3215.18,0.747,nan,nan,-3215.18,0.799,nan,nan -29396498.504,3215.18,0.749,nan,nan,-3215.18,0.743,nan,nan,-2652.52,0.793,nan,nan -29396698.504,-3215.18,0.74,nan,nan,-3215.18,0.762,nan,nan,-1929.11,0.789,nan,nan -29396898.504,-3215.18,0.752,nan,nan,-3215.18,0.777,nan,nan,-1125.31,0.787,nan,nan -29397098.504,-3215.18,0.766,nan,nan,-3215.18,0.79,nan,nan,-321.52,0.786,nan,nan -29397298.504,-3215.18,0.781,nan,nan,-3215.18,0.8,nan,nan,401.9,0.787,nan,nan -29397498.504,-3215.18,0.796,nan,nan,-3215.18,0.804,nan,nan,1205.69,0.79,nan,nan -29397698.504,-3215.18,0.808,nan,nan,-3215.18,0.804,nan,nan,1929.11,0.794,nan,nan -29397898.504,-3215.18,0.817,nan,nan,-3215.18,0.801,nan,nan,2732.9,0.798,nan,nan -29398098.504,-3215.18,0.823,nan,nan,-3215.18,0.796,nan,nan,3215.18,0.804,nan,nan -29398298.504,-3215.18,0.825,nan,nan,-3054.42,0.788,nan,nan,3215.18,0.808,nan,nan -29398498.504,-3215.18,0.825,nan,nan,-2250.62,0.78,nan,nan,3215.18,0.808,nan,nan -29398698.504,-3215.18,0.822,nan,nan,-1446.83,0.771,nan,nan,3215.18,0.806,nan,nan -29398898.504,-3215.18,0.818,nan,nan,-3215.18,0.762,nan,nan,3215.18,0.8,nan,nan -29399098.504,-3215.18,0.814,nan,nan,-3215.18,0.757,nan,nan,3215.18,0.791,nan,nan -29399298.504,-3215.18,0.81,nan,nan,-3215.18,0.754,nan,nan,3215.18,0.78,nan,nan -29399498.504,-3215.18,0.807,nan,nan,-3215.18,0.753,nan,nan,3215.18,0.768,nan,nan -29399698.504,-3215.18,0.804,nan,nan,-3215.18,0.755,nan,nan,3215.18,0.754,nan,nan -29399898.504,-3215.18,0.802,nan,nan,-3215.18,0.759,nan,nan,3215.18,0.74,nan,nan -29400098.504,-3215.18,0.8,nan,nan,-3215.18,0.765,nan,nan,-3215.18,0.753,nan,nan -29400298.504,-3215.18,0.798,nan,nan,-3215.18,0.77,nan,nan,-3215.18,0.765,nan,nan -29400498.504,-3215.18,0.796,nan,nan,-3215.18,0.775,nan,nan,-3215.18,0.774,nan,nan -29400698.504,-3215.18,0.793,nan,nan,-3215.18,0.778,nan,nan,-3215.18,0.783,nan,nan -29400898.504,-3215.18,0.789,nan,nan,-3215.18,0.78,nan,nan,-3215.18,0.79,nan,nan -29401098.504,-3215.18,0.785,nan,nan,-3215.18,0.78,nan,nan,-3215.18,0.796,nan,nan -29401298.504,-3215.18,0.781,nan,nan,-3215.18,0.778,nan,nan,-3215.18,0.802,nan,nan -29401498.504,-3215.18,0.776,nan,nan,-3054.42,0.774,nan,nan,-3215.18,0.807,nan,nan -29401698.504,-3215.18,0.773,nan,nan,-2250.62,0.771,nan,nan,-3215.18,0.813,nan,nan -29401898.504,-3215.18,0.771,nan,nan,-1527.21,0.767,nan,nan,-3215.18,0.819,nan,nan -29402098.504,-3215.18,0.771,nan,nan,-723.41,0.764,nan,nan,-3215.18,0.826,nan,nan -29402298.504,-3215.18,0.772,nan,nan,80.38,0.761,nan,nan,-3215.18,0.835,nan,nan -29402498.504,-3215.18,0.776,nan,nan,884.17,0.76,nan,nan,-3215.18,0.845,nan,nan -29402698.504,-3215.18,0.781,nan,nan,1607.59,0.759,nan,nan,-3215.18,0.854,nan,nan -29402898.504,-3215.18,0.786,nan,nan,2411.38,0.758,nan,nan,-3215.18,0.862,nan,nan -29403098.504,-3215.18,0.792,nan,nan,3215.18,0.759,nan,nan,-3215.18,0.868,nan,nan -29403298.504,-3215.18,0.796,nan,nan,3215.18,0.758,nan,nan,-3215.18,0.872,nan,nan -29403498.504,-3215.18,0.799,nan,nan,3215.18,0.756,nan,nan,-3215.18,0.876,nan,nan -29403698.504,-3215.18,0.801,nan,nan,3215.18,0.753,nan,nan,-3215.18,0.876,nan,nan -29403898.504,-3215.18,0.802,nan,nan,3215.18,0.749,nan,nan,-3215.18,0.875,nan,nan -29404098.504,-3215.18,0.801,nan,nan,-3215.18,0.744,nan,nan,-3215.18,0.87,nan,nan -29404298.504,-3215.18,0.8,nan,nan,-3215.18,0.75,nan,nan,-3215.18,0.863,nan,nan -29404498.504,-3215.18,0.798,nan,nan,-3215.18,0.757,nan,nan,-3215.18,0.854,nan,nan -29404698.504,-3215.18,0.796,nan,nan,-3215.18,0.765,nan,nan,-3215.18,0.844,nan,nan -29404898.504,-3215.18,0.794,nan,nan,-3215.18,0.774,nan,nan,-3215.18,0.834,nan,nan -29405098.504,-3215.18,0.792,nan,nan,-3215.18,0.783,nan,nan,-3215.18,0.824,nan,nan -29405298.504,-3215.18,0.791,nan,nan,-3215.18,0.791,nan,nan,-3215.18,0.814,nan,nan -29405498.504,-3215.18,0.79,nan,nan,-3215.18,0.8,nan,nan,-3215.18,0.805,nan,nan -29405698.504,-3215.18,0.788,nan,nan,-3215.18,0.807,nan,nan,-3215.18,0.796,nan,nan -29405898.504,-3215.18,0.788,nan,nan,-3215.18,0.814,nan,nan,-3215.18,0.788,nan,nan -29406098.504,-3215.18,0.787,nan,nan,-3215.18,0.819,nan,nan,-3215.18,0.782,nan,nan -29406298.504,-3215.18,0.788,nan,nan,-3215.18,0.823,nan,nan,-3215.18,0.777,nan,nan -29406498.504,-3215.18,0.788,nan,nan,-3215.18,0.824,nan,nan,-3215.18,0.773,nan,nan -29406698.504,-3215.18,0.789,nan,nan,-3215.18,0.824,nan,nan,-3215.18,0.768,nan,nan -29406898.504,-3215.18,0.789,nan,nan,-3215.18,0.823,nan,nan,-3215.18,0.763,nan,nan -29407098.504,-3215.18,0.789,nan,nan,-3215.18,0.821,nan,nan,-2572.14,0.76,nan,nan -29407298.504,-3215.18,0.789,nan,nan,-3215.18,0.817,nan,nan,-1768.35,0.757,nan,nan -29407498.504,-3215.18,0.789,nan,nan,-3215.18,0.812,nan,nan,-964.55,0.755,nan,nan -29407698.504,-3215.18,0.787,nan,nan,-3215.18,0.806,nan,nan,-160.76,0.754,nan,nan -29407898.504,-3215.18,0.784,nan,nan,-3215.18,0.799,nan,nan,643.04,0.752,nan,nan -29408098.504,-3215.18,0.78,nan,nan,-3215.18,0.792,nan,nan,1446.83,0.75,nan,nan -29408298.504,-2974.04,0.775,nan,nan,-3215.18,0.784,nan,nan,2250.62,0.748,nan,nan -29408498.504,-2170.24,0.771,nan,nan,-2974.04,0.777,nan,nan,3054.42,0.747,nan,nan -29408698.504,-1366.45,0.77,nan,nan,-2170.24,0.77,nan,nan,3215.18,0.745,nan,nan -29408898.504,-562.66,0.769,nan,nan,-1366.45,0.763,nan,nan,-3215.18,0.747,nan,nan -29409098.504,160.76,0.77,nan,nan,-643.04,0.758,nan,nan,-3215.18,0.749,nan,nan -29409298.504,964.55,0.771,nan,nan,160.76,0.753,nan,nan,-3215.18,0.753,nan,nan -29409498.504,1687.97,0.773,nan,nan,964.55,0.749,nan,nan,-3215.18,0.757,nan,nan -29409698.504,2491.76,0.777,nan,nan,-3215.18,0.747,nan,nan,-3215.18,0.76,nan,nan -29409898.504,3215.18,0.782,nan,nan,-3215.18,0.747,nan,nan,-3215.18,0.763,nan,nan -29410098.504,3215.18,0.787,nan,nan,-3215.18,0.748,nan,nan,-3215.18,0.764,nan,nan -29410298.504,3215.18,0.789,nan,nan,-3215.18,0.751,nan,nan,-3215.18,0.765,nan,nan -29410498.504,3215.18,0.789,nan,nan,-3215.18,0.753,nan,nan,-3215.18,0.765,nan,nan -29410698.504,3215.18,0.79,nan,nan,-3215.18,0.756,nan,nan,-3215.18,0.764,nan,nan -29410898.504,3215.18,0.79,nan,nan,-3215.18,0.758,nan,nan,-2732.9,0.761,nan,nan -29411098.504,3215.18,0.79,nan,nan,-3215.18,0.758,nan,nan,-1929.11,0.759,nan,nan -29411298.504,3215.18,0.789,nan,nan,-3134.8,0.758,nan,nan,-1125.31,0.758,nan,nan -29411498.504,3215.18,0.788,nan,nan,-2331.0,0.758,nan,nan,-321.52,0.757,nan,nan -29411698.504,3215.18,0.786,nan,nan,-1607.59,0.758,nan,nan,482.28,0.756,nan,nan -29411898.504,3215.18,0.786,nan,nan,-884.17,0.758,nan,nan,1286.07,0.757,nan,nan -29412098.504,3215.18,0.785,nan,nan,-80.38,0.758,nan,nan,2089.86,0.759,nan,nan -29412298.504,3215.18,0.782,nan,nan,723.41,0.759,nan,nan,2893.66,0.762,nan,nan -29412498.504,3215.18,0.781,nan,nan,1527.21,0.761,nan,nan,3215.18,0.766,nan,nan -29412698.504,3215.18,0.78,nan,nan,2331.0,0.764,nan,nan,3215.18,0.77,nan,nan -29412898.504,3215.18,0.778,nan,nan,3054.42,0.767,nan,nan,3215.18,0.775,nan,nan -29413098.504,3215.18,0.775,nan,nan,3215.18,0.771,nan,nan,3215.18,0.78,nan,nan -29413298.504,3215.18,0.773,nan,nan,3215.18,0.774,nan,nan,3215.18,0.786,nan,nan -29413498.504,3215.18,0.773,nan,nan,3215.18,0.778,nan,nan,3215.18,0.792,nan,nan -29413698.504,3215.18,0.774,nan,nan,3215.18,0.781,nan,nan,3215.18,0.798,nan,nan -29413898.504,3215.18,0.775,nan,nan,3215.18,0.784,nan,nan,3215.18,0.805,nan,nan -29414098.504,3215.18,0.776,nan,nan,3215.18,0.786,nan,nan,3215.18,0.814,nan,nan -29414298.504,3215.18,0.778,nan,nan,3215.18,0.789,nan,nan,3215.18,0.823,nan,nan -29414498.504,3215.18,0.782,nan,nan,3215.18,0.792,nan,nan,3215.18,0.833,nan,nan -29414698.504,3215.18,0.787,nan,nan,3215.18,0.795,nan,nan,3215.18,0.844,nan,nan -29414898.504,3215.18,0.792,nan,nan,3215.18,0.798,nan,nan,3215.18,0.854,nan,nan -29415098.504,3215.18,0.797,nan,nan,3215.18,0.8,nan,nan,3215.18,0.863,nan,nan -29415298.504,3215.18,0.802,nan,nan,3215.18,0.802,nan,nan,3215.18,0.872,nan,nan -29415498.504,3215.18,0.805,nan,nan,3215.18,0.804,nan,nan,3215.18,0.879,nan,nan -29415698.504,3215.18,0.81,nan,nan,3215.18,0.805,nan,nan,3215.18,0.885,nan,nan -29415898.504,3215.18,0.815,nan,nan,3215.18,0.806,nan,nan,3215.18,0.888,nan,nan -29416098.504,3215.18,0.819,nan,nan,3215.18,0.806,nan,nan,3215.18,0.888,nan,nan -29416298.504,3215.18,0.823,nan,nan,3215.18,0.806,nan,nan,3215.18,0.886,nan,nan -29416498.504,3215.18,0.826,nan,nan,3215.18,0.805,nan,nan,3215.18,0.882,nan,nan -29416698.504,3215.18,0.829,nan,nan,3215.18,0.804,nan,nan,3215.18,0.876,nan,nan -29416898.504,3215.18,0.834,nan,nan,3215.18,0.802,nan,nan,3215.18,0.868,nan,nan -29417098.504,3215.18,0.839,nan,nan,3215.18,0.801,nan,nan,3215.18,0.858,nan,nan -29417298.504,3215.18,0.843,nan,nan,3215.18,0.799,nan,nan,3215.18,0.846,nan,nan -29417498.504,3215.18,0.847,nan,nan,3215.18,0.796,nan,nan,3215.18,0.833,nan,nan -29417698.504,3215.18,0.852,nan,nan,3215.18,0.794,nan,nan,3215.18,0.822,nan,nan -29417898.504,3215.18,0.857,nan,nan,3215.18,0.791,nan,nan,3215.18,0.813,nan,nan -29418098.504,3215.18,0.861,nan,nan,3215.18,0.789,nan,nan,3215.18,0.805,nan,nan -29418298.504,3215.18,0.864,nan,nan,3215.18,0.786,nan,nan,3215.18,0.798,nan,nan -29418498.504,3215.18,0.868,nan,nan,3215.18,0.784,nan,nan,3215.18,0.789,nan,nan -29418698.504,3215.18,0.872,nan,nan,3215.18,0.781,nan,nan,3215.18,0.78,nan,nan -29418898.504,3215.18,0.872,nan,nan,3215.18,0.779,nan,nan,3215.18,0.77,nan,nan -29419098.504,3215.18,0.871,nan,nan,3215.18,0.777,nan,nan,3215.18,0.76,nan,nan -29419298.504,3215.18,0.87,nan,nan,3215.18,0.775,nan,nan,3215.18,0.75,nan,nan -29419498.504,3215.18,0.868,nan,nan,3215.18,0.774,nan,nan,3215.18,0.742,nan,nan -29419698.504,3215.18,0.863,nan,nan,3215.18,0.773,nan,nan,-3215.18,0.75,nan,nan -29419898.504,3215.18,0.852,nan,nan,3215.18,0.772,nan,nan,-3215.18,0.758,nan,nan -29420098.504,3215.18,0.84,nan,nan,3215.18,0.772,nan,nan,-3215.18,0.767,nan,nan -29420298.504,3215.18,0.83,nan,nan,3215.18,0.772,nan,nan,-3215.18,0.773,nan,nan -29420498.504,3215.18,0.819,nan,nan,3215.18,0.771,nan,nan,-3215.18,0.777,nan,nan -29420698.504,3215.18,0.802,nan,nan,3215.18,0.771,nan,nan,-3215.18,0.779,nan,nan -29420898.504,3215.18,0.78,nan,nan,3215.18,0.771,nan,nan,-3215.18,0.779,nan,nan -29421098.504,3215.18,0.759,nan,nan,3215.18,0.771,nan,nan,-3215.18,0.777,nan,nan -29421298.504,3215.18,0.741,nan,nan,3215.18,0.771,nan,nan,-3215.18,0.774,nan,nan -29421498.504,-3215.18,0.749,nan,nan,3215.18,0.771,nan,nan,-3215.18,0.771,nan,nan -29421698.504,-3215.18,0.768,nan,nan,3215.18,0.77,nan,nan,-3215.18,0.766,nan,nan -29421898.504,-3215.18,0.78,nan,nan,3215.18,0.769,nan,nan,-3215.18,0.763,nan,nan -29422098.504,-3215.18,0.791,nan,nan,3215.18,0.767,nan,nan,-2732.9,0.758,nan,nan -29422298.504,-3215.18,0.803,nan,nan,3215.18,0.764,nan,nan,-1929.11,0.755,nan,nan -29422498.504,-3215.18,0.814,nan,nan,3215.18,0.761,nan,nan,-1125.31,0.753,nan,nan -29422698.504,-3215.18,0.82,nan,nan,3215.18,0.757,nan,nan,-321.52,0.752,nan,nan -29422898.504,-3215.18,0.82,nan,nan,3215.18,0.753,nan,nan,482.28,0.751,nan,nan -29423098.504,-3215.18,0.82,nan,nan,3215.18,0.748,nan,nan,1286.07,0.751,nan,nan -29423298.504,-3215.18,0.821,nan,nan,-3215.18,0.743,nan,nan,2089.86,0.751,nan,nan -29423498.504,-3215.18,0.824,nan,nan,-3215.18,0.749,nan,nan,2893.66,0.752,nan,nan -29423698.504,-3215.18,0.822,nan,nan,-3215.18,0.755,nan,nan,3215.18,0.752,nan,nan -29423898.504,-3215.18,0.814,nan,nan,-3215.18,0.761,nan,nan,3215.18,0.752,nan,nan -29424098.504,-3215.18,0.807,nan,nan,-3215.18,0.766,nan,nan,3215.18,0.75,nan,nan -29424298.504,-3215.18,0.805,nan,nan,-3215.18,0.772,nan,nan,3215.18,0.746,nan,nan -29424498.504,-3215.18,0.803,nan,nan,-3215.18,0.777,nan,nan,-3215.18,0.745,nan,nan -29424698.504,-3215.18,0.798,nan,nan,-3215.18,0.782,nan,nan,-3215.18,0.749,nan,nan -29424898.504,-3215.18,0.791,nan,nan,-3215.18,0.786,nan,nan,-3215.18,0.754,nan,nan -29425098.504,-3215.18,0.786,nan,nan,-3215.18,0.79,nan,nan,-3215.18,0.759,nan,nan -29425298.504,-3215.18,0.784,nan,nan,-3215.18,0.793,nan,nan,-3215.18,0.764,nan,nan -29425498.504,-3215.18,0.781,nan,nan,-3215.18,0.795,nan,nan,-3215.18,0.77,nan,nan -29425698.504,-3215.18,0.779,nan,nan,-3215.18,0.797,nan,nan,-3215.18,0.776,nan,nan -29425898.504,-3215.18,0.775,nan,nan,-3215.18,0.798,nan,nan,-3215.18,0.78,nan,nan -29426098.504,-3215.18,0.774,nan,nan,-3215.18,0.798,nan,nan,-3215.18,0.783,nan,nan -29426298.504,-3215.18,0.775,nan,nan,-3215.18,0.797,nan,nan,-3215.18,0.785,nan,nan -29426498.504,-3215.18,0.775,nan,nan,-3215.18,0.795,nan,nan,-3215.18,0.785,nan,nan -29426698.504,-3215.18,0.773,nan,nan,-3215.18,0.793,nan,nan,-3215.18,0.785,nan,nan -29426898.504,-3215.18,0.774,nan,nan,-3215.18,0.79,nan,nan,-3215.18,0.784,nan,nan -29427098.504,-3215.18,0.778,nan,nan,-3215.18,0.787,nan,nan,-3215.18,0.781,nan,nan -29427298.504,-3215.18,0.779,nan,nan,-3215.18,0.783,nan,nan,-3215.18,0.778,nan,nan -29427498.504,-3215.18,0.78,nan,nan,-3215.18,0.778,nan,nan,-3215.18,0.774,nan,nan -29427698.504,-3215.18,0.78,nan,nan,-3215.18,0.773,nan,nan,-2813.28,0.769,nan,nan -29427898.504,-3215.18,0.781,nan,nan,-2813.28,0.768,nan,nan,-2009.48,0.766,nan,nan -29428098.504,-3215.18,0.782,nan,nan,-2009.48,0.764,nan,nan,-1205.69,0.763,nan,nan -29428298.504,-3215.18,0.784,nan,nan,-1205.69,0.762,nan,nan,-401.9,0.762,nan,nan -29428498.504,-3215.18,0.785,nan,nan,-482.28,0.761,nan,nan,401.9,0.762,nan,nan -29428698.504,-3215.18,0.784,nan,nan,321.52,0.762,nan,nan,1205.69,0.762,nan,nan -29428898.504,-3215.18,0.782,nan,nan,1125.31,0.764,nan,nan,2009.48,0.763,nan,nan -29429098.504,-3215.18,0.778,nan,nan,1929.11,0.768,nan,nan,2813.28,0.766,nan,nan -29429298.504,-3215.18,0.779,nan,nan,2732.9,0.773,nan,nan,3215.18,0.768,nan,nan -29429498.504,-3215.18,0.78,nan,nan,3215.18,0.78,nan,nan,3215.18,0.77,nan,nan -29429698.504,-3215.18,0.778,nan,nan,3215.18,0.787,nan,nan,3215.18,0.771,nan,nan -29429898.504,-3215.18,0.775,nan,nan,3215.18,0.794,nan,nan,3215.18,0.771,nan,nan -29430098.504,-3215.18,0.775,nan,nan,3215.18,0.8,nan,nan,3215.18,0.77,nan,nan -29430298.504,-3215.18,0.774,nan,nan,3215.18,0.806,nan,nan,3215.18,0.768,nan,nan -29430498.504,-3215.18,0.773,nan,nan,3215.18,0.811,nan,nan,3215.18,0.766,nan,nan -29430698.504,-3215.18,0.772,nan,nan,3215.18,0.816,nan,nan,3215.18,0.763,nan,nan -29430898.504,-3215.18,0.77,nan,nan,3215.18,0.821,nan,nan,3215.18,0.761,nan,nan -29431098.504,-3215.18,0.769,nan,nan,3215.18,0.826,nan,nan,3215.18,0.76,nan,nan -29431298.504,-3215.18,0.767,nan,nan,3215.18,0.83,nan,nan,3215.18,0.758,nan,nan -29431498.504,-3215.18,0.766,nan,nan,3215.18,0.832,nan,nan,3215.18,0.757,nan,nan -29431698.504,-3215.18,0.764,nan,nan,3215.18,0.834,nan,nan,3215.18,0.756,nan,nan -29431898.504,-3215.18,0.762,nan,nan,3215.18,0.836,nan,nan,3215.18,0.756,nan,nan -29432098.504,-3215.18,0.76,nan,nan,3215.18,0.838,nan,nan,3215.18,0.754,nan,nan -29432298.504,-3215.18,0.758,nan,nan,3215.18,0.838,nan,nan,3215.18,0.753,nan,nan -29432498.504,-3215.18,0.756,nan,nan,3215.18,0.837,nan,nan,3215.18,0.751,nan,nan -29432698.504,-3215.18,0.754,nan,nan,3215.18,0.836,nan,nan,3215.18,0.749,nan,nan -29432898.504,-3215.18,0.754,nan,nan,3215.18,0.834,nan,nan,3215.18,0.746,nan,nan -29433098.504,-3215.18,0.754,nan,nan,3215.18,0.832,nan,nan,-3215.18,0.746,nan,nan -29433298.504,-3215.18,0.754,nan,nan,3215.18,0.829,nan,nan,-3215.18,0.75,nan,nan -29433498.504,-3215.18,0.753,nan,nan,3215.18,0.825,nan,nan,-3215.18,0.753,nan,nan -29433698.504,-3215.18,0.753,nan,nan,3215.18,0.821,nan,nan,-3215.18,0.758,nan,nan -29433898.504,-3215.18,0.755,nan,nan,3215.18,0.817,nan,nan,-3215.18,0.762,nan,nan -29434098.504,-3215.18,0.757,nan,nan,3215.18,0.815,nan,nan,-3215.18,0.767,nan,nan -29434298.504,-3215.18,0.759,nan,nan,3215.18,0.813,nan,nan,-3215.18,0.771,nan,nan -29434498.504,-3215.18,0.76,nan,nan,3215.18,0.811,nan,nan,-3215.18,0.774,nan,nan -29434698.504,-3215.18,0.762,nan,nan,3215.18,0.807,nan,nan,-3215.18,0.777,nan,nan -29434898.504,-3215.18,0.763,nan,nan,3215.18,0.803,nan,nan,-3215.18,0.779,nan,nan -29435098.504,-3215.18,0.765,nan,nan,3215.18,0.8,nan,nan,-3215.18,0.781,nan,nan -29435298.504,-3215.18,0.767,nan,nan,3215.18,0.798,nan,nan,-3215.18,0.782,nan,nan -29435498.504,-3215.18,0.767,nan,nan,3215.18,0.794,nan,nan,-3215.18,0.783,nan,nan -29435698.504,-3215.18,0.767,nan,nan,3215.18,0.787,nan,nan,-3215.18,0.783,nan,nan -29435898.504,-3215.18,0.766,nan,nan,3215.18,0.779,nan,nan,-3215.18,0.783,nan,nan -29436098.504,-3215.18,0.765,nan,nan,3215.18,0.769,nan,nan,-3215.18,0.783,nan,nan -29436298.504,-3215.18,0.765,nan,nan,3215.18,0.759,nan,nan,-3215.18,0.783,nan,nan -29436498.504,-3215.18,0.764,nan,nan,3215.18,0.75,nan,nan,-3215.18,0.782,nan,nan -29436698.504,-3215.18,0.764,nan,nan,-3215.18,0.742,nan,nan,-3215.18,0.781,nan,nan -29436898.504,-3215.18,0.765,nan,nan,-3215.18,0.752,nan,nan,-3215.18,0.781,nan,nan -29437098.504,-3215.18,0.766,nan,nan,-3215.18,0.764,nan,nan,-3215.18,0.78,nan,nan -29437298.504,-3215.18,0.766,nan,nan,-3215.18,0.775,nan,nan,-3215.18,0.779,nan,nan -29437498.504,-3215.18,0.768,nan,nan,-3215.18,0.784,nan,nan,-3215.18,0.779,nan,nan -29437698.504,-3215.18,0.769,nan,nan,-3215.18,0.794,nan,nan,-3215.18,0.777,nan,nan -29437898.504,-3215.18,0.771,nan,nan,-3215.18,0.802,nan,nan,-3215.18,0.776,nan,nan -29438098.504,-3215.18,0.772,nan,nan,-3215.18,0.811,nan,nan,-3215.18,0.775,nan,nan -29438298.504,-3215.18,0.772,nan,nan,-3215.18,0.82,nan,nan,-3215.18,0.773,nan,nan -29438498.504,-3215.18,0.772,nan,nan,-3215.18,0.829,nan,nan,-3215.18,0.772,nan,nan -29438698.504,-3215.18,0.772,nan,nan,-3215.18,0.835,nan,nan,-3215.18,0.771,nan,nan -29438898.504,-3215.18,0.771,nan,nan,-3215.18,0.84,nan,nan,-3215.18,0.769,nan,nan -29439098.504,-3215.18,0.768,nan,nan,-3215.18,0.845,nan,nan,-3215.18,0.767,nan,nan -29439298.504,-3215.18,0.766,nan,nan,-3215.18,0.85,nan,nan,-3215.18,0.765,nan,nan -29439498.504,-3215.18,0.763,nan,nan,-3215.18,0.854,nan,nan,-3215.18,0.763,nan,nan -29439698.504,-3215.18,0.761,nan,nan,-3215.18,0.855,nan,nan,-3215.18,0.76,nan,nan -29439898.504,-2732.9,0.758,nan,nan,-3215.18,0.855,nan,nan,-3215.18,0.758,nan,nan -29440098.504,-1929.11,0.756,nan,nan,-3215.18,0.854,nan,nan,-2893.66,0.755,nan,nan -29440298.504,-1125.31,0.753,nan,nan,-3215.18,0.853,nan,nan,-2089.86,0.753,nan,nan -29440498.504,-321.52,0.751,nan,nan,-3215.18,0.852,nan,nan,-1286.07,0.752,nan,nan -29440698.504,482.28,0.749,nan,nan,-3215.18,0.851,nan,nan,-482.28,0.751,nan,nan -29440898.504,1286.07,0.747,nan,nan,-3215.18,0.851,nan,nan,80.38,0.751,nan,nan -29441098.504,-3215.18,0.746,nan,nan,-3215.18,0.85,nan,nan,884.17,0.752,nan,nan -29441298.504,-3215.18,0.745,nan,nan,-3215.18,0.85,nan,nan,1687.97,0.753,nan,nan -29441498.504,-3215.18,0.746,nan,nan,-3215.18,0.849,nan,nan,2491.76,0.754,nan,nan -29441698.504,-3215.18,0.746,nan,nan,-3215.18,0.847,nan,nan,3215.18,0.757,nan,nan -29441898.504,-3215.18,0.748,nan,nan,-3215.18,0.845,nan,nan,3215.18,0.759,nan,nan -29442098.504,-3215.18,0.749,nan,nan,-3215.18,0.843,nan,nan,3215.18,0.761,nan,nan -29442298.504,-3215.18,0.751,nan,nan,-3215.18,0.84,nan,nan,3215.18,0.763,nan,nan -29442498.504,-3215.18,0.751,nan,nan,-3215.18,0.835,nan,nan,3215.18,0.765,nan,nan -29442698.504,-2893.66,0.751,nan,nan,-3215.18,0.83,nan,nan,3215.18,0.767,nan,nan -29442898.504,-2089.86,0.751,nan,nan,-3215.18,0.825,nan,nan,3215.18,0.768,nan,nan -29443098.504,-1286.07,0.751,nan,nan,-3215.18,0.82,nan,nan,3215.18,0.77,nan,nan -29443298.504,-482.28,0.751,nan,nan,-3215.18,0.815,nan,nan,3215.18,0.772,nan,nan -29443498.504,401.9,0.751,nan,nan,-3215.18,0.81,nan,nan,3215.18,0.773,nan,nan -29443698.504,1125.31,0.752,nan,nan,-3215.18,0.805,nan,nan,3215.18,0.774,nan,nan -29443898.504,1929.11,0.753,nan,nan,-3215.18,0.799,nan,nan,3215.18,0.775,nan,nan -29444098.504,2732.9,0.756,nan,nan,-3215.18,0.793,nan,nan,3215.18,0.776,nan,nan -29444298.504,2491.76,0.759,nan,nan,-3215.18,0.787,nan,nan,3215.18,0.777,nan,nan -29444498.504,3215.18,0.763,nan,nan,-3215.18,0.782,nan,nan,3215.18,0.777,nan,nan -29444698.504,3215.18,0.767,nan,nan,-3215.18,0.777,nan,nan,3215.18,0.778,nan,nan -29444898.504,3215.18,0.771,nan,nan,-3215.18,0.771,nan,nan,3215.18,0.779,nan,nan -29445098.504,3215.18,0.776,nan,nan,-3215.18,0.766,nan,nan,3215.18,0.779,nan,nan -29445298.504,3215.18,0.781,nan,nan,-2572.14,0.762,nan,nan,3215.18,0.78,nan,nan -29445498.504,3215.18,0.786,nan,nan,-1848.73,0.76,nan,nan,3215.18,0.781,nan,nan -29445698.504,3215.18,0.793,nan,nan,-1044.93,0.759,nan,nan,3215.18,0.781,nan,nan -29445898.504,3215.18,0.802,nan,nan,-241.14,0.759,nan,nan,3215.18,0.782,nan,nan -29446098.504,3215.18,0.81,nan,nan,562.66,0.759,nan,nan,3215.18,0.782,nan,nan -29446298.504,3215.18,0.819,nan,nan,1366.45,0.76,nan,nan,3215.18,0.782,nan,nan -29446498.504,3215.18,0.829,nan,nan,2170.24,0.762,nan,nan,3215.18,0.782,nan,nan -29446698.504,3215.18,0.839,nan,nan,2974.04,0.766,nan,nan,3215.18,0.781,nan,nan -29446898.504,3215.18,0.849,nan,nan,3215.18,0.77,nan,nan,3215.18,0.781,nan,nan -29447098.504,3215.18,0.86,nan,nan,3215.18,0.773,nan,nan,3215.18,0.781,nan,nan -29447298.504,3215.18,0.87,nan,nan,3215.18,0.775,nan,nan,3215.18,0.78,nan,nan -29447498.504,3215.18,0.879,nan,nan,3215.18,0.777,nan,nan,3215.18,0.779,nan,nan -29447698.504,3215.18,0.889,nan,nan,3215.18,0.78,nan,nan,3215.18,0.777,nan,nan -29447898.504,3215.18,0.898,nan,nan,3215.18,0.782,nan,nan,3215.18,0.775,nan,nan -29448098.504,3215.18,0.906,nan,nan,3215.18,0.784,nan,nan,3215.18,0.773,nan,nan -29448298.504,3215.18,0.915,nan,nan,3215.18,0.785,nan,nan,3215.18,0.771,nan,nan -29448498.504,3215.18,0.923,nan,nan,3215.18,0.785,nan,nan,3215.18,0.769,nan,nan -29448698.504,3215.18,0.93,nan,nan,3215.18,0.783,nan,nan,3215.18,0.766,nan,nan -29448898.504,3215.18,0.936,nan,nan,3215.18,0.781,nan,nan,3215.18,0.763,nan,nan -29449098.504,3215.18,0.942,nan,nan,3215.18,0.777,nan,nan,3215.18,0.759,nan,nan -29449298.504,3215.18,0.946,nan,nan,3215.18,0.772,nan,nan,3215.18,0.755,nan,nan -29449498.504,3215.18,0.947,nan,nan,3215.18,0.766,nan,nan,3215.18,0.751,nan,nan -29449698.504,3215.18,0.944,nan,nan,3215.18,0.758,nan,nan,3215.18,0.747,nan,nan -29449898.504,3215.18,0.934,nan,nan,3215.18,0.75,nan,nan,-3215.18,0.745,nan,nan -29450098.504,3215.18,0.915,nan,nan,3215.18,0.742,nan,nan,-3215.18,0.75,nan,nan -29450298.504,3215.18,0.879,nan,nan,-3215.18,0.751,nan,nan,-3215.18,0.756,nan,nan -29450498.504,3215.18,0.818,nan,nan,-3215.18,0.759,nan,nan,-3215.18,0.761,nan,nan -29450698.504,3215.18,0.726,nan,nan,-3215.18,0.768,nan,nan,-3215.18,0.766,nan,nan -29450898.504,-3215.18,0.725,nan,nan,-3215.18,0.777,nan,nan,-3215.18,0.771,nan,nan -29451098.504,-3215.18,0.82,nan,nan,-3215.18,0.784,nan,nan,-3215.18,0.775,nan,nan -29451298.504,-3215.18,0.885,nan,nan,-3215.18,0.791,nan,nan,-3215.18,0.779,nan,nan -29451498.504,-3215.18,0.924,nan,nan,-3215.18,0.796,nan,nan,-3215.18,0.783,nan,nan -29451698.504,-3215.18,0.943,nan,nan,-3215.18,0.801,nan,nan,-3215.18,0.787,nan,nan -29451898.504,-3215.18,0.95,nan,nan,-3215.18,0.804,nan,nan,-3215.18,0.79,nan,nan -29452098.504,-3215.18,0.953,nan,nan,-3215.18,0.808,nan,nan,-3215.18,0.791,nan,nan -29452298.504,-3215.18,0.951,nan,nan,-3215.18,0.809,nan,nan,-3215.18,0.792,nan,nan -29452498.504,-3215.18,0.945,nan,nan,-3215.18,0.809,nan,nan,-3215.18,0.792,nan,nan -29452698.504,-3215.18,0.937,nan,nan,-3215.18,0.808,nan,nan,-3215.18,0.792,nan,nan -29452898.504,-3215.18,0.928,nan,nan,-3215.18,0.806,nan,nan,-3215.18,0.791,nan,nan -29453098.504,-3215.18,0.916,nan,nan,-3215.18,0.803,nan,nan,-3215.18,0.79,nan,nan -29453298.504,-3215.18,0.903,nan,nan,-3215.18,0.798,nan,nan,-3215.18,0.787,nan,nan -29453498.504,-3215.18,0.89,nan,nan,-3215.18,0.793,nan,nan,-3215.18,0.784,nan,nan -29453698.504,-3215.18,0.874,nan,nan,-3215.18,0.787,nan,nan,-3215.18,0.78,nan,nan -29453898.504,-3215.18,0.859,nan,nan,-3215.18,0.781,nan,nan,-3215.18,0.777,nan,nan -29454098.504,-3215.18,0.843,nan,nan,-2893.66,0.774,nan,nan,-3215.18,0.773,nan,nan -29454298.504,-3215.18,0.827,nan,nan,-2170.24,0.769,nan,nan,-3215.18,0.77,nan,nan -29454498.504,-3215.18,0.812,nan,nan,-1446.83,0.765,nan,nan,-3215.18,0.766,nan,nan -29454698.504,-3215.18,0.798,nan,nan,-643.04,0.762,nan,nan,-3215.18,0.763,nan,nan -29454898.504,-3215.18,0.785,nan,nan,160.76,0.761,nan,nan,-3215.18,0.76,nan,nan -29455098.504,-3215.18,0.776,nan,nan,964.55,0.761,nan,nan,-3215.18,0.758,nan,nan -29455298.504,-2491.76,0.768,nan,nan,1768.35,0.763,nan,nan,-3215.18,0.756,nan,nan -29455498.504,-1687.97,0.763,nan,nan,2572.14,0.766,nan,nan,-3215.18,0.756,nan,nan -29455698.504,-884.17,0.76,nan,nan,3215.18,0.77,nan,nan,-3215.18,0.755,nan,nan -29455898.504,-80.38,0.758,nan,nan,3215.18,0.774,nan,nan,-3215.18,0.756,nan,nan -29456098.504,723.41,0.757,nan,nan,3215.18,0.778,nan,nan,-3215.18,0.757,nan,nan -29456298.504,1527.21,0.758,nan,nan,3215.18,0.782,nan,nan,-3215.18,0.759,nan,nan -29456498.504,2331.0,0.76,nan,nan,3215.18,0.784,nan,nan,-3215.18,0.762,nan,nan -29456698.504,3134.8,0.763,nan,nan,3215.18,0.785,nan,nan,-3215.18,0.765,nan,nan -29456898.504,3215.18,0.765,nan,nan,3215.18,0.786,nan,nan,-3215.18,0.769,nan,nan -29457098.504,3215.18,0.769,nan,nan,3215.18,0.786,nan,nan,-3215.18,0.773,nan,nan -29457298.504,3215.18,0.772,nan,nan,3215.18,0.784,nan,nan,-3215.18,0.776,nan,nan -29457498.504,3215.18,0.777,nan,nan,3215.18,0.782,nan,nan,-3215.18,0.78,nan,nan -29457698.504,3215.18,0.782,nan,nan,3215.18,0.779,nan,nan,-3215.18,0.783,nan,nan -29457898.504,3215.18,0.786,nan,nan,3215.18,0.776,nan,nan,-3215.18,0.786,nan,nan -29458098.504,3215.18,0.794,nan,nan,3215.18,0.772,nan,nan,-3215.18,0.789,nan,nan -29458298.504,3215.18,0.802,nan,nan,3215.18,0.768,nan,nan,-3215.18,0.79,nan,nan -29458498.504,3215.18,0.81,nan,nan,3215.18,0.763,nan,nan,-3215.18,0.791,nan,nan -29458698.504,3215.18,0.818,nan,nan,3215.18,0.759,nan,nan,-3215.18,0.792,nan,nan -29458898.504,3215.18,0.829,nan,nan,nan,nan,nan,nan,-3215.18,0.792,nan,nan -29459098.504,3215.18,0.841,nan,nan,nan,nan,nan,nan,-3215.18,0.791,nan,nan -29459298.504,3215.18,0.856,nan,nan,nan,nan,nan,nan,-3215.18,0.791,nan,nan -29459498.504,3215.18,0.869,nan,nan,nan,nan,nan,nan,-3215.18,0.789,nan,nan -29459698.504,3215.18,0.88,nan,nan,nan,nan,nan,nan,-3215.18,0.788,nan,nan -29459898.504,3215.18,0.892,nan,nan,nan,nan,nan,nan,-3215.18,0.787,nan,nan -29460098.504,3215.18,0.902,nan,nan,nan,nan,nan,nan,-3215.18,0.785,nan,nan -29460298.504,3215.18,0.909,nan,nan,nan,nan,nan,nan,-3215.18,0.784,nan,nan -29460498.504,3215.18,0.915,nan,nan,nan,nan,nan,nan,-3215.18,0.783,nan,nan -29460698.504,3215.18,0.919,nan,nan,nan,nan,nan,nan,-3215.18,0.781,nan,nan -29460898.504,3215.18,0.918,nan,nan,nan,nan,nan,nan,-3215.18,0.778,nan,nan -29461098.504,3215.18,0.911,nan,nan,nan,nan,nan,nan,-3215.18,0.776,nan,nan -29461298.504,3215.18,0.899,nan,nan,nan,nan,nan,nan,-3215.18,0.773,nan,nan -29461498.504,3215.18,0.874,nan,nan,nan,nan,nan,nan,-3215.18,0.77,nan,nan -29461698.504,3215.18,0.839,nan,nan,nan,nan,nan,nan,-2893.66,0.766,nan,nan -29461898.504,3215.18,0.796,nan,nan,nan,nan,nan,nan,-2089.86,0.763,nan,nan -29462098.504,3215.18,0.745,nan,nan,nan,nan,nan,nan,-1286.07,0.761,nan,nan -29462298.504,-3215.18,0.737,nan,nan,nan,nan,nan,nan,-482.28,0.76,nan,nan -29462498.504,-3215.18,0.786,nan,nan,nan,nan,nan,nan,321.52,0.761,nan,nan -29462698.504,-3215.18,0.827,nan,nan,nan,nan,nan,nan,1125.31,0.763,nan,nan -29462898.504,-3215.18,0.853,nan,nan,nan,nan,nan,nan,1929.11,0.766,nan,nan -29463098.504,-3215.18,0.869,nan,nan,nan,nan,nan,nan,2652.52,0.77,nan,nan -29463298.504,-3215.18,0.883,nan,nan,nan,nan,nan,nan,3215.18,0.775,nan,nan -29463498.504,-3215.18,0.891,nan,nan,nan,nan,nan,nan,3215.18,0.781,nan,nan -29463698.504,-3215.18,0.896,nan,nan,nan,nan,nan,nan,3215.18,0.785,nan,nan -29463898.504,-3215.18,0.9,nan,nan,nan,nan,nan,nan,3215.18,0.789,nan,nan -29464098.504,-3215.18,0.901,nan,nan,nan,nan,nan,nan,3215.18,0.793,nan,nan -29464298.504,-3215.18,0.903,nan,nan,nan,nan,nan,nan,3215.18,0.794,nan,nan -29464498.504,-3215.18,0.904,nan,nan,nan,nan,nan,nan,3215.18,0.795,nan,nan -29464698.504,-3215.18,0.907,nan,nan,nan,nan,nan,nan,3215.18,0.795,nan,nan -29464898.504,-3215.18,0.91,nan,nan,nan,nan,nan,nan,3215.18,0.794,nan,nan -29465098.504,-3215.18,0.912,nan,nan,nan,nan,nan,nan,3215.18,0.791,nan,nan -29465298.504,-3215.18,0.912,nan,nan,nan,nan,nan,nan,3215.18,0.788,nan,nan -29465498.504,-3215.18,0.911,nan,nan,nan,nan,nan,nan,3215.18,0.784,nan,nan -29465698.504,-3215.18,0.91,nan,nan,nan,nan,nan,nan,3215.18,0.779,nan,nan -29465898.504,-3215.18,0.907,nan,nan,nan,nan,nan,nan,3215.18,0.774,nan,nan -29466098.504,-3215.18,0.903,nan,nan,nan,nan,nan,nan,3215.18,0.768,nan,nan -29466298.504,-3215.18,0.9,nan,nan,nan,nan,nan,nan,3215.18,0.763,nan,nan -29466498.504,-3215.18,0.895,nan,nan,nan,nan,nan,nan,3215.18,0.758,nan,nan -29466698.504,-3215.18,0.889,nan,nan,nan,nan,nan,nan,3215.18,0.753,nan,nan -29466898.504,-3215.18,0.883,nan,nan,nan,nan,nan,nan,3215.18,0.748,nan,nan -29467098.504,-3215.18,0.877,nan,nan,nan,nan,nan,nan,3215.18,0.744,nan,nan -29467298.504,-3215.18,0.872,nan,nan,nan,nan,nan,nan,-3134.8,0.746,nan,nan -29467498.504,-3215.18,0.866,nan,nan,nan,nan,nan,nan,-3215.18,0.748,nan,nan -29467698.504,-3215.18,0.86,nan,nan,nan,nan,nan,nan,-2732.9,0.749,nan,nan -29467898.504,-3215.18,0.854,nan,nan,nan,nan,nan,nan,-2089.86,0.751,nan,nan -29468098.504,-3215.18,0.848,nan,nan,nan,nan,nan,nan,-1125.31,0.754,nan,nan -29468298.504,-3215.18,0.844,nan,nan,nan,nan,nan,nan,-321.52,0.757,nan,nan -29468498.504,-3215.18,0.839,nan,nan,nan,nan,nan,nan,321.52,0.76,nan,nan -29468698.504,-3215.18,0.835,nan,nan,nan,nan,nan,nan,1125.31,0.765,nan,nan -29468898.504,-3215.18,0.832,nan,nan,nan,nan,nan,nan,1929.11,0.77,nan,nan -29469098.504,-3215.18,0.83,nan,nan,nan,nan,nan,nan,2732.9,0.776,nan,nan -29469298.504,-3215.18,0.828,nan,nan,nan,nan,nan,nan,3215.18,0.783,nan,nan -29469498.504,-3215.18,0.825,nan,nan,nan,nan,nan,nan,3215.18,0.787,nan,nan -29469698.504,-3215.18,0.823,nan,nan,nan,nan,nan,nan,3215.18,0.79,nan,nan -29469898.504,-3215.18,0.821,nan,nan,nan,nan,nan,nan,3215.18,0.791,nan,nan -29470098.504,-3215.18,0.821,nan,nan,nan,nan,nan,nan,3215.18,0.79,nan,nan -29470298.504,-3215.18,0.82,nan,nan,nan,nan,nan,nan,3215.18,0.786,nan,nan -29470498.504,-3215.18,0.819,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29470698.504,-3215.18,0.818,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29470898.504,-3215.18,0.817,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29471098.504,-3215.18,0.817,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29471298.504,-3215.18,0.817,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29471498.504,-3215.18,0.818,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29471698.504,-3215.18,0.817,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29471898.504,-3215.18,0.817,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29472098.504,-3215.18,0.816,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29472298.504,-3215.18,0.814,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29472498.504,-3215.18,0.811,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29472698.504,-3215.18,0.806,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29472898.504,-3215.18,0.8,nan,nan,-321.52,0.826,nan,nan,nan,nan,nan,nan -29473098.504,-3215.18,0.793,nan,nan,241.14,0.83,nan,nan,nan,nan,nan,nan -29473298.504,-2411.38,0.786,nan,nan,964.55,0.837,nan,nan,nan,nan,nan,nan -29473498.504,-1607.59,0.781,nan,nan,1607.59,0.844,nan,nan,nan,nan,nan,nan -29473698.504,-803.79,0.778,nan,nan,2170.24,0.853,nan,nan,nan,nan,nan,nan -29473898.504,0.0,0.778,nan,nan,2893.66,0.864,nan,nan,nan,nan,nan,nan -29474098.504,723.41,0.779,nan,nan,3215.18,0.879,nan,nan,nan,nan,nan,nan -29474298.504,1527.21,0.783,nan,nan,3215.18,0.889,nan,nan,nan,nan,nan,nan -29474498.504,2331.0,0.789,nan,nan,3215.18,0.893,nan,nan,nan,nan,nan,nan -29474698.504,3134.8,0.799,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29474898.504,3215.18,0.81,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29475098.504,3215.18,0.822,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29475298.504,3215.18,0.835,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29475498.504,3215.18,0.848,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29475698.504,3215.18,0.861,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29475898.504,3215.18,0.875,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29476098.504,3215.18,0.89,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29476298.504,3215.18,0.904,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29476498.504,3215.18,0.917,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29476698.504,3215.18,0.929,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29476898.504,3215.18,0.94,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29477098.504,3215.18,0.949,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29477298.504,3215.18,0.957,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29477498.504,3215.18,0.962,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29477698.504,3215.18,0.966,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29477898.504,3215.18,0.968,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29478098.504,3215.18,0.967,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29478298.504,3215.18,0.961,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29478498.504,3215.18,0.942,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29478698.504,3215.18,0.898,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29478898.504,3215.18,0.815,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29479098.504,3215.18,0.675,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29479298.504,nan,0.503,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29479498.504,nan,0.482,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29479698.504,nan,0.572,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29479898.504,-482.28,0.664,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29480098.504,-643.04,0.729,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29480298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29480498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29480698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29480898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29481098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29481298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29481498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29481698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29481898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29482098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29482298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29482498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29482698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29482898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29483098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29483298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29483498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29483698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29483898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29484098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29484298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29484498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29484698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29484898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29485098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29485298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29485498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29485698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29485898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29486098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29486298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29486498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29486698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29486898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29487098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29487298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29487498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29487698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29487898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29488098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29488298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29488498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29488698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29488898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29489098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29489298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29489498.504,nan,nan,nan,nan,-3215.18,0.893,nan,nan,nan,nan,nan,nan -29489698.504,nan,nan,nan,nan,-3215.18,0.893,nan,nan,nan,nan,nan,nan -29489898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29490098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29490298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29490498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29490698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29490898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29491098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29491298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29491498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29491698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29491898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29492098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29492298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29492498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29492698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29492898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29493098.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29493298.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29493498.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29493698.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan -29493898.504,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan diff --git a/scripts/helper_tool.sh b/scripts/helper_tool.sh deleted file mode 100644 index e69de29..0000000 diff --git a/scripts/interp_atl03.py b/scripts/interp_atl03.py deleted file mode 100644 index dc4b573..0000000 --- a/scripts/interp_atl03.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import numpy as np -# Import some of the scripts that we have written -import glob, sys -sys.path.append("/Users/benhills/Software/MyGitRepos/surface_velocity/scripts") -sys.path.append("/Users/benhills/Software/MyGitRepos/surface_velocity/readers") -from read_HDF5_ATL03 import read_HDF5_ATL03 -from get_ATL03_x_atc import get_ATL03_x_atc - -import warnings -warnings.filterwarnings('ignore') - -atl3_dir = '/Users/benhills/Google Drive File Stream/Shared drives/IceSat2_Surface_Velocity/Shared_Data/FIS_0848_ATL03/ATL03_files/' -files = glob.glob(atl3_dir+'**/ATL03*.h5') - -for file_name in files: - print(file_name) - -for file_name in files[2:]: - - # read the IS2 data with Tyler's ATL03 reader: - IS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams = read_HDF5_ATL03(files[0]) - # add x_atc to the ATL03 data structure (this function adds to the LS2_ATL03_mds dictionary) - get_ATL03_x_atc(IS2_atl03_mds, IS2_atl03_attrs, IS2_atl03_beams) - - beams = ['gt1l', 'gt1r', 'gt2l', 'gt2r', 'gt3l', 'gt3r'] - - beam = beams[0] - - #-- select the 2l beam from ATL03 - D3 = IS2_atl03_mds[beam] - LMH=D3['heights']['signal_conf_ph'][:,3] >= 2 - atl03_along = D3['heights']['x_atc'][LMH] - atl03_height = D3['heights']['h_ph'][LMH] - - xstep = 5. - xwin = 10. - xs = np.arange(np.nanmin(atl03_along),np.nanmax(atl03_along),xstep) - hs = np.empty_like(xs) - print('Total Length:',len(xs)) - - for i,x in enumerate(xs): - if i%100 == 0: - print(i) - idxs = np.logical_and(atl03_along>x-xwin,atl03_along\d+)_(?P\d\d\d\d)(?P\d\d)(?P\d\d)_(?P\d\d\d)_(?P\d\d).h5') - with h5py.File(filename,'r') as h5f: - for key in field_dict: - for ds in field_dict[key]: - if key is not None: - ds_name=beam+'/land_ice_segments/'+key+'/'+ds - else: - ds_name=beam+'/land_ice_segments/'+ds - if index is not None: - D[ds]=np.array(h5f[ds_name][index]) - else: - D[ds]=np.array(h5f[ds_name]) - if '_FillValue' in h5f[ds_name].attrs: - bad_vals=D[ds]==h5f[ds_name].attrs['_FillValue'] - D[ds]=D[ds].astype(float) - D[ds][bad_vals]=np.NaN - if epsg is not None: - xy=np.array(pyproj.proj.Proj(epsg)(D['longitude'], D['latitude'])) - D['x']=xy[0,:].reshape(D['latitude'].shape) - D['y']=xy[1,:].reshape(D['latitude'].shape) - temp=file_re.search(filename) - D['rgt']=int(temp['rgt']) - D['cycle']=int(temp['cycle']) - D['beam']=beam - return D diff --git a/setup.py b/setup.py index 78d5f27..71ec0ca 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,12 @@ from setuptools import setup, find_packages setup( - name='surface_velocity', + name='IS2_velocity', version='0.0.1', license='BSD', description='surface ice velocity mapping with ICESat-2', - url='https://github.com/ICESAT-2HackWeek/surface_velocity', - packages=find_packages(exclude=['contributors', 'notebooks', 'readers', 'scripts']), + url='https://github.com/ICESAT-2HackWeek/IS2_velocity', + packages=find_packages(exclude=['data','test','notebooks']), install_requires=[ 'numpy', 'scipy', diff --git a/surface_velocity/__init__.py b/surface_velocity/__init__.py deleted file mode 100644 index 3f0247b..0000000 --- a/surface_velocity/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import readers diff --git a/surface_velocity/readers.py b/surface_velocity/readers.py deleted file mode 100644 index 17fe2bc..0000000 --- a/surface_velocity/readers.py +++ /dev/null @@ -1,56 +0,0 @@ -import numpy as np -import h5py - -def ATL06_to_dict(filename, dataset_dict): - """ - Read selected datasets from an ATL06 file - - Input arguments: - filename: ATl06 file to read - dataset_dict: A dictinary describing the fields to be read - keys give the group names to be read, - entries are lists of datasets within the groups - Output argument: - D6: dictionary containing ATL06 data. Each dataset in - dataset_dict has its own entry in D6. Each dataset - in D6 contains a list of numpy arrays containing the - data - """ - D6 = [] - pairs = [1, 2, 3] - beams = ['l','r'] - # open the HDF5 file - with h5py.File(filename) as h5f: - # loop over beam pairs - for pair in pairs: - # loop over beams - for beam_ind, beam in enumerate(beams): - # check if a beam exists, if not, skip it - if '/gt%d%s/land_ice_segments' % (pair, beam) not in h5f: - continue - # loop over the groups in the dataset dictionary - temp = {} - for group in dataset_dict.keys(): - for dataset in dataset_dict[group]: - DS='/gt%d%s/%s/%s' % (pair, beam, group, dataset) - # since a dataset may not exist in a file, we're going - # to try to read it, and if it doesn't work, we'll move - # on to the next: - try: - temp[dataset]=np.array(h5f[DS]) - # some parameters have a _FillValue attribute. If - # it exists, use it to identify bad values, and set - # them to np.NaN - if '_FillValue' in h5f[DS].attrs: - fill_value=h5f[DS].attrs['_FillValue'] - temp[dataset][temp[dataset]==fill_value]=np.NaN - except KeyError as e: - pass - if len(temp) > 0: - # it's sometimes convenient to have the beam and the pair - # as part of the output data structure: This is how we put them there. - temp['pair']=np.zeros_like(temp['h_li'])+pair - temp['beam']=np.zeros_like(temp['h_li'])+beam_ind - temp['filename']=filename - D6.append(temp) - return D6