Changeset 1092


Ignore:
Timestamp:
10.01.2016 02:51:38 (4 years ago)
Author:
klaus
Message:

module with analysis parameters (phases); command to manage phases; graphical phase picks generate commands via message system

Location:
SHX/trunk/SeismicHandler
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • SHX/trunk/SeismicHandler/commands/meta.py

    r1077 r1092  
    1111from SeismicHandler.config import Settings 
    1212from SeismicHandler.basics import timeit 
     13from SeismicHandler.basics.error import ShxError 
    1314from obspy.fdsn.client import Client 
    1415 
  • SHX/trunk/SeismicHandler/modules/parse.py

    r1071 r1092  
    2020import sys 
    2121import re 
     22import StringIO 
    2223import inspect 
    2324import traceback 
     
    343344            else: 
    344345                skipped += 1 
    345  
     346         
    346347        self.content = content 
    347348        self.targets = targets 
     
    611612                kwargs=cmd["shx_qualifiers"] 
    612613            ) 
     614 
     615class MessageFeed: 
     616    "Read commands from message system." 
     617 
     618    def __init__( self ): 
     619        #self.cnt = 0 
     620        #self.cmdbuf = {} 
     621        msgs.subscribe(self._message_cmd, "ui.command") 
     622     
     623    def _message_cmd( self, name, cmd ): 
     624        #self.cnt += 1 
     625        #self.cmdbuf[self.cnt] = (name,cmd) 
     626        #print "dbg: _message_cmd:", name, cmd 
     627        s = Script( StringIO.StringIO(cmd+'\nreturn\n'), Symbol(), Switches() ) 
     628        s.run() 
     629     
     630    #def readMessageCmd( self ): 
     631    #    if len(self.cmdbuf) == 0: 
     632    #        return None 
     633    #    idx = min( self.cmdbuf.keys() ) 
     634    #    name, cmd = self.cmdbuf.pop(idx) 
     635    #    return cmd 
     636     
     637     
    613638 
    614639 
     
    11241149 
    11251150history_called = False 
     1151messagefeed = MessageFeed() 
    11261152 
    11271153if __name__ == "__main__": 
  • SHX/trunk/SeismicHandler/modules/wx_.py

    r1091 r1092  
    1515from SeismicHandler.basics.codes import NAME, VERSION 
    1616from SeismicHandler.basics.tools import AttributeBlock, timeit 
     17from SeismicHandler.basics.analysispar import PhaseList 
    1718from obspy.core import read, UTCDateTime 
    1819from obspy.sh.core import fromUTCDateTime 
     
    122123        if MARGINS != margins: 
    123124            MARGINS = margins 
     125     
     126    def _sendShCommand( self, cmdstring, name="default" ): 
     127        "Send command to command line interpreter." 
     128        msgs.sendMessage("ui.command", cmd=cmdstring, name=name ) 
     129     
     130    def closePhase( self, trace, abstime ): 
     131        "Return name and type of closest phase or None." 
     132        phaselist = PhaseList() 
     133        if not self.pixel_duration: 
     134            return None 
     135        toltime = 2*self.pixel_duration 
     136        station = "%s.%s" % (trace.stats.network,trace.stats.station) 
     137        for phase in phaselist.getPhaseList(station): 
     138            tdiff = abs( phase.picktime-abstime ) 
     139            if tdiff < toltime: 
     140                return (phase.name,phaselist.picktypeName(phase.picktype)) 
     141        return None 
    124142 
    125143    # event processing 
    126144    def OnMouseWheel(self, evt): 
     145        print "dbg: mouse wheel" 
    127146        pass 
    128147 
     
    135154 
    136155    def OnMouseLeftDouble(self, evt): 
    137         trace, _ = self.ScreenToTraceAndTime(*(evt.GetPositionTuple())) 
     156        trace, tracetime = self.ScreenToTraceAndTime(*(evt.GetPositionTuple())) 
    138157        if trace: 
    139158            self.mousedouble = True 
     159        #    print "dbg: closePhase", self.closePhase(trace,tracetime) 
     160        #    cphase = self.closePhase( trace, tracetime ) 
     161        #    if cphase: 
     162        #        station = "%s.%s" % (trace.stats.network,trace.stats.station) 
     163        #        self._sendShCommand( 
     164        #            "phase clear %s %s %s" % (cphase[0],station,cphase[1]) 
     165        #        ) 
    140166        evt.Skip() 
    141167 
    142168    def OnMouseRightDouble(self, evt): 
     169        print "dbg: right double click" 
    143170        self.zoomwdwwidth = 0. 
    144171        evt.Skip() 
     
    146173    def OnMouseLeftDown(self, evt): 
    147174        self._captureMouse(evt) 
     175        trace, tracetime = self.ScreenToTraceAndTime(*(evt.GetPositionTuple())) 
     176        if trace: 
     177            self.mousedouble = True 
     178            cphase = self.closePhase( trace, tracetime ) 
     179            if cphase: 
     180                station = "%s.%s" % (trace.stats.network,trace.stats.station) 
     181                self._sendShCommand( 
     182                    "phase clear %s %s %s" % (cphase[0],station,cphase[1]) \ 
     183                    +"\nphase default_phase %s" % cphase[0] 
     184                ) 
     185            self._drawPicksAndZoom() 
    148186        evt.Skip() 
    149187 
     
    159197        else: 
    160198            self.zoomwdwwidth = 0 
    161         self._debug( "dbg: zoomwdwwidth %f" % self.zoomwdwwidth ) 
    162199 
    163200    def OnMouseMotion(self, evt): 
     
    274311            self.dragStart = None 
    275312 
    276 #        print "up", self.mousedouble 
    277313        if self.mousedouble: 
    278314            self.mousedouble = False 
    279315 
    280316        x, y = evt.GetPositionTuple() 
     317        trace, tracetime = self.ScreenToTraceAndTime(x, y) 
    281318        if self.interactive == "trace_time": 
    282             self.parent._user_selection = self.ScreenToTraceAndTime(x, y) 
     319            self.parent._user_selection = (trace, tracetime) 
    283320        elif self.interactive == "relative": 
    284321            self.parent._user_selection = self.ScreenToRelativeTime(x, y) 
    285322        else: 
    286323            raise NameError("unknown selection mode") 
     324         
     325        # Send SH command. 
     326        if trace: 
     327            station = "%s.%s" % (trace.stats.network,trace.stats.station) 
     328            self._sendShCommand( "phase define %s %s ;;; %s" % (station, 
     329                fromUTCDateTime(tracetime),trace.stats.channel[-1]), 
     330                name="mouse evt" ) 
     331 
    287332        evt.Skip() 
    288  
    289 #        print trace, timestamp 
    290 #        if not trace: 
    291 #            evt.Skip() 
    292 #            return 
    293 # 
    294 #        if "picks" not in trace.shx: 
    295 #            trace.shx.picks = AttribDict() 
    296 # 
    297 #        if "manual" not in trace.shx.picks: 
    298 #            trace.shx.picks.manual = {} 
    299 # 
    300 #        trace.shx.picks.manual[self.phasename] = timestamp 
    301 #        msg = "phase '%s' associated to %s at %s" % ( 
    302 #                self.phasename, 
    303 #                trace.id, 
    304 #                fromUTCDateTime(timestamp) 
    305 #        ) 
    306 # 
    307 #        self.parent.SetStatusText(msg) 
    308 #        self._debug(msg) 
    309 #        self._drawPicksAndZoom() 
    310333 
    311334    def OnScroll(self, evt): 
     
    543566 
    544567        if self.relativeAxis: 
    545             start = trace.stats.starttime 
    546             end = trace.stats.endtime 
     568            #start = trace.stats.starttime 
     569            #end = trace.stats.endtime 
    547570            pixel_width = shx_graphics.PlotPixels 
    548571        else: 
    549             start = self.start 
    550             end = self.end 
     572            #start = self.start 
     573            #end = self.end 
    551574 
    552575            # horizontal 
     
    557580                pixel_width = self.height - STATION_INFO - MARGINS[0] - MARGINS[2] 
    558581 
     582        zerotime = trace.stats.starttime - trace.get_info("t-origin") 
     583        reltime = time - zerotime 
     584         
     585        if self.timewindow[1] == None: 
     586            start = self.relstart 
     587            end = self.relend 
     588        else: 
     589            start = self.timewindow[0] 
     590            end = self.timewindow[1] 
     591 
    559592        # relative position inside trace window 
    560         relpos = (time - start) / (end - start) * pixel_width 
     593        relpos = (reltime - start) / (end - start) * pixel_width 
     594        print "dbg: relpos, start, end, time", relpos, start, end, time 
    561595 
    562596        # horizontal 
     
    645679        self.CaptureMouse() 
    646680 
    647         # create overlay 
    648         dc = wx.ClientDC(self) 
    649         odc = wx.DCOverlay(self.overlay_drag, dc) 
    650         odc.Clear() 
     681        ## create overlay 
     682        #dc = wx.ClientDC(self) 
     683        #odc = wx.DCOverlay(self.overlay_drag, dc) 
     684        #odc.Clear() 
    651685 
    652686        self.dragStart = evt.GetPosition() 
     
    657691        self.ReleaseMouse() 
    658692 
    659         # restore view 
    660         dc = wx.ClientDC(self) 
    661         odc = wx.DCOverlay(self.overlay_drag, dc) 
    662         odc.Clear() 
    663         del odc 
     693        ## restore view 
     694        #dc = wx.ClientDC(self) 
     695        #odc = wx.DCOverlay(self.overlay_drag, dc) 
     696        #odc.Clear() 
     697        #del odc 
    664698        self.overlay_drag.Reset() 
    665699 
     
    671705        Draw picks. 
    672706        """ 
    673         _picks = [] 
    674         for t in self.traces: 
    675             if 'picks' not in t.shx.keys(): 
    676                 #continue 
    677                 picks = [] 
    678             else: 
    679                 picks = t.shx.picks 
    680             #try: 
    681             #    picks = t.shx.picks 
    682             #except KeyError: 
    683             #    continue 
    684  
    685             for mode in picks: 
    686                 for pick in picks[mode]: 
    687                     _picks.append( 
    688                         [mode, pick, 
    689                          self.TraceAndTimeToScreen(t, picks[mode][pick])] 
    690                     ) 
     707        phaselist = PhaseList() 
     708        _picks = {} 
     709        for trc in self.traces: 
     710            sname = "%s.%s" % (trc.stats.network,trc.stats.station) 
     711            for phase in phaselist.getPhaseList(sname): 
     712                if phase.comp and trc.stats.channel[-1] != phase.comp: 
     713                    continue 
     714                pcol = phaselist.picktypeColor( phase.picktype ) 
     715                if pcol not in _picks.keys(): 
     716                    _picks[pcol] = [] 
     717                _picks[pcol].append( 
     718                    (phase.name,self.TraceAndTimeToScreen(trc,phase.picktime)) 
     719                ) 
    691720 
    692721        if not _picks and not self.ZoomWindow: 
     
    695724        dc = wx.ClientDC(self) 
    696725        # odc disables redraw 
    697         odc = wx.DCOverlay(self.overlay_picks, dc) 
    698         odc.Clear() 
     726        #odc = wx.DCOverlay(self.overlay_picks, dc) 
     727        #odc.Clear() 
    699728        dc.SetBrush(wx.TRANSPARENT_BRUSH) 
    700729 
    701730        th2 = self.traceheight / 2 
    702731        # draw picks 
    703         for pick in _picks: 
    704             color = "Red" 
    705             dc.SetPen(wx.Pen(color, 1)) 
    706             dc.SetTextForeground(color) 
    707             if self.traceOrder in [0, 1]: 
    708                 dc.DrawLine( 
    709                     pick[2][0], pick[2][1] - th2, 
    710                     pick[2][0], pick[2][1] + th2 
    711                 ) 
    712                 dc.DrawText(pick[1], pick[2][0] + 2, pick[2][1] - th2 + 2) 
    713             elif self.traceOrder in [2, 3]: 
    714                 dc.DrawLine( 
    715                     pick[2][0] - th2, pick[2][1], 
    716                     pick[2][0] + th2, pick[2][1], 
    717                 ) 
    718                 dc.DrawRotatedText(pick[1], pick[2][0] - th2 + 2, 
    719                                                             pick[2][1] - 2, 90) 
     732        for pcolor in _picks.keys(): 
     733            dc.SetPen(wx.Pen(pcolor, 1)) 
     734            dc.SetTextForeground(pcolor) 
     735            for pick in _picks[pcolor]: 
     736                if self.traceOrder in [0, 1]: 
     737                    dc.DrawLine( 
     738                        pick[1][0], pick[1][1] - th2, 
     739                        pick[1][0], pick[1][1] + th2 
     740                    ) 
     741                    dc.DrawText(pick[0], pick[1][0] + 2, pick[1][1] - th2 + 2) 
     742                elif self.traceOrder in [2, 3]: 
     743                    dc.DrawLine( 
     744                        pick[1][0] - th2, pick[1][1], 
     745                        pick[1][0] + th2, pick[1][1], 
     746                    ) 
     747                    dc.DrawRotatedText(pick[0], pick[1][0] - th2 + 2, 
     748                                                            pick[1][1] - 2, 90) 
     749        #del odc 
    720750 
    721751        #draw zoom window 
     
    735765                self.ZoomWindow = None 
    736766 
    737         del odc 
    738767 
    739768    #@timeit 
Note: See TracChangeset for help on using the changeset viewer.