Locked History Actions

RDF

RDF Data format

  • RIKEN Data Format (RDF) のメモ。まずは馬場さんのページを参考にする。以下で用いるサンプルファイルは 0018.rdf (1.0 MB)。NaI の 60Co 線源のデータ?1chのみ。

序論

  • rdf は riken(?) data format のことで、バイナリ形式のファイルフォーマットである。DAQ システム (NBBQ, Babarl) によって生成され、通常、ANALYS, ANAPAW, ANAROOT といった解析プログラムによって読み込まれる。
  • 以下、単位に関する変換式を示す。大文字の K は 1024 倍を表す (K=1024)。Block, word は、rdf ファイルで用いているデータの単位。
    • 1 block = 8 Kwords = 16 Kbytes = 128 Kbits
    • 1 word = 2 bytes = 16 bits
    • 1 byte = 8 bits
  • 0x で始まる文字列は 16 進数を表す。16 進数 1 桁で 4 bits のデータを表現できるので、16 進数 2 桁で 1 byte = 8 bits を表現できる。ASCII 文字は 1 文字で 1 byte 必要なので、16 進数 2 桁で ASCII 文字を 1 文字表現できる。
    • 0xff = 255
    • 0x10 = 16
    • 0x41 = ACSII 文字の’A’

データフォーマット

  • 一つの rdf ファイルは、Header 部, Event 部, Ender 部の3 つの部分に分けられる。Header 部、Ender 部は 1 block から成り、それぞれ Header Block、Ender Block と呼ばれる。Event 部は Event Block と呼ばれるいくつかの block から成る。Event Block を1 つだけ持つような最小の rdf ファイルのサイズは、3 blocks = 48 Kbytes となる。イベントデータを持たない(無意味な)rdf ファイルのサイズは 2 blobks = 32 Kbytes である。
    •  

  • Header Block

    • Header Block のデータは図 1 のようになる。データの配置は、表 1 となる。図 1 のデータは word 単位、16 進数で表しているで、一つの四角は 2 bytes = 16 bits となる。
      •  

      • 図 1: Header Block
      • HeaderBlock.png

      •  

      • 表 1: Header Block データ配置
      •  

word

data

意味

0

0001

Header Block の始まりを表す

1-9

0000

0 を入れる

10-13

-

RUN の番号を表す (ASCII 文字列)

14

2020

スペース 2 文字 (ASCII 文字列)

15-23

-

START 時刻を表す (ASCII 文字列)

24-32

-

STOP 時刻を表す (ASCII 文字列)

33

2020

スペース 2 文字 (ASCII 文字列)

34-41

-

Print Time を表す (ASCII 文字列)

42-47

-

Print Date を表す (ASCII 文字列)

48-49

0000

0 を入れる

50-89

-

RUN スタート時のコメント (ASCII 文字列)

90-129

2020

スペース文字で埋める (ASCII 文字列)

130-

0000

0 を入れる

  •  

  • Event Block

    • Event Block のデータは、図 2 のようになる。データの配置は、表2 となる。Event data 部には、複数の event data が保存される。一つのイベントで、一つのデータ構造を形作る。図2 の Event Block は 3 つの event を含む例である。赤の部分が word 数、ID 等の情報であり、青の部分がモジュールからの生データである。Event data の配置を表3 に示す。ここで、Segment とは event data の中のさらに小さなデータ構造である。検出器の種類が多数あるような DAQ システムで用いられる。例えば一つの検出器からのデータに一つの Segment を割り当て、Segment ID を用いてデータを参照する。
      •  

      • 図 2: Event Block
      • EventBlock.png

      •  

      • 表 2: Event Block データ配置
      •  

word

data

意味

0-3

0000

Event Block の始まりを表す

4-

-

Event data 部

-

ffffffff

Event Block の終わりを表す

      •  

      • 表 3: event data の配置
      •  

word

data

意味

0

-

Event data の word 数 (この word も word 数としてカウントする)

1

0001

FID (常に1)

2

0001-

Event ID ( 1 から始まる & Block が変わるとまた 1 からカウント)

3

-

Segment の word 数 (この word も word 数としてカウントする)

4

-

Segment ID (babarl のソースで設定)

5-

-

モジュールからの生データ

    •  

    • 注意) Event data 中の 0 番目の word は event data の word 数を表すが、word 数そのものは格納されない。即ち、最上位bit を1 とした 2 bytes のデータが word 数として格納される。例えば、Event Data の word 数が 3 の時は 0x8003 (二進数で表すと1000 0000 0000 0011), 16 の時は 0x8010 (二進数で表すと1000 0000 0001 0000) となる。
    •  

  • Ender Block

    • Ender Block は、図 3 のようになる。データの配置は、表 4 となる。
      •  

      • 図 3: Ender Block
      • EnderBlock.png

      •  

      • 表 4: Ender Block データ配置
      •  

