SPMの結果から、自動で各座標の解剖学的名称を抽出するスクリプト

SPMの結果から領域名を抽出するのに苦労している方は多いと思います。
SPM12からは、GUIを用いて簡単に同定することはできるようになりましたが、
(この方法を知りたい方は、こちらの記事を参照してください)
それでも何十箇所もある場合、マウスで一つ一つ確認するのは骨が折れます。

先日、SPMのMLで、Guillaume Flandinがこのようなメールを流していたことに気づきました。

From within SPM, you can query the Neuromorphometrics atlas given a list
of coordinates:

XYZmm = [
0.5619 -9.1031 -4.7629
1.0137 -24.1197 9.3815
-44.0259 -22.1028 8.9601]’;

for i=1:size(XYZmm,2)
spm_atlas(‘query’,’neuromorphometrics’,XYZmm(:,i))
end

ans =

‘3rd Ventricle’
‘CSF’
‘Left Cerebral White Matter’

任意の座標を指定するならば、SPMに搭載されているNeuromorphometricsのアトラスを用いて、spm_atlasで領域名を求められるよと教えてくれています。

それならば、「SPMの結果から自動で得られるスクリプトを作りたい!」と思いました。

以下のようなCSVが自動で入手できたら嬉しいと思ったわけです。

とりあえずスクリプトだけ欲しい人は一番下までスクロールしてください。

少し勉強したい方は以下を読んでみてください。

例として、以下にあげるような3つの領域の座標を自動で求めたいと思います。

SPMで結果を表示した際、その座標がどこに保存されているかを調べてみたところ、

TabDat

という構造体の中の TabDat.dat に入っていました。

TabDat.dat

ans =

  3×12 の cell 配列

  1 列から 6 列

    {[1.2686e-09]}    {[       1]}    {[1.2686e-09]}    {[4.2618e-09]}    {[     443]}    {[8.6977e-11]}
    {0×0 double  }    {0×0 double}    {0×0 double  }    {0×0 double  }    {0×0 double}    {0×0 double  }
    {0×0 double  }    {0×0 double}    {0×0 double  }    {0×0 double  }    {0×0 double}    {0×0 double  }

  7 列から 12 列

    {[0.0209]}    {[0.0847]}    {[5.0788]}    {[4.9589]}    {[3.5453e-07]}    {3×1 double}
    {[0.0447]}    {[0.0877]}    {[4.8931]}    {[4.7851]}    {[8.5450e-07]}    {3×1 double}
    {[0.0953]}    {[0.1015]}    {[4.6963]}    {[4.6001]}    {[2.1109e-06]}    {3×1 double}

ここに3行12列のセルがあります。3行は、今、求めたい座標の3行です。12列は、SPMの結果の表が12列になっています。座標は第12列に入っているということです。

12列目だけ表示してみます。

TabDat.dat(:,12)

ans =

  3×1 の cell 配列

    {3×1 double}
    {3×1 double}
    {3×1 double}

こうなりますが、cell2matというコマンドをいれるとデータが見えてきます。

 A=TabDat.dat(:,12);
 B=cell2mat(A)

B =

    54
   -15
    18
    39
    33
     6
    30
    21
     3

今、Bは3つの座標が縦に並んでしまいました。
これだと使い勝手が悪いので、Aを転置させてみます。

B=cell2mat(A')

B =

    54    39    30
   -15    33    21
    18     6     3

今度は、座標らしくなりました。今、この座標は、(54, -15, 18) (39, 33, 6) (30, 21, 3) が縦に並んでいることに注意してください。縦ベクトルの集合です。

spm_atlasは、SPMである座標の解剖学的名称を得たい時に使用します。まさに今回のような目的に使用するわけですね。
使い方は、

spm_atlas(‘query’,’アトラス名’,座標の縦ベクトル)

となっています。

で、この際、座標の行列は縦ベクトルでなければいけません。なので、先程の形式は非常に都合がよいことになります。

早速、(54 -15 18)の名称を調べてみましょう。
このベクトルは、B(:,1)で表すことができます。

spm_atlas('query','Neuromorphometrics',B(:,1))

ans =

    'Right CO central operculum'

求められました。

それでは一気に求めたいと思います。Forループを使えばできます。
今、Bの列数は size(B,2)で求められます。

なので、以下のようになります。

for i=1:size(B,2)
    spm_atlas('query','Neuromorphometrics',B(:,i))
end

ans =
    'Right CO central operculum'

ans =
    'Right Cerebral White Matter'

ans =
    'Right Cerebral White Matter'

求められました!

これをベースに、以下のスクリプトを作成してみました。
SPMで結果を表示した後に、get_names.m を実行すれば、region_names_タイムスタンプ.csv というCSVファイルが作成されます。

%%%% get_names.m
%%%% A script to obtain region names from the SPM result
%%%% K. Nemoto 06 Sep 2019

% mni coordinates are stored the 12th column of TabDat.dat
mmXYZ = cell2mat(TabDat.dat(:,12)');

% enter region names in a cell
region = {};
for i = 1:size(mmXYZ,2)
    region{i,1} = spm_atlas('query','neuromorphometrics',mmXYZ(:,i));
end

% convert the cell which includes region name to a table
region_T = cell2table(region);

% generate a table with coordinates
coord=mmXYZ';
x = coord(:,1);
y = coord(:,2);
z = coord(:,3);
coord_T = table(x,y,z);

% combine tables
T = [coord_T region_T];

% generate a filename
timestamp = datestr(now,'yyyy-mm-dd');
fname = ['region_name_' timestamp '.csv'];

% write CSV files
writetable(T,fname)

関心のある方は、こちらのリンクからどうぞ。(右クリックしてリンク先を保存で保存してください)

便利さという点では、かなり便利なスクリプトになったのではないかと思います。

Print Friendly, PDF & Email

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください