Changeset 1143


Ignore:
Timestamp:
26.01.2016 22:52:21 (4 years ago)
Author:
klaus
Message:

locator interface to locsat

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

Legend:

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

    r1136 r1143  
    222222        'epi_longitude'   : ( 40, 'floatN',    None), 
    223223        'source_depth'    : ( 50, 'floatN',    None), 
     224        'depth_type'      : ( 51, 'string',    'unknown'), 
    224225        # trace read parameters 
    225226        'read_time'       : ( 60, 'datetime',  toUTCDateTime('7-AUG-2015_00:16:30')), 
     
    245246        'fk_min_freq'     : (111, 'float',     0.4), 
    246247        'fk_max_freq'     : (112, 'float',     3.0), 
     248        'locator'         : (113, 'string',    'locsat,bgr,0'), 
    247249        # own variables 
    248250        'autosave'        : (120, 'fileN',     None), 
  • SHX/trunk/SeismicHandler/commands/uitrigger.py

    r1141 r1143  
    55#    http://www.seismic-handler.org/portal/wiki/Shx/LicenseTerms 
    66 
    7 import os 
    87from SeismicHandler.basics.command import BaseCommand 
    98from SeismicHandler.basics.messages import ui_event 
  • SHX/trunk/SeismicHandler/modules/locator.py

    r1140 r1143  
    99""" 
    1010 
    11  
     11import os 
    1212from SeismicHandler.basics.analysispar import PhaseList 
    13  
     13from SeismicHandler.modules.stations import Stations 
     14from SeismicHandler.config import Settings 
    1415 
    1516class ShxLocatorPhase: 
     
    2021class ShxLocator: 
    2122 
    22     def __init__( self ): 
     23    def __init__( self, **kwargs ): 
    2324        self.phaselist = [] 
    2425        self._preparePhases() 
     26        self.scratch = Settings.config.paths.scratch[0] 
     27        self.textdisplay = Settings.config.misc.textdisplay[0] 
    2528     
    2629    def _preparePhases( self ): 
     30        meta = Stations() 
    2731        pl = PhaseList() 
    2832        for station in pl.getStations(): 
    29             print station 
     33            for phase in pl.getPhaseList( station, 
     34                picktype=pl.translatePicktype('manual') ): 
     35                r = meta[(station,phase.picktime)] 
     36                try: 
     37                    slat = float( r.latitude ) 
     38                    slon = float( r.longitude ) 
     39                except: 
     40                    continue 
     41                try: 
     42                    elev = float( r.elevation ) 
     43                except: 
     44                    elev = 0. 
     45                self.phaselist.append( (station,slat,slon,elev,phase.picktime, 
     46                    phase.name) ) 
    3047     
    3148    def locate( self ): 
    32         print "locate called" 
     49        print self.phaselist 
     50 
     51 
     52class ShxLocatorLocsat(ShxLocator): 
     53 
     54    def __init__( self, **kwargs ): 
     55        ShxLocator.__init__(self) 
     56        self.lsroot = Settings.config.locators.locsat[0] 
     57        self.locsat = os.path.join( self.lsroot, 'bin', 'LocSAT' ) 
     58        self.alroot = os.path.join( self.scratch, 'locsat' ) 
     59        self.prefix = 'locsat' 
     60        if not 'modelname' in kwargs: 
     61            print "need modelname in parameters" 
     62            return 
     63        if not 'fixeddepth' in kwargs: 
     64            print "need fixeddepth in parameters" 
     65            return 
     66        self.modelname = kwargs['modelname'] 
     67        self.fixeddepth = kwargs['fixeddepth'] 
     68        if 'showresult' in kwargs: 
     69            self.showresult = kwargs['showresult'] 
     70        else: 
     71            self.showresult = False 
     72        if 'degfree' in kwargs: 
     73            self.degfree = kwargs['degfree'] 
     74        else: 
     75            self.degfree = 8 
     76        if 'maxiter' in kwargs: 
     77            self.maxiter = kwargs['maxiter'] 
     78        else: 
     79            self.maxiter = 20 
     80        if not os.path.exists(self.alroot): 
     81            os.system( "ln -s %s %s" % (self.lsroot,self.alroot) ) 
     82        if not os.path.exists(self.locsat): 
     83            print "LocSAT executable not found" 
     84            return 
     85     
     86    def writeControl( self ): 
     87        "Write Control file." 
     88        if self.fixeddepth == None: 
     89            fixdep = 'n' 
     90        else: 
     91            fixdep = 'y' 
     92        fname = os.path.join( self.scratch, self.prefix+'_c.txt' ) 
     93        fp = open( fname, 'w' ) 
     94        #fp.write( "%s/tables %s\n" % (self.alroot,modelname) ) 
     95        #fp.write( "%s/scorr TT\n" % self.alroot ) 
     96        fp.write( "locsat/tables %s\n" % self.modelname ) 
     97        fp.write( "locsat/scorr TT\n" ) 
     98        fp.write( " y %s y  0.90  -1.00  1.00    %2d %3d\n" 
     99            % (fixdep,self.degfree,self.maxiter) ) 
     100        #8=deg of freedom, 20=max iterations 
     101        fp.close() 
     102     
     103    def writeStations( self ): 
     104        fname = os.path.join( self.scratch, self.prefix+'_s.txt' ) 
     105        fp = open( fname, 'w' ) 
     106        for station,slat,slon,elev,ptime,pname in self.phaselist: 
     107            elev /= 1000. 
     108            sta = station.split('.')[1] 
     109            fp.write( "%6s%9.4lf%9.4lf%9.4f\n" % (sta,slat,slon,elev) ) 
     110        fp.close() 
     111     
     112    def writePhases( self ): 
     113        fname = os.path.join( self.scratch, self.prefix+'_d.txt' ) 
     114        if os.path.exists(fname): 
     115            os.remove( fname ) 
     116        # find first phase, reference time and closest station location 
     117        if len(self.phaselist) == 0: 
     118            return 
     119        clat = self.phaselist[0][1] 
     120        clon = self.phaselist[0][2] 
     121        reftime = self.phaselist[0][4] 
     122        for station,slat,slon,elev,ptime,pname in self.phaselist: 
     123            if ptime < reftime: 
     124                reftime = ptime 
     125                clat = slat 
     126                clon = slon 
     127        fp = open( fname, 'w' ) 
     128        fp.write( "%02d%02d%02d %02d%02d%3d.%02d" % ((reftime.year % 100), 
     129            reftime.month,reftime.day,reftime.hour,reftime.minute, 
     130            reftime.second,reftime.microsecond/10) ) 
     131        if self.fixeddepth == None: 
     132            depth = 0. 
     133        else: 
     134            depth = self.fixeddepth 
     135        fp.write( " %f %f %f 0.0 %d\n" % (clat,clon,depth,len(self.phaselist)) ) 
     136        cnt = 1 
     137        for station,slat,slon,elev,ptime,pname in self.phaselist: 
     138            sta = station.split('.')[1] 
     139            tdiff = ptime - reftime 
     140            fp.write( "%8d %6s %8s %4s%2s %f %f\n" % (cnt,sta,pname, 
     141                "t","d",tdiff,1.0) ) 
     142            cnt += 1 
     143        fp.close() 
     144         
     145    def locate( self ): 
     146        self.removeResultfile() 
     147        self.writeControl() 
     148        self.writeStations() 
     149        self.writePhases() 
     150        shellcmd = "cd %s; %s -s locsat_s.txt " % (self.scratch,self.locsat) \ 
     151            +"-d locsat_d.txt -c locsat_c.txt -o locsat_o.txt" 
     152        #print shellcmd 
     153        os.system( shellcmd ) 
     154        if self.showresult: 
     155            shellcmd = "%s %s/locsat_o.txt &" % (self.textdisplay,self.scratch) 
     156            os.system( shellcmd ) 
     157        return self.parseResult() 
     158     
     159    def removeResultfile( self ): 
     160        fname = os.path.join( self.scratch, self.prefix+'_o.txt' ) 
     161        if os.path.exists(fname): 
     162            os.remove( fname ) 
     163     
     164    def parseResult( self ): 
     165        fname = os.path.join( self.scratch, self.prefix+'_o.txt' ) 
     166        if not os.path.exists(fname): 
     167            return (None,None,None,None) 
     168        lat = lon = depth = None 
     169        for line in file(fname): 
     170            if line.strip().startswith('Latitude:'): 
     171                lat = float( line.split()[1] ) 
     172            elif line.strip().startswith('Longitude:'): 
     173                lon = float( line.split()[1] ) 
     174            if line.strip().startswith('Depth:'): 
     175                depth = float( line.split()[1] ) 
     176        if self.fixeddepth == None: 
     177            depth_type = 'located' 
     178        else: 
     179            depth_type = 'fixed' 
     180        return (lat,lon,depth,depth_type) 
     181         
  • SHX/trunk/SeismicHandler/modules/stations.py

    r1136 r1143  
    334334        meta = self.channels.get(code, None) 
    335335        if meta is None: 
    336             raise KeyError("no meta data found at all for '%s'" % code) 
     336            # try for entries starting with given string: 
     337            for k in self.channels.keys(): 
     338                if k.startswith(code): 
     339                    meta = self.channels[k] 
     340                    break 
     341            else: 
     342                raise KeyError("no meta data found at all for '%s'" % code) 
    337343 
    338344        match = None 
  • SHX/trunk/SeismicHandler/modules/wx_.py

    r1142 r1143  
    16891689     
    16901690    Shortcuts 
    1691            b(Beam) d(DelTimeWdw) g(PhasePg) n(PhasePn) p(PhaseP) 
     1691           b(Beam) d(DelTimeWdw) g(PhasePg) l(locate) n(PhasePn) p(PhaseP) 
    16921692           s(SetTimeWdw) u(Undo Filter) 0(PrevEvent) 1(NextEvent) 2(PhaseSg) 
    16931693           8(Filter 1-8Hz) >(zoom->right) <(zoom->left) 
     
    17531753        fileMenu.AppendSeparator() 
    17541754        self.addEntry( fileMenu, '&Quit\tCtrl+Q', 'Quit Graphics', self.OnQuit ) 
    1755         # window menu 
     1755        # display menu 
    17561756        windowMenu = wx.Menu() 
    17571757        self.addEntry( windowMenu, '&Set Time Window\tS', 
     
    18231823        self.addEntry( eventsMenu, 'Previous Event\t0', 
    18241824            'Prepare previous event time from list', self.OnPrevEvent ) 
     1825        eventsMenu.AppendSeparator() 
     1826        self.addEntry( eventsMenu, 'Locate Event\tl', 
     1827            'Use phase list for locating event', self.OnLocateEvent ) 
    18251828        phaseMenu = wx.Menu() 
    18261829        self.addEntry( phaseMenu, 'Pg\tg', 
     
    21312134    def OnPrevEvent( self, e ): 
    21322135        _sendShCommand( 'shx_menu_next_event -1' ) 
     2136     
     2137    def OnLocateEvent( self, e ): 
     2138        _sendShCommand( 'locate shxvar /showresult' ) 
    21332139         
    21342140    def OnSaveTracesAndParamsQuick( self, e ): 
Note: See TracChangeset for help on using the changeset viewer.