SACCADE_Analysis.m 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. %% SACCADE_Analysis.m
  2. EYE_DataFile = fullfile(fld.data,'EYE.mat');
  3. load(EYE_DataFile)
  4. %% Words meaning ----------------------------------------------------------
  5. %1-4 Homogenous Texture [noMS SOA1 SOA2 SOA3]
  6. %5-8 Figure position #1 [noMS SOA1 SOA2 SOA3]
  7. %9-12 Figure position #2 [noMS SOA1 SOA2 SOA3]
  8. %% Process the data -------------------------------------------------------
  9. wNoMs = [1 5 9]; wWithMS= [4 8 12];
  10. fixations.noMS.X = []; fixations.noMS.Y = [];
  11. fixations.withMS.X = []; fixations.withMS.Y = [];
  12. fixations.noMS.D = []; fixations.withMS.D = [];
  13. fixations.noMS.V = []; fixations.withMS.V = [];
  14. fixations.noMS.microsacc = []; fixations.withMS.microsacc = [];
  15. fixations.noMS.microsaccn = []; fixations.withMS.microsaccn = [];
  16. TANKS_DATA = NEW_PERFORMANCES.FEEDBACK.TANKS;
  17. for tank = 1:size(TANKS_DATA,2)
  18. performance = TANKS_DATA(tank).newPerformance;
  19. wordData = TANKS_DATA(tank).oldTrials(:,7);
  20. % ----- NO MICROSTIMULATION ------------
  21. indNoMS = ismember(wordData,wNoMs) & performance == 1;
  22. fixations.noMS.X = [fixations.noMS.X; ...
  23. nanmean(TANKS_DATA(tank).gazeXYCoords(indNoMS,1))];
  24. fixations.noMS.Y = [fixations.noMS.Y; ...
  25. nanmean(TANKS_DATA(tank).gazeXYCoords(indNoMS,2))];
  26. fixations.noMS.D = [fixations.noMS.D; ...
  27. nanmean(TANKS_DATA(tank).gazeAmplitude(indNoMS,1))];
  28. mEyeShift=[]; cEyeShift=[]; sdEyePos=[];
  29. sz_micsacc = []; num_microsacc = [];
  30. for tr=find(indNoMS==1)'
  31. ev = TANKS_DATA(tank).gazePos{tr};
  32. if ~isempty(ev)
  33. mEyeShift = [mEyeShift; ...
  34. nanmean(sqrt(diff(ev(:,1)).^2 + diff(ev(:,2)).^2))];
  35. cEyeShift = [cEyeShift; ...
  36. sum(sqrt(diff(ev(:,1)).^2 + diff(ev(:,2)).^2))];
  37. sdEyePos = [sdEyePos; std(ev(:,1)) std(ev(:,2)) tank tr];
  38. % get microsaccades
  39. micsacc = micsaccdeg([zeros(length(ev),1) ev], Sampf);
  40. n_micsacc = size(micsacc,1);
  41. if ~isempty(micsacc)
  42. sz_micsacc = [sz_micsacc; ...
  43. micsacc(:,4) tank*ones(size(micsacc,1),1) ...
  44. tr*ones(size(micsacc,1),1)...
  45. ];
  46. num_microsacc=[num_microsacc; n_micsacc];
  47. else
  48. num_microsacc=[num_microsacc; 0];
  49. end
  50. end
  51. end
  52. fixations.noMS.V = [fixations.noMS.V; mEyeShift cEyeShift sdEyePos];
  53. fixations.noMS.microsacc = [fixations.noMS.microsacc; sz_micsacc];
  54. fixations.noMS.microsaccn = [fixations.noMS.microsaccn; num_microsacc];
  55. % ----- WITH MICROSTIMULATION ------------
  56. indWithMS = ismember(wordData,wWithMS) & performance == 1;
  57. fixations.withMS.X = [fixations.withMS.X; ...
  58. nanmean(TANKS_DATA(tank).gazeXYCoords(indWithMS,1))];
  59. fixations.withMS.Y = [fixations.withMS.Y; ...
  60. nanmean(TANKS_DATA(tank).gazeXYCoords(indWithMS,2))];
  61. fixations.withMS.D = [fixations.withMS.D; ...
  62. nanmean(TANKS_DATA(tank).gazeAmplitude(indWithMS,1))];
  63. mEyeShift=[]; cEyeShift=[]; sdEyePos=[];
  64. sz_micsacc = []; num_microsacc = [];
  65. for tr=find(indWithMS==1)'
  66. ev = TANKS_DATA(tank).gazePos{tr};
  67. if ~isempty(ev)
  68. mEyeShift = [mEyeShift; ...
  69. nanmean(sqrt(diff(ev(:,1)).^2 + diff(ev(:,2)).^2))];
  70. cEyeShift = [cEyeShift; ...
  71. sum(sqrt(diff(ev(:,1)).^2 + diff(ev(:,2)).^2))];
  72. sdEyePos = [sdEyePos; ...
  73. std(ev(:,1)) std(ev(:,2)) tank tr];
  74. % get microsaccades
  75. micsacc = micsaccdeg([zeros(length(ev),1) ev], Sampf);
  76. n_micsacc = size(micsacc,1);
  77. if ~isempty(micsacc)
  78. sz_micsacc = [sz_micsacc; ...
  79. micsacc(:,4) tank*ones(size(micsacc,1),1) ...
  80. tr*ones(size(micsacc,1),1)...
  81. ];
  82. num_microsacc=[num_microsacc; n_micsacc];
  83. else
  84. num_microsacc=[num_microsacc; 0];
  85. end
  86. end
  87. end
  88. fixations.withMS.V = [fixations.withMS.V; mEyeShift cEyeShift sdEyePos];
  89. fixations.withMS.microsacc = [fixations.withMS.microsacc; sz_micsacc];
  90. fixations.withMS.microsaccn = [fixations.withMS.microsaccn; num_microsacc];
  91. end
  92. TANKS_DATA = NEW_PERFORMANCES.FEEDFORWARD.TANKS;
  93. for tank = 1:size(TANKS_DATA,2)
  94. performance = TANKS_DATA(tank).newPerformance;
  95. wordData = TANKS_DATA(tank).oldTrials(:,7);
  96. % ----- NO MICROSTIMULATION ------------
  97. indNoMS = ismember(wordData,wNoMs) & performance == 1;
  98. fixations.noMS.X = [fixations.noMS.X; ...
  99. nanmean(TANKS_DATA(tank).gazeXYCoords(indNoMS,1))];
  100. fixations.noMS.Y = [fixations.noMS.Y; ...
  101. nanmean(TANKS_DATA(tank).gazeXYCoords(indNoMS,2))];
  102. fixations.noMS.D = [fixations.noMS.D; ...
  103. nanmean(TANKS_DATA(tank).gazeAmplitude(indNoMS,1))];
  104. mEyeShift=[]; cEyeShift=[]; sdEyePos=[];
  105. sz_micsacc = []; num_microsacc = [];
  106. for tr=find(indNoMS==1)'
  107. ev = TANKS_DATA(tank).gazePos{tr};
  108. if ~isempty(ev)
  109. mEyeShift = [mEyeShift; ...
  110. nanmean(sqrt(diff(ev(:,1)).^2 + diff(ev(:,2)).^2))];
  111. cEyeShift = [cEyeShift; ...
  112. sum(sqrt(diff(ev(:,1)).^2 + diff(ev(:,2)).^2))];
  113. sdEyePos = [sdEyePos; std(ev(:,1)) std(ev(:,2)) tank tr];
  114. % get microsaccades
  115. micsacc = micsaccdeg([zeros(length(ev),1) ev], Sampf);
  116. n_micsacc = size(micsacc,1);
  117. if ~isempty(micsacc)
  118. sz_micsacc = [sz_micsacc; ...
  119. micsacc(:,4) tank*ones(size(micsacc,1),1) ...
  120. tr*ones(size(micsacc,1),1)...
  121. ];
  122. num_microsacc=[num_microsacc; n_micsacc];
  123. else
  124. num_microsacc=[num_microsacc; 0];
  125. end
  126. end
  127. end
  128. fixations.noMS.V = [fixations.noMS.V; mEyeShift cEyeShift sdEyePos];
  129. fixations.noMS.microsacc = [fixations.noMS.microsacc; sz_micsacc];
  130. fixations.noMS.microsaccn = [fixations.noMS.microsaccn; num_microsacc];
  131. % ----- WITH MICROSTIMULATION ------------
  132. indWithMS = ismember(wordData,wWithMS) & performance == 1;
  133. fixations.withMS.X = [fixations.withMS.X; ...
  134. nanmean(TANKS_DATA(tank).gazeXYCoords(indWithMS,1))];
  135. fixations.withMS.Y = [fixations.withMS.Y; ...
  136. nanmean(TANKS_DATA(tank).gazeXYCoords(indWithMS,2))];
  137. fixations.withMS.D = [fixations.withMS.D; ...
  138. nanmean(TANKS_DATA(tank).gazeAmplitude(indWithMS,1))];
  139. mEyeShift=[]; cEyeShift=[]; sdEyePos=[];
  140. sz_micsacc = []; num_microsacc = [];
  141. for tr=find(indWithMS==1)'
  142. ev = TANKS_DATA(tank).gazePos{tr};
  143. if ~isempty(ev)
  144. mEyeShift = [mEyeShift; ...
  145. nanmean(sqrt(diff(ev(:,1)).^2 + diff(ev(:,2)).^2))];
  146. cEyeShift = [cEyeShift; ...
  147. sum(sqrt(diff(ev(:,1)).^2 + diff(ev(:,2)).^2))];
  148. sdEyePos = [sdEyePos; std(ev(:,1)) std(ev(:,2)) tank tr];
  149. % get microsaccades
  150. micsacc = micsaccdeg([zeros(length(ev),1) ev], Sampf);
  151. n_micsacc = size(micsacc,1);
  152. if ~isempty(micsacc)
  153. sz_micsacc = [sz_micsacc; ...
  154. micsacc(:,4) tank*ones(size(micsacc,1),1) ...
  155. tr*ones(size(micsacc,1),1)...
  156. ];
  157. num_microsacc=[num_microsacc; n_micsacc];
  158. else
  159. num_microsacc=[num_microsacc; 0];
  160. end
  161. end
  162. end
  163. fixations.withMS.V = [fixations.withMS.V; mEyeShift cEyeShift sdEyePos];
  164. fixations.withMS.microsacc = [fixations.withMS.microsacc; sz_micsacc];
  165. fixations.withMS.microsaccn = [fixations.withMS.microsaccn; num_microsacc];
  166. end
  167. %% Plot fixations X distribution ------------------------------------------
  168. bins = [-0.3:0.01:0.3];
  169. [cNoMS,xNoMS] = hist(fixations.noMS.X,bins);fNoMS = cNoMS/sum(cNoMS);
  170. [cWithMS,xWithMS] = hist(fixations.withMS.X,bins);
  171. fWithMS = cWithMS/sum(cWithMS);
  172. figure(1);clf;
  173. subplot(2,2,1);hold all;
  174. set(gca,'FontSize',12)
  175. plot(xNoMS,fNoMS,'Color',[0.85 0.18 0.17])
  176. plot(xWithMS,fWithMS,'Color',[0.35 0.35 0.35])
  177. xlabel('Average Fixations X')
  178. ylabel('Frequency')
  179. legend({'noMS' 'withMS'})
  180. [cNoMS,xNoMS] = hist(fixations.noMS.Y,bins);fNoMS = cNoMS/sum(cNoMS);
  181. [cWithMS,xWithMS] = hist(fixations.withMS.Y,bins);
  182. fWithMS = cWithMS/sum(cWithMS);
  183. subplot(2,2,2);hold all;
  184. set(gca,'FontSize',12)
  185. plot(xNoMS,fNoMS,'Color',[0.85 0.18 0.17])
  186. plot(xWithMS,fWithMS,'Color',[0.35 0.35 0.35])
  187. xlabel('Average Fixations Y')
  188. legend({'noMS' 'withMS'})
  189. %% Plot one to one correspondance -----------------------------------------
  190. subplot(2,2,3)
  191. hold all;
  192. for ses = 1:length(fixations.noMS.X)
  193. plot([1 2],[fixations.noMS.X(ses) fixations.withMS.X(ses)],'-k')
  194. scatter(1,fixations.noMS.X(ses),15,[1 0 0])
  195. scatter(2,fixations.withMS.X(ses),15,[1 0 0])
  196. end
  197. xlim([0.7 2.3])
  198. set(gca,'XTick',[1 2])
  199. set(gca,'XTickLabel',{'noMS' 'witMS'})
  200. subplot(2,2,4)
  201. hold all;
  202. for ses = 1:length(fixations.noMS.Y)
  203. plot([1 2],[fixations.noMS.Y(ses) fixations.withMS.Y(ses)],'-k')
  204. scatter(1,fixations.noMS.Y(ses),15,[1 0 0])
  205. scatter(2,fixations.withMS.Y(ses),15,[1 0 0])
  206. end
  207. xlim([0.7 2.3])
  208. set(gca,'XTick',[1 2])
  209. set(gca,'XTickLabel',{'noMS' 'witMS'})
  210. %% Plot average amplitude -------------------------------------------------
  211. f=figure;
  212. subplot(1,4,1);hold on;
  213. errorbar([1 2],[nanmean(fixations.noMS.D) nanmean(fixations.withMS.D)],...
  214. [nanstd(fixations.noMS.D) nanstd(fixations.withMS.D)],'ks',...
  215. 'linestyle','none','linewidth',2,'markersize',12,'markerfacecolor','k');
  216. set(gca, 'xlim',[0 3],'ylim',[0 0.3],'xtick',1:2,'xticklabels',{'no MS','MS'})
  217. ylabel('Gaze amplitude');
  218. title('Mean +/- stdev')
  219. subplot(1,4,2:4);hold on;
  220. [y1,x1]=hist(fixations.noMS.D,100); y1b=y1/sum(y1);
  221. [y2,x2]=hist(fixations.withMS.D,100); y2b=y2/sum(y2);
  222. bar(x1,y1b,'r','Edgecolor','none','barwidth',1);
  223. bar(x2,-y2b,'k','Edgecolor','none','barwidth',1);
  224. xlabel('Gaze Amplitude')
  225. ylabel('Frequency')
  226. legend({'noMS' 'withMS'})
  227. title('Gaze amplitude distributions')
  228. %% stats on amplitude -----------------------------------------------------
  229. gazemat = [fixations.noMS.D;fixations.withMS.D];
  230. group = {[zeros(size(fixations.noMS.D)); ones(size(fixations.withMS.D))]};
  231. gn={'MS'};
  232. [P,T,STATS,TERMS]=anovan(gazemat,group)
  233. %% Plot average eyeshifts [averaged per trial] ----------------------------
  234. f2=figure;
  235. subplot(2,4,1);hold on;
  236. errorbar([1 2],[nanmean(fixations.noMS.V(:,1)) nanmean(fixations.withMS.V(:,1))],...
  237. [nanstd(fixations.noMS.V(:,1)) nanstd(fixations.withMS.V(:,1))],'ks',...
  238. 'linestyle','none','linewidth',2,'markersize',12,'markerfacecolor','k');
  239. set(gca,'xlim',[0 3],'ylim',[0 0.02],'xtick',1:2,'xticklabels',{'no MS','MS'})
  240. ylabel('Aver. Gaze Shift');
  241. title('Mean +/- stdev')
  242. subplot(2,4,2:4);hold on;
  243. [y1,x1]=hist(fixations.noMS.V(:,1),100); y1b=y1/sum(y1);
  244. [y2,x2]=hist(fixations.withMS.V(:,1),100); y2b=y2/sum(y2);
  245. bar(x1,y1b,'r','Edgecolor','none','barwidth',1);
  246. bar(x2,-y2b,'k','Edgecolor','none','barwidth',1);
  247. xlabel('Aver. Gaze Shifts')
  248. ylabel('Frequency')
  249. legend({'noMS' 'withMS'})
  250. title('Average gaze shift distributions')
  251. %% stats on amplitude -----------------------------------------------------
  252. gazemat = [fixations.noMS.V(:,1);fixations.withMS.V(:,1)];
  253. group = {[zeros(size(fixations.noMS.V(:,1))); ...
  254. ones(size(fixations.withMS.V(:,1)))]};
  255. gn={'MS'};
  256. [P,T,STATS,TERMS]=anovan(gazemat,group)
  257. %% Plot cumulative eyeshifts per trial ------------------------------------
  258. subplot(2,4,5);hold on;
  259. errorbar([1 2],[nanmean(fixations.noMS.V(:,2)) ...
  260. nanmean(fixations.withMS.V(:,2))],...
  261. [nanstd(fixations.noMS.V(:,2)) ...
  262. nanstd(fixations.withMS.V(:,2))],'ks',...
  263. 'linestyle','none','linewidth',2,'markersize',12,...
  264. 'markerfacecolor','k');
  265. set(gca,'xlim',[0 3],'ylim',[0 6],'xtick',1:2,'xticklabels',{'no MS','MS'})
  266. ylabel('Cum. Gaze shift');
  267. title('Mean +/- stdev')
  268. subplot(2,4,6:8);hold on;
  269. [y1,x1]=hist(fixations.noMS.V(:,2),100); y1b=y1/sum(y1);
  270. [y2,x2]=hist(fixations.withMS.V(:,2),100); y2b=y2/sum(y2);
  271. bar(x1,y1b,'r','Edgecolor','none','barwidth',1);
  272. bar(x2,-y2b,'k','Edgecolor','none','barwidth',1);
  273. xlabel('Cum. Gaze Shift')
  274. ylabel('Frequency')
  275. legend({'noMS' 'withMS'})
  276. title('Cumulative gaze shift distributions')
  277. %% stats on amplitude -----------------------------------------------------
  278. gazemat = [fixations.noMS.V(:,2);fixations.withMS.V(:,2)];
  279. group = {[zeros(size(fixations.noMS.V(:,2))); ...
  280. ones(size(fixations.withMS.V(:,2)))]};
  281. gn={'MS'};
  282. [P,T,STATS,TERMS]=anovan(gazemat,group)
  283. %% Plot microsaccades amplitudes and number per trial ---------------------
  284. figure;
  285. subplot(2,4,1);hold on;
  286. errorbar([1 2],[nanmean(fixations.noMS.microsacc(:,1)) ...
  287. nanmean(fixations.withMS.microsacc(:,1))],...
  288. [nanstd(fixations.noMS.microsacc(:,1)) ...
  289. nanstd(fixations.withMS.microsacc(:,1))],'ks',...
  290. 'linestyle','none','linewidth',2,'markersize',12,'markerfacecolor','k');
  291. set(gca,'xlim',[0 3],'ylim',[0 0.4],'xtick',1:2,'xticklabel',{'no MS','MS'})
  292. ylabel('Microsacc amplitude');
  293. title('Mean +/- stdev')
  294. subplot(2,4,2:4);hold on;
  295. [y1,x1]=hist(fixations.noMS.microsacc(:,1),100); y1b=y1/sum(y1);
  296. [y2,x2]=hist(fixations.withMS.microsacc(:,1),100); y2b=y2/sum(y2);
  297. bar(x1,y1b,'r','Edgecolor','none','barwidth',1);
  298. bar(x2,-y2b,'k','Edgecolor','none','barwidth',1);
  299. set(gca,'xlim',[0 0.6],'ylim',[-0.12 0.12]);
  300. xlabel('Microsaccade amplitude')
  301. ylabel('Frequency')
  302. legend({'no MS' 'MS'})
  303. title('Microsaccade amplitude distributions')
  304. subplot(2,4,5);hold on;
  305. errorbar([1 2],[nanmean(fixations.noMS.microsaccn(:,1)) ...
  306. nanmean(fixations.withMS.microsaccn(:,1))],...
  307. [nanstd(fixations.noMS.microsaccn(:,1)) ...
  308. nanstd(fixations.withMS.microsaccn(:,1))],'ks',...
  309. 'linestyle','none','linewidth',2,'markersize',12,'markerfacecolor','k');
  310. set(gca,'xlim',[0 3],'ylim',[-3 8],'xtick',1:2,'xticklabel',{'no MS','MS'})
  311. ylabel('# microsacc / trial');
  312. title('Mean +/- stdev')
  313. subplot(2,4,6:8);hold on;
  314. [y1,x1]=hist(fixations.noMS.microsaccn(:,1),0:30); y1b=y1/sum(y1);
  315. [y2,x2]=hist(fixations.withMS.microsaccn(:,1),0:30); y2b=y2/sum(y2);
  316. bar(x1,y1b,'r','Edgecolor','none','barwidth',1);
  317. bar(x2,-y2b,'k','Edgecolor','none','barwidth',1);
  318. set(gca,'xlim',[-1 15]);
  319. xlabel('# microsaccades per trial')
  320. ylabel('Frequency')
  321. legend({'no MS' 'MS'})
  322. title('Number of microsaccades')
  323. %% stats on microsccades --------------------------------------------------
  324. % amplitudes
  325. microsacmat = [fixations.noMS.microsacc(:,1);...
  326. fixations.withMS.microsacc(:,1)];
  327. group = {[zeros(size(fixations.noMS.microsacc(:,1))); ...
  328. ones(size(fixations.withMS.microsacc(:,1)))]};
  329. gn={'MS'}; [P,T,STATS,TERMS]=anovan(microsacmat,group)
  330. % number
  331. microsacmat2 = [fixations.noMS.microsaccn(:,1);...
  332. fixations.withMS.microsaccn(:,1)];
  333. group = {[zeros(size(fixations.noMS.microsaccn(:,1))); ...
  334. ones(size(fixations.withMS.microsaccn(:,1)))]};
  335. gn={'MS'}; [P2,T2,STATS2,TERMS2]=anovan(microsacmat2,group)