忍者ブログ
おかげさまでspamコメントが増えてきましたので、一応コメントを承認制にしました。基本的には承認します。
[1] [2] [3]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

FieldTripじゃないんですが…Neuromag(関係)のsoftware,maxfilterの使い方…というか公式の翻訳です.Maxfilterはすぐ後述しますが,preprocessingのためのUNIXベースのTOOLBOX,という認識で良いのかな.実はまだ実際ダウンロードなどしておりませんので,以下の説明はほんとに机上の空論の可能性があります.

maxpreprocによれば,Maxfilterのpreprocessingでは,bad channelsを発見し,ノイズ除去のためにsssを実施し,異なるco-ordinate frameのデータを変形(transforming)ができる,ということで,最後のひとつがとても重要なんですよね。というのは,本文中にも後で出てきますが,MEGのセンサは頭皮に接着するわけではない(EEGと違って)ので,被験者の頭部位置はよっぽど頑健に固定しないと(それこそ頭部の型をとるところから始めるとか),センサに対する頭部位置はずれてしまうわけです。これを補正しないと,ブロック間の加算平均とか,被験者間の加算平均は本来はしてはいけない(するとデータが歪む)というのは確かにそうで,これを補正する方法が必要であるというのは納得がいくところです。ところで本文中に出てくる,NBというのは,Nota Bene:ラテン語,良く注意せよ,という意味,を指すと解釈して良いのでしょうか。そう解釈します。

Identifying Bad Channels with Maxfilter

さて,頭部位置の補正の前にまずは第一の機能ということで,バッドチャンネルを見つけておきましょう。とりあえずコマンドは,

maxfilter -f <rawdata_file> -o <output_file> -ctc /neuro/databases/ctc/ct_sparse.fif -cal /neuro/databases/sss/sss_cal.dat -autobad 20 -skip 21 999999 -v | tee <bad_chans_log_file>
となっています。-fオプション以下に,今バッドチャンネルを探したいファイル名,-oオプション以下に,あたらしく出力するファイル名を入れます。-ctcと-calについては,
-ctcは我々のMEGを特定するcross talk correction (なにこれ),-calは良いキャリブレーションのためのオプション
であるようです。
これらをmaxfilterに入力すると,良い結果が得られる
とされています。肝心の-autobadオプションですが,この後に数字が必要です。ここでは,
バッドチャンネルを同定する方法として,記録したデータのはじめの20秒間(cHPI(current HPIかな?continuous HPI,ですね)のチューニング前に待っている時間かもしれませんが)をスキャンし,log fileに出力を返す
とあります。ようは,何秒のデータからバッドチャンネルを決めるんだい,ということですね。そして,-skipオプション後の数字は,
時間を節約するために,ファイルの残りをスキップするようにmacfilterに伝えること
が必要ということで,21秒目から999999秒目(とにかく実際の実験より大きい数字なら良い,ということかな)。はスキップしてね,ということのようですね。-vオプションは,一般的なUNIXでは,"情報表示"(view?)のようです。違ったらすみません。teeについては,Tee(UNIX)によれば,出力をコピーする,ということですから,ここで得たデータからlogファイルを生成する,という理解で良いのではないかと思います。

とりあえず今日はここまで!

拍手[0回]

PR

PREPROCESSINGは,MEGおよび/あるいはEEGデータを,ユーザが特定したtrialによって読み込み,いくつかのユーザが特定したpreprocessingステップをシグナルに応用する.これは,

[data] = preprocessing(cfg)
あるいは,
[data] = preprocessing(cfg, data)
という形でおこなう.cfgは構造体であり,データセットのファイルネーム,trialsとpreprocessing オプションの全ての詳細を含む.Preprocessingは,ファイルから読み出すためのデータの断片を定義した後にだけできる.データ中にトリガの発生を基盤にして行うことを例にしている.

もしPREPROCESSINGを最初の入力変数としての構造体だけを呼び,かつデータがファイルから読まれなければならないときは,

