% Extract the Seed Time Courses
SeedSeries = [];
MaskROIName=[];
for iROI=1:length(ROIDef)
IsDefinedROITimeCourse =0;
if strcmpi(int2str(size(ROIDef{iROI})),int2str([nDim1, nDim2, nDim3])) %ROI Data
MaskROI = ROIDef{iROI};
MaskROIName{iROI} = sprintf('Mask Matrix definition %d',iROI);
elseif size(ROIDef{iROI},1) == nDimTimePoints %Seed series %strcmpi(int2str(size(ROIDef{iROI})),int2str([nDimTimePoints, 1])) %Seed series
SeedSeries{1,iROI} = ROIDef{iROI};
IsDefinedROITimeCourse =1;
MaskROIName{iROI} = sprintf('Seed Series definition %d',iROI);
elseif strcmpi(int2str(size(ROIDef{iROI})),int2str([1, 4])) %Sphere ROI definition: CenterX, CenterY, CenterZ, Radius
MaskROI = y_Sphere(ROIDef{iROI}(1:3), ROIDef{iROI}(4), Header);
MaskROIName{iROI} = sprintf('Sphere definition (CenterX, CenterY, CenterZ, Radius): %g %g %g %g.',ROIDef{iROI});
elseif exist(ROIDef{iROI},'file')==2 % Make sure the Definition file exist
[pathstr, name, ext] = fileparts(ROIDef{iROI});
if strcmpi(ext, '.txt'),
TextSeries = load(ROIDef{iROI});
if IsMultipleLabel == 1
for iElement=1:size(TextSeries,2)
MaskROILabel{1,iROI}{iElement,1} = ['Column ',num2str(iElement)];
end
SeedSeries{1,iROI} = TextSeries;
else
SeedSeries{1,iROI} = mean(TextSeries,2);
end
IsDefinedROITimeCourse =1;
MaskROIName{iROI} = ROIDef{iROI};
elseif strcmpi(ext, '.img') || strcmpi(ext, '.nii') || strcmpi(ext, '.gz')
%The ROI definition is a mask file
MaskROI=y_ReadRPI(ROIDef{iROI});
if ~strcmpi(int2str(size(MaskROI)),int2str([nDim1, nDim2, nDim3]))
error(sprintf('\n\tMask does not match.\n\tMask size is %dx%dx%d, not same with required size %dx%dx%d',size(MaskROI), [nDim1, nDim2, nDim3]));
end
MaskROIName{iROI} = ROIDef{iROI};
else
error(sprintf('Wrong ROI file type, please check: \n%s', ROIDef{iROI}));
end
else
error(sprintf('File doesn''t exist or wrong ROI definition, please check: %s.\n', ROIDef{iROI}));
end
if ~IsDefinedROITimeCourse
% Speed up! YAN Chao-Gan 101010.
MaskROI=reshape(MaskROI,1,[]);
MaskROI=MaskROI(MaskIndex); %Apply the brain mask
if IsMultipleLabel == 1
Element = unique(MaskROI);
Element(find(isnan(Element))) = []; % ignore background if encoded as nan. Suggested by Dr. Martin Dyrba
Element(find(Element==0)) = []; % This is the background 0
SeedSeries_MultipleLabel = zeros(nDimTimePoints,length(Element));
for iElement=1:length(Element)
SeedSeries_MultipleLabel(:,iElement) = mean(AllVolume(:,find(MaskROI==Element(iElement))),2);
MaskROILabel{1,iROI}{iElement,1} = num2str(Element(iElement));
end
SeedSeries{1,iROI} = SeedSeries_MultipleLabel;
else
SeedSeries{1,iROI} = mean(AllVolume(:,find(MaskROI)),2);
end
end
end
%Merge the seed series cell into seed series matrix
SeedSeries = double(cell2mat(SeedSeries)); %Suggested by H. Baetschmann. % SeedSeries = cell2mat(SeedSeries);
%Save the ROI averaged time course to disk for further study
[pathstr, name, ext] = fileparts(OutputName);
save([fullfile(pathstr,['ROI_', name]), '.mat'], 'SeedSeries')
save([fullfile(pathstr,['ROI_', name]), '.txt'], 'SeedSeries', '-ASCII', '-DOUBLE','-TABS')
%Write the order key file as .tsv
fid = fopen([fullfile(pathstr,['ROI_OrderKey_', name]), '.tsv'],'w');
if IsMultipleLabel == 1
if size(MaskROILabel,2) < length(ROIDef) %YAN Chao-Gan, 131124. To avoid if the labels of the last ROI has been defined.
MaskROILabel{1,length(ROIDef)} = []; % Force the undefined cells to empty
end
fprintf(fid,'Order\tLabel in Mask\tROI Definition\n');
iOrder = 1;
for iROI=1:length(ROIDef)
if isempty(MaskROILabel{1,iROI})
fprintf(fid,'%d\t\t%s\n',iOrder,MaskROIName{iROI});
iOrder = iOrder + 1;
else
for iElement=1:length(MaskROILabel{1,iROI})
fprintf(fid,'%d\t%s\t%s\n',iOrder,MaskROILabel{1,iROI}{iElement,1},MaskROIName{iROI});
iOrder = iOrder + 1;
end
end
end
else
fprintf(fid,'Order\tROI Definition\n');
for iROI=1:length(ROIDef)
fprintf(fid,'%d\t%s\n',iROI,MaskROIName{iROI});
end
end
fclose(fid);
% FC calculation
AllVolume = AllVolume-repmat(mean(AllVolume),size(AllVolume,1),1);
AllVolumeSTD= squeeze(std(AllVolume, 0, 1));
AllVolumeSTD(find(AllVolumeSTD==0))=inf;
SeedSeries=SeedSeries-repmat(mean(SeedSeries),size(SeedSeries,1),1);
SeedSeriesSTD=squeeze(std(SeedSeries,0,1));
Header.pinfo = [1;0;0];
Header.dt =[16,0];
for iROI=1:size(SeedSeries,2)
FC=SeedSeries(:,iROI)'*AllVolume/(nDimTimePoints-1);
FC=(FC./AllVolumeSTD)/SeedSeriesSTD(iROI);
FCBrain=zeros(size(MaskDataOneDim));
FCBrain(1,MaskIndex)=FC;
FCBrain=reshape(FCBrain,nDim1, nDim2, nDim3);
%Also produce the results after Fisher's r to z transformation
zFCBrain = (0.5 * log((1 + FCBrain)./(1 - FCBrain))) .* (MaskData~=0);
[pathstr, name, ext] = fileparts(OutputName);
if size(SeedSeries, 2)>1
%Save every maps from result maps
y_Write(FCBrain,Header,[fullfile(pathstr,['ROI',num2str(iROI),name, ext])]);
y_Write(zFCBrain,Header,[fullfile(pathstr,['zROI',num2str(iROI),name, ext])]);
elseif size(SeedSeries, 2)==1,
%Save one map
y_Write(FCBrain,Header,[fullfile(pathstr,[name, ext])]);
y_Write(zFCBrain,Header,[fullfile(pathstr,['z',name, ext])]);
end
end
theElapsedTime = cputime - theElapsedTime;
fprintf('\n\t Calculating Functional Connectivity by Seed based Correlation Anlyasis finished, elapsed time: %g seconds.\n', theElapsedTime);
如何提取核磁共振成像BOLD-fMRI信号,以及计算功能连接矩阵?
最新推荐文章于 2024-07-19 16:06:30 发布
本文详细介绍了如何使用MATLAB进行BOLD-fMRI信号的提取,并探讨了计算功能连接矩阵的方法,涵盖了从数据预处理到分析的全过程。
摘要由CSDN通过智能技术生成