WINファイルのデータフォーマット

(The data format of a WIN file)

Last Update: 2022/3/18


WINファイルのデータフォーマットの説明は 東京大学地震研究所のWIN公式マニュアル中、 winformatの項目に書かれている。 ここではその内容に基づき、 ymaeda_opentoolsで扱う「ディスク上のデータ」に絞って WINのデータフォーマットを整理する。
The data format of a WIN file is explained in the page of winformat in the official WIN documentation of Earthquake Research Institute (ERI), the University of Tokyo, Japan. Based on that description, only the “data in disk”, which are treated by ymaeda_opentools, are summarized below.


1. WINのデータ構造を理解するポイント (Essentials to understand the data structure of WIN)

ポイント1 : 秒をまたぐデータの独立性 (Point 1: Independence of data over seconds)
WINファイルは1秒間のデータを基本単位として構成されている。
A WIN file is constructed by data in each 1 s as the basic unit.

2秒以上にわたるWINデータファイルは 個々の1秒間のデータを単純に書き並べただけである。 例えば全体で何秒分のファイルであるとか、全体の開始時刻や終了時刻とか、 そういった秒の枠を超えた情報はどこにも書かれていない。
A WIN file that consists of 2 s or longer data is simply an array of individual 1 s data. There is no information on the total data length, starting or ending times, or any other information beyond the 1 s frame.

それぞれの秒のデータはその中だけで完全に完結しており、 他の秒のデータを参照する必要は一切無いように作られている。 その秒のデータが直前のデータの次の秒であることすら仮定されてはいない。 したがって、直前に書かれているデータとそのデータの間で 時刻に飛びがあったとしても、あるいは時刻が逆転していたとしても、 WINデータとしては何ら問題の無い完全なデータである。 つまり秒をまたぐデータ間は完全に独立で、 WINファイル全体のヘッダというものは存在しないのである。
Each 1 s data is a complete data within it, without referring to any information in the other seconds. Each 1 s unit may not necessarily stand for the data 1 s after the previous 1 s unit; time gaps or reversals between two consecutive 1 s units do not violate the rules of the WIN data format. Therefore the data for different seconds are completely independent, and there is no header for the entire WIN file.

これが可能となるのは、それぞれの秒のデータ中に 時刻の情報が(前のデータに対する相対値ではなく) 絶対時刻として書かれているためである。
This is possible because data for each 1 s unit consists of the absolute time (i.e., not relative to the previous unit).

時刻の異なるWINファイルをcatコマンドによって結合できるのもそのためである。 逆に、WINファイルからある特定の1秒間のデータを取り出せば それだけで(ヘッダ等を付加・変更することなく)完全なWINデータとなる。
This is the reason why WIN files in different time periods can be merged by cat command. Also, a 1 s data unit extracted from a WIN file is by itself a complete WIN data, without adding or modifying headers.


ポイント2 : チャンネルごとのデータの独立性 (Point 2: Independence of data among channels)
後述するが、上で述べた1秒単位のデータはヘッダとデータ本体から成り、 ヘッダには時刻の情報などが書かれている。 データ本体は各チャンネルのデータから成るが、 これがまた互いに独立なものになっている。 チャンネルごとのデータは他のチャンネルのデータを参照することが無く、 チャンネル内のデータ以外で参照するのは 1秒毎のデータ単位の先頭に書かれている時刻情報だけである。 したがってチャンネルはどのような順番で登場しても良く、 同一観測点の別の成分のチャンネルがまとまっている必要も無い。 更に、チャンネルごとにデータサイズやサンプリングレートなどが 異なっていても構わない。
As is described later, the 1 s data unit described above is composed of headers, including information of time, and the data part composed of data from individual channels. These data from individual channels are independent to each other; data for each channel does not refer to information in the other channels, and only the information outside of the channel is the time obtained from the head of the 1 s data unit. Therefore channels can appear in an arbitrary order, and even the channels that represent different components of the same station do not necessarily be adjacent. Also, the data size and sampling rate can be different among the channels.

