2020年1月31日金曜日

ObsPyでWINフォーマットを読み込むときのバグ

ObsPyでは、WINフォーマットをreadコマンドでStreamとして読み込むことができる。

ただ、たまに波形が変になったり、結合(merge)でエラーが出たりするので、コードを見てみた。
https://docs.obspy.org/_modules/obspy/io/win/core.html#_read_win


データサイズが3Byteの時のデータ読み込みの部分が以下のようになっていた。
elif datawide == 3:
    for i in range((xlen // datawide)):
        idata2 = output[chanum][-1] +\
        from_buffer(sdata[3 * i:3 * (i + 1)] + b' ',
            native_str('>i'))[0] >> 8


ここで、3Byteのデータに1Byte足して、4Byteを整数(int64)に変換し、それをビットシフトで後ろの1Byte(8bit)を取り除いてから、1つ前の時間のデータに足し合わせている。

ここで、ビットシフト演算子(>>)は、足し算よりも優先度が低いため、前のデータに足し合わせた後でビットシフトしてしまっている。
つまり、

elif datawide == 3:
    for i in range((xlen // datawide)):
        idata2 = output[chanum][-1] + (from_buffer(sdata[3 * i:3 * (i + 1)] + b' ', native_str('>i'))[0] >> 8)

のように、足し合わせる部分を括弧で括ればOK。

2016年8月9日火曜日

geditの警告


なぜかよくわからないけど、gedit を使うと

(gedit:22721): Gtk-WARNING **: Calling Inhibit failed: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.SessionManager was not provided by any .service files

** (gedit:22721): WARNING **: Set document metadata failed: metadata::gedit-spell-language という属性値はセットできません


というような警告が出てくる。


機能的には問題ないけど、保存する度に出てきたり。。

気になるし、ターミナルが汚れるので嫌だ。


ちゃんと消す方法がわからなかったので、無視してしまおうという方法。

gedit tmp.txt > /dev/null 2>&1 &











psxyの範囲の自動設定

GMTを使うときれいな図が描ける。psxyとか。

ただ、軸の範囲を自分で決めなきゃいけなかったり、ちょっとめんどくさい。

GMT5では、gmtinfoコマンドによりファイルの最大値や最小値を求めることができる。


例えば、以下の data.txt があった場合
0 0
1 1
2 4
3 5
4 4
5 1
6 0


> gmtinfo data.txt -I1/1
-R0/6/0/5

> gmtinfo data.txt -I4/4
-R0/8/0/8


という感じで、範囲を出してくれる。

"-I" オプションは、区切り間隔を示していて、データの範囲が入る区切りの最小の倍数を返すようになっている。

つまり

range=`gmtinfo data.txt -I1/1`
psxy data.txt -JX8/5 -R$range -BnSeW -Bxya1 -P > out.ps


range=`gmtinfo data.txt -I4/4`
psxy data.txt -JX8/5 -R$range -BnSeW -Bxya1 -P > out.ps

という感じになる。



また、プロットで使う目的以外にも最大値と最小値を簡単に調べられるので便利。

例えば、2列目の最小値と最大値は
> gmtinfo data.txt -i1 -o0 -C
0

> gmtinfo data.txt -i1 -o1 -C 
5

となる。

"-i" オプションは、データファイルの列を示す(0から始まる)。

"-o"オプションは、0が最小値、1が最大値を表す。