Skip to content
Tomo Hori edited this page Apr 28, 2023 · 84 revisions

よく使うコマンド、IDL,SPEDASの便利ワザ, tips

目次

よく使うprocedure, 関数

IDL, SPEDAS の便利ワザ, tips など


min(), max(), minmax()

min(), max()は以下のように使うことができる。

   rslt= min( array, idx, /NAN )
   rslt= max( array, idx, /NAN )

ここで配列arrayに最小値/最大値がrsltという変数に入るが、2つ目の引数を入れておくと、それぞれ最小/最大の値となる配列番号が格納される。またNAN keywordをオン(/NANと書く)にしておくと、NAN, Inf 等の値を除外して最小/最大を調べる。

またSPEDASにはminmax() という関数があり、配列を引数に与えると、その配列中の最小値と最大値からなる1次元配列を返す。

Ex) arr= [ 0, 1, 2, 3, 4, 5, 6,7 ]
val= minmax( arr )
->	valには[ 0, 7] という要素数2つの1次元配列が入る。

またminmax( arr, /positive ) とすることで、正の数の範囲(ゼロは除く)での最小・最大を返すようになる。

total()

引数にarrayのみ与えると全ての要素の合計を返すが、2つ目の引数としてスカラー整数(ここではN)を与えると、N次元目に対して足し合わせを実行し、結果として元のarrayより1次元少なくなった配列を返す。Arrayの要素数が大きくなればなるほど、total()を使って計算した方が、処理がずっと速くなる。

n_elements()

配列の要素数を調べるための関数。非常に頻繁に使う。

where()

配列の中から、引数として与えられる条件式を満たす要素の番号を、配列として返す関数。where()関数は割と高速で動くので、同じ処理をfor + if文でやるよりずっと速い。

IDL> arr= [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
IDL> idx= where( arr GT 2  and  arr LT 7, cnt ) 
IDL> print, cnt     ;;条件に該当した要素数が格納される。つまりn_elements(idx)
  4
IDL> print, arr[idx]
3 4 5 6

条件を満たす要素が無かったことをチェックするには、cnt がゼロかどうか(if cnt gt 0)を調べてもよいし、該当要素が無いとidxに-1が入ることを利用して、if idx[0] NE -1 とやってもよい。

sort()

配列を引数に与えると、sortした配列ではなく、昇べきの順に並ぶような順番に並べた要素番号の配列を返す。つまり、

IDL> arr= [ 20, 80, 40, 70, 50, 10, 30, 60 ]
IDL> idx= sort( arr )
IDL> print, arr
1 7 3 6 4 0 2 5
IDL> print, arr[ idx ]
10 20 30 40 50 60 70 80

compare_struct()

compare_struct()を使って、2つの構造体が同じメンバー及びメンバーの値を持っているか(つまり2つの構造体が完全に同一か)を調べることができる。同一の場合は1,異なる場合は0を返す。

    IDL> if compare_struct( struc1, struc2 ) eq 1 then print, 'they are identical!'

これはIDLやSPEDASにはバンドルされておらず、ソースコードをIDL Astrolib @NASA から入手する必要がある。 https://idlastro.gsfc.nasa.gov/ftp/pro/structure/compare_struct.pro

IDL, SPEDAS の便利ワザ, tips など

1つのパネルの中に複数のtplot var.をプロットする

store_dataで複数のtplot var.を1つにまとめたtplot var.を作ってtplotに渡す。

Ex) 	store_data, ‘dens’, data=[ ‘tha_peir_density’,‘tha_peer_density’ ]
tplot, ‘dens’  ;;1つのパネルにプロット
tplot, [‘tha_peir_density’,’tha_peer_density’]  ;;2つパネルに別々にプロット

ちなみにtplot変数名が長ったらしいときは,tplot変数のindex番号を用いて,以下のように書けばほんの少し楽に同じことができる。

THEMIS> tplot_names
     1 tha_peir_density
     2 tha_peer_density
THEMIS> store_data, 'dens', data=tnames([1,2], /index)

プロットの底のmajor ticksの下に軌道などを数値表示する

表示したい値が入ったtplot var.を var_label に指定する。特に指定しなくても時刻と日付は一番下に表示される。

なお,表示される数値の表示形式を変更したい場合, options, 'tplot変数名', 'format', '(F5.3)' などとして変更する。

Ex) var_label_str=[‘tha_state_pos_MLT’,’tha_state_pos_R’]
    tplot_options, var_label=var_label_str 
    tplot

一度指定したvar_labelを非表示にしたい場合は、tplot_options, var_label=0 とする。

値が単調増加している配列の中から、指定した値を超えない中で最大となる値の配列番号を得るには? (max()とwhere()を使った常套手段)

例えばエネルギーbinのような配列から、該当binの番号を計算したりするのに使う方法。

