def changeTime(*args, **kwargs): """ Change the times of the plot. """ timedict = {'-1 h' :-60 * 60, '-10 min' :-10 * 60, 'Current': 'NOW', '+10 min': 10 * 60, '+1 h': 60 * 60} timechange = timedict[args[0].widget.cget("text")] if isinstance(timechange, int): start = UTCDateTime(NV.starttime.get()) + timechange end = UTCDateTime(NV.endtime.get()) + timechange elif timechange == 'NOW': end = UTCDateTime() start = UTCDateTime() - 10 * 60 else: import pdb;pdb.set_trace() NV.starttime.set(start.strftime('%Y-%m-%dT%H:%M:%S')) NV.endtime.set(end.strftime('%Y-%m-%dT%H:%M:%S')) getWaveform()
def changeTime(*args, **kwargs): """ Change the times of the plot. """ timedict = { '-1 h': -60 * 60, '-10 min': -10 * 60, 'Current': 'NOW', '+10 min': 10 * 60, '+1 h': 60 * 60 } timechange = timedict[args[0].widget.cget("text")] if isinstance(timechange, int): start = UTCDateTime(NV.starttime.get()) + timechange end = UTCDateTime(NV.endtime.get()) + timechange elif timechange == 'NOW': end = UTCDateTime() start = UTCDateTime() - 10 * 60 else: import pdb pdb.set_trace() NV.starttime.set(start.strftime('%Y-%m-%dT%H:%M:%S')) NV.endtime.set(end.strftime('%Y-%m-%dT%H:%M:%S')) getWaveform()
def save_psd_data(self, psd_data, scnl): ''' Save the psd data to a file. ''' if not psd_data: return output_dir = self.pref_manager.get_value('output_dir') dir_name = os.path.join(output_dir, scnl[0]) if not os.path.exists(dir_name): os.mkdir(dir_name) first_time = UTCDateTime(sorted(psd_data.keys())[0]) filename = '%s_%s.psd' % (first_time.strftime('%Y%m%d'), '_'.join(scnl)) filename = os.path.join(dir_name, filename) db = shelve.open(filename) db['psd_data'] = psd_data db.close() self.logger.info("Saved PSD data in file %s.", filename)
def refTrigger(self, RefWaveform, phase, cfg_yaml): Config = self.Config cfg = ConfigObj(dict=Config) name = ('%s.%s.%s.%s') % (RefWaveform[0].stats.network, RefWaveform[0].stats.station, RefWaveform[0].stats.location, RefWaveform[0].stats.channel) i = self.searchMeta(name, self.StationMeta) de = loc2degrees(self.Origin, i) ptime = 0 Phase = cake.PhaseDef(phase) model = cake.load_model() if cfg_yaml.config_data.colesseo_input is True: arrivals = model.arrivals([de, de], phases=Phase, zstart=self.Origin.depth, zstop=0.) else: arrivals = model.arrivals([de, de], phases=Phase, zstart=self.Origin.depth*km, zstop=0.) try: ptime = arrivals[0].t except Exception: arrivals = model.arrivals([de, de], phases=Phase, zstart=self.Origin.depth*km-0.1) ptime = arrivals[0].t if ptime == 0: raise Exception("\033[31mILLEGAL: phase definition\033[0m") tw = self.calculateTimeWindows(ptime) if cfg_yaml.config_data.pyrocko_download is True: stP = self.readWaveformsPicker_pyrocko(i, tw, self.Origin, ptime, cfg_yaml) elif cfg_yaml.config_data.colesseo_input is True: stP = self.readWaveformsPicker_colos(i, tw, self.Origin, ptime, cfg_yaml) else: stP = self.readWaveformsPicker(i, tw, self.Origin, ptime, cfg_yaml) refuntouchname = os.path.basename(self.AF)+'-refstation-raw.mseed' stP.write(os.path.join(self.EventPath, refuntouchname), format='MSEED', byteorder='>') stP.filter("bandpass", freqmin=float(cfg_yaml.config_xcorr.refstationfreqmin), freqmax=float(cfg_yaml.config_xcorr.refstationfreqmax)) stP.trim(tw['xcorrstart'], tw['xcorrend']) trP = stP[0] trP.stats.starttime = UTCDateTime(3600) refname = os.path.basename(self.AF)+'-refstation-filtered.mseed' trP.write(os.path.join(self.EventPath, refname), format='MSEED', byteorder='>') sta = float(cfg_yaml.config_xcorr.refsta) lta = float(cfg_yaml.config_xcorr.reflta) cft = recSTALTA(trP.data, int(sta * trP.stats.sampling_rate), int(lta * trP.stats.sampling_rate)) t = triggerOnset(cft, lta, sta) try: onset = t[0][0] / trP.stats.sampling_rate except Exception: onset = self.mintforerun trigger = trP.stats.starttime+onset tdiff = (trP.stats.starttime + onset)-(UTCDateTime(3600) + self.mintforerun) refp = UTCDateTime(self.Origin.time)+ptime reftriggeronset = refp+onset-self.mintforerun if cfg_yaml.config_xcorr.autoxcorrcorrectur is True: refmarkername = os.path.join(self.EventPath, ('%s-marker') % (os.path.basename( self.AF))) fobjrefmarkername = open(refmarkername, 'w') fobjrefmarkername.write('# Snuffler Markers File Version\ 0.2\n') fobjrefmarkername.write(('phase: %s 0 %s None None None XWStart None False\n') % (tw['xcorrstart'].strftime('%Y-%m-%d %H:%M:%S.%f'), name)) fobjrefmarkername.write(('phase: %s 0 %s None None None XWEnd None False\n') % (tw['xcorrend'].strftime('%Y-%m-%d %H:%M:%S.%f'), name)) fobjrefmarkername.write(('phase: %s 1 %s None None None TheoP None False\n') % (refp.strftime('%Y-%m-%d %H:%M:%S.%f'), name)) fobjrefmarkername.write(('phase: %s 3 %s None None None XTrig None False') % (reftriggeronset.strftime('%Y-%m-%d %H:%M:%S.%f'), name)) fobjrefmarkername.close() cmd = 'snuffler %s --markers=%s&' % (os.path.join( self.EventPath, refuntouchname), refmarkername) os.system(cmd) thrOn = float(self.Config['reflta']) thrOff = float(self.Config['refsta']) plotTrigger(trP, cft, thrOn, thrOff) selection = float(input('Enter self picked phase in seconds: ')) tdiff = selection-self.mintforerun refname = os.path.basename(self.AF)+'-shift.mseed' trP.stats.starttime = trP.stats.starttime - selection trP.write(os.path.join(self.EventPath, refname), format='MSEED') ''' tdiff = 0 trigger = trP.stats.starttime ''' To = Trigger(name, trigger, os.path.basename(self.AF), tdiff) return tdiff, To
def refTrigger(self, RefWaveform): Config = self.Config cfg = ConfigObj(dict=Config) name = ('%s.%s.%s.%s') % ( RefWaveform[0].stats.network, RefWaveform[0].stats.station, RefWaveform[0].stats.location, RefWaveform[0].stats.channel) i = self.searchMeta(name, self.StationMeta) de = loc2degrees(self.Origin, i) ptime = 0 Phase = cake.PhaseDef('P') model = cake.load_model() if cfg.colesseo_input() == True: arrivals = model.arrivals([de, de], phases=Phase, zstart=self.Origin.depth, zstop=0.) else: arrivals = model.arrivals([de, de], phases=Phase, zstart=self.Origin.depth * km, zstop=0.) try: ptime = arrivals[0].t except: arrivals = model.arrivals([de, de], phases=Phase, zstart=o_depth * km - 0.1) ptime = arrivals[0].t phasename = ('%sphase') % (os.path.basename(self.AF)) if ptime == 0: print '\033[31mAvailable phases for reference station %s in range %f deegree\033[0m' % ( i, de) print '\033[31m' + '|'.join( [str(item['phase_name']) for item in tt]) + '\033[0m' print '\033[31myou tried phase %s\033[0m' % ( self.Config[phasename]) raise Exception("\033[31mILLEGAL: phase definition\033[0m") tw = self.calculateTimeWindows(ptime) if cfg.pyrocko_download() == True: stP = self.readWaveformsPicker_pyrocko(i, tw, self.Origin, ptime) elif cfg.colesseo_input() == True: stP = self.readWaveformsPicker_colos(i, tw, self.Origin, ptime) else: stP = self.readWaveformsPicker(i, tw, self.Origin, ptime) refuntouchname = os.path.basename(self.AF) + '-refstation-raw.mseed' stP.write(os.path.join(self.EventPath, refuntouchname), format='MSEED', byteorder='>') stP.filter("bandpass", freqmin=float(self.Config['refstationfreqmin']), freqmax=float(self.Config['refstationfreqmax'])) stP.trim(tw['xcorrstart'], tw['xcorrend']) trP = stP[0] trP.stats.starttime = UTCDateTime(3600) refname = os.path.basename(self.AF) + '-refstation-filtered.mseed' trP.write(os.path.join(self.EventPath, refname), format='MSEED', byteorder='>') sta = float(self.Config['refsta']) lta = float(self.Config['reflta']) cft = recSTALTA(trP.data, int(sta * trP.stats.sampling_rate), int(lta * trP.stats.sampling_rate)) t = triggerOnset(cft, lta, sta) try: onset = t[0][0] / trP.stats.sampling_rate print 'ONSET ', onset except: onset = self.mintforerun trigger = trP.stats.starttime + onset print 'TRIGGER ', trigger print 'THEORETICAL: ', UTCDateTime(3600) + self.mintforerun tdiff = (trP.stats.starttime + onset) - (UTCDateTime(3600) + self.mintforerun) print 'TDIFF: ', tdiff refp = UTCDateTime(self.Origin.time) + ptime reftriggeronset = refp + onset - self.mintforerun if int(self.Config['autoxcorrcorrectur']) == 1: try: refmarkername = os.path.join(self.EventPath, ('%s-marker') % (os.path.basename(self.AF))) fobjrefmarkername = open(refmarkername, 'w') fobjrefmarkername.write( '# Snuffler Markers File Version 0.2\n') fobjrefmarkername.write(( 'phase: %s 0 %s None None None XWStart None False\n' ) % (tw['xcorrstart'].strftime('%Y-%m-%d %H:%M:%S.%f'), name)) fobjrefmarkername.write(( 'phase: %s 0 %s None None None XWEnd None False\n' ) % (tw['xcorrend'].strftime('%Y-%m-%d %H:%M:%S.%f'), name)) fobjrefmarkername.write(( 'phase: %s 1 %s None None None TheoP None False\n' ) % (refp.strftime('%Y-%m-%d %H:%M:%S.%f'), name)) fobjrefmarkername.write(( 'phase: %s 3 %s None None None XTrig None False' ) % (reftriggeronset.strftime('%Y-%m-%d %H:%M:%S.%f'), name)) fobjrefmarkername.close() cmd = 'snuffler %s --markers=%s&' % (os.path.join( self.EventPath, refuntouchname), refmarkername) os.system(cmd) thrOn = float(self.Config['reflta']) # 4 thrOff = float(self.Config['refsta']) # 0.7 plotTrigger(trP, cft, thrOn, thrOff) selection = float( raw_input('Enter self picked phase in seconds: ')) tdiff = selection - self.mintforerun refname = os.path.basename(self.AF) + '-shift.mseed' trP.stats.starttime = trP.stats.starttime - selection trP.write(os.path.join(self.EventPath, refname), format='MSEED') except: selection = 0. refname = os.path.basename(self.AF) + '-shift.mseed' trP.stats.starttime = trP.stats.starttime - selection - self.mintforerun trP.write(os.path.join(self.EventPath, refname), format='MSEED') ''' tdiff = 0 trigger = trP.stats.starttime ''' To = Trigger(name, trigger, os.path.basename(self.AF), tdiff) return tdiff, To
##spec = os.path.join(outdir, 'spec.png') ##specband = os.path.join(outdir, 'spec-band.png') # ##mseedloc = '/opt/data/archive/' + str(yr) + '/' + net + '/' + sta + '/' + ch + '.D/' + net + '.' + sta + '.' + loc + '.' + ch + '.D.' + day # ## read meta values from miniseed ##st = read(mseedloc) temp = (UTCDateTime(now) - 86400) temp1 = UTCDateTime(now) yr1 = temp.strftime("%Y") month1 = temp.strftime("%m") day1 = temp.strftime("%d") hr1 = temp.strftime("%H") #min1 = temp.strftime("%M") yr2 = temp1.strftime("%Y") month2 = temp1.strftime("%m") day2 = temp1.strftime("%d") hr2 = temp1.strftime("%H") min2 = temp1.strftime("%M") sec2 = temp1.strftime("%S") os.system( 'echo "%s,%s,%s,%s,00,00,00 %s,%s,%s,%s,%s,%s,00 O* * * *Z" | capstool -H 10.27.192.71:18002 -o temp.mseed' % (yr1, month1, day1, hr1, yr2, month2, day2, hr2, min2, sec2)) ## ##st = read('temp.mseed') #start = UTCDateTime(temp) #start = UTCDateTime(datetime(temp.year,temp.month,temp.day,temp.hour,0,0)) #end = UTCDateTime(temp1) # #tr = client.get_waveforms(network='OK', station='FNO',
class TSScene(QGraphicsScene): starttimechanged = pyqtSignal(str) endtimechanged = pyqtSignal(str) def __init__(self, parent, width=14, height=12, numofchannel=6): super(TSScene, self).__init__(parent) # set waveform windows figure = Figure() figure.set_size_inches(width, height) self.graphwidth = figure.dpi * width self.canvas = FigureCanvas(figure) self.addWidget(self.canvas) self.canvas.mpl_connect('button_press_event',self.button_press_event) self.canvas.mpl_connect('button_release_event', self.button_release_event) self.canvas.mpl_connect('motion_notify_event', self.motion_notify_event) self.canvas.mpl_connect('scroll_event', self.scroll_event) self.axesavailability = [True for i in range(numofchannel)] self.axes = [] for i in range(numofchannel): self.axes.append(figure.add_subplot(str(numofchannel)+'1'+str(i+1))) # set backend data model self.data = TSData() self.visibleWave = {} self.starttime = None self.endtime = None # prepare for user input self.downxcoord = None self.wheelactive = False self.rect = None self.installEventFilter(self) self.showgap = False self.downbutton = None self.currentxdata = None self.count = 0 self.state = 'ready' self.timeline = QTimeLine(1) self.timeline.setCurrentTime(0) self.timeline.setUpdateInterval(1) self.timeline.finished.connect(self.timeshift) self.timeline.finished.connect(self.animfinished) def animfinished(self): self.state = 'ready' self.timeline.setCurrentTime(0) def togglegap(self): self.showgap = ~self.showgap tmplist = self.visibleWave.copy() for wave in tmplist: self.refreshwave(wave,tmplist[wave][1]) # self.togglewave(wave) # self.togglewave(wave, tmplist[wave][1]) def applytime(self, start: str, end: str): if self.data is None: return for wave in self.visibleWave: if start<self.visibleWave[wave][3]: start = self.visibleWave[wave][3] if end>self.visibleWave[wave][4]: end = self.visibleWave[wave][4] self.starttime = UTCDateTime(start) self.endtime = UTCDateTime(end) print((self.starttime, self.endtime, '-----------------')) tmplist = self.visibleWave.copy() for wave in tmplist: self.refreshwave(wave, tmplist[wave][1]) # self.togglewave(wave) # self.togglewave(wave, tmplist[wave][2]) def loadfile(self, filename: str): self.data.loadFile(filename) def getlist(self): return self.data.getlist() def getsegments(self, item: object): waves = self.data.getsegments(item.text(0)) wavelist = QListWidget() for w in waves: wavelist.addItem(w) # print(w) wavelist.itemDoubleClicked.connect(self.segmentselected) wavelistwindowlayout = QVBoxLayout() wavelistwindowlayout.addWidget(wavelist) self.wavelistwindow = QDialog(self.parent()) self.wavelistwindow.setWindowTitle('segments') self.wavelistwindow.setLayout(wavelistwindowlayout) self.wavelistwindow.resize(800,600) self.wavelistwindow.show() self.segmentsource = item.text(0) self.currentitem = item def segmentselected(self, segment: str): matches = re.match(r'[^ ]+ \| ([^ ]+) - ([^ ]+) \| .*', segment.text(), flags=0) start = UTCDateTime(matches.group(1)) end = UTCDateTime(matches.group(2)) print(start) print(end) if self.segmentsource in self.visibleWave: self.applytime(start, end) else: self.starttime = start self.endtime = end print((self.segmentsource)) self.togglewave(self.segmentsource) self.currentitem.setSelected(True) def refreshwave(self, wave: str, colorcode:int=0): if wave in self.visibleWave: axes, lines, _, _, _, _ = self.visibleWave[wave] self.removewave(axes, lines) self.visibleWave.pop(wave, None) channelid = self.axes.index(axes) self.axesavailability[channelid] = True waveform, wavename, starttime, endtime, gaps = self.data.getwaveform(wave, self.starttime, self.endtime) axes, lines = self.displaywave(wavename, waveform, gaps) if axes is not None: self.visibleWave[wave] = (axes, lines, colorcode, starttime, endtime, gaps) def hidewave(self, wave: str, colorcode:int=0): if wave in self.visibleWave: axes, lines, _, _, _, _ = self.visibleWave[wave] self.removewave(axes, lines) self.visibleWave.pop(wave, None) channelid = self.axes.index(axes) self.axesavailability[channelid] = True if len(self.visibleWave)==0: self.starttime = None self.endtime = None return True def showwave(self, wave: str, starttime=None, endtime=None): if starttime is None or endtime is None: if wave in self.visibleWave: pass else: self.togglewave(wave) else: self.starttime = starttime self.endtime = endtime tmplist = self.visibleWave.copy() for wave in tmplist: self.refreshwave(wave, tmplist[wave][1]) if wave not in self.visibleWave: self.togglewave(wave) def togglewave(self, wave: str, colorcode:int=0): if wave in self.visibleWave: axes, lines, _, _, _, _ = self.visibleWave[wave] self.removewave(axes, lines) self.visibleWave.pop(wave, None) channelid = self.axes.index(axes) self.axesavailability[channelid] = True if len(self.visibleWave)==0: self.starttime = None self.endtime = None else: # print(wave) waveform, wavename, starttime, endtime, gaps = self.data.getwaveform(wave, self.starttime, self.endtime) print((starttime, endtime)) axes, lines = self.displaywave(wavename, waveform, gaps) if axes is not None: self.visibleWave[wave] = (axes, lines, colorcode, starttime, endtime, gaps) #print("togglewave:", starttime, endtime) def displaywave(self, wavename: str, waveform: np.array, gaps, colorcode: int=None): if True not in self.axesavailability: return None, None else: location = self.axesavailability.index(True) axes = self.axes[location] self.axesavailability[location] = False if wavename is not None and waveform is not None: if colorcode is None: colorcode = 'C'+str(location%10) times = waveform[0,:] span = round(len(times)/4) if span<1: span = 1 axes.set_xticks(times[::span]) axes.set_xticklabels([UTCDateTime(t).strftime("%Y-%m-%d %H:%M:%S") for t in times[::span]]) lines = axes.plot(times, waveform[1,:],linestyle="-", label=wavename, color=colorcode) if self.showgap: for g in gaps: if g[4].timestamp>=times[0] and g[5].timestamp<times[-1]: axes.axvspan(g[4],g[5],facecolor='0.2',alpha=0.5) axes.legend() self.canvas.draw() if self.endtime is not None and self.starttime is not None and len(times)>0: timewindow = self.endtime-self.starttime if abs(times[0]-times[-1]-timewindow)/timewindow<0.1: self.starttime = UTCDateTime(times[0]) self.endtime = self.starttime + timewindow elif len(times)>0: self.starttime = UTCDateTime(times[0]) self.endtime = UTCDateTime(times[-1]) self.starttimechanged.emit(self.starttime.strftime("%Y-%m-%d %H:%M:%S")) self.endtimechanged.emit(self.endtime.strftime("%Y-%m-%d %H:%M:%S")) return axes, lines else: lines = None axes.legend([wavename]) return axes, lines def removewave(self, axes: Axes, lines: Line2D): if lines is not None: lines.pop(0).remove() axes.relim() axes.autoscale_view(True, True, True) axes.clear() self.canvas.draw() def timeshift(self): if self.downxcoord is None or self.currentxdata is None: return shift = self.downxcoord-self.currentxdata if shift == 0: print('skipped') return if self.starttime is None: return starttime = self.starttime + shift endtime = self.endtime + shift for wave in self.visibleWave: if starttime<self.visibleWave[wave][3]: starttime = self.visibleWave[wave][3] if endtime>self.visibleWave[wave][4]: endtime = self.visibleWave[wave][4] if starttime!=self.starttime and endtime!=self.endtime: self.starttime = starttime self.endtime = endtime tmplist = self.visibleWave.copy() for wave in tmplist: self.refreshwave(wave, tmplist[wave][1]) # self.togglewave(wave) # self.togglewave(wave, tmplist[wave][2]) return def timescale(self, delta: float): if self.starttime is None: return shift = (self.endtime - self.starttime) * -delta*0.1 starttime = self.starttime + shift endtime = self.endtime - shift for wave in self.visibleWave: if starttime<self.visibleWave[wave][3]: starttime = self.starttime if endtime>self.visibleWave[wave][4]: endtime = self.endtime if endtime-starttime<0.1: pass elif starttime==self.starttime and endtime==self.endtime: pass else: self.starttime = starttime self.endtime = endtime tmplist = self.visibleWave.copy() for wave in tmplist: self.refreshwave(wave, tmplist[wave][1]) # self.togglewave(wave) # self.togglewave(wave, tmplist[wave][1]) def button_press_event(self, event): if self.starttime is None: return self.downxcoord = event.xdata self.downx = event.x self.downbutton = event.button self.count = 0 def motion_notify_event(self, event): # print(event.button, self.starttime, self.downbutton, self.downxcoord, event.xdata) self.count += 1 self.currentxdata = event.xdata #print(self.currentxdata,"+" * 10) if self.starttime is None: return elif self.downxcoord is not None: if self.downbutton == 1 and self.timeline.currentTime()==0: self.state = 'busy' self.timeline.start() elif self.downbutton == 1: pass elif self.downbutton == 3: if self.rect is not None: self.removeItem(self.rect) if self.downx < event.x: self.rect = self.addRect(self.downx, 0, event.x - self.downx, self.height(), pen=QPen(Qt.red)) else: self.rect = self.addRect(event.x, 0, self.downx - event.x, self.height(), pen=QPen(Qt.red)) def button_release_event(self, event): if self.starttime is None: return if event.button == 3: left = 225 right = 1215 if self.downxcoord < event.xdata: start = self.downxcoord end = event.xdata else: start = event.xdata end = self.downxcoord start = UTCDateTime(start) end = UTCDateTime(end) print((start,end,'================')) self.applytime(start, end) # self.downx = None self.downbutton = None self.removeItem(self.rect) self.rect = None self.downxcoord = None self.currentxdata = None #print(self.count,'count!!!!!!!!') self.count=0 def scroll_event(self, event): delta = -event.step if self.wheelactive==False and event.xdata>= self.starttime and event.xdata<= self.endtime: self.wheelactive = True self.timescale(delta) self.wheelactive = False def exportmetadata(self, filename: tuple): wavelist = self.getlist() outfile = open(filename[0]+'.txt','w') for network in wavelist: for station in wavelist[network]: for wave in wavelist[network][station]: for w in wavelist[network][station][wave]: outfile.write("%s\n\n" % w) outfile.close() def exportwaveform(self, filename: tuple): traces = [] for wave in self.visibleWave: fill_value = 'last' waveform, wavename, starttime, endtime, gaps = self.data.readdisc(wave, self.starttime, self.endtime, resample=False, fill_value=fill_value) traces.append(waveform) stream = Stream(traces=traces) if 'MSEED' in filename[1]: stream.write(filename[0] + ".mseed", format='MSEED') elif 'txt' in filename[1]: stream.write(filename[0] + ".txt", format='TSPAIR') def gettimeboundary(self): return self.starttime, self.endtime return False