Changeset 1117 for SHX


Ignore:
Timestamp:
01/15/16 18:16:48 (4 years ago)
Author:
klaus
Message:

analysisparameters, command param; more menu entries

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

Legend:

Unmodified
Added
Removed
  • SHX/trunk/SeismicHandler/basics/analysispar.py

    r1101 r1117  
    44#    license information please see license.txt and visit 
    55#    http://www.seismic-handler.org/portal/wiki/Shx/LicenseTerms 
     6# 
     7# K. Stammler, 8-Jan-2016 
    68 
    79""" 
     
    911""" 
    1012 
    11  
     13import pickle 
    1214from SeismicHandler.basics import Singleton 
    13  
     15from SeismicHandler.basics.error import ShxError 
     16from obspy.core import UTCDateTime 
     17from obspy.sh.core import toUTCDateTime, fromUTCDateTime 
    1418 
    1519PICKTYPE_MANUAL = 1 
     
    3337} 
    3438 
     39 
     40#------------------------------------------------------------------------------- 
    3541 
    3642 
     
    4955        # phase weight 
    5056        self.weight = weight 
     57 
     58 
     59#------------------------------------------------------------------------------- 
    5160 
    5261 
     
    193202 
    194203 
    195 if __name__ == "__main__": 
    196     phaselist = PhaseList() 
     204#------------------------------------------------------------------------------- 
     205 
     206 
     207class AnalysisPar: 
     208    "Holds analysis parameters. Updated via command line interface." 
     209 
     210    __metaclass__ = Singleton 
     211 
     212    # Definition of parameter types. 
     213    pardef = { 
     214        # analysis results 
     215        'fk_slowness'     : ('float',     None), 
     216        'fk_azimuth'      : ('float',     None), 
     217        'epi_latitude'    : ('float',     None), 
     218        'epi_longitude'   : ('float',     None), 
     219        # processing parameters 
     220        'read_time'       : ('datetime',  None), 
     221        'fdsn_server'     : ('string',    'bgr'), 
     222        'fk_max_slowness' : ('float',     15.0), 
     223        'fk_min_req'      : ('float',     0.4), 
     224        'fk_max_freq'     : ('float',     3.0), 
     225    } 
     226 
     227    def __init__( self ): 
     228        self.pardict = {} 
     229        for name in self.pardef.keys(): 
     230            self.pardict[name] = self.pardef[name][1] 
     231     
     232    def setValueFromString( self, parname, value ): 
     233        "Set parameter value according to given types." 
     234        if not parname in self.pardict.keys(): 
     235            raise ShxError( "unknown analysis parameter '%s'" % parname ) 
     236        partype = self.pardef[parname][0] 
     237        if partype == 'datetime': 
     238            try: 
     239                self._setValue( parname, toUTCDateTime(value) ) 
     240            except: 
     241                raise ShxError( "cannot parse time '%s'" % value ) 
     242        elif partype == 'string': 
     243            self._setValue( parname, value ) 
     244        elif partype == 'float': 
     245            try: 
     246                self._setValue( parname, float(value) ) 
     247            except: 
     248                raise ShxError( "need float here '%s'" % value ) 
     249        elif partype == 'int': 
     250            try: 
     251                self._setValue( parname, int(value) ) 
     252            except: 
     253                raise ShxError( "need int here '%s'" % value ) 
     254        else: 
     255            print "Program Bug: illegal parameter type '%s'" \ 
     256                % self.partype[parname] 
     257     
     258    def _setValue( self, parname, value ): 
     259        "Set parameter value. Value to be set over command line only." 
     260        if not parname in self.pardict.keys(): 
     261            raise ShxError( "unknown analysis parameter '%s'" % parname ) 
     262        self.pardict[parname] = value 
     263     
     264    def getValue( self, parname ): 
     265        "Get parameter value." 
     266        if not parname in self.pardict.keys(): 
     267            raise ShxError( "unknown analysis parameter '%s'" % parname ) 
     268        return self.pardict[parname] 
     269     
     270    def getValueAsString( self, parname ): 
     271        "Return current parameter value." 
     272        if not parname in self.pardict.keys(): 
     273            raise ShxError( "unknown analysis parameter '%s'" % parname ) 
     274        partype = self.pardef[parname][0] 
     275        if partype == 'datetime': 
     276            try: 
     277                return fromUTCDateTime( self.getValue(parname) ) 
     278            except: 
     279                return "" 
     280        elif partype == 'string': 
     281            return self.getValue( parname ) 
     282        elif partype == 'float': 
     283            try: 
     284                return "%g" % self.getValue(parname) 
     285            except: 
     286                return "" 
     287        elif partype == 'int': 
     288            try: 
     289                return "%d" % self.getValue(parname) 
     290            except: 
     291                return "" 
     292        else: 
     293            print "Program Bug: illegal parameter type '%s'" \ 
     294                % self.partype[parname] 
     295     
     296    def dump( self ): 
     297        ret = "" 
     298        for name in self.pardict.keys(): 
     299            ret += "%s\t%s\n" % (name,self.getValueAsString(name)) 
     300        return ret 
     301     
     302    def save( self, fname ): 
     303        fp = open( fname, 'w' ) 
     304        pickle.dump( analysispar.pardict, fp ) 
     305        pickle.dump( phaselist.phasedict, fp ) 
     306        fp.close() 
     307     
     308    def load( self, fname ): 
     309        global phaselist, analysispar 
     310        fp = open( fname ) 
     311        analysispar.pardict = pickle.load( fp ) 
     312        phaselist.phasedict = pickle.load( fp ) 
     313        fp.close() 
     314         
     315 
     316 
     317#------------------------------------------------------------------------------- 
     318 
     319phaselist = PhaseList() 
     320analysispar = AnalysisPar() 
     321 
  • SHX/trunk/SeismicHandler/modules/wx_.py

    r1116 r1117  
    99import time 
    1010import math 
     11import os 
    1112from SeismicHandler.basics.messages import msgs, subscribe_ui_event, \ 
    1213                                            log_message, get_style#, get_runtime 
     
    1516from SeismicHandler.basics.codes import NAME, VERSION 
    1617from SeismicHandler.basics.tools import AttributeBlock, timeit 
    17 from SeismicHandler.basics.analysispar import PhaseList 
     18from SeismicHandler.basics.analysispar import PhaseList, AnalysisPar 
    1819from obspy.core import read, UTCDateTime 
    1920from obspy.sh.core import fromUTCDateTime 
     
    5960        self.last_defined_phase = None 
    6061        self.wheelpos = 0 
     62        self.timewindow = (None,None) 
    6163 
    6264        # temporary layer for mouse motion 
     
    312314            self.dragStart = None 
    313315            self._drawPicksAndZoom() 
     316            if plotter and trace: 
     317                # store relative times for possible menu call to stw. 
     318                srel = start - trace.stats.starttime \ 
     319                    + trace.get_info('t-origin') 
     320                erel = end - trace.stats.starttime + trace.get_info('t-origin') 
     321                plotter.setZoomWindow( srel, erel ) 
    314322 
    315323    def OnMouseLeftUp(self, evt): 
     
    395403            self.overlay_picks.Reset() 
    396404            self.overlay_drag.Reset() 
     405        # need to find out readraw area 
     406        #if hasattr(evt,"GetRect"): 
     407        #    print "dbg:", evt.GetRect()  # always (0,0,0,0) 
     408        #else: 
     409        #    print "dbg:", dir(evt) 
    397410 
    398411        # painting is only done in idle state 
     
    12291242        self.maxDuration = maxDuration 
    12301243        self.maxAmplitude = amplitude 
     1244        recent = self.timewindow 
    12311245        self.timewindow = get_runtime("timewindow") 
    1232  
     1246        if recent != self.timewindow: 
     1247            # time window changed, delete zoom box 
     1248            self.ZoomWindow = None 
     1249 
     1250     
    12331251    #@timeit 
    12341252    def __zoombox(self, dc, start, end, midpoint, color="DARKORANGE", size=1): 
     
    12681286        self.Enable() 
    12691287        self._user_selection = 999. 
    1270         self.menu_entry_id = 10000 
     1288        self._zoomwdw = None 
    12711289     
    12721290    def addMenuEntries( self ): 
     
    12741292        # file menu 
    12751293        fileMenu = wx.Menu() 
     1294        self.addEntry( fileMenu, 'Read Data File(s)', 
     1295            'Read data file(s) in one of various formats', self.OnReadDataFile ) 
    12761296        self.addEntry( fileMenu, '&Quit\tCtrl+Q', 'Quit Graphics', self.OnQuit ) 
    12771297        # window menu 
    12781298        windowMenu = wx.Menu() 
     1299        self.addEntry( windowMenu, 'Set Time Wdw', 
     1300            'Set Zoom window as new time window', self.OnSetTimeWindow ) 
     1301        self.addEntry( windowMenu, 'Del Time Wdw', 
     1302            'Delete time window', self.OnDelTimeWindow ) 
    12791303        self.addEntry( windowMenu, '&All Norm\tCtrl+A', 
    12801304            'Normalize All Traces Together', self.OnAllNorm ) 
     
    12891313        self.addEntry( tracesMenu, '&Demean\tCtrl+D', 
    12901314            'Remove mean value from all traces', self.OnDemean ) 
     1315        self.addEntry( tracesMenu, 'Sort by Distance', 
     1316            'Sort traces by distance', self.OnSortByDistance ) 
    12911317        testMenu = wx.Menu() 
    12921318        self.addEntry( testMenu, 'Read GR * BHZ of an event', 
     
    13391365        _sendShCommand( 'fdsnws sx,th * * bhz 7-aug-15_00:16:30 420' ) 
    13401366 
     1367    def OnSetTimeWindow( self, e ): 
     1368        _sendShCommand( 'stw %g %g' % self._zoomwdw ) 
     1369 
     1370    def OnDelTimeWindow( self, e ): 
     1371        _sendShCommand( 'dtw' ) 
     1372 
     1373    def OnReadDataFile( self, e ): 
     1374        "Read one or more data files." 
     1375        dlg = wx.FileDialog( self, "Select Data File", defaultDir=os.getcwd() ) 
     1376        dlg.ShowModal() 
     1377        filelist = dlg.GetPaths() 
     1378        retcode = dlg.GetReturnCode() 
     1379        dlg.Destroy() 
     1380        if retcode != wx.ID_OK: 
     1381            return 
     1382        cmd = '\n'.join(["@READO %s ALL" % fname.replace('/','\\') \ 
     1383            for fname in filelist]) 
     1384        _sendShCommand( cmd ) 
     1385     
     1386    def OnSortByDistance( self, e ): 
     1387        ap = AnalysisPar() 
     1388        lat = ap.getValueAsString( 'epi_latitude' ) 
     1389        lon = ap.getValueAsString( 'epi_longitude' ) 
     1390        if not lat or not lon: 
     1391            return 
     1392        _sendShCommand( "sort_by_distance %s %s" % (lat,lon) ) 
     1393 
    13411394    def redraw(self): 
    13421395        self.canvas.OnPaint(None) 
    1343  
     1396     
     1397    def setZoomWindow( self, start, end ): 
     1398        self._zoomwdw = (start,end) 
    13441399 
    13451400def _sendShCommand( cmdstring, name="default" ): 
Note: See TracChangeset for help on using the changeset viewer.