IDL> Ene_bnd=[ 0.01, 0.05, 0.1, 0.5, 1.0, 5.0, 10.0, 50.0, 100.0, 500.0] 
IDL> Engy= 25.0
IDL> idx= max( where( Ene_bnd LT Engy ) )
IDL> print, idx
    6
IDL> print, Ene_bnd[idx]
  10.0000

変数・配列が定義されているかを調べるには?

変数や配列が定義されているかを調べる関数としては keyword_set() があるが、これは変数・配列が定義されていても中身がゼロだと「未定義(=0)」を返してしまう。このため、procedure,functionに渡されるキーワードをチェックするのに使用すると思わぬバグを招く可能性がある。それを避けるためには、n_elements()やsize() を使うとよい。最近では、定義されていないことを調べるundefined()という関数も使われる。IDL ver. 8.0以降では isa() という関数も使える。

変数A が定義されているかをチェックするには、
IDL> if n_elements( A ) ne 0 then print, 'A is defined!'
IDL> if size( A, /type ) ne 0 then print, 'A is defined!'
IDL> if ~undefined( A ) then print, 'A is defined!'
IDL> if isa( A ) then print, 'A is defined!'

エラーバー付きのtplot変数をつくるには?

例えば,エラーバーに対応するデータ配列が準備できていた場合,store_dataするときに以下のように書くとエラーバー付きのplotが描画できる。

THEMIS> store_data, 'tplot_vars', data={x:d.x, y:d.y, dy:stdv} 

通常のx,yに加えて,dyという要素にエラーバーに対応する変数(上記の例だと,stdv)を 入れればよい。

今のところ,yに対応する配列が単純な1次元配列の場合にうまく描画できることは原が確認しました。速度や磁場など3成分あるような場合,うまくいくがどうかは確認していませんので,どなたか確認されましたら,適宜編集して下さい。

正負両方の値を含むデータを対数プロットする (mplot_symlog)

正負両方の値を持ち、かつ値が桁で変わるようなデータを縦軸linearでプロットすると、小さい桁での値の変化が潰れて見えなくなるし、そもそも負の値があると対数プロットができない。そこでこのmplot_symlog を使うと、正負で対称な対数プロットを描画できる(下図の3番目)。通常はtplot_routine属性として特定のtplot変数に設定しておき、tplotでプロットした時にこのプロットルーチンが内部で動作するようにする。

     IDL> options, 'tvar1', tplot_routine = 'mplot_symlog' 

tplotでプロットした時刻範囲を得る

timerange() を使えば直前にtplotコマンドを使って作図したプロットの時刻範囲を得ることができる。

t = timerange(/current) 

tlimit等でプロット時刻範囲を変更しても、上記のコマンドで時刻幅が得られる。なおtimerange()をcurrent キーワード無しで実行すると、timespan で指定した時刻幅が得られる。どちらの場合も t は要素2つの倍精度小数の1次元配列で、時刻幅の両端の値がTHEMIS UNIX time (time_double()で生成)で格納される。

major ticksの時間間隔を自分で設定するには?

tplotで描画するときmajor tickの間隔を設定したい場合,tplot_optionsによって設定が可能である。

THEMIS> tplot_options, 'tickinterval', 1800

上のように,設定したい時間間隔を「秒」の単位で入力すればよい。↓のnum_lab_min属性よりtickintervalの設定の方が優先されるので、major tickの位置を固定したプロットを量産したい場合に便利

また正確な調整はできないが、num_lab_min を使って最低幾つのtick を横軸に描画するかを大雑把に指定することができる。

   ex) tplot_options, 'num_lab_min', 10 

例えば↑で横軸(つまり時間軸)に最低10 ticks描画されるようになる。時刻の区切りによっては、12 ticksになったりする。あくまで最低数しか指定できないようである。

既存のtplot変数名を編集する

tplot変数名を変更したいときには,store_dataのnewnameキーワードを使えばよい。例えばtplot変数名を'oldname'から'newname'に変更したい場合,

THEMIS> store_data, 'oldname', newname='newname'

上記のように入力すればよい。'oldname'の部分はtplot変数名を文字列で入力しなくても,そのtplot変数に割り当てられたindex番号を使用してもよい。

この際,'newname'が既に使用中であると上書きに失敗するので,その場合は'newname'という名前のtplot変数を削除しておく必要がある。既存のtplot変数を削除したい場合,store_dataのdeleteキーワードを使えばよい。

時刻範囲が異なるパネルをスタックして1枚のプロットを作図する

timespanで時刻範囲を指定→tplot_options,'region'でウィンドウ内でのプロット範囲を指定→tplot, /oplot → 時刻範囲・プロット範囲を変えて繰り返し、で作図することができる。

