Neuromagのphantomでいろいろ計算

Neuromagのphantomを使ってGOFを計算してみます。

Contents

Sarvas式の作成

functionからreturnまでの%を削除してreturnまでをコピーしてhns_Sarvas2.mという名前で保存してください。 qは[x,y,z,qx,qy,qz]の電流双極子です。 SはNs個×[x,y,z,zx,zy,zz]のセンサー位置と単位ベクトル化した法線方向です。 pは[x,y,z]にある仮想球の中心座標です。

% function Bz=hns_Sarvas2(q,S,p)
% % Sarvas' rule
% % q = 1x [x,y,z,qx,qy,qz]      current dipole
% % S = Ns x [x,y,z,zx,zy,zz] sensor position & direction
% % p = [x,y,z]               sphere centroid
% % written by Akia Hashzume
% Ns=size(S,1);
% R=S(:,1:3)-ones(Ns,1)*p;
% R0=ones(Ns,1)*(q(1:3)-p);
% A=R-R0;
%
% r =sqrt(sum(R.^2,2));
% a =sqrt(sum(A.^2,2));
% ar=sum(A.*R,2);
% F=(a.*(r.*a+ar))*ones(1,3);
% n=a+2*r+ar./a;
% nn=(a.^2)./r+a+n;
% n=n*ones(1,3);
% nn=nn*ones(1,3);
% nablaF=nn.*R-n.*R0;
% Q=ones(Ns,1)*q(4:6);
%
% QR0=[Q(:,2).*R0(:,3)-Q(:,3).*R0(:,2),...
%      Q(:,3).*R0(:,1)-Q(:,1).*R0(:,3),...
%      Q(:,1).*R0(:,2)-Q(:,2).*R0(:,1)];
% QR0R=sum(QR0.*R,2)*ones(1,3);
% B=QR0-(QR0R.*nablaF)./F;
% B=B./F*(1e-7)*(1e+15);% fT
% Bz=S(:,4).*B(:,1)+S(:,5).*B(:,2)+S(:,6).*B(:,3);
% return;

データの読み込み

ファイルを http://meg.aalip.jp/matlab/data/dipole1.mat から入手し,作業ディレクトリに保存してください。 F.dipoleは19.9795msの時、頭座標上の仮想球中心[0,0,0]とし、 Xfitで単一電流双極子で推定した結果です。 F.dipole(:,1)は全センサーを、 F.dipole(:,2)は平面型グラジオメーターのみを、 F.dipole(:,3)はマグネトメーターのみを使って推定した結果です。 F.vv_gra,F.vv_mag,F.vv_loutは波形やトポグラフィを描くときのセンサーの二次元座標です。 graは平面型グラジオメーターのみのとき、magはマグネトメーターのみのとき、loutは全306chのときです。

load dipole1.mat;
meg=F.ave_0001(:,1:306);
time=F.ave_0001(:,end);
SSP=eye(306);
for n=1:10 % SSPの計算
    EigenVector=eval(sprintf('F.PCA_%04.0f',n));
    SSP=SSP-EigenVector*EigenVector';
end;
megSSP=meg*SSP;
mag=3:3:306;
gra=setdiff(1:306,mag);
figure('color',[1,1,1]);
subplot(221);plot(time,meg(:,gra),'b');axis tight;title('gradiometer');
subplot(222);plot(time,meg(:,mag),'g');axis tight;title('magnetometer');
subplot(223);plot(time,megSSP(:,gra),'b');axis tight;title('gradiometer + SSP');
subplot(224);plot(time,megSSP(:,mag),'g');axis tight;title('magnetometer + SSP');

センサー座標と法線方向の計算

% まずセンサー座標から頭座標へ変換
MTX=F.MEG2HEAD(:,1:3);
MT0=F.MEG2HEAD(:,4);
Ch=MTX*F.ChInform(1:3,1:306)+MT0*ones(1,306);
X=MTX*F.ChInform(4:6,1:306);
Y=MTX*F.ChInform(7:9,1:306);
Z=MTX*F.ChInform(10:12,1:306);

