一份地震目录看上去像一张事实已定的表:时间、纬度、经度、深度、震级。表格中的每一行把背后的动作藏了起来。仪器对地面运动取样,软件识别候选震相到时,定位程序依据地球模型拟合这些到时,事件关联流程把先后产生的解归入同一组,最后由分析人员或排序规则选出优先展示的一个震源解和一个震级。
开放地震学把这些动作的踪迹保留下来,使其能够越过单一供应商数据库的围墙。国际数字地震台网联合会(International Federation of Digital Seismograph Networks,FDSN)定义了共享的 Web 接口。ObsPy 把返回的波形、台站清单和事件目录交给研究人员,以 Python 对象呈现。SeisComP 运行一套模块化的数据采集与监测系统。QuakeML 为事件描述提供交换表示。[1][3][5][8] 这些项目的功能有所交叠,各自承担着不可互换的角色;目录之所以保持可订正,恰在它们彼此衔接的缝隙里。
这一区分的意义超出了软件设计本身。一项针对常用地震学产品的同行评议研究指出,地震目录和矩张量解属于解释性产品,和原始数据分属两类;缺少记录、未作版本管理的变更会损害可复现性。[10] 开放体系不会自动保证解释正确,它能保留足够的身份标识、元数据和中间对象关系,让另一个团队检查这项解释是如何得出的。
封面照片记录了 2023 年土耳其破坏性地震之后,USGS 与 AFAD 工作人员在加济安泰普铺设节点式台阵的现场。[11] 一列白色仪器也把软件层面的关系化为直观图景:定位来自观测之间的联系,任何一个节点里都没有完整的事件结果。
FDSN 把三类答案分开
FDSN Web 服务基准开放了三种接口。它们的 URL 看起来相近,背后对应的证据类型却各不相同。[1]
fdsnws-dataselect返回 miniSEED 格式的时间序列记录。fdsnws-station返回 StationXML 格式的网络、台站、通道与仪器响应元数据。fdsnws-event返回 QuakeML 格式的事件参数。
这种分离避开了一个很容易犯的类别错误。波形请求回答:“在这段时间内,这些网络、台站、位置和通道代码有哪些采样值可用?”台站请求回答:“在那个历元里,这些代码对应什么仪器,又对应怎样的响应链?”事件请求回答:“这个数据中心为一项经过解释的事件发布了什么解?”第三种响应可以由前两类数据生成,但它依然是一项解释结果,和原始记录的另一种视图有本质区别。
FDSN 兼容性的范围止于接口,全球数据仍由各提供方分散保管。各提供方维护自己的数据、政策和处理系统,再按共享接口对外响应。ObsPy 的 Client 可以通过同一套 API 访问多家提供方,路由客户端则能在受支持的联合体系中发现波形与台站数据。[3] 事件标识符和目录内容仍由各提供方分别定义。脚本一旦改换数据中心,即使 Python 调用没有变化,证据输入也随之改变。
由此得到的是一项克制而有力的互操作承诺:客户端可以提出熟悉的问题,并收到格式已知的响应。各中心在台站覆盖、延迟、响应细节、拾取结果和首选震源解上仍可各不相同。
台站历元让采样值可以解释
miniSEED 之所以紧凑,是因为它主要用于记录波形。采样值携带数据流标识和时间信息,传感器与数据记录器的完整资料则存放在台站清单中。StationXML 用分层形式表示从网络、台站、通道到响应的关系,其中也包括带有起止时间的设备历元。[2] 这段有效期至关重要。若把今天的响应套到早期传感器配置下记录的采样值上,得到的波形可以看起来十分整洁,物理意义却是错的。
ObsPy 明确呈现了两者的配对关系。get_waveforms() 生成由 Trace 对象组成的 Stream,get_stations(..., level="response") 生成 Inventory,get_events() 则生成 Catalog。[3] 要把仪器计数值换算为位移、速度或加速度,remove_response() 需要与记录时段匹配的响应信息。反卷积过程中还要作出分析选择,例如设置频域预滤波器或水位参数,以控制信号放大。[4]
这些选择属于结果本身,也要像数据一样记录。响应去除会原地修改数据数组,因此,可复现的工作流会保留下载所得的 miniSEED 原件,保存覆盖同一通道和同一时段的 StationXML,在副本上执行校正,并记录 ObsPy 版本及滤波参数。缺口和重叠也应在合并或插值之前检查。若原始采样值、响应历元和处理历史无法追溯,再漂亮的波形图也只有很弱的证据力。
这一环节显示出 OSS 各组件分工的价值。FDSN 规范化访问方式,StationXML 让仪器历史拥有可移植的表达形式,ObsPy 则让这对数据便于检查和变换。至于某个脉冲是否来自地震,判断仍留给后续处理与分析。
SeisComP 面向监测中心的日常运行
在研究 notebook 中,事后获取一段起止时间明确的区间,有时已经够用。监测中心面对的任务不同:持续采集、归档、自动震相处理、数据库状态、操作人员复核,以及用变更后的配置重放旧波形。SeisComP 7.3.1 让多个自动模块和交互模块分担这些任务,整套工作不会集中到一个程序里。[5]
在这张图里,人们很容易把 SeisComP 的位置画反。一条有代表性的运行数据流是:台站数据流进入 SeisComP,随后归档数据和目录产品通过 FDSN 服务流出,交给 ObsPy 等客户端。SeisComP 的 fdsnws 服务器可以用 miniSEED 对外提供时间序列,用 StationXML 提供台站与响应元数据,也用 QuakeML 提供震源解和震级估计。[6] ObsPy 常位于这道服务边界的下游,SeisComP 的实时处理链本身可以独立运行。
这套架构允许两端各自保持独立。运行团队可以维持受控的内部数据库和消息流,同时发布只读的标准服务。研究人员可以用开放客户端获取同一批对外证据;内部数据库凭据和监测中心的运行环境则继续留在中心内部。格式与服务把双方连接起来,可变数据存储仍各自管理。
这道分界依然存在摩擦。公开的 FDSN 响应可以经过筛选,也可以残缺,覆盖范围还可以小于内部对象关系图。以 SeisComP 自身的说明为例,一部分标准查询参数尚未支持,事件筛选器针对的则是首选震源解或首选震级。[6] 对“兼容标准”的判断应落实为一张逐项检验提供方实际能力的矩阵,简单的“是或否”标签给不出足够信息。
一个事件是一份汇集相互竞争的震源解的案卷
这张图中最能揭示问题的对象是事件,波形居于次位。
一次拾取在数据流上标出一个推定的震相到时。定位程序把多次拾取组合成一项震源估计:在特定走时模型和配置之下,给出发震时刻与震源位置。随着更多震相抵达,或分析人员修订拾取,同一次物理地震可以拥有多个震源解。SeisComP 的 scevent 把陆续进入的震源解与事件关联起来,也能接收其他机构给出的震源解,并按照可配置的优先级选出首选震源解、震级和震源机制解。[7]
“首选”由此成为一种状态,早先的解依旧可以留在事件中。新的自动解、经过复核的人工解或机构优先级规则,都可以改变首先展示哪一个解。关联本身也是一项假说:scevent 能比较发震时刻、位置和相符的震相到时,随后在证据支持时合并、拆分或重新分配事件关系。[7]
这种设计比把首条警报固化为永久记录更贴近实际,也把运行政策显露出来。eventAssociation.minimumDefiningPhases 和 eventAssociation.priorities 等参数让隐藏的判断变成可检查的配置。这些默认值来自运维配置,不能视作普适的科学真理;稀疏的区域台网、密集的临时台阵和全球预警中心,各自承担着不同的失效代价。
独立研究也强化了这道界线。研究人员在考察广泛使用的地震学产品时发现,方法、来源记录、独立性和带时间戳的留存方式,会影响基于目录得出的结果能否比较或复现。[10] 开放对象模型能发挥作用,前提是运行方保留相互竞争的解,使用者也保存自己实际分析过的版本。
QuakeML 搬运这份案卷,也显出转换的断崖
QuakeML 1.2 仍是 FDSN 事件服务采用的稳定版本。它的基础事件描述(Basic Event Description)表达结构化的地震学参数,波形采样值留在描述之外;范围更广的 QuakeML 2.0 各功能包仍在开发。[8] 在这套协作关系中,QuakeML 如同一只信封,使目录结果在离开一个系统时仍保有关系与标识符,避免退化成一张截图或摊平的一行数据。
这只信封无法确保每次往返都无损。SeisComP 通过自己的数据模型和 SCML 表示存储、交换内部对象。它的 sccnv 工具可以把 SCML 事件参数导出为 QuakeML 1.2;若直接输入 QuakeML,则要经过按版本区分的转换工具。文档提醒,非标准对象、不唯一的公共 ID、缺失的父级引用和空缺的创建元数据,都会限制数据转回 SCML。[9]
这种不对称为每一个开放体系都留下了警示。标准可以保存丰富的概念;两套软件对每项扩展或标识符是否赋予同样的含义,仍要逐项验证。“两个工具都能打开 XML”只验证了表层兼容。真正的检验落在一次导出和导入之后:拾取与到时的链接、震源解身份、机构与创建信息、评估状态和首选解,是否仍然保持原来的含义?
下载之外,还要演练一次修订
验证这套协作只需一项小规模评估,搭建监测中心远超所需范围。选择一个资料完备的公开事件,以及一个同时有波形和响应元数据的台站。分别保存 dataselect、station 和 event 的确切 FDSN 请求 URL 与原始响应。在 ObsPy 中载入波形和台站清单,检查缺口,在副本上校正为明确命名的物理单位,并保留每一项处理参数。提供方给出的事件结果要与底层的版本化材料相互核对;其中的纬度与震级仍属于待核验的解释结果,底层材料保留着核验依据。
对正在考虑采用 SeisComP 的运行团队而言,有意义的试点是一次回放。把留存下来的一段波形和匹配的台站清单送入非生产配置,观察拾取怎样产生震源解、连续的震源解怎样归入同一事件、首选震源解怎样变化,以及对外 FDSN 事件响应包含哪些内容。把事件导出为 QuakeML,交给预定的下游消费者测试,再核对标识符和关系,同时避免只盯着醒目的震级数值。
采用范围应始终写清楚。ObsPy 很适合脚本化检索、分析、教学和可复现的批处理工作。SeisComP 增添了持续监测所需的一整套运行能力,也同时带来台站清单管理、档案、消息传递、数据库运维、告警质量复核和值班责任。[5] 小型研究团队若只是读取目录,安装一整套运行中心会超出需求;对台网运行方而言,一次成功的 notebook 也不能等同于受到监测、可以重放的服务。
因此,互操作性最深的一层收获,在于保留分歧;流水线是否无缝居于次位。原始采样值可以原样保留。仪器历史可以得到修正,原始记录仍维持原貌。新的震源解可以取代旧解成为首选,旧解仍留在案卷里。目录中的首选行可以改变,证据轨迹仍然可查。开放地震学让地震目录在公开修订答案的过程中变得更加可信。
来源
- 国际数字地震台网联合会,“FDSN Web Services”——当前服务版本,以及 miniSEED、StationXML 与 QuakeML 响应之间的分工。
- FDSN,“StationXML documentation”——网络、台站、通道、设备历元和仪器响应模型。
- ObsPy 1.5.0 文档,“FDSN web service client”——提供方客户端、路由,以及
Stream、Inventory和Catalog返回类型。 - ObsPy 1.5.0 文档,“Seismometer Correction/Simulation”——响应级台站清单检索、反卷积、预滤波及原始数据留存。
- SeisComP 7.3.1 文档,“Overview”——模块化采集、归档、自动处理、交互复核、台站清单、消息传递和波形回放。
- SeisComP 7.3.1 文档,
fdsnws——面向 miniSEED 波形、StationXML 元数据和 QuakeML 事件估计的只读服务边界,以及实现上的限制。 - SeisComP 7.3.1 文档,
scevent——震源解关联、事件建立、相互竞争的震源解和首选解排序。 - QuakeML,“QuakeML”——稳定的 1.2 版本、Basic Event Description 的范围,以及仍在开发的 2.0 各功能包。
- SeisComP 7.3.1 文档,
sccnv——从 SCML 导出 QuakeML,以及文档列明的 QuakeML 转回 SCML 时的限制。 - Boris Rösler、Seth Stein 与 Susan E. Hough,“On the documentation, independence, and stability of widely used seismological data products”,Frontiers in Earth Science 10,2022——对解释性产品、来源记录和版本管理的独立分析。
- 美国地质调查局,“Surface nodal seismometer installation in Turkiye”——2024 年 3 月的野外照片、背景与摄影署名。