Transfer plotting of results in GUI after picking
This commit is contained in:
		
							parent
							
								
									86419220e2
								
							
						
					
					
						commit
						80835bc56e
					
				| @ -195,6 +195,12 @@ class PickingResults(dict): | ||||
|         self.fc = None | ||||
|         self.Mw = None | ||||
| 
 | ||||
|         # flags for plotting | ||||
|         self.aicPflag = 0 | ||||
|         self.aicSflag = 0 | ||||
|         self.Pflag = 0 | ||||
|         self.Sflag = 0 | ||||
| 
 | ||||
|     def __setattr__(self, key, value): | ||||
|         self[key] = value | ||||
| 
 | ||||
| @ -430,6 +436,7 @@ class AutopickStation(object): | ||||
|                 print(pfe) | ||||
| 
 | ||||
|         self.finish_picking() | ||||
|         self.plot_pick_results() | ||||
|         return {'P': self.p_results, 'S':self.s_results, 'station':self.ztrace.stats.station} #TODO method to format picking results as a dict correctly | ||||
| 
 | ||||
|     def finish_picking(self): | ||||
| @ -502,6 +509,130 @@ class AutopickStation(object): | ||||
|         self.s_results.picker='auto' | ||||
|         self.s_results.Ao = None | ||||
| 
 | ||||
|     def plot_pick_results(self): | ||||
|         if self.iplot > 0: | ||||
|             # plot vertical trace | ||||
|             if self.fig_dict is None: | ||||
|                 fig = plt.figure() | ||||
|                 plt_flag = 1 | ||||
|                 linecolor = 'k' | ||||
|             else: | ||||
|                 fig = self.fig_dict['mainFig'] | ||||
|                 linecolor = self.fig_dict['plot_style']['linecolor']['rgba_mpl'] | ||||
|                 plt_flag = 0 | ||||
|             fig._tight = True | ||||
|             ax1 = fig.add_subplot(311) | ||||
|             tdata = np.linspace(start=0, stop=self.ztrace.stats.npts*self.ztrace.stats.delta, num=self.ztrace.stats.npts) | ||||
|             # plot tapered trace filtered with bpz2 filter settings | ||||
|             ax1.plot(tdata, self.tr_filt_z_bpz2.data/max(self.tr_filt_z_bpz2.data), color=linecolor, linewidth=0.7, label='Data') | ||||
|             if self.p_results.Pweight < 4: | ||||
|                 # plot CF of initial onset (HOScf or ARZcf) | ||||
|                 ax1.plot(self.cf1.getTimeArray(), self.cf1.getCF()/max(self.cf1.getCF()), 'b', label='CF1') | ||||
|             if self.p_results.aicPflag == 1: | ||||
|                 aicpick = self.p_results.aicpick | ||||
|                 refPpick = self.p_results.refPpick | ||||
|                 # plot CF of precise pick (HOScf or ARZcf) | ||||
|                 ax1.plot(self.cf2.getTimeArray(), self.cf2.getCF() / max(self.cf2.getCF()), 'm', label='CF2') | ||||
|                 # plot inital P pick | ||||
|                 ax1.plot([aicpick.getpick(), aicpick.getpick()], [-1, 1], 'r', label='Initial P Onset') | ||||
|                 ax1.plot([aicpick.getpick() - 0.5, aicpick.getpick() + 0.5], [1, 1], 'r') | ||||
|                 ax1.plot([aicpick.getpick() - 0.5, aicpick.getpick() + 0.5], [-1, -1], 'r') | ||||
|                 # plot precise P pick | ||||
|                 ax1.plot([refPpick.getpick(), refPpick.getpick()], [-1.3, 1.3], 'r', linewidth=2, label='Final P Pick') | ||||
|                 ax1.plot([refPpick.getpick() - 0.5, refPpick.getpick() + 0.5], [1.3, 1.3], 'r', linewidth=2) | ||||
|                 ax1.plot([refPpick.getpick() - 0.5, refPpick.getpick() + 0.5], [-1.3, -1.3], 'r', linewidth=2) | ||||
|                 # plot latest possible P pick | ||||
|                 ax1.plot([self.p_results.lpickP, self.p_results.lpickP], [-1.1, 1.1], 'r--', label='lpp') | ||||
|                 # plot earliest possible P pick | ||||
|                 ax1.plot([self.p_results.epickP, self.p_results.epickP], [-1.1, 1.1], 'r--', label='epp') | ||||
|                 # add title to plot | ||||
|                 title = '{station}, {channel}, P weight={pweight:d}, SNR={snr:7.2}, SNR[dB]={snrdb:7.2}, Polarity: {polarity}' | ||||
|                 ax1.set_title(title.format(station=self.ztrace.stats.station, | ||||
|                                            channel=self.ztrace.stats.channel, | ||||
|                                            pweight=self.p_results.Pweight, | ||||
|                                            snr=self.p_results.SNRP, | ||||
|                                            snrdb=self.p_results.SNRPdB, | ||||
|                                            polarity=self.p_results.FM)) | ||||
|             else: | ||||
|                 title = '{channel}, P weight={pweight}, SNR=None, SNR[dB]=None' | ||||
|                 ax1.set_title(title.format(channel=self.ztrace.stats.channel, pweight=self.p_results.Pweight)) | ||||
| 
 | ||||
