From d0c62a08fa8f867d7f1e1e475feec4926a85b655 Mon Sep 17 00:00:00 2001 From: "Per.Andreas.Brodtkorb" Date: Tue, 16 Mar 2010 12:51:11 +0000 Subject: [PATCH] Small bugfixes --- pywafo/.project | 2 +- pywafo/.pydevproject | 2 +- pywafo/setup.py | 5 +- pywafo/src/Wafo.egg-info/PKG-INFO | 170 ++--- pywafo/src/Wafo.egg-info/top_level.txt | 4 - pywafo/src/wafo/c_library.pyd | Bin 45056 -> 58077 bytes pywafo/src/wafo/integrate.py | 2 +- pywafo/src/wafo/interpolate.py | 2 +- pywafo/src/wafo/kdetools.py | 20 +- pywafo/src/wafo/misc.py | 6 +- pywafo/src/wafo/objects.py | 711 +++++++++---------- pywafo/src/wafo/source/c_codes/build_all.py | 4 +- pywafo/src/wafo/source/c_codes/c_library.pyd | Bin 45056 -> 58077 bytes pywafo/src/wafo/spectrum/core.py | 26 +- pywafo/src/wafo/transform/core.py | 11 +- pywafo/src/wafo/transform/models.py | 2 +- 16 files changed, 484 insertions(+), 483 deletions(-) diff --git a/pywafo/.project b/pywafo/.project index 0059e2b..c92b2cb 100644 --- a/pywafo/.project +++ b/pywafo/.project @@ -1,6 +1,6 @@ - PYWAFO + google_pywafo diff --git a/pywafo/.pydevproject b/pywafo/.pydevproject index d39e1b8..4884fb8 100644 --- a/pywafo/.pydevproject +++ b/pywafo/.pydevproject @@ -3,7 +3,7 @@ -/PYWAFO/src +/google_pywafo/src python 2.6 Default diff --git a/pywafo/setup.py b/pywafo/setup.py index de669e3..0c288aa 100644 --- a/pywafo/setup.py +++ b/pywafo/setup.py @@ -17,6 +17,7 @@ python setup.py sdist bdist_wininst upload --show-response import os, sys sys.argv.append("develop") +#sys.argv.append("install") DISTUTILS_DEBUG = True pkg_name = 'wafo' root_dir = os.path.join('src',pkg_name) @@ -44,7 +45,9 @@ testscripts = [os.path.join(subtst, f) for subtst in subtests f.endswith('.old') or f.endswith('.bak'))] datadir = 'data' datafiles = [os.path.join(datadir, f) for f in os.listdir(os.path.join(root_dir, datadir)) - if not (f.endswith('.py') or f.endswith('test') )] + if not (f.startswith('.') or f.endswith('~') or + f.endswith('.old') or f.endswith('.bak') or + f.endswith('.py') or f.endswith('test') )] libs = [f for f in os.listdir(os.path.join(root_dir)) if f.endswith('.pyd') ] packagedata = testscripts + datafiles + libs #['c_library.pyd'] #,'disufq1.c','diffsumfunq.pyd','diffsumfunq.pyf','findrfc.c','rfc.pyd','rfc.pyf'] diff --git a/pywafo/src/Wafo.egg-info/PKG-INFO b/pywafo/src/Wafo.egg-info/PKG-INFO index b1d5172..74427fd 100644 --- a/pywafo/src/Wafo.egg-info/PKG-INFO +++ b/pywafo/src/Wafo.egg-info/PKG-INFO @@ -1,92 +1,92 @@ Metadata-Version: 1.0 -Name: WAFO +Name: wafo Version: 0.11 -Summary: -WAFO -===== - WAFO is a toolbox Python routines for statistical analysis and simulation of random waves and random loads. - WAFO is freely redistributable software, see WAFO licence, cf. the GNU General Public License (GPL) and - contain tools for: - -Fatigue Analysis ----------------- --Fatigue life prediction for random loads --Theoretical density of rainflow cycles - -Sea modelling -------------- --Simulation of linear and non-linear Gaussian waves --Estimation of seamodels (spectrums) --Joint wave height, wave steepness, wave period distributions - -Statistics ------------- --Extreme value analysis --Kernel density estimation --Hidden markov models - - WAFO consists of several modules with short descriptions below. - The modules SPECTRUM, COVARIANCE, TRANSFORM, WAVEMODELS, and MULTIDIM are - mainly for oceanographic applications. - The modules CYCLES, MARKOV, and DAMAGE are mainly for fatigue problems. - The contents file for each module is shown by typing 'help module-name' - Type 'help fatigue' for a presentation of all routines related to fatigue. - - The paths to the modules are initiated by the function 'initwafo'. - - ONEDIM - Data analysis of time series. Example: extraction of - turning points, estimation of spectrum and covariance function. - Estimation transformation used in transformed Gaussian model. - COVARIANCE - Computation of spectral functions, linear - and non-linear time series simulation. - SPECTRUM - Computation of spectral moments and covariance functions, linear - and non-linear time series simulation. - Ex: common spectra implemented, directional spectra, - bandwidth measures, exact distributions for wave characteristics. - TRANSFORM - Modelling with linear or transformed Gaussian waves. Ex: - - WAVEMODELS - Models for distributions of wave characteristics found in - the literature. Ex: parametric models for breaking - limited wave heights. - MULTIDIM - Multi-dimensional time series analysis. (Under construction) - CYCLES - Cycle counting, discretization, and crossings, calculation of - damage. Simulation of discrete Markov chains, switching Markov - chains, harmonic oscillator. Ex: Rainflow cycles and matrix, - discretization of loads. Damage of a rainflow count or - matrix, damage matrix, S-N plot. - MARKOV - Routines for Markov loads, switching Markov loads, and - their connection to rainflow cycles. - DAMAGE - Calculation of damage. Ex: Damage of a rainflow count or - matrix, damage matrix, S-N plot. - SIMTOOLS - Simulation of random processes. Ex: spectral simulation, - simulation of discrete Markov chains, switching Markov - chains, harmonic oscillator - STATISTICS - Statistical tools and extreme-value distributions. - Ex: generation of random numbers, estimation of parameters, - evaluation of pdf and cdf - KDETOOLS - Kernel-density estimation. - MISC - Miscellaneous routines. Ex: numerical integration, smoothing - spline, binomial coefficient, water density. - WDEMOS - WAFO demos. - DOCS - Documentation of toolbox, definitions. An overview is given - in the routine wafomenu. - DATA - Measurements from marine applications. - PAPERS - Commands that generate figures in selected scientific - publications. - SOURCE - Fortran and C files. Information on compilation. - EXEC - Executable files (cf. SOURCE), pre-compiled for Solaris, - Alpha-Dec or Windows. - - WAFO homepage: - On the WAFO home page you will find: - - The WAFO Tutorial - - New versions of WAFO to download. - - Reported bugs. - - List of publications related to WAFO. - +Summary: UNKNOWN Home-page: http://www.maths.lth.se/matstat/wafo/ Author: WAFO-group Author-email: wafo@maths.lth.se License: GPL -Description: UNKNOWN +Description: + WAFO + ===== + WAFO is a toolbox Python routines for statistical analysis and simulation of random waves and random loads. + WAFO is freely redistributable software, see WAFO licence, cf. the GNU General Public License (GPL) and + contain tools for: + + Fatigue Analysis + ---------------- + -Fatigue life prediction for random loads + -Theoretical density of rainflow cycles + + Sea modelling + ------------- + -Simulation of linear and non-linear Gaussian waves + -Estimation of seamodels (spectrums) + -Joint wave height, wave steepness, wave period distributions + + Statistics + ------------ + -Extreme value analysis + -Kernel density estimation + -Hidden markov models + + WAFO consists of several modules with short descriptions below. + The modules SPECTRUM, COVARIANCE, TRANSFORM, WAVEMODELS, and MULTIDIM are + mainly for oceanographic applications. + The modules CYCLES, MARKOV, and DAMAGE are mainly for fatigue problems. + The contents file for each module is shown by typing 'help module-name' + Type 'help fatigue' for a presentation of all routines related to fatigue. + + The paths to the modules are initiated by the function 'initwafo'. + + ONEDIM - Data analysis of time series. Example: extraction of + turning points, estimation of spectrum and covariance function. + Estimation transformation used in transformed Gaussian model. + COVARIANCE - Computation of spectral functions, linear + and non-linear time series simulation. + SPECTRUM - Computation of spectral moments and covariance functions, linear + and non-linear time series simulation. + Ex: common spectra implemented, directional spectra, + bandwidth measures, exact distributions for wave characteristics. + TRANSFORM - Modelling with linear or transformed Gaussian waves. Ex: + + WAVEMODELS - Models for distributions of wave characteristics found in + the literature. Ex: parametric models for breaking + limited wave heights. + MULTIDIM - Multi-dimensional time series analysis. (Under construction) + CYCLES - Cycle counting, discretization, and crossings, calculation of + damage. Simulation of discrete Markov chains, switching Markov + chains, harmonic oscillator. Ex: Rainflow cycles and matrix, + discretization of loads. Damage of a rainflow count or + matrix, damage matrix, S-N plot. + MARKOV - Routines for Markov loads, switching Markov loads, and + their connection to rainflow cycles. + DAMAGE - Calculation of damage. Ex: Damage of a rainflow count or + matrix, damage matrix, S-N plot. + SIMTOOLS - Simulation of random processes. Ex: spectral simulation, + simulation of discrete Markov chains, switching Markov + chains, harmonic oscillator + STATISTICS - Statistical tools and extreme-value distributions. + Ex: generation of random numbers, estimation of parameters, + evaluation of pdf and cdf + KDETOOLS - Kernel-density estimation. + MISC - Miscellaneous routines. Ex: numerical integration, smoothing + spline, binomial coefficient, water density. + WDEMOS - WAFO demos. + DOCS - Documentation of toolbox, definitions. An overview is given + in the routine wafomenu. + DATA - Measurements from marine applications. + PAPERS - Commands that generate figures in selected scientific + publications. + SOURCE - Fortran and C files. Information on compilation. + EXEC - Executable files (cf. SOURCE), pre-compiled for Solaris, + Alpha-Dec or Windows. + + WAFO homepage: + On the WAFO home page you will find: + - The WAFO Tutorial + - New versions of WAFO to download. + - Reported bugs. + - List of publications related to WAFO. + Platform: UNKNOWN diff --git a/pywafo/src/Wafo.egg-info/top_level.txt b/pywafo/src/Wafo.egg-info/top_level.txt index 151ea7e..71345e3 100644 --- a/pywafo/src/Wafo.egg-info/top_level.txt +++ b/pywafo/src/Wafo.egg-info/top_level.txt @@ -1,5 +1 @@ -wafo\spectrum -wafo\covariance wafo -wafo\data -wafo\transform diff --git a/pywafo/src/wafo/c_library.pyd b/pywafo/src/wafo/c_library.pyd index 9e014dd008953a72d4f1e93488a97655d6629b13..933ba8e35efc136abe4091e9531d1cf991b45ba9 100644 GIT binary patch literal 58077 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 U+@Yu=`g2$=DsC4+h+vriKdB?|X8-^I literal 45056 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 self.n: # there are more points than data, so loop over data for i in range(self.n): - diff = self.dataset[:,i,newaxis] - points - tdiff = dot(self.inv_cov, diff) - energy = sum(diff*tdiff,axis=0)/2.0 - result += exp(-energy) + diff = self.dataset[:,i, np.newaxis] - points + tdiff = np.dot(self.inv_cov, diff) + energy = np.sum(diff*tdiff,axis=0)/2.0 + result += np.exp(-energy) else: # loop over points for i in range(m): - diff = self.dataset - points[:,i,newaxis] - tdiff = dot(self.inv_cov, diff) + diff = self.dataset - points[:,i,np.newaxis] + tdiff = np.dot(self.inv_cov, diff) energy = sum(diff*tdiff,axis=0)/2.0 - result[i] = sum(exp(-energy),axis=0) + result[i] = np.sum(np.exp(-energy),axis=0) result /= self._norm_factor diff --git a/pywafo/src/wafo/misc.py b/pywafo/src/wafo/misc.py index e854e60..e53e16e 100644 --- a/pywafo/src/wafo/misc.py +++ b/pywafo/src/wafo/misc.py @@ -1563,7 +1563,7 @@ def meshgrid(*xi, ** kwargs): return broadcast_arrays(*output) -def ndgrid(*args, ** kwargs): +def ndgrid(*args, **kwargs): """ Same as calling meshgrid with indexing='ij' (see meshgrid for documentation). @@ -1666,7 +1666,7 @@ def trangood(x, f, min_n=None, min_x=None, max_x=None, max_n=inf): return xo, fo -def tranproc(x, f, x0, * xi): +def tranproc(x, f, x0, *xi): """ Transforms process X and up to four derivatives using the transformation f. @@ -1779,7 +1779,7 @@ def tranproc(x, f, x0, * xi): y.append(y4) if N > 4: warnings.warn('Transformation of derivatives of order>4 not supported.') - return y #0,y1,y2,y3,y4 + return y #y0,y1,y2,y3,y4 def test_common_shape(): diff --git a/pywafo/src/wafo/objects.py b/pywafo/src/wafo/objects.py index 9883db4..f0dd6e3 100644 --- a/pywafo/src/wafo/objects.py +++ b/pywafo/src/wafo/objects.py @@ -13,12 +13,16 @@ from __future__ import division +from wafo.transform.core import TrData +from scipy.interpolate.interpolate import interp1d +from scipy.integrate.quadrature import cumtrapz +from wafo.interpolate import SmoothSpline import warnings import numpy as np -from numpy import (inf, pi, zeros, ones, sqrt, where, log, exp, sin, arcsin, mod, #@UnresolvedImport +from numpy import (inf, pi, zeros, ones, sqrt, where, log, exp, sin, arcsin, mod, finfo, interp, #@UnresolvedImport newaxis, linspace, arange, sort, all, abs, linspace, vstack, hstack, atleast_1d, #@UnresolvedImport - polyfit, r_, nonzero, cumsum, ravel, size, isnan, nan, floor, ceil, diff, array) #@UnresolvedImport + polyfit, r_, nonzero, cumsum, ravel, size, isnan, nan, floor, ceil, diff, array) #@UnresolvedImport from numpy.fft import fft from numpy.random import randn from scipy.integrate import trapz @@ -26,10 +30,11 @@ from pylab import stineman_interp from matplotlib.mlab import psd import scipy.signal -from scipy.special import erf -from wafo.misc import (nextpow2, findtp, findtc, findcross, sub_dict_select, - ecross, JITImport) +from scipy.special import erf, ndtri + +from wafo.misc import (nextpow2, findtp, findtc, findcross, sub_dict_select, + ecross, JITImport, DotDict) from wafodata import WafoData from plotbackend import plotbackend import matplotlib @@ -37,8 +42,8 @@ matplotlib.interactive(True) _wafocov = JITImport('wafo.covariance') _wafospec = JITImport('wafo.spectrum') -__all__ = ['TimeSeries','LevelCrossings','CyclePairs','TurningPoints', - 'sensortypeid','sensortype'] +__all__ = ['TimeSeries', 'LevelCrossings', 'CyclePairs', 'TurningPoints', + 'sensortypeid', 'sensortype'] @@ -54,33 +59,33 @@ class LevelCrossings(WafoData): crossing levels ''' - def __init__(self,*args,**kwds): - super(LevelCrossings, self).__init__(*args,**kwds) + def __init__(self, *args, **kwds): + super(LevelCrossings, self).__init__(*args, **kwds) self.labels.title = 'Level crossing spectrum' self.labels.xlab = 'Levels' self.labels.ylab = 'Count' - self.stdev = kwds.get('stdev',None) - self.mean = kwds.get('mean',None) + self.stdev = kwds.get('stdev', None) + self.mean = kwds.get('mean', None) self.setplotter(plotmethod='step') icmax = self.data.argmax() if self.data != None: if self.stdev is None or self.mean is None: - logcros = where(self.data==0.0, inf, -log(self.data)) + logcros = where(self.data == 0.0, inf, -log(self.data)) logcmin = logcros[icmax] - logcros = sqrt(2*abs(logcros-logcmin)) - logcros[0:icmax+1] = 2*logcros[icmax]-logcros[0:icmax+1] - p = polyfit(self.args[10:-9], logcros[10:-9],1) #least square fit + logcros = sqrt(2 * abs(logcros - logcmin)) + logcros[0:icmax + 1] = 2 * logcros[icmax] - logcros[0:icmax + 1] + p = polyfit(self.args[10:-9], logcros[10:-9], 1) #least square fit if self.stdev is None: - self.stdev = 1.0/p[0] #estimated standard deviation of x + self.stdev = 1.0 / p[0] #estimated standard deviation of x if self.mean is None: - self.mean = -p[1]/p[0] #self.args[icmax] + self.mean = -p[1] / p[0] #self.args[icmax] cmax = self.data[icmax] - x = (self.args-self.mean)/self.stdev - y = cmax*exp(-x**2/2.0) - self.children = [WafoData(y,self.args)] + x = (self.args - self.mean) / self.stdev + y = cmax * exp(-x ** 2 / 2.0) + self.children = [WafoData(y, self.args)] - def sim(self,ns,alpha): + def sim(self, ns, alpha): """ Simulates process with given irregularity factor and crossing spectrum @@ -129,66 +134,71 @@ class LevelCrossings(WafoData): """ # TODO % add a good example - f = linspace(0,0.49999,1000) - rho_st = 2.*sin(f*pi)**2-1. - tmp = alpha*arcsin(sqrt((1.+rho_st)/2)) - tmp = sin(tmp)**2 - a2 = (tmp-rho_st)/(1-tmp) - y = vstack((a2+rho_st,1-a2)).min(axis=0) + f = linspace(0, 0.49999, 1000) + rho_st = 2. * sin(f * pi) ** 2 - 1. + tmp = alpha * arcsin(sqrt((1. + rho_st) / 2)) + tmp = sin(tmp) ** 2 + a2 = (tmp - rho_st) / (1 - tmp) + y = vstack((a2 + rho_st, 1 - a2)).min(axis=0) maxidx = y.argmax() #[maximum,maxidx]=max(y) rho_st = rho_st[maxidx] a2 = a2[maxidx] - a1 = 2.*rho_st+a2-1. + a1 = 2. * rho_st + a2 - 1. r0 = 1. - r1 = -a1/(1.+a2) - r2 = (a1**2-a2-a2**2)/(1+a2) - sigma2 = r0+a1*r1+a2*r2 + r1 = -a1 / (1. + a2) + r2 = (a1 ** 2 - a2 - a2 ** 2) / (1 + a2) + sigma2 = r0 + a1 * r1 + a2 * r2 #randn = np.random.randn - e = randn(ns)*sqrt(sigma2) + e = randn(ns) * sqrt(sigma2) e[:1] = 0.0 L0 = randn(1) - L0 = vstack((L0,r1*L0+sqrt(1-r2**2)*randn(1))) + L0 = vstack((L0, r1 * L0 + sqrt(1 - r2 ** 2) * randn(1))) #%Simulate the process, starting in L0 lfilter = scipy.signal.lfilter - L = lfilter(1,[1, a1, a2],e,lfilter([1, a1, a2],1,L0)) + L = lfilter(1, [1, a1, a2], e, lfilter([1, a1, a2], 1, L0)) epsilon = 1.01 - min_L = min(L) - max_L = max(L) - maxi = max(abs(r_[min_L, max_L]))*epsilon - mini = -maxi - - u = linspace(mini,maxi,101) - G = (1+erf(u/sqrt(2)))/2 - G = G*(1-G) - - x = linspace(0,r1,100) - factor1 = 1./sqrt(1-x**2) - factor2 = 1./(1+x) + min_L = min(L) + max_L = max(L) + maxi = max(abs(r_[min_L, max_L])) * epsilon + mini = -maxi + + u = linspace(mini, maxi, 101) + G = (1 + erf(u / sqrt(2))) / 2 + G = G * (1 - G) + + x = linspace(0, r1, 100) + factor1 = 1. / sqrt(1 - x ** 2) + factor2 = 1. / (1 + x) integral = zeros(u.shape, dtype=float) for i in range(len(integral)): - y = factor1*exp(-u[i]*u[i]*factor2) - integral[i] = trapz(x,y) + y = factor1 * exp(-u[i] * u[i] * factor2) + integral[i] = trapz(x, y) #end - G = G-integral/(2*pi) - G = G/max(G) + G = G - integral / (2 * pi) + G = G / max(G) - Z = ((u>=0)*2-1)*sqrt(-2*log(G)) + Z = ((u >= 0) * 2 - 1) * sqrt(-2 * log(G)) -## sumcr = trapz(lc(:,1),lc(:,2)) -## lc(:,2) = lc(:,2)/sumcr -## mcr = trapz(lc(:,1),lc(:,1).*lc(:,2)) -## scr = trapz(lc(:,1),lc(:,1).^2.*lc(:,2)) -## scr = sqrt(scr-mcr^2) -## g = lc2tr(lc,mcr,scr) -## -## f = [u u] -## f(:,2) = tranproc(Z,fliplr(g)) -## -## process = tranproc(L,f) -## process = [(1:length(process)) process] + sumcr = trapz(self.data, self.args) + lc = self.data / sumcr + lc1 = self.args + mcr = trapz(lc1 * lc, lc1) + scr = trapz(lc1 ** 2 * lc, lc1) + scr = sqrt(scr - mcr ** 2) + + lc2 = LevelCrossings(lc, lc1, mean=mcr, stdev=scr) + + g = lc2.trdata() + + f = [u, u] + f = g.dat2gauss(Z) + G = TrData(f, u) + + process = G.dat2gauss(L) + return np.vstack((arange(len(process)), process)).T ## ## ## %Check the result without reference to getrfc: @@ -223,37 +233,41 @@ class LevelCrossings(WafoData): non-Gaussian process, X, by Y = g(X). Parameters - ---------- - options = structure with the fields: - csm, gsm - defines the smoothing of the crossing intensity and the - transformation g. Valid values must be - 0<=csm,gsm<=1. (default csm = 0.9 gsm=0.05) - Smaller values gives smoother functions. - param - vector which defines the region of variation of the data X. - (default [-5 5 513]). - - monitor monitor development of estimation - linextrap - 0 use a regular smoothing spline - 1 use a smoothing spline with a constraint on the ends to - ensure linear extrapolation outside the range of the data. - (default) - cvar - Variances for the crossing intensity. (default 1) - gvar - Variances for the empirical transformation, g. (default 1) - ne - Number of extremes (maxima & minima) to remove from the - estimation of the transformation. This makes the - estimation more robust against outliers. (default 7) - Ntr - Maximum length of empirical crossing intensity. - The empirical crossing intensity is interpolated - linearly before smoothing if the length exceeds Ntr. - A reasonable NTR will significantly speed up the - estimation for long time series without loosing any - accuracy. NTR should be chosen greater than - PARAM(3). (default 1000) + ---------- + mean, sigma : real scalars + mean and standard deviation of the process + **options : + csm, gsm : real scalars + defines the smoothing of the crossing intensity and the transformation g. + Valid values must be 0<=csm,gsm<=1. (default csm = 0.9 gsm=0.05) + Smaller values gives smoother functions. + param : + vector which defines the region of variation of the data X. + (default [-5 5 513]). + monitor : bool + if true monitor development of estimation + linextrap : bool + if true use a smoothing spline with a constraint on the ends to + ensure linear extrapolation outside the range of the data. (default) + otherwise use a regular smoothing spline + cvar, gvar : real scalars + Variances for the crossing intensity and the empirical transformation, g. (default 1) + ne : scalar integer + Number of extremes (maxima & minima) to remove from the estimation + of the transformation. This makes the estimation more robust against + outliers. (default 7) + ntr : scalar integer + Maximum length of empirical crossing intensity. The empirical + crossing intensity is interpolated linearly before smoothing if the + length exceeds ntr. A reasonable NTR will significantly speed up the + estimation for long time series without loosing any accuracy. + NTR should be chosen greater than PARAM(3). (default 1000) + Returns ------- gs, ge : TrData objects smoothed and empirical estimate of the transformation g. - ma,sa = mean and standard deviation of the process + Notes ----- @@ -268,15 +282,21 @@ class LevelCrossings(WafoData): Example ------- - Hm0 = 7 - S = jonswap([],Hm0); g=ochitr([],[Hm0/4]); - S.tr = g; S.tr(:,2)=g(:,2)*Hm0/4; - xs = spec2sdat(S,2^13); - lc = dat2lc(xs) - g0 = lc2tr2(lc,0,Hm0/4,'plot','iter'); % Monitor the development - g1 = lc2tr2(lc,0,Hm0/4,troptset('gvar', .5 )); % Equal weight on all points - g2 = lc2tr2(lc,0,Hm0/4,'gvar', [3.5 .5 3.5]); % Less weight on the ends - hold on, trplot(g1,g) % Check the fit + >>> import wafo.spectrum.models as sm + >>> import wafo.transform.models as tm + >>> Hs = 7.0 + >>> Sj = sm.Jonswap(Hm0=Hs) + >>> S = Sj.tospecdata() #Make spectrum object from numerical values + >>> S.tr = tm.TrOchi(mean=0, skew=sk, kurt=0, sigma=Hs/4, ysigma=Hs/4) + >>> xs = S.sim(ns=2**13) + >>> ts = mat2timeseries(xs) + >>> tp = ts.turning_points() + >>> mm = tp.cycle_pairs() + >>> lc = mm.level_crossings() + >>> g0, gemp = lc.trdata(monitor=True) # Monitor the development + >>> g1, gemp = lc.trdata(gvar=0.5 ) # Equal weight on all points + >>> g2, gemp = lc.trdata(gvar=[3.5, 0.5, 3.5]) # Less weight on the ends + hold on, trplot(g1,g) # Check the fit trplot(g2) See also troptset, dat2tr, trplot, findcross, smooth @@ -298,138 +318,108 @@ class LevelCrossings(WafoData): # by pab 29.12.2000 # based on lc2tr, but the inversion is faster. # by IR and PJ - pass + if mean is None: + mean = self.mean + if sigma is None: + sigma = self.stdev -# opt = troptset('chkder','on','plotflag','off','csm',.9,'gsm',.05,.... -# 'param',[-5 5 513],'delay',2,'linextrap','on','ntr',1000,'ne',7,'cvar',1,'gvar',1); -# # If just 'defaults' passed in, return the default options in g -# if nargin==1 && nargout <= 1 && isequal(cross,'defaults') -# g = opt; -# return -# end -# error(nargchk(3,inf,nargin)) -# if nargin>=4 , opt = troptset(opt,varargin{:}); end -# csm2 = opt.gsm; -# param = opt.param; -# ptime = opt.delay; -# Ne = opt.ne; -# switch opt.chkder; -# case 'off', chkder = 0; -# case 'on', chkder = 1; -# otherwise, chkder = opt.chkder; -# end -# switch opt.linextrap; -# case 'off', def = 0; -# case 'on', def = 1; -# otherwise, def = opt.linextrap; -# end -# switch opt.plotflag -# case {'none','off'}, plotflag = 0; -# case 'final', plotflag = 1; -# case 'iter', plotflag = 2; -# otherwise, plotflag = opt.plotflag; -# end -# ncr = length(cross); -# if ncr>opt.ntr && opt.ntr>0, -# x0 = linspace(cross(1+Ne,1),cross(end-Ne,1),opt.ntr)'; -# cros = [ x0,interp1q(cross(:,1),cross(:,2),x0)]; -# Ne = 0; -# Ner = opt.ne; -# ncr = opt.ntr; -# else -# Ner = 0; -# cros=cross; -# end -# -# ng = length(opt.gvar); -# if ng==1 -# gvar = opt.gvar(ones(ncr,1)); -# else -# gvar = interp1(linspace(0,1,ng)',opt.gvar(:),linspace(0,1,ncr)','*linear'); -# end -# ng = length(opt.cvar); -# if ng==1 -# cvar = opt.cvar(ones(ncr,1)); -# else -# cvar = interp1(linspace(0,1,ng)',opt.cvar(:),linspace(0,1,ncr)','*linear'); -# end -# -# g = zeros(param(3),2); -# -# uu = levels(param); -# -# g(:,1) = sa*uu' + ma; -# -# g2 = cros; -# -# if Ner>0, # Compute correction factors -# cor1 = trapz(cross(1:Ner+1,1),cross(1:Ner+1,2)); -# cor2 = trapz(cross(end-Ner-1:end,1),cross(end-Ner-1:end,2)); -# else -# cor1 = 0; -# cor2 = 0; -# end -# cros(:,2) = cumtrapz(cros(:,1),cros(:,2))+cor1; -# cros(:,2) = (cros(:,2)+.5)/(cros(end,2) + cor2 +1); -# cros(:,1) = (cros(:,1)-ma)/sa; -# -# # find the mode -# [tmp,imin]= min(abs(cros(:,2)-.15)); -# [tmp,imax]= min(abs(cros(:,2)-.85)); -# inde = imin:imax; -# tmp = smooth(cros(inde,1),g2(inde,2),opt.csm,cros(inde,1),def,cvar(inde)); -# -# [tmp imax] = max(tmp); -# u0 = cros(inde(imax),1); -# #u0 = interp1q(cros(:,2),cros(:,1),.5) -# -# -# cros(:,2) = invnorm(cros(:,2),-u0,1); -# -# g2(:,2) = cros(:,2); -# # NB! the smooth function does not always extrapolate well outside the edges -# # causing poor estimate of g -# # We may alleviate this problem by: forcing the extrapolation -# # to be linear outside the edges or choosing a lower value for csm2. -# -# inds = 1+Ne:ncr-Ne;# indices to points we are smoothing over -# scros2 = smooth(cros(inds,1),cros(inds,2),csm2,uu,def,gvar(inds)); -# -# g(:,2) = scros2';#*sa; #multiply with stdev -# -# if chkder~=0 -# for ix = 1:5 -# dy = diff(g(:,2)); -# if any(dy<=0) -# warning('WAFO:LCTR2','The empirical crossing spectrum is not sufficiently smoothed.') -# disp(' The estimated transfer function, g, is not ') -# disp(' a strictly increasing function.') -# dy(dy>0)=eps; -# gvar = -([dy;0]+[0;dy])/2+eps; -# g(:,2) = smooth(g(:,1),g(:,2),1,g(:,1),def,ix*gvar); -# else -# break -# end -# end -# end -# if 0, #either -# test = sqrt((param(2)-param(1))/(param(3)-1)*sum((uu-scros2).^2)); -# else # or -# #test=sqrt(simpson(uu,(uu-scros2).^2)); -# # or -# test=sqrt(trapz(uu,(uu-scros2).^2)); -# end -# -# -# if plotflag>0, -# trplot(g ,g2,ma,sa) -# #legend(['Smoothed (T=' num2str(test) ')'],'g(u)=u','Not smoothed',0) -# #ylabel('Transfer function g(u)') -# #xlabel('Crossing level u') -# -# if plotflag>1,pause(ptime),end -# end - + opt = DotDict(chkder=True, plotflag=False, csm=0.9, gsm=.05, + param=(-5, 5, 513), delay=2, lin_extrap=True, ntr=1000, ne=7, cvar=1, gvar=1) + # If just 'defaults' passed in, return the default options in g + + opt.update(options) + param = opt.param + Ne = opt.ne + + ncr = len(self.data) + if ncr > opt.ntr and opt.ntr > 0: + x0 = linspace(self.args[Ne], self.args[-1 - Ne], opt.ntr) + lc1, lc2 = x0, interp(x0, self.args, self.data) + Ne = 0 + Ner = opt.ne + ncr = opt.ntr + else: + Ner = 0 + lc1, lc2 = self.args, self.data + ng = len(opt.gvar) + if ng == 1: + gvar = opt.gvar * ones(ncr) + else: + gvar = interp1d(linspace(0, 1, ng) , opt.gvar, kind='linear')( linspace(0, 1, ncr)) + + ng = len(opt.cvar) + if ng == 1: + cvar = opt.cvar * ones(ncr) + else: + cvar = interp1d(linspace(0, 1, ng), opt.cvar, kind='linear')( linspace(0, 1, ncr)) + + + + uu = linspace(*param) + + g1 = sigma * uu + mean + + g22 = lc2.copy() + + if Ner > 0: # Compute correction factors + cor1 = trapz(lc2[0:Ner + 1], lc1[0:Ner + 1]) + cor2 = trapz(lc2[-Ner - 1::], lc1[-Ner - 1::]) + else: + cor1 = 0 + cor2 = 0 + + + lc22 = cumtrapz(lc2, lc1) + cor1 + lc22 = (lc22 + 0.5) / (lc22[-1] + cor2 + 1) + lc11 = (lc1 - mean) / sigma + + # find the mode + imin = abs(lc22 - 0.15).argmin() + imax = abs(lc22 - 0.85).argmin() + + inde = slice(imin, imax + 1) + lc222 = SmoothSpline(lc11[inde], g22[inde], opt.csm, opt.lin_extrap, cvar[inde])(lc11[inde]) + + #tmp = smooth(cros(inde,1),g2(inde,2),opt.csm,cros(inde,1),def,cvar(inde)); + + imax = lc222.argmax() + u0 = lc22[inde][imax] + #u0 = interp1q(cros(:,2),cros(:,1),.5) + + + lc22 = ndtri(lc22)-u0 #invnorm(lc22, -u0, 1); + + g2 = TrData(lc22.copy(), lc1.copy(), mean, sigma**2) + # NB! the smooth function does not always extrapolate well outside the edges + # causing poor estimate of g + # We may alleviate this problem by: forcing the extrapolation + # to be linear outside the edges or choosing a lower value for csm2. + + inds = slice(Ne, ncr - Ne) # indices to points we are smoothing over + scros2 = SmoothSpline(lc11[inds], lc22[inds], opt.gsm, opt.lin_extrap, gvar[inds])(uu) + + g = TrData(scros2, g1, mean, sigma**2) #*sa; #multiply with stdev + + if opt.chkder: + for ix in range(5): + dy = diff(g.data) + if any(dy <= 0): + warnings.warn( + ''' The empirical crossing spectrum is not sufficiently smoothed. + The estimated transfer function, g, is not a strictly increasing function. + ''') + eps = finfo(float).eps + dy[dy > 0] = eps + gvar = -(hstack((dy, 0)) + hstack((0, dy))) / 2 + eps + g.data = SmoothSpline(g.args, g.data, 1, opt.lin_extrap, ix * gvar)(g.args) + else: + break + + if opt.plotflag > 0: + g.plot() + g2.plot() + + return g, g2 class CyclePairs(WafoData): ''' @@ -448,12 +438,12 @@ class CyclePairs(WafoData): self.stdev = kwds.get('stdev', None) self.mean = kwds.get('mean', None) - self.labels.title = self.type_+ ' cycle pairs' + self.labels.title = self.type_ + ' cycle pairs' self.labels.xlab = 'min' self.labels.ylab = 'max' def amplitudes(self): - return (self.data-self.args)/2. + return (self.data - self.args) / 2. def damage(self, beta, K=1): """ @@ -496,7 +486,7 @@ class CyclePairs(WafoData): SurvivalCycleCount """ amp = abs(self.amplitudes()) - return atleast_1d([K*np.sum(amp**betai) for betai in beta]) + return atleast_1d([K * np.sum(amp ** betai) for betai in beta]) def level_crossings(self, type_='uM'): """ Return number of upcrossings from a cycle count. @@ -540,7 +530,7 @@ class CyclePairs(WafoData): else: defnr = type_ - if ((defnr<0) or (defnr>3)): + if ((defnr < 0) or (defnr > 3)): raise ValueError('type_ must be one of (1,2,3,4).') index, = nonzero(self.args <= self.data) @@ -578,13 +568,13 @@ class CyclePairs(WafoData): extr[:, ii] = extremes[:, i] #[xx nx]=max(extr(:,1)) - nx = extr[0].argmax()+1 + nx = extr[0].argmax() + 1 levels = extr[0, 0:nx] if defnr == 2: ## This are upcrossings + maxima - dcount = cumsum(extr[1, 0:nx]) + extr[2, 0:nx]-extr[3, 0:nx] + dcount = cumsum(extr[1, 0:nx]) + extr[2, 0:nx] - extr[3, 0:nx] elif defnr == 4: # # This are upcrossings + minima dcount = cumsum(extr[1, 0:nx]) - dcount[nx-1] = dcount[nx-2] + dcount[nx - 1] = dcount[nx - 2] elif defnr == 1: ## This are only upcrossings dcount = cumsum(extr[1, 0:nx]) - extr[3, 0:nx] elif defnr == 3: ## This are upcrossings + minima + maxima @@ -604,7 +594,7 @@ class TurningPoints(WafoData): ''' def __init__(self, *args, **kwds): super(TurningPoints, self).__init__(*args, **kwds) - self.name='WAFO TurningPoints Object' + self.name = 'WAFO TurningPoints Object' somekeys = ['name'] self.__dict__.update(sub_dict_select(kwds, somekeys)) @@ -614,7 +604,7 @@ class TurningPoints(WafoData): self.args = range(0, n) else: self.args = ravel(self.args) - self.data= ravel(self.data) + self.data = ravel(self.data) def cycle_pairs(self, type_='min2max'): """ Return min2Max or Max2min cycle pairs from turning points @@ -644,7 +634,7 @@ class TurningPoints(WafoData): TurningPoints SurvivalCycleCount """ - if self.data[0]>self.data[1]: + if self.data[0] > self.data[1]: im = 1 iM = 0 else: @@ -655,11 +645,11 @@ class TurningPoints(WafoData): #n = len(self.data) if type_.lower().startswith('min2max'): m = self.data[im:-1:2] - M = self.data[im+1::2] + M = self.data[im + 1::2] else: type_ = 'max2min' M = self.data[iM:-1:2] - m = self.data[iM+1::2] + m = self.data[iM + 1::2] return CyclePairs(M, m, type=type_) @@ -706,7 +696,8 @@ class TimeSeries(WafoData): if not any(self.args): n = len(self.data) self.args = range(0, n) - + + def sampling_period(self): ''' Returns sampling interval @@ -720,15 +711,15 @@ class TimeSeries(WafoData): See also ''' - dt1 = self.args[1]-self.args[0] - n = size(self.args)-1 - t = self.args[-1]-self.args[0] - dt = t/n - if abs(dt-dt1) > 1e-10: + dt1 = self.args[1] - self.args[0] + n = size(self.args) - 1 + t = self.args[-1] - self.args[0] + dt = t / n + if abs(dt - dt1) > 1e-10: warnings.warn('Data is not uniformly sampled!') return dt - def tocovdata(self, lag=None, flag='biased', norm=False, dt = None): + def tocovdata(self, lag=None, flag='biased', norm=False, dt=None): ''' Return auto covariance function from data. @@ -771,12 +762,12 @@ class TimeSeries(WafoData): ''' n = len(self.data) if not lag: - lag = n-1 + lag = n - 1 x = self.data.flatten() indnan = isnan(x) if any(indnan): - x = x - x[1-indnan].mean() # remove the mean pab 09.10.2000 + x = x - x[1 - indnan].mean() # remove the mean pab 09.10.2000 #indnan = find(indnan) Ncens = n - sum(indnan) x[indnan] = 0. # pab 09.10.2000 much faster for censored samples @@ -786,31 +777,31 @@ class TimeSeries(WafoData): x = x - x.mean() #fft = np.fft.fft - nfft = 2**nextpow2(n) - Rper = abs(fft(x,nfft))**2/Ncens # Raw periodogram + nfft = 2 ** nextpow2(n) + Rper = abs(fft(x, nfft)) ** 2 / Ncens # Raw periodogram - R = np.real(fft(Rper))/nfft # %ifft=fft/nfft since Rper is real! - lags = range(0,lag+1) + R = np.real(fft(Rper)) / nfft # %ifft=fft/nfft since Rper is real! + lags = range(0, lag + 1) if flag.startswith('unbiased'): # unbiased result, i.e. divide by n-abs(lag) - R = R[lags]*Ncens/arange(Ncens, Ncens-lag, -1) + R = R[lags] * Ncens / arange(Ncens, Ncens - lag, -1) #else % biased result, i.e. divide by n # r=r(1:L+1)*Ncens/Ncens c0 = R[0] if norm: - R = R/c0 + R = R / c0 if dt is None: dt = self.sampling_period() - t = linspace(0,lag*dt,lag+1) + t = linspace(0, lag * dt, lag + 1) #cumsum = np.cumsum - acf = _wafocov.CovData1D(R[lags],t) - acf.stdev=sqrt(r_[ 0, 1 ,1+2*cumsum(R[1:]**2)]/Ncens) - acf.children = [WafoData(-2.*acf.stdev[lags],t),WafoData(2.*acf.stdev[lags],t)] + acf = _wafocov.CovData1D(R[lags], t) + acf.stdev = sqrt(r_[ 0, 1 , 1 + 2 * cumsum(R[1:] ** 2)] / Ncens) + acf.children = [WafoData(-2. * acf.stdev[lags], t), WafoData(2. * acf.stdev[lags], t)] acf.norm = norm return acf - def tospecdata(self,*args,**kwargs): + def tospecdata(self, *args, **kwargs): """ Return power spectral density by Welches average periodogram method. @@ -847,13 +838,13 @@ class TimeSeries(WafoData): Bendat & Piersol (1986) Random Data: Analysis and Measurement Procedures, John Wiley & Sons """ - fs = 1./(2*self.sampling_period()) + fs = 1. / (2 * self.sampling_period()) S, f = psd(self.data.ravel(), Fs=fs, *args, **kwargs) - fact = 2.0*pi - w = fact*f - return _wafospec.SpecData1D(S/fact, w) + fact = 2.0 * pi + w = fact * f + return _wafospec.SpecData1D(S / fact, w) - def turning_points(self,h=0.0,wavetype=None): + def turning_points(self, h=0.0, wavetype=None): ''' Return turning points (tp) from data, optionally rainflowfiltered. @@ -895,14 +886,14 @@ class TimeSeries(WafoData): findrfc findtp ''' - ind = findtp(self.data, max(h,0.0), wavetype) + ind = findtp(self.data, max(h, 0.0), wavetype) try: t = self.args[ind] except: t = ind - return TurningPoints(self.data[ind],t) + return TurningPoints(self.data[ind], t) - def trough_crest(self,v=None,wavetype=None): + def trough_crest(self, v=None, wavetype=None): """ Return trough and crest turning points @@ -911,12 +902,12 @@ class TimeSeries(WafoData): v : scalar reference level (default v = mean of x). - wavetype : string + wavetype : string defines the type of wave. Possible options are - 'dw', 'uw', 'tw', 'cw' or None. - If None indices to all troughs and crests will be returned, - otherwise only the paired ones will be returned - according to the wavedefinition. + 'dw', 'uw', 'tw', 'cw' or None. + If None indices to all troughs and crests will be returned, + otherwise only the paired ones will be returned + according to the wavedefinition. Returns -------- @@ -1009,18 +1000,18 @@ class TimeSeries(WafoData): ##% If the first is a down-crossing then the first is a 'd2t' waveperiod. ##% If the first is a up-crossing then the first is a 'u2c' waveperiod. ##% -##% Example: -##% [T ind]=dat2wa(x,0,'all') %returns all waveperiods -##% nn = length(T) -##% % want to extract all t2u waveperiods -##% if x(ind(1),2)>0 % if first is down-crossing -##% Tt2u=T(2:4:nn) -##% else % first is up-crossing -##% Tt2u=T(4:4:nn) -##% end - - if rate>1: #% interpolate with spline - n = ceil(self.data.size*rate) +##% Example: +##% [T ind]=dat2wa(x,0,'all') %returns all waveperiods +##% nn = length(T) +##% % want to extract all t2u waveperiods +##% if x(ind(1),2)>0 % if first is down-crossing +##% Tt2u=T(2:4:nn) +##% else % first is up-crossing +##% Tt2u=T(4:4:nn) +##% end + + if rate > 1: #% interpolate with spline + n = ceil(self.data.size * rate) ti = linspace(self.args[0], self.args[-1], n) x = stineman_interp(ti, self.args, self.data) else: @@ -1029,7 +1020,7 @@ class TimeSeries(WafoData): if vh is None: - if pdef[0] in ('m','M'): + if pdef[0] in ('m', 'M'): vh = 0 print(' The minimum rfc height, h, is set to: %g' % vh) else: @@ -1038,22 +1029,22 @@ class TimeSeries(WafoData): if index is None: - if pdef in ('m2m', 'm2M', 'M2m','M2M'): + if pdef in ('m2m', 'm2M', 'M2m', 'M2M'): index = findtp(x, vh, wdef) - elif pdef in ('u2u','u2d','d2u', 'd2d'): + elif pdef in ('u2u', 'u2d', 'd2u', 'd2d'): index = findcross(x, vh, wdef) - elif pdef in ('t2t','t2c','c2t', 'c2c'): - index = findtc(x,vh,wdef)[0] - elif pdef in ('d2t','t2u', 'u2c', 'c2d','all'): + elif pdef in ('t2t', 't2c', 'c2t', 'c2c'): + index = findtc(x, vh, wdef)[0] + elif pdef in ('d2t', 't2u', 'u2c', 'c2d', 'all'): index, v_ind = findtc(x, vh, wdef) index = sort(r_[index, v_ind]) #% sorting crossings and tp in sequence else: raise ValueError('Unknown pdef option!') - if (x[index[0]]>x[index[1]]): #% if first is down-crossing or max + if (x[index[0]] > x[index[1]]): #% if first is down-crossing or max if pdef in ('d2t', 'M2m', 'c2t', 'd2u' , 'M2M', 'c2c', 'd2d', 'all'): start = 1 - elif pdef in ('t2u', 'm2M', 't2c', 'u2d' ,'m2m', 't2t', 'u2u'): + elif pdef in ('t2u', 'm2M', 't2c', 'u2d' , 'm2m', 't2t', 'u2u'): start = 2 elif pdef in ('u2c'): start = 3 @@ -1074,7 +1065,7 @@ class TimeSeries(WafoData): raise ValueError('Unknown pdef option!') # determine the steps between wanted periods - if pdef in ('d2t', 't2u', 'u2c', 'c2d' ): + if pdef in ('d2t', 't2u', 'u2c', 'c2d'): step = 4 elif pdef in ('all'): step = 1 #% secret option! @@ -1090,14 +1081,14 @@ class TimeSeries(WafoData): nn = len(index) #% New call: (pab 28.06.2001) if pdef[0] in ('u', 'd'): - t0 = ecross(ti, x, index[start:(nn-dist):step], vh) + t0 = ecross(ti, x, index[start:(nn - dist):step], vh) else: # % min, Max, trough, crest or all crossings wanted - t0 = x[index[start:(nn-dist):step]] + t0 = x[index[start:(nn - dist):step]] - if pdef[2] in ('u','d'): - t1 = ecross(ti, x, index[(start+dist):nn:step], vh) + if pdef[2] in ('u', 'd'): + t1 = ecross(ti, x, index[(start + dist):nn:step], vh) else: # % min, Max, trough, crest or all crossings wanted - t1 = x[index[(start+dist):nn:step]] + t1 = x[index[(start + dist):nn:step]] T = t1 - t0 ## if False: #% Secret option: indices to the actual crossings used. @@ -1115,7 +1106,7 @@ class TimeSeries(WafoData): def reconstruct(self): pass - def plot_wave(self, sym1='k.', ts=None, sym2='k+', nfig=None, nsub=None, + def plot_wave(self, sym1='k.', ts=None, sym2='k+', nfig=None, nsub=None, stdev=None, vfact=3): ''' Plots the surface elevation of timeseries. @@ -1157,9 +1148,9 @@ class TimeSeries(WafoData): tn = self.args xn = self.data.ravel() indmiss = isnan(xn) # indices to missing points - indg = where(1-indmiss)[0] + indg = where(1 - indmiss)[0] if ts is None: - tc_ix = findtc(xn[indg],0,'tw')[0] + tc_ix = findtc(xn[indg], 0, 'tw')[0] xn2 = xn[tc_ix] tn2 = tn[tc_ix] else: @@ -1170,32 +1161,32 @@ class TimeSeries(WafoData): stdev = xn[indg].std() if nsub is None: - nsub = int(floor(len(xn2)/(2*nw)))+1 # about Nw mdc waves in each plot + nsub = int(floor(len(xn2) / (2 * nw))) + 1 # about Nw mdc waves in each plot if nfig is None: - nfig = int(ceil(nsub/6)) - nsub = min(6,int(ceil(nsub/nfig))) + nfig = int(ceil(nsub / 6)) + nsub = min(6, int(ceil(nsub / nfig))) n = len(xn) - Ns = int(floor(n/(nfig*nsub))) + Ns = int(floor(n / (nfig * nsub))) ind = r_[0:Ns] - if all(xn>=0): - vscale = [0, 2*stdev*vfact] + if all(xn >= 0): + vscale = [0, 2 * stdev * vfact] else: - vscale = array([-1, 1])*vfact*stdev + vscale = array([-1, 1]) * vfact * stdev XlblTxt = 'Time [sec]' dT = 1 - timespan = tn[ind[-1]]-tn[ind[0]] - if abs(timespan)>18000: # more than 5 hours - dT = 1/(60*60) + timespan = tn[ind[-1]] - tn[ind[0]] + if abs(timespan) > 18000: # more than 5 hours + dT = 1 / (60 * 60) XlblTxt = 'Time (hours)' - elif abs(timespan)>300:# more than 5 minutes - dT = 1/60 + elif abs(timespan) > 300:# more than 5 minutes + dT = 1 / 60 XlblTxt = 'Time (minutes)' - if np.max(abs(xn[indg]))>5*stdev: - XlblTxt = XlblTxt +' (Spurious data since max > 5 std.)' + if np.max(abs(xn[indg])) > 5 * stdev: + XlblTxt = XlblTxt + ' (Spurious data since max > 5 std.)' plot = plotbackend.plot subplot = plotbackend.subplot @@ -1204,19 +1195,19 @@ class TimeSeries(WafoData): figs.append(plotbackend.figure()) plotbackend.title('Surface elevation from mean water level (MWL).') for ix in xrange(nsub): - if nsub>1: - subplot(nsub,1,ix) + if nsub > 1: + subplot(nsub, 1, ix) h_scale = array([tn[ind[0]], tn[ind[-1]]]) - ind2 = where((h_scale[0]<=tn2) & (tn2<=h_scale[1]))[0] - plot(tn[ind]*dT, xn[ind], sym1) - if len(ind2)>0: - plot(tn2[ind2]*dT,xn2[ind2],sym2) - plot(h_scale*dT, [0, 0], 'k-') + ind2 = where((h_scale[0] <= tn2) & (tn2 <= h_scale[1]))[0] + plot(tn[ind] * dT, xn[ind], sym1) + if len(ind2) > 0: + plot(tn2[ind2] * dT, xn2[ind2], sym2) + plot(h_scale * dT, [0, 0], 'k-') #plotbackend.axis([h_scale*dT, v_scale]) for iy in [-2, 2]: - plot(h_scale*dT, iy*stdev*ones(2), ':') + plot(h_scale * dT, iy * stdev * ones(2), ':') ind = ind + Ns #end @@ -1251,45 +1242,45 @@ class TimeSeries(WafoData): """ wave_idx = atleast_1d(wave_idx_).flatten() if tz_idx is None: - tc_ind, tz_idx = findtc(self.data,0,'tw') # finding trough to trough waves + tc_ind, tz_idx = findtc(self.data, 0, 'tw') # finding trough to trough waves - dw = nonzero(abs(diff(wave_idx))>1)[0] - Nsub = dw.size+1 + dw = nonzero(abs(diff(wave_idx)) > 1)[0] + Nsub = dw.size + 1 Nwp = zeros(Nsub, dtype=int) - if Nsub>1: + if Nsub > 1: dw = dw + 1 - Nwp[Nsub-1] = wave_idx[-1]-wave_idx[dw[-1]]+1 - wave_idx[dw[-1]+1:] = -2 - for ix in range(Nsub-2,1,-2): - Nwp[ix] = wave_idx[dw[ix]-1] - wave_idx[dw[ix-1]]+1 # # of waves pr subplot - wave_idx[dw[ix-1]+1:dw[ix]] = -2 + Nwp[Nsub - 1] = wave_idx[-1] - wave_idx[dw[-1]] + 1 + wave_idx[dw[-1] + 1:] = -2 + for ix in range(Nsub - 2, 1, -2): + Nwp[ix] = wave_idx[dw[ix] - 1] - wave_idx[dw[ix - 1]] + 1 # # of waves pr subplot + wave_idx[dw[ix - 1] + 1:dw[ix]] = -2 - Nwp[0] = wave_idx[dw[0]-1] - wave_idx[0]+1 + Nwp[0] = wave_idx[dw[0] - 1] - wave_idx[0] + 1 wave_idx[1:dw[0]] = -2 - wave_idx = wave_idx[wave_idx>-1] + wave_idx = wave_idx[wave_idx > -1] else: - Nwp[0] = wave_idx[-1]-wave_idx[0]+1 + Nwp[0] = wave_idx[-1] - wave_idx[0] + 1 #end - Nsub = min(6,Nsub) - Nfig = int(ceil(Nsub/6)) - Nsub = min(6,int(ceil(Nsub/Nfig))) + Nsub = min(6, Nsub) + Nfig = int(ceil(Nsub / 6)) + Nsub = min(6, int(ceil(Nsub / Nfig))) figs = [] for iy in range(Nfig): figs.append(plotbackend.figure()) for ix in range(Nsub): - plotbackend.subplot(Nsub,1,mod(ix,Nsub)+1) - ind = r_[tz_idx[2*wave_idx[ix]-1]:tz_idx[2*wave_idx[ix]+2*Nwp[ix]-1]] + plotbackend.subplot(Nsub, 1, mod(ix, Nsub) + 1) + ind = r_[tz_idx[2 * wave_idx[ix] - 1]:tz_idx[2 * wave_idx[ix] + 2 * Nwp[ix] - 1]] ## indices to wave - plotbackend.plot(self.args[ind],self.data[ind],*args,**kwds) + plotbackend.plot(self.args[ind], self.data[ind], *args, **kwds) plotbackend.hold('on') - xi = [self.args[ind[0]],self.args[ind[-1]]] - plotbackend.plot(xi,[0, 0]) + xi = [self.args[ind[0]], self.args[ind[-1]]] + plotbackend.plot(xi, [0, 0]) - if Nwp[ix]==1: + if Nwp[ix] == 1: plotbackend.ylabel('Wave %d' % wave_idx[ix]) else: - plotbackend.ylabel('Wave %d - %d' % (wave_idx[ix], wave_idx[ix]+Nwp[ix]-1)) + plotbackend.ylabel('Wave %d - %d' % (wave_idx[ix], wave_idx[ix] + Nwp[ix] - 1)) plotbackend.xlabel('Time [sec]') #wafostamp @@ -1330,7 +1321,7 @@ def sensortypeid(*sensortypes): >>> sensortypeid('W','v') [11, 10] >>> sensortypeid('rubbish') - [1.#QNAN] + [nan] See also -------- @@ -1393,7 +1384,7 @@ def sensortype(*sensorids): if isinstance(ids, list): ids = hstack(ids) n = len(valid_names) - 1 - ids = where(((ids<0) | (nc4AMzJofkOe;RT5lK*(=5^2Xp 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 U+@Yu=`g2$=DsC4+h+vriKdB?|X8-^I literal 45056 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 g.sigma array([ 5.]) + >>> g = TrData(y,x,mean=1,sigma=5) + >>> g.mean + 1 + >>> g.sigma + 5 + + Check that the departure from a Gaussian model is zero >>> g.dist2gauss() < 1e-16 True """ def __init__(self, *args, **kwds): - WafoData.__init__(self, *args, **kwds) + super(TrData, self).__init__(*args, **kwds) self.labels.title = 'Transform' self.labels.ylab = 'g(x)' self.labels.xlab = 'x' diff --git a/pywafo/src/wafo/transform/models.py b/pywafo/src/wafo/transform/models.py index abeed05..c870e2a 100644 --- a/pywafo/src/wafo/transform/models.py +++ b/pywafo/src/wafo/transform/models.py @@ -463,7 +463,7 @@ if __name__=='__main__': import doctest doctest.testmod() else: - main() + main()