Merging picker.py did not work correctly
This commit is contained in:
		
							parent
							
								
									5258a7e9b4
								
							
						
					
					
						commit
						b1a1e8924a
					
				| @ -23,9 +23,9 @@ import warnings | |||||||
| 
 | 
 | ||||||
| import matplotlib.pyplot as plt | import matplotlib.pyplot as plt | ||||||
| import numpy as np | import numpy as np | ||||||
|  | from scipy.signal import argrelmax | ||||||
| from pylot.core.pick.charfuns import CharacteristicFunction | from pylot.core.pick.charfuns import CharacteristicFunction | ||||||
| from pylot.core.pick.utils import getnoisewin, getsignalwin, real_Bool, real_None, set_NaNs_to, taper_cf, cf_positive, \ | from pylot.core.pick.utils import getnoisewin, getsignalwin | ||||||
|     smooth_cf, check_counts_ms, getSNR, getslopewin, calcSlope |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class AutoPicker(object): | class AutoPicker(object): | ||||||
| @ -132,13 +132,6 @@ class AutoPicker(object): | |||||||
|         return self.iplot |         return self.iplot | ||||||
| 
 | 
 | ||||||
|     def setiplot(self, iplot): |     def setiplot(self, iplot): | ||||||
|         try: |  | ||||||
|             iplot = int(iplot) |  | ||||||
|         except ValueError: |  | ||||||
|             if real_Bool(iplot): |  | ||||||
|                self.iplot = 2 |  | ||||||
|             else: |  | ||||||
|                self.iplot = 0 |  | ||||||
|         self.iplot = iplot |         self.iplot = iplot | ||||||
| 
 | 
 | ||||||
|     def getpick1(self): |     def getpick1(self): | ||||||
| @ -159,79 +152,71 @@ class AICPicker(AutoPicker): | |||||||
|     from which the AIC has been calculated. |     from which the AIC has been calculated. | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
|     def prepareCF(self): |     def calcPick(self): | ||||||
|         """ |  | ||||||
|         data pre processing: remove invalid entries, taper cf, remove offset |  | ||||||
|         """ |  | ||||||
| 
 | 
 | ||||||
|         self.cf = set_NaNs_to(self.cf, 0) |         print('AICPicker: Get initial onset time (pick) from AIC-CF ...') | ||||||
|         self.cf = taper_cf(self.cf) | 
 | ||||||
|         self.cf = cf_positive(self.cf) |         self.Pick = None | ||||||
|         # smooth AIC-CF |         self.slope = None | ||||||
|  |         self.SNR = None | ||||||
|  |         plt_flag = 0 | ||||||
|         try: |         try: | ||||||
|             self.aicsmooth = smooth_cf(self.cf, self.Tsmooth, self.dt) |             iplot = int(self.iplot) | ||||||
|         except ValueError as e: |         except: | ||||||
|  |             if self.iplot == True or self.iplot == 'True': | ||||||
|  |                iplot = 2 | ||||||
|  |             else: | ||||||
|  |                iplot = 0 | ||||||
|  | 
 | ||||||
|  |         # find NaN's | ||||||
|  |         nn = np.isnan(self.cf) | ||||||
|  |         if len(nn) > 1: | ||||||
|  |             self.cf[nn] = 0 | ||||||
|  |         # taper AIC-CF to get rid off side maxima | ||||||
|  |         tap = np.hanning(len(self.cf)) | ||||||
|  |         aic = tap * self.cf + max(abs(self.cf)) | ||||||
|  |         # smooth AIC-CF | ||||||
|  |         ismooth = int(round(self.Tsmooth / self.dt)) | ||||||
|  |         aicsmooth = np.zeros(len(aic)) | ||||||
|  |         if len(aic) < ismooth: | ||||||
|             print('AICPicker: Tsmooth larger than CF!') |             print('AICPicker: Tsmooth larger than CF!') | ||||||
|             raise e |             return | ||||||
| 
 |         else: | ||||||
|     def findMinimum(self): |             for i in range(1, len(aic)): | ||||||
|         """ |                 if i > ismooth: | ||||||
|         Find minimum representing the preliminary onset, sets Pick to minimum |                     ii1 = i - ismooth | ||||||
|         """ |                     aicsmooth[i] = aicsmooth[i - 1] + (aic[i] - aic[ii1]) / ismooth | ||||||
| 
 |                 else: | ||||||
