Source code for pyacs.gts.Gts


#from pyacs.gts.lib.offset import __fmt_date
"""Individual geodetic time series (Gts) class and helpers.

The Gts class holds NEU (or XYZ) time series with metadata. Key attributes:
data (2D: dec_year, N, E, U, S_N, S_E, S_U, S_NE, S_NU, S_EU), code, lon/lat/h,
X0,Y0,Z0,t0, data_xyz, outliers, offsets_*, velocity, annual, semi_annual, ifile, log, metadata.
Units: dates in decimal year, coordinates in m, phases in radians.
"""


###################################################################
[docs] def get_index_from_dates(dates,data,tol=0.25): ################################################################### """Return indices in data whose first column matches given dates within tolerance. Parameters ---------- dates : list of float Target dates in decimal year. data : numpy.ndarray 2D array with decimal dates in first column. tol : float, optional Date tolerance in days to consider a match. Default is 0.25. Returns ------- list Indices into data for each date (or [] if no match). """ # check argument dates if isinstance( dates , list ): if dates == [] : return( [] ) # check argument data if data is None: return( [] ) # import import numpy as np # sort dates - very important dates=sorted(dates) # tolerance in decimal year tolerance=tol/365.25 if len(data.shape)>1:data=data[:,0] index=0 lindex=[] for i in range(len(dates)): while data[index]<dates[i]+tolerance: if np.sqrt((data[index]-dates[i])**2)<tolerance: lindex.append(index) break index=index+1 if index > data.size - 1: break return(lindex)
################################################################### ## Init Gts ###################################################################
[docs] class Gts: def __init__ (self,code=None,\ lat=None,lon=None,h=None,\ X0=None,Y0=None,Z0=None, t0=None,\ data=None,\ data_xyz=None,data_corr_neu=None,data_corr_xyz=None,\ offsets_dates=[],offsets_values=None,\ outliers=[],\ annual=None,semi_annual=None,\ velocity=None,\ ifile=None, log=None, metadata=None): """Initialize a Gts (geodetic time series) instance. All arguments are optional and set as instance attributes (data, code, lon, lat, h, X0, Y0, Z0, t0, data_xyz, offsets_*, outliers, velocity, annual, semi_annual, ifile, log, metadata). """ self.code=code self.lat = lat self.lon = lon self.h = h self.X0=X0 self.Y0=Y0 self.Z0=Z0 self.t0=t0 self.data = data self.data_xyz = data_xyz self.data_corr_neu = data_corr_neu self.data_corr_xyz = data_corr_xyz self.outliers = outliers self.offsets_dates = offsets_dates self.offsets_values = offsets_values self.annual = annual self.semi_annual = semi_annual self.velocity = velocity self.ifile=ifile self.log=log self.metadata=metadata # Old attributes from Trong in case of post-seismic # self.earthquakes = earthquakes # self.post_seismics = post_seismics # self.rate_change = rate_change # self.H_conf = H_conf
[docs] @classmethod ################################################################### def read(cls, tsfile, fmt=None, verbose=False): ################################################################### """Read a time series from file (format auto-detected or set by fmt). Parameters ---------- tsfile : str Path to the time series file. fmt : str, optional Format name (e.g. 'pride', 'pride_pos', 'mb_file'). If None, formats are tried. verbose : bool, optional If True, print progress. Default is False. Returns ------- Gts or None Loaded time series or None on failure. """ # import import inspect # init ts = Gts() from pyacs.gts.lib.errors import GtsReadFileError # PRIDE POS if fmt is None or fmt == 'pride_pos': try: ts.read_pride_pos(tsfile=tsfile , verbose=verbose ) except: return None # PRIDE KINEMATICS if fmt is None or fmt == 'pride': try: ts.read_pride(tsfile=tsfile , verbose=verbose ) except: raise GtsReadFileError( inspect.stack()[0][3],__name__,tsfile ) return None # MB_FILE if fmt is None or fmt == 'mb_file': try: ts.read_mb_file(tsfile=tsfile , verbose=verbose ) except: raise GtsReadFileError( inspect.stack()[0][3],__name__,tsfile ) return None # TDP if fmt is None or fmt == 'tdp': try: ts.read_tdp(tsfile=tsfile , verbose=verbose ) except: raise GtsReadFileError( inspect.stack()[0][3],__name__,tsfile ) return None # KENV if fmt is None or fmt == 'kenv': try: ts.read_kenv(tsfile=tsfile , verbose=verbose ) except: raise GtsReadFileError( inspect.stack()[0][3],__name__,tsfile ) return None # CATS if fmt is None or fmt == 'cats': try: ts.read_cats(tsfile=tsfile , verbose=verbose ) except: raise GtsReadFileError( inspect.stack()[0][3],__name__,tsfile ) return None # POS FORMAT if fmt is None or fmt == 'pos': try: ts = ts.read_pos(tsfile=tsfile , verbose=verbose ) except: raise GtsReadFileError( inspect.stack()[0][3],__name__,tsfile ) return None # TRACK FORMAT if fmt is None or fmt == 'track': try: ts.read_track_neu(tsfile=tsfile , verbose=verbose ) except: raise GtsReadFileError( inspect.stack()[0][3],__name__,tsfile ) return None return( ts )
################################################################### ## METHODS IMPORT ################################################################### # DATES import pyacs.gts import pyacs.gts.lib import pyacs.gts.lib.gts_dates Gts.np_yyyy_mm_dd_hh_mm_ss_2_decyear=pyacs.gts.lib.gts_dates.np_yyyy_mm_dd_hh_mm_ss_2_decyear Gts.np_yyyy_mm_dd_hh_mm_ss_2_datetime=pyacs.gts.lib.gts_dates.np_yyyy_mm_dd_hh_mm_ss_2_datetime Gts.np_datetime_2_eq_time=pyacs.gts.lib.gts_dates.np_datetime_2_eq_time Gts.decyear2days=pyacs.gts.lib.gts_dates.decyear2days # FORMATS import pyacs.gts.lib.format.cats import pyacs.gts.lib.format.force_daily import pyacs.gts.lib.format.kenv import pyacs.gts.lib.format.mb_file import pyacs.gts.lib.format.pos import pyacs.gts.lib.format.pride import pyacs.gts.lib.format.tdp import pyacs.gts.lib.format.track import pyacs.gts.lib.format.get_unr import pyacs.gts.lib.format.get_unr_loading import pyacs.gts.lib.format.to_pandas_df import pyacs.gts.lib.format.series import pyacs.gts.lib.format.read_sol import pyacs.gts.lib.format.to_pytrf Gts.read_pos = pyacs.gts.lib.format.pos.read_pos Gts.read_sol = pyacs.gts.lib.format.read_sol.read_sol Gts.read_series = pyacs.gts.lib.format.series.read_series Gts.read_pride = pyacs.gts.lib.format.pride.read_pride Gts.read_pride_pos = pyacs.gts.lib.format.pride.read_pride_pos Gts.read_kenv = pyacs.gts.lib.format.kenv.read_kenv Gts.read_mb_file = pyacs.gts.lib.format.mb_file.read_mb_file Gts.read_tdp = pyacs.gts.lib.format.tdp.read_tdp Gts.read_cats_file = pyacs.gts.lib.format.cats.read_cats_file Gts.read_track_NEU = pyacs.gts.lib.format.track.read_track_NEU Gts.write_pos = pyacs.gts.lib.format.pos.write_pos Gts.write_mb_file = pyacs.gts.lib.format.mb_file.write_mb_file Gts.write_cats = pyacs.gts.lib.format.cats.write_cats Gts.force_daily = pyacs.gts.lib.format.force_daily.force_daily Gts.get_unr = pyacs.gts.lib.format.get_unr.get_unr Gts.get_unr_loading = pyacs.gts.lib.format.get_unr_loading.get_unr_loading Gts.to_pandas_df = pyacs.gts.lib.format.to_pandas_df.to_pandas_df Gts.to_pytrf = pyacs.gts.lib.format.to_pytrf.to_pytrf # PRIMITIVE import pyacs.gts.lib.primitive.cdata import pyacs.gts.lib.primitive.copy import pyacs.gts.lib.primitive.differentiate import pyacs.gts.lib.primitive.extract_periods import pyacs.gts.lib.primitive.exclude_periods import pyacs.gts.lib.primitive.extract_dates import pyacs.gts.lib.primitive.substract_ts import pyacs.gts.lib.primitive.substract_ts_daily import pyacs.gts.lib.primitive.add_offsets_dates import pyacs.gts.lib.primitive.remove_velocity import pyacs.gts.lib.primitive.set_zero_at_date import pyacs.gts.lib.primitive.decimate import pyacs.gts.lib.primitive.displacement import pyacs.gts.lib.primitive.add_obs import pyacs.gts.lib.primitive.add_obs_xyz import pyacs.gts.lib.primitive.xyz2neu import pyacs.gts.lib.primitive.neu2xyz import pyacs.gts.lib.primitive.reorder import pyacs.gts.lib.primitive.extract_ndates_before_date import pyacs.gts.lib.primitive.extract_ndates_after_date import pyacs.gts.lib.primitive.extract_ndates_around_date import pyacs.gts.lib.primitive.get_coseismic import pyacs.gts.lib.primitive.correct_duplicated_dates import pyacs.gts.lib.primitive.rotate import pyacs.gts.lib.primitive.insert_gts_data import pyacs.gts.lib.primitive.find_large_uncertainty import pyacs.gts.lib.primitive.split_gap import pyacs.gts.lib.primitive.interpolate import pyacs.gts.lib.primitive.extrapolate import pyacs.gts.lib.primitive.insert_ts import pyacs.gts.lib.primitive.n_obs import pyacs.gts.lib.primitive.get_coseismic_l1trend import pyacs.gts.lib.primitive.get_values_at_date import pyacs.gts.lib.primitive.split Gts.cdata = pyacs.gts.lib.primitive.cdata.cdata Gts.copy = pyacs.gts.lib.primitive.copy.copy Gts.differentiate = pyacs.gts.lib.primitive.differentiate.differentiate Gts.extract_periods = pyacs.gts.lib.primitive.extract_periods.extract_periods Gts.exclude_periods = pyacs.gts.lib.primitive.exclude_periods.exclude_periods Gts.extract_dates = pyacs.gts.lib.primitive.extract_dates.extract_dates Gts.substract_ts = pyacs.gts.lib.primitive.substract_ts.substract_ts Gts.substract_ts_daily = pyacs.gts.lib.primitive.substract_ts_daily.substract_ts_daily Gts.add_offsets_dates = pyacs.gts.lib.primitive.add_offsets_dates.add_offsets_dates Gts.remove_velocity = pyacs.gts.lib.primitive.remove_velocity.remove_velocity Gts.set_zero_at_date = pyacs.gts.lib.primitive.set_zero_at_date.set_zero_at_date Gts.decimate = pyacs.gts.lib.primitive.decimate.decimate Gts.displacement = pyacs.gts.lib.primitive.displacement.displacement Gts.add_obs = pyacs.gts.lib.primitive.add_obs.add_obs Gts.add_obs_xyz = pyacs.gts.lib.primitive.add_obs_xyz.add_obs_xyz Gts.xyz2neu = pyacs.gts.lib.primitive.xyz2neu.xyz2neu Gts.neu2xyz = pyacs.gts.lib.primitive.neu2xyz.neu2xyz Gts.reorder = pyacs.gts.lib.primitive.reorder.reorder Gts.extract_ndates_before_date = pyacs.gts.lib.primitive.extract_ndates_before_date.extract_ndates_before_date Gts.extract_ndates_after_date = pyacs.gts.lib.primitive.extract_ndates_after_date.extract_ndates_after_date Gts.extract_ndates_around_date = pyacs.gts.lib.primitive.extract_ndates_around_date.extract_ndates_around_date Gts.get_coseismic = pyacs.gts.lib.primitive.get_coseismic.get_coseismic Gts.correct_duplicated_dates = pyacs.gts.lib.primitive.correct_duplicated_dates.correct_duplicated_dates Gts.rotate = pyacs.gts.lib.primitive.rotate.rotate Gts.insert_gts_data = pyacs.gts.lib.primitive.insert_gts_data.insert_gts_data Gts.find_large_uncertainty = pyacs.gts.lib.primitive.find_large_uncertainty.find_large_uncertainty Gts.split_gap = pyacs.gts.lib.primitive.split_gap.split_gap Gts.interpolate = pyacs.gts.lib.primitive.interpolate.interpolate Gts.extrapolate = pyacs.gts.lib.primitive.extrapolate.extrapolate Gts.insert_ts = pyacs.gts.lib.primitive.insert_ts.insert_ts Gts.n_obs = pyacs.gts.lib.primitive.n_obs.n_obs Gts.get_coseismic_l1trend = pyacs.gts.lib.primitive.get_coseismic_l1trend.get_coseismic_l1trend Gts.get_values_at_date = pyacs.gts.lib.primitive.get_values_at_date.get_values_at_date Gts.split = pyacs.gts.lib.primitive.split.split # METADATA import pyacs.gts.lib.metadata Gts.read_lon_lat = pyacs.gts.lib.metadata.read_lon_lat Gts.save_velocity = pyacs.gts.lib.metadata.save_velocity Gts.save_offsets = pyacs.gts.lib.metadata.save_offsets Gts.read_eq_rename = pyacs.gts.lib.metadata.read_eq_rename Gts.save_eq_rename = pyacs.gts.lib.metadata.save_eq_rename Gts.save_apr = pyacs.gts.lib.metadata.save_apr Gts.make_dynamic_apr = pyacs.gts.lib.metadata.make_dynamic_apr Gts.read_offset_dates = pyacs.gts.lib.metadata.read_offset_dates Gts.info = pyacs.gts.lib.metadata.info # PLOT import pyacs.gts.lib.plot.plot ## plot Gts.plot = pyacs.gts.lib.plot.plot.plot # MODEL import pyacs.gts.lib.model.detrend import pyacs.gts.lib.model.detrend_annual import pyacs.gts.lib.model.detrend_seasonal import pyacs.gts.lib.model.remove_pole import pyacs.gts.lib.model.frame import pyacs.gts.lib.model.make_model import pyacs.gts.lib.model.mmodel import pyacs.gts.lib.model.detrend_median import pyacs.gts.lib.model.detrend_seasonal_median import pyacs.gts.lib.model.trajectory import pyacs.gts.lib.model.detrend_hectorp import pyacs.gts.lib.model.detrend_pytrf Gts.detrend = pyacs.gts.lib.model.detrend.detrend Gts.detrend_annual = pyacs.gts.lib.model.detrend_annual.detrend_annual Gts.detrend_seasonal = pyacs.gts.lib.model.detrend_seasonal.detrend_seasonal Gts.remove_pole = pyacs.gts.lib.model.remove_pole.remove_pole Gts.frame = pyacs.gts.lib.model.frame.frame Gts.make_model = pyacs.gts.lib.model.make_model.make_model Gts.mmodel = pyacs.gts.lib.model.mmodel.mmodel Gts.detrend_median = pyacs.gts.lib.model.detrend_median.detrend_median Gts.detrend_seasonal_median = pyacs.gts.lib.model.detrend_seasonal_median.detrend_seasonal_median Gts.trajectory = pyacs.gts.lib.model.trajectory.trajectory Gts.detrend_hectorp = pyacs.gts.lib.model.detrend_hectorp.detrend_hectorp Gts.detrend_pytrf = pyacs.gts.lib.model.detrend_pytrf.detrend_pytrf # OFFSET import pyacs.gts.lib.offset Gts.suspect_offsets = pyacs.gts.lib.offset.suspect_offsets Gts.suspect_offsets_mf = pyacs.gts.lib.offset.suspect_offsets_mf Gts.test_offset_significance = pyacs.gts.lib.offset.test_offset_significance Gts.find_time_offsets = pyacs.gts.lib.offset.find_time_offsets Gts.delete_small_offsets = pyacs.gts.lib.offset.delete_small_offsets #Gts.test_offsets_significance=pyacs.gts.lib.offset.test_offsets_significance Gts.test_offsets = pyacs.gts.lib.offset.test_offsets Gts.estimate_local_offset = pyacs.gts.lib.offset.estimate_local_offset Gts.apply_offsets = pyacs.gts.lib.offset.apply_offsets Gts.find_offsets = pyacs.gts.lib.offset.find_offsets Gts.local_offset_robust = pyacs.gts.lib.offset.local_offset_robust Gts.find_offsets_t_scan = pyacs.gts.lib.offset.find_offsets_t_scan Gts.find_offsets_ivel = pyacs.gts.lib.offset.find_offsets_ivel # OUTLIERS import pyacs.gts.lib.outliers import pyacs.gts.lib.outliers.find_l1trend import pyacs.gts.lib.outliers.find_outliers_percentage import pyacs.gts.lib.outliers.find_outliers_sliding_window import pyacs.gts.lib.outliers.find_outliers_vondrak import pyacs.gts.lib.outliers.remove_outliers import pyacs.gts.lib.outliers.find_outliers_around_date import pyacs.gts.lib.outliers.find_outliers_simple Gts.remove_outliers = pyacs.gts.lib.outliers.remove_outliers.remove_outliers Gts.find_outliers_percentage = pyacs.gts.lib.outliers.find_outliers_percentage.find_outliers_percentage Gts.find_outliers_simple = pyacs.gts.lib.outliers.find_outliers_simple.find_outliers_simple #Gts.find_outliers_and_offsets_through_differentiation = pyacs.gts.lib.outliers_old.find_outliers_and_offsets_through_differentiation #Gts.find_outliers_by_RMS_ts = pyacs.gts.lib.outliers_old.find_outliers_by_RMS_ts #Gts.find_outliers_by_residuals = pyacs.gts.lib.outliers_old.find_outliers_by_residuals Gts.find_outliers_sliding_window = pyacs.gts.lib.outliers.find_outliers_sliding_window.find_outliers_sliding_window Gts.find_outlier_around_date = pyacs.gts.lib.outliers.find_outliers_around_date.find_outliers_around_date Gts.find_outliers_vondrak = pyacs.gts.lib.outliers.find_outliers_vondrak.find_outliers_vondrak #Gts.find_outliers_l1trend = pyacs.gts.lib.outliers.find_l1trend.find_l1trend # NOISE import pyacs.gts.lib.noise Gts.realistic_sigma = pyacs.gts.lib.noise.realistic_sigma Gts.wrms = pyacs.gts.lib.noise.wrms Gts.sigma_vel_tsfit = pyacs.gts.lib.noise.sigma_vel_tsfit Gts.sigma_cats = pyacs.gts.lib.noise.sigma_cats Gts.add_vel_sigma = pyacs.gts.lib.noise.add_vel_sigma # FILTER import pyacs.gts.lib.filters.median import pyacs.gts.lib.filters.minimum_component import pyacs.gts.lib.filters.savitzky_golay import pyacs.gts.lib.filters.vondrak import pyacs.gts.lib.filters.wiener import pyacs.gts.lib.step_detect_edge_filter #import pyacs.gts.lib.filters.l1_trend import pyacs.gts.lib.filters.spline import pyacs.gts.lib.filters.smooth import pyacs.gts.lib.filters.disp2vel import pyacs.gts.lib.filters.edge_filter import pyacs.gts.lib.filters.ivel Gts.spline = pyacs.gts.lib.filters.spline.spline Gts.smooth = pyacs.gts.lib.filters.smooth.smooth Gts.median_filter = pyacs.gts.lib.filters.median.median_filter Gts.minimum_component = pyacs.gts.lib.filters.minimum_component.minimum_component Gts.savitzky_golay = pyacs.gts.lib.filters.savitzky_golay.savitzky_golay Gts.edge_filter = pyacs.gts.lib.filters.edge_filter.edge_filter Gts.vondrak = pyacs.gts.lib.filters.vondrak.vondrak Gts.wiener = pyacs.gts.lib.filters.wiener.wiener #Gts.l1_trend = pyacs.gts.lib.filters.l1_trend.l1_trend Gts.find_offsets_edge_filter = pyacs.gts.lib.step_detect_edge_filter.find_offsets_edge_filter Gts.disp2vel = pyacs.gts.lib.filters.disp2vel.disp2vel Gts.ivel = pyacs.gts.lib.filters.ivel.ivel #L1TREND IF TRENDFILTER IS INSTALLED try: from trendfilter import trend_filter from pyacs.gts.lib.l1trend import ( l1trendi, refine_l1trend, check_l1_trend, l1trend_to_breakpoints, clean_l1trend, simplify_l1trend, simplify_l1trend_with_fisher_test, l1trend_optimal_workflow, flag_outliers_using_l1trend, sum_l1_trend ) Gts.l1trend = l1trendi Gts.l1trendi = l1trendi Gts.refine_l1trend = refine_l1trend Gts.check_l1_trend = check_l1_trend Gts.l1trend_to_breakpoints = l1trend_to_breakpoints Gts.clean_l1trend = clean_l1trend Gts.simplify_l1trend = simplify_l1trend Gts.simplify_l1trend_with_fisher_test = simplify_l1trend_with_fisher_test Gts.l1trend_optimal_workflow = l1trend_optimal_workflow Gts.flag_outliers_using_l1trend = flag_outliers_using_l1trend Gts.sum_l1_trend = sum_l1_trend Gts.find_outliers_l1trend = pyacs.gts.lib.outliers.find_l1trend.find_l1trend except ModuleNotFoundError: print("Trendfilter is not installed. L1-trend analysis will not be available.") pass