また登場するチャンネルやその順番は秒ごとに独立である。 前の秒に登場したチャンネルが登場しなくても構わないし、 前の秒に登場しなかったチャンネルが登場しても構わない。 チャンネルの順番が前の秒とは入れ替わっていても良い。
Also, the channels and their orders are independent between seconds. A channel that was present in the previous second may not necessarily appear in the current second, and a channel that was absent in the previous second may appear in the current second. The order of the channels may be inconsistent among the seconds.


ポイント3 : 各時刻におけるデータ値の表し方 (Point 3: Representation of the data value at each time)
WINファイルにおいてデータ値は全て整数値で表される。 それは単位等を持っておらず、 そのデータ値に別のファイル(チャンネルテーブルと呼ばれる) で指定される係数を掛けて初めて m/sやm/s\(^2\)などの物理的に意味のある実数値が得られることになる。
Each data values of a WIN file is represented by an integer. It has no unit, and a real number in physical unit (i.e., m/s or m/s\(^2\)) is obtained by a coefficient specified by another file called a channel table.

また、各秒・各チャンネル内で先頭のデータ値のみが 「値そのもの」(これも整数値であるが)として与えられ、 それ以降のデータは全て 直前のデータ値との差分 で与えられている。
Also note that only the first data value in each channel of each second is given by the value itself (although it is an integer), and the remaining data values are given as the difference from the previous value.


ポイント4 : WINデータから得られるチャンネルに関する情報 (Information on the channels obtained by a WIN data)
上記の通りWINデータは秒ごとのデータに分かれ、 秒ごとのデータは更にチャンネルごとのデータに分かれているが、 それぞれのチャンネルごとのデータはごく少数のヘッダとデータ本体から成る。 チャンネルごとのヘッダにはチャンネルコードと1データサンプルあたりのバイト数と サンプリングレートしか書かれていない。 観測点名や座標、成分名、データ本体(整数値)に掛けるべき係数などはいずれも 別のファイル(チャンネルテーブルと呼ばれる)に書かれており、 WINデータだけでは処理に必要な情報が不足する。
As was described above, a WIN file is composed of 1 s units, and each 1 s unit is composed of data from individual channels. Each channel data is composed of a small number of headers and the data values. These headers for each channel only consist of the channel code, the number of bytes per each data sample, and the sampling rate. The station name, the coordinate, the component name, and the factor that needs to be multiplied with the integer data values to obtain the physical unit are all in another file (called a channel table), meaning that the WIN data alone does not have enough information for the processings.


2. WINの1秒分のデータ構造 (The data structure of a 1 s unit of WIN)

上で述べた通りWINデータは1秒単位で完結しており、 複数の秒にまたがるデータは単に個々の1秒データを書き並べただけである。 その基本単位となる1秒間のWINデータは以下の構造になっている。
As was described above, a WIN data is complete in each 1 s unit, and data longer than or equal to 2 s is simply an array of these 1 s units. The structure of this base 1 s unit of a WIN data is as below.