|         # get maximum of HOS/AR-CF as starting point for searching |                     aicsmooth[i] = np.mean(aic[1: i]) | ||||||
|  |         # remove offset in AIC function | ||||||
|  |         offset = abs(min(aic) - min(aicsmooth)) | ||||||
|  |         aicsmooth = aicsmooth - offset | ||||||
|  |         # get maximum of HOS/AR-CF as startimg point for searching | ||||||
|         # minimum in AIC function |         # minimum in AIC function | ||||||
|         icfmax = np.argmax(self.Data[0].data) |         icfmax = np.argmax(self.Data[0].data) | ||||||
| 
 | 
 | ||||||
|         # find minimum in AIC-CF front of maximum of HOS/AR-CF |         # find minimum in AIC-CF front of maximum of HOS/AR-CF | ||||||
|         lpickwindow = int(round(self.PickWindow / self.dt)) |         lpickwindow = int(round(self.PickWindow / self.dt)) | ||||||
|         for i in range(icfmax - 1, max([icfmax - lpickwindow, 2]), -1): |         for i in range(icfmax - 1, max([icfmax - lpickwindow, 2]), -1): | ||||||
|             if self.aicsmooth[i - 1] >= self.aicsmooth[i]: |             if aicsmooth[i - 1] >= aicsmooth[i]: | ||||||
|                 self.Pick = self.Tcf[i] |                 self.Pick = self.Tcf[i] | ||||||
|                 break |                 break | ||||||
|         # if no minimum could be found: |         # if no minimum could be found: | ||||||
|         # search in 1st derivative of AIC-CF |         # search in 1st derivative of AIC-CF | ||||||
|         if self.Pick is None: |         if self.Pick is None: | ||||||
|             diffcf = np.diff(self.aicsmooth) |             diffcf = np.diff(aicsmooth) | ||||||
|             diffcf = set_NaNs_to(diffcf, 0) |             # find NaN's | ||||||
|  |             nn = np.isnan(diffcf) | ||||||
|  |             if len(nn) > 1: | ||||||
|  |                 diffcf[nn] = 0 | ||||||
|             # taper CF to get rid off side maxima |             # taper CF to get rid off side maxima | ||||||
|             diffcf = taper_cf(diffcf) |             tap = np.hanning(len(diffcf)) | ||||||
|             diffcf = cf_positive(diffcf) |             diffcf = tap * diffcf * max(abs(aicsmooth)) | ||||||
|             for i in range(icfmax - 1, max([icfmax - lpickwindow, 2]), -1): |             for i in range(icfmax - 1, max([icfmax - lpickwindow, 2]), -1): | ||||||
|                 if diffcf[i - 1] >= diffcf[i]: |                 if diffcf[i - 1] >= diffcf[i]: | ||||||
|                     self.Pick = self.Tcf[i] |                     self.Pick = self.Tcf[i] | ||||||
|                     break |                     break | ||||||
|         if self.Pick is None: |  | ||||||
|             raise ValueError |  | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     def calcPick(self): |  | ||||||
|         """ |  | ||||||
|         Calculate pick using cf derived from AIC |  | ||||||
|         :return: |  | ||||||
|         :rtype: None |  | ||||||
|         """ |  | ||||||
| 
 |  | ||||||
|         print('AICPicker: Get initial onset time (pick) from AIC-CF ...') |  | ||||||
| 
 |  | ||||||
|         self.Pick = None |  | ||||||
|         self.slope = -1 |  | ||||||
|         self.SNR = -1 |  | ||||||
|         plt_flag = 0 |  | ||||||
|         iplot = self.iplot |  | ||||||
| 
 |  | ||||||
