Changeset 1074


Ignore:
Timestamp:
02.01.2016 18:40:59 (4 years ago)
Author:
klaus
Message:

data and metadata requests via fdsn ws; bugfix in matadata db

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

Legend:

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

    r1073 r1074  
    66 
    77import time 
     8import uuid 
    89import numpy as np 
    910from SeismicHandler.basics.command import BaseCommand 
     
    117118        else: 
    118119            # compute relative from absolute locations 
    119             return self.absToRelLocations(traces) 
     120            newlist = self.absToRelLocations(traces) 
     121            reldist_list[uuid.uuid4().hex] = newlist 
     122            return newlist 
    120123     
    121124    def shiftRelativeDistancesToRefstation( self, reldist, refstation ): 
  • SHX/trunk/SeismicHandler/commands/trcmeta.py

    r1063 r1074  
    88from SeismicHandler.core import Traces 
    99from SeismicHandler.modules.traces import Traces as BaseTraces, traces_from_list 
     10from SeismicHandler.modules.stations import ChannelMeta, Stations 
    1011#from SeismicHandler.basics.messages import get_runtime 
    1112from SeismicHandler.config import get_runtime 
    1213from SeismicHandler.basics import timeit 
    13 import numpy as np 
    14 import matplotlib.pyplot as plt 
     14from obspy.fdsn.client import Client 
     15# for dbg: 
     16from obspy.sh.core import toUTCDateTime, UTCDateTime 
    1517 
    1618provides = {"trcmeta": "trcmeta"} 
     
    1921    URI:http://www.seismic-handler.org/portal/wiki/ShDisplay 
    2022    """ 
    21     numberOfParameters = [1] 
     23    numberOfParameters = [2] 
    2224    parameterQueries = [ 
    2325        { 
     
    2628            "question": False, 
    2729        }, 
     30        { 
     31            "text": "subcmd", 
     32            "type": "str", 
     33            "question": False, 
     34        }, 
    2835    ] 
    2936    known_qualifiers = [ 
     37        "ADR", 
     38        "DEL_INCOMPLETE", 
    3039    ] 
     40     
     41    legal_subcmds = "list,complete_location,complete_response".split(",") 
    3142 
    3243    def __init__(self, *args, **kwargs): 
     
    3647    #@timeit 
    3748    def run(self): 
    38         "Here is the plotting done." 
    39  
    40         # loop all traces, determine normalization and store data 
    41         for t in traces_from_list(self.parameters[0]): 
    42  
    43             # time origin and zoom value for each trace 
    44             for iname in ('station','chan1','chan2','comp','delta','length', 
    45                 't-origin','zoom','maxval','minval','calib'): 
    46                 ivalue = t.get_info(iname) 
    47                 print "   ", iname, ivalue 
    48             print dir(t.stats) 
    49             for iname in ('network','station','location','calib','starttime', 
    50                 'endtime'): 
    51                 print "   ", iname, t.stats.get(iname) 
    52              
    53              
     49        "Metadata management." 
     50 
     51        self.stations = Stations() 
     52        traces = traces_from_list(self.parameters[0]) 
     53        subcmd = self.parameters[1].lower() 
     54        if subcmd not in self.legal_subcmds: 
     55            raise ShxError( "illegal subcmd '%s'. legal are: '%s'" % (subcmd, 
     56                ','.join(self.legal_subcmds)), status=1111 ) 
     57 
     58        fdsnadr = "BGR" 
     59        if self.qualifiers["ADR"]: 
     60            fdsnadr = self.qualifiers["ADR"] 
     61 
     62        if subcmd == 'list': 
     63            print "idx net sta     cha   location       gain   response-ok" 
     64            for trc in traces: 
     65                print self.infostring( trc ) 
     66        elif subcmd in ('complete_location','complete_response'): 
     67            self.completeMetadata( fdsnadr, traces, subcmd ) 
     68        else: 
     69            raise ShxError( "illegal subcmd. this cannot happen", status=1111 ) 
     70         
     71        # delete traces with incomplete metadata 
     72        if self.qualifiers["DEL_INCOMPLETE"]: 
     73            for trc in self.listIncompleteTraces(traces,subcmd): 
     74                trc.shx._parent.remove(trc) 
     75            BaseTraces().updateCounter() 
     76 
     77 
     78    def infostring( self, trc ): 
     79        "Returns info string about trace." 
     80        sname = "%s.%s.%s.%s" % (trc.stats.network, trc.stats.station, 
     81            trc.stats.location, trc.stats.channel) 
     82        metatime = trc.stats.starttime \ 
     83            + (trc.stats.endtime-trc.stats.starttime)/2 
     84        try: 
     85            r = self.stations[(sname, metatime)] 
     86        except: 
     87            r = None 
     88        try: 
     89            slat = float( r.latitude ) 
     90            slon = float( r.longitude ) 
     91            locstring = "(%6.2f,%6.2f)" % (slat,slon) 
     92        except: 
     93            locstring = "(------,------)" 
     94        try: 
     95            gain = float( r.gain ) 
     96            gainstr = "%6.3f" % gain 
     97        except: 
     98            gain = None 
     99            gainstr = "------" 
     100        if gain and gain == 1.: 
     101            gainstr = " [1]? " 
     102        if r and r.poles and r.poles != '[]': 
     103            respstr = "resp_given" 
     104        else: 
     105            respstr = "---" 
     106        infostr = "%3d %2s %5s %2s %3s %s %s  %s" % (trc.index(True), 
     107            trc.stats.network,trc.stats.station,trc.stats.location, 
     108            trc.stats.channel,locstring,gainstr,respstr) 
     109        return infostr 
    54110     
     111    def isMetaComplete( self, trc ): 
     112        "Returns boolean 2-tuple (location-ok,response-ok)." 
     113        locok = False 
     114        respok = False 
     115        sname = "%s.%s.%s.%s" % (trc.stats.network, trc.stats.station, 
     116            trc.stats.location, trc.stats.channel) 
     117        metatime = trc.stats.starttime \ 
     118            + (trc.stats.endtime-trc.stats.starttime)/2 
     119        try: 
     120            r = self.stations[(sname, metatime)] 
     121        except: 
     122            return (False,False) 
     123        try: 
     124            slat = float( r.latitude ) 
     125            slon = float( r.longitude ) 
     126        except: 
     127            return (False,False) 
     128        locok = True 
     129        try: 
     130            gain = float( r.gain ) 
     131        except: 
     132            return (locok,False) 
     133        if gain == 1.0: 
     134            return (locok,False) 
     135        if r.poles and r.poles != '[]': 
     136            respok = True 
     137        return (locok,respok) 
     138 
     139    def completeMetadata( self, fdsnadr, traces, subcmd ): 
     140        "Completes metadata of selected traces using FDSN WS." 
     141        incomplete = [] 
     142        startend = {} 
     143        for trc in traces: 
     144            locok, respok = self.isMetaComplete( trc ) 
     145            if locok and respok: 
     146                continue 
     147            if locok and subcmd == 'complete_location': 
     148                continue 
     149            incomplete.append(( 
     150                trc.stats.network, 
     151                trc.stats.station, 
     152                trc.stats.location, 
     153                trc.stats.channel, 
     154                trc.stats.starttime, 
     155                trc.stats.endtime 
     156            )) 
     157            startend["%s.%s.%s.%s" % (trc.stats.network,trc.stats.station, 
     158                trc.stats.location,trc.stats.channel)] = ( 
     159                trc.stats.starttime,trc.stats.endtime) 
     160        if incomplete == []: 
     161            return 
     162        if subcmd == 'complete_location': 
     163            level = 'channel' 
     164        else: 
     165            level = 'response' 
     166        client = Client(fdsnadr) 
     167        inv = client.get_stations_bulk( incomplete, level=level ) 
     168        #p = incomplete[0] 
     169        #inv = client.get_stations( network=p[0], station=p[1], 
     170        #    location=p[2], channel=p[3], starttime=p[4], endtime=p[5], 
     171        #    level=level ) 
     172        for chan in inv.get_contents()['channels']: 
     173            if not chan in startend.keys(): 
     174                print "program bug, '%s' not in startend" % chan 
     175                continue 
     176            stime, etime = startend[chan] 
     177            cm = inv.get_coordinates( chan ) 
     178            try: 
     179                n, s, l, c = chan.split('.') 
     180            except: 
     181                print "illegal channel format i '%s'" % chan 
     182            if subcmd == 'complete_location': 
     183                meta = ChannelMeta( 
     184                    network=n, station=s, location=l, 
     185                    stream=c[:2], component=c[-1], 
     186                    start=stime, end=etime, 
     187                    latitude=cm['latitude'], 
     188                    longitude=cm['longitude'], 
     189                    depth=cm.get('local_depth',0.), 
     190                    elevation=cm.get('elevation',0.), 
     191                    poles=str([]), zeros=str([]),  # this is dangerous, but 
     192                    gain=1.                        # ChannelMeta wants sth. 
     193                ) 
     194            else: 
     195                metatime = stime + (etime-stime)/2 
     196                r = inv.get_response( chan, metatime ) 
     197                paz = r.get_paz() 
     198                meta = ChannelMeta( 
     199                    network=n, station=s, location=l, 
     200                    stream=c[:2], component=c[-1], 
     201                    start=stime, end=etime, 
     202                    latitude=cm['latitude'], 
     203                    longitude=cm['longitude'], 
     204                    depth=cm.get('local_depth',0.), 
     205                    elevation=cm.get('elevation',0.), 
     206                    gain=1.e9/r.instrument_sensitivity.value, 
     207                    poles=str(paz.poles), 
     208                    zeros=str(paz.zeros), 
     209                ) 
     210            Stations().add(meta, replace=True, local=True) 
     211        # reread DB due to bug in Db interface 
     212        Stations().read( clear=True ) 
     213     
     214    def listIncompleteTraces( self, traces, subcmd ): 
     215        "Returns list of traces with incomplete metadata." 
     216        incomplete = [] 
     217        for trc in traces: 
     218            locok, respok = self.isMetaComplete( trc ) 
     219            if locok and respok: 
     220                continue 
     221            if locok and subcmd == 'complete_location': 
     222                continue 
     223            incomplete.append( trc ) 
     224        return incomplete 
     225 
     226    def dbBugfinder( self ): 
     227        stime = UTCDateTime( "2014-01-01T11:11:11.111" ) 
     228        etime = stime + 5. 
     229        sta = 'A003' 
     230        meta = ChannelMeta( 
     231            network='GR', station=sta, location='', 
     232            stream='BH', component='Z', 
     233            start=stime, end=etime, 
     234            latitude=11.111, 
     235            longitude=22.222, 
     236            depth=0., 
     237            elevation=111, 
     238            poles=str([]), zeros=str([]), 
     239            gain=1. 
     240        ) 
     241        Stations().add(meta, replace=True, local=True) 
     242        Stations().read( clear=True ) 
     243        sname = "GR.%s..BHZ" % sta 
     244        metatime = stime + (etime-stime)/2 
     245        r = self.stations[(sname, metatime)] 
  • SHX/trunk/SeismicHandler/commands/unit.py

    r1063 r1074  
    6262        for t in trcs: 
    6363            t.data /= absmax 
    64             t.data = method(t.data) 
     64            #t.data = method(t.data)   # what is this? 
    6565 
    6666 
  • SHX/trunk/SeismicHandler/modules/stations.py

    r935 r1074  
    405405#                import pdb; pdb.set_trace() 
    406406                session.rollback() 
     407         
     408        # self.stations and self.channels not updated, 
     409        # automatic reread would be overkill 
     410        # applications have to call 'stations.read( clear=True )' after changes 
     411         
    407412 
    408413    def fetch(self, station): 
Note: See TracChangeset for help on using the changeset viewer.