d2_taskPLS_recognition_erf_trace.m 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. clear all; cla; clc;
  2. currentFile = mfilename('fullpath');
  3. [pathstr,~,~] = fileparts(currentFile);
  4. cd(fullfile(pathstr,'..'))
  5. rootpath = pwd;
  6. pn.data_eeg = fullfile(rootpath, '..', 'eegmp_preproc', 'data', 'outputs', 'eeg');
  7. pn.data_erp = fullfile(rootpath, 'data', 'erp');
  8. pn.data_erf = fullfile(rootpath, 'data', 'erf');
  9. pn.data = fullfile(rootpath, 'data', 'stats'); mkdir(pn.data);
  10. pn.tools = fullfile(rootpath, 'tools');
  11. addpath(fullfile(rootpath, '..', 'eegmp_preproc', 'tools', 'fieldtrip')); ft_defaults
  12. addpath(genpath(fullfile(pn.tools, '[MEG]PLS', 'MEGPLS_PIPELINE_v2.02b')))
  13. addpath(fullfile(pn.tools, 'BrewerMap'));
  14. addpath(fullfile(pn.tools, 'shadedErrorBar'));
  15. pn.figures = fullfile(rootpath, 'figures');
  16. %% add seed for reproducibility
  17. rng(0, 'twister');
  18. %% load erp
  19. for ind_id = 1:33
  20. id = sprintf('sub-%03d', ind_id); disp(id)
  21. load(fullfile(pn.data_erf, [id,'_erf.mat']));
  22. for ind_option = 1:numel(conds.behavior)
  23. if ind_id == 1
  24. erpgroup.behavior.(conds.behavior{ind_option}) = erf.behavior{ind_option};
  25. erpgroup.behavior.(conds.behavior{ind_option}) = ...
  26. rmfield(erpgroup.behavior.(conds.behavior{ind_option}), {'powspctrm'});
  27. erpgroup.behavior.(conds.behavior{ind_option}).dimord = 'sub_chan_freq_time';
  28. freq = erpgroup.behavior.(conds.behavior{ind_option}).freq;
  29. end
  30. idx_freq_t = freq >2 & freq <7;
  31. thetagroup.behavior.(conds.behavior{ind_option}).avg(ind_id,:,:,:) = squeeze(nanmean(erf.behavior{ind_option}.powspctrm(:,idx_freq_t,:),2));
  32. idx_freq_a = freq >8 & freq <25;
  33. alphagroup.behavior.(conds.behavior{ind_option}).avg(ind_id,:,:,:) = squeeze(nanmean(erf.behavior{ind_option}.powspctrm(:,idx_freq_a,:),2));
  34. end
  35. end
  36. time = erpgroup.behavior.hit.time;
  37. channels = erpgroup.behavior.hit.label;
  38. %% get max. channels
  39. load(fullfile(pn.data, 'd2_taskpls_erf.mat'),...
  40. 'stat', 'result', 'lvdat', 'lv_evt_list', 'num_chans', 'num_freqs', 'num_time')
  41. plotData.powspctrm = squeeze(nanmean(nanmean(stat.mask(:,stat.freq>8 & stat.freq<25,stat.time>1 & stat.time<2).*...
  42. stat.prob(:,stat.freq>8 & stat.freq<25,stat.time>1 & stat.time<2),3),2));
  43. [~, alphaChanMin] = sort(plotData.powspctrm, 'ascend');
  44. % plotData.powspctrm = squeeze(nanmean(nanmean(stat.mask(:,stat.freq>2 &stat.freq<7,stat.time>1 & stat.time<2).*...
  45. % stat.prob(:,stat.freq>2 & stat.freq<7,stat.time>1 & stat.time<2),3),2));
  46. % [~, thetaChan] = sort(plotData.powspctrm, 'descend');
  47. %
  48. plotData.powspctrm = squeeze(nanmean(nanmean(stat.mask(:,stat.freq>8 & stat.freq<25,stat.time>0.5 & stat.time<1).*...
  49. stat.prob(:,stat.freq>8 & stat.freq<25,stat.time>0.5 & stat.time<1),3),2));
  50. [~, alphaChanMax] = sort(plotData.powspctrm, 'descend');
  51. %% visualize for frontal theta
  52. mergeddata = cat(4, thetagroup.behavior.hit.avg, thetagroup.behavior.miss.avg);
  53. %figure; imagesc(squeeze(nanmean(thetagroup.old.new.avg-thetagroup.old.old.avg,1)))
  54. idx_chans = [38, 47];% thetaChan(1:3); channels(idx_chans) %[33,38,47];
  55. condAvg = squeeze(nanmean(nanmean(mergeddata(:,idx_chans,:,1:2),2),4));
  56. h = figure('units','centimeters','position',[0 0 10 8]);
  57. cla; hold on;
  58. % new value = old value ? subject average + grand average
  59. curData = squeeze(nanmean(mergeddata(:,idx_chans,:,1),2));
  60. curData = curData-condAvg+repmat(nanmean(condAvg,1),size(condAvg,1),1);
  61. standError = nanstd(curData,1)./sqrt(size(curData,1));
  62. l1 = shadedErrorBar(time,nanmean(curData,1),standError, 'lineprops', ...
  63. {'color', 'k','linewidth', 2}, 'patchSaturation', .1);
  64. curData = squeeze(nanmean(mergeddata(:,idx_chans,:,2),2));
  65. curData = curData-condAvg+repmat(nanmean(condAvg,1),size(condAvg,1),1);
  66. standError = nanstd(curData,1)./sqrt(size(curData,1));
  67. l2 = shadedErrorBar(time,nanmean(curData,1),standError, 'lineprops', ...
  68. {'color', 'r','linewidth', 2}, 'patchSaturation', .1);
  69. xlabel('Time (s) from stim onset')
  70. legend([l1.mainLine, l2.mainLine],{'hit', 'miss'}, ...
  71. 'location', 'southeast'); legend('boxoff')
  72. xlim([-.5 1.50]); %ylim(YLim)
  73. ylabel({'theta power';'(log10)'});
  74. xlabel({'Time (s)'});
  75. set(findall(gcf,'-property','FontSize'),'FontSize',12)
  76. figureName = ['d2_erf_theta_trace'];
  77. saveas(h, fullfile(pn.figures, figureName), 'epsc');
  78. saveas(h, fullfile(pn.figures, figureName), 'png');
  79. %% visualize for posterior alpha
  80. mergeddata = cat(4, alphagroup.behavior.hit.avg, alphagroup.behavior.miss.avg);
  81. idx_chans = alphaChanMin(1:6); channels(idx_chans) %[33,38,47];
  82. condAvg = squeeze(nanmean(nanmean(mergeddata(:,idx_chans,:,1:2),2),4));
  83. h = figure('units','centimeters','position',[0 0 10 8]);
  84. cla; hold on;
  85. % new value = old value ? subject average + grand average
  86. curData = squeeze(nanmean(mergeddata(:,idx_chans,:,1),2));
  87. curData = curData-condAvg+repmat(nanmean(condAvg,1),size(condAvg,1),1);
  88. standError = nanstd(curData,1)./sqrt(size(curData,1));
  89. l1 = shadedErrorBar(time,nanmean(curData,1),standError, 'lineprops', ...
  90. {'color', 'k','linewidth', 3}, 'patchSaturation', .1);
  91. curData = squeeze(nanmean(mergeddata(:,idx_chans,:,2),2));
  92. curData = curData-condAvg+repmat(nanmean(condAvg,1),size(condAvg,1),1);
  93. standError = nanstd(curData,1)./sqrt(size(curData,1));
  94. l2 = shadedErrorBar(time,nanmean(curData,1),standError, 'lineprops', ...
  95. {'color', 'r','linewidth', 3}, 'patchSaturation', .1);
  96. xlabel('Time (s) from stim onset')
  97. legend([l1.mainLine, l2.mainLine],{'hit', 'miss'}, ...
  98. 'location', 'north'); legend('boxoff')
  99. xlim([-.5 1.75]);
  100. ylabel({'alpha power';'(log10)'});
  101. xlabel({'Time (s)'});
  102. set(findall(gcf,'-property','FontSize'),'FontSize',15)
  103. figureName = ['d2_erf_latealpha_trace'];
  104. saveas(h, fullfile(pn.figures, figureName), 'epsc');
  105. saveas(h, fullfile(pn.figures, figureName), 'png');
  106. %% visualize for central alpha
  107. mergeddata = cat(4, alphagroup.behavior.hit.avg, alphagroup.behavior.miss.avg);
  108. idx_chans = alphaChanMax(1:3); channels(idx_chans) %[20,21,12];
  109. condAvg = squeeze(nanmean(nanmean(mergeddata(:,idx_chans,:,1:2),2),4));
  110. h = figure('units','centimeters','position',[0 0 10 8]);
  111. cla; hold on;
  112. % new value = old value ? subject average + grand average
  113. curData = squeeze(nanmean(mergeddata(:,idx_chans,:,1),2));
  114. curData = curData-condAvg+repmat(nanmean(condAvg,1),size(condAvg,1),1);
  115. standError = nanstd(curData,1)./sqrt(size(curData,1));
  116. l1 = shadedErrorBar(time,nanmean(curData,1),standError, 'lineprops', ...
  117. {'color', 'k','linewidth', 3}, 'patchSaturation', .1);
  118. curData = squeeze(nanmean(mergeddata(:,idx_chans,:,2),2));
  119. curData = curData-condAvg+repmat(nanmean(condAvg,1),size(condAvg,1),1);
  120. standError = nanstd(curData,1)./sqrt(size(curData,1));
  121. l2 = shadedErrorBar(time,nanmean(curData,1),standError, 'lineprops', ...
  122. {'color', 'r','linewidth', 3}, 'patchSaturation', .1);
  123. xlabel('Time (s) from stim onset')
  124. legend([l1.mainLine, l2.mainLine],{'hit', 'miss'}, ...
  125. 'location', 'northeast'); legend('boxoff')
  126. xlim([-.5 1.75]);
  127. ylabel({'alpha power';'(log10)'});
  128. xlabel({'Time (s)'});
  129. set(findall(gcf,'-property','FontSize'),'FontSize',15)
  130. figureName = ['d2_erf_earlyalpha_trace'];
  131. saveas(h, fullfile(pn.figures, figureName), 'epsc');
  132. saveas(h, fullfile(pn.figures, figureName), 'png');