THEMIS> timespan, '2001-01-01', 60, /day
THEMIS> omni_hro_load, /res5min 
THEMIS> timespan, '2001-01-01', 30, /day
THEMIS> tplot_options, 'region', [0.0, 0.5, 1.0, 1.0] 
THEMIS> tplot, 'OMNI_HRO_5min_BZ_GSM'
THEMIS> timespan, '2001-01-31', 30, /day
THEMIS> tplot_options, 'region', [0.0, 0.0, 1.0, 0.5]
THEMIS> tplot, 'OMNI_HRO_5min_BZ_GSM', /oplot

これでウィンドウの上半分に2001-01-01から2001-01-30までのプロット、下半分に2001-01-31から2001-03-01までのプロットを描画できる。

パネルのy軸の間隔を調整する

以下のように書けばよい。ただし'ytickinterval'では調整することができないので,注意すること。

THEMIS> options, 'tplot変数', 'yticks', **
THEMIS> options, 'tplot変数', 'yminor', **

パネルの縦幅、隙間の幅を調整する

tplotでプロットされる各パネルの相対的な縦幅は panel_size という属性で調整できる。例えば、以下の例では、tvar1とtvar2のプロットパネルの縦幅の比が1:2 になるように描画される。

    IDL> tplot_names
    1 tvar1
    2 tvar2
    IDL> options, 'tvar1', panel_size = 1.0
    IDL> options, 'tvar2', panel_size = 2.0 
    IDL> tplot, [ 'tvar1', 'tvar2' ] 

すぐ上下のパネルとの隙間の大きさは tplot_options, 'ygap', 1.0 のようにygap 属性を指定することで変えることができる。0 - 1の間の値を指定することができ、1.0 にするとデフォルトの間隔、0.0にすると隙間を無くすことができる。またこのygap には配列を与えることができ、例えば[1,0,1,1] を設定すると上から1番目と2番目のパネルのみが隙間なくくっつき、2-3番目、3-4番目のパネル間は通常の間隔になる。

パネル右端に描画されるラベルの位置を調整する

tplotで描画されるプロットパネルの右端にラベルを付けるには options, 'tvar1', 'labels', ['Bx','By','Bz'] のようにlabels属性にラベル文字列で指定する。これらのラベルをどの位置に描画するかは labflag という属性で色々変えることができる。options, 'tvar', 'labflag', ?? のように整数値を設定するが、値とその意味は以下の通り。

  • 2: 右端のデータのすぐ横 (これがデフォルト)
  • 1: 下から上に等間隔で並べる
  • -1: 上から下に等間隔で並べる
  • 3: labpos属性で指定した任意の場所(プロットパネルの縦軸のデータ値で指定)にラベルを書く
  • 0: ラベルを表示しない

パネル毎に異なるカラーテーブルをを使って描画する

各tplot変数に color_table 属性を options で指定してやればよい。

   THEMIS> options, 'tplot変数1', 'color_table', 0
   THEMIS> options, 'tplot変数2', 'color_table', 43 
   THEMIS> tplot, [ 'tplot変数1', 'tplot変数2' ] 

上記のようにすると、tplot変数1は0番のカラーテーブル(B-W Linear), tplot変数2は43番(Fast-Special) を使って描画される。

内部でloadct2 を実行しており、IDL ver. 8.5.1 の時点では、74番のカラーテーブルまで用意されている。SuperDARNデータプロットの例など、改造版のloadct を使う場合は、tplot.pro の中でloadct2 を実行している部分を自分が使うloadct (ERG-SC pluginを使っている場合loadct_sd)に書き変えておく必要がある。

fill_color属性の使い方

tplotコマンドは、tplot変数に"fill_color"属性があると、その属性値の色を使って単色上塗りをすることができる。この機能はSuperDARNデータをプロットする際に地上散乱エコーを灰色で塗り潰すために使われている。またほかの使い方として、例えば粒子のエネルギースペクトルのうちあるflux値以下の値を黒く塗り潰す、ようなことにも使える。(以下はTHEMIS/ESAデータを使った例)

IDL> copy_data, 'tha_peir_en_eflux', 'tha_peir_en_eflux_masked'  ;マスク用のtplot変数を作る
IDL> get_data, 'tha_peir_en_eflux_masked', data=d, dl=dl, lim=lim 
IDL> d.y[ where( d.y gt 1e+5 ) ] = !values.f_nan   ;1e+5以上のflux値をNaNで置換、1e+5以下のみ残す 
IDL> store_data, 'tha_peir_en_eflux_masked', data=d, dl=dl, lim=lim  ;↑を元のtplot変数に戻す
IDL> options, 'tha_peir_en_eflux_masked', 'fill_color', 7  ;fill_color属性を設定。42番カラーテーブルだと7 は黒色
IDL> store_data, 'tha_peir_en_eflux_merged', data=['tha_peir_en_eflux','tha_peir_en_eflux_masked']
IDL> tplot, 'tha_peir_en_eflux_merged'