|         try: |  | ||||||
|             self.prepareCF() |  | ||||||
|         except ValueError: |  | ||||||
|             return |  | ||||||
|         try: |  | ||||||
|             self.findMinimum() |  | ||||||
|         except ValueError: |  | ||||||
|             print('Could not determine pick on AIC CF') |  | ||||||
|             return |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         # quality assessment using SNR and slope from CF |  | ||||||
|         if self.Pick is not None: |         if self.Pick is not None: | ||||||
|             # get noise window |             # get noise window | ||||||
|             inoise = getnoisewin(self.Tcf, self.Pick, self.TSNR[0], self.TSNR[1]) |             inoise = getnoisewin(self.Tcf, self.Pick, self.TSNR[0], self.TSNR[1]) | ||||||
| @ -269,29 +254,9 @@ class AICPicker(AutoPicker): | |||||||
|             # find maximum within slope determination window |             # find maximum within slope determination window | ||||||
|             # 'cause slope should be calculated up to first local minimum only! |             # 'cause slope should be calculated up to first local minimum only! | ||||||
|             try: |             try: | ||||||
|                 self.slope, iislope, datafit = calcSlope(self.Data, self.aicsmooth, self.Tcf, self.Pick, self.TSNR) |                 dataslope = self.Data[0].data[islope[0][0:-1]] | ||||||
|             except Exception: |             except IndexError: | ||||||
|                 if self.iplot > 1: |                 print("Slope Calculation: empty array islope, check signal window") | ||||||
|                     if real_None(self.fig) is None: |  | ||||||
|                         fig = plt.figure() |  | ||||||
|                         plt_flag = 1 |  | ||||||
|                     else: |  | ||||||
|                         fig = self.fig |  | ||||||
|                     ax = fig.add_subplot(111) |  | ||||||
|                     x = self.Data[0].data |  | ||||||
|                     ax.plot(self.Tcf, x / max(x), color=self._linecolor, linewidth=0.7, label='(HOS-/AR-) Data') |  | ||||||
|                     ax.plot(self.Tcf, self.aicsmooth / max(self.aicsmooth), 'r', label='Smoothed AIC-CF') |  | ||||||
|                     ax.legend(loc=1) |  | ||||||
|                     ax.set_xlabel('Time [s] since %s' % self.Data[0].stats.starttime) |  | ||||||
|                     ax.set_yticks([]) |  | ||||||
|                     ax.set_title(self.Data[0].stats.station) |  | ||||||
|                     if plt_flag == 1: |  | ||||||
|                         fig.show() |  | ||||||
|                         try: |  | ||||||
|                             input() |  | ||||||
|                         except SyntaxError: |  | ||||||
|                             pass |  | ||||||
|                         plt.close(fig) |  | ||||||
|                 return |                 return | ||||||
|             if len(dataslope) < 2: |             if len(dataslope) < 2: | ||||||
|                 print('No or not enough data in slope window found!') |                 print('No or not enough data in slope window found!') | ||||||
| @ -344,13 +309,11 @@ class AICPicker(AutoPicker): | |||||||
|                 self.slope = 1 / (len(dataslope) * self.Data[0].stats.delta) * (datafit[-1] - datafit[0]) |                 self.slope = 1 / (len(dataslope) * self.Data[0].stats.delta) * (datafit[-1] - datafit[0]) | ||||||
| 
 | 
 | ||||||
|         else: |         else: | ||||||
|             self.SNR = -1 |             self.SNR = None | ||||||
|             self.slope = -1 |             self.slope = None | ||||||
| 
 | 
 | ||||||
|         if iplot > 1: |         if iplot > 1: | ||||||
|             inoise = getnoisewin(self.Tcf, self.Pick, self.TSNR[0], self.TSNR[1]) |             if self.fig == None or self.fig == 'None': | ||||||
|             isignal = getsignalwin(self.Tcf, self.Pick, self.TSNR[2]) |  | ||||||
|             if real_None(self.fig) is None: |  | ||||||
|                 fig = plt.figure()  # self.iplot) |                 fig = plt.figure()  # self.iplot) | ||||||
|                 plt_flag = 1 |                 plt_flag = 1 | ||||||
|             else: |             else: | ||||||
| @ -361,14 +324,14 @@ class AICPicker(AutoPicker): | |||||||
|             if len(self.Tcf) > len(self.Data[0].data): # why? LK |             if len(self.Tcf) > len(self.Data[0].data): # why? LK | ||||||
|                 self.Tcf = self.Tcf[0:len(self.Tcf)-1] |                 self.Tcf = self.Tcf[0:len(self.Tcf)-1] | ||||||
|             ax1.plot(self.Tcf, x / max(x), color=self._linecolor, linewidth=0.7, label='(HOS-/AR-) Data') |             ax1.plot(self.Tcf, x / max(x), color=self._linecolor, linewidth=0.7, label='(HOS-/AR-) Data') | ||||||
|             ax1.plot(self.Tcf, self.aicsmooth / max(self.aicsmooth), 'r', label='Smoothed AIC-CF') |             ax1.plot(self.Tcf, aicsmooth / max(aicsmooth), 'r', label='Smoothed AIC-CF') | ||||||
|             if self.Pick is not None: |             if self.Pick is not None: | ||||||
|                 ax1.plot([self.Pick, self.Pick], [-0.1, 0.5], 'b', linewidth=2, label='AIC-Pick') |                 ax1.plot([self.Pick, self.Pick], [-0.1, 0.5], 'b', linewidth=2, label='AIC-Pick') | ||||||
|             ax1.set_xlabel('Time [s] since %s' % self.Data[0].stats.starttime) |             ax1.set_xlabel('Time [s] since %s' % self.Data[0].stats.starttime) | ||||||
|             ax1.set_yticks([]) |             ax1.set_yticks([]) | ||||||
|             ax1.legend(loc=1) |             ax1.legend(loc=1) | ||||||
| 
 | 
 | ||||||
