145 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env seiscomp-python
 | 
						|
 | 
						|
############################################################################
 | 
						|
# Copyright (C) gempa GmbH                                                 #
 | 
						|
# All rights reserved.                                                     #
 | 
						|
# Contact: gempa GmbH (seiscomp-dev@gempa.de)                              #
 | 
						|
#                                                                          #
 | 
						|
# GNU Affero General Public License Usage                                  #
 | 
						|
# This file may be used under the terms of the GNU Affero                  #
 | 
						|
# Public License version 3.0 as published by the Free Software Foundation  #
 | 
						|
# and appearing in the file LICENSE included in the packaging of this      #
 | 
						|
# file. Please review the following information to ensure the GNU Affero   #
 | 
						|
# Public License version 3.0 requirements will be met:                     #
 | 
						|
# https://www.gnu.org/licenses/agpl-3.0.html.                              #
 | 
						|
#                                                                          #
 | 
						|
# Other Usage                                                              #
 | 
						|
# Alternatively, this file may be used in accordance with the terms and    #
 | 
						|
# conditions contained in a signed written agreement between you and       #
 | 
						|
# gempa GmbH.                                                              #
 | 
						|
############################################################################
 | 
						|
 | 
						|
import os
 | 
						|
import sys
 | 
						|
 | 
						|
from getopt import gnu_getopt, GetoptError
 | 
						|
from seiscomp import mseedlite as mseed
 | 
						|
 | 
						|
 | 
						|
def usage():
 | 
						|
    print(
 | 
						|
        f"""Usage:
 | 
						|
  {os.path.basename(__file__)} source
 | 
						|
 | 
						|
Demultiplex all miniSEED records found in the given source by stream code writing them
 | 
						|
into separate new files. The source can be files or stdin. One file per stream is
 | 
						|
generated. File names are derived from stream codes and the begin time of the records.
 | 
						|
 | 
						|
Verbosity:
 | 
						|
  -h, --help            Display this help message.
 | 
						|
  -v, --verbose         Verbose mode.
 | 
						|
 | 
						|
Examples:
 | 
						|
Demultiplex the miniSEED records contained in data.mseed and additionally print the
 | 
						|
names of created files to stderr
 | 
						|
  {os.path.basename(__file__)} -v data.mseed
 | 
						|
 | 
						|
Demultiplex the miniSEED records received from stdin
 | 
						|
  scmssort -u -E data.mseed | {os.path.basename(__file__)} -
 | 
						|
"""
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def main():
 | 
						|
    try:
 | 
						|
        opts, args = gnu_getopt(
 | 
						|
            sys.argv[1:],
 | 
						|
            "hv",
 | 
						|
            [
 | 
						|
                "help",
 | 
						|
                "verbose",
 | 
						|
            ],
 | 
						|
        )
 | 
						|
    except GetoptError:
 | 
						|
        print(
 | 
						|
            f"{os.path.basename(__file__)}: Unknown option",
 | 
						|
            file=sys.stderr,
 | 
						|
        )
 | 
						|
        usage()
 | 
						|
        return False
 | 
						|
 | 
						|
    verbosity = False
 | 
						|
    for flag, arg in opts:
 | 
						|
        if flag in ("-h", "--help"):
 | 
						|
            usage()
 | 
						|
            return True
 | 
						|
 | 
						|
        if flag in ("-v", "--verbose"):
 | 
						|
            verbosity = True
 | 
						|
 | 
						|
    inFile = sys.stdin.buffer
 | 
						|
    try:
 | 
						|
        if len(args[0]) > 0:
 | 
						|
            openFiles = {}
 | 
						|
    except Exception:
 | 
						|
        print(
 | 
						|
            f"{os.path.basename(__file__)}: Missing source",
 | 
						|
            file=sys.stderr,
 | 
						|
        )
 | 
						|
        usage()
 | 
						|
        sys.exit(1)
 | 
						|
 | 
						|
    if len(args) == 1:
 | 
						|
        if args[0] != "-":
 | 
						|
            try:
 | 
						|
                inFile = open(args[0], "rb")
 | 
						|
            except IOError as e:
 | 
						|
                print(
 | 
						|
                    f"Could not open input file '{args[0]}' for reading: {e}",
 | 
						|
                    file=sys.stderr,
 | 
						|
                )
 | 
						|
                return False
 | 
						|
        else:
 | 
						|
            print(
 | 
						|
                "Waiting for miniSEED records on stdin. Use Ctrl + C to interrupt.",
 | 
						|
                file=sys.stderr,
 | 
						|
            )
 | 
						|
    elif len(args) != 0:
 | 
						|
        usage()
 | 
						|
        sys.exit(1)
 | 
						|
 | 
						|
    try:
 | 
						|
        for rec in mseed.Input(inFile):
 | 
						|
            oName = "%s.%s.%s.%s" % (rec.sta, rec.net, rec.loc, rec.cha)
 | 
						|
 | 
						|
            if oName not in openFiles:
 | 
						|
                postfix = ".D.%04d.%03d.%02d%02d" % (
 | 
						|
                    rec.begin_time.year,
 | 
						|
                    rec.begin_time.timetuple()[7],
 | 
						|
                    rec.begin_time.hour,
 | 
						|
                    rec.begin_time.minute,
 | 
						|
                )
 | 
						|
 | 
						|
                openFiles[oName] = open(oName + postfix, "ab")
 | 
						|
 | 
						|
            oFile = openFiles[oName]
 | 
						|
            oFile.write(rec.header + rec.data)
 | 
						|
 | 
						|
        if verbosity:
 | 
						|
            print("Generated output files:", file=sys.stderr)
 | 
						|
 | 
						|
        for oName in openFiles:
 | 
						|
            if verbosity:
 | 
						|
                print(f"  {oName}", file=sys.stderr)
 | 
						|
 | 
						|
            openFiles[oName].close()
 | 
						|
 | 
						|
    except KeyboardInterrupt:
 | 
						|
        return True
 | 
						|
 | 
						|
    return True
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    sys.exit(main())
 |