20111021

[IDL] 工具包20111021

有鑒於IDL是我唯一會寫的程式語言… 也是我第一個學的
因此有必要把我會的幾種技巧記下來,不然總有一天會都忘光
尤其是程式那麼多個… 會散落到不同的地方

我盡可能蒐集我到目前為止會用的功能
不過這不是份教學文件,只是給我自己留底的
所以也只用我自己看得懂的方式記囉

以下是code,IDL是付費軟體,雖不如C之類的語言流行,但天文界還滿常使用的。


畫ps檔
!P.Multi = [0, 1, 2] 
set_plot,'ps'
device, filename="D:\OpenClusterIDL\6633\NGC6633RH.ps",/color
device,/close
close,/all

畫圓圈
A = FINDGEN(33) * (!PI*2/32.)
USERSYM, COS(A), SIN(A), /FILL
;(psym=8)

畫大圓
CC=findgen(101)*(2*!dpi/100)
plot,0.15*3*cos(cc)+0.03-mux_avg[0],0.15*3*sin(cc)+0.49-muy_avg[0],color=1 

數列
intv=7
w=findgen(intv)*(180./(intv-1))*dtor


讀檔到結尾 (都讀成空白,目的是計算總行數)
no=0
while not (EOF(1)) do begin
readf, 1, format='(x)'
no=no+1
endwhile

讀出此檔案總行數
number=file_lines('D:\NGC6802\RefStar.prn')
print,number


讀檔 (把第一行讀成空白)
Q=' '
openr, 5, 'D:\NGC6802\RefStar.prn'
readf, 5, Q
for i=0,number-2 do begin
readf, 5, format='(3(4x,i4))',NB,NV,NR
endfor
close, 5

一行迴圈
for i=0, 3 do readf, 1, Q

平均
mux_avg=moment(mux)
muy_avg=moment(muy)
muxd=mux-mux_avg[0]
muyd=muy-muy_avg[0]

總和
        u=muxd*cos(w(i))-muyd*sin(w(i))
        S(i)=total(u^2)

轉置矩陣和迴歸
CS = [TRANSPOSE(cw), TRANSPOSE(sw)]
result = REGRESS(CS, S, SIGMA=sss, CONST=ccc, MEASURE_ERRORS=mmm)
theta=(atan(result[1]/result[0]))/dtor

創建函數功能
function year2date1583A,yr,mt,dt
  if yr ge 1592 then dt=dt+1.
bmt=31.
smt=30.
Fmt=28.
  if yr eq 1583 and mt eq 3 and dt lt 21 then dt=double(dt-21.)
Return,double((yr-1-1583)*365+mt+dt)
end
;dR(i)=year2date1583A(yr,mt,dt)

一行IF和JUMP
 if rf ge ref then goto, jumpB
 readf, 5, format='(3(4x,i4))',NB,NV,NR
 jumpB:

畫圖+次數分布圖
TVLCT,[0,255,0,0,255],[0,0,255,0,255],[0,0,0,255,0] ;0=black,1=red,2=green,3=blue,4=yellow
Bhis=HISTOGRAM(uw, binsize=0.0333)
Bbin=FINDGEN(N_ELEMENTS(Bhis))/30+MIN(uw)
plot, Bbin, Bhis, xrange=[-0.54,0.54],/xstyle, yrange=[MIN(Bhis), MAX(Bhis)],/ystyle,PSYM=0, xtitle='uw', ytitle='f(B)', $
    title='Histogram of proper motion along -9.7 degree axis',$
    yTICKINTERVAL=4,xTICKINTERVAL=0.06,xMINOR=2,yMINOR=2;,xTICKUNITS=f5.2

圖例
xyouts, 4.5d-5, 4d14, '6000K'
xyouts, 3.8d-5, 8d14, '70000K'


!P.Multi = [0, 2, 4]
  xx=[0,1,2,3,4]
  yy=[2,4,6,8,10]
for i=1,8 do begin
xx=xx*i
yy=yy*i
x_title=string(i)
plot, xx,yy,psym=1,title='number='+x_title    ;i,/nodata
endfor
!P.Multi = [0, 1, 1]



=============================================================
大概是這樣,有想到什麼再說吧~

沒有留言:

張貼留言