ファイル入出力#

万葉ライブラリにはデータコンテナをファイルとして保存したり、ファイルをデータコンテナに読み込んだりするファイル入出力機能がある。ファイル入出力には複数の方法があり、目的に応じて使い分けることができる。保存と読み込みはペアとなっており、ある方法で保存したファイルをデータコンテナに読み込むには対応した方法で行う必要がある。

本書では三つの方法について述べる。便宜上これら三つの方法を"テキスト形式"、"バイナリ形式"、"NeXus形式"と呼ぶこととする。Table 21にそれぞれの長所、短所を示す。

Table 21 万葉ライブラリのファイル入出力#

長所

短所

テキスト形式

他のソフト・ハードで保存ファイルを容易に利用可能

ElementContainerのみ対応。一部の情報を保存しない

バイナリ形式

保存、読み込みが高速

他のソフト、ハードでの保存ファイルの利用が非常に困難

NeXus形式

他のハードで保存ファイルを利用可能

保存、読み込みが若干遅い。他のソフトでの保存ファイルの利用が困難

テキスト形式#

ElementContainerのヒストグラムデータをカンマやタブで区切った3列のテキストファイルとして保存し、また、その形式のファイルを読み込む。色々な表計算ソフトウェアなどで扱いやすく、保存したハードウェア以外でも利用しやすい形式である。ただし、ヘッダ領域の情報や、データ領域にあってもヒストグラムとして設定されてないデータは保存されない。また、保存に用いるコマンドよって、binの両端の値をそれぞれ保存すか、両端の平均値を保存するかを選ぶことができる。両端の平均値を保存した場合にはbin幅の情報は失われることになる。

保存#

ファイル名の他に、桁数と区切り文字を指定できる。下記のように使用する。

テキスト形式保存#
 1import Manyo
 2
 3ec1 = Manyo.ElementContainer()
 4ec1.Add("x", [0, 1, 2, 3, 4, 5])
 5ec1.Add("y", [100, 200, 300, 400, 500])
 6ec1.Add("e", [10.0, 14.14, 17.32, 20.0, 22.36])
 7ec1.SetKeys("x", "y", "e")
 8
 9# テキスト形式保存
10ec1.SaveTextFile("ec1_av.dat", 5, ",") # binの両端の平均値を保存
11ec1.SaveHistTextFile("ec1_hist.dat", 5, ",") # binの両端を保存。
12                                             # 1列目は1行多くなる。

この結果として、下記の内容のファイルが保存される。

ec1_av.dat#
10.5,   100,    10
21.5,   200, 14.14
32.5,   300, 17.32
43.5,   400,    20
54.5,   500, 22.36
ec1_hist.dat#
10,   100,    10
21,   200, 14.14
32,   300, 17.32
43,   400,    20
54,   500, 22.36
65

このように、第一引数にファイル名、第二引数に桁数、第三引数に区切り文字を指定する。この例の場合はファイル名がec1_av.dat、ec1_hist.datであり、桁数は5桁、区切り文字はカンマとなる。SaveTextFile()で保存されるファイルの1列目はbinの両端の平均値、2列目は強度、3列目はエラーとなる。SaveHistTextFile()では2列目、3列目は同じく強度、エラーであるが1列目はbinの低い方の端となり、最後のbinの高い方の端が最後の行となる。

ファイル名は必ず必要だが、桁数と区切り文字は省略してもよい。

  • ec.SaveTextFile(ファイル名)

  • ec.SaveTextFile(ファイル名, 桁数)

  • ec.SaveTextFile(ファイル名, 区切り文字)

省略した場合には、桁数は10桁、区切り文字はカンマとなる。また、区切り文字としてタブを用いる場合にはtを区切り文字に指定する。

読み込み#

ElementContainerにカンマ、タブ、空白のいずれかで区切られた3列の数値からなるファイルを読み込む。下記のように使用する。

テキスト形式読み込み#
1import Manyo
2
3ec1_av = Manyo.ElementContainer()
4ec1_hist = Manyo.ElementContainer()
5
6# テキスト形式読み込み
7ec1_av.LoadTextFile("ec1_av.dat")
8ec1_hist.LoadTextFile("ec1_hist.dat") # SaveHistTextFileもLoadTextFileで読み込む。

このように、第一引数にファイル名を指定する。区切り文字は自動で判別される。SaveTextFile()、SaveHistTextFile()によって保存したファイルもLoadTextFile()で読み込む。

バイナリ形式#