cfg.dataset = ファイルネームの文字列; %cfg.dataset = 'filename'のように,シングルクオーテーションで囲みます.
cfg.trl = N×3のマトリクス.%トライアルの定義による.definetrialをすれば出力されます.また,このファイルをみたところ,(トリガベースによる切り出しの場合は,そのトリガが立った時点)|(次のトリガが立った時点)|不明.durationかな?*イベント分の行,という形で構成されていましたので,トリガを建ててない場合は,適当なN×3のマトリクス行列を作ってあげればそれを元に読み出してくれると思われます.
cfg.padding = 個々のトライアルの長さがフィルタリングのために引き延ばされる(padded). ?
cfg.continuous = 'yes'か'no' %ファイルが連続データかどうか.デフォルトでは自動的に決まる.
を設定するようです.

データセットを特定する代わりに,ヘッダ情報を含むファイルの名前と,データを含むファイルの名前を特定することもできる.

cfg.datafile = 'filename'
cfg.headerfile = 'filename'
で良いらしい.これだと楽ですね.

もしPREPROCESSINGを,"data"変数の二度目の入力をして呼び出したとすれば,前のPREPROCESSINGの呼び出しにおけるファイルから既に呼び出されたファイルを含むことになる.この場合にのみ,構造体のオプションは次のようになる.

読まれるであろう,そして/あるいはpreprocessをされるであろうチャンネルを,
cfg.channel = チャンネルのselectionとしてのN×1セル配列 (デフォルトでは'all').; %CHANNELSELECTIONを見れば詳細がある.
他のオプションとしては,フィルタ関係で,

cfg.lpfilter = 'no' or 'yes' lowpass filter
cfg.hpfilter = 'no' or 'yes' highpass filter
cfg.bpfilter = 'no' or 'yes' bandpass filter
cfg.bsfilter = 'no' or 'yes' bandstop filter
cfg.dftfilter = 'no' or 'yes' %フーリエ変形の分離を用いた線形のノイズ除去
cfg.medianfilter = 'no' or 'yes' %medianフィルタの保護をジャンプする
cfg.lpfreq = lowpass frequency in Hz
cfg.hpfreq = highpass frequency in Hz
cfg.bpfreq = bandpass frequency range, specified as [low high] in Hz
cfg.bsfreq = bandstop frequency range, specified as [low high] in Hz
cfg.dftfreq = line noise frequencies for DFT filter, default [50 100 150] Hz
cfg.lpfiltord = lowpass filter order
cfg.hpfiltord = highpass filter order
cfg.bpfiltord = bandpass filter order
cfg.bsfiltord = bandstop filter order
cfg.lpfilttype = digital filter type, 'but' (default) or 'fir'
cfg.hpfilttype = digital filter type, 'but' (default) or 'fir'
cfg.bpfilttype = digital filter type, 'but' (default) or 'fir'
cfg.bsfilttype = digital filter type, 'but' (default) or 'fir'
cfg.lpfiltdir = filter direction, 'twopass' (default), 'onepass' or 'onepass-reverse'
cfg.hpfiltdir = filter direction, 'twopass' (default), 'onepass' or 'onepass-reverse'
cfg.bpfiltdir = filter direction, 'twopass' (default), 'onepass' or 'onepass-reverse'
cfg.bsfiltdir = filter direction, 'twopass' (default), 'onepass' or 'onepass-reverse'
cfg.medianfiltord = length of median filter
cfg.blc = 'no' or 'yes'
cfg.blcwindow = [begin end] in seconds, the default is the complete trial
cfg.detrend = 'no' or 'yes', this is done on the complete trial
cfg.polyremoval = 'no' or 'yes', this is done on the complete trial
cfg.polyorder = polynome order (default = 2)
cfg.derivative = 'no' (default) or 'yes', computes the first order derivative of the data
cfg.hilbert = 'no', 'abs', 'complex', 'real', 'imag', 'absreal', 'absimag' or 'angle' (default = 'no')
cfg.rectify = 'no' or 'yes'
cfg.precision = 'single' or 'double' (default = 'double')
使うところだけ参考にします….解説は良くわからないところもあるのでいずれ!かならずや!