|             ax1.legend(loc=1) | ||||
|             ax1.set_yticks([]) | ||||
|             ax1.set_ylim([-1.5, 1.5]) | ||||
|             ax1.set_ylabel('Normalized Counts') | ||||
| 
 | ||||
|             if self.s_results.Sflag == 1: | ||||
|                 # plot E trace | ||||
|                 ax2 = fig.add_subplot(3, 1, 2, sharex=ax1) | ||||
|                 th1data = np.linspace(0, self.etrace.stats.npts*self.etrace.stats.delta, self.etrace.stats.npts) | ||||
|                 # plot filtered and tapered waveform | ||||
|                 ax2.plot(th1data, self.etrace.data / max(self.etrace.data), color=linecolor, linewidth=0.7, label='Data') | ||||
|                 if self.p_results.Pweight < 4: | ||||
|                     # plot initial CF (ARHcf or AR3Ccf) | ||||
|                     ax2.plot(self.arhcf1.getTimeArray(), self.arhcf1.getCF() / max(self.arhcf1.getCF()), 'b', label='CF1') | ||||
|                     if self.s_results.aicSflag == 1 and self.s_results.Sweight <= 4: | ||||
|                         aicarhpick = self.aicarhpick | ||||
|                         refSpick = self.refSpick | ||||
|                         # plot second cf, used for determing precise onset (ARHcf or AR3Ccf) | ||||
|                         ax2.plot(self.arhcf2.getTimeArray(), self.arhcf2.getCF() / max(self.arhcf2.getCF()), 'm', label='CF2') | ||||
|                         # plot preliminary onset time, calculated from CF1 | ||||
|                         ax2.plot([aicarhpick.getpick(), aicarhpick.getpick()], [-1, 1], 'g', label='Initial S Onset') | ||||
|                         ax2.plot([aicarhpick.getpick() - 0.5, aicarhpick.getpick() + 0.5], [1, 1], 'g') | ||||
|                         ax2.plot([aicarhpick.getpick() - 0.5, aicarhpick.getpick() + 0.5], [-1, -1], 'g') | ||||
|                         # plot precise onset time, calculated from CF2 | ||||
|                         ax2.plot([refSpick.getpick(), refSpick.getpick()], [-1.3, 1.3], 'g', linewidth=2, label='Final S Pick') | ||||
|                         ax2.plot([refSpick.getpick() - 0.5, refSpick.getpick() + 0.5], [1.3, 1.3], 'g', linewidth=2) | ||||
|                         ax2.plot([refSpick.getpick() - 0.5, refSpick.getpick() + 0.5], [-1.3, -1.3], 'g', linewidth=2) | ||||
|                         ax2.plot([self.s_results.lpickS, self.s_results.lpickS], [-1.1, 1.1], 'g--', label='lpp') | ||||
|                         ax2.plot([self.s_results.epickS, self.s_results.epickS], [-1.1, 1.1], 'g--', label='epp') | ||||
|                         title = '{channel}, S weight={sweight}, SNR={snr:7.2}, SNR[dB]={snrdb:7.2}' | ||||
|                         ax2.set_title(title.format(channel=self.etrace.stats.channel, | ||||
|                                                    sweight=self.s_results.Sweight, | ||||
|                                                    snr=self.s_results.SNRS, | ||||
|                                                    snrdb=self.s_results.SNRSdB)) | ||||
|                     else: | ||||
|                         title = '{channel}, S weight={sweight}, SNR=None, SNR[dB]=None' | ||||
|                         ax2.set_title(title.format(channel=self.etrace.stats.channel, sweight=self.s_results.Sweight)) | ||||
|                 ax2.legend(loc=1) | ||||
|                 ax2.set_yticks([]) | ||||
|                 ax2.set_ylim([-1.5, 1.5]) | ||||
|                 ax2.set_ylabel('Normalized Counts') | ||||
| 
 | ||||
