pSolve 全局解算中的射电源名称

· 预计阅读 8 分钟

同一个射电源可能有 IVS 名称、B1950 名称、J2000 名称和常用别名。准备全局解算时,这些名称会出现在观测数据库、控制文件、先验坐标文件和名称对应表中。它们能否互换,关系到源的选择、坐标参数的估计、天球参考架的无净旋转约束,以及不同实验之间的全局参数合并。

pSolve 以实验数据中读入的射电源名称作为内部名称,一般采用IVS名称,后续主要按这个名称进行匹配。实际使用时,应让各类输入文件采用一致的 IVS 名称,但程序并不会在读入时自动把各种别名转换为 IVS 名称。射电源名称对应表($SAVE_DIR/source.names)是否参与处理、哪些名称可以用于查找,取决于具体的读取程序。

一、射电源名称的读入与存储

对于 GVF 数据,射电源名称及观测索引的读入关系如下:

flowchart TD
    A["BATCH → PRCES → ARCSET → GARC"] --> B["GETDB_DO 读取 GVF"]
    B --> C["GETDB_FILL_PARFIL:SRCNAMES → ISTRN_CHR → C_SOU"]
    B --> D["GETDB_FILL_OBORG:SOU_IND → ISTAR"]

GETDB_FILL_PARFIL 从 GVF 的 SRCNAMES 数据项读取射电源名称,每个名称占 8 字节,写入 ISTRN 所在的存储区。ISTRN_CHR 是同一存储区的字符形式。这些名称随后复制到传给 VTD 的列表 C_SOU 中,过程中没有根据名称对应表进行改名。

单条观测通过整数索引与射电源表关联。GETDB_FILL_OBORG 将数据库中的 SOU_IND 读入 ISTAR,表示该观测对应当前实验射电源表中的哪一项。后续程序通过 ISTRN_CHR(ISTAR) 取得名称。因此,同一实验内的观测通过索引找到射电源,跨文件匹配和跨实验识别则主要依靠名称。

psolve/include/prfil.i 中,与射电源名称有关的声明包括:

CHARACTER ISTRN_CHR(MAX_SOU)*8
CHARACTER JNAME(MAX_SOU)*10
CHARACTER BNAME(MAX_SOU)*8

EQUIVALENCE ( ISTRN, ISTRN_CHR )
EQUIVALENCE ( BNAME, ISTRN_CHR )

ISTRN_CHR 和 BNAME 都是 8 字符数组,通过 EQUIVALENCE 共用同一块内存。BNAME 只是访问这块存储区的另一个变量名,并不表示程序进行了 B1950 名称转换。JNAME 则是单独存储的 10 字符数组,用于保存 J2000 名称。

GETDB_DO 后续会用内部名称与 VTD 射电源记录的 IVS_NAME 比较。匹配成功后,将记录中的 J2000_NAME 复制到 JNAME,但不改动 ISTRN_CHR。这一步补充了供输出等用途使用的 J2000 名称,控制文件匹配和全局参数合并仍使用原来的 8 字符内部名称。

batch 解析控制文件时先保存名单中的射电源名称,处理具体实验时,再将它们与内部射电源表 ISTRN_CHR 中的名称比较。这一步不查询名称对应表,也不通过 JNAME 查找对应射电源。因此,控制文件应采用数据库中的射电源名称。例如,数据库中的名称是 3C273B,控制文件中也应填写 3C273B。即使 1226+023 和 J1229+0203 指向同一天体,batch 也不会自动将它们对应到 3C273B。

对于 SOURCES ... EXCEPT 这样的例外名单,使用其他名称会使预期的源无法匹配该项例外,程序仍按默认设置或已有状态处理。程序不一定因此报错,但相关例外设置没有生效,这可能会影响到解算结果,在天体测量和天球参考架相关研究中尤其需要注意。

二、先验文件中的射电源名称匹配

2.1 $MAPPING:按射电源名称替换坐标

$MAPPING 中的 SOURCES 指定了射电源坐标的替换文件,主要调用关系为:

ARCSET → DOMAPP → FLYBY_INIT → SSOUC → GSOUC / DSOUC

GSOUC 按对应格式读取文件中的 8 字符射电源名称,名称位于记录的第 5–12 列。DSOUC 将它与实验内部名称直接比较,匹配成功后更新坐标,不改变内部名称。如果先验文件使用了其他名称,即使记录对应同一天体,也不能因此匹配成功。未匹配的射电源保留进入该步骤时的坐标;由于此前可能已经经过其他处理,这不一定是数据库最初提供的值。是否输出相关警告,由 FLYBY_WARNING 控制。