EEGデータのみに使えるPREPROCESSINGのオプションは,
cfg.reref = 'no' or 'yes' (default = 'no') %リファレンスを変えるときに使うっぽい
cfg.refchannel = cell-array with new EEG reference channel(s)%どこを新しいリファレンスにするか
cfg.implicitref = 'label' or empty, add the implicit EEG reference as zeros (default = [])
implicitなEEG referenceをゼロにする?
cfg.montage = 'no' or a montage structure (default = 'no') 二階目の"data"変数入力のときにだけ使えるPREPROCESSINGオプションは,

cfg.trials = 'all' or a selection given as a 1xN vector (default = 'all')
である.

まとめると,Preprocessingをする前にどういうフィルタをかけるかを決めて,cfg.xxfilter, cfg.xxfreq,とかでその種類と範囲を指定する.+EEGの場合,リファレンスチャンネルを変更するならその設定をする,というあたりのようですね.


拍手[0回]

本家(FCdonders)のtutorialは,VSM Medtecqから出ている,CTF Omega systemというものを対象としておりまして,neuromagを使っているものとしてはちょっとずれがあって,かつあまりmatlabに詳しくないと,「そこを説明してくれよ!」というところが無かったりして,大変苦労しますよね.と勝手に共感してしまいましたが,別にそんなことが無ければ申し訳ありません.

まず,環境ですが,matlab2007b(7.5) on Windows XPでは問題なく動いているようなのですが,何故かmatlab2009a on Mac OSX Leopard, matlab2007(a?b?) on Linuxでは挙動がおかしい部分があるようです.原因はわかりません….matlabに詳しい友達が欲しいですね.特に,read_dataで異常が発生しているようです.

幸いにもmatlab2007b on Windows XPユーザでありましたら,FieldTripの他に,MNEソフトウェアのダウンロードが必要です.以前の記事でも書きましたが,MNE softwareのページからどうぞ(メールアドレスの登録が必要です).matlabtoolboxのみのダウンロードで大丈夫でしょう.環境変数にMNE_ROOTを設定し,mne_setup_toolbox.mを(既にパスが通っている)Fieldtrip toolbox等にコピーしてから実行せよ,とありますが,これ,どうも単にパスを通すだけのmファイルのようなので,自分でパスを通せば問題なく使えそうです(今のところ).環境変数にMNE_ROOTを設定しろ,というからしたんですが,どうもあまりうまくない模様.なぜだろう.

とりあえずDefinetrialまではできてるんで,そこまでご説明します.先日書いたばっかりなのでアレですが,記事が長いのでかいつまみます.まず

evt = read_event ('filename.fif');
とします.ここで選択するfifファイルは,rawデータのほうですね.それで,ワークスペースからevt変数の中身をみてみると,1×1stringというセルが並んでいるはずなので,適当なところをクリックします.そうすると,type:'STI 014'(多分これは変わらないはず) value:1 (トリガ番号)等と書かれているはずなので,それを以下に書きます.注意点としては,valueで示されるトリガ番号は,10進法で解釈されるようですので,00000001, 00000010, 00000100,等のトリガを出力している場合は,1,2,4となりますね.
cfg = []; %なんか入ってると,そのデータで解釈されるので,一回年のためcfgを空にしておきますよ,ということ
cfg.dataset = 'filename.fif'; %filenameは保存した名前(-.fif)ですね.シングルクオーテーションをお忘れなく.また,rawデータを使います.
cfg.trialdef.eventtype = 'STI 014'; %CTFだとbackpanel triggerという名前のようですが,neuromagは多分STI 014です.半角スペースやシングルクオーテーションをお忘れなく!
cfg.trialdef.eventvalue = 1; %とりあえず今分析をしたい条件に与えていたトリガ番号を書きます.
cfg.trialdef.prestim = 1; %なくても動きます.イベントの定義区間を,トリガの[数字]秒前にします.
cfg.trialdef.prestim = 1; %なくても(略)[数字]秒後にします.
で大丈夫のはずです.ここまで設定すれば,あとはいよいよ,
cfg = definetrial(cfg);
で,matlabがちゃんと動くはずです.あとは,基本的にはcfgそのものを弄るだけっぽい(もともとfiffファイルに入っていたデータを確認する必要は多分あんまりない?)ので,本家のチュートリアルに従えばできそうだと思います.大変ですけどがんばりましょう!渡辺も頑張ります.

拍手[0回]

