def open(self): atr = readfile.read_attribute(self.insar_file) k = atr['FILE_TYPE'] if k == 'timeseries': ts_obj = timeseries(self.insar_file) elif k == 'giantTimeseries': ts_obj = giantTimeseries(self.insar_file) else: raise ValueError('Un-supported time-series file: {}'.format(k)) ts_obj.open(print_msg=False) self.metadata = dict(ts_obj.metadata) self.num_date = ts_obj.numDate # remove time info from insar_datetime to be consistent with gps_datetime self.insar_datetime = np.array([i.replace(hour=0, minute=0, second=0, microsecond=0) for i in ts_obj.times]) # default start/end if self.start_date is None: self.start_date = (ts_obj.times[0] - relativedelta(months=1)).strftime('%Y%m%d') if self.end_date is None: self.end_date = (ts_obj.times[-1] + relativedelta(months=1)).strftime('%Y%m%d') # default min_ref_date if self.min_ref_date is None: self.min_ref_date = ts_obj.times[5].strftime('%Y%m%d') elif self.min_ref_date not in ts_obj.dateList: raise ValueError('input min_ref_date {} does not exist in insar file {}'.format( self.min_ref_date, self.insar_file)) self.read_gps() self.read_insar() self.calculate_rmse() return
def read_date_info(inps): """Read dates used in the estimation and its related info. Parameters: inps - Namespace Returns: inps - Namespace """ if inps.key == 'timeseries': tsobj = timeseries(inps.timeseries_file) elif inps.key == 'giantTimeseries': tsobj = giantTimeseries(inps.timeseries_file) elif inps.key == 'HDFEOS': tsobj = HDFEOS(inps.timeseries_file) tsobj.open() inps.excludeDate = read_exclude_date(inps, tsobj.dateList) # exclude dates without obs data [for offset time-series only for now] if os.path.basename(inps.timeseries_file).startswith('timeseriesRg'): date_list = timeseries(inps.timeseries_file).get_date_list() data, atr = readfile.read(inps.timeseries_file) flag = np.nansum(data, axis=(1, 2)) == 0 flag[date_list.index(atr['REF_DATE'])] = 0 if np.sum(flag) > 0: print('number of empty dates to exclude: {}'.format(np.sum(flag))) inps.excludeDate += np.array(date_list)[flag].tolist() inps.excludeDate = sorted(list(set(inps.excludeDate))) # Date used for estimation inps.dateList inps.dateList = [i for i in tsobj.dateList if i not in inps.excludeDate] inps.numDate = len(inps.dateList) inps.startDate = inps.dateList[0] inps.endDate = inps.dateList[-1] print('-' * 50) print('dates from input file: {}\n{}'.format(tsobj.numDate, tsobj.dateList)) print('-' * 50) if len(inps.dateList) == len(tsobj.dateList): print('using all dates to calculate the velocity') else: print('dates used to estimate the velocity: {}\n{}'.format( inps.numDate, inps.dateList)) print('-' * 50) # flag array for ts data reading inps.dropDate = np.array( [i not in inps.excludeDate for i in tsobj.dateList], dtype=np.bool_) # output file name if not inps.outfile: fbase = os.path.splitext(os.path.basename(inps.timeseries_file))[0] outname = 'velocity' if inps.key == 'giantTimeseries': prefix = os.path.basename(inps.timeseries_file).split('PARAMS')[0] outname = prefix + outname elif fbase in ['timeseriesRg', 'timeseriesAz']: suffix = fbase.split('timeseries')[-1] outname = outname + suffix outname += '.h5' inps.outfile = outname return inps
def read_date_info(inps): """Get inps.excludeDate full list Inputs: inps - Namespace, Output: inps.excludeDate - list of string for exclude date in YYYYMMDD format """ if inps.key == 'timeseries': tsobj = timeseries(inps.timeseries_file) elif inps.key == 'giantTimeseries': tsobj = giantTimeseries(inps.timeseries_file) elif inps.key == 'HDFEOS': tsobj = HDFEOS(inps.timeseries_file) tsobj.open() inps.excludeDate = read_exclude_date(inps, tsobj.dateList) # Date used for estimation inps.dateList inps.dateList = [i for i in tsobj.dateList if i not in inps.excludeDate] date_list = inps.dateList dt_list = [dt.strptime(i, '%Y%m%d') for i in date_list] yr_list = [i.year + (i.timetuple().tm_yday - 1) / 365.25 for i in dt_list] yr_diff = np.array(yr_list) yr_diff -= yr_diff[0] inps.yr_diff = yr_diff inps.numDate = len(inps.dateList) print('-' * 50) print('dates from input file: {}\n{}'.format(tsobj.numDate, tsobj.dateList)) print('-' * 50) if len(inps.dateList) == len(tsobj.dateList): print('using all dates to calculate the velocity') else: print('dates used to estimate the velocity: {}\n{}'.format( inps.numDate, inps.dateList)) print('-' * 50) # flag array for ts data reading inps.dropDate = np.array( [i not in inps.excludeDate for i in tsobj.dateList], dtype=np.bool_) # output file name if not inps.outfile: outname = 'velocity' if inps.key == 'giantTimeseries': prefix = os.path.basename(inps.timeseries_file).split('PARAMS')[0] outname = prefix + outname outname += '.h5' inps.outfile = outname return inps
def open(self): atr = readfile.read_attribute(self.insar_file) k = atr['FILE_TYPE'] if k == 'timeseries': ts_obj = timeseries(self.insar_file) elif k == 'giantTimeseries': ts_obj = giantTimeseries(self.insar_file) ts_obj.open(print_msg=False) self.metadata = dict(ts_obj.metadata) self.num_date = ts_obj.numDate self.insar_datetime = ts_obj.times self.read_gps() self.read_insar() self.calculate_rmse() return
def print_date_list(fname, disp_ifgram='all', disp_num=False, print_msg=False): """Print time/date info of file""" k = readfile.read_attribute(fname)['FILE_TYPE'] dateList = None if k in ['timeseries']: dateList = timeseries(fname).get_date_list() elif k == 'HDFEOS': dateList = HDFEOS(fname).get_date_list() elif k == 'giantTimeseries': dateList = giantTimeseries(fname).get_date_list() elif k in ['giantIfgramStack']: dateList = giantIfgramStack(fname).get_date12_list() elif k in ['ifgramStack']: obj = ifgramStack(fname) obj.open(print_msg=False) dateListAll = obj.get_date12_list(dropIfgram=False) dateListKept = obj.get_date12_list(dropIfgram=True) # show dropped ifgram or not if disp_ifgram == 'all': dateList = list(dateListAll) elif disp_ifgram == 'kept': dateList = list(dateListKept) else: dateList = sorted(list(set(dateListAll) - set(dateListKept))) else: print('--date option can not be applied to {} file, ignore it.'.format( k)) # print list info if print_msg and dateList is not None: for d in dateList: if disp_num: if k in ['ifgramStack']: num = dateListAll.index(d) else: num = dateList.index(d) msg = '{}\t{}'.format(d, num) else: msg = d print(msg) return dateList
def print_date_list(fname, disp_ifgram='all', disp_num=False, print_msg=False): """Print time/date info of file""" k = readfile.read_attribute(fname)['FILE_TYPE'] dateList = None if k in ['timeseries']: dateList = timeseries(fname).get_date_list() elif k == 'HDFEOS': dateList = HDFEOS(fname).get_date_list() elif k == 'giantTimeseries': dateList = giantTimeseries(fname).get_date_list() elif k in ['giantIfgramStack']: dateList = giantIfgramStack(fname).get_date12_list() elif k in ['ifgramStack']: obj = ifgramStack(fname) obj.open(print_msg=False) dateListAll = obj.get_date12_list(dropIfgram=False) dateListKept = obj.get_date12_list(dropIfgram=True) # show dropped ifgram or not if disp_ifgram == 'all': dateList = list(dateListAll) elif disp_ifgram == 'kept': dateList = list(dateListKept) else: dateList = sorted(list(set(dateListAll) - set(dateListKept))) else: print('--date option can not be applied to {} file, ignore it.'.format(k)) # print list info if print_msg and dateList is not None: for d in dateList: if disp_num: if k in ['ifgramStack']: num = dateListAll.index(d) else: num = dateList.index(d) msg = '{}\t{}'.format(d, num) else: msg = d print(msg) return dateList
def read_init_info(inps): # Time Series Info atr = readfile.read_attribute(inps.file[0]) inps.key = atr['FILE_TYPE'] if inps.key == 'timeseries': obj = timeseries(inps.file[0]) elif inps.key == 'giantTimeseries': obj = giantTimeseries(inps.file[0]) elif inps.key == 'HDFEOS': obj = HDFEOS(inps.file[0]) else: raise ValueError('input file is {}, not timeseries.'.format(inps.key)) obj.open(print_msg=inps.print_msg) inps.seconds = atr.get('CENTER_LINE_UTC', 0) if not inps.file_label: inps.file_label = [] for fname in inps.file: fbase = os.path.splitext(os.path.basename(fname))[0] fbase = fbase.replace('timeseries', '') inps.file_label.append(fbase) # default mask file if not inps.mask_file and 'msk' not in inps.file[0]: dir_name = os.path.dirname(inps.file[0]) if 'Y_FIRST' in atr.keys(): inps.mask_file = os.path.join(dir_name, 'geo_maskTempCoh.h5') else: inps.mask_file = os.path.join(dir_name, 'maskTempCoh.h5') if not os.path.isfile(inps.mask_file): inps.mask_file = None ## date info inps.date_list = obj.dateList inps.num_date = len(inps.date_list) if inps.start_date: inps.date_list = [i for i in inps.date_list if int(i) >= int(inps.start_date)] if inps.end_date: inps.date_list = [i for i in inps.date_list if int(i) <= int(inps.end_date)] inps.num_date = len(inps.date_list) inps.dates, inps.yearList = ptime.date_list2vector(inps.date_list) (inps.ex_date_list, inps.ex_dates, inps.ex_flag) = read_exclude_date(inps.ex_date_list, inps.date_list) # reference date/index if not inps.ref_date: inps.ref_date = atr.get('REF_DATE', None) if inps.ref_date: inps.ref_idx = inps.date_list.index(inps.ref_date) else: inps.ref_idx = None # date/index of interest for initial display if not inps.idx: if (not inps.ref_idx) or (inps.ref_idx < inps.num_date / 2.): inps.idx = inps.num_date - 2 else: inps.idx = 2 # Display Unit (inps.disp_unit, inps.unit_fac) = pp.scale_data2disp_unit(metadata=atr, disp_unit=inps.disp_unit)[1:3] # Map info - coordinate unit inps.coord_unit = atr.get('Y_UNIT', 'degrees').lower() # Read Error List inps.ts_plot_func = plot_ts_scatter inps.error_ts = None inps.ex_error_ts = None if inps.error_file: # assign plot function inps.ts_plot_func = plot_ts_errorbar # read error file error_fc = np.loadtxt(inps.error_file, dtype=bytes).astype(str) inps.error_ts = error_fc[:, 1].astype(np.float)*inps.unit_fac # update error file with exlcude date if inps.ex_date_list: e_ts = inps.error_ts[:] inps.ex_error_ts = e_ts[inps.ex_flag == 0] inps.error_ts = e_ts[inps.ex_flag == 1] # Zero displacement for 1st acquisition if inps.zero_first: inps.zero_idx = min(0, np.min(np.where(inps.ex_flag)[0])) # default lookup table file and coordinate object if not inps.lookup_file: inps.lookup_file = ut.get_lookup_file('./inputs/geometryRadar.h5') inps.coord = ut.coordinate(atr, inps.lookup_file) ## size and lalo info inps.pix_box, inps.geo_box = subset.subset_input_dict2box(vars(inps), atr) inps.pix_box = inps.coord.check_box_within_data_coverage(inps.pix_box) inps.geo_box = inps.coord.box_pixel2geo(inps.pix_box) data_box = (0, 0, int(atr['WIDTH']), int(atr['LENGTH'])) vprint('data coverage in y/x: '+str(data_box)) vprint('subset coverage in y/x: '+str(inps.pix_box)) vprint('data coverage in lat/lon: '+str(inps.coord.box_pixel2geo(data_box))) vprint('subset coverage in lat/lon: '+str(inps.geo_box)) vprint('------------------------------------------------------------------------') # calculate multilook_num # ONLY IF: # inps.multilook is True (no --nomultilook input) AND # inps.multilook_num ==1 (no --multilook-num input) # Note: inps.multilook is used for this check ONLY # Note: multilooking is only applied to the 3D data cubes and their related operations: # e.g. spatial indexing, referencing, etc. All the other variables are in the original grid # so that users get the same result as the non-multilooked version. if inps.multilook and inps.multilook_num == 1: inps.multilook_num = pp.auto_multilook_num(inps.pix_box, inps.num_date, max_memory=inps.maxMemory, print_msg=inps.print_msg) ## reference pixel if not inps.ref_lalo and 'REF_LAT' in atr.keys(): inps.ref_lalo = (float(atr['REF_LAT']), float(atr['REF_LON'])) if inps.ref_lalo: # set longitude to [-180, 180) if inps.coord_unit.lower().startswith('deg') and inps.ref_lalo[1] >= 180.: inps.ref_lalo[1] -= 360. # ref_lalo --> ref_yx if not set in cmd if not inps.ref_yx: inps.ref_yx = inps.coord.geo2radar(inps.ref_lalo[0], inps.ref_lalo[1], print_msg=False)[0:2] # use REF_Y/X if ref_yx not set in cmd if not inps.ref_yx and 'REF_Y' in atr.keys(): inps.ref_yx = (int(atr['REF_Y']), int(atr['REF_X'])) # ref_yx --> ref_lalo if in geo-coord # for plotting purpose only if inps.ref_yx and 'Y_FIRST' in atr.keys(): inps.ref_lalo = inps.coord.radar2geo(inps.ref_yx[0], inps.ref_yx[1], print_msg=False)[0:2] # do not plot native reference point if it's out of the coverage due to subset if (inps.ref_yx and 'Y_FIRST' in atr.keys() and inps.ref_yx == (int(atr.get('REF_Y',-999)), int(atr.get('REF_X',-999))) and not ( inps.pix_box[0] <= inps.ref_yx[1] < inps.pix_box[2] and inps.pix_box[1] <= inps.ref_yx[0] < inps.pix_box[3])): inps.disp_ref_pixel = False print('the native REF_Y/X is out of subset box, thus do not display') ## initial pixel coord if inps.lalo: inps.yx = inps.coord.geo2radar(inps.lalo[0], inps.lalo[1], print_msg=False)[0:2] try: inps.lalo = inps.coord.radar2geo(inps.yx[0], inps.yx[1], print_msg=False)[0:2] except: inps.lalo = None ## figure settings # Flip up-down / left-right if inps.auto_flip: inps.flip_lr, inps.flip_ud = pp.auto_flip_direction(atr, print_msg=inps.print_msg) # Transparency - Alpha if not inps.transparency: # Auto adjust transparency value when showing shaded relief DEM if inps.dem_file and inps.disp_dem_shade: inps.transparency = 0.7 else: inps.transparency = 1.0 ## display unit ans wrap # if wrap_step == 2*np.pi (default value), set disp_unit_img = radian; # otherwise set disp_unit_img = disp_unit inps.disp_unit_img = inps.disp_unit if inps.wrap: inps.range2phase = -4. * np.pi / float(atr['WAVELENGTH']) if 'cm' == inps.disp_unit.split('/')[0]: inps.range2phase /= 100. elif 'mm' == inps.disp_unit.split('/')[0]: inps.range2phase /= 1000. elif 'm' == inps.disp_unit.split('/')[0]: inps.range2phase /= 1. else: raise ValueError('un-recognized display unit: {}'.format(inps.disp_unit)) if (inps.wrap_range[1] - inps.wrap_range[0]) == 2*np.pi: inps.disp_unit_img = 'radian' inps.vlim = inps.wrap_range inps.cbar_label = 'Displacement [{}]'.format(inps.disp_unit_img) ## fit a suite of time func to the time series inps.model, inps.num_param = ts2vel.read_inps2model(inps, date_list=inps.date_list) # dense TS for plotting inps.date_list_fit = ptime.get_date_range(inps.date_list[0], inps.date_list[-1]) inps.dates_fit = ptime.date_list2vector(inps.date_list_fit)[0] inps.G_fit = time_func.get_design_matrix4time_func( date_list=inps.date_list_fit, model=inps.model, seconds=inps.seconds) return inps, atr
def read_init_info(inps): # Time Series Info ts_file0 = inps.file[0] atr = readfile.read_attribute(ts_file0) inps.key = atr['FILE_TYPE'] if inps.key == 'timeseries': obj = timeseries(ts_file0) elif inps.key == 'giantTimeseries': obj = giantTimeseries(ts_file0) elif inps.key == 'HDFEOS': obj = HDFEOS(ts_file0) else: raise ValueError('input file is {}, not timeseries.'.format(inps.key)) obj.open(print_msg=inps.print_msg) if not inps.file_label: inps.file_label = [str(i) for i in list(range(len(inps.file)))] # default mask file if not inps.mask_file and 'masked' not in ts_file0: dir_name = os.path.dirname(ts_file0) if 'Y_FIRST' in atr.keys(): inps.mask_file = os.path.join(dir_name, 'geo_maskTempCoh.h5') else: inps.mask_file = os.path.join(dir_name, 'maskTempCoh.h5') if not os.path.isfile(inps.mask_file): inps.mask_file = None # date info inps.date_list = obj.dateList inps.num_date = len(inps.date_list) if inps.start_date: inps.date_list = [ i for i in inps.date_list if int(i) >= int(inps.start_date) ] if inps.end_date: inps.date_list = [ i for i in inps.date_list if int(i) <= int(inps.end_date) ] inps.num_date = len(inps.date_list) inps.dates, inps.yearList = ptime.date_list2vector(inps.date_list) (inps.ex_date_list, inps.ex_dates, inps.ex_flag) = read_exclude_date(inps.ex_date_list, inps.date_list) # initial display index #if atr['REF_DATE'] in inps.date_list: # inps.ref_idx = inps.date_list.index(atr['REF_DATE']) #else: # inps.ref_idx = 0 if inps.ref_date: inps.ref_idx = inps.date_list.index(inps.ref_date) else: inps.ref_idx = 3 if not inps.idx: if inps.ref_idx < inps.num_date / 2.: inps.idx = inps.num_date - 3 else: inps.idx = 3 # Display Unit (inps.disp_unit, inps.unit_fac) = pp.scale_data2disp_unit(metadata=atr, disp_unit=inps.disp_unit)[1:3] # Map info - coordinate unit inps.coord_unit = atr.get('Y_UNIT', 'degrees').lower() # Read Error List inps.ts_plot_func = plot_ts_scatter inps.error_ts = None inps.ex_error_ts = None if inps.error_file: # assign plot function inps.ts_plot_func = plot_ts_errorbar # read error file error_fc = np.loadtxt(inps.error_file, dtype=bytes).astype(str) inps.error_ts = error_fc[:, 1].astype(np.float) * inps.unit_fac # update error file with exlcude date if inps.ex_date_list: e_ts = inps.error_ts[:] inps.ex_error_ts = e_ts[inps.ex_flag == 0] inps.error_ts = e_ts[inps.ex_flag == 1] # Zero displacement for 1st acquisition if inps.zero_first: inps.zero_idx = min(0, np.min(np.where(inps.ex_flag)[0])) # default lookup table file if not inps.lookup_file: inps.lookup_file = ut.get_lookup_file('./inputs/geometryRadar.h5') inps.coord = ut.coordinate(atr, inps.lookup_file) # size and lalo info inps.pix_box, inps.geo_box = subset.subset_input_dict2box(vars(inps), atr) inps.pix_box = inps.coord.check_box_within_data_coverage(inps.pix_box) inps.geo_box = inps.coord.box_pixel2geo(inps.pix_box) data_box = (0, 0, int(atr['WIDTH']), int(atr['LENGTH'])) vprint('data coverage in y/x: ' + str(data_box)) vprint('subset coverage in y/x: ' + str(inps.pix_box)) vprint('data coverage in lat/lon: ' + str(inps.coord.box_pixel2geo(data_box))) vprint('subset coverage in lat/lon: ' + str(inps.geo_box)) vprint( '------------------------------------------------------------------------' ) # reference pixel if not inps.ref_lalo and 'REF_LAT' in atr.keys(): inps.ref_lalo = (float(atr['REF_LAT']), float(atr['REF_LON'])) if inps.ref_lalo: if inps.ref_lalo[1] > 180.: inps.ref_lalo[1] -= 360. inps.ref_yx = inps.coord.geo2radar(inps.ref_lalo[0], inps.ref_lalo[1], print_msg=False)[0:2] if not inps.ref_yx and 'REF_Y' in atr.keys(): inps.ref_yx = [int(atr['REF_Y']), int(atr['REF_X'])] # Initial Pixel Coord if inps.lalo: inps.yx = inps.coord.geo2radar(inps.lalo[0], inps.lalo[1], print_msg=False)[0:2] try: inps.lalo = inps.coord.radar2geo(inps.yx[0], inps.yx[1], print_msg=False)[0:2] except: inps.lalo = None # Flip up-down / left-right if inps.auto_flip: inps.flip_lr, inps.flip_ud = pp.auto_flip_direction( atr, print_msg=inps.print_msg) # Transparency - Alpha if not inps.transparency: # Auto adjust transparency value when showing shaded relief DEM if inps.dem_file and inps.disp_dem_shade: inps.transparency = 0.7 else: inps.transparency = 1.0 # display unit ans wrap # if wrap_step == 2*np.pi (default value), set disp_unit_img = radian; # otherwise set disp_unit_img = disp_unit inps.disp_unit_img = inps.disp_unit if inps.wrap: inps.range2phase = -4. * np.pi / float(atr['WAVELENGTH']) if 'cm' == inps.disp_unit.split('/')[0]: inps.range2phase /= 100. elif 'mm' == inps.disp_unit.split('/')[0]: inps.range2phase /= 1000. elif 'm' == inps.disp_unit.split('/')[0]: inps.range2phase /= 1. else: raise ValueError('un-recognized display unit: {}'.format( inps.disp_unit)) if (inps.wrap_range[1] - inps.wrap_range[0]) == 2 * np.pi: inps.disp_unit_img = 'radian' inps.vlim = inps.wrap_range inps.cbar_label = 'Displacement [{}]'.format(inps.disp_unit_img) return inps, atr
def diff_file(file1, file2, outFile=None, force=False): """Subtraction/difference of two input files""" if not outFile: fbase, fext = os.path.splitext(file1) if len(file2) > 1: raise ValueError( 'Output file name is needed for more than 2 files input.') outFile = '{}_diff_{}{}'.format( fbase, os.path.splitext(os.path.basename(file2[0]))[0], fext) print('{} - {} --> {}'.format(file1, file2, outFile)) # Read basic info atr1 = readfile.read_attribute(file1) k1 = atr1['FILE_TYPE'] atr2 = readfile.read_attribute(file2[0]) k2 = atr2['FILE_TYPE'] print('input files are: {} and {}'.format(k1, k2)) if k1 == 'timeseries': if k2 not in ['timeseries', 'giantTimeseries']: raise Exception( 'Input multiple dataset files are not the same file type!') if len(file2) > 1: raise Exception( ('Only 2 files substraction is supported for time-series file,' ' {} input.'.format(len(file2) + 1))) obj1 = timeseries(file1) obj1.open() if k2 == 'timeseries': obj2 = timeseries(file2[0]) unit_fac = 1. elif k2 == 'giantTimeseries': obj2 = giantTimeseries(file2[0]) unit_fac = 0.001 obj2.open() ref_date, ref_y, ref_x = _check_reference(obj1.metadata, obj2.metadata) # check dates shared by two timeseries files dateListShared = [i for i in obj1.dateList if i in obj2.dateList] dateShared = np.ones((obj1.numDate), dtype=np.bool_) if dateListShared != obj1.dateList: print('WARNING: {} does not contain all dates in {}'.format( file2, file1)) if force: dateExcluded = list(set(obj1.dateList) - set(dateListShared)) print( 'Continue and enforce the differencing for their shared dates only.' ) print( '\twith following dates are ignored for differencing:\n{}'. format(dateExcluded)) dateShared[np.array( [obj1.dateList.index(i) for i in dateExcluded])] = 0 else: raise Exception( 'To enforce the differencing anyway, use --force option.') # consider different reference_date/pixel data2 = readfile.read(file2[0], datasetName=dateListShared)[0] * unit_fac if ref_date: data2 -= np.tile(data2[dateListShared.index(ref_date), :, :], (data2.shape[0], 1, 1)) if ref_y and ref_x: data2 -= np.tile(data2[:, ref_y, ref_x].reshape(-1, 1, 1), (1, data2.shape[1], data2.shape[2])) data = obj1.read() mask = data == 0. data[dateShared] -= data2 data[mask] = 0. # Do not change zero phase value del data2 writefile.write(data, out_file=outFile, ref_file=file1) elif all(i == 'ifgramStack' for i in [k1, k2]): obj1 = ifgramStack(file1) obj1.open() obj2 = ifgramStack(file2[0]) obj2.open() dsNames = list(set(obj1.datasetNames) & set(obj2.datasetNames)) if len(dsNames) == 0: raise ValueError('no common dataset between two files!') dsName = [i for i in ifgramDatasetNames if i in dsNames][0] # read data print('reading {} from file {} ...'.format(dsName, file1)) data1 = readfile.read(file1, datasetName=dsName)[0] print('reading {} from file {} ...'.format(dsName, file2[0])) data2 = readfile.read(file2[0], datasetName=dsName)[0] # consider reference pixel if 'unwrapphase' in dsName.lower(): print('referencing to pixel ({},{}) ...'.format( obj1.refY, obj1.refX)) ref1 = data1[:, obj1.refY, obj1.refX] ref2 = data2[:, obj2.refY, obj2.refX] for i in range(data1.shape[0]): data1[i, :][data1[i, :] != 0.] -= ref1[i] data2[i, :][data2[i, :] != 0.] -= ref2[i] # operation and ignore zero values data1[data1 == 0] = np.nan data2[data2 == 0] = np.nan data = data1 - data2 del data1, data2 data[np.isnan(data)] = 0. # write to file dsDict = {} dsDict[dsName] = data writefile.write(dsDict, out_file=outFile, ref_file=file1) # Sing dataset file else: data1 = readfile.read(file1)[0] data = np.array(data1, data1.dtype) for fname in file2: data2 = readfile.read(fname)[0] data = np.array(data, dtype=np.float32) - np.array( data2, dtype=np.float32) data = np.array(data, data1.dtype) print('writing >>> ' + outFile) writefile.write(data, out_file=outFile, metadata=atr1) return outFile
def read_attribute(fname, datasetName=None, standardize=True, metafile_ext=None): """Read attributes of input file into a dictionary Parameters: fname : str, path/name of data file datasetName : str, name of dataset of interest, for file with multiple datasets e.g. unwrapPhase in ifgramStack.h5 coherence in ifgramStack.h5 height in geometryRadar.h5 latitude in geometryRadar.h5 ... standardize : bool, grab standardized metadata key name Returns: atr : dict, attributes dictionary """ fbase, fext = os.path.splitext(os.path.basename(fname)) fext = fext.lower() if not os.path.isfile(fname): msg = 'input file not existed: {}\n'.format(fname) msg += 'current directory: ' + os.getcwd() raise Exception(msg) # HDF5 files if fext in ['.h5', '.he5']: f = h5py.File(fname, 'r') g1_list = [i for i in f.keys() if isinstance(f[i], h5py.Group)] d1_list = [ i for i in f.keys() if isinstance(f[i], h5py.Dataset) and f[i].ndim >= 2 ] # FILE_TYPE - k py2_mintpy_stack_files = ['interferograms', 'coherence', 'wrapped'] #obsolete mintpy format if any(i in d1_list for i in ['unwrapPhase']): k = 'ifgramStack' elif any(i in d1_list for i in ['height', 'latitude', 'azimuthCoord']): k = 'geometry' elif any(i in g1_list + d1_list for i in ['timeseries', 'displacement']): k = 'timeseries' elif 'HDFEOS' in g1_list: k = 'HDFEOS' elif 'recons' in d1_list: k = 'giantTimeseries' elif any(i in d1_list for i in ['igram', 'figram']): k = 'giantIfgramStack' elif any(i in g1_list for i in py2_mintpy_stack_files): k = list(set(g1_list) & set(py2_mintpy_stack_files))[0] elif len(d1_list) > 0: k = d1_list[0] elif len(g1_list) > 0: k = g1_list[0] else: raise ValueError('unrecognized file type: ' + fname) # metadata dict if k == 'giantTimeseries': atr = giantTimeseries(fname).get_metadata() elif k == 'giantIfgramStack': atr = giantIfgramStack(fname).get_metadata() else: if len(f.attrs) > 0 and 'WIDTH' in f.attrs.keys(): atr = dict(f.attrs) else: # grab the list of attrs in HDF5 file global atr_list def get_hdf5_attrs(name, obj): global atr_list if len(obj.attrs) > 0 and 'WIDTH' in obj.attrs.keys(): atr_list.append(dict(obj.attrs)) atr_list = [] f.visititems(get_hdf5_attrs) # use the attrs with most items if atr_list: num_list = [len(i) for i in atr_list] atr = atr_list[np.argmax(num_list)] else: raise ValueError('No attribute WIDTH found in file:', fname) # decode string format for key, value in atr.items(): try: atr[key] = value.decode('utf8') except: atr[key] = value # attribute identified by MintPy # 1. FILE_TYPE atr['FILE_TYPE'] = str(k) # 2. DATA_TYPE ds = None if datasetName and datasetName in f.keys(): ds = f[datasetName] else: # get the 1st dataset global ds_list def get_hdf5_dataset(name, obj): global ds_list if isinstance(obj, h5py.Dataset) and obj.ndim >= 2: ds_list.append(obj) ds_list = [] f.visititems(get_hdf5_dataset) if ds_list: ds = ds_list[0] if ds is not None: atr['DATA_TYPE'] = str(ds.dtype) f.close() # 3. PROCESSOR if 'INSAR_PROCESSOR' in atr.keys(): atr['PROCESSOR'] = atr['INSAR_PROCESSOR'] if 'PROCESSOR' not in atr.keys(): atr['PROCESSOR'] = 'mintpy' else: # get metadata file basename metafile_base = fname # for SNAP BEAM-DIMAP format if fname.endswith('.img') and os.path.isfile( os.path.splitext(fname)[0] + '.hdr'): metafile_base = os.path.splitext(fname)[0] # get existing metadata file extensions metafile_exts = ['.rsc', '.xml', '.aux.xml', '.par', '.hdr'] if metafile_ext: metafile_exts = [ i for i in metafile_exts if i.endswith(metafile_ext) ] metafile_exts = [ i for i in metafile_exts if os.path.isfile(metafile_base + i) ] if len(metafile_exts) == 0: raise FileNotFoundError( 'No metadata file found for data file: {}'.format(fname)) atr = {} # PROCESSOR if any(i.endswith('.hdr') for i in metafile_exts) and fname.endswith('.img'): atr['PROCESSOR'] = 'snap' elif any(i.endswith('.xml') for i in metafile_exts): atr['PROCESSOR'] = 'isce' xml_exts = [i for i in metafile_exts if i.endswith('.xml')] if len(xml_exts) > 0: atr.update(read_isce_xml(metafile_base + xml_exts[0])) elif any(i.endswith('.par') for i in metafile_exts): atr['PROCESSOR'] = 'gamma' elif any(i.endswith('.rsc') for i in metafile_exts): if 'PROCESSOR' not in atr.keys(): atr['PROCESSOR'] = 'roipac' if 'PROCESSOR' not in atr.keys(): atr['PROCESSOR'] = 'mintpy' # Read metadata file and FILE_TYPE metafile0 = metafile_base + metafile_exts[0] while fext in ['.geo', '.rdr', '.full']: fbase, fext = os.path.splitext(fbase) if not fext: fext = fbase if metafile0.endswith('.rsc'): atr.update(read_roipac_rsc(metafile0)) if 'FILE_TYPE' not in atr.keys(): atr['FILE_TYPE'] = fext elif metafile0.endswith('.xml'): atr.update(read_isce_xml(metafile0)) if 'FILE_TYPE' not in atr.keys(): atr['FILE_TYPE'] = fext #atr.get('image_type', fext) elif metafile0.endswith('.par'): atr.update(read_gamma_par(metafile0)) atr['FILE_TYPE'] = fext elif metafile0.endswith('.hdr'): atr.update(read_envi_hdr(metafile0)) fbase = os.path.basename(fname).lower() if fbase.startswith('unw'): atr['FILE_TYPE'] = '.unw' elif fbase.startswith(('coh', 'cor')): atr['FILE_TYPE'] = '.cor' elif fbase.startswith('phase_ifg'): atr['FILE_TYPE'] = '.int' elif 'dem' in fbase: atr['FILE_TYPE'] = 'dem' else: atr['FILE_TYPE'] = atr['file type'] # UNIT k = atr['FILE_TYPE'].replace('.', '') if k == 'ifgramStack': if datasetName and datasetName in datasetUnitDict.keys(): atr['UNIT'] = datasetUnitDict[datasetName] else: atr['UNIT'] = 'radian' elif 'UNIT' not in atr.keys(): if datasetName and datasetName in datasetUnitDict.keys(): atr['UNIT'] = datasetUnitDict[datasetName] elif k in datasetUnitDict.keys(): atr['UNIT'] = datasetUnitDict[k] else: atr['UNIT'] = '1' # FILE_PATH atr['FILE_PATH'] = os.path.abspath(fname) if standardize: atr = standardize_metadata(atr) return atr
def get_slice_list(fname): """Get list of 2D slice existed in file (for display)""" fbase, fext = os.path.splitext(os.path.basename(fname)) fext = fext.lower() atr = read_attribute(fname) k = atr['FILE_TYPE'] global slice_list # HDF5 Files if fext in ['.h5', '.he5']: with h5py.File(fname, 'r') as f: d1_list = [i for i in f.keys() if isinstance(f[i], h5py.Dataset)] if k == 'timeseries' and k in d1_list: obj = timeseries(fname) obj.open(print_msg=False) slice_list = obj.sliceList elif k in ['geometry'] and k not in d1_list: obj = geometry(fname) obj.open(print_msg=False) slice_list = obj.sliceList elif k in ['ifgramStack']: obj = ifgramStack(fname) obj.open(print_msg=False) slice_list = obj.sliceList elif k in ['HDFEOS']: obj = HDFEOS(fname) obj.open(print_msg=False) slice_list = obj.sliceList elif k in ['giantTimeseries']: obj = giantTimeseries(fname) obj.open(print_msg=False) slice_list = obj.sliceList elif k in ['giantIfgramStack']: obj = giantIfgramStack(fname) obj.open(print_msg=False) slice_list = obj.sliceList else: ## Find slice by walking through the file structure length, width = int(atr['LENGTH']), int(atr['WIDTH']) def get_hdf5_2d_dataset(name, obj): global slice_list if isinstance(obj, h5py.Dataset) and obj.shape[-2:] == (length, width): if obj.ndim == 2: slice_list.append(name) else: warnings.warn( 'file has un-defined {}D dataset: {}'.format( obj.ndim, name)) slice_list = [] with h5py.File(fname, 'r') as f: f.visititems(get_hdf5_2d_dataset) # Binary Files else: if fext.lower() in ['.trans', '.utm_to_rdc']: slice_list = ['rangeCoord', 'azimuthCoord'] elif fbase.startswith('los'): slice_list = ['incidenceAngle', 'azimuthAngle'] elif atr.get('number_bands', '1') == '2' and 'unw' not in k: slice_list = ['band1', 'band2'] else: slice_list = [''] return slice_list
def diff_file(file1, file2, out_file=None, force=False, max_num_pixel=2e8): """calculate/write file1 - file2 Parameters: file1 - str, path of file1 file2 - list of str, path of file2(s) out_file - str, path of output file force - bool, overwrite existing output file max_num_pixel - float, maximum number of pixels for each block """ start_time = time.time() if not out_file: fbase, fext = os.path.splitext(file1) if len(file2) > 1: raise ValueError( 'Output file name is needed for more than 2 files input.') out_file = '{}_diff_{}{}'.format( fbase, os.path.splitext(os.path.basename(file2[0]))[0], fext) print('{} - {} --> {}'.format(file1, file2, out_file)) # Read basic info atr1 = readfile.read_attribute(file1) k1 = atr1['FILE_TYPE'] atr2 = readfile.read_attribute(file2[0]) k2 = atr2['FILE_TYPE'] print('input files are: {} and {}'.format(k1, k2)) if k1 == 'timeseries': if k2 not in ['timeseries', 'giantTimeseries']: raise Exception( 'Input multiple dataset files are not the same file type!') if len(file2) > 1: raise Exception( ('Only 2 files substraction is supported for time-series file,' ' {} input.'.format(len(file2) + 1))) atr1 = readfile.read_attribute(file1) atr2 = readfile.read_attribute(file2[0]) dateList1 = timeseries(file1).get_date_list() if k2 == 'timeseries': dateList2 = timeseries(file2[0]).get_date_list() unit_fac = 1. elif k2 == 'giantTimeseries': dateList2 = giantTimeseries(file2[0]).get_date_list() unit_fac = 0.001 # check reference point ref_date, ref_y, ref_x = check_reference(atr1, atr2) # check dates shared by two timeseries files dateListShared = [i for i in dateList1 if i in dateList2] dateShared = np.ones((len(dateList1)), dtype=np.bool_) if dateListShared != dateList1: print('WARNING: {} does not contain all dates in {}'.format( file2, file1)) if force: dateListEx = list(set(dateList1) - set(dateListShared)) print( 'Continue and enforce the differencing for their shared dates only.' ) print( '\twith following dates are ignored for differencing:\n{}'. format(dateListEx)) dateShared[np.array([dateList1.index(i) for i in dateListEx])] = 0 else: raise Exception( 'To enforce the differencing anyway, use --force option.') # instantiate the output file writefile.layout_hdf5(out_file, ref_file=file1) # block-by-block IO length, width = int(atr1['LENGTH']), int(atr1['WIDTH']) num_box = int(np.ceil(len(dateList1) * length * width / max_num_pixel)) box_list = cluster.split_box2sub_boxes(box=(0, 0, width, length), num_split=num_box, dimension='y', print_msg=True) if ref_y and ref_x: ref_box = (ref_x, ref_y, ref_x + 1, ref_y + 1) ref_val = readfile.read(file2[0], datasetName=dateListShared, box=ref_box)[0] * unit_fac for i, box in enumerate(box_list): if num_box > 1: print('\n------- processing patch {} out of {} --------------'. format(i + 1, num_box)) print('box: {}'.format(box)) # read data2 (consider different reference_date/pixel) print('read from file: {}'.format(file2[0])) data2 = readfile.read( file2[0], datasetName=dateListShared, box=box)[0] * unit_fac if ref_y and ref_x: print('* referencing data from {} to y/x: {}/{}'.format( os.path.basename(file2[0]), ref_y, ref_x)) data2 -= np.tile(ref_val.reshape(-1, 1, 1), (1, data2.shape[1], data2.shape[2])) if ref_date: print('* referencing data from {} to date: {}'.format( os.path.basename(file2[0]), ref_date)) ref_ind = dateListShared.index(ref_date) data2 -= np.tile(data2[ref_ind, :, :], (data2.shape[0], 1, 1)) # read data1 print('read from file: {}'.format(file1)) data = readfile.read(file1, box=box)[0] # apply differencing mask = data == 0. data[dateShared] -= data2 data[mask] = 0. # Do not change zero phase value del data2 # write the block block = [0, data.shape[0], box[1], box[3], box[0], box[2]] writefile.write_hdf5_block(out_file, data=data, datasetName=k1, block=block) elif all(i == 'ifgramStack' for i in [k1, k2]): obj1 = ifgramStack(file1) obj1.open() obj2 = ifgramStack(file2[0]) obj2.open() dsNames = list(set(obj1.datasetNames) & set(obj2.datasetNames)) if len(dsNames) == 0: raise ValueError('no common dataset between two files!') dsName = [i for i in ifgramDatasetNames if i in dsNames][0] # read data print('reading {} from file {} ...'.format(dsName, file1)) data1 = readfile.read(file1, datasetName=dsName)[0] print('reading {} from file {} ...'.format(dsName, file2[0])) data2 = readfile.read(file2[0], datasetName=dsName)[0] # consider reference pixel if 'unwrapphase' in dsName.lower(): print('referencing to pixel ({},{}) ...'.format( obj1.refY, obj1.refX)) ref1 = data1[:, obj1.refY, obj1.refX] ref2 = data2[:, obj2.refY, obj2.refX] for i in range(data1.shape[0]): data1[i, :][data1[i, :] != 0.] -= ref1[i] data2[i, :][data2[i, :] != 0.] -= ref2[i] # operation and ignore zero values data1[data1 == 0] = np.nan data2[data2 == 0] = np.nan data = data1 - data2 del data1, data2 data[np.isnan(data)] = 0. # write to file dsDict = {} dsDict[dsName] = data writefile.write(dsDict, out_file=out_file, ref_file=file1) # Sing dataset file else: data1 = readfile.read(file1)[0] data = np.array(data1, data1.dtype) for fname in file2: data2 = readfile.read(fname)[0] data = np.array(data, dtype=np.float32) - np.array( data2, dtype=np.float32) data = np.array(data, data1.dtype) print('writing >>> ' + out_file) writefile.write(data, out_file=out_file, metadata=atr1) m, s = divmod(time.time() - start_time, 60) print('time used: {:02.0f} mins {:02.1f} secs'.format(m, s)) return out_file
def read_attribute(fname, datasetName=None, standardize=True, metafile_ext=None): """Read attributes of input file into a dictionary Parameters: fname : str, path/name of data file datasetName : str, name of dataset of interest, for file with multiple datasets e.g. unwrapPhase in ifgramStack.h5 coherence in ifgramStack.h5 height in geometryRadar.h5 latitude in geometryRadar.h5 ... standardize : bool, grab standardized metadata key name Returns: atr : dict, attributes dictionary """ fbase, fext = os.path.splitext(os.path.basename(fname)) fext = fext.lower() if not os.path.isfile(fname): msg = 'input file not existed: {}\n'.format(fname) msg += 'current directory: '+os.getcwd() raise Exception(msg) # HDF5 files if fext in ['.h5', '.he5']: f = h5py.File(fname, 'r') g1_list = [i for i in f.keys() if isinstance(f[i], h5py.Group)] d1_list = [i for i in f.keys() if isinstance(f[i], h5py.Dataset) and f[i].ndim >= 2] # FILE_TYPE - k py2_mintpy_stack_files = ['interferograms', 'coherence', 'wrapped'] #obsolete mintpy format if any(i in d1_list for i in ['unwrapPhase']): k = 'ifgramStack' elif any(i in d1_list for i in ['height', 'latitude', 'azimuthCoord']): k = 'geometry' elif any(i in g1_list+d1_list for i in ['timeseries', 'displacement']): k = 'timeseries' elif 'HDFEOS' in g1_list: k = 'HDFEOS' elif 'recons' in d1_list: k = 'giantTimeseries' elif any(i in d1_list for i in ['igram', 'figram']): k = 'giantIfgramStack' elif any(i in g1_list for i in py2_mintpy_stack_files): k = list(set(g1_list) & set(py2_mintpy_stack_files))[0] elif len(d1_list) > 0: k = d1_list[0] elif len(g1_list) > 0: k = g1_list[0] else: raise ValueError('unrecognized file type: '+fname) # metadata dict if k == 'giantTimeseries': atr = giantTimeseries(fname).get_metadata() elif k == 'giantIfgramStack': atr = giantIfgramStack(fname).get_metadata() else: if len(f.attrs) > 0 and 'WIDTH' in f.attrs.keys(): atr = dict(f.attrs) else: # grab the list of attrs in HDF5 file global atr_list def get_hdf5_attrs(name, obj): global atr_list if len(obj.attrs) > 0 and 'WIDTH' in obj.attrs.keys(): atr_list.append(dict(obj.attrs)) atr_list = [] f.visititems(get_hdf5_attrs) # use the attrs with most items if atr_list: num_list = [len(i) for i in atr_list] atr = atr_list[np.argmax(num_list)] else: raise ValueError('No attribute WIDTH found in file:', fname) # decode string format for key, value in atr.items(): try: atr[key] = value.decode('utf8') except: atr[key] = value # attribute identified by MintPy # 1. FILE_TYPE atr['FILE_TYPE'] = str(k) # 2. DATA_TYPE ds = None if datasetName and datasetName in f.keys(): ds = f[datasetName] else: # get the 1st dataset global ds_list def get_hdf5_dataset(name, obj): global ds_list if isinstance(obj, h5py.Dataset) and obj.ndim >= 2: ds_list.append(obj) ds_list = [] f.visititems(get_hdf5_dataset) if ds_list: ds = ds_list[0] if ds is not None: atr['DATA_TYPE'] = str(ds.dtype) f.close() # 3. PROCESSOR if 'INSAR_PROCESSOR' in atr.keys(): atr['PROCESSOR'] = atr['INSAR_PROCESSOR'] if 'PROCESSOR' not in atr.keys(): atr['PROCESSOR'] = 'mintpy' else: # get existing metadata file extensions metafile_exts = ['.rsc', '.xml', '.aux.xml', '.par', '.hdr'] if metafile_ext: metafile_exts = [i for i in metafile_exts if i.endswith(metafile_ext)] metafile_exts = [i for i in metafile_exts if os.path.isfile(fname+i)] if len(metafile_exts) == 0: raise FileNotFoundError('No metadata file found for data file: {}'.format(fname)) atr = {} # PROCESSOR if any(i.endswith(('.xml', '.hdr')) for i in metafile_exts): atr['PROCESSOR'] = 'isce' xml_exts = [i for i in metafile_exts if i.endswith('.xml')] if len(xml_exts) > 0: atr.update(read_isce_xml(fname+xml_exts[0])) elif any(i.endswith('.par') for i in metafile_exts): atr['PROCESSOR'] = 'gamma' elif any(i.endswith('.rsc') for i in metafile_exts): if 'PROCESSOR' not in atr.keys(): atr['PROCESSOR'] = 'roipac' if 'PROCESSOR' not in atr.keys(): atr['PROCESSOR'] = 'mintpy' # Read metadata file and FILE_TYPE metafile0 = fname + metafile_exts[0] while fext in ['.geo', '.rdr', '.full']: fbase, fext = os.path.splitext(fbase) if not fext: fext = fbase if metafile0.endswith('.rsc'): atr.update(read_roipac_rsc(metafile0)) if 'FILE_TYPE' not in atr.keys(): atr['FILE_TYPE'] = fext elif metafile0.endswith('.xml'): atr.update(read_isce_xml(metafile0)) if 'FILE_TYPE' not in atr.keys(): atr['FILE_TYPE'] = fext #atr.get('image_type', fext) elif metafile0.endswith('.par'): atr.update(read_gamma_par(metafile0)) atr['FILE_TYPE'] = fext elif metafile0.endswith('.hdr'): atr.update(read_envi_hdr(metafile0)) atr['FILE_TYPE'] = atr['file type'] # UNIT k = atr['FILE_TYPE'].replace('.', '') if k == 'ifgramStack': if datasetName and datasetName in datasetUnitDict.keys(): atr['UNIT'] = datasetUnitDict[datasetName] else: atr['UNIT'] = 'radian' elif 'UNIT' not in atr.keys(): if datasetName and datasetName in datasetUnitDict.keys(): atr['UNIT'] = datasetUnitDict[datasetName] elif k in datasetUnitDict.keys(): atr['UNIT'] = datasetUnitDict[k] else: atr['UNIT'] = '1' # FILE_PATH atr['FILE_PATH'] = os.path.abspath(fname) if standardize: atr = standardize_metadata(atr) return atr
def get_slice_list(fname): """Get list of 2D slice existed in file (for display)""" fbase, fext = os.path.splitext(os.path.basename(fname)) fext = fext.lower() atr = read_attribute(fname) k = atr['FILE_TYPE'] global slice_list # HDF5 Files if fext in ['.h5', '.he5']: with h5py.File(fname, 'r') as f: d1_list = [i for i in f.keys() if isinstance(f[i], h5py.Dataset)] if k == 'timeseries' and k in d1_list: obj = timeseries(fname) obj.open(print_msg=False) slice_list = obj.sliceList elif k in ['geometry'] and k not in d1_list: obj = geometry(fname) obj.open(print_msg=False) slice_list = obj.sliceList elif k in ['ifgramStack']: obj = ifgramStack(fname) obj.open(print_msg=False) slice_list = obj.sliceList elif k in ['HDFEOS']: obj = HDFEOS(fname) obj.open(print_msg=False) slice_list = obj.sliceList elif k in ['giantTimeseries']: obj = giantTimeseries(fname) obj.open(print_msg=False) slice_list = obj.sliceList elif k in ['giantIfgramStack']: obj = giantIfgramStack(fname) obj.open(print_msg=False) slice_list = obj.sliceList else: ## Find slice by walking through the file structure length, width = int(atr['LENGTH']), int(atr['WIDTH']) def get_hdf5_2d_dataset(name, obj): global slice_list if isinstance(obj, h5py.Dataset) and obj.shape[-2:] == (length, width): if obj.ndim == 2: slice_list.append(name) else: warnings.warn('file has un-defined {}D dataset: {}'.format(obj.ndim, name)) slice_list = [] with h5py.File(fname, 'r') as f: f.visititems(get_hdf5_2d_dataset) # Binary Files else: if fext.lower() in ['.trans', '.utm_to_rdc']: slice_list = ['rangeCoord', 'azimuthCoord'] elif fbase.startswith('los'): slice_list = ['incidenceAngle', 'azimuthAngle'] elif atr.get('number_bands', '1') == '2' and 'unw' not in k: slice_list = ['band1', 'band2'] else: slice_list = [''] return slice_list
def diff_file(file1, file2, outFile=None, force=False): """Subtraction/difference of two input files""" if not outFile: fbase, fext = os.path.splitext(file1) if len(file2) > 1: raise ValueError('Output file name is needed for more than 2 files input.') outFile = '{}_diff_{}{}'.format(fbase, os.path.splitext(os.path.basename(file2[0]))[0], fext) print('{} - {} --> {}'.format(file1, file2, outFile)) # Read basic info atr1 = readfile.read_attribute(file1) k1 = atr1['FILE_TYPE'] atr2 = readfile.read_attribute(file2[0]) k2 = atr2['FILE_TYPE'] print('input files are: {} and {}'.format(k1, k2)) if k1 == 'timeseries': if k2 not in ['timeseries', 'giantTimeseries']: raise Exception('Input multiple dataset files are not the same file type!') if len(file2) > 1: raise Exception(('Only 2 files substraction is supported for time-series file,' ' {} input.'.format(len(file2)+1))) obj1 = timeseries(file1) obj1.open() if k2 == 'timeseries': obj2 = timeseries(file2[0]) unit_fac = 1. elif k2 == 'giantTimeseries': obj2 = giantTimeseries(file2[0]) unit_fac = 0.001 obj2.open() ref_date, ref_y, ref_x = _check_reference(obj1.metadata, obj2.metadata) # check dates shared by two timeseries files dateListShared = [i for i in obj1.dateList if i in obj2.dateList] dateShared = np.ones((obj1.numDate), dtype=np.bool_) if dateListShared != obj1.dateList: print('WARNING: {} does not contain all dates in {}'.format(file2, file1)) if force: dateExcluded = list(set(obj1.dateList) - set(dateListShared)) print('Continue and enforce the differencing for their shared dates only.') print('\twith following dates are ignored for differencing:\n{}'.format(dateExcluded)) dateShared[np.array([obj1.dateList.index(i) for i in dateExcluded])] = 0 else: raise Exception('To enforce the differencing anyway, use --force option.') # consider different reference_date/pixel data2 = readfile.read(file2[0], datasetName=dateListShared)[0] * unit_fac if ref_date: data2 -= np.tile(data2[obj2.dateList.index(ref_date), :, :], (data2.shape[0], 1, 1)) if ref_y and ref_x: data2 -= np.tile(data2[:, ref_y, ref_x].reshape(-1, 1, 1), (1, data2.shape[1], data2.shape[2])) data = obj1.read() mask = data == 0. data[dateShared] -= data2 data[mask] = 0. # Do not change zero phase value del data2 writefile.write(data, out_file=outFile, ref_file=file1) elif all(i == 'ifgramStack' for i in [k1, k2]): obj1 = ifgramStack(file1) obj1.open() obj2 = ifgramStack(file2[0]) obj2.open() dsNames = list(set(obj1.datasetNames) & set(obj2.datasetNames)) if len(dsNames) == 0: raise ValueError('no common dataset between two files!') dsName = [i for i in ifgramDatasetNames if i in dsNames][0] # read data print('reading {} from file {} ...'.format(dsName, file1)) data1 = readfile.read(file1, datasetName=dsName)[0] print('reading {} from file {} ...'.format(dsName, file2[0])) data2 = readfile.read(file2[0], datasetName=dsName)[0] # consider reference pixel if 'unwrapphase' in dsName.lower(): print('referencing to pixel ({},{}) ...'.format(obj1.refY, obj1.refX)) ref1 = data1[:, obj1.refY, obj1.refX] ref2 = data2[:, obj2.refY, obj2.refX] for i in range(data1.shape[0]): data1[i,:][data1[i, :] != 0.] -= ref1[i] data2[i,:][data2[i, :] != 0.] -= ref2[i] # operation and ignore zero values data1[data1 == 0] = np.nan data2[data2 == 0] = np.nan data = data1 - data2 del data1, data2 data[np.isnan(data)] = 0. # write to file dsDict = {} dsDict[dsName] = data writefile.write(dsDict, out_file=outFile, ref_file=file1) # Sing dataset file else: data1 = readfile.read(file1)[0] data = np.array(data1, data1.dtype) for fname in file2: data2 = readfile.read(fname)[0] data = np.array(data, dtype=np.float32) - np.array(data2, dtype=np.float32) data = np.array(data, data1.dtype) print('writing >>> '+outFile) writefile.write(data, out_file=outFile, metadata=atr1) return outFile