手头有很多个地震事件需要去除仪器响应,SAC 文件全部位于类似 yyyy/yyyymm/yyyymmddhhmmss/*.SAC 的目录中, RESP 仪器响应文件位于当前目录的 resp 文件夹下。刚开始想要在 SAC 命令中指定仪器响应文件所在文件夹,试验了很久没有成功。 SAC 手册中介绍了 3 种方法:

  1. 使用 evalresp 选项但不指定 RESP 文件时,transfer 会对内存中的所有 SAC 数据进行循环。对于内存中的每个 SAC 数据,从头段中提取台站分量信息,然后在当前目录下寻找并使用对应的仪器响应文件;
  2. 使用 evalresp fname 选项为每个波形分别指定 RESP 文件;
  3. 将所有台站的 RESP 文件都合并到同一个文件中并指定该总 RESP 文件为仪器响应文件,此时命令会从总 RESP 文件中自动寻找匹配的仪器响应。

最终选择编写 Perl 脚本进行批量处理,先将所有仪器响应文件复制到 SAC 数据文件夹中,去除仪器响应后再删除。

#!/usr/bin/env perl
use strict;
use warnings;
$ENV{SAC_DISPLAY_COPYRIGHT} = 0;
my ($f1) = 0.005;
my ($f2) = 0.01;
my ($f3) = 1.0;
my ($f4) = 1.3;
my $dir;
foreach $dir (<*/*/*>) {
  if (-d $dir) {
system "cp resp/* $dir"
chdir $dir;
open(SAC, "| sac") or die "Error in opening sac\n";
print SAC "wild echo off\n";
print SAC "r *.SAC \n";
print SAC "rglitches; rmean; rtrend; taper \n";
print SAC "trans from evalresp to vel freq $f1 $f2 $f3 $f4\n";
print SAC "mul 1e-7\n";
print SAC "w over\n";
print SAC "q\n";
close(SAC);
unlink glob "RESP*";
chdir "../../..";
   }
}