High energy astro系の解析はNASAのHEASoftが主流だと思います。HEASoftに含まれるXSpecや各種ftoolsを使う上で、多くの人がshell scriptを書いていると思うのですが、
Pythonはちょいちょい使うものの、いざshell scriptを完全に置き換えたい、というとき具体的にどうすればいいんだー、と悩んだ個人的経験から、解析で頻出しそうなshell script的用法をまとめたいと思います。
1. Shell commandや外部スクリプトの実行
os.systemを使います。
import os
os.system('cp aho1.txt aho2.txt')
()内はただのstringなのでpythonで使ってる変数も使えます。
import os
infile = 'aho1.txt'
outfile = 'aho2.txt'
os.system('cat '+infile+' > '+outfile)
これより複雑なことをしたければsubprocess.Popenを使います。
2. コマンドを実行して標準出力を返り値として得る
.communicate()を使います。
import subprocess PIPE=subprocess.PIPE eventfile = subprocess.Popen(['ls', 'temp.evt'], stdin=None, stdout=PIPE, shell=False).communicate()[0]Popenの引数1つ目は実行するコマンドとその引数からなるリスト。shell=Trueにすれば、
import subprocess
PIPE=subprocess.PIPE
eventfile = subprocess.Popen('ls temp.evt', stdin=None, stdout=PIPE, shell=True).communicate()[0]
とベタ書きしてもok。また、shell=Trueではwild cardが使えるので、eventfiles = subprocess.Popen('ls *_xis?.evt', stdin=None, stdout=PIPE, shell=True).communicate()[0]
なおこのままだと使い勝手がわるいし、最後に改行('\n')まで付いてきちゃうので、eventfiles = subprocess.Popen('ls *_xis?.evt', stdin=None, stdout=PIPE, shell=True).communicate()[0].split()
としてリストにしておくと便利。こう来ると大抵eventfiles = subprocess.Popen('ls *_xis?.evt', stdin=None, stdout=PIPE, shell=True).communicate()[0].split()
for eventfile in eventfiles:
とつづく。。3. コマンド、プログラムを実行し、その標準入力とやり取りする
stdin.writeを使います。いわゆるhere documentです。XSpecやxselectを使うとき便利。
入力する各行末尾の改行を忘れずに。
import subprocess
PIPE=subprocess.PIPE
xsp = subprocess.Popen('xpec',stdin=PIPE,stdout=None,shell=False)
xsp.stdin.write(
#ここにコマンド
)
xsp.wait()
途中でfor回したりもできて便利。import subprocess
PIPE=subprocess.PIPE
xse = subprocess.Popen('xselect',stdin=PIPE,stdout=None,shell=False)
xse.stdin.write(
'\n'
'no\n'
'read event eventlist.txt\n'
'.\n'
'set image det\n'
'set xybin 1\n'
)
for seg in segs:
subdir = 'xis'+xis+'_seg'+seg
for grade in grades:
qdpfile = str(tobs)+'_'+subdir+'_g'+grade+'.qdp'
pifile = str(tobs)+'_'+subdir+'_g'+grade+'.pi'
xse.stdin.write(
'filter column "grade='+graderanges[grade]+' segment='+seg+':'+seg+' status=65536:131071 196608:262143 327680:393215 458752:524287"\n'
'extract spec\n'
'plot spec\n'
'we '+subdir+'/'+qdpfile+'\n'
'quit\n'
'save spec '+subdir+'/'+pifile+'\n'
'no\n'
'clear column\n'
)
xse.stdin.write(
'exit\n'
'no\n'
'\n'
)
xse.wait()
あとは得られたデータをnumpy, scipyで料理してmatplotlibでお絵描き、って流れです。
そこはまたおいおい。とりあえずここまでー。
さわだ
0 件のコメント:
コメントを投稿