*beamformer関連:複数のファイルから同じイベントのエポックを1まとめのfiffにする

matlabで処理する:要fieldtrip, mne(mneは$MNE_ROOT/matlab/toolbox/の中身をとってくればwindowsでも使用可能)

"%"がコメント、とかからわからない人はまわりに尋ねましょう

%%改変しました:2012/2/20%%

%% 読み込む元ファイルにそれぞれ入っているエポックの数(9個とか10個とか)が違っているときフォーマットエラーになるのを回避

%% 改変しました:2012/2/14%%

%% ファイルを読み込んだ時に秒数が合わないとか何とかでエラーが返ってくるとの報告あり。

%% ヘッダ情報に最初と最後の時刻が書き込んであり、書き込み時に1個目のファイルのヘッダ情報をそのまま移したのが原因ぽい

%% その辺の情報を削除して書き込みしたのでたぶん大丈夫。

%% 改変しました: 2014/1/14 %%

%% というほどのことでもないですが、eventvalueを複数入れる時の書式に変更しています。

%% ref. cfgMain.eventvalue=[1 2 3 ..]

%% 内容説明%%%%%%%%%%%%%%%%%

%% 複数のfiffを読み込んで1つのイベントで切り出し、結合、書き出しを行うスクリプト

%% 下の部分をコピペして利用可能.読み込むファイルの名前とsettingを書きかえればおーけー

%% 一応ここにもファイル置いてます(combineSegment2rawFiff.m)

%% 注意!1:maxfilterは先にかけといがほうがよいと思われる:maxfilterをかけないと出力後のデータはベースラインがエポックごとにずれてるので、つなげた後フィルタをかけるとノイズが乗るのではないか。未確認。

%% 注意2:入力に使う各ファイルの座標系がずれていることを認識する:記録の時"measure"でHPIコイルの位置を計測して誤差がある=頭の位置は一定ではない=センサーの位置が相対的にずれている

%% ずれの程度が少ない(頭を記録中ずっと動かさなかった)と言えるならそのまま処理してもよいと思われる。

%% ずれを補正する(頭の位置を合わせる)のはmaxfilterに一応機能はある。0,0,40(標準座標)でなく、どれか1つのファイルの座標に合わせることもできるぽい。どの程度意味があるか、アーチファクトがのるかは不明。

%% 注意3:fieldtrip,mneを経由して読み書きしたデータは入力と出力の間に誤差が生じる。

%% 程度は10の-7~-8乗程度(元データに対する比率)。たいていの場合は問題ないと思われるが一応気を付ける。

%% うまくいかないときは:一通りチェックしてもだめなときはトリガーのチャンネルがSTI101になってるか確認を

%% 余談:fiff_start_writing_rawのcalsはどうも各ファイルの間で変わらないぽい。ので今は1ファイルごとデータ書き出しをしてい

%% るが、全部まとめて書き出しをしてもよいと思われる。今の方が無難ではあろう。

% trigger list:例

% 1 BSF fear upright

% 2 BSF fear inverse

% 4 HSF fear upright

% 8 HSF fear inverse

% 16 LSF fear upright

% 32 LSF fear inverse

% 3 BSF neutral upright

% 5 BSF neutral inverse

% 6 HSF neutral upright

% 7 HSF neutral inverse

% 9 LSF neutral upright

% 10 LSF neutral inverse

% 11 target

%% setting%%

cfgMain=[];

cfgMain.eventvalue=[1 2 3 4 8 16 32];%BSF fear upright, fear inverse, neutral upright, HSF fear upright, HSF fear inverse..

cfgMain.sFnameOut='output_file.fif';%書き出しファイル名

cfgMain.sFnameDelete='temp.fif';%temporaryに使うファイル。最後に消すので消したらいけないファイルとかぶらないよう注意

cfgMain.prestim=0.2;%トリガー前の区間(s):実際に必要な区間に少し余裕を持たせましょう

cfgMain.poststim=0.5;%トリガー後の区間(s):上に同じ

%% file name list:先にmaxfilterをかけとくのが吉

strFname(1).name='input_file1.fif';

strFname(2).name='input_file2.fif';

strFname(3).name='input_file3.fif';

strFname(4).name='input_file4.fif';

strFname(5).name='input_file5.fif';

strFname(6).name='input_file6.fif';

strFname(7).name='input_file7.fif';

strFname(8).name='input_file8.fif';

strFname(9).name='input_file9.fif';

strFname(10).name='input_file10.fif';

strFname(11).name='input_file11.fif';

strFname(12).name='input_file12.fif';

%% script start %%%%%

%% configuration: define trials: fieldtrip

cfgFaceTempMain.trialdef.prestim=cfgMain.prestim;

cfgFaceTempMain.trialdef.poststim=cfgMain.poststim;

cfgFaceTempMain.trialdef.eventvalue=cfgMain.eventvalue;%BSF fear upright

cfgFaceTempMain.trialdef.eventtype='STI101';

cfgFaceTempMain.channel={'MEG','STI101'};%あまり意味はない.

%% configuration: ft_definetrial

ft_defaults;

strFT=[];

strMNE=[];

for ii=1:length(strFname)

strFT(ii).cfgFace=cfgFaceTempMain;

strFT(ii).cfgFace.dataset=strFname(ii).name;

strFT(ii).cfgFace=ft_definetrial(strFT(ii).cfgFace);

% fiff_read_raw_segment用

strMNE(ii).hdr=fiff_setup_read_raw(strFname(ii).name);

end

%% fiff読み書き:mneのtoolがメイン

sFnameOut=cfgMain.sFnameOut;

sFnameTemp=cfgMain.sFnameDelete;%てきとー.後で削除するので.

%% ファイル読み込み

vecSize=[];

for ii=1:length(strFname)

% mneの関数での処理

% 読み込み

[matDataIn vecTimes]=fiff_read_raw_segment(strMNE(ii).hdr);

% 書き出しのindexの情報を集める

matSampleInfo=strFT(ii).cfgFace.trl;%各エポックのindexが含まれる

vecIdxSegment=[];

for jj=1:size(matSampleInfo,1)

%vecIdxSegment=[vecIdxSegment,matSampleInfo(jj,1):matSampleInfo(jj,2)];

strMNE(ii).data(jj).seg=matDataIn(:,matSampleInfo(jj,1):matSampleInfo(jj,2));

end

%strMNE(ii).data=matDataIn(:,vecIdxSegment);%書き込むデータ

%vecSize(ii)=size(strMNE(ii).data,2);

end

%% header情報修正

strWriteInfo=strMNE(1).hdr.info;

%% 書き込み

[fid cals]=fiff_start_writing_raw(sFnameOut,strWriteInfo);%calsが謎

for ii=1:length(strFname)

% calsだけ使う

% 余談:calsとstrMNE(ii).hdr.calsは値が違う

[fidTemp cals]=fiff_start_writing_raw(sFnameTemp,strMNE(ii).hdr.info);

fiff_finish_writing_raw(fidTemp);

% 書き出し

for jj=1:size(strMNE(ii).data,2)

fiff_write_raw_buffer(fid,strMNE(ii).data(jj).seg,cals);

end

end

% 書き込み終了

fiff_finish_writing_raw(fid);

delete(sFnameTemp);% temporaryに作ったファイルを削除