|                 # plot N trace | ||||
|                 ax3 = fig.add_subplot(3, 1, 3, sharex=ax1) | ||||
|                 th2data= np.linspace(0, self.ntrace.stats.npts*self.ntrace.stats.delta, self.ntrace.stats.npts) | ||||
|                 # plot trace | ||||
|                 ax3.plot(th2data, self.ntrace.data / max(self.ntrace.data), color=linecolor, linewidth=0.7, label='Data') | ||||
|                 if self.p_results.Pweight < 4: | ||||
|                     p22, = ax3.plot(self.arhcf1.getTimeArray(), self.arhcf1.getCF() / max(self.arhcf1.getCF()), 'b', label='CF1') | ||||
|                     if self.s_results.aicSflag == 1: | ||||
|                         aicarhpick = self.aicarhpick | ||||
|                         refSpick = self.refSpick | ||||
|                         ax3.plot(self.arhcf2.getTimeArray(), self.arhcf2.getCF() / max(self.arhcf2.getCF()), 'm', label='CF2') | ||||
|                         ax3.plot([aicarhpick.getpick(), aicarhpick.getpick()], [-1, 1], 'g', label='Initial S Onset') | ||||
|                         ax3.plot([aicarhpick.getpick() - 0.5, aicarhpick.getpick() + 0.5], [1, 1], 'g') | ||||
|                         ax3.plot([aicarhpick.getpick() - 0.5, aicarhpick.getpick() + 0.5], [-1, -1], 'g') | ||||
|                         ax3.plot([refSpick.getpick(), refSpick.getpick()], [-1.3, 1.3], 'g', linewidth=2, | ||||
|                                  label='Final S Pick') | ||||
|                         ax3.plot([refSpick.getpick() - 0.5, refSpick.getpick() + 0.5], [1.3, 1.3], 'g', linewidth=2) | ||||
|                         ax3.plot([refSpick.getpick() - 0.5, refSpick.getpick() + 0.5], [-1.3, -1.3], 'g', linewidth=2) | ||||
|                         ax3.plot([self.s_results.lpickS, self.s_results.lpickS], [-1.1, 1.1], 'g--', label='lpp') | ||||
|                         ax3.plot([self.s_results.epickS, self.s_results.epickS], [-1.1, 1.1], 'g--', label='epp') | ||||
|                 ax3.legend(loc=1) | ||||
|                 ax3.set_yticks([]) | ||||
|                 ax3.set_ylim([-1.5, 1.5]) | ||||
|                 ax3.set_xlabel('Time [s] after %s' % self.ntrace.stats.starttime) | ||||
|                 ax3.set_ylabel('Normalized Counts') | ||||
|                 ax3.set_title(self.ntrace.stats.channel) | ||||
|                 if plt_flag == 1: | ||||
|                     fig.show() | ||||
|                     try: | ||||
|                         input() | ||||
|                     except SyntaxError: | ||||
|                         pass | ||||
|                     plt.close(fig) | ||||
| 
 | ||||