とりあえずデータは読み込めるようになったので,すが,Tutorialに使われているデータはCTF Omega Systemで取られたデータのようで(これで検索された方がいましたが,平謝りする他ございません),Neuromagのデータはそのまんま乗っかるわけにはいかなそうなので,きちんとmatlab関数が何してるのか,ということを読んでいきたいと思います.

というわけで,tutorialのintroductionの,The Fieldtrip toolboxの部分をざっと見ると,まずDEFINETRIAL (trialの定義)をして,REJECTARTIFACT (アーティファクトの除去)をしたあとで,PREPROCESSING (前処理)をする,以降色々な分析をしますよ,ということになっています.(DIPOLESTIMULATIONは,また別のフローのよう)

というわけで,まずはDEFINETRIALをみてみます.DEFINETRIALはtrialをdefineするもので(そのままですね),trialというのは,PREPROCESSINGで読み出されるデータの切片である,ということですね.このTrialは,連続データのうちの開始(t = 0 point, 普通はトリガのポイント)と終端によって定義される,ということでここまではわかりますね.昨日書いた,read_headerという関数は,fifファイル中のヘッダを読んでいる,ということになります.たぶん.definetrialのヘルプは,matlab中で,

help definetrial
としても良いですが,ここにヘルプ全文があります.

さて,Fieldtripで用いられるデータというのは,configuration(構造体)であり,Fieldtrip中では"cfg"という文字列で表されています.

cfg.xxx = xxx;
cfg.yyy = yyy;
というように,ドット以下に文字列を加えると,cfgという変数の中に,xxx, yyyというサブ変数ができます.やってみたらわかると思いますが….スクリーンショットで見せられればわかりやすそうですね.またいずれ.

definetrialに最低限必要なcfgの構造は,以下のようになります.

cfg = [];
cfg.dataset = 'filename.fif'

cfg.trialdef.eventtype = 'eventtypestring'
cfg.trialdef.eventvalue = event(trigger)value;
ここで,cfg.datasetに入れる'filename.fif'というのはそのまま,rawデータが保存されているfiff fileになります.cfg.trialdef.eventtype/valueにいれるべき内容は,次のようにすると読み出すことが可能です.
evt = read_event('filename.fif');
evtの部分は好きな名前で結構なんですが,ようするにread_eventの結果がこの変数に入るということになりますね(まあ,matlabを使ったことがあればわかると思いますが…しつこくなるので,以下わざわざ書きません).evt fileの中を見ていくと,トリガ数*1列のイベントデータが出ていることがわかると思います.それぞれのイベントデータをみると,たとえば,type :'STI 014'とか,value:1というようなことが書いてあるものと思われます.*わかんないですが,evt.type(1,1), evt.value(1,1)とかすれば,ans = 'STI 014', ans = 1 とか出ると思います.ダメかな?

そこで,

cfg.trialdef.eventtype = 'STI 014';
cfg.trialdef.eventvalue = 1;
と入力します.加えて,
cfg.trialdef.prestim = 1;
cfg.trialdef.poststim = 1;
等とすれば,定義付けの範囲を,prestim(秒)〜poststim(秒)に限局できるようです.ここまでの構造体(cfg)情報が入力し終われば,あとは,
cfg = definetrial(cfg);
とすることで,trl情報がcfgに付加されます.これを用いて,後のpreprocessとかができるようですね.

拍手[0回]

覚書.みんなで訳すると混乱しますが,これで一応統一しましょう.文意が合わない場合は教えてください.user-specified (specify):ユーザ指定の(指定する).argument:(独立)変数.configuration structure:構造体(ひとつの変数の中に,複数のデータセットが存在するもののこと,という理解で合ってるかな?).call:(関数を)呼ぶ,呼び出す.その関数の機能を実施する.cell-array:セル配列の.string;文字列.matrix:行列.nx3 matrixは,n (たとえばトライアル数) * 3の行列,という意味(だろう).function:(順番が前後したな)関数.matlabの場合,*.mファイルに格納されている.

拍手[0回]



忍者ブログ [PR]
カレンダー
08 2017/09 10
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
メールはこちらから
プロフィール
HN:
渡辺隼人
性別:
男性
ブログ内検索
カウンター
コガネモチ