SohoのMDIなどのデータをindex2mapでmapにする際、
元のデータが180度回転している場合はhave_soho_roll.proというプログラムが
判断して勝手に回転補正する。
すなわち、
mreadfits,mdifits,index,data
index2map,index,data,map
とした際にdataとmap.dataが一致しない場合があるので注意すること。
index中のCRVAL系とXCEN系
CRVAL系:CRVAL/SC_ATTX/SC_ATTY/->CRPIXでの位置
XCEN系:XCEN->画像中心での位置
CRPIXが画像中心であれば上二つは一致
Array matching (配列の要素の比較)
要素の個数が異なる2つの配列AとBの内、共通している要素のindexを全て求める。
match2,A,B,Asub,Bsub
とすれば、A(Asub)=B(Bsub)
となる。
ただし、負の数は無視される。
階乗
a=factorial(10)
で10!。
plotなどでのオングストローム記号(Å)の出力方法
以下の4つの方法がある。
angst=string("305B)
angst=string(197B)
angst='!6!sA!r!u!9 %!6!n'
angst='!Z(00c5)!3'
自分としては2番めがお薦めかな。
分岐
if flg eq 1 then a=4 else a=6
は実は以下の記述でもできる。
a=flg eq 1 ? 4 : 6
utplotでバグったときの対処法
光度曲線などを時間プロットできるutplotはとても便利だが、
!xなどの環境変数をいじるため、下手にプログラム内でエラーで止まると、
プロットの軸がおかしくなったままになることが良くある。
これを防止するためには、あらかじめ.idl_startup内に、
plot,indgen(10) ;環境変数の初期化
store_plotvar
の一行を加えておくと良い。
もしutplotでバグったときは、
restore_plotvar
で復活できる。
plotのx軸の数字を消す plot,indgen(10),xtickformat='(a1)'
FITS index中のCROTA系とP_ANGLE系の関係
CROT/CROTA/CROTA1/CROTA2の値はindex2mapでMAPのROLL_ANGLEの値にそのまま渡される。
SC_ROLL/P_ANGLE/SOLAR_P0/ANGLEの値はMAP変換の際に符号が逆転するので注意
太陽のp0(=P_ANGLE=-CROTA)は、地上から見て太陽の最上端から、太陽の自転軸(北の方向)が反時計回り(北→東が正)に何度傾いているかを示す値。
つまり、MAPのROLL_ANGLEはデータのy軸から太陽の自転軸が何度傾いているかを"時計回り"に測った値。
なので、FITS indexを作成する際には、
time='2009-02-26 12:41:45'
pa=get_rb0p(time,/pa,/deg)
index.CROTA1=-pa
index.CROTA2=-pa
index.P_ANGLE=pa
としておくと、どのタグを使ってもmap変換の際にROLL_ANGLE=-paとなり、
rmap=rot_map(map,-map.ROLL_ANGLE)
としたときに回転角度がpa("時計回り"が正)となるため、正しく補正される。
ちなみに、太陽の回転関連のタグが複数ある場合、CROT->CROTA->CROTA1->CROTA2->SC_ROLL->P_ANGLE->SOLAR_P0->ANGLEの順番で値が採用される(詳しくはget_fits_roll.pro参照)。
配列の差分 def=deriv(a)
":"は使わない方が得?
既存の配列の特定の範囲に別の小配列を入れたい時に、
a=fltarr(200,200)
b=dist(50)
a(100:149,100:149)=b
tvscl,a
とかしなくても、
a=fltarr(200,200)
b=dist(50)
a(100,100)=b
tvscl,a
とした方が早いし簡単。
readせずにファイルのサイズなどを知る
Result = FSTAT(Unit)
Result = QUERY_TIFF ( Filename [, Info] [, IMAGE_INDEX=index] )
spawn,'identify '+file,tmp & ss=strsplit((strsplit(tmp,/ex))(2),'x',/ex)
配列の結合 result=append_arr(input,append)
文字列の置き換え new=str_replace(strings,'old','new')
"not" ~
ファイルの終わり EOF(unit)
直線とシンボルでplot plot,indgen(10),psym=-2
単位行列 identity(m)でmxmの単位行列
対角行列 diag_matrix([a11,a22,...,ann])
mxnのarrayの各点に原点からの距離を入れたい場合
x=indgen(m,n) mod m
y=indgen(m,n) / m
r=sqrt(x^2.+y^2.)
でも、普通に
x=rebin(indgen(m),m,n)
y=rebin(indgen(1,n),m,n)
r=sqrt(x^2.+y^2.)
とした方がいいかも。
さらにSSWなら、
dist_circle,r,[m,n],0,0
で一発。
b(i)=∑k=0ia(k) という配列bを作りたい場合
n=n_elements(a)
c=(reform([indgen(n*(2*n-1)) mod (2*n)]-n lt 0,2*n-1,n))(0:n-1,*)
b=c#a
最近知ったが、
b=total(a,/cumlative)
で出来た。。。
roll_xy,xin,yin,angle,xout,yout
(xin,yin)をangle度回転させて(xout,yout)に。
u=limb_dark(lambda)
lambda[nm]の波長に対する周辺減光定数wを返す。
因みに周辺減光の式は、Ioをdisk centerのIntensity、qを知りたい領域のRadiusと置くと、
I(q)=Io(1-u(1-cos(q)))
plot,y,xtickformat='(a1)'
x軸の数値を表示しない。
BLAS_AXPY
2D配列や、3D配列の全体や一部に1Dや2Dの配列を足したいときに、いちいちfor文で回さなくてよいプログラム。
配列を用意。
Y=intarr(5,5)
print,Y
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0行目だけにX=[0,2,4,6,8]を加えたい場合、
Y=intarr(5,5)
X=[0,2,4,6,8]
blas_axpy,Y,1,X,1,[0,0]
print,Y
0 2 4 6 8
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0行目だけにXを3倍してから加えたい場合、
Y=intarr(5,5)
blas_axpy,Y,3,X,1,[0,0]
print,Y
0 6 12 18 24
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1行目だけにXを加えたい場合、
Y=intarr(5,5)
blas_axpy,Y,1,X,1,[0,1],2,0
print,Y
0 0 0 0 0
0 2 4 6 8
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1行目と3行目だけにXを加えたい場合、
Y=intarr(5,5)
blas_axpy,Y,1,X,1,[0,1],2,[0,2]
;blas_axpy,Y,1,X,1,[0,0],2,[1,3]だとうまくいかない。
print,Y
0 0 0 0 0
0 2 4 6 8
0 0 0 0 0
0 2 4 6 8
0 0 0 0 0
各行にXを加えたい場合、
Y=intarr(5,5)
blas_axpy,Y,1,X,1,[0,0],2,[0,1,2,3,4]
print,Y
0 2 4 6 8
0 2 4 6 8
0 2 4 6 8
0 2 4 6 8
0 2 4 6 8
0列目にXを加えたい場合、
Y=intarr(5,5)
blas_axpy,Y,1,X,2,[0,0]
print,Y
0 0 0 0 0
2 0 0 0 0
4 0 0 0 0
6 0 0 0 0
8 0 0 0 0
3D配列への使いかたはidl help参照。
REPLICATE_INPLACE
既存の配列を変更する。速い、らしい。
centroid
そのまんま。質量中心を返す。
簡単!色付き画像ファイル作成方法
色んなカラーテーブルを使って絵を描く。
write_image,'test.gif','gif',tvrd(/true)
これでok。ただしzバッファだと無理。
zバッファでも使える色々な色を使った画像ファイル作成方法
set_plot,'z'
device,set_pixel_depth=24,decomposed=0
;(描画開始)
wdef,0,400,400
loadct,2
tvscl,dist(200), 0, 0
loadct,3
tvscl,dist(200),200, 0
loadct,4
tvscl,dist(200), 0,200
loadct,5
tvscl,dist(200),200,200
;(描画終了)
write_bmp,'test.bmp',reverse(tvrd(true=1),1)
write_jpeg,'test.jpg',tvrd(true=1),true=1,quality=100
set_plot,'x'
test.bmp
なんと鮮やか!!
いろんな色でplot
device,decomposed=1
wdef,0,200,100
plots,[0,400],[ 0, 0],/dev,color='0000ff'xl
plots,[0,400],[10, 10],/dev,color='00ccff'xl
plots,[0,400],[20, 20],/dev,color='ffcc22'xl
plots,[0,400],[30, 30],/dev,color='3355aa'xl
plots,[0,400],[40, 40],/dev,color='012345'xl
plots,[0,400],[50, 50],/dev,color='6789ab'xl
plots,[0,400],[60, 60],/dev,color='cdefff'xl
plots,[0,400],[70, 70],/dev,color='123f4b'xl
plots,[0,400],[80, 80],/dev,color='888888'xl
plots,[0,400],[90, 90],/dev,color='ffffff'xl
write_bmp,'lines.bmp',reverse(tvrd(true=1),1)
lines.bmp