% gradiometer
Sp1=[Ch(:,gra)+0.0084*X(:,gra)+0.0003*Z(:,gra);Z(:,gra)]';
Sp2=[Ch(:,gra)-0.0084*X(:,gra)+0.0003*Z(:,gra);Z(:,gra)]';
% magnetometer
Sm1=[Ch(:,mag)+0.0129*X(:,mag)+0.0129*Y(:,mag)+0.0003*Z(:,mag);Z(:,mag)]';
Sm2=[Ch(:,mag)+0.0129*X(:,mag)-0.0129*Y(:,mag)+0.0003*Z(:,mag);Z(:,mag)]';
Sm3=[Ch(:,mag)-0.0129*X(:,mag)+0.0129*Y(:,mag)+0.0003*Z(:,mag);Z(:,mag)]';
Sm4=[Ch(:,mag)-0.0129*X(:,mag)-0.0129*Y(:,mag)+0.0003*Z(:,mag);Z(:,mag)]';

磁場の計算

青が実測値、緑が計算値です。 magnetometerのGOFはよくありません。 SSP使わないほうが、GOFはいいみたいです・・・

q=[F.dipole(3:5,2);F.dipole(7:9,2)*1e-9]';p=[0,0,0];
Bp=1/1.68*(hns_Sarvas2(q,Sp1,p)-hns_Sarvas2(q,Sp2,p));
q=[F.dipole(3:5,3);F.dipole(7:9,3)*1e-9]';p=[0,0,0];
Bm=1/4*(hns_Sarvas2(q,Sm1,p)+hns_Sarvas2(q,Sm2,p)+hns_Sarvas2(q,Sm3,p)+hns_Sarvas2(q,Sm4,p));
[dummy,t]=min(abs(time-F.dipole(1)));
grach=1:204;magch=1:102;
figure('color',[1,1,1]);

BP=meg(t,gra)';    gof=1-(BP-Bp)'*(BP-Bp)/(BP'*BP);
BPs=megSSP(t,gra)';gofs=1-(BPs-Bp)'*(BPs-Bp)/(BPs'*BPs);

subplot(221);
plot(grach,[BP,Bp]');axis tight;
title(sprintf('GRA GOF %0.2f',gof*100));
subplot(222);
plot(grach,[BPs,Bp]');axis tight;
title(sprintf('GRA+SSP GOF %0.2f',gofs*100));

BM=meg(t,mag)';    gof=1-(BM-Bm)'*(BM-Bm)/(BM'*BM);
BMs=megSSP(t,mag)';gofs=1-(BMs-Bm)'*(BMs-Bm)/(BMs'*BMs);

subplot(223);
plot(magch,[BM,Bm]');axis tight;
title(sprintf('MAG GOF %0.2f',gof*100));
subplot(224);
plot(magch,[BMs,Bm]');axis tight;
title(sprintf('MAG+SSP GOF %0.2f',gofs*100));

topography化

P=F.vv_mag(:,2:3);seg=100;
[X,Y]=meshgrid(linspace(min(P(:,1)),max(P(:,1)),seg),linspace(min(P(:,2)),max(P(:,2)),seg));

figure('color',[1,1,1]);
for n=1:6
    subplot(2,3,n);
    switch n
        case 1;B=sqrt(BP(1:2:end).^2+(BP(2:2:end).^2));k=0;
        case 2;B=sqrt(BPs(1:2:end).^2+(BPs(2:2:end).^2));k=0;
        case 3;B=sqrt(Bp(1:2:end).^2+(Bp(2:2:end).^2));k=0;
        case 4;B=BM;k=-1;
        case 5;B=BMs;k=-1;
        case 6;B=Bm;k=-1;
    end;
    Z=griddata(P(:,1),P(:,2),B,X,Y);
    surf(Z);set(gca,'clim',[k,1]*max(abs(B)));
    axis tight;axis off;view([0,90]);
    colorbar;
    switch n
        case 1;title('GRA measured');
        case 2;title('GRA+SSP measured');
        case 3;title('GRA simulated');
        case 4;title('MAG measured');
        case 5;title('MAG+SSP meadured');
        case 6;title('MAG simulated');
    end;
end;
set(findobj('type','surface'),'linestyle','none');