最後の行でマルチtplot変数を描画する際に、tha_peir_en_eflux は通常通り描画され、その上にtha_peir_en_eflux_masked のうち有限値の部分がfill_color で指定された色で単色上書き描画される。NaNにあたるピクセルは何も上書きされないので、tha_peir_en_efluxで描画されたピクセルがそのまま残る。

カラーバーを表示させないようにする

tplot変数毎に"no_color_scale" という属性を1 に設定してやればよい。0 に戻せば通常通りカラーバーが表示される。

  IDL> options, 'tha_peir_en_eflux', 'no_color_scale', 1 

カラーバーの位置、太さを変える

"zoffset" という属性に[x0, x1] のような配列を設定することで、tplot変数毎にカラーバーの横方向の位置、横幅を変えることができる。x0, x1がそれぞれカラーバーの左端, 右端の位置を表しており、x1-x0 が幅になる。通常表示されるカラーバーは[1., 2.] である。x1 の値を3., 4., ... と大きくしていくとカラーバーが太くなる。またx0 の値を小さくすると左端がプロット枠に近づいていく。x0 = 0 で、プロット枠に接して、負の値にするとプロット枠内にはみ出していく。

  IDL> options, 'sd_hok_vlos_1', 'zoffset', [1., 3.]    ;カラーバーの横幅が倍になる

プロットやカラーバーの目盛り(tick)を外側に描画するには?

IDLのPLOTコマンドに与えるキーワードの1つ[x,y,z]ticklen の値を変えると、プロットのX,Y,Z軸目盛り(tick)の長さや描画する場所(プロットの内側 or 外側)を変更することができる。正の値だとプロットの内側、負の値だとプロットの外側にtickを描画し、値の絶対値がtickの長さになる。この長さはnormal座標で与えるので、0 だと長さゼロ(つまり描画しない)、1 だとプロットのそれぞれの軸方向の幅、0.5 だとその半分、などとなる。通常のプロットのX,Y軸 tickの長さは[x,y]ticklen = +0.02~+0.05 くらいである。

tplotで作図するプロット全てのtick長を変える場合はtplot_options でticklenを指定すればよい。例えばX軸のtickを外側に描画したい場合は、

tplot_options, 'xticklen', -0.03 

とする。またよくあるケースで、スペクトルタイプのデータをプロットする際に、カラーバーのtickを外側に描画したい場合は、

options, 'tplot変数', 'zticklen', -0.5 

のようにすればよい。このようにすれば、指定したtplot変数のみにこのtickの描画設定が反映される。

スペクトルプロットでのデータ欠損埋めの制御 (datagap)

tplotコマンドでスペクトルタイプのtplot変数をプロットする(内部ではspecplot.proが動いている)際に、データ配列に欠損があると、自動的に欠損時間帯が前後のピクセルと同じ色で埋められてしまう。この勝手に埋めてしまう欠損時間幅の最大値を datagap 属性で指定することができる。単位は秒である。なお線プロットでもこの属性は有効なので、tdegap等でNaN埋めしなくてもデータギャップをスキップして描画できる。

  IDL> options, 'sd_hok_vlos_1', 'datagap', 10.      ;10秒以下のギャップは自動的に埋める(10秒以上は塗りつぶさない)

プロットパネルの右側に別のY軸を表示する

optionsコマンドを使って、あるtplot変数にaxis属性を追加することで可能。これはtplot (mplot)の中でIDL標準の AXIS procedureを実行することによって実現しており、axis属性にはAXIS procedureに与える引数・キーワードを構造体で与える。

  IDL> tplot_names
  1 gmag_bx
  2 gmag_bx_div_bt
  IDL> options, 'gmag_bx_div_bt', axis={yaxis:1, yrange:[-1, 1], ystyle:1} 
  IDL> options, 'gmag_bx', 'ystyle', 9 
  IDL> store_data, 'gmag_combined', data=[ 'gmag_bx', 'gmag_bx_div_bt' ] 
  IDL> tplot, 'gmag_combinded'

上記の例では、multi tplot変数 gmag_combined をプロットする際に、プロットパネルの右端に [-1, 1] の範囲のY2軸を描画している。ystyle=9 はプロットパネルの右側のY軸を描画しないようにするためで、そうしないと元々のY軸にY2軸を重ね描きすることになり見難くなる。axis属性に与える構造体については、AXIS procedureのマニュアルを参照のこと。同様の方法でX2軸やZ2軸を描画することもできるはず。

tplotを実行した時に特定の時刻に縦線を表示する (timebar属性)

