Dump waveforms to a file

The Goal

dumpwaveform is a python script to dump waveforms from different acquisition sources (File/SeedLink/ArcLink) to stdout.

An example call would be: python dumpwaveform.py -I arclink://localhost:18001 --stream GE.UGM..BHZ --begin "2010-03-29 08:14:00" --end "2010-03-29 08:14:10"

Python script

# -*- coding: utf-8 -*-                                                                                                      
############################################################################                                                 
#    Copyright (C) 2009 by gempa GmbH                                      #                                                 
#                                                                          #                                                 
#    author: Jan Becker, Bernd Weber (gempa GmbH)                          #                                                 
#    email:  jabe@gempa.de                                                 #                                                 
############################################################################                                                 

import sys, traceback
import seiscomp3.Client

class DumpWaveform(seiscomp3.Client.Application):
  def __init__(self, argc, argv):                
    seiscomp3.Client.Application.__init__(self, argc, argv)

    self.setMessagingEnabled(False)
    self.setDatabaseEnabled(False, False)
    self.setDaemonEnabled(False)         

    self._startTime = None
    self._endTime = None  
    self._streamparameter = []
    self._recordURL = "combined://localhost:18000;localhost:18001"

  def createCommandLineDescription(self):
    self.commandline().addGroup("Stream")
    self.commandline().addStringOption("Stream", "begin", "specify the lower bound of the time interval")
    self.commandline().addStringOption("Stream", "end", "specify the upper bound of the time interval")  
    self.commandline().addStringOption("Stream", "stream", "specify the stream (Net.Sta.Loc.Chan)")      
    self.commandline().addGroup("Source")                                                                
    self.commandline().addStringOption("Source", "record-url,I", "specify the recordURL (combined://localhost:18000;localhost:18001)")
    return True                                                                                                                       


  def init(self):
    try:         
      if not seiscomp3.Client.Application.init(self): return False

      try:
        start = self.commandline().optionString("begin")
        self._startTime = seiscomp3.Core.Time()         
        if self._startTime.fromString(start, "%F %T") == False:
          print >> sys.stderr, "Wrong 'begin' format '%s' -> setting to None" % start
      except:                                                                        
        print >> sys.stderr, "Wrong 'begin' format -> setting to None"               
        self._startTime = seiscomp3.Core.Time()                                      

      print >> sys.stderr, "Setting start to %s" % self._startTime.toString("%F %T")

      try:
        self._recordURL = self.commandline().optionString("record-url")
        if self._recordURL == "":                                      
          print >> sys.stderr, "URL empty setting to 'combined://localhost:18000;localhost:18001'"
      except: pass                                                                                

      try:
        end = self.commandline().optionString("end")
        self._endTime = seiscomp3.Core.Time.FromString(end, "%F %T")
      except:                                                       
        self._endTime = seiscomp3.Core.Time.GMT()                   

      try:
        stream = self.commandline().optionString("stream")
        self._streamparameter = stream.split(".")         
      except: pass                                        

      if len(self._streamparameter) == 0:
        print >> sys.stderr, "stream empty"
        return False                       

      print >> sys.stderr, "Setting end to %s" % self._endTime.toString("%F %T")

      return True
    except:
      info = traceback.format_exception(*sys.exc_info())
      for i in info: sys.stderr.write(i)

  def run(self):
    try:
      recordStream = seiscomp3.IO.RecordStream.Open(self._recordURL)
      if not recordStream:
        seiscomp3.Logging.error("could not open recordstream '%s'" % self._recordURL)
        return False

      recordStream.setStartTime(self._startTime)
      recordStream.setEndTime(self._endTime)
      recordStream.addStream(self._streamparameter[0], self._streamparameter[1], self._streamparameter[2], self._streamparameter[3])
      print >> sys.stderr, "added stream %s" % ".".join(self._streamparameter)
      print >> sys.stderr, "waiting for data..."
      recordInput = seiscomp3.IO.RecordInput(recordStream, seiscomp3.Core.Array.DOUBLE, seiscomp3.Core.Record.DATA_ONLY)
      try:
        for record in recordInput:
          if record:
            data = seiscomp3.Core.DoubleArray.Cast(record.data())
            if data:
              #print "%s %s %s %f %d" % (record.streamID(), record.startTime().iso(), record.endTime().iso(), record.samplingFrequency(), data.size())
              stime = record.startTime()
              fsamp = record.samplingFrequency()
              delta = 1.0 / fsamp
              for i in range(0, data.size()):
                print "%s\t%f" % (stime.iso(), data.get(i))
                stime = stime + seiscomp3.Core.TimeSpan(delta)
      except:
        print >> sys.stderr, "end of data..."

      return True
    except:
      info = traceback.format_exception(*sys.exc_info())
      for i in info: print >> sys.stderr, i

app = DumpWaveform(len(sys.argv), sys.argv)
sys.exit(app())