word

data

意味

0

ffff

Ender Block の始まりを表す

1-9

0000

0 を入れる

10-13

-

RUN の番号を表す (ASCII 文字列)

14

2020

スペース 2 文字 (ASCII 文字列)

15-23

-

START 時刻を表す (ASCII 文字列)

24-32

-

STOP 時刻を表す (ASCII 文字列)

33

2020

スペース 2 文字 (ASCII 文字列)

34-41

-

Print Time を表す (ASCII 文字列)

42-47

-

Print Date を表す (ASCII 文字列)

48-49

0000

0を入れる

50-89

-

RUN スタート時のコメント (ASCII 文字列)

90-129

2020

RUN ストップ時のコメント (ASCII 文字列)

130-

0000

0 を入れる

Appendix

エンディアン

  • 多バイトのデータをメモリに格納していく方法には、主にビッグエンディアンとリトルエンディアンの 2 種類がある。ビッグエンディアンでは、多バイトデータの上位バイトからアドレスが上位のメモリに格納していく。リトルエンディアンでは、多バイトデータの下位バイトからアドレスが下位のメモリに格納していく。例えば 0x1234 という 2 bytes のデータを考える。ビッグエンディアンでは、メモリにデータを 12 34 と格納し、リトルエンディアンでは 34 12 と格納する。rdf ファイルでは、1 word が 2 bytes で構成されるためエンディアンを考える必要がある。rdf ファイルでは、Header Block と Ender Block の ASCII 文字列部分を除いてリトルエンディアンである。

