地震波形数据与地震目录的处理工具

本教程主要用于简单介绍一些处理地震波形数据的工具,仅仅是起到一个入门的作用,更多功能请仔细查看各个程序的详细介绍。

msarchive

可以快速地实现地震数据(1)从SEED到MSEED的格式转换,(2)地震数据的整天切割,(3)数据时区的转换,(4)分段数据的打包【此处非地震数据处理中的merge】,(5)将数据按照台网、台站、时间等依次存储等功能。

msarchive -Ps -E -GMT out_dir @seed.list

seed.list将许多seed文件的路径放置于该文件内;
out_dir数据处理后的输出文件夹;

mseedindex

基于该命令可以将大量的地震数据索引存储于SQL数据库中,根据数据的台网、台站、通道、开始时间以及结束时间便可以检索到相应的地震波形。
在日常地震数据处理中,切割波形是一个基本操作,数据跨天是经常遇到的问题,基于该操作,只需要相应的输入就可获得任意形式下的波形数据。

# step1: 为目标数据在当前目录下建立软连接
ln -s /path/data_100Hz  ./
# step2: 将所有的数据文件路径放置于一个文件中
find data_100Hz/ -type f > MSEED_PATH_2022 &
# step3: 使用mseedindex生成sqlite库
mseedindex -sqlite MSEED_PATH_2022.sqlite @MSEED_PATH_2022

当然实际处理过程中会遇到各种问题,如由于数据量过大、数据分段过多导致的程序运行至一般出现killed情况。因此,也可以采用每条数据调用一次mseedindex的情况。

# make_mseedindex.sh
input_file=$1
out_file=$2

if [ "$#" -ne 2 ]; then
  echo "Usage: $0 <arg1> <arg2>"
  exit 1
fi

echo "Input File: " $input_file
echo "Output Sqlite File: " $out_file 

while read line
do
echo $line
mseedindex -sqlite $out_file $line
done < $input_file

对于该程序,采用如下的调用方式

bash make_mseedindex.sh MSEED_PATH_2022 MSEED_PATH_2022.sqlite > log/MSEED_PATH_2022 2>&1 &

其中,
2>&1 表示将标准输出和标准错误都重定向到同一个文件中;
程序末尾添加&来将其添加至后台,可使用命令jobs查看;

对于该mseedindex数据库的使用,可参考如下代码:

from msutils.dbdata import Client
from obspy import UTCDateTime

db_file = "MSEED_PATH_2022.sqlite"
cnt = Client(db_file)
# 选项datapath_replace主要用于调整同一批数据在不同服务器上挂载时路径由于路径差异引起的数据检索错误
# 如 制作mseedindex时采用的数据相对路径为20210702/XJ/XJ.DIK.2021182160002.D.00.BHN.mseed,当使用绝对路径时
# datapath_replace=("^", "/path/")
# 即Client(db_file, datapath_replace=("^", "/path/"))

st = cnt.get_waveforms(network="AH", station="CHZ",
                       channel="BH?,HH?,SH?,EH?",
                       location="*",
                       starttime=UTCDateTime("2019-365"),
                       endtime=UTCDateTime("2020-001"))
print(st)

输出为:

20205 Trace(s) in Stream:

AH.CHZ.00.BHE | 2019-12-31T16:00:05.113900Z - 2019-12-31T16:00:09.493900Z | 100.0 Hz, 439 samples
...
(20203 other traces)
...
AH.CHZ.00.BHZ | 2019-12-31T23:59:55.550400Z - 2019-12-31T23:59:59.990400Z | 100.0 Hz, 445 samples

[Use "print(Stream.__str__(extended=True))" to print all Traces]

注意:当前程序无法构建SAC数据的mseedindex索引数据,需要将其转换成mseed后再进行构建。

mseedindex输出的详细介绍

mseedindex数据索引实际上是SQLite格式的数据库,由于其特殊的格式,因此需要使用特定的软件或者程序查看、修改其内容。在Linux系统下可以使用sqlite3命令。