tplotでプロットをした後にtimebarコマンドで特定時刻を示す縦線を追加することができるが、tplotを実行する度に毎回同じ縦線を表示させたい場合は、tplot_optionsでtimebarという属性を設定することでできる。以下で、gmag_event_time が縦軸を表示させたい時刻を示すtplot変数。通常のtplot変数のように、X,Yメンバーを持った構造体から作成する。そのうちXメンバーの時刻のみが縦線を引く際に参照され、Yメンバーに入っている配列は無視される。

  IDL> tplot_names
  1 gmag_bx 
  2 gmag_event_time
  IDL> tplot_options, 'timebar', 'gmag_event_time' 
  IDL> tplot, 'gmag_bx' 

また特定のデータのみに縦線を描画したい場合は、optionsを使って個別のtplot変数にtimebar属性を与えて、かつそれらを一括描画するコマンド tplot_apply_timebar を実行する。このtimebar属性には単なる時刻配列 ( ['2008-03-01/11:00','2008-03-01/12:00', ...] とかSPEDASの時刻形式(decimal UNIX time)の配列) を与えてもいいし、下記の例のように時刻配列を含む構造体を与えて、描画する線の属性を指定することもできる。縦線をプロットから消すには、tplot コマンドで再プロットすればよい。

  IDL> event_times = ['2008-03-01/11:00','2008-03-01/12:00', '2008-03-01/13:00'] 
  IDL> options, 'gmag_bx', 'timebar', event_times
  IDL> tplot, 'gmag_bx' & tplot_apply_timebar 

  IDL> options, 'gmag_bx', 'timebar', {time:event_times, linestyle=2, color=3, thick=2} 
  IDL> tplot, 'gmag_bx' & tplot_apply_timebar 

  IDL> tplot_apply_timebar, /clear   ;;直前にプロットされた全tplot変数からtimebar属性を削除
  IDL> tplot_apply_timebar, 'gmag_bx', /clear  ;;特定のtplot変数のみtimebar属性を削除

またこの機能の親戚で、パネル内に横線を引く機能もある。その機能の属性名は databar で、構造体で横線の指定をする場合は、{yval:[..,.., ], linestyle=2} のように yval という構造体メンバーに入れるようにする。またdatabar属性を消すコマンドは tplot_apply_databar であり、使い方は tplot_apply_timebar と同様である。

thm_init, erg_initで色指定を再度行う

通常IDLセッション起動直後にthm_initを実行することで、!themis or !ergシステム変数及びカラーテーブル・foreground/backgroundカラー等の色指定を行うが、これを後で再度実行したい場合は、resetキーワードを付けて実行する。

IDL> thm_init, /reset 
THEMIS>      <---- promptがTHEMISに変わる(ただし色設定等の効果とは関係ない)

もし上記の色指定だけを行いたい場合は、spd_graphics_config のみを実行すればよい。ただしこのコマンドはかなり最近のバージョン(2016-10-06版)のSPEDAS bleeding edgeから集録されており、それ以前はthm_graphic_config という名前だった。古いバージョンのSPEDASを使っている人はこのthm_graphics_config を代わりに実行すればよい。

IDL> spd_graphics_config 
IDL> thm_graphics_config 

またERG(Arase)データ用の同様のコマンドがERG-SC plugin for SPEDASに収録されている。それらを使っても同じことができる。

IDL> erg_init, /reset 
ERG>       <---- プロンプトが変わる
IDL> erg_graphics_config   (グラフィック設定のみ初期化したい場合)

z-bufferの簡単な使い方

z-bufferは仮想的な出力デバイスで、set_plot, 'z'と指定することで、プロット等でウィンドウに描画されたピクセル情報がメモリー上にビットマップとして格納される。バックグランドのshellスクリプトでプロットを自動作成する等、X-window出力が使えない環境でプロットを行う場合に使用すると便利である。以下、z-bufferを使ってプロットを画像ファイルに保存するためのサンプルコマンドを示す。

cur_dev = !d.name  ;現在のデバイス名、色の深さの設定を保存しておく。
device, get_decomposed=cur_decomp 

set_plot, 'z'    ;出力先にz-bufferを指定
device, set_resolution=[640,480]    ;仮想ウィンドウのサイズを指定。未指定だと640x480 になる。
spd_graphics_config   ;tplot系を使う場合の色指定。毎回初期化する必要有り。
tplot, "xxxxxxx"   ;通常と同様にプロットコマンドを実行。複数も可。
makepng, 'test', /no_expose   ;上記のプロットコマンド(群)の結果をtest.pngファイルに保存

img = tvrd()   ;z-buffer上に描画された絵をピクセルデータ配列として保存する(後で使いたい場合のみ)

set_plot, cur_dev    ;直前の出力デバイス、色の深さの設定を復帰させる
device, decomposed=cur_decomp 