バイナリファイルを 16 進数で表示

  • Emacs で表示

    • Emacs を用いてバイナリデータを 16 進数として表示するには、バイナリデータを開いたら M-x hexl-mode と打つ (Alt 又は Esc を押しながら x を押して、Alt 又は Esc を離し、hexl-mode と入力)。実際にファイルを開くと、下記のようになる。
    • 00000000: 0100 0000 0000 0000 0000 0000 0000 0000  ................
      00000010: 0000 0000 5255 4e2d 3030 3138 2020 5354  ....RUN-0018  ST
      00000020: 4152 5420 3d3e 2032 303a 3038 3a35 3920  ART => 20:08:59
      00000030: 2053 544f 5020 3d3e 2058 583a 5858 3a58   STOP => XX:XX:X
      00000040: 5820 2020 5072 696e 7420 2d3e 2058 583a  X   Print -> XX:
      00000050: 5858 3a58 5820 2030 382d 4a75 6c2d 3134  XX:XX  08-Jul-14
      00000060: 0000 0000 7465 7374 3120 2020 2020 2020  ....test1
      00000070: 2020 2020 2020 2020 2020 2020 2020 2020
      00000080: 2020 2020 2020 2020 2020 2020 2020 2020
      00000090: 2020 2020 2020 2020 2020 2020 2020 2020
      000000a0: 2020 2020 2020 2020 2020 2020 2020 2020
      000000b0: 2020 2020 2020 2020 2020 2020 2020 2020
      000000c0: 2020 2020 2020 2020 2020 2020 2020 2020
      000000d0: 2020 2020 2020 2020 2020 2020 2020 2020
      000000e0: 2020 2020 2020 2020 2020 2020 2020 2020
      000000f0: 2020 2020 2020 2020 2020 2020 2020 2020
      00000100: 2020 2020 0000 0000 0000 0000 0000 0000      ............
      00000110: 0000 0000 0000 0000 0000 0000 0000 0000  ................
      00000120: 0000 0000 0000 0000 0000 0000 0000 0000  ................
      ...
      ...
      00003ff0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
      00004000: 0000 0000 0000 0000 0680 0100 0100 0300  ................
      00004010: 0100 6900 0680 0100 0200 0300 0100 6401  ..i...........d.
      00004020: 0680 0100 0300 0300 0100 fd01 0680 0100  ................
      00004030: 0400 0300 0100 3d00 0680 0100 0500 0300  ......=.........
      00004040: 0100 3302 0680 0100 0600 0300 0100 9700  ..3.............
      00004050: 0680 0100 0700 0300 0100 4102 0680 0100  ..........A.....
      00004060: 0800 0300 0100 d100 0680 0100 0900 0300  ................
      00004070: 0100 bf01 0680 0100 0a00 0300 0100 0901  ................
      -UU=:----F1  0018.rdf        2% L1017  (Hexl)----------------------
    • Emacs ではバイナリデータを 1 Byte ごとに 16 進数 2 桁で表示する。(スペースが 2 byte ごとに入っているので、2 byte 単位で表示していると勘違いしそうになるが、データの表示はあくまでも 1 byte ごと。) 一方、rdf ファイルでは、2 byte (= 16 bit = 1 word) ごとにデータを見た方が都合が良い。例えば、0x4000 行目の 0680 は 8006 と並べ替えて考える。RDF のマニュアルを参照すれば、この部分が 1 event 分のデータのサイズを表すことが分かる。
  •  

  • od コマンドで表示

    • od コマンドを使うと、バイナリデータを見やすく表示できる。例えば以下のように使う。
    • $ od -t x2 -w16 -A x 0018.rdf | head -20
    • 000000 0001 0000 0000 0000 0000 0000 0000 0000
      000010 0000 0000 5552 2d4e 3030 3831 2020 5453
      000020 5241 2054 3e3d 3220 3a30 3830 353a 2039
      000030 5320 4f54 2050 3e3d 5820 3a58 5858 583a
      000040 2058 2020 7250 6e69 2074 3e2d 5820 3a58
      000050 5858 583a 2058 3020 2d38 754a 2d6c 3431
      000060 0000 0000 6574 7473 2031 2020 2020 2020
      000070 2020 2020 2020 2020 2020 2020 2020 2020
      *
      000100 2020 2020 0000 0000 0000 0000 0000 0000
      000110 0000 0000 0000 0000 0000 0000 0000 0000
      *
      004000 0000 0000 0000 0000 8006 0001 0001 0003
      004010 0001 0069 8006 0001 0002 0003 0001 0164
      004020 8006 0001 0003 0003 0001 01fd 8006 0001
      004030 0004 0003 0001 003d 8006 0001 0005 0003
      004040 0001 0233 8006 0001 0006 0003 0001 0097
      004050 8006 0001 0007 0003 0001 0241 8006 0001
      004060 0008 0003 0001 00d1 8006 0001 0009 0003
      004070 0001 01bf 8006 0001 000a 0003 0001 0109
      ...
    • od コマンドのオプションは次のような意味。
      • -t x2 : 2 byte ごとに 16 進数 (x) で表示
      • -w16 : 1 行に 16 byte 表示
      • -A x : 左側の行数表示を 16 進数 (x) で表示。 -A n にすると、行数を表示しない。
      • -v : 上では指定していないが、このオプションをつけると、途中で省略されなくなる (* が入らなくなる)。
    • 上のコマンドでは、 od コマンドの出力をパイプ (|) で head コマンドに渡している。 head -20 というコマンドは、最初の 20 行だけを表示するという意味。
    • Emacs の hexl-mode に近い表示にするには、1 byte ごとに出力すればよい。ただし、スペースも 1 byte ごとに入るので、Emacs の表示と完全に一緒にすることはできない。
    • $ od -t x1 -w16 -A x 0018.rdf | head -3
    • 000000 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      000010 00 00 00 00 52 55 4e 2d 30 30 31 38 20 20 53 54
      000020 41 52 54 20 3d 3e 20 32 30 3a 30 38 3a 35 39 20
  • od コマンドで途中から表示

    • od コマンドの -j オプションで出力するデータのオフセットを指定できる。これで、block を次々に表示することができる。1 block のサイズは 8 Kword = 16 Kbyte なので、 -j には 16K の倍数を与えれば良い。
    • od -t x2 -w16 -A x 0018.rdf | head -3
      000000 0001 0000 0000 0000 0000 0000 0000 0000
      000010 0000 0000 5552 2d4e 3030 3831 2020 5453
      000020 5241 2054 3e3d 3220 3a30 3830 353a 2039
      $ od -j16K -t x2 -w16 -A x 0018.rdf | head -3
      004000 0000 0000 0000 0000 8006 0001 0001 0003
      004010 0001 0069 8006 0001 0002 0003 0001 0164
      004020 8006 0001 0003 0003 0001 01fd 8006 0001
      $ od -j32K -t x2 -w16 -A x 0018.rdf | head -3
      008000 0000 0000 0000 0000 8006 0001 0001 0003
      008010 0001 018c 8006 0001 0002 0003 0001 0028
      008020 8006 0001 0003 0003 0001 0244 8006 0001
      $ od -j48K -t x2 -w16 -A x 0018.rdf | head -3
      00c000 0000 0000 0000 0000 8006 0001 0001 0003
      00c010 0001 018d 8006 0001 0002 0003 0001 0257
      00c020 8006 0001 0003 0003 0001 0011 8006 0001

ASCII コード

  •  3031 3233 3435 3637 3839 4142 4344 4546  0123456789ABCDEF
     4748 494a 4b4c 4d4e 4f50 5152 5354 5556  GHIJKLMNOPQRSTUV
     5758 595a 6162 6364 6566 6768 696a 6b6c  WXYZabcdefghijkl
     6d6e 6f70 7172 7374 7576 7778 797a 2021  mnopqrstuvwxyz !
     2223 2425 2627 2829 2a2b 2c2d 2e2f 3a3b  "#$%&'()*+,-./:;
     3c3d 3e3f 405b 5c5d 5e5f 607b 7c7e 7d    <=>?@[\]^_`{|~}