Gretna源码解读

为了简化程序开发,还是要站在巨人的肩膀上,所以我又开始读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 ([email protected]) 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会有其他的处理,但是单独调用该函数时则可能会发生错误!!!

版权声明:
作者:玉兰
链接:https://www.techfm.club/p/79419.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>