|             if self.Pick is not None and self.SNR is not None: |             if self.Pick is not None: | ||||||
|                 ax2 = fig.add_subplot(2, 1, 2, sharex=ax1) |                 ax2 = fig.add_subplot(2, 1, 2, sharex=ax1) | ||||||
|                 ax2.plot(self.Tcf, x, color=self._linecolor, linewidth=0.7, label='Data') |                 ax2.plot(self.Tcf, x, color=self._linecolor, linewidth=0.7, label='Data') | ||||||
|                 ax1.axvspan(self.Tcf[inoise[0]], self.Tcf[inoise[-1]], color='y', alpha=0.2, lw=0, label='Noise Window') |                 ax1.axvspan(self.Tcf[inoise[0]], self.Tcf[inoise[-1]], color='y', alpha=0.2, lw=0, label='Noise Window') | ||||||
| @ -415,7 +378,13 @@ class PragPicker(AutoPicker): | |||||||
| 
 | 
 | ||||||
|     def calcPick(self): |     def calcPick(self): | ||||||
| 
 | 
 | ||||||
|         iplot = self.getiplot() |         try: | ||||||
|  |             iplot = int(self.getiplot()) | ||||||
|  |         except: | ||||||
|  |             if self.getiplot() == True or self.getiplot() == 'True': | ||||||
|  |                iplot = 2 | ||||||
|  |             else: | ||||||
|  |                iplot = 0 | ||||||
| 
 | 
 | ||||||
|         if self.getpick1() is not None: |         if self.getpick1() is not None: | ||||||
|             print('PragPicker: Get most likely pick from HOS- or AR-CF using pragmatic picking algorithm ...') |             print('PragPicker: Get most likely pick from HOS- or AR-CF using pragmatic picking algorithm ...') | ||||||
| @ -426,7 +395,19 @@ class PragPicker(AutoPicker): | |||||||
|             pickflag = 0 |             pickflag = 0 | ||||||
|             plt_flag = 0 |             plt_flag = 0 | ||||||
|             # smooth CF |             # smooth CF | ||||||
|             cfsmooth = smooth_cf(self.cf, self.Tsmooth, self.dt) |             ismooth = int(round(self.Tsmooth / self.dt)) | ||||||
|  |             cfsmooth = np.zeros(len(self.cf)) | ||||||
|  |             if len(self.cf) < ismooth: | ||||||
|  |                 print('PragPicker: Tsmooth larger than CF!') | ||||||
|  |                 return | ||||||
|  |             else: | ||||||
|  |                 for i in range(1, len(self.cf)): | ||||||
|  |                     if i > ismooth: | ||||||
|  |                         ii1 = i - ismooth | ||||||
|  |                         cfsmooth[i] = cfsmooth[i - 1] + (self.cf[i] - self.cf[ii1]) / ismooth | ||||||
|  |                     else: | ||||||
|  |                         cfsmooth[i] = np.mean(self.cf[1: i]) | ||||||
|  | 
 | ||||||
|             # select picking window |             # select picking window | ||||||
|             # which is centered around tpick1 |             # which is centered around tpick1 | ||||||
|             ipick = np.where((self.Tcf >= self.getpick1() - self.PickWindow / 2) \ |             ipick = np.where((self.Tcf >= self.getpick1() - self.PickWindow / 2) \ | ||||||
| @ -501,7 +482,7 @@ class PragPicker(AutoPicker): | |||||||
|                 pickflag = 0 |                 pickflag = 0 | ||||||
| 
 | 
 | ||||||
|             if iplot > 1: |             if iplot > 1: | ||||||
|                 if real_None(self.fig) is None: |                 if self.fig == None or self.fig == 'None': | ||||||
|                     fig = plt.figure()  # self.getiplot()) |                     fig = plt.figure()  # self.getiplot()) | ||||||
|                     plt_flag = 1 |                     plt_flag = 1 | ||||||
|                 else: |                 else: | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user