為了簡(jiǎn)化程序開發(fā),還是要站在巨人的肩膀上书斜,所以我又開始讀Gretna的源碼了诬辈,今天讀的是Gretna預(yù)處理的第二個(gè)步驟——Remove First Images
。顧名思義荐吉,這個(gè)步驟就是移除掉fMRI圖像中經(jīng)常遇到的偽影焙糟,在Grenta中,這個(gè)功能被封裝在gretna_RUN_RmFstImg.m
文件中样屠,其源碼如下:
function gretna_RUN_RmFstImg(InputFile, DelImg)
%-------------------------------------------------------------------------%
% Run Remove First Images
% Input:
% InputFile - The input file list, Nx1 cell (1x1 cell for 4D NIfTI)
% DelImg - The number of time points should be removed
%-------------------------------------------------------------------------%
% Written by Sandy Wang (sandywang.rest@gmail.com) 20161013.
% Copyright (C) 2013-2016
% State Key Laboratory of Cognitive Neuroscience and Learning &
% IDG/McGovern Institute of Brain Research,
% Beijing Normal University,
% Beijing, PR China.
OutputFile=cellfun(@(f) gretna_FUN_GetOutputFile(f, 'n'), InputFile,...
'UniformOutput', false);
if numel(InputFile)==1 %4D
Nii=nifti(InputFile{1});
TP=size(Nii.dat, 4);
InputCell=arrayfun(@(t) sprintf('%s,%d', InputFile{1}, t),...
(1:TP)', 'UniformOutput', false);
InputCell=InputCell(DelImg+1:end, 1);
else %3D
InputCell=InputFile;
InputCell=InputCell(DelImg+1:end, 1);
end
V_in=spm_vol(InputCell);
V_out=gretna_FUN_GetOutputStruct(V_in, OutputFile);
cellfun(@(in, out) WriteByVolume(in, out), V_in, V_out);
function WriteByVolume(in, out)
Y=spm_read_vols(in);
spm_write_vol(out, Y);
在這段代碼的最開始穿撮,首先用grentna_FUN_GetOutputFile
函數(shù),來獲取輸出的文件名稱痪欲。
之后悦穿,判斷輸入的文件是否為4D的nifti數(shù)據(jù)。如果是的話业踢,則將這段文件進(jìn)行一個(gè)讀取和截?cái)嗬跗猓⒈4娴絀nputCell變量中;如果不是知举,則直接進(jìn)行截?cái)嗨猜伲⑹褂?code>WrtieByVolume進(jìn)行文件的寫入操作,只不過這個(gè)寫入過程使用了cellfun
函數(shù)雇锡,因此不難想見的是如果原來該位置中存在一個(gè)已經(jīng)寫好的文件逛钻,則此舉必然會(huì)造成數(shù)據(jù)寫入發(fā)生錯(cuò)誤(例如第一次截?cái)嗟臅r(shí)候,去除了前10幅圖像锰提,經(jīng)過查看后覺得前10幅圖像并不滿足要求曙痘,需要去除前20幅,則在不執(zhí)行刪除操作的情況下再次執(zhí)行該函數(shù)時(shí)立肘,會(huì)進(jìn)行文件的重復(fù)寫入边坤,最終結(jié)果就是得到的仍然是去除了前10圖像的數(shù)據(jù))。
這不知道算不算個(gè)小Bug谅年。也許在使用界面操作的時(shí)候惩嘉,gretna會(huì)有其他的處理,但是單獨(dú)調(diào)用該函數(shù)時(shí)則可能會(huì)發(fā)生錯(cuò)誤L吖省N睦琛惹苗!