2.2 VTD:按文件格式查找射电源名称

VTD 根据 SOURCE_COORDINATES 加载射电源坐标,pSolve 通过 C_SOU 提供需要加载的射电源名称。VTD_LOAD_SOUCOO 按文件格式选择查找字段。例如,2019.08.08 格式使用第 4–11 列的主名称匹配,第 14–23 列的 J2000 名称仅作为附加信息保存。找不到请求的射电源时,VTD 会返回相应错误,可能使后续处理失败。

SOURCE-NAMES v2.0 格式允许按 IVS、B1950 或 AIPS 名称查找,分别使用第 1–8、23–30 和 33–42 列,不使用 J2000 名称列。但这一分支对别名的支持并不完整:加载后,程序将第一列名称保存为 VTD%SOU%IVS_NAME,却不改写调用者的 C_SOU 或 ISTRN_CHR;后续 VTD_SOU_INDEX 又只按 IVS_NAME 查找。 如果通过 B1950 或 AIPS 别名完成加载,而该别名与记录第一列的名称不同,就可能出现初次加载成功、后续查找失败的情况。pSolve 的后续计算程序仍使用原来的名称调用 VTD_MOMENT 或 VTD_DELAY,但 VTD 内部已经按第一列名称保存了该射电源,两者无法匹配。具体报错位置取决于执行路径。

因此,数据库中的射电源名称、传给 VTD 的名称和先验射电源表的主名称应保持一致。若修改程序,需要在统一的入口转换名称,或让后续相关查找采用一致的名称解析方式。仅让一个读取程序接受更多别名,还不足以保证不同实验中的同一射电源能够正确合并。

2.3 SINEX:补充输出名称

SINEX 输出使用射电源名称对应表。WRITE_SINEX 调用 GET_SOURCE_TABLE 读取该表,再按 IVS 名称寻找记录,为输出补充相关名称。这一步不会改写数据库读入的内部源名。

因此,射电源名称对应表有两种用途:作为 VTD 的坐标输入时,它用于加载源坐标和名称信息;用于 SINEX 输出时,它提供输出所需的名称。

三、全局射电源表与坐标参数的合并

射电源名称也决定不同实验中的坐标参数能否合并。这一过程既涉及射电源表中的记录,也涉及全局参数的名称。

LISTS_UPDATE 调用 DEPAR 和 ADPAR。ADPAR 将当前实验的射电源名称与累计射电源表中的名称按 8 字符比较:找到同名射电源就关联已有记录,否则新增一项。它不通过 J2000 名称或坐标接近程度判断两条记录是否属于同一天体。随后,GET_NAMES 将内部射电源名称写入坐标参数名的前 8 个字符,再加上 RIGHT ASCENSION 或 DECLINATION 等字段;LISTS_UPDATE 按完整的参数名称寻找已有全局参数。

如果同一天体在两个实验中使用了不同的内部名称,而且两个实验都通过了前面的读取和模型匹配,相关射电源坐标也被选为全局待估参数,那么它们可能形成两组独立的全局坐标参数,不会自动合并。因此,数据库、控制文件和先验射电源表中的名称需要保持一致。只修改控制文件中的名单,不能消除数据库之间原有的名称差异。

四、射电源名称对应表的差异

Karine Le Bail 和 Leonid Petrov 博士分别维护了射电源名称对应表,后一版本可从 NASA SGDASS 仓库的 vtd/share/source.names 获取。两份文件都采用 SOURCE-NAMES v2.0 格式,但收录的记录、主名称和别名并不完全一致。例如,IVS 版本以 NGC4552 为主名称,Petrov 版本则以 1233+128 为主名称。两者的 J2000 名称均为 J1235+1233,B1950 名称均为 1233+128;IVS 版本的 AIPS 名称为空,Petrov 版本则填入 NGC4552。

射电源名称对应表中的共享名称可以帮助建立记录之间的对应关系,但不会自动改变程序的匹配结果:若数据库使用 NGC4552,而读取程序只比较另一文件的主名称 1233+128,仍然无法匹配。尽管两份表都将第一列标为 IVS 名称,但这并不能保证它们对每个射电源采用相同的名称。在使用时,应以某一个版本为准。