データの読み書き

frame fileを読む

時系列データを読む場合は、基本的にgwpy.timeseriesのTimeSeries もしくはTimeSeriesDictを用いる。
単一ファイルの単一チャンネルを読むだけなら前者で十分だが、結局のところ後者の方が上位互換なので、常にそちらを使う方がおススメ。

Jupyterのサンプルコード (要JGWdocアカウント)

frame fileに入っているチャンネル名を調べるには、コマンドラインで

$ FrChannels {frame fileのpath} | grep {探したいチャンネル名に含まれる文字列}

を使うか、pythonで

   1 from lalframe.utils.frtools import get_channels
   2 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しなければならないため面倒だしヒューマンエラーも起きやすい。
dttxmlというパッケージを使えばpythonで直接.xmlファイルを読むことができる。
ただしdttxmlはドキュメントが全く整備されていないので、自力でソースコード読むなりしないと使えないのが難点。
ファイルへアクセスする方法は

   1 acc = dttxml.DiagAccess('fname.xml')

とのことなので、適当なファイルを開いて

   1 print(vars(acc))

   1 acc.__dict__.keys()

で調べていくのでも良い。

"Power Spectrum" 等を読んでgwpyのFrequencySeriesにする

Diagguiの"Power Spectrum"というのは、用語の間違えがそのまま放置されていて、実際にはASDであることに注意。また、gwpyのcoherenceはいわゆる2乗コヒーレンスだが、Diagguiのcoherenceは2乗ではないものである。
次の関数を定義して引数にファイル名を入れれば、ASD等のdictができる。channel名を指定すればgwpyのFrequencySeriesとして扱える。

   1 import dttxml
   2 from gwpy.frequencyseries import FrequencySeries
   3 
   4 def get_ASDs(file):
   5     diaggui = dttxml.DiagAccess(file).results.PSD
   6     return {ch: FrequencySeries(diaggui[ch].PSD[0], frequencies=diaggui[ch].FHz, 
   7                                 epoch=diaggui[ch].gps_second,
   8                                 channel=diaggui[ch].channelA,
   9                                 name   =diaggui[ch].channelA) 
  10             for ch in diaggui.keys()}
  11 
  12 def get_COHs(file):
  13     diaggui = dttxml.DiagAccess(file).results.COH      
  14     return {chA: {diaggui[chA].channelB[i]:
  15                   FrequencySeries(diaggui[chA].coherence[i], frequencies=diaggui[chA].FHz, 
  16                                   epoch=diaggui[chA].gps_second,
  17                                   channel=diaggui[chA].channelB[i]+' / '+diaggui[chA].channelA,
  18                                   name   =diaggui[chA].channelB[i]+' / '+diaggui[chA].channelA)
  19                   for i in range(len(diaggui[chA].channelB))}
  20             for chA in diaggui.keys()}
  21 
  22 def get_CSDs(file):
  23     diaggui = dttxml.DiagAccess(file).results.CSD
  24     return {chA: {diaggui[chA].channelB[i]:
  25                   FrequencySeries(diaggui[chA].CSD[i], frequencies=diaggui[chA].FHz, 
  26                                   epoch=diaggui[chA].gps_second,
  27                                   channel=diaggui[chA].channelB[i]+' / '+diaggui[chA].channelA,
  28                                   name   =diaggui[chA].channelB[i]+' / '+diaggui[chA].channelA)
  29                   for i in range(len(diaggui[chA].channelB))}
  30             for chA in diaggui.keys()}
  31 
  32 
  33 def get_TFs(file):
  34     diaggui = dttxml.DiagAccess(file).results._mydict['TF']
  35     return {chA: {diaggui[chA].channelB[i]:
  36                   FrequencySeries(diaggui[chA].xfer[i], frequencies=diaggui[chA].FHz, 
  37                                   epoch=diaggui[chA].gps_second,
  38                                   channel=diaggui[chA].channelB[i]+' / '+diaggui[chA].channelA,
  39                                   name   =diaggui[chA].channelB[i]+' / '+diaggui[chA].channelA)
  40                   for i in range(len(diaggui[chA].channelB))}
  41             for chA in diaggui.keys()}

KAGRA/Subgroups/PEM/PythonMemoJP/ReadFile (last edited 2025-02-14 16:25:54 by tatsuki.washimi)