def dxdy(self, method='SG', deg=3, win=5, doEdges=True, fs_tap=5, **kwargs): '''Calculate second horizontal derivative with various methods. ''' if method.upper() == 'SG': output = transforms.savgol_deriv(self.data, self.cellsize, direction='dxdy', deg=deg, win=win, doEdges=doEdges) elif method.upper() == 'FS': output = transforms.fs_deriv(self.data, self.cellsize, direction='dxdy', tap=fs_tap) elif method.lower() == 'fourier': output = transforms.fourier_transform(self.data, self.cellsize, trans='dxdy', **kwargs) else: raise ValueError( 'Method {} has not been recognised.'.format(method)) return Grid(output, self.transform, name=self.name + '_dxdy')
def hgm(self, method='SG', deg=3, win=5, doEdges=True, fs_tap=5, **kwargs): '''Calculate the horizontal gradient magnitude with various methods. ''' if method.upper() == 'SG': dx1 = transforms.savgol_deriv(self.data, self.cellsize, direction='dx', deg=deg, win=win, doEdges=doEdges) dy1 = transforms.savgol_deriv(self.data, self.cellsize, direction='dy', deg=deg, win=win, doEdges=doEdges) elif method.upper() == 'FS': dx1 = transforms.fs_deriv(self.data, self.cellsize, direction='dx', tap=fs_tap) dy1 = transforms.fs_deriv(self.data, self.cellsize, direction='dy', tap=fs_tap) elif method.lower() == 'fourier': dx1 = transforms.fourier_transform(self.data, self.cellsize, trans='dx', order=1, **kwargs) dy1 = transforms.fourier_transform(self.data, self.cellsize, trans='dy', order=1, **kwargs) else: raise ValueError( 'Method {} has not been recognised.'.format(method)) return Grid(np.sqrt(dx1 * dx1 + dy1 * dy1), self.transform, name=self.name + '_hgm')
def vi(self, method='fourier', order=1, eps=1e-6, **kwargs): '''Calculate the vertical integral. ''' if method.lower() == 'fourier': output = transforms.fourier_transform(self.data, self.cellsize, trans='vi', order=order, eps=eps, **kwargs) else: raise ValueError( 'Method {} has not been recognised.'.format(method)) return Grid(output, self.transform, name='{}_vi{}'.format(self.name, order))
def up(self, z=500, **kwargs): '''Upward continuation. The calculation is done in the frequency domain. Parameters ---------- z: float Amount of upward continuation. In practice, this is the value to add to the observation height (same units as the cell size). **kwargs are passed to the Fourier transform. ''' output = transforms.fourier_transform(self.data, self.cellsize, trans='upcont', z=z, **kwargs) return Grid(output, self.transform, name=self.name + '_UC{}'.format(z))
def dz(self, method='fourier', order=1, **kwargs): '''Calculate the vertical derivative with various methods. ''' if method.lower() == 'fourier': output = transforms.fourier_transform(self.data, self.cellsize, trans='dz', order=order, **kwargs) elif method.lower() == 'isvd': dz_grid = self.isvd(method='SG', order=order, **kwargs) output = dz_grid.data else: raise ValueError( 'Method {} has not been recognised.'.format(method)) return Grid(output, self.transform, name='{}_dz{}'.format(self.name, order))
def hp_filter_uc(self, z=5000, **kwargs): '''Apply a high-pass filter by subtracting an upward continued version of the data. Parameters ---------- z: float Amount of upward continuation. The larger the value, the larger the part of the signal that is passed through the filter. Use a small value to increase the effect of the filter. **kwargs are passed to the Fourier transform. ''' upCont1 = transforms.fourier_transform(self.data, self.cellsize, trans='upcont', z=z, **kwargs) output = self.data - upCont1 return Grid(output, self.transform, name=self.name + '_HPUC{}'.format(z))
def lw(self, method='SG', dz_method='isvd', deg=4, win=5, doEdges=True, fs_tap=5, **kwargs): '''Calculate the local wavenumber with various methods. ''' # vertical derivative if dz_method.lower() == 'isvd': dz_grid = self.isvd(method=method, order=1, deg=deg, win=win, doEdges=doEdges, fs_tap=fs_tap) dzdz_grid = self.isvd(method=method, order=2, deg=deg, win=win, doEdges=doEdges, fs_tap=fs_tap) else: dz_grid = self.dz(method='fourier', order=1) dzdz_grid = self.dz(method='fourier', order=2) # horizontal derivatives if method.upper() == 'SG': dx1 = transforms.savgol_deriv(self.data, self.cellsize, direction='dx', deg=deg, win=win, doEdges=doEdges) dy1 = transforms.savgol_deriv(self.data, self.cellsize, direction='dy', deg=deg, win=win, doEdges=doEdges) dxdz1 = transforms.savgol_deriv(dz_grid.data, self.cellsize, direction='dx', deg=deg, win=win, doEdges=doEdges) dydz1 = transforms.savgol_deriv(dz_grid.data, self.cellsize, direction='dy', deg=deg, win=win, doEdges=doEdges) elif method.upper() == 'FS': dx1 = transforms.fs_deriv(self.data, self.cellsize, direction='dx', tap=fs_tap) dy1 = transforms.fs_deriv(self.data, self.cellsize, direction='dy', tap=fs_tap) dxdz1 = transforms.fs_deriv(dz_grid.data, self.cellsize, direction='dx', tap=fs_tap) dydz1 = transforms.fs_deriv(dz_grid.data, self.cellsize, direction='dy', tap=fs_tap) elif method.lower() == 'fourier': dx1 = transforms.fourier_transform(self.data, self.cellsize, trans='dx', order=1, **kwargs) dy1 = transforms.fourier_transform(self.data, self.cellsize, trans='dy', order=1, **kwargs) dxdz1 = transforms.fourier_transform(dz_grid.data, self.cellsize, trans='dx', order=1, **kwargs) dydz1 = transforms.fourier_transform(dz_grid.data, self.cellsize, trans='dy', order=1, **kwargs) else: raise ValueError( 'Method {} has not been recognised.'.format(method)) # calculate local wavenumber output = ((dxdz1 * dx1 + dydz1 * dy1 + dzdz_grid.data * dz_grid.data) / (dx1 * dx1 + dy1 * dy1 + dz_grid.data * dz_grid.data)) return Grid(output, self.transform, name=self.name + '_LW')