import scipy.interpolate
import scipy.spatial.distance
import numpy as np
import random
import geostochpy as slgen
[docs]
def obtain_border(matrix):
    border = []
    
    # Obtener la primera fila
    border.extend(matrix[0])
    # Obtener la Ășltima columna (sin incluir la primera fila y la Ășltima fila)
    border.extend(fila[-1] for fila in matrix[1:-1])
    # Obtener la Ășltima fila en orden inverso
    border.extend(reversed(matrix[-1]))
    # Obtener la primera columna (sin incluir la primera y la Ășltima fila)
    border.extend(fila[0] for fila in reversed(matrix[1:-1]))
    return border 
[docs]
def corr2_coeff(A, B):
    # Rowwise mean of input arrays & subtract from input arrays themeselves
    A_mA = A - A.mean(1)[:, None]
    B_mB = B - B.mean(1)[:, None]
    # Sum of squares across rows
    ssA = (A_mA**2).sum(1)
    ssB = (B_mB**2).sum(1)
    # Finally get corr coeff
    return np.dot(A_mA, B_mB.T) / np.sqrt(np.dot(ssA[:, None],ssB[None])) 
[docs]
def depthfilter(Slip,depth,prctile=10):
    flag=True
    q=np.percentile(Slip.flat,prctile)
    idx=np.argwhere(depth>=55000)
    if len(idx)>0:
        for i,j in idx:
            if Slip[i,j]>=q:
                flag=False
                return flag
    return flag 
[docs]
def couplingfilter(X_grid,Y_grid,Slip,couplingfilename,lonfosa,latfosa):
    coupling=np.genfromtxt('../auxiliar/'+couplingfilename,delimiter='\t')
    # erasing nans for interpolation
    mask = np.isnan(coupling).any(axis=1)
    coupling_sorted=coupling[~mask]
    #
    [X,Y]=np.meshgrid(np.unique(coupling_sorted[:,0]),np.unique(coupling_sorted[:,1]))
    interp_coupling=scipy.interpolate.LinearNDInterpolator(list(zip(coupling_sorted[:,0],coupling_sorted[:,1])),coupling_sorted[:,-1],fill_value=0)
    Coupling_interpolated=interp_coupling(X_grid,Y_grid)
    #slgen.plot_slip(X_grid,Y_grid,lonfosa,latfosa,corr2D,cmap="hot_r")
    return Slip 
[docs]
def physical_filter(Slip,lats,depth,profmin,profmax,latmin,latmax):
    flag=True
    idx=np.argmax(Slip)
    lat=lats.flatten()[idx]
    prof=depth.flatten()[idx]
    if (profmin<=prof<=profmax) and (latmin<=lat<=latmax):
        return flag
    else:
        return False 
[docs]
def depth_max_slip(Slip,depth,prof_range):
    flag=True
    return flag