何がしたいのかというと、Neuromag付属(?)の解析ソフトGraphの、batch-processorの使い方がよくわからないので、使えるようになりたいということだったわけです。結局、cdrとかは使いませんが、ちょっとわかってきました。ちなみに、(require X)というのは、ようするにロードということですね。
さて、batch-processorをrequire(load)すると、commandにbatcn...というボタンが出てきますので、それを押してみますと、batch-processorのUIが出てきます。
- File list:バッチ処理したいファイルのリストで、これはAdd fileで追加、clear fileで除去できます。
- Output directoryは、そのまま出力先で、直接書き込んでもよいし、output directoryボタンで指定してやってもよいし、output to source dir.で、inputファイルのあるディレクトリにしても良いです(なお、これを押すと:sourceと出てきまして、これを直接入力してやってもよいと思います。この、:(コロン)からはじまるシンボルは、「キーワード」と呼ばれるものらしいんですが、よくわかってません。まあ、この場合はもともとのファイルがあるところに出力されるおまじないで良いですかね。誰かわかりやすく教えてください)。
ここまでは良いんですが、問題は次とその次です。
Process definitionsの項には、statesとprocessがあって、その左側のselectボタンでどうやらファイルを呼び出せるようですが、stateは/neuro/lisp/examples/batch-state/stim1-2.lsp、processは/neuro/lisp/examples/batch-process/echo.lspくらいしか呼び出せないんですよね。新しく作ろうとおもって、NewとかEditを押しても、アラートが出るばかりで何もできないので、困り果てていたわけですが、ようするにstim1-2.lspとか、echo.lspというのは、lisp fileなわけなので、この中身とマニュアルをみればわかるんじゃないかな、ということで、とりあえず今回はbatch-stateの話を書きます。
マニュアルと総合して考えると、以下のようなことのようです。
とにかく、
(define-batch-states <name> <path> (<string> (setu <state for process> '(<state setting>))(<string2> ...))
という文字列をテキストエディタで書いて、これを<name>.lspという名前で保存し、<path>のところに置けば良い。
これだけ!非常に簡単なことでした。以下で多少詳解します。
define-batch-states
これは、こういう名前の関数ですよ、ということでしょう。libあたりに、define-batch-states.lspというファイルがあるものと思われますが、別によまなくても良いです。
<name>
stateの名前をつけます。何でも良いですが、このファイルを保存するときには、この名前.lspという形式で保存する必要があります。たとえば、sta-dev-averagerとか。最終的にsta-dev-average.lspとして保存します。
<path>
このファイルがあるところまでのフルパスをダブルクオーテーションで括って指定します。たとえば、"/home/neuromag/D/hayato/lisp/sta-dev-averager.lsp"とか。.setupで保存している場合のみ、拡張子は不要のようです。また、/neuro/lisp下にファイルを作っている場合は、そこからの相対パスで良いようです。余談ですが、パスについてはパスを通すということという記事が地味に人気です。文系はこういうところでつまづくんですよね。
<string>
これから、batch-processで処理を行うための条件設定をするわけですが、その条件に名前をつけます。このstringが、元ファイル名の末尾につきます。たとえば、ここに"sta"(文字列はだぶるクオーテーションで括ってくださいね)という名前をいれて、元ファイルがrawdata.fifという名前だったとすると、rawdatasta.fifというファイルが出力されます。可読性を高めるためには、"_sta"とかにしておいた方が良いかもしれません。
setu
GNU Emacs Lisp Reference Manualによれば,(set X Y)でXにYの評価後の値を代入する,(setq X Y)だと,Yそのものを代入する,ということのようですが,setuがないので良くわかりません.でもまあ,以後のリストにアポストロフィ(これがquote(setqのqはこれ)の証)がついているので,setよりなのでしょう.ようするに,次に指定する変更したい設定に,その設定内容をいれますよ,ということになります.完全に余談ですが,非公式広島大学病院脳磁図室ホームページによれば,Graphで使われているlispは,MjkLispというもののようですが,MjkLispで検索しても広島大学のページしかでてこないので,どうしようもありません.…
<state for process>
ここで,以後のprocessのために設定したい項目を記入しておきます.たとえば,トリガ1と2で加算したいよ,とかいう場合,良くあるのはuniaryでthresholdを設定しておいて,そのuniaryの名前をaverage-triggerにいれるということかと思いますが,この場合だと,とりあえずここでaverage-triggerを呼び出しておきます.特定のG-widgetから呼び出すこともできて,この場合は,resource (G-widget "widgetname") :keyword
などとします.ここで説明すると冗長になるのですが,たとえばpick widgetにMEGという名前をつけていて,このマグネトメータを除去したいという場合は,おそらくここでresource (G-widget "MEG") :ignore
などとすると良いでしょう(実際の値は,次の項で指定します).
keywordの部分は,コントロールパネルで各widgetをクリックしたときに出てくる多数の枠があると思いますが,その左側に書いているものに該当します.すごい迂遠な説明で申し訳ありません.
'(state setting)ここでは,さっきの<state for process>で指定した変更したい条件の,具体的な値を書きます.これも胡乱な説明ですが,ようするに,たとえばaverage-triggerであれば,'("trigger1" 0)とか'("threshold" 0)とかですね.文字列はダブルクオーテーションで囲みます.アポストロフィは何かというと,括弧内の式を評価しないということで,これがないと,多分上記の式の場合だと,average-triggerは0と評価されてしまうんじゃないかと思われます.resource (G-widget "MEG") :ignore
の場合は,ここに(MEG*)とかですかね…?ちょっとやってみたわけではないのでなんとも言えませんが.
具体的には,たとえばこのようにします.
(define-batch-states sta-dev-averager
"/home/neuromag/D/hayato/lisp/sta-dev-averager.lsp"
("_sta" (setu average-trigger '("trigger1" 0))
("_dev" (setu average-trigger '("trigger2" 0))
)
これで,バッチ処理をするファイルがfile1.fif, file2.fif, file3.fif...だとすると,file1_sta.fif, file2_sta.fif, file3_sta.fif...に対しては"trigger1"(uniaryで,thresholdをfeql(1)にしているもの)を使って処理をし,file1_dev.fif...に対しては,"trigger2"を使って処理をします,という状態を定義している,ということになるのだと思います.
なお,複数要素を組み合わせたいときは、combineという関数を使います.
(combine
(("A" (resource (G-widget "filter") :pass-band '(band-pass 8 12)))
(("B" (resource (G-widget "filter") :pass-band '(band-pass 15 25)))
(("S1" (setu trigger-source '("threshold" 0)))
)
このようにすれば、AS1, BS1ができるようです。これは完全にマニュアルのコピペ(ほぼ)なので,試してみてはおりません.おそらく単純な組み合わせしかできない(たぶん)ので、あまり多くすると大量にできすぎると思われますが,それこそバッチの意味があるところなので,このあたりは程よいところを見つけていく,ということになるでしょう.
[1回]
PR