예제 #1
0
def common_mode(self,
                lref=[],
                detrend_method='detrend_median',
                method='median',
                center=True,
                verbose=True):
    ###################################################################
    """
    calculates a common mode
    
    :param lref: liste of site codes used to calculate the common mode
    :param detrend_method: 'detrend_median' or 'detrend', method used to detrend the reference sites time series
    :param method: method to calculate the common mode 'median' or 'mean'
    
    :return: a Sgts instance with filtered time series. This new instance has a _CMM time series for the common mode
    :note: time series are assumed to be daily time series
    """

    # import
    import pyacs.gts.lib.tensor_ts.sgts2obs_tensor
    import pyacs.gts.lib.tensor_ts.obs_tensor2sgts
    import numpy as np
    from pyacs.gts.Gts import Gts
    import pyacs.lib.astrotime as at
    import pyacs.lib.coordinates as coor

    # detrend for the reference sites
    if detrend_method is not None:
        dts = self.gts(detrend_method)
    else:
        dts = self.copy()

    # creates an obs_tensor instance from the detrend time series

    T_OBS_RAW, np_names_t_obs, np_obs_date_s = pyacs.gts.lib.tensor_ts.sgts2obs_tensor.sgts2tensor(
        dts, rounding='day', verbose=verbose)

    # center time series
    if center:
        T_OBS_RAW[:, :,
                  0] = T_OBS_RAW[:, :, 0] - np.nanmedian(T_OBS_RAW[:, :, 0],
                                                         axis=0)
        T_OBS_RAW[:, :,
                  1] = T_OBS_RAW[:, :, 1] - np.nanmedian(T_OBS_RAW[:, :, 1],
                                                         axis=0)
        T_OBS_RAW[:, :,
                  2] = T_OBS_RAW[:, :, 2] - np.nanmedian(T_OBS_RAW[:, :, 2],
                                                         axis=0)

    # get the index of sites used for the common mode

    lidx_code = []

    for i in np.arange(np_names_t_obs.shape[0]):
        if np_names_t_obs[i] in lref:
            lidx_code.append(i)

    np_idx_code = np.array(sorted(lidx_code))

    # compute common mode

    T_OBS_RAW_REF = T_OBS_RAW[:, np_idx_code, :]

    if method == 'median':
        CMM = np.nanmedian(T_OBS_RAW_REF, axis=1)
    if method == 'mean':
        CMM = np.nanmean(T_OBS_RAW_REF, axis=1)

    # creates an obs_tensor instance from the original time series

    T_OBS_RAW, np_names_t_obs, np_obs_date_s = pyacs.gts.lib.tensor_ts.sgts2obs_tensor.sgts2tensor(
        self, rounding='day', verbose=verbose)

    # remove common mode

    T_OBS_RAW[:, :, 0] = T_OBS_RAW[:, :, 0] - CMM[:, 0].reshape(-1, 1)
    T_OBS_RAW[:, :, 1] = T_OBS_RAW[:, :, 1] - CMM[:, 1].reshape(-1, 1)
    T_OBS_RAW[:, :, 2] = T_OBS_RAW[:, :, 2] - CMM[:, 2].reshape(-1, 1)

    # dispersion of the common mode
    # TBD

    # converts obs_tensor object to Sgts

    filtered_sgts = pyacs.gts.lib.tensor_ts.obs_tensor2sgts.obs_tensor2sgts(
        T_OBS_RAW, np_names_t_obs, np_obs_date_s, verbose=verbose)

    # adds the common mode time series

    cmm_ts = Gts(code='_CMM')

    # get index where values are Nan

    lindex = np.where(np.isfinite(CMM[:, 0]))[0]

    data = np.zeros((lindex.shape[0], 10))

    # obs_tensor is ENU and Gts are NEU
    data[:, 2] = CMM[lindex, 0] * 1E-3
    data[:, 1] = CMM[lindex, 1] * 1E-3
    data[:, 3] = CMM[lindex, 2] * 1E-3
    # set std as 1 mm to avoid singularity
    data[:, 4] = 1E-3
    data[:, 5] = 1E-3
    data[:, 6] = 1E-3

    data[:,
         0] = at.datetime2decyear(at.seconds2datetime(np_obs_date_s[lindex]))

    # populate X0, Y0, Z0, lon, lat, he
    X_cmm = 0
    Y_cmm = 0
    Z_cmm = 0
    for code in filtered_sgts.lcode():
        filtered_sgts.__dict__[code].X0 = self.__dict__[code].X0
        filtered_sgts.__dict__[code].Y0 = self.__dict__[code].Y0
        filtered_sgts.__dict__[code].Z0 = self.__dict__[code].Z0

        filtered_sgts.__dict__[code].lon = self.__dict__[code].lon
        filtered_sgts.__dict__[code].lat = self.__dict__[code].lat
        filtered_sgts.__dict__[code].h = self.__dict__[code].h

        X_cmm = X_cmm + self.__dict__[code].X0
        Y_cmm = Y_cmm + self.__dict__[code].Y0
        Z_cmm = Z_cmm + self.__dict__[code].Z0

    cmm_ts.data = data

    X_cmm = X_cmm / len(filtered_sgts.lcode())
    Y_cmm = Y_cmm / len(filtered_sgts.lcode())
    Z_cmm = Z_cmm / len(filtered_sgts.lcode())

    cmm_ts.X0 = X_cmm / len(filtered_sgts.lcode())
    cmm_ts.Y0 = Y_cmm / len(filtered_sgts.lcode())
    cmm_ts.Z0 = Z_cmm / len(filtered_sgts.lcode())

    (cmm_ts.lon, cmm_ts.lat, cmm_ts.h) = coor.xyz2geo(cmm_ts.X0,
                                                      cmm_ts.Y0,
                                                      cmm_ts.Z0,
                                                      unit='dec_deg')

    filtered_sgts.append(cmm_ts)

    return filtered_sgts
nps = InSAR.shape[0]
#nps = 10

RESULTS = np.zeros((nps,14))

# fills longitudes and latitudes
RESULTS[:,0] = InSAR[:nps,0]
RESULTS[:,1] = InSAR[:nps,1]

for i in np.arange(nps):

    print("-- # %05d / %05d %03d %%" % (i,nps,int(i/nps*100.)) )
    
    # initialize a ts
    ts=Gts()
    ts.data =  np.zeros( (np_dec_year.shape[0],10) )
    
    ts.data[:,0] = np_dec_year
    ts.data[:,1] = InSAR[i,2:20]
    ts.data[:,2] = InSAR[i,2:20]
    ts.data[:,3] = InSAR[i,2:20]
    ts.data[:,4] = 1.
    ts.data[:,5] = 1.
    ts.data[:,6] = 1.

    # Full ts L2 norm
    dts = ts.detrend()
    vel = dts.velocity
    wrms = dts.wrms()
    RESULTS[i,2] = vel[0]
    RESULTS[i,3] = wrms[0]