VideoAnalysis_TH.m 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. clear all;
  2. files={'Three1_42DeepCut_resnet50_ThreeAug21shuffle1_994000.h5';...
  3. 'Three2_42DeepCut_resnet50_ThreeAug21shuffle1_994000.h5';...
  4. 'Three3_51DeepCut_resnet50_ThreeAug21shuffle1_994000.h5';...
  5. 'Three4_54DeepCut_resnet50_ThreeAug21shuffle1_994000.h5'};
  6. portcoord=[60 70;60 70;60 70;60 70];
  7. load('RAWTH'); RAW=RAWTH;
  8. load('ModData_TH.mat');
  9. load ('threeOutcomes_MLEfits.mat');
  10. bm_RD=select_RPEmods(os, 'RD', 'particularModels', {'mean','curr','base'},'plotmodels_Flag',false);
  11. bm_cue=select_RPEmods(os, 'cue', 'particularModels', {'mean','base'},'plotmodels_Flag',false);
  12. included=true(length(TH.RDHz),1); %all neurons
  13. Predictors=TH.Predictors(included);
  14. RDHz=TH.RDHz(included);
  15. CueHz=TH.CueHzAll(included);
  16. Colors = load_colors();
  17. [magma,inferno,plasma,viridis]=colormaps;
  18. masks=cat(2,bm_RD.mask_base(included)',bm_RD.mask_curr(included)',bm_RD.mask_mean(included)');
  19. cue_masks=cat(2,bm_cue.mask_base(included)',bm_cue.mask_mean(included)');
  20. for session=1:length(RAW)
  21. %get coordinates from deeplabcut analysis
  22. [DLC.timestamps{session,1},DLC.xcoordinates{session,1},DLC.ycoordinates{session,1}]=AnalyzeDeepLabCut(files{session});
  23. end
  24. %%
  25. NN=0;
  26. trlactivity={[];[];[]};
  27. trldistance={[];[];[]};
  28. all_distance=[];
  29. all_preds=[];
  30. for session=1:length(RAW)
  31. %get coordinates from deeplabcut analysis
  32. [timestamps,xcoordinates,ycoordinates]=AnalyzeDeepLabCut(files{session});
  33. %get event times
  34. cue = strcmp('Cue',RAW(session).Einfo(:,2));
  35. cuetimes = RAW(session).Erast{cue};
  36. pe = strcmp('PE',RAW(session).Einfo(:,2));
  37. petimes = RAW(session).Erast{pe};
  38. rd = strcmp('RD',RAW(session).Einfo(:,2));
  39. rdtimes = RAW(session).Erast{rd};
  40. lick = strcmp('Licks',RAW(session).Einfo(:,2));
  41. licks = RAW(session).Erast{lick};
  42. %find included trials
  43. included_RDs=rdtimes<cuetimes(end);
  44. included_cue_trials=[];
  45. for trial=1:length(rdtimes)
  46. if sum(cuetimes>rdtimes(trial))>0
  47. included_cue_trials(trial,1)=find(cuetimes>rdtimes(trial),1,'first');
  48. end
  49. end
  50. %for each cue onset
  51. xypoints={};
  52. xtrial=[];
  53. ytrial=[];
  54. ITI_dfp=[];
  55. for trial=1:length(cuetimes)
  56. %coordinates at cue onset
  57. if sum(timestamps>(cuetimes(trial)-0.15) & timestamps<(cuetimes(trial)+0.15))>0
  58. xtrial(trial)=mean(xcoordinates((timestamps>cuetimes(trial)-0.15) & (timestamps<cuetimes(trial)+0.15)));
  59. ytrial(trial)=mean(ycoordinates((timestamps>cuetimes(trial)-0.15) & (timestamps<cuetimes(trial)+0.15)));
  60. else
  61. xtrial(trial)=NaN;
  62. ytrial(trial)=NaN;
  63. end
  64. %total distance traveled during ITI, and mean distance from port
  65. binsize=0.2; %seconds
  66. if sum(rdtimes<cuetimes(trial))>0 & sum(included_cue_trials==trial)>0
  67. rd_time=max(rdtimes(rdtimes<cuetimes(trial)));
  68. if licks>rd_time & licks<(rd_time+15)
  69. start_time=max(licks(licks>rd_time & licks<(rd_time+15)));
  70. else
  71. start_time=rd_time+5;
  72. end
  73. %bins=start_time:binsize:cuetimes(trial);
  74. bins=start_time:binsize:cuetimes(trial)+binsize/2;
  75. bn=0;
  76. bin_t=[];
  77. bin_x=[];
  78. bin_y=[];
  79. bin_dfp=[];
  80. %location for each bin
  81. for bin=1:length(bins)-1
  82. if sum(timestamps>bins(bin) & timestamps<bins(bin+1))>0
  83. bn=bn+1;
  84. bin_t(bn,1)=bins(bin)+binsize/2;
  85. bin_x(bn,1)=mean(xcoordinates(timestamps>bins(bin) & timestamps<bins(bin+1)));
  86. bin_y(bn,1)=mean(ycoordinates(timestamps>bins(bin) & timestamps<bins(bin+1)));
  87. bin_dfp(bn,1)=sqrt((bin_x(bn,1)-portcoord(session,1))^2+(bin_y(bn,1)-portcoord(session,2))^2);
  88. end
  89. end
  90. norm_time=(bin_t-bin_t(1))/(bin_t(end)-bin_t(1));
  91. xypoints{trial,1}=cat(2,bin_x,bin_y);
  92. ITI_dfp(trial)=trapz(bin_t,bin_dfp)/(bin_t(end)-bin_t(1)); %dfp = distance from port
  93. else
  94. ITI_dfp(trial)=NaN;
  95. xypoints{trial,1}=NaN;
  96. end
  97. end
  98. %only look at included trials
  99. distance_inc=ITI_dfp(included_cue_trials)';
  100. %relate to neural activity
  101. noi=[1:length(RAW(session).Nrast)]+NN;
  102. noi_activity=RDHz(noi);
  103. noi_activity_cue=CueHz(noi);
  104. sessions=[3];
  105. for neuron=1:length(noi)
  106. NN=NN+1;
  107. %plot example traces
  108. if neuron==1 & sum(sessions==session)>0
  109. %scatterplot of rat locations
  110. xypoints=xypoints(included_cue_trials,:);
  111. xtrial_inc=xtrial(included_cue_trials);
  112. ytrial_inc=ytrial(included_cue_trials);
  113. sucrosexy=cat(1,xypoints{Predictors{NN,1}(1:sum(included_RDs),1)==1});
  114. maltodextrinxy=cat(1,xypoints{Predictors{NN,1}(1:sum(included_RDs),1)==0});
  115. waterxy=cat(1,xypoints{Predictors{NN,1}(1:sum(included_RDs),1)==2});
  116. opacity=0.1;
  117. dotsize=24;
  118. sucrosetrls=xypoints(Predictors{NN,1}(1:sum(included_RDs),1)==1);
  119. maltodextrintrls=xypoints(Predictors{NN,1}(1:sum(included_RDs),1)==0);
  120. watertrls=xypoints(Predictors{NN,1}(1:sum(included_RDs),1)==2);
  121. %sucrose traces
  122. figure;
  123. subplot(2,4,1);
  124. hold on;
  125. s1=scatter(sucrosexy(:,1),sucrosexy(:,2),dotsize,Colors('sucrose'),'filled');
  126. s1.MarkerFaceAlpha = opacity;
  127. sc=scatter(xtrial_inc(Predictors{NN,1}(1:sum(included_RDs),1)==1),ytrial_inc(Predictors{NN,1}(1:sum(included_RDs),1)==1),'k','x');
  128. %plot individual trial traces
  129. % for i=1:length(sucrosetrls)
  130. % if sucrosetrls{i,1}
  131. % plot(sucrosetrls{i,1}(:,1),sucrosetrls{i,1}(:,2),'color',Colors('sucrose'));
  132. % end
  133. % end
  134. axis([0 450 0 350]);
  135. set(gca,'Ydir','reverse')
  136. set(gca,'xtick',[]);
  137. set(gca,'ytick',[]);
  138. if session>5 plot([40 60],[25 70],'color','k'); end
  139. if session<=5 plot([40 50],[25 65],'color','k'); end
  140. legend(sc,'Location at cue onset');
  141. text(5,10,'Reward Port');
  142. title('Location post-sucrose');
  143. %maltodextrin traces
  144. subplot(2,4,2);
  145. hold on;
  146. s2=scatter(maltodextrinxy(:,1),maltodextrinxy(:,2),dotsize,Colors('maltodextrin'),'filled');
  147. s2.MarkerFaceAlpha = opacity;
  148. scatter(xtrial_inc(Predictors{NN,1}(1:sum(included_RDs),1)==0),ytrial_inc(Predictors{NN,1}(1:sum(included_RDs),1)==0),[],'k','x')
  149. %plot individual trial traces
  150. % for i=1:length(maltodextrintrls)
  151. % if maltodextrintrls{i,1}
  152. % plot(maltodextrintrls{i,1}(:,1),maltodextrintrls{i,1}(:,2),'color',Colors('maltodextrin'));
  153. % end
  154. % end
  155. set(gca,'Ydir','reverse')
  156. set(gca,'xtick',[]);
  157. set(gca,'ytick',[]);
  158. axis([0 450 0 350]);
  159. if session>5 plot([40 60],[25 70],'color','k'); end
  160. if session<=5 plot([40 50],[25 65],'color','k'); end
  161. text(5,10,'Reward Port');
  162. title('Location post-maltodextrin');
  163. %water traces
  164. subplot(2,4,3);
  165. hold on;
  166. s2=scatter(waterxy(:,1),waterxy(:,2),dotsize,Colors('water'),'filled');
  167. s2.MarkerFaceAlpha = opacity;
  168. scatter(xtrial_inc(Predictors{NN,1}(1:sum(included_RDs),1)==0),ytrial_inc(Predictors{NN,1}(1:sum(included_RDs),1)==0),[],'k','x')
  169. %plot individual trial traces
  170. % for i=1:length(maltodextrintrls)
  171. % if maltodextrintrls{i,1}
  172. % plot(maltodextrintrls{i,1}(:,1),maltodextrintrls{i,1}(:,2),'color',Colors('maltodextrin'));
  173. % end
  174. % end
  175. set(gca,'Ydir','reverse')
  176. set(gca,'xtick',[]);
  177. set(gca,'ytick',[]);
  178. axis([0 450 0 350]);
  179. if session>5 plot([40 60],[25 70],'color','k'); end
  180. if session<=5 plot([40 50],[25 65],'color','k'); end
  181. text(5,10,'Reward Port');
  182. title('Location post-water');
  183. end
  184. [distance_corr_cue(NN,1),distance_corr_cue(NN,2)]=corr(noi_activity_cue{neuron,1}(included_cue_trials,1),distance_inc,'rows','complete','type','spearman');
  185. [distance_corr(NN,1),distance_corr(NN,2)]=corr(noi_activity{neuron,1}(included_RDs,1),distance_inc,'rows','complete','type','spearman');
  186. %shuffled controls
  187. for i=1:1000
  188. distance_shuff=distance_inc(randperm(length(distance_inc)));
  189. dist_shuff_corr(NN,i)=corr(noi_activity{neuron,1}(included_RDs,1),distance_shuff,'rows','complete','type','spearman');
  190. dist_shuff_corr_cue(NN,i)=corr(noi_activity_cue{neuron,1}(included_cue_trials,1),distance_shuff,'rows','complete','type','spearman');
  191. end
  192. if neuron==1 %only do this once per session
  193. suc_distance(session,1)=nanmean(distance_inc(Predictors{NN,1}(1:sum(included_RDs),1)==1));
  194. mal_distance(session,1)=nanmean(distance_inc(Predictors{NN,1}(1:sum(included_RDs),1)==0));
  195. wat_distance(session,1)=nanmean(distance_inc(Predictors{NN,1}(1:sum(included_RDs),1)==2));
  196. distance_inc_norm = (distance_inc - nanmean(distance_inc))/nanstd(distance_inc);
  197. all_distance = cat(1,all_distance,distance_inc_norm);
  198. all_preds = cat(1,all_preds,Predictors{NN,1}(1:sum(included_RDs),:));
  199. end
  200. end
  201. disp(['Session #' num2str(session)]);
  202. end
  203. %% plotting distance from port graphs
  204. subplot(2,6,6);
  205. hold on;
  206. plot([1:3],[suc_distance mal_distance wat_distance],'color',[0.6 0.6 0.6]);
  207. errorbar(1,nanmean(suc_distance),nanste(suc_distance,1),'color',Colors('sucrose'),'marker','o','linewidth',1.5);
  208. errorbar(2,nanmean(mal_distance),nanste(mal_distance,1),'color',Colors('maltodextrin'),'marker','o','linewidth',1.5);
  209. errorbar(3,nanmean(wat_distance),nanste(wat_distance,1),'color',Colors('water'),'marker','o','linewidth',1.5);
  210. ylabel('Distance from port during ITI (pixels)');
  211. xticks([1:3]);
  212. xticklabels({'Post-suc','Post-mal','Post-wat'});
  213. xtickangle(45);
  214. axis([0.5 3.5 0 200]);
  215. %stats
  216. %signrank(suc_distance,wat_distance);
  217. %anova1([suc_distance mal_distance wat_distance]);
  218. [r,p] = corr(cat(1,suc_distance,mal_distance,wat_distance),cat(1,3*ones(4,1),2*ones(4,1),ones(4,1)),'type','spearman');
  219. colors{1,1}=Colors('rpe');
  220. colors{2,1}=Colors('current');
  221. colors{3,1}=Colors('mean');
  222. subplot(2,4,5);
  223. hold on;
  224. plots={};
  225. for mask=1:length(masks(1,:))
  226. [cdf,x] = ecdf(distance_corr(masks(:,mask)));
  227. plots{mask} = plot(x,cdf,'linewidth',1.5,'color',colors{mask,1});
  228. plot([nanmean(distance_corr(masks(:,mask))) nanmean(distance_corr(masks(:,mask)))],[0 1],'color',colors{mask,1},'linewidth',1);
  229. end
  230. %histogram(distance_corr(masks(:,1)),-0.5:0.05:0.5,'normalization','probability','edgecolor','none','facecolor',Colors('rpe'));
  231. plot([0 0],[0 1],'color','k');
  232. plot([-0.5 0.5],[0.5 0.5],'color','k');
  233. axis([-.5 .5 0 1]);
  234. legend([plots{:}],'RPE','Current','Unmod.','location','southeast')
  235. xlabel('Spearman''s rho');
  236. ylabel('Cumulative fraction of neurons');
  237. title('Correlation between VP RD activity and ITI distance');
  238. text(-0.2,1,'*','color','k','fontsize',24);
  239. %stats tests
  240. %ranksum(distance_corr(masks(:,1)),distance_corr(masks(:,3)));
  241. %signrank(distance_corr(masks(:,2)),dist_shuff_corr(masks(:,2)));
  242. %% cue value
  243. colors{1,1}=Colors('rpe');
  244. colors{2,1}=Colors('mean');
  245. subplot(2,4,8);
  246. hold on;
  247. plots={};
  248. for mask=1:length(cue_masks(1,:))
  249. [cdf,x] = ecdf(distance_corr_cue(cue_masks(:,mask)));
  250. %[cdf,x] = ecdf(dist_shuff_corr_cue(cue_masks(:,mask)));
  251. plots{mask} = plot(x,cdf,'linewidth',1.5,'color',colors{mask,1});
  252. plot([mean(distance_corr_cue(cue_masks(:,mask))) mean(distance_corr_cue(cue_masks(:,mask)))],[0 1],'color',colors{mask,1},'linewidth',1);
  253. end
  254. %histogram(distance_corr(masks(:,1)),-0.5:0.05:0.5,'normalization','probability','edgecolor','none','facecolor',Colors('rpe'));
  255. plot([0 0],[0 1],'color','k');
  256. plot([-0.5 0.5],[0.5 0.5],'color','k');
  257. axis([-.5 .5 0 1]);
  258. legend([plots{:}],'Value','Unmod.','location','northwest')
  259. xlabel('Spearman''s rho');
  260. ylabel('Cumulative fraction of neurons');
  261. title('Correlation between VP cue activity and ITI distance');
  262. text(-0.2,1,'*','color','k','fontsize',24);
  263. %stats tests
  264. %ranksum(distance_corr_cue(cue_masks(:,1)),distance_corr_cue(cue_masks(:,2)));
  265. %signrank(distance_corr_cue(cue_masks(:,1)),dist_shuff_corr_cue(cue_masks(:,1)));