recon-all-status.log

recon-all-status.logは$SUBJECT/scriptsの中にあります。 recon-allは全部で65のステップからなり、その各ステップの終了時刻が表示されています。 各ステップでどれだけかかったかを見る関数Mファイルを作成しました。

Contents

関数Mファイル FreeSurferTime

functionから 最後のreturnまでの%を削除してFreeSurferTime.mという名前で保存してください。 出力は処理ステップ・時刻・処理時間からなるセル形式です。

% function R=FreeSurferTime(loadname)
% addpath(pwd);
% R=[];
% if nargin==0
%     [filename,pathname]=uigetfile('recon-all-status*');
%     if filename==0;return;end;
%     cd(pathname);
%     loadname=[pathname,filename];
% end;
% fid=fopen(loadname,'rb');
% R=fread(fid,'*char');
% fclose(fid);
% R1=R';
% x=strfind(R1,char(10));% 改行
% clear R;
% R{1}=R1(1:x(1));
% for n=2:length(x) % うまくいけば67行 2回Talairachすると69行
%     xx=(x(n-1)+1):x(n);
%     R{n-1}=R1(xx);% 1行目はstatus file for recon-all
% end;
% R1=R;
% clear R;
% d=24*60*60;
% N=length(R1);
% nn=1;
% for n=1:N
%     st=R1{n};
%     if ~isempty(strfind(st,'Linux'));continue;end;
%     if length(st)<3;continue;end;
%     [str,t]=FreeSurferStepTime(st);
%     R{nn,1}=str;
%     R{nn,2}=t;
%     if nn>1
%         R{nn-1,3}=(datenum(t)-datenum(t0))*d;
%     end;
%     t0=t;
%     nn=nn+1;
% end;
% R{nn-1,3}=(datenum(t)-datenum(R{1,2}))*d;
% % fileparts(loadname) % 複数のファイルを読むときの確認用
% return;

FreeSurferTimeの実行

実際にrecon-all-status.logを読み込んでみました。但しセル形式だと見づらいので以下のようなコマンドを実行しています。

R=FreeSurferTime(filename);% filenameはディレクトリ/recon-all-status.logです。
for n=1:size(R,1);RR{n}=[sprintf('step %d ',n),R{n,1},sprintf(' %0.0f sec',R{n,3})];end;
RR'
ans = 

    'step 1 create 001.org 2 sec'
    'step 2 MotionCor  8 sec'
    'step 3 Talairach  35 sec'
    'step 4 Talairach Failure Detection  1 sec'
    'step 5 Nu Intensity Correction  72 sec'
    'step 6 Intensity Normalization  108 sec'
    'step 7 Skull Stripping  979 sec'
    'step 8 EM Registration  1117 sec'
    'step 9 CA Normalize  81 sec'
    'step 10 CA Reg  12957 sec'
    'step 11 CA Reg Inv  45 sec'
    'step 12 Remove Neck  52 sec'
    'step 13 SkullLTA  1309 sec'
    'step 14 SubCort Seg  1112 sec'
    'step 15 Merge ASeg  0 sec'
    'step 16 Intensity Normalization2  186 sec'
    'step 17 Mask BFS  3 sec'
    'step 18 WM Segmentation  141 sec'
    'step 19 Fill  43 sec'
    'step 20 Tessellate lh  6 sec'
    'step 21 Smooth1 lh  4 sec'
    'step 22 Inflation1 lh  30 sec'
    'step 23 QSphere lh  226 sec'
    'step 24 Fix Topology lh  3470 sec'
    'step 25 Make White Surf lh  291 sec'
    'step 26 Smooth2 lh  4 sec'
    'step 27 Inflation2 lh  122 sec'
    'step 28 Curvature Stats lh  4 sec'
    'step 29 Sphere lh  3961 sec'
    'step 30 Surf Reg lh  1726 sec'
    'step 31 Jacobian white lh  2 sec'
    'step 32 AvgCurv lh  1 sec'
    'step 33 Cortical Parc lh  45 sec'
    'step 34 Make Pial Surf lh  608 sec'
    'step 35 Surf Volume lh  0 sec'
    'step 36 Parcellation Stats lh  16 sec'
    'step 37 Cortical Parc 2 lh  50 sec'
    'step 38 Parcellation Stats 2 lh  18 sec'
    'step 39 Tessellate rh  8 sec'
    'step 40 Smooth1 rh  4 sec'
    'step 41 Inflation1 rh  34 sec'
    'step 42 QSphere rh  236 sec'
    'step 43 Fix Topology rh  3149 sec'
    'step 44 Make White Surf rh  315 sec'
    'step 45 Smooth2 rh  4 sec'
    'step 46 Inflation2 rh  126 sec'
    'step 47 Curvature Stats rh  4 sec'
    'step 48 Sphere rh  4197 sec'
    'step 49 Surf Reg rh  1918 sec'
    'step 50 Jacobian white rh  2 sec'
    'step 51 AvgCurv rh  1 sec'
    'step 52 Cortical Parc rh  45 sec'
    'step 53 Make Pial Surf rh  597 sec'
    'step 54 Surf Volume rh  0 sec'
    'step 55 Parcellation Stats rh  16 sec'
    'step 56 Cortical Parc 2 rh  52 sec'
    'step 57 Parcellation Stats 2 rh  21 sec'
    'step 58 Cortical ribbon mask  961 sec'
    'step 59 ASeg Stats  496 sec'
    'step 60 AParc-to-ASeg  177 sec'
    'step 61 WMParc  872 sec'
    'step 62 BA Labels lh  103 sec'
    'step 63 BA Labels rh  106 sec'
    'step 64 Ex-vivo Entorhinal Cortex Label lh  12 sec'
    'step 65 Ex-vivo Entorhinal Cortex Label rh  12 sec'
    'step 66 total 42303 sec'

棒グラフ表示

66の処理過程の時間別帯グラフを表示してみます。 煩雑なので20分以上かかった処理だけ色付きにしてます。 健常脳でない場合、step 24のFix Topology lhとstep 43のFix Topology rhの処理時間が大幅に延長するようです。

 R1=cell2mat(R(:,3));
 if strcmp(R{3,1},R{5,1}) && strcmp(R{4,1},R{6,1})
     R1(3:4,:)=R1(3:4,:)+R1(5:6,:);
     R1=R1([1:4,7:end],1);
 end;
 R1=int32(R1);
 N=length(R1);
 if N==68 % talarachとtalairach failure detectionを2回することあり
     R1(2:3)=R1(2:3)+R1(4:5);
     R1(4:5)=[];
 end;
scale=60^2;
N=double(R1(1:65,:))/scale;
n=size(N,2);
figure('color',[1,1,1]);
if size(N,2)==1
    N(:,2)=0;% size(N,2)=1だと帯グラフになってくれない
end;
barh(N','stacked');
N(N<2/6)=0;N(N>0)=1;
N=sum(N,2);
map=jet(length(N));
x=find(N==0);
map(x,:)=ones(length(x),1)*[1,1,1]*0.9;colormap(map);
set(gca,'xgrid','on');
str=RR(find(N>0))';
text(4,2,str);