为了简化程序开发,还是要站在巨人的肩膀上,所以我又开始读Gretna的源码了,今天读的是Gretna预处理的第二个步骤——Remove First Images
。顾名思义,这个步骤就是移除掉fMRI图像中经常遇到的伪影,在Grenta中,这个功能被封装在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
函数,来获取输出的文件名称。
之后,判断输入的文件是否为4D的nifti数据。如果是的话,则将这段文件进行一个读取和截断,并保存到InputCell变量中;如果不是,则直接进行截断,并使用WrtieByVolume
进行文件的写入操作,只不过这个写入过程使用了cellfun
函数,因此不难想见的是如果原来该位置中存在一个已经写好的文件,则此举必然会造成数据写入发生错误(例如第一次截断的时候,去除了前10幅图像,经过查看后觉得前10幅图像并不满足要求,需要去除前20幅,则在不执行删除操作的情况下再次执行该函数时,会进行文件的重复写入,最终结果就是得到的仍然是去除了前10图像的数据)。
这不知道算不算个小Bug。也许在使用界面操作的时候,gretna会有其他的处理,但是单独调用该函数时则可能会发生错误!!!
网友评论