なお最初及び最後の2行は元の出力モードを保存して最後に設定し直すためのコマンドなので、単にz-bufferに出力するだけであれば、set_plot, 'z' から img = tvrd() までを実行すればよい。

ylim + マウスクリック

tplotでスタックプロットを出している状態で引数無しで ylim を実行すると、プロット上にカーソルが現れる。その状態で、スタックプロット中のあるパネル内で2点を左クリック、右クリックとすると、2点クリックしたY軸の上下限の値を使ってそのパネルの元データであるtplot変数にylimが実行される。つまりその直後にtplotを実行すると、Y軸範囲が変わったプロットが作成される。

SolarSoft (SSW)とSPEDASとのコンフリクト

太陽業界で広く使われているSolarSoft(SSW)とSPEDASとを同時にコマンド検索パスに入れて実行すると、両者に存在する同名のprocedure/function(しかし引数等が異なる)が誤って実行されエラーになることがある。有名な例としては、minmax()などである。両者を一緒にコマンド検索パスに入れた状態で使う場合、コンフリクトしているprocedure/functionを毎回コンパイルし直すしかない。

どのprocedure/functionがコンフリクトするかについて某氏より情報提供して頂いたので、それを以下に記載する。これ以外にももっと色々コンフリクトしていると思われるので、気がついたものから追記していく予定。

  • コンフリクトするprocedure/function

    • ssl_general/tools/misc/average.pro
    • ssl_general/misc/nn.pro
    • ssl_general/misc/time_stamp.pro
    • ssl_general/misc/time_struct.pro
    • ssl_general/misc/minmax.pro
    • ssl_general/misc/box.pro
    • ssl_general/misc/oplot_err.pro
    • ssl_general/misc/SSW/undefine.pro
    • ssl_general/science/plot_map.pro
  • 内部で上記のコンフリクトするpro/funを呼んでいるprocedure/function。括弧内はコンフリクトの原因となるpro/fun。

    • ssl_general/tools/tplot/avg_data.pro (average , minmax)
    • ssl_general/misc/bytescale.pro (minmax)
    • ssl_general/misc/box.pro (minmax)
    • ssl_general/misc/time_ticks.pro (time_struct , minmax)
    • ssl_general/misc/time_double.pro (time_struct)
    • ssl_general/misc/time_string.pro (time_struct)
    • ssl_general/tplot/specplot.pro (minmax , box)
    • ssl_general/tplot/store_data.pro (minmax, undefine)
    • ssl_general/tplot/tplot.pro (minmax , time_stamp , box)
    • ssl_general/tplot/mplot.pro (minmax , box)
    • ssl_general/tplot/get_ylimits.pro (minmax)

