source: SHX/trunk/SeismicHandler/commands/fdsnws.py @ 1077

Revision 1077, 4.2 KB checked in by klaus, 4 years ago (diff)

fdsn ws addresses in shx config

Line 
1# -*- coding: utf-8 -*-
2
3#    This file is part of Seismic Handler eXtended (SHX). For terms of use and
4#    license information please see license.txt and visit
5#    http://www.seismic-handler.org/portal/wiki/Shx/LicenseTerms
6
7import os
8from SeismicHandler.basics.command import BaseCommand
9from SeismicHandler.modules.traces import add_traces
10from SeismicHandler.basics.messages import log_message
11from SeismicHandler.basics.error import ShxError
12from SeismicHandler.basics import timeit, timestore
13from SeismicHandler.config import Settings
14from SeismicHandler.modules.stations import ChannelMeta, Stations
15from obspy.sh.core import toUTCDateTime, UTCDateTime
16from obspy.fdsn.client import Client
17
18provides = {"fdsnws": "fdsnws"}
19class fdsnws(BaseCommand):
20    """
21    URI:http://www.seismic-handler.org/portal/wiki/ShFdsnws
22    """
23    numberOfParameters = [1,6]
24    parameterQueries = [
25        {
26            "text": "netcode or bulk file",
27            "type": "str",
28            "question": False,
29        },
30        {
31            "text": "station",
32            "type": "str",
33            "question": False,
34        },
35        {
36            "text": "location code",
37            "type": "str",
38            "question": False,
39        },
40        {
41            "text": "channel",
42            "type": "str",
43            "question": False,
44        },
45        {
46            "text": "start",
47            "type": "str",
48            "question": False,
49        },
50        {
51            "text": "length",
52            "type": "float",
53            "question": False,
54        },
55    ]
56    known_qualifiers = [
57        "ADDR",
58        #"SAVE",
59        "BULKLINE",
60    ]
61
62    def __init__(self, *args, **kwargs):
63        # unroll args & kwargs
64        self._client = None
65        BaseCommand.__init__(self, *args, **kwargs)
66
67    #@timeit
68    def run(self):
69   
70        if self.qualifiers["ADDR"]:
71            fdsnadr = self.qualifiers["ADDR"]
72        else:
73            fdsnadr = Settings.config.fdsnws['default_data_source'][0]
74       
75        if len(self.parameters) == 1:
76            bulkfile = self.parameters[0]
77            if not os.path.exists(bulkfile):
78                raise ShxError( "bulk file '%s' not found" % bulkfile,
79                    status=1111 )
80            client = Client(fdsnadr)
81            st = client.get_waveforms_bulk( file(bulkfile) )
82        else:
83            netcode = self.parameters[0]
84            station = self.parameters[1]
85            location = self.parameters[2]
86            channel = self.parameters[3]
87            reqtime = toUTCDateTime( self.parameters[4] )
88            try:
89                reqlength = float( self.parameters[5] )
90            except:
91                raise ShxError( "need float as request length, got '%s'" \
92                    % self.parameters[5], status=1111 )
93            if self.qualifiers["BULKLINE"]:
94                # print request line into echo channel for bulk request
95                if location == "":
96                    loc = "*"
97                else:
98                    loc = location
99                if station == "":
100                    sta = "*"
101                else:
102                    sta = station
103                if channel == "":
104                    chan = "*"
105                else:
106                    chan = channel
107                txt = "%s %s %s %s %s %s" % (netcode,sta,loc,chan,
108                    reqtime,(reqtime+reqlength))
109                print >> Settings.echo_channel, txt
110                return
111            else:
112                client = Client(fdsnadr)
113                st = client.get_waveforms(netcode, station, location, channel,
114                    reqtime, (reqtime+reqlength))
115       
116        # trim traces (obviously complete records returned)
117        empty = []
118        for trc in st:
119            trc.trim( reqtime, reqtime+reqlength )
120            minlth = int( reqlength / trc.stats.delta ) - 5
121            if len(trc.data) < minlth:
122                empty.append( trc )
123        for trc in empty:
124            st.remove( trc )
125
126        if not st:
127            msg = "No data found at all for requested stations: %s"
128            log_message("warning.fetch", msg % ", ".join(stations))
129        add_traces(st, gain=True)
130
131
132if __name__ == "__main__":
133    import doctest
134    doctest.testmod(exclude_empty=True)
Note: See TracBrowser for help on using the repository browser.