最初の4バイト
The first 4-bytes
1秒分のデータブロック全体のサイズ(この4バイト自身を含む)。
The total data size of this 1 s unit, including this 4 bytes.
残り全部
All the remaining parts
データ本体で 秒ブロック と呼ばれ、以下の構造を持つ。
The main part of the data called a second block, which has the following structure.
最初の6バイト
The first 6 bytes
その1秒の日付・時刻。 年・月・日・時・分・秒にそれぞれ1バイトずつが割り当てられ、 前半の0.5バイトが10の位、後半の0.5バイトが1の位を表す。 そのため「年」も下2桁表記であり、1981-2080年を表す。
Date and time of this 1 s. Each of the year, month, day, hour, minute, and second is represented by 1 byte, where the earlier 0.5 byte indicates the tens place and the latter 0.5 bytes does the ones place. This means that year is represented by the lower 2 digits; the year ranges from 1981 to 2080.
次の不定長さ
The next part of variable length
1つ目のチャンネルのデータ。 チャンネルブロック と呼ばれ、以下の構造を持つ。
The data of the 1st channel. This unit is called a channel block and has the following structure.
最初の2バイト
The first 2 bytes
チャンネル番号(4桁の16進数)。
A channel ID, represented by 4 digits of hexadecimal numbers.
次の0.5バイト
The next 0.5 bytes
1サンプルあたりのデータサイズ。 0-4の間の整数値を取る。 1-4の場合は1サンプルあたりのバイト数を表し、 0の場合は1サンプルあたり0.5バイトである。
The size of each data sample, which is an integer between 0 and 4. The values from 1 to 4 represent the number of bytes for each sample, whereas the value of 0 means that each sample is represented by 0.5 bytes.
次の1.5バイト
The next 1.5 bytes
サンプリングレート(Hz)。
The sampling rate (Hz).
次の4バイト
The next 4 bytes
先頭のデータの値。
The first data value.
次の0.5-4バイト
The next 0.5-4 bytes
2サンプル目と1サンプル目のデータ値の差分。
The difference between the values of 2nd and 1st data samples.
次の0.5-4バイト
The next 0.5-4 bytes
3サンプル目と2サンプル目のデータ値の差分。
The difference between the values of 3rd and 2nd data samples.
次の0.5-4バイト
The next 0.5-4 bytes
4サンプル目と3サンプル目のデータ値の差分。
The difference between the values of 4th and 3rd data samples.


次の不定長さ
The next part of variable length
2つ目のチャンネルのデータ(チャンネルブロック)。 構造は1つ目のチャンネルと同じ。
The data (a channel block) of the 2nd channel, which has the same structure as that of the 1st channel.
次の不定長さ
The next part of variable length
3つ目のチャンネルのデータ(チャンネルブロック)。 構造は1つ目のチャンネルと同じ。
The data (a channel block) of the 3rd channel, which has the same structure as that of the 1st channel.
次の不定長さ
The next part of variable length
4つ目のチャンネルのデータ(チャンネルブロック)。 構造は1つ目のチャンネルと同じ。
The data (a channel block) of the 4th channel, which has the same structure as that of the 1st channel.



なお、ymaeda_opentoolsではディスク上のWINデータしか扱わないが WINデータそのものはIPのUDPパケットや共有メモリなど 様々な媒体を介して流通している。 上で述べたのはディスク上のデータの構造であり、 媒体によって1秒単位のデータの構造が多少違ってくる。 但し異なるのは秒ブロックの前の部分のみであり、 秒ブロックの構造は媒体によらず共通である。
Authough ymaeda_opentools treats only a WIN data in a disc, the WIN data is transferred through various media, including a UDP packet on IP and a shared memory. The data structure described above is for a data in a disc, and the structure of 1 s unit is slightly different among the media. However, the difference is limited to the part before the second block; the structure of the second block is common among all type of media.


3. WINデータにおける整数値のバイナリ表現 (A binary expression of integer values in a WIN data)

上記の通り、WINファイルにおいてデータ値は整数で表現される。 またチャンネル番号やサンプリングレートなどのヘッダ情報も整数値で与えられる。 整数値と言ってもテキストではなく、 これらの整数値を表すバイナリデータが書かれている。 ところで整数値のバイナリ表現はコンピュータによって異なる。 WINデータはコンピュータ間でやり取りするものであるので、 どのようなコンピュータであっても共通フォーマットで読み書きができるように WINデータとしての整数値のバイナリ表現が決められている。
As was described above, the data values of a WIN file are expressed by integers. Header information (e.g., channel IDs and sampling rates) are also given by integers. These integer values are not given by text but written as binary data. However, the binary expression of an integer is different among computers. As the WIN data is transferred among computers, the data needs to be read and written with a common format that is independent of the computer environment. To realize it, a binary expression of integer values for WIN data is defined.

まずWINでは1バイト=8ビットとする。 これは当たり前のようであるが、 C言語規格を読むと一般には1バイトは8ビット以上であれば良いらしい。 以下がC言語規格からの抜粋である。
First, 1 byte is assumed to be 8 bits in WIN; this is not trivial, as 1 byte is in general greater than or equal to 8 bit according to the C language standard. The corresponding part of the C language standard is shown below.

