runCBI.m 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. % Define parameters
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. parent_path = "G:\Projects\CBIrep_Imaging\subjects";
  5. AUC = 10:20; % area under the curve for
  6. cut = 1; % remove motion contaminated volumes
  7. want2plot = 1; % visualize raw data? (plot=1)
  8. GSR = 1; % perform global signal regression (yes=1)
  9. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  10. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  11. %% Setup
  12. cd (parent_path)
  13. addpath("..\scripts\toolbox\DVARS-master\")
  14. addpath("..\scripts\toolbox\DVARS-master\Nifti_Util\")
  15. addpath("..\scripts\toolbox\BCT\")
  16. addpath("..\scripts\toolbox\spm12")
  17. addpath("..\scripts\toolbox\fMRI-Quality-Checker-master")
  18. addpath("..\scripts\toolbox\spm12\matlabbatch")
  19. addpath("..\scripts\toolbox\nifti_utils-master\")
  20. addpath("..\scripts\toolbox\FSLNets\")
  21. addpath("..\scripts\")
  22. addpath("D:\Labor\Analysis\fmri\nifti_utils-master\nifti_utils-master\external\NIFTI")
  23. px = dir('sub*');
  24. cd ..\
  25. subjects = readtable('subject_list.xlsx');
  26. participants = readtable('participants.csv');
  27. part = cell2mat(table2cell(participants(:,"subject")));
  28. master = cell(size(subjects,1),6);
  29. for k = 1:size(subjects,1)
  30. ix = subjects(k,"ID");
  31. ix = table2array(ix);
  32. ix = char(ix);
  33. ix = ix(5:end);
  34. master{k,1}= char(table2array(subjects(k,"ID")));
  35. master{k,2} = char(table2array(subjects(k,"Time")));
  36. master{k,3}= char(table2array(participants(part==str2double(ix),"condition")));
  37. end
  38. groups = unique(participants.condition);
  39. mNet_raw = zeros(size(subjects,1),98,98);
  40. mNet_tr = zeros(size(subjects,1),98,98);
  41. quali_stat = cell(size(subjects,1),9);
  42. quali_tag = ["ID";"Time";"tSNR";"SNR";"mean DVARS";...
  43. "bad volumes (%)";"mean FD";"max FD";"GNI"];
  44. %% Run through data
  45. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  46. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  47. % level of subjects
  48. for i = 41:size(subjects,1)
  49. %%
  50. cd (parent_path)
  51. subjx = table2array(subjects(i,"ID"));
  52. tmx = table2array(subjects(i,"Time"));
  53. quali_stat{i,1} = char(subjx);
  54. quali_stat{i,2} = char(tmx);
  55. cd (char(subjx))
  56. cd (char(tmx))
  57. % grab images
  58. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  59. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  60. % a) get structural
  61. cd (fullfile(parent_path,subjx,tmx,"anat/"))
  62. struct_orig = dir("*.1.nii.gz");
  63. struct_name = struct_orig(length(struct_orig)).name;
  64. struct_fullfile = fullfile(struct_orig(length(struct_orig)).folder,struct_orig(length(struct_orig)).name);
  65. % b) get fMRI
  66. cd (fullfile(parent_path,subjx,tmx,"func/"))
  67. fmri_orig = dir("*.1.nii.gz");
  68. fmri_name = fmri_orig(length(fmri_orig)).name;
  69. fMRI_fullfile = fullfile(fmri_orig(length(fmri_orig)).folder,fmri_orig(length(fmri_orig)).name);
  70. % func_file = gunzip(fMRI_fullfile);
  71. % func_spm = spm_vol(char(func_file));
  72. % func_4Dimg = niftiread(func_file);
  73. %get func mask
  74. % fmri_mask = dir("*AnnoSplit_rsfMRI*");
  75. %
  76. % spm_image('Display', char(func_file))
  77. % c) get Regression File
  78. cd (fullfile(parent_path,subjx,tmx,"func/"))
  79. cd regr\
  80. SFRGR_orig = dir("*_SFRGR.nii.gz");
  81. TCfile = dir("MasksTCsSplit*.txt.mat");
  82. fmri_mask = dir("*thres_mask.nii.gz");
  83. SFRGR_file = char(fullfile(SFRGR_orig.folder,SFRGR_orig.name));
  84. % fmri_mask = dir("mask.nii.gz");
  85. mask = load_untouch_nii(fullfile(fmri_mask.folder,fmri_mask.name));
  86. mask_img = mask.img;
  87. % mask_img = flip(mask_img,1);
  88. % mask_img = flip(mask_img,3);
  89. mask_img(mask_img>0) = 1;
  90. % % % Global signal regression
  91. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  92. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  93. RestData = gunzip(fullfile(SFRGR_orig.folder,SFRGR_orig.name));
  94. WB_mask = gunzip(fullfile(fmri_mask.folder,fmri_mask.name));
  95. GNI = Rest2GNI(char(RestData),char(WB_mask),100);
  96. quali_stat{i,9} = num2str(GNI);
  97. SFRGR = load_untouch_nii(SFRGR_file);
  98. SFRGR_img = SFRGR.img;
  99. % % % SNR (spatial, temporal)
  100. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  101. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  102. info = niftiinfo(fMRI_fullfile);
  103. V1 = load_untouch_nii(fMRI_fullfile);
  104. V2 = V1.img;
  105. [Ni, Nj, Nk, Nt] = size(V2);
  106. func_2Dimg = reshape(V2, Ni*Nj*Nk, Nt);
  107. [Nv, Nt] = size(func_2Dimg);
  108. func_mean = mean(func_2Dimg, 2,'omitnan');
  109. func_mean3D = reshape(func_mean, Ni, Nj, Nk);
  110. func_stddev = std(double(func_2Dimg), 0, 2,'omitnan');
  111. func_stddev3D = reshape(func_stddev, Ni, Nj, Nk);
  112. tSNR_2Dimg = mean(func_2Dimg, 2,'omitnan')./std(double(func_2Dimg), 0, 2,'omitnan');
  113. tSNR_3Dimg = reshape(tSNR_2Dimg, Ni, Nj, Nk);
  114. mask_img_flip = flip(mask_img,1);
  115. mask_img_flip = flip(mask_img_flip,3);
  116. tSNR = squeeze(mean2(tSNR_3Dimg(mask_img_flip==1)));
  117. SNR = squeeze(mean(func_mean3D(mask_img_flip==1)))/std(func_stddev3D(mask_img_flip==0));
  118. cd ..\
  119. niftiwrite(tSNR_image,strcat(fmri_name(1:end-10),'tSNR.nii'))
  120. quali_stat{i,3} = num2str(tSNR);
  121. quali_stat{i,4} = num2str(SNR);
  122. SFRGR_img(mask_img==0)=nan;
  123. GSR_signal = squeeze(mean(mean(mean(SFRGR_img,3,'omitnan'),2,'omitnan'),1,'omitnan'));
  124. % get DVARS
  125. X0 = size(V2,1); Y0 = size(V2,2); Z0 = size(V2,3); T0 = size(V2,4);
  126. I0 = prod([X0,Y0,Z0]);
  127. Y = reshape(V2,[I0,T0]); clear V2 V1;
  128. [DVARS,DVARS_Stat]=DVARSCalc(Y,'scale',1/100,'TransPower',1/3,'RDVARS','verbose',1);
  129. [V,DSE_Stat]=DSEvars(Y,'scale',1/100);
  130. dvars_points = DVARS_Stat.pvals;
  131. bad_points = find(dvars_points(5:end)<0.001);
  132. quali_stat{i,5} = squeeze(mean(DVARS));
  133. if isempty(bad_points)
  134. badTP = 0;
  135. quali_stat{i,6} = 0;
  136. else
  137. badTP = bad_points-4;
  138. quali_stat{i,6} = badTP/(info.ImageSize(4)-5);
  139. end
  140. scratch = zeros(1,4*length(bad_points));
  141. for ptx = 1:length(bad_points)
  142. scratch(((ptx-1)*4+1):((ptx-1)*4+4)) = bad_points(ptx)-2:bad_points(ptx)+1;
  143. end
  144. scratch = unique(scratch(scratch>0));
  145. scratch(scratch>info.ImageSize(4)-5) = [];
  146. % getFD
  147. cd (fullfile(parent_path,subjx,tmx,"func/"))
  148. if exist("txtRegrPython","dir")
  149. cd txtRegrPython\
  150. txtRegr_files = dir("*mcf*");
  151. if size(txtRegr_files,1)>1
  152. txtRegr = txtRegr_files(floor(length(txtRegr_files)/2)).name;
  153. txtRegr_table = readtable(txtRegr);
  154. if ~isempty(txtRegr_table)
  155. Regression_parameters = txtRegr_table(:,5:10);
  156. MP = cell2mat(table2cell(Regression_parameters));
  157. FD_measures = calculateFD(MP, .5, 0.5);
  158. FD = FD_measures.FD;
  159. else
  160. FD = [];
  161. disp('Dataset has no available regression file')
  162. end
  163. else
  164. FD = [];
  165. disp('Dataset has no available regression file')
  166. end
  167. else
  168. FD = [];
  169. disp('Dataset has no available regression file')
  170. end
  171. if ~isempty(FD)
  172. quali_stat{i,7} = num2str(squeeze(mean(FD)));
  173. quali_stat{i,8} = num2str(max(FD));
  174. end
  175. %%
  176. if ~isempty(TCfile)
  177. [mNet,mNet_Trim,SW,CC,CPL] = rsfmri_metrics(TCfile,GSR_signal,AUC,cut,scratch,want2plot,GSR);
  178. saveas(gcf,strcat(fmri_name(1:end-10),'mNET.png'))
  179. pause(2)
  180. mNet_raw(i,:,:) = mNet;
  181. mNet_tr (i,:,:) = mNet_Trim;
  182. master{i,4} = num2str(SW);
  183. master{i,5} = num2str(CC);
  184. master{i,6} = num2str(CPL);
  185. end
  186. %%
  187. % plot parameters
  188. if want2plot==1
  189. figure('units','normalized','outerposition',[0 0 1 1])
  190. subplot(231)
  191. histogram(tSNR_3Dimg(mask_img_flip==1),'Normalization','probability');
  192. xlabel('tSNR')
  193. title(strrep(strcat('mean tSNR =_',num2str(tSNR)),'_',' '))
  194. subplot(232)
  195. p = plot(DVARS(5:end));
  196. xlim([0 length(DVARS)-4])
  197. ylim([0 1])
  198. hold on
  199. p1 = plot(get(gca,'xlim'),[squeeze(mean(DVARS)) squeeze(mean(DVARS))],'r-');
  200. hold off
  201. ylabel('DVARS')
  202. xlabel('Timepoints')
  203. title(strrep(strcat('mean DVARS =_',num2str(squeeze(mean(DVARS)))),'_',' '))
  204. subplot(233)
  205. h = histogram(FD,'BinEdges',0:0.01:0.5);
  206. ylabel('number of timepoints')
  207. xlabel('framewise displacemen (mm)')
  208. title(strrep(strcat('max. FD =_',num2str(max(FD)),'_mm'),'_',' '))
  209. for ki=1:3
  210. subplot(2,3,3+ki)
  211. ix = [5 8 11];
  212. imagesc(imrotate(tSNR_3Dimg(:,:,ix(ki)),-90))
  213. M = mask_img_flip(:,:,ix(ki));
  214. % M = flip(flip(mask_img(:,:,20-ix(ki)),3),1);
  215. % M = mask_img(:,:,ix(ki));
  216. hold on
  217. visboundaries(imrotate(M,-90),'Color','b');
  218. colormap('hot')
  219. end
  220. cd (fullfile(parent_path,subjx,tmx,"func/"))
  221. saveas(gcf,strcat(fmri_name(1:end-10),'quality.png'))
  222. end
  223. %%
  224. pause(2)
  225. %%
  226. disp(strrep(strcat('Analysis of ID_',char(subjx),'_timepoint_',char(tmx),'_complete'),'_',' '))
  227. disp(strrep(strcat('- tSNR:_',num2str(tSNR)),'_',' '))
  228. disp(strrep(strcat('- SNR:_',num2str(SNR)),'_',' '))
  229. disp(strrep(strcat('- mean DVARS:_',num2str(quali_stat{i,5})),'_',' '))
  230. disp(strrep(strcat('- mean FD:_',num2str(quali_stat{i,7})),'_',' '))
  231. %
  232. x = input('quality?');
  233. if ~isempty(x)
  234. x=1;
  235. else
  236. x=0;
  237. end
  238. qm_list{i,1}=char(subjx);
  239. qm_list{i,2}=char(tmx);
  240. qm_list{i,3}=num2str(x)
  241. close all
  242. end
  243. head_master = ["ID","Time","group","SW","CC","CPL"];
  244. T = cell2table(master);
  245. T.Properties.VariableNames = head_master;
  246. Q = cell2table(quali_stat);
  247. Q.Properties.VariableNames = quali_tag;
  248. cd (parent_path)
  249. cd ..
  250. cd analysis\
  251. writetable(T,char(strrep(strcat('CBI_graph_',date,'.xlsx'),'-','_')));
  252. % save(char(strrep(strcat('CBI_rawNet_',date,'.m'),'-','_')),mNet_raw);
  253. % save(char(strrep(strcat('CBI_trimNet_',date,'.m'),'-','_')),mNet_tr);
  254. %%
  255. data_set = master(cellfun(@(x) ~isempty(x),master(:,3)),1:3);
  256. group = unique(data_set(:,3));
  257. timepoints = unique(data_set(:,2));
  258. [X,Y,On] = grid_communities(M);
  259. %%
  260. C = cell2mat(quali_stat(:,5));
  261. QM = cell2mat(quali_stat(:,3));
  262. for gx = 1:length(group)
  263. figure('units','normalized','outerposition',[0 0 1 1])
  264. for tx = 1:length(timepoints)
  265. subNet = mNet_raw(...
  266. strcmp(master(:,3), char(group(gx))) ...
  267. & strcmp(master(:,2),char(timepoints(tx))) ...
  268. & C < 0.5 ...
  269. & QM > 0.25 ...
  270. ,:,:);
  271. subNet(subNet==0) = nan;
  272. group_subNet(:,:,tx,gx) = squeeze(mean(subNet,1,'omitnan'));
  273. delta_subNet(:,:,tx,gx) = squeeze(group_subNet(:,:,tx,gx)) - squeeze(group_subNet(:,:,1,gx));
  274. subplot(2,length(timepoints),tx)
  275. plotmat_values_rsfMRI(group_subNet(On,On,tx,gx),[],[-1 1],0,[]);
  276. hold on
  277. axis square;
  278. plot(X,Y,'k','linewidth',2)
  279. title(strrep(strcat('mNet_',group(gx),'_',timepoints(tx)),'_',' '));
  280. subplot(2,length(timepoints),tx+length(timepoints))
  281. plotmat_values_rsfMRI(delta_subNet(On,On,tx,gx),[],[-.5 .5],0,[]);
  282. hold on
  283. axis square;
  284. plot(X,Y,'k','linewidth',2)
  285. title(strrep(strcat('mNet_',group(gx),'_',timepoints(tx)),'_',' '));
  286. end
  287. end
  288. for gx = 1:length(group)
  289. figure('units','normalized','outerposition',[0 0 1 1])
  290. d2_subNet(:,:,:,gx) = delta_subNet(:,:,:,gx) - delta_subNet(:,:,:,4);
  291. for tx = 1:3
  292. subplot(1,length(timepoints),tx)
  293. plotmat_values_rsfMRI(d2_subNet(On,On,tx,gx),[],[-.5 .5],0,[]);
  294. hold on
  295. axis square;
  296. plot(X,Y,'k','linewidth',2)
  297. title(strrep(strcat('mNet_',group(gx),'_',timepoints(tx)),'_',' '));
  298. end
  299. end
  300. %%
  301. for gx = 1:length(group)
  302. % figure('units','normalized','outerposition',[0 0 1 1])
  303. for tx = 1:length(timepoints)
  304. mnx = master(...
  305. strcmp(master(:,3), char(group(gx))) ...
  306. & strcmp(master(:,2),char(timepoints(tx))) ...
  307. & C<0.5...
  308. ,5);
  309. mnx(find(cellfun(@isempty,mnx)))=[];
  310. group_parameter(1:length(mnx),tx,gx) = cellfun(@(mnx)str2double(mnx), mnx);
  311. end
  312. end
  313. group_parameter (group_parameter==0)=nan;
  314. mean_group = squeeze(mean(group_parameter,1,'omitnan'))
  315. for dx = 1:length(group)
  316. for tx = 1:length(timepoints)
  317. delta_group (tx,dx) = (mean_group(tx,dx)-mean_group(1,dx))...
  318. - (mean_group(tx,4)-mean_group(1,4));
  319. end
  320. end
  321. delta_group
  322. %%
  323. plotmat_values_rsfMRI(mNet_demean(:,:),[],[-1 1],0,[]);