├── README.md ├── S1CreateIndividualROIs.m ├── S2ROISignalExtract.m ├── S2tLIofActivation.m ├── S2tWaveletDecompose.m ├── S3CommunityMatrix.m ├── S4ModularityMeasures.m ├── S5RandomCommunity.m └── S6NullModelMeasures.m /README.md: -------------------------------------------------------------------------------- 1 | # DynamicFunctionalConnectivity 2 | Codes for dynamic functional connectivity on task and resting fMRI for PNAS submission: 3 | 4 | "Disrupted dynamic network reconfiguration of the language system in temporal lobe epilepsy" 5 | 6 | Xiaosong He1, Danielle S Bassett2, Chaitanya Ganne1, Lauren Kozlowski1, Michael R Sperling1, and Joseph I Tracy1* 7 | 8 | 1Department of Neurology, Thomas Jefferson University, Philadelphia, PA, 19107 9 | 2Department of Bioengineering, University of Pennsylvania, Philadelphia, PA, 19104 10 | 11 | Note1: Codes for the "generalized Louvain" method used in the paper are available at: http://netwiki.amath.unc.edu/GenLouvain/GenLouvain 12 | 13 | Note2: Codes for dynamic network statistics are available at: http://commdetect.weebly.com/ 14 | -------------------------------------------------------------------------------- /S1CreateIndividualROIs.m: -------------------------------------------------------------------------------- 1 | % Create individual masks and convert to .mat format 2 | clear all; 3 | sbj=importdata('E:\VerbGeneration_network\sbj.txt'); 4 | ROI=importdata('E:\VerbGeneration_network\ROIs.txt'); 5 | for t=1:length(sbj) 6 | if exist(['E:\VerbGeneration_network\4IndividualROIs\' sbj{t} '\'],'dir')==7 7 | rmdir(['E:\VerbGeneration_network\4IndividualROIs\' sbj{t} '\'],'s'); 8 | mkdir(['E:\VerbGeneration_network\4IndividualROIs\' sbj{t} '\']); 9 | else 10 | mkdir(['E:\VerbGeneration_network\4IndividualROIs\' sbj{t} '\']); 11 | end 12 | clear V Y; 13 | V=spm_vol(['E:\VerbGeneration_network\3FirstLevelAnalysis\' sbj{t} '\spmT_0001.nii']); 14 | Y=spm_read_vols(V); 15 | for k=1:length(ROI) 16 | clear Vm Ym Yt s Thr vol; 17 | Vm=spm_vol(['E:\VerbGeneration_network\SelectedROIs\res_' ROI{k} '.img']); 18 | Ym=spm_read_vols(Vm); 19 | Yt=Y./Ym; 20 | Yt(Yt==-Inf)=Inf; 21 | s=sort(Yt(abs(Yt)0.05 & f<0.1),:))); 24 | clear wcoh f; 25 | end 26 | end 27 | At=round(At.*1000000)./1000000; 28 | A{i,1}=At; 29 | clear At; 30 | end 31 | 32 | % % Creating adjacency matrix over time: Window Size = 40 sec (27 windows, (4*i-3):(4*i+12))/30 sec (28 windows, (4*i-3):(4*i+8)); 33 | % % Step = 4 TR/10s; with matlab new wavelet coherence 34 | % SampRate=1/2.5; 35 | % for i=1:27 36 | % clear At; 37 | % for k=1:16 38 | % for kk=1:16 39 | % clear wcoh f; 40 | % [wcoh,~,f] = wcoherence(d((4*i-3):(4*i+12),k),d((4*i-3):(4*i+12),kk),SampRate); 41 | % At(k,kk)=mean(mean(wcoh(find(f>0.05 & f<0.1),:))); 42 | % clear wcoh f; 43 | % end 44 | % end 45 | % At=round(At.*1000000)./1000000; 46 | % A{i,1}=At; 47 | % clear At; 48 | % end 49 | 50 | for ii=1:100 % 100 times of optimization 51 | % Following based on Example on multilayer network quality function of Mucha et al. 2010 52 | % (using multilayer cell A with A{s} the adjacency matrix of layer s) 53 | clear N T B mm PP St; 54 | N=length(A{1}); 55 | T=length(A); 56 | [B,mm] = multiord(A,gamma,omega); 57 | PP = @(S) postprocess_ordinal_multilayer(S,T); 58 | [St,Q(ii),~] = iterated_genlouvain(B,10000,0,1,'moverandw',[], PP); % tobe saved (Q) 59 | St = reshape(St, N, T); 60 | Q(ii)=Q(ii)/mm; 61 | S(:,:,ii)=St';% tobe saved 62 | clear N T B mm PP St; 63 | end 64 | if exist(pathD,'file') 65 | delete(pathD); 66 | end 67 | save(pathD,'A','Q','S'); 68 | end 69 | -------------------------------------------------------------------------------- /S4ModularityMeasures.m: -------------------------------------------------------------------------------- 1 | % Calculating MA, Flexibility, LI, P, Z, FCw and FCb 2 | clear all; 3 | sbj=importdata('E:\VerbGeneration_network\sbj.txt'); 4 | System=[1;1;1;2;2;2;2;2;3;3;3;4;4;4;4;4];% Define System for LI and I, R calculation 5 | 6 | parfor t=1:length(sbj) 7 | X=load(['E:\VerbGeneration_network\6CommunityMatrix\' sbj{t} '.mat']); 8 | pathD=['E:\VerbGeneration_network\7ModularityMeasures\' sbj{t} '.mat']; 9 | ModularityMeasures(System,X.S,X.A,pathD); 10 | end 11 | 12 | function ModularityMeasures(System,SO,A,pathD) 13 | for ii=1:100 14 | MA(:,:,ii)=allegiance(SO(:,:,ii));% Module Allegiance 15 | F(ii,:)=flexibility(SO(:,:,ii));% Flexibility 16 | Prom(ii,:)=promiscuity(SO(:,:,ii));% Promiscuity 17 | I_s(ii,:)=integration(MA(:,:,ii),System);% Integration by System (L Broca, L Wernicke, R Broca, R Wernicke) 18 | R_s(ii,:)=recruitment(MA(:,:,ii),System);% Recruitment by System (L Broca, L Wernicke, R Broca, R Wernicke) 19 | RI(:,:,ii)=integration_sub(MA(:,:,ii),System);% RI by System (L Broca, L Wernicke, R Broca, R Wernicke) 20 | end 21 | 22 | save(pathD,'MA','F','Prom','I_s','R_s','RI'); 23 | end 24 | -------------------------------------------------------------------------------- /S5RandomCommunity.m: -------------------------------------------------------------------------------- 1 | % Generating Null Models 2 | 3 | clear all; 4 | sbj=importdata('E:\VerbGeneration_network\sbj.txt'); 5 | gamma = 1; omega = 0.4; % Based on Chai et al 2016 CC 6 | 7 | parfor t=1:length(sbj) 8 | X=load(['E:\VerbGeneration_network\5tDecomposedSignals\' sbj{t} '.mat'],'D2'); 9 | pathD=['E:\VerbGeneration_network\8RandomCommunity\' sbj{t} '.mat']; 10 | 11 | % Connectional Null Model 12 | ConnectionalNullModel(pathD,X.D2,gamma,omega); 13 | 14 | % Nodal Null Model 15 | NodalNullModel(pathD,X.D2,gamma,omega); 16 | 17 | % Static Null Model 18 | StaticNullModel(pathD,X.D2,gamma,omega); 19 | 20 | end 21 | 22 | % Connectional Null Model 23 | function ConnectionalNullModel(pathD,d,gamma,omega) 24 | % Creating adjacency matrix over time: Window Size = 40 sec (14 windows, 8=half-window)/30 sec (19 windows, 6=half-window)/1 min (9 windows, 12=half-window; 25 | % Overlapping = 50% with matlab new wavelet coherence 26 | SampRate=1/2.5; 27 | for i=1:14 28 | clear At; 29 | for k=1:16 30 | for kk=1:16 31 | clear wcoh f; 32 | [wcoh,~,f] = wcoherence(d(((i-1)*8+1):(i+1)*8,k),d(((i-1)*8+1):(i+1)*8,kk),SampRate); 33 | At(k,kk)=mean(mean(wcoh(find(f>0.05 & f<0.1),:))); 34 | clear wcoh f; 35 | end 36 | end 37 | At=round(At.*1000000)./1000000; 38 | A{i,1}=At; 39 | clear At; 40 | end 41 | for k=1:100 42 | clear Acr; 43 | for i=1:14 44 | Acr{i}=randmio_und(A{i},20); 45 | end 46 | for ii=1:100 % 100 times of optimization 47 | clear N T B mm PP St; 48 | N=length(Acr{1}); 49 | T=length(Acr); 50 | [B,mm] = multiord(Acr,gamma,omega); 51 | PP = @(S) postprocess_ordinal_multilayer(S,T); 52 | [St,Qcr(ii,k),~] = iterated_genlouvain(B,10000,0,1,'moverandw',[], PP); % tobe saved (Qtr) 53 | Qcr(ii,k)=Qcr(ii,k)/mm; 54 | St = reshape(St, N, T); 55 | Scr(:,:,ii,k)=St';% tobe saved Str 56 | clear N T B mm PP St; 57 | end 58 | clear Acr; 59 | end 60 | if exist(pathD,'file') 61 | delete(pathD); 62 | end 63 | save(pathD,'Qcr','Scr'); 64 | end 65 | 66 | % Nodal Null Model 67 | function NodalNullModel(pathD,d,gamma,omega) 68 | % Creating adjacency matrix over time: Window Size = 40 sec (14 windows, 8=half-window)/30 sec (19 windows, 6=half-window)/1 min (9 windows, 12=half-window; 69 | % Overlapping = 50% with matlab new wavelet coherence 70 | SampRate=1/2.5; 71 | % Creating 100 null models 72 | for k=1:100 73 | % Creating adjacency matrix over time, with ROIs rotated at each window 74 | clear Anr; 75 | for i=1:14 76 | clear At rd dt tt; 77 | rd=randperm(16); 78 | % [~,Inr(i,:,k)]=sort(rd);% tobe saved Inr 79 | for tt=1:16 80 | dt(:,tt)=d(:,rd(tt)); 81 | end 82 | % Coherence 83 | for kk=1:16 84 | for kkk=1:16 85 | clear wcoh f; 86 | [wcoh,~,f] = wcoherence(dt(((i-1)*8+1):(i+1)*8,kk),dt(((i-1)*8+1):(i+1)*8,kkk),SampRate); 87 | At(kk,kkk)=mean(mean(wcoh(find(f>0.05 & f<0.1),:))); 88 | clear wcoh f; 89 | end 90 | end 91 | At=round(At.*1000000)./1000000; 92 | Anr{i,1}=At; 93 | clear At rd dt tt; 94 | end 95 | for ii=1:100 % 100 times of optimization 96 | clear N T B mm PP St; 97 | N=length(Anr{1}); 98 | T=length(Anr); 99 | [B,mm] = multiord(Anr,gamma,omega); 100 | PP = @(S) postprocess_ordinal_multilayer(S,T); 101 | [St,Qnr(ii,k),~] = iterated_genlouvain(B,10000,0,1,'moverandw',[], PP); % tobe saved (Qnr) 102 | Qnr(ii,k)=Qnr(ii,k)/mm; 103 | St = reshape(St, N, T); 104 | Snr(:,:,ii,k)=St';% tobe saved Snr 105 | clear N T B mm PP St; 106 | end 107 | clear Anr; 108 | end 109 | save(pathD,'Qnr','Snr','-append');% 'Inr' 110 | end 111 | 112 | % Static Null Model 113 | function StaticNullModel(pathD,d,gamma,omega) 114 | % Creating adjacency matrix over time: Window Size = 40 sec (14 windows, 8=half-window)/30 sec (19 windows, 6=half-window)/1 min (9 windows, 12=half-window; 115 | % Overlapping = 50% with matlab new wavelet coherence 116 | SampRate=1/2.5; 117 | % Creating 100 null models 118 | for k=1:100 119 | % Creating adjacency matrix over time, by duplicating one of the windows 120 | clear At As; 121 | rd=randperm(14); 122 | % coherence 123 | for kk=1:16 124 | for kkk=1:16 125 | clear wcoh f; 126 | [wcoh,~,f] = wcoherence(d(((rd(1)-1)*8+1):(rd(1)+1)*8,kk),d(((rd(1)-1)*8+1):(rd(1)+1)*8,kkk),SampRate); 127 | At(kk,kkk)=mean(mean(wcoh(find(f>0.05 & f<0.1),:))); 128 | clear wcoh f; 129 | end 130 | end 131 | At=round(At.*1000000)./1000000; 132 | for i=1:14 133 | As{i,1}=At; 134 | end 135 | for ii=1:100 % 100 times of optimization 136 | % Following based on Example on multilayer network quality function of Mucha et al. 2010 137 | % (using multilayer cell A with A{s} the adjacency matrix of layer s) 138 | clear N T B mm PP St; 139 | N=length(As{1}); 140 | T=length(As); 141 | [B,mm] = multiord(As,gamma,omega); 142 | PP = @(S) postprocess_ordinal_multilayer(S,T); 143 | [St,Qs(ii,k),~] = iterated_genlouvain(B,10000,0,1,'moverandw',[], PP); % tobe saved (Qs) 144 | Qs(ii,k)=Qs(ii,k)/mm; 145 | St = reshape(St, N, T); 146 | Ss(:,:,ii,k)=St';% tobe saved Ss 147 | clear N T B mm PP St; 148 | end 149 | clear At As; 150 | end 151 | save(pathD,'Qs','Ss','-append'); 152 | end 153 | -------------------------------------------------------------------------------- /S6NullModelMeasures.m: -------------------------------------------------------------------------------- 1 | % Calculating Flexibility and MA 2 | clear all; 3 | sbj=importdata('E:\VerbGeneration_network\sbj.txt'); 4 | System=[1;1;1;2;2;2;2;2;3;3;3;4;4;4;4;4];% Define System for LI and I, R calculation 5 | 6 | parfor t=1:length(sbj) 7 | x=load(['E:\VerbGeneration_network\8RandomCommunity\' sbj{t} '.mat']); 8 | pathD=['E:\VerbGeneration_network\9NullModelMeasures\' sbj{t} '.mat']; 9 | % Generating Modularity Measures 10 | GenModalMeasure(C,System,x.Scr,x.Str,x.Snr,x.Ss,pathD); 11 | end 12 | 13 | % Generating Modularity Measures 14 | function GenModalMeasure(C,System,Scr,Str,Snr,Ss,pathD) 15 | for k=1:100 16 | clear SO MAt Ft Promt Perst I_ht I_st R_ht R_st; 17 | SO(:,:,:,1)=Scr(:,:,:,k); 18 | SO(:,:,:,2)=Snr(:,:,:,k); 19 | SO(:,:,:,3)=Ss(:,:,:,k); 20 | 21 | for ii=1:100 22 | for t=1:3 23 | MAt(:,:,ii,t)=allegiance(SO(:,:,ii,t));% Module Allegiance 24 | Ft(ii,:,t)=flexibility(SO(:,:,ii,t));% Flexibility 25 | Promt(ii,:,t)=promiscuity(SO(:,:,ii,t));% Promiscuity 26 | I_st(ii,:,t)=integration(MAt(:,:,ii),System);% Integration by System (L Broca, L Wernicke, R Broca, R Wernicke) 27 | R_st(ii,:,t)=recruitment(MAt(:,:,ii),System);% Recruitment by System (L Broca, L Wernicke, R Broca, R Wernicke) 28 | end 29 | end 30 | 31 | MAcr(:,:,:,k)=MAt(:,:,:,1);MAnr(:,:,:,k)=MAt(:,:,:,2);MAs(:,:,:,k)=MAt(:,:,:,3); 32 | Fcr(:,:,k)=Ft(:,:,1);Fnr(:,:,k)=Ft(:,:,2);Fs(:,:,k)=Ft(:,:,3); 33 | Promcr(:,:,k)=Promt(:,:,1);Promnr(:,:,k)=Promt(:,:,2);Proms(:,:,k)=Promt(:,:,3); 34 | I_scr(:,:,k)=I_st(:,:,1);I_snr(:,:,k)=I_st(:,:,2);I_ss(:,:,k)=I_st(:,:,3); 35 | R_scr(:,:,k)=R_st(:,:,1);R_snr(:,:,k)=R_st(:,:,2);R_ss(:,:,k)=R_st(:,:,3); 36 | 37 | clear SO MAt Ft Promt I_st R_st; 38 | end 39 | 40 | if exist(pathD,'file') 41 | delete(pathD); 42 | end 43 | 44 | save(pathD,'MAcr','MAnr','MAs','Fcr','Fnr','Fs','Promcr','Promnr','Proms','I_scr','I_snr','I_ss','R_hcr','R_hnr','R_hs','R_scr','R_snr','R_ss'); 45 | end 46 | --------------------------------------------------------------------------------