|     def pick_p_qc1(self, aicpick, z_copy, tr_filt): | ||||
|         """ | ||||
|         Quality control of first pick using minseglength and checkZ4S. | ||||
| @ -579,7 +710,7 @@ class AutopickStation(object): | ||||
| 
 | ||||
|         tr_filt, z_copy = self.prepare_wfstream(self.zstream, self.p_params.bpz1[0], self.p_params.bpz1[1]) | ||||
|         # save filtered trace in instance for later plotting | ||||
|         self.tr_filt_z = tr_filt | ||||
|         self.tr_filt_z_bpz2 = tr_filt | ||||
|         try: | ||||
|             # modify pstart, pstop to be around theoretical onset if taupy should be used, else does nothing | ||||
|             self.modify_starttimes_taupy() | ||||
| @ -622,7 +753,7 @@ class AutopickStation(object): | ||||
|         slope = aicpick.getSlope() | ||||
|         if not slope: slope = 0 | ||||
|         if slope >= self.p_params.minAICPslope and aicpick.getSNR() >= self.p_params.minAICPSNR and Pflag == 1: | ||||
|             aicPflag = 1 | ||||
|             self.p_results.aicPflag = 1 | ||||
|             msg = 'AIC P-pick passes quality control: Slope: {0} counts/s, ' \ | ||||
|                   'SNR: {1}\nGo on with refined picking ...\n' \ | ||||
|                   'autopickstation: re-filtering vertical trace ' \ | ||||
| @ -630,6 +761,8 @@ class AutopickStation(object): | ||||
|             self.vprint(msg) | ||||
|             # refilter waveform with larger bandpass | ||||
|             tr_filt, z_copy = self.prepare_wfstream(self.zstream, freqmin=self.p_params.bpz2[0], freqmax=self.p_params.bpz2[1]) | ||||
|             # save filtered trace in instance for later plotting | ||||
|             self.tr_filt_z_bpz2 = tr_filt | ||||
|             cuttimes2 = [round(max([aicpick.getpick() - self.p_params.Precalcwin, 0])), | ||||
|                          round(min([len(self.ztrace.data) * self.ztrace.stats.delta, | ||||
|                                     aicpick.getpick() + self.p_params.Precalcwin]))] | ||||
| @ -648,6 +781,8 @@ class AutopickStation(object): | ||||
|             fig, linecolor = get_fig_from_figdict(self.fig_dict, 'refPpick') | ||||
|             refPpick = PragPicker(cf2, self.p_params.tsnrz, self.p_params.pickwinP, self.iplot, self.p_params.ausP, | ||||
|                                   self.p_params.tsmoothP, aicpick.getpick(), fig, linecolor) | ||||
|             # save PragPicker result for plotting | ||||
|             self.p_results.refPpick = refPpick | ||||
|             self.p_results.mpickP = refPpick.getpick() | ||||
|             if self.p_results.mpickP is not None: | ||||
|                 # quality assessment, get earliest/latest pick and symmetrized uncertainty | ||||
| @ -669,7 +804,7 @@ class AutopickStation(object): | ||||
|                 print(msg) | ||||
|                 msg = 'autopickstation: Refined P-Pick: {} s | P-Error: {} s'.format(self.p_results.mpickP, self.p_results.Perror) | ||||
|                 print(msg) | ||||
|                 Sflag = 1 | ||||
|                 self.s_results.Sflag = 1 | ||||
| 
 | ||||
|                 self.p_results.aicpick = aicpick | ||||
|             else: | ||||
| @ -679,10 +814,10 @@ class AutopickStation(object): | ||||
|                       'min. AIC-Slope={3}counts/s)'.format(aicpick.getSNR(), aicpick.getSlope(), | ||||
|                                                            self.p_params.minAICPSNR, self.p_params.minAICPslope) | ||||
|                 self.vprint(msg) | ||||
|                 Sflag = 0 | ||||
|                 self.s_results.Sflag = 0 | ||||
|         else: | ||||
|             #todo add why did picking fail, which should be saved in the pick dictionary | ||||
|             raise PickingFailedException("Why did it fail") | ||||
|             #todo why did picking fail should be saved in the pick dictionary | ||||
|             raise PickingFailedException('AIC P onset did not pass quality control') | ||||
| 
 | ||||
|     def pick_s_phase(self): | ||||
| 
 | ||||
| @ -748,6 +883,8 @@ class AutopickStation(object): | ||||
|             arhcf1 = ARHcf(h_copy, cuttimesh, self.s_params.tpred1h, self.s_params.Sarorder, self.s_params.tdet1h, self.p_params.addnoise) | ||||
|         elif self.s_params.algoS == 'AR3': | ||||
|             arhcf1 = AR3Ccf(h_copy, cuttimesh, self.s_params.tpred1h, self.s_params.Sarorder, self.s_params.tdet1h, self.p_params.addnoise) | ||||
|         # save cf for later plotting | ||||
|         self.arhcf1 = arhcf1 | ||||
| 
 | ||||
|         tr_arhaic = trH1_filt.copy() | ||||
|         tr_arhaic.data = arhcf1.getCF() | ||||
| @ -759,6 +896,8 @@ class AutopickStation(object): | ||||
|         # get preliminary onset time from AIC cf | ||||
|         fig, linecolor = get_fig_from_figdict(self.fig_dict, 'aicARHfig') | ||||
|         aicarhpick = AICPicker(haiccf, self.s_params.tsnrh, self.s_params.pickwinS, self.iplot, Tsmooth=self.s_params.aictsmoothS, fig=fig, linecolor=linecolor) | ||||
|         # save pick for later plotting | ||||
|         self.aicarhpick = aicarhpick | ||||
| 
 | ||||
|         # go on with processing if AIC onset passes quality control | ||||
|         slope = aicarhpick.getSlope() | ||||
| @ -767,7 +906,7 @@ class AutopickStation(object): | ||||
|             slope = 0 | ||||
| 
 | ||||
|         if slope >= self.s_params.minAICSslope and aicarhpick.getSNR() >= self.s_params.minAICSSNR and aicarhpick.getpick() is not None: | ||||
|             aicSflag = 1 | ||||
|             self.s_results.aicSflag = 1 | ||||
|             msg = 'AIC S-pick passes quality control: Slope: {0} counts/s, ' \ | ||||
|                   'SNR: {1}\nGo on with refined picking ...\n' \ | ||||
|                   'autopickstation: re-filtering horizontal traces ' \ | ||||
| @ -787,23 +926,31 @@ class AutopickStation(object): | ||||
|                 h_copy[0].data = trH1_filt.data | ||||
|                 h_copy[1].data = trH2_filt.data | ||||
|             elif self.s_params.algoS == 'AR3': | ||||
|                 trH1_filt, _ = self.prepare_wfstream(self.zstream, freqmin=self.s_params.bph2[0], freqmax=self.s_params.bph2[1]) | ||||
|                 trH2_filt, _ = self.prepare_wfstream(self.estream, freqmin=self.s_params.bph2[0], freqmax=self.s_params.bph2[1]) | ||||
|                 trH3_filt, _ = self.prepare_wfstream(self.nstream, freqmin=self.s_params.bph2[0], freqmax=self.s_params.bph2[1]) | ||||
|                 trH3_filt, _ = self.prepare_wfstream(self.zstream, freqmin=self.s_params.bph2[0], freqmax=self.s_params.bph2[1]) | ||||
|                 trH1_filt, _ = self.prepare_wfstream(self.estream, freqmin=self.s_params.bph2[0], freqmax=self.s_params.bph2[1]) | ||||
|                 trH2_filt, _ = self.prepare_wfstream(self.nstream, freqmin=self.s_params.bph2[0], freqmax=self.s_params.bph2[1]) | ||||
|                 h_copy = hdat.copy() | ||||
|                 h_copy[0].data = trH1_filt.data | ||||
|                 h_copy[1].data = trH2_filt.data | ||||
|                 h_copy[2].data = trH3_filt.data | ||||
|                 h_copy[0].data = trH3_filt.data | ||||
|                 h_copy[1].data = trH1_filt.data | ||||
|                 h_copy[2].data = trH2_filt.data | ||||
| 
 | ||||
|             # calculate second cd | ||||
|             # save filtered traces for plotting | ||||
|             self.estream_bph2 = trH1_filt | ||||
|             self.nstream_bph2 = trH2_filt | ||||
| 
 | ||||
|             # calculate second cf | ||||
|             if self.s_params.algoS == 'ARH': | ||||
|                 arhcf2 = ARHcf(h_copy, cuttimesh2, self.s_params.tpred2h, self.s_params.Sarorder, self.s_params.tdet2h, self.p_params.addnoise) | ||||
|             elif self.s_params.algoS == 'AR3': | ||||
|                 arhcf2 = AR3Ccf(h_copy, cuttimesh2, self.s_params.tpred2h, self.s_params.Sarorder, self.s_params.tdet2h, self.p_params.addnoise) | ||||
|             # save cf for later plotting | ||||
|             self.arhcf2 = arhcf2 | ||||
| 
 | ||||
|             # get refined onset time from CF2 | ||||
|             fig, linecolor = get_fig_from_figdict(self.fig_dict, 'refSpick') | ||||
|             refSpick = PragPicker(arhcf2, self.s_params.tsnrh, self.s_params.pickwinS, self.iplot, self.s_params.ausS, self.s_params.tsmoothS, aicarhpick.getpick(), fig, linecolor) | ||||
|             # save refSpick for later plotitng | ||||
|             self.refSpick = refSpick | ||||
|             self.s_results.mpickS = refSpick.getpick() | ||||
| 
 | ||||
|             if self.s_results.mpickS is not None: | ||||
| @ -861,30 +1008,6 @@ class AutopickStation(object): | ||||
|             print('autopickstation: No horizontal component data available or ' | ||||
|                   'bad P onset, skipping S picking!') | ||||
| 
 | ||||
|         ### plotting ### | ||||
|         # TODO finish converting the plotting code | ||||
|         if self.iplot > 0: | ||||
|             # plot vertical trace | ||||
|             if self.fig_dict is None: | ||||
|                 fig = plt.figure() | ||||
|                 plt_flag = 1 | ||||
|                 linecolor = 'k' | ||||
|             else: | ||||
|                 fig, linecolor = get_fig_from_figdict(self.fig_dict, 'mainFig') | ||||
|             fig._tight = True | ||||
|             ax1 = fig.add_subplot(311) | ||||
|             # create time axis | ||||
|             tdata = np.linspace(start=0., stop=self.ztrace.stats.npts*self.tr_filt_z.stats.delta, num=self.tr_filt_z.stats.npts) | ||||
|             # plot filtered waveform of z trace | ||||
|             ax1.plot(tdata, self.tr_filt_z.data / max(self.tr_filt_z.data), color=linecolor, linewidth=0.7, label='Data') | ||||
|             if self.p_results.Pweight < 4: | ||||
|                 # plot first HOS/ARZ cf of z trace | ||||
|                 ax1.plot(self.cf1.getTimeArray(), self.cf1.getCF / max(self.cf1.getCF()), color='b', label='CF1') | ||||
|                 if self.p_results.aicPflag == 1: | ||||
|                     ax1.plot(self.cf2.getTimeArray(), self.cf2.getCF() / max(self.cf2.getCF()), color='m', label='CF2') | ||||
|                     ax1.plot([self.p_results.aicpick.getpick(), self.p_results.aicpick.getpick()], [-1, 1], 'r', label='Initial P Onset') | ||||
| 
 | ||||
| 
 | ||||
| def get_fig_from_figdict(figdict, figkey): | ||||
|     """ | ||||
|     Helper method to extract a figure by name from dictionary | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user