SCRIPT_SHELL="python"
SCRIPT_NAME="PiShift.py"
SCRIPT_HELP_ARG="1) input Count PI file made by mathpha 2)output PI file 3)c0 4)c1 5)c2"
SCRIPT_HELP_SENTENCE="Modify PI Channel with f(x)=c2*x**2+c1*x+c0. Only for Suzaku XIS."
SCRIPT_NUM_ARG=5
###IMPORT###
import sys
import pyfits
import os
###HELP###
if len(sys.argv[1:])!=SCRIPT_NUM_ARG:
print 'Name: '+SCRIPT_NAME
print 'Arguments: '+SCRIPT_HELP_ARG
print 'Explanation: '+SCRIPT_HELP_SENTENCE
sys.exit()
###MAIN###
inf=str(sys.argv[1])
outf=str(sys.argv[2])
c0=float(sys.argv[3])
c1=float(sys.argv[4])
c2=float(sys.argv[5])
ch_num=4096
hdulist = pyfits.open(inf)
if os.path.isfile(outf) :
os.remove(outf)
sp=hdulist[1].data
hdulist[1].header['COMMENT']='Modefied with PiSift.py'
hdulist[1].header['COMMENT']='c0='+str(c0)
hdulist[1].header['COMMENT']='c1='+str(c1)
hdulist[1].header['COMMENT']='c2='+str(c2)
def f(x) :
x=float(x)
return c2*x**2+c1*x+c0
def main() :
new_counts=[]
for n in range(ch_num) :
new_counts.append(0.0)
old_counts=sp['COUNTS']
for n in range(ch_num) :
new_ch0=f(n)
new_ch1=f(n+1)
if new_ch1 < new_ch0 :
sys.exit('Correction function is not monotone.')
elif new_ch0 > 0 and new_ch1 < ch_num :
for m in range(int(new_ch0+1),int(new_ch1)) :
new_counts[m]+=old_counts[n]/(new_ch1-new_ch0)
new_counts[int(new_ch0)]+=old_counts[n]/(new_ch1-new_ch0)*(int(new_ch0+1)-new_ch0)
new_counts[int(new_ch1)]+=old_counts[n]/(new_ch1-new_ch0)*(new_ch1-int(new_ch1))
for n in range(ch_num) :
sp['COUNTS'][n]=int(round(new_counts[n]))
sp['STAT_ERR'][n]=float(new_counts[n]**0.5)
hdulist.writeto(outf)
main()
2016年2月24日水曜日
PI Shifter for Suzaku XIS
お察し下さい。個人的に作ったスクリプト。pyfitsの練習というか。
登録:
コメント (Atom)