データコンテナをバイナリファイルとして保存し、また、その形式のファイルを読み込む。保存、読み込みが最も早い形式であり、データコンテナの全ての情報が保存され、読み込み時にデータコンテナを完全に再現できる。ただし、保存したファイルを他のハードウェアに移した際に読み込めることを保証していない。また、他のソフトウェアで読み込むことも非常に難しい。

保存#

バイナリ形式保存にはWriteSerializationFileBinaryという名前の機能を、下記のように使用する。

バイナリ形式保存#
 1import Manyo
 2
 3ec1 = Manyo.ElementContainer()
 4ec1.Add("x", [0, 1, 2, 3, 4, 5])
 5ec1.Add("y", [100, 200, 300, 400, 500])
 6ec1.Add("e", [10.0, 14.14, 17.32, 20.0, 22.36])
 7ec1.SetKeys("x", "y", "e")
 8
 9# バイナリ形式保存
10w = Manyo.WriteSerializationFileBinary("ec1.srlz")
11w.Save(ec1)

まず、この機能を下から2行目のようにファイル名を引数として呼び出す。その戻り値(ここではwとした)に対しSave()コマンドを実行する。引数には保存したいデータコンテナを指定する。バイナリ形式で保存するデータコンテナはElementContainer、ElementContainerArray、ElementContainerMatrixのいずれでも良い。

読み込み#

バイナリ形式で保存されたファイルを読み込むにはReadSerializationFileBinaryという名前の機能を、下記のように使用する。

バイナリ形式読み込み#
1import Manyo
2
3ec1 = Manyo.ElementContainer()
4
5# バイナリ形式読み込み
6r = Manyo.ReadSerializationFileBinary("ec1.srlz")
7r.Load(ec1)

まず、この機能を下から2行目のようにファイル名を引数として呼び出す。その戻り値(ここではrとした)に対しLoad()コマンドを実行する。引数には読み込み先のデータコンテナを指定する。指定するデータコンテナの種類は保存されているものと同じでなければならない。

NeXus形式#

NeXusとは中性子、X線、ミュオンのデータをやりとりしやすくするために定められた共通データ形式である。NeXusはHDF57)という汎用データ形式に独自のルールを加える形で作られており、様々なハードウェア、ソフトウェアで扱うことができる。例えばPythonではh5pyというパッケージを利用して扱うことができ、IgorPro、Origin、MATLABなどの商用ソフトウェアでも標準でこの形式のファイルを扱うことができる。また、データコンテナの全ての情報を保存しており、読み込みで完全にデータコンテナを再現できる。ただし、バイナリ形式に比べて入出力が若干遅い。

保存#

NeXus形式を扱う際には保存でも、読み込みでもまずNeXusFileIOという機能を用いる。下記に保存についての使用例を示す。

NeXus形式保存#
 1import Manyo
 2
 3ec1 = Manyo.ElementContainer()
 4ec1.Add("x", [0, 1, 2, 3, 4, 5])
 5ec1.Add("y", [100, 200, 300, 400, 500])
 6ec1.Add("e", [10.0, 14.14, 17.32, 20.0, 22.36])
 7ec1.SetKeys("x", "y", "e")
 8
 9# NeXus形式保存
10nxio = Manyo.NeXusFileIO()
11nxio.Write(ec1, "ec1.nx", "SIK", 0)

まず、NeXusFileIOを下から2行目のように呼び出す。その戻り値(ここではnxioとした)に対しWrite()コマンドを実行する。第一引数には保存するデータコンテナを指定し、第二引数としてファイル名を指定する。第三引数としては利用者名を指定する。利用者名は文字列であれば特に制限はない。第四引数は0もしくは1を指定する。1の場合は圧縮して保存し、0の場合は圧縮しない。第四引数は省略可能であり、省略すると1、つまり圧縮しての保存となる。ただし、圧縮は速度が遅くなるため圧縮しないことを推奨する。

読み込み#

下記に読み込みについての使用例を示す。

NeXus形式読み込み#
1import Manyo
2
3# NeXus形式読み込み
4nxio = Manyo.NeXusFileIO()
5ec1 = nxio.ReadElementContainer("ec1.nx")

保存の場合と同じく、まずNeXusFileIOを下から2行目のように呼び出す。その戻り値に対して読み込み用のコマンドをファイル名を引数として実行する。実行すると戻り値として読み込まれたデータコンテナが得られる。読み込み用のコマンドはReadElementContainer()、ReadElementContainerArray()、ReadElementContainerMatrix()の三種類あり、保存したデータコンテナの種類に応じたものを使用する必要がある。保存ファイルの圧縮、非圧縮は自動的に判別される。