# 创建或者打开文件xxxx.db.sqlite3并进入命令行模式, 每个命令以;结束
sqlite3 xxxx.db.sqlite3
# 使用.help可以查看可用命令及其说明,在这里介绍一些我们用到的命令
# 首先,数据库是列表的优化,因此,数据的索引信息实际上依旧是以列表
# 的形式存储,只不过能够在信息检索过程中能够更快的找到,因此,我们
# 需要知道数据中的列表名称,即
sqlite> .tables;
# 我们的mseedindex数据库的列表名称是tsindex
# 不同信息的表头是如何获得的呢?
sqlite> PRAGMA table_xinfo(tsindex);
# 输出为
0|network|TEXT|0||0|0
1|station|TEXT|0||0|0
2|location|TEXT|0||0|0
3|channel|TEXT|0||0|0
4|quality|TEXT|0||0|0
5|version|INTEGER|0||0|0
6|starttime|TEXT|0||0|0
7|endtime|TEXT|0||0|0
8|samplerate|REAL|0||0|0
9|filename|TEXT|0||0|0
10|byteoffset|INTEGER|0||0|0
11|bytes|INTEGER|0||0|0
12|hash|TEXT|0||0|0
13|timeindex|TEXT|0||0|0
14|timespans|TEXT|0||0|0
15|timerates|TEXT|0||0|0
16|format|TEXT|0||0|0
17|filemodtime|TEXT|0||0|0
18|updated|TEXT|0||0|0
19|scanned|TEXT|0||0|0
# 有时候我们也想看看全部信息
sqlite> select * from tsindex;
XJ|WNQ|00|BHZ|D||2021-07-01T16:00:03.570000|2021-07-02T16:00:01.170000|100.0|/data/NFSLINK/dataCSN/bkcCSNDATA/DATA_BKC_100HZ/BKC100HZ_21/20210702/XJ/XJ.WNQ.2021182160003.D.00.BHZ.mseed|0|8126464|dcf0e7fd5c46b4489417a67bf31ad3bc|1625155203.570000=>0,1625158777.170000=>327680,1625162350.860000=>655360,1625165926.600000=>983040,1625169501.850000=>1310720,1625173072.850000=>1638400,1625176630.530000=>1966080,1625180199.590000=>2293760,1625183691.700000=>2621440,1625187498.200000=>2981888,1625191097.030000=>3342336,1625194522.490000=>3670016,1625198316.740000=>4030464,1625201756.730000=>4358144,1625205582.920000=>4718592,1625209114.390000=>5046272,1625212575.490000=>5373952,1625216368.050000=>5734400,1625219812.070000=>6062080,1625223553.360000=>6422528,1625226981.970000=>6750208,1625230463.250000=>7077888,1625234344.610000=>7438336,1625237890.480000=>7766016,latest=>1|[1625155203.570000:1625241601.170000]|||2021-08-28T00:22:23|2021-08-28T00:22:23|2024-06-18T14:03:12
# 上述操作,可以满足我们对于数据库的基本查看操作。对于生成的数据库,
# 一般不需要修改,但是由于大批量数据在不同服务器上挂载是绝对路径可能
# 存在差异,因此,把每个数据文件的路径(filename)修改相对路径是比
# 较合理的
sqlite> update tsindex set filename=substr(filename, instr(filename, 'BKC100HZ_21'));
# 上述命令可以对于列filename的修改,
# 其中,instr命令用于确定某一字符在原先filename的值中的位置;
# substr则用于字符信息的截取;
sqlite> select substr(filename, instr(filename, 'BKC100HZ_21')) from tsindex;
# 可以采用上述操作查看一下即将赋值的信息是否与预期一致;
sqlite> .quit
# 退出后信息也将保存

mktraceiodb

用于制作SAC或者MSEED格式的地震数据索引,但是该索引区别于mseedindex生成的数据库,仅用于地震事件波形的切割(cutevent的输入)

mktraceiodb -L tmp -LIST file_list -O file.db

其中,
file_list包含了需要相关地震数据的文件路径;
tmp,若是有些台站不需要处理,可将其放置于该文件中;
file.db,生成的数据索引,如下:

# NET STA    LOC CHN  Q  FMT UTEPOCH-START      UTEPOCH-STOP       RATE       NSAMP             FNAME
SC    TGXJ   00  BHE  D  2  1659916800000000   1660003200000000   100.00     8640001            SC.TGXJ.BHE

cutevent

 cutevent -tbl file.db -ctlg catalog.dat -b -1m -e +30m

其中,
file.db是由mktraceiodb生成的地震数据索引,对于任意的数据结构,我们只需提前生成相应的数据索引,便可以指定在cutevent的选项-tbl上来进行数据检索;
catalog.dat为我们要截取的地震事件,格式如下:
2022,06,01,09:00:08.10 102.930 30.380 6.3 15
yyyy,mm,dd,hh:mm:ss.sss evlo evla M evdp
更多格式可看程序详细介绍。
-b和-e用于指定相对于发震时刻的开始时间和结束时间;

posted @ 2024-06-18 15:04  Lewen  阅读(14)  评论(0编辑  收藏  举报