C言語規格ISO/IEC 9899:TC2からの抜粋
A part of the C language standard ISO/IEC 9899:TC2

5.2.4.2.1 Sizes of ingeter types <limits.h>
Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.
— number of bits for smallest object that is not a bit-field (byte)
    CHAR_BIT    8

次に、WINでは1バイトを超える整数値は全てビッグエンディアンで表現される。 例えば、16進数で1A2B3C4Dと表される整数値があったとき、これを
    1バイト目 : 1A
    2バイト目 : 2B
    3バイト目 : 3C
    4バイト目 : 4D
のように並べるのがビッグエンディアンである。リトルエンディアンの場合は
    1バイト目 : 4D
    2バイト目 : 3C
    3バイト目 : 2B
    4バイト目 : 1A
のように並べることになる。 どちらの場合も1バイト内でのビット並びは同じである。 したがって、16進数の1A2B3C4Dのバイナリ表現は、 ビッグエンディアンのコンピュータでは
    0001 1010     0010 1011     0011 1100     0100 1101
リトルエンディアンのコンピュータでは
    0100 1101     0011 1100     0010 1011     0001 1010
となる。WINファイルはビッグエンディアンで書かれているので 前者の内部表現を採用しているということである。
Next, all the integers that exceed 1 byte are expressed in a big endian in WIN. The big endian means that an integer 1A2B3C4D in hexadecimal numbers, for example, is expressed as below:
    the 1st byte: 1A;
    the 2nd byte: 2B;
    the 3rd byte: 3C; and
    the 4th byte: 4D.
In case of a little endian, the same integer is expressed as below:
    the 1st byte: 4D;
    the 2nd byte: 3C;
    the 3rd byte: 2B; and
    the 4th byte: 1A.
The bit order in each byte is same in both cases. Therefore, the binary expressions of the integer 1A2B3C4D in hexadecimal numbers are:
    0001 1010     0010 1011     0011 1100     0100 1101
in the big endian and
    0100 1101     0011 1100     0010 1011     0001 1010
in the little endian. As WIN adopts the big endian, the former expression is used.

3点目に、WINでは負の数は2の補数で表現される。 2の補数とは次のようなものである。 例として10進数の1234を2バイトの2進数で表す場合を考える。 \[\begin{equation*} 1234 = 0000 \hspace{0.5em} 0100 \hspace{0.5em} 1101 \hspace{0.5em} 0010 \hspace{0.5em} _{(2)} \end{equation*}\] である。この値に対する2の補数は \[\begin{equation*} 1 \hspace{0.5em} 0000 \hspace{0.5em} 0000 \hspace{0.5em} 0000 \hspace{0.5em} 0000 \hspace{0.5em} _{(2)} - 0000 \hspace{0.5em} 0100 \hspace{0.5em} 1101 \hspace{0.5em} 0010 \hspace{0.5em} _{(2)} \end{equation*}\] と定義され、計算すると \(1111 \hspace{0.5em} 1011 \hspace{0.5em} 0010 \hspace{0.5em} 1110 \hspace{0.5em} _{(2)}\) になる。 これは\(1234-1=1233\)の2進数表現をビット反転させたものになっている。 この例から分かるように、 負の整数\(-n\)の2進数表現(2の補数による表現)は \(=n-1\)の2進数表現 のビット反転に等しい。
Third, negative values are expressed as a complementary number of 2 in WIN. To explain the complementary number, consider the binary expression for a decimal number of 1234, i.e., \[\begin{equation*} 1234 = 0000 \hspace{0.5em} 0100 \hspace{0.5em} 1101 \hspace{0.5em} 0010 \hspace{0.5em} _{(2)}, \end{equation*}\] as an example. The complementary number of 2 for this value is defined as: \[\begin{equation*} 1 \hspace{0.5em} 0000 \hspace{0.5em} 0000 \hspace{0.5em} 0000 \hspace{0.5em} 0000 \hspace{0.5em} _{(2)} - 0000 \hspace{0.5em} 0100 \hspace{0.5em} 1101 \hspace{0.5em} 0010 \hspace{0.5em} _{(2)}, \end{equation*}\] which is calculated as \(1111 \hspace{0.5em} 1011 \hspace{0.5em} 0010 \hspace{0.5em} 1110 \hspace{0.5em} _{(2)}\). This is the bit reversal of the binary expression of \(1234-1=1233\). As this example shows, the binary expression of a negative ingeter \(-n\) with the complemenrary number of 2 is equal to the bit reversal of the binary expression of \(n-1\).