なお、某氏のご厚意により、コンフリクトを起こすpro/funのコンプリートリストを提供して頂いたので、member_contribリポジトリに置かせてもらっている。( https://github.com/spedas-j/member_contrib/blob/master/misc/spedas2ssw/SPEDAS_SSW_conflicts.txt )

また上記とは別に、UCBの原氏よりSSWやSPEDASのpro/funのコンフリクトを認識して自動でコンパイルし直すスクリプトを提供して戴いたので、合わせて同じディレクトリに置かせて頂いている( https://github.com/spedas-j/member_contrib/blob/master/misc/spedas2ssw/spedas2ssw.pro )。 自己責任で使用して頂く分には構わないとのこと。もし更新や更新希望(新たなコンフリクトが見つかったなど?)があった場合は、ぜひお知らせください。

変数を完全に消去する (undefine, delvarx)

IDL上で変数を消去(undefinedに)するにはdelvarが使えるが、Mainレベルのみ実行可能で、各procedure/function内では使用できない。undefine を使えばサブルーチン内でも変数を削除することができる。またNASA Astrolib にある delvarx.pro も同様にMainレベル以外でも使用でき、かつheep_free を使って明示的にメモリー上の実体も解放できる。temporary()を内部で使うundefineとの細かい違いは不明(通常の用途ではどちらも全く同じと考えてよいだろう)。

 IDL> a = 1 
 IDL> undefine, a
 IDL> help, a
 A               UNDEFINED = <Undefined>
 IDL> a = 1.0
 IDL> delvarx, a
 IDL> help, a
 A               UNDEFINED = <Undefined>
 IDL>

tplotに時刻x3次元配列を与えると何がプロットされるか?

tplotに時刻x3次元の配列(計4次元)を含むtplot変数を与えてスペクトルプロットをさせた場合、tplot変数の中身が {x: timearr, y:arr[ time(N), a(N1), b(N2), c(N3) ], v1:v1arr, v2:v2arr, v3:v3arr } とすれば、

  • 2つ目の次元、a(N1) についてarr を積分、結果としてintg_arr[ time(N), b(N2), c(N3) ] という配列にする。
  • c = 0 の部分、つまり arr2 = intg_arr[ time(N), b(N2), 0 ] という2次元配列を作る。
  • この arr2 を 時刻-v2arr 平面上にスペクトル描画 という処理がなされる。

少なくとも Nov., 2017時点でのspecplot.pro では上記のような仕様になっている。

配列をソートしてユニーク要素を抜き出す (spd_uniq)

重複した要素が含まれる配列から、ユニークな要素のみのリストを得たいような状況はしばしばある。その際にuniq()関数を使えばよいが、元配列を予め昇べきの順にソートしておく必要がある。それを一度でやってくれる関数がSPEDASに用意されている。

 IDL> arr = [ 2, 5, 2, 7, 3, 5, 2, 6, 3, 5, 1, 5, 2, 5, 4, 2, 6, 4, 3 ] 
 IDL> print, spd_uniq( arr ) 
   1 2 3 4 5 6 7 

内部で単に return, arr[ uniq( arr, sort(arr) ) ] を実行しているだけである。

ベクトル量の各成分を別のlinestyleで表示する (linestyles属性)

IDLのplotコマンドでは、linestyleキーワードに適当な数字を与えることで線種を実線・破線・点線にすることができる。tplotコマンドでベクトル量(例えば磁場3成分の時系列データのtplot変数)を線プロットする際に、linestyles属性に整数の配列を設定することで、各成分をそれぞれ指定した線種でプロットすることができる。

 IDL> options, 'erg_mgf_l2_mag_8sec_sm', linestyles=[0, 1, 2]
 IDL> tplot, 'erg_mgf_l2_mag_8sec_sm'

var_labelで指定した値と日時ラベルの順番を入れ替える (version)

プロットの下に衛星の位置等を表示させるにはtplot_options でvar_labelを指定するが、通常はvar_labelの値が上になり、一番底に時刻ラベルが付く。このvar_label + 時刻ラベルの表示の仕方を、versionという属性の値を変えることで何パターンか変えることができる。

 IDL> tplot_options, version=0  ;; version=3と同じ。
 IDL> tplot_options, version=1  ;; Time (UT) hours after YYYY-MM-DD、var_labelは非表示  
 IDL> tplot_options, version=2  ;; 時刻ラベル、var_labelの順に表示(しかし表示がバグってる!)
 IDL> tplot_options, version=3  ;; デフォルト (var_label, 時刻ラベルの順に表示)
 IDL> tplot_options, version=4  ;; Seconds after launch、var_labelは非表示
 IDL> tplot_options, version=5  ;; var_labelのみ表示、時刻ラベルは表示しない
 IDL> tplot_options, version=6  ;; 時刻ラベル、var_labelの順に表示(こっちはちゃんと動く)

特に指定しないとversion=3としてtplotの描画がなされる。時刻ラベルをvar_labelより上に表示したければ、version=6 と指定すればよい。

時刻を固定幅分ずらしてプロットするには? (tshift)

tplot変数をtplotコマンドでプロットすると、線プロットの場合は、tplot変数の時刻ラベルが示す時刻の位置を節点とする線が描画され、スペクトルタイプのプロットの場合は、ピクセルの横軸方向の中心が時刻ラベルが示す時刻の位置になるようにスペクトルが描画される。しかし時刻ラベルが観測積分時間の先頭になっている場合は、その先頭時刻ではなくそこから観測積分時間の半分だけずらしたところを節点・中心とする線プロット・スペクトルプロットを描画したい場合がよくある。そのような時は、tplot変数構造体にtshiftという要素を入れて、そこにプロットの時刻シフト値を入れておけばよい。

IDL> get_data, 'test', data=d   ;; 例として、何かの1分値の3次元ベクトル時系列データとする
IDL> help, d
** Structure <1714828>, 2 tags, length=345984, data length=345984, refs=1:
X               DOUBLE    Array[1440]
Y               DOUBLE    Array[1440, 3]
IDL> str_element, d, 'tshift', 30.D, /add_replace  ;; 30秒後ろにずらしてプロット点を描画する設定
IDL> help, d
** Structure <1714828>, 2 tags, length=345984, data length=345984, refs=1:
X               DOUBLE    Array[1440]
Y               DOUBLE    Array[1440, 3]
TSHIFT          DOUBLE    30.000000
IDL> store_data, 'test_shifted', data=d
IDL> tplot, [ 'test', 'test_shift' ] ;; 元データのプロットと30秒後ろにずらしたプロットとを一緒に描画

Tsyganenko-Sitnov 2005 磁場モデルのW parameter

2019年時点でTS07D modelなどの新しいモデルもあるが、地磁気・太陽風データから自分で必要なパラメータを計算してモデル値を導出できる、Tsyganenko-Sitnov 2005 (TS05) 地球磁気圏磁場モデル ( https://doi.org/10.1029/2004JA010798 )は依然よく利用されている。このモデルを使うためには、W parameterという6つの値を計算して、それをGEOPACK 等のルーチンに与える必要がある。

W parameterは、SPEDASに集録されているライブラリ (get_tsy_params + geopack_getw) を使って計算することもできるし、Dr. N. Tsyganenko自身のwebsite( http://geo.phys.spbu.ru/~tsyganenko/modeling.html )やVan Allen Probes衛星のECT/HOPEチームのwebsiteからも取得できる(QinDenton parameterに集録)。しかしながら、これらの値はちゃんと一致してはいない。以下に、ある期間のW parameterをSPEDASを使って計算したもの(by SPEDAS, オレンジ線)、QinDenton parameterに含まれている値(QD_params, 緑線)、及びDr. Tsyganenkoのwebsiteから取得したテキストファイルの値(by N.A.Tsyg., 黒線)を一緒にプロットする。

Dr. Tsyganenkoによるinput parameter fileの値が正解だと思われるので、それと比較すると、SPEDASのものもQinDenton parameterのものも、正しい値からずれている。6つのW parameterの中では W2 が一番ずれが大きく、次いでW1, W4のずれが大きい。SPEDASのものはトレンドとしてはDr. Tsyganenko謹製パラメータをfollowしているが、QinDenton parameterのものは、特に磁気嵐のピーク辺りで変な変動をしており、他2つとの違いが大きくなっている。

SPEDAS内で計算エンジンとして用いているIDL_GEOPACKのgeopack_getwが、どうも間違ったW parameter値を出力するらしい。正しい値を計算するには、Tsyganenko and Sitnov [2005]に記載されている計算式及びパラメータを使って自力で頑張るしかない。他に楽して正しいパラメータを計算できるプログラム等の在り処を知っている人がいたら、ぜひ教えてください。 差し当たって、SPEDASで計算した値をDr. Tsyganenko謹製のテキストファイルと比較して大体合っていることを確認してから、実際のモデル磁場値計算は磁力線トレースをやるようにするしかないかも。

Y,Z軸に表示される数値をべき乗で表示するには?

tplotで作成する線プロットやスペクトルプロットで、縦軸(Y軸)やカラースケール(Z軸)の数値をべき乗表示するには、数値を引数にしてべき乗表示の文字列を返すような関数を定義して、その関数名をytickformat, ztickformat 属性に入れる必要がある。ERG-SC plug-inに含まれているpwr10tick もそのような目的で作られた関数である。しかしy/ztickunits に単に 'scientific' という文字列を入れておくだけで、同様の表示ができるらしい。確かにやってみると、できる。

options, 'tplot_var1', ytickunits='scientific'  ;; 縦軸の数値をべき乗表示
options, 'tplot_var2', ztickunits='scientific'  ;; スペクトルプロットのカラースケールの数値をべき乗表示

プロット中の一部の時間帯をhatchするには?

highlight_time_intervalというコマンドを使うと、tplot変数のパネル内で、ある時間帯を指定した色で塗りつぶしたり、斜線をかけたりすることができる。これはtplot変数にtime_fill_intv属性を設定することで実現されている。手動でtime_fill_intv属性を設定してもいいがちょっと面倒なので、highlight_time_intervalコマンドを使う方がわかりやすいと思われる。

tplot, 'erg_hep_l2_FEDO_L' 
highlight_time_interval, 'erg_hep_l2_FEDO_L', color = 5
tplot  ;;replot the previous panels

これでctimeが動いて、マウスクリック2回でプロット上でhatchしたい時間帯の最初と終わり指定すると、そこがcolorで指定した色(FAST-specialカラーテーブルだと5番はyellow)で塗りつぶされる。また以下のようにキーワードを使って明示的にhatched intervalを指定することもできる。

highlight_time_interval, 'erg_hep_l2_FEDO_L', time_interval='2017-03-27/'+['06:00','08:00'], color = 5

さらに、line_fillキーワードをセットすれば塗りつぶしではなく網掛けをすることもできる。以下は斜め線で網掛けをする例。

highlight_time_interval, 'erg_hep_l2_FEDO_L', time_interval='2017-03-27/'+['06:00','08:00'], color = 0, line_fill=1, orientation = 45. 

deleteキーワードをセットすれば、highlight設定を削除することができる。

highlight_time_interval, 'erg_hep_l2_FEDO_L', /delete 

上記の例の他に、複数の時間帯を指定して塗り潰し・網掛けすることもできるし、line_fillの方はlinestyle, thick等のお馴染みの属性もそのまま渡せるようである。詳細は spdsw/general/examples/crib_highlight_time_interval.pro を参照のこと。

Clone this wiki locally