= データの読み書き = == frame fileを読む == 時系列データを読む場合は、基本的にgwpy.timeseriesの[[https://gwpy.github.io/docs/stable/timeseries/|TimeSeries]] もしくは[[https://gwpy.github.io/docs/stable/api/gwpy.timeseries.TimeSeriesDict/|TimeSeriesDict]]を用いる。<
> 単一ファイルの単一チャンネルを読むだけなら前者で十分だが、結局のところ後者の方が上位互換なので、常にそちらを使う方がおススメ。<
> [[https://gwdoc.icrr.u-tokyo.ac.jp/DocDB/0165/T2516508/001/read_gwf.html|Jupyterのサンプルコード]] (要JGWdocアカウント) frame fileに入っているチャンネル名を調べるには、コマンドラインで {{{ $ FrChannels {frame fileのpath} | grep {探したいチャンネル名に含まれる文字列} }}} を使うか、pythonで {{{#!python from lalframe.utils.frtools import get_channels print(get_channels(source)) }}} とすればよい。前者の方が高速なのでおススメ。 == FrequencySeriesの保存 == HDF5がおすすめ。 [[https://gwpy.github.io/docs/stable/spectrum/io.html#gwpy-frequencyseries-io-hdf5]] == Diagguiの.xmlファイルを読む == オンサイトで仕事をすると、diagguiでスペクトルやコヒーレンスを測定することが多い。<
> diagguiで保存したデータ(.xmlファイル)を解析するには、.txtファイルに書き出してそれを読む方法が最も簡単だが、いちいいち手でexportしなければならないため面倒だしヒューマンエラーも起きやすい。<
> [[https://git.ligo.org/cds/dttxml|dttxml]]というパッケージを使えばpythonで直接.xmlファイルを読むことができる。<
> ただしdttxmlはドキュメントが全く整備されていないので、自力でソースコード読むなりしないと使えないのが難点。<
> ファイルへアクセスする方法は {{{#!python acc = dttxml.DiagAccess('fname.xml') }}} とのことなので、適当なファイルを開いて {{{#!python print(vars(acc)) }}} や {{{#!python acc.__dict__.keys() }}} で調べていくのでも良い。 === "Power Spectrum" 等を読んでgwpyのFrequencySeriesにする === Diagguiの"Power Spectrum"というのは、用語の間違えがそのまま放置されていて、実際にはASDであることに注意。また、gwpyのcoherenceはいわゆる2乗コヒーレンスだが、Diagguiのcoherenceは2乗ではないものである。<
> 次の関数を定義して引数にファイル名を入れれば、ASD等のdictができる。channel名を指定すればgwpyのFrequencySeriesとして扱える。<
> {{{#!python import dttxml from gwpy.frequencyseries import FrequencySeries def get_ASDs(file): diaggui = dttxml.DiagAccess(file).results.PSD return {ch: FrequencySeries(diaggui[ch].PSD[0], frequencies=diaggui[ch].FHz, epoch=diaggui[ch].gps_second, channel=diaggui[ch].channelA, name =diaggui[ch].channelA) for ch in diaggui.keys()} def get_COHs(file): diaggui = dttxml.DiagAccess(file).results.COH return {chA: {diaggui[chA].channelB[i]: FrequencySeries(diaggui[chA].coherence[i], frequencies=diaggui[chA].FHz, epoch=diaggui[chA].gps_second, channel=diaggui[chA].channelB[i]+' / '+diaggui[chA].channelA, name =diaggui[chA].channelB[i]+' / '+diaggui[chA].channelA) for i in range(len(diaggui[chA].channelB))} for chA in diaggui.keys()} def get_CSDs(file): diaggui = dttxml.DiagAccess(file).results.CSD return {chA: {diaggui[chA].channelB[i]: FrequencySeries(diaggui[chA].CSD[i], frequencies=diaggui[chA].FHz, epoch=diaggui[chA].gps_second, channel=diaggui[chA].channelB[i]+' / '+diaggui[chA].channelA, name =diaggui[chA].channelB[i]+' / '+diaggui[chA].channelA) for i in range(len(diaggui[chA].channelB))} for chA in diaggui.keys()} def get_TFs(file): diaggui = dttxml.DiagAccess(file).results._mydict['TF'] return {chA: {diaggui[chA].channelB[i]: FrequencySeries(diaggui[chA].xfer[i], frequencies=diaggui[chA].FHz, epoch=diaggui[chA].gps_second, channel=diaggui[chA].channelB[i]+' / '+diaggui[chA].channelA, name =diaggui[chA].channelB[i]+' / '+diaggui[chA].channelA) for i in range(len(diaggui[chA].channelB))} for chA in diaggui.keys()} }}}