potass' blog

ポタシウムのことが書いてないブログ。

ALPS の XML ファイル群から binning level のグラフを作る

やりたいこと

ALPS では binnig 解析ツールが標準装備されている。python での使用例が ALPS 2 Tutorials:MC-01 Autocorrelations の tutorial1a.py に転がっている。
tutorial1a.py はジョブ投げから binning level のプロットまで全部やっているが以下の仕様ものが欲しかった。

  1. すでにあるデータに対して binnig level プロットを行う。ここで、図の label や Error を見積もる物理量は自分で選べる。
  2. CSV 形式で出力させたい。

というわけで tutorial1a.py をたたき台にスクリプトを書いてみる。

詰まったこと

argparse を使ってみた

初めて argparse を使ってみた。ソースで書いてみると大したこと無いようだが意外と苦労した。
詳細はググるかソース見てください。

csv.write.writerow(s) で出力される末尾の None

これはスマートな方法が思いつかずゴリ押したんだが、pythoncsv モジュールで普通に出力させたら csv は fp or sys.stdout へ、最後に出力される None が sys.stderr へそれぞれ出力された。
そもそも None が末尾に出力されるのがデフォルトなのかどうか不明だが、ともかく何とかせにゃあかん。
少し考えた末に置換して削ろうという超泥臭い方法にすることにした。
例えばこんな感じ。

import sys, os, csv

a = [[1,2,3],[4,5,6]]

temp_file = '__tmp_.dat'
f = open(temp_file, 'w')
cw = csv.writer(f, lineterminator='\n')
cw.writerows(a)
f.close()

ff = open(temp_file, 'r')
str = ff.read()
ff.close()
os.remove(temp_file)

str = str.replace('\nNone\n','\n')
print(str)

うーん、ダサい…。まあいいや。

転置行列

zip(*A) だけでは tuple の list になるので map でいじる。

A = [[1,2,3],[4,5,6]]
A_T = map(list, zip(*A))

binning level をプロットする Python スクリプト

ソース

ALPS 2.2 (beta) + Python 2.7 (OS : Windows 7) で動作しました。
なお、QMC に対して特化している都合上、例えば CMC などで物理量を指定する際はしっかりとその通りの物理量(半角スペースは _ に置き換える)を入力しないとエラー表示されます。

lab オプションは ALPS を Windows 7 (32 bit) にインストールした - potass' blog にある理由からつけました。

使用例

例として、

  1. ./hoge/ の中に prefix が hogehoge となっている XML データ群がある。
  2. output.dat に csv 形式の binning level の誤差データを出力したい。
  3. matplotlib を使って図として出力したい。
  4. 誤差を知りたい物理量が磁化(Magnetization Density)。
  5. データ群の違いは温度(T)なので label は温度にしたい。

という場合は、

$ alpspython binning.py ./hoge/ -p hogehoge --fig -y Magnetization_Density -l T > output.dat

とすればいい。Magnetization_Density に関しては M でも良い。ただ、ほしい物理量に空白を含む場合はアンダーバーが必要。