*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に作ったファイルを削除