使用するコンピュータでの整数のバイナリ表現が 上記のWINにおける表現方法と同じとは限らないので 関数fread, fwriteを用いて整数として直接読み書きはできない。 そこでymaeda_opentoolsでは freadを用いて一旦unsigned char型変数配列に読み込んだ上で 整数に変換する方式を採っている。
The binary expression of an integer in the computer used may not necessarily be equal to that of WIN explained above. Therefore it is not appropriate to read/write these values directly as an integer using functions fread and fwrite. Instead, ymaeda_opentools first read the values to an array of unsigned char-type variables using fread, and then convert to an integer.


4. チャンネルテーブルファイルのフォーマット (Format of a channel table file)

上記の通り、WINファイルにおいてデータ値は整数で表現され、 これをm/sやm/s\(^2\)などの次元を持つ物理量に換算するには チャンネルテーブルが必要になる。 チャンネルテーブルはテキストファイルであり、 1行につき1つのチャンネルの情報を表す。 書式は以下の通り。
As was described earlier, the data values are represented by integers in a WIN file. A channel table is needed to convert the integers to real numbers in physical unit (i.e., m/s or m/s\(^2\)). The channel table is a text file, in which information for each channel is written in each line. The format of the channel table is as below.


Column

Value
形式
Format

Example
1 チャンネルコード。
A channel code.
4桁の16進数。A-Fは大文字でも小文字でも良い。
A hexadecimal number of 4-digits. A-F can be either capital or small letters.
999A
2 回収フラグ。
A recording flag.
整数。
An integer.
1
3 回線遅延時間[ms]。
The delay time [ms] of a network.
整数。
An integer.
0
4 観測点コード。
A station code.
文字列(10文字以内)。
A string within 10 characters.
NU.NGY2
5 成分コード。
A component code.
文字列(6文字以内)。
A string within 6 characters.
U
6 モニター波形の振幅縮率を示す指数(2の累乗数)。
An index to determine the stretching ratio of the amplitude of a monitor waveform (the exponent of 2).
整数。
An integer.
7
7 A/D変換の量子化ビット数。
The number of digitizing bits for an A/D conversion.
実数。
A real number.
24
8 センサーの感度[V/単位]。 単位は第9列で与える。
The sensitivity of a sensor [V/unit]. The unit is given in the 9th column.
実数。
A real number.
800
9 センサーの入力振幅単位。
The unit of the input amplitude of a sensor.
文字列。変位はm、速度はm/s、加速度はm/s/sと書く。
A string. Use m, m/s, and m/s/s for displacement, velocity, and acceleration, respectively.
m/s
10 地震計の固有周期[s]。
The natural period [s] of a seismometer.
実数。
A real number.
1.0
11 地震計のダンピング定数。
The damping constant of a seismometer.
実数。
A real number.
0.7
12 センサー出力からA/D変換までの電圧増幅率[dB]。
The amplification factor [dB] of a voltage from a sensor output to before an A/D conversion.
実数。
A real number.
20
13 A/D変換の1量子化ステップ幅[V]。
The magnitude of the digitization step of an A/D conversion [V].
実数。
A real number.
2.4445e-06
14 観測点の緯度[°]。
The latitude [°] of a station.
実数。
A real number.
35.15503
15 観測点の経度[°]。
The longitude [°] of a station.
実数。
A real number.
136.96908
16 観測点の標高[m]。
The altitude [m] of a station.
実数。
A real number.
56
17 P波到着時刻の観測点補正値[s]。
The station correction of P-wave arrivals [s].
実数。
A real number.
0.0
18 S波到着時刻の観測点補正値[s]。
The station correction of S-wave arrivals [s].
実数。
A real number.
0.0



5. ymaeda_opentools独自のチャンネルテーブル拡張 (An extended format of channel tables for ymaeda_opentools)

チャンネルテーブルファイルには日時範囲を記載する項目が無い。 そのため、時期によってパラメータが異なる場合には 別々のチャンネルテーブルファイルを用意して 解析プログラムの外で使い分けなければならない。 たった一つのチャンネルのパラメータが変わるだけで チャンネルテーブルファイルを丸ごと別のものに差し替えなければならないため、 観測点数が多いケースでは場合分けが大変になる。
The range of date and time is not written in a channel table file. If a change in parameters is present in the analysis period, different channel table files must be prepared and switched outside of an analysis program. Even a change in parameters of one channel results in an overall replacement of the channel table file. Therefore, there are many branches in case of abundant stations.

この場合分けを回避するため、ymaeda_opentoolsでは独自に チャンネルテーブルファイルのフォーマット拡張を導入した。 チャンネルテーブルの各行の最終列に 「--start=日時」「--end=日時」と追記することで、 その行に書いた内容が有効になる日時範囲を指定できる。
To avoid the need for branching, an extended formatting rule for channel table files is used in ymaeda_opentools. In this extension, the range of date and time during which parameters in each line of a channel table file is effective can be specified by appending “--start=Date and time” and/or “--end=Date and time” at the end of the line.

日時は「YYYY/MM/DD_hh:mm:ss」の書式で記載する。 ここでYYYYは西暦年(4桁)、MMは月(2桁)、DDは日(2桁)、 hhは時(2桁)、mmは分(2桁)、ssは秒(2桁)であり、 1桁の場合は頭に0を付ける。
The format of date and time is YYYY/MM/DD_hh:mm:ss, where YYYY is year (AD, 4-digits), MM is month (2-digits), DD is day (2-digits), hh is hour (2-digits), mm is month (2-digits), and ss is second (2-digits); append zero (0) at the head to make 1-digit numbers to 2-digits.

「--start=日時」「--end=日時」は省略でき、 省略すると観測開始時点から、もしくは現在まで有効と見なされる。
If “--start=Date and time” is omitted, the line is regarded to be effective from the beginning of the observation; if “--end=Date and time” is omitted, the line is regarded to be effective until now.

フォーマット拡張したチャンネルテーブルファイルの例を以下に示す。
An example of the channel table file with this extension is shown below.

9991 1 0 NU.STN1 U 6 24 400 m/s 1.0 0.7 0 5.961e-07 35.15500 136.96900 56 0 0 --end=2022/01/10_13:30:00

# ロガー交換(9991→999A) 2022/01/10 13:30停止、14:30再開
# Logger replace (9991 → 999A); stopped at 13:30 on 2022/01/10 13:30, restarted at 14:30

999A 1 0 NU.STN1 U 6 24 400 m/s 1.0 0.7 0 5.961e-07 35.15500 136.96900 56 0 0 --start=2022/01/10_14:30:00 --end=2022/02/20_10:00:00

# 観測点移設(NU.STN1→NU.STN2) 2022/02/20 10:00停止、16:00再開
# Station moved (NU.STN1 → NU.STN2); stopped at 10:00 on 2022/02/20, restarted at 16:00

999A 1 0 NU.STN2 U 6 24 400 m/s 1.0 0.7 0 5.961e-07 35.25500 136.86900 46 0 0 --start=2022/02/20_16:00:00

# 99A1は全期間通して変更なし
# No change for 99A1 throughout the entire period

99A1 1 0 NU.STN3 U 6 24 400 m/s 1.0 0.7 0 5.961e-07 35.35500 136.76900 66 0 0

この拡張機能を用いれば、 チャンネルテーブルファイルを手作業や外部のスクリプトで切り替える必要は無く、 解析対象日時に応じて適切なパラメータが自動で選ばれることになる。
Using this extension, channel table files need not be switched manually nor by scripts outside of the main analysis program; appropriate parameters are automatically chosen based on the date and time to analyze.