用 SAC 快速拾取震相

震相拾取,是地震学的一个基本工作。SAC 提供了 plotpk 命令,可以用于手动拾取 震相到时,用起来还算是比较简单方便。

痛点

在使用 plotpk 拾取震相时,还是会遇到一些不如意的地方。尤其是在有大量波形 数据需要拾取的时候。下面列出我日常遇到的几个痛点:

  1. 拾取震相时通常需要按下 T 和数字键,有时还需要按下 BN 来上下翻页。 效率低下,一方面需要按两次按键才能标记一个到时,另一方面大多数数字键与 T 距离较远,手指姿势比较别扭且容易误敲键盘
  2. 无法删除某个震相标记。如果想标记 T0,但是一不小心标记了 T1,此时没法将 T1 中的到时删除

解决办法

修改了 SAC 源码中的 xppk.c ,基本解决了以上痛点。关于源码的几点说明:

  1. SAC 的协议规定了不能私自修改 SAC 源码,此处给出了修改后的 xppk.c ,低调低调
  2. 修改版源码基于 SAC v101.6a,所以在其他版本上可能无法使用
  3. 下载修改版源码,用其覆盖 SAC v101.6a 源码里的 src/gam/xppk.c,然后重新编译 SAC 即可

源码下载: xppk.c

修改后的源码新增了如下功能:

  1. 直接使用数字键拾取震相,即省略了按键 T ,按 0 就拾取到时 T0,按 1 就拾取到时 T1
  2. 按下 @ 键即可删除最近一次到时标记(A、F、P、S 以及 T0 到 T9)

修改后的源码与原 SAC 有如下不兼容的地方:

  1. 原 SAC 中,数字键 0 到 4 被用于定义震相质量,修改后的源码中 0 到 9 则被用于标记震相到时
  2. 原 SAC 中,按键 @ 用于一次性删除多个震相到时(A、F、P、S 和 T0),修改后的源码中 @ 可以删除任意一个到时标记

考虑到定义震相质量和一次性删除多个震相到时这两个功能很少用到,因而为了拾取 震相的便利性而废弃了这两个功能,虽然带来了不兼容问题,但是基本无伤大雅。

一些说明

关于数字键标记到时的说明:

  1. 依然可以使用 T + 数字键 来标记到时。即 T 可以省略也可以不省略,兼容之前的标记到时的方法
  2. 在 ppk 模式下单击鼠标,相当于敲键 L,此时会在图上显示当前点的 X 和 Y 值, 所以如果可以通过简单的单击就标记到时,应该会更高效。但目前还没有实现该功能, 一方面是涉及到一些技术细节,另一方面是单击操作太容易发生,标记到时是 变得简单了,但误标记也变得容易发生

关于 @ 删除震相到时功能的说明:

  1. 实现原理:定义一个字符型变量,用于保存上一次按键,若新按键是 @,且上一 按键是 A、F、P、S 或 0 到 9 中的任意一个,则删除上一按键所对应的头段变量中的到时标记
  2. 表面上看,这一功能只能删除最近一次的到时标记,但实际上是可以删除任意文件的 任意一个到时标记的

关于 @ 删除震相到时功能的示例:

  1. 要拾取一个波形数据,在 ppk 模式下,按下数字 1,此时会标记到时 T1,再按下 @,由于上一 字符是 1,所以此时按下 @会删除 T1 的到时标记。实际操作时,屏幕上会出现两个 T1,这是 显示的问题,通过放大缩小刷新一下图片就会发现到时 T1 已被删除
  2. 要拾取一个波形数据,在 ppk 模式下依次按下 0、1、2,此时会标记到时 T0、T1 和 T2。 此时按下 @,由于上一字符是 2,所以会删除 T2 中的到时。若想要删除 T0 的到时,则需要 先按下 0 再按下 @,按下 0 会重新标记到时 T0,再按下 @时上一字符由于是 0,所以会删除 T0 中的 到时。

修订历史

  • 2016-02-19:直接用数字键标记到时
  • 2016-02-25:新增删除到时标记功能
  • 2016-02-28:修复了 @符号无法删除 P 和 S 到时的 BUG