VideoAnalysis_ChR2Cue.m 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. clear all;
  2. analyzedlcfiles=0;
  3. %% get data from DeepLabCut files
  4. if analyzedlcfiles
  5. ffmpeg_path='C:\FFmpeg\bin';
  6. address=['']; %where are the running files located
  7. files=dir([address,'\\*_*']);
  8. videoaddress=[''];
  9. videofiles=dir([videoaddress,'\\*Ch*']);
  10. for k=1:length(files)
  11. filename=fullfile(files(k).folder,files(k).name);
  12. rat=str2num(files(k).name(9:10)); %rat #
  13. videofile=[videofiles(k).folder '\' videofiles(k).name];
  14. %get timestamp data
  15. [timestamps,xcoordinates,ycoordinates]=AnalyzeDeepLabCutPP(filename,videofile,ffmpeg_path);
  16. VideoData{rat,1}=timestamps;
  17. VideoData{rat,2}=xcoordinates;
  18. VideoData{rat,3}=ycoordinates;
  19. end
  20. save('CueVideoData.mat','VideoData');
  21. else
  22. load('CueVideoData.mat');
  23. end
  24. %%
  25. spreadsheet=importdata('CueVideoKey.xlsx');
  26. spreadsheetrat=spreadsheet.textdata(2:end,1);
  27. for i=1:length(spreadsheetrat)
  28. sprat(i,1)=str2num(spreadsheetrat{i,1}(3:4));
  29. end
  30. lighton(sprat,1)=spreadsheet.data(:,1);
  31. portcoord(sprat,1)=spreadsheet.data(:,2);
  32. portcoord(sprat,2)=spreadsheet.data(:,3);
  33. %cutoff(sprat,1)=spreadsheet.data(:,5);
  34. Colors = load_colors();
  35. trlactivity={[];[];[]};
  36. trldistance={[];[];[]};
  37. address=['/Data/ChR2CueBehavior'];
  38. %files=dir([address,'\\*!*']);
  39. files=dir([address,'//*!*']); %mac
  40. for k=1:length(files)
  41. filename=fullfile(files(k).folder,files(k).name);
  42. file=fopen(filename);
  43. L=textscan(file,'%s','Delimiter',':');
  44. fclose('all');
  45. rat=str2num(files(k).name(end-1:end));
  46. if sum(rat==3 | rat==15)==0 %don't analyze rats without videos
  47. %find start of A, start of C, and end of C
  48. Jstrt=find(strcmp('J',L{1,1})); %Cue
  49. Kstrt=find(strcmp('K',L{1,1})); %Sucrose Delivery
  50. Ostrt=find(strcmp('O',L{1,1})); %Port entry times
  51. Pstrt=find(strcmp('P',L{1,1})); %Port durations
  52. Qstrt=find(strcmp('Q',L{1,1})); %Laser stimulations
  53. Xstrt=find(strcmp('X',L{1,1})); %List (marks end of laser stims)
  54. %trial times
  55. choicet=(L{1,1}(Jstrt+2:2:Kstrt-1));
  56. choicetime=[];
  57. for i=1:length(choicet)
  58. medtext=textscan(char(choicet(i,1)),'%f','Delimiter',' ');
  59. ctime=medtext{1,1}(:,1);
  60. choicetime=(cat(1,choicetime,ctime(isnan(ctime)==0)));
  61. end
  62. choicetime(choicetime==0)=[]; %delete 0s
  63. %Sucrose delivery times
  64. sucrosedel=(L{1,1}(Kstrt+2:2:Ostrt-1));
  65. sucrosedeltime=[];
  66. for i=1:length(sucrosedel)
  67. medtext=textscan(char(sucrosedel(i,1)),'%f','Delimiter',' ');
  68. sdtime=medtext{1,1}(:,1);
  69. sucrosedeltime=(cat(1,sucrosedeltime,sdtime(isnan(sdtime)==0)));
  70. end
  71. sucrosedeltime(sucrosedeltime==0)=[]; %delete 0s
  72. %Port entry times
  73. pet=(L{1,1}(Ostrt+2:2:Pstrt-1));
  74. petime=[];
  75. for i=1:length(pet)
  76. medtext=textscan(char(pet(i,1)),'%f','Delimiter',' ');
  77. portentry=medtext{1,1}(:,1);
  78. petime=(cat(1,petime,portentry(isnan(portentry)==0)));
  79. end
  80. removes=petime==0;
  81. petime(petime==0)=[]; %delete 0s
  82. %Port entry durations
  83. durationt=(L{1,1}(Pstrt+2:2:Qstrt-1));
  84. durationtime=[];
  85. for i=1:length(durationt)
  86. medtext=textscan(char(durationt(i,1)),'%f','Delimiter',' ');
  87. duration=medtext{1,1}(:,1);
  88. durationtime=(cat(1,durationtime,duration(isnan(duration)==0)));
  89. end
  90. durationtime(removes)=[]; %delete 0s
  91. pexits=petime(1:length(durationtime))+durationtime;
  92. %Laser stims
  93. ST=(L{1,1}(Qstrt+2:2:Xstrt-1));
  94. STtime=[];
  95. for i=1:length(ST)
  96. medtext=textscan(char(ST(i,1)),'%f','Delimiter',' ');
  97. stime=medtext{1,1}(:,1);
  98. STtime=(cat(1,STtime,stime(isnan(stime)==0)));
  99. end
  100. STtime(STtime==0)=[]; %delete 0s
  101. %Sucrose or water?
  102. latency=[];
  103. for i=1:length(choicetime)
  104. sucrose=find(sucrosedeltime(:,1) > choicetime(i,1),1);
  105. sucrosetime=sucrosedeltime(sucrose);
  106. if sucrosetime
  107. latency(i,1)=sucrosetime-choicetime(i,1)-0.5; %delay is 0.5s
  108. else
  109. latency(i,1)=NaN;
  110. end
  111. end
  112. latency(latency>10)=NaN;
  113. completed=latency>0;
  114. %stim trials
  115. post_stimmed=zeros(length(choicetime),1);
  116. for stim=1:length(STtime)
  117. trialtime=min(choicetime(choicetime>STtime(stim)));
  118. if ~isempty(trialtime)
  119. post_stimmed(choicetime==trialtime)=1;
  120. end
  121. end
  122. %no stim trials
  123. postsuc=zeros(length(choicetime),1);
  124. for suctrial=1:length(sucrosedeltime)
  125. trialtime=min(choicetime(choicetime>sucrosedeltime(suctrial)));
  126. if ~isempty(trialtime)
  127. postsuc(choicetime==trialtime)=1;
  128. end
  129. end
  130. nostim=postsuc==1 & post_stimmed==0;
  131. rdtimes=sucrosedeltime;
  132. cuetimes=choicetime;
  133. petimes=petime;
  134. included_cue_trials=[];
  135. for trial=1:length(rdtimes)
  136. if sum(cuetimes>rdtimes(trial))>0
  137. included_cue_trials(trial,1)=find(cuetimes>rdtimes(trial),1,'first');
  138. end
  139. end
  140. post_stim=post_stimmed(included_cue_trials);
  141. %get coordinates from deeplabcut analysis
  142. timestamps=VideoData{rat,1}-lighton(rat,1); %adjust for when session started in video
  143. xcoordinates=VideoData{rat,2};
  144. ycoordinates=VideoData{rat,3};
  145. %for each cue onset
  146. xypoints={};
  147. xtrial=[];
  148. ytrial=[];
  149. ITI_distance=[];
  150. ITI_dfp=[];
  151. licks_trl=[];
  152. for trial=1:length(cuetimes)
  153. if sum(timestamps>(cuetimes(trial)-0.25) & timestamps<(cuetimes(trial)+0.25))>0
  154. xtrial(trial)=mean(xcoordinates((timestamps>cuetimes(trial)-0.25) & (timestamps<cuetimes(trial)+0.25)));
  155. ytrial(trial)=mean(ycoordinates((timestamps>cuetimes(trial)-0.25) & (timestamps<cuetimes(trial)+0.25)));
  156. elseif sum(timestamps>(cuetimes(trial)-1) & timestamps<(cuetimes(trial)+0.3))>0
  157. xtrial(trial)=mean(xcoordinates((timestamps>cuetimes(trial)-1) & (timestamps<cuetimes(trial)+0.3)));
  158. ytrial(trial)=mean(ycoordinates((timestamps>cuetimes(trial)-1) & (timestamps<cuetimes(trial)+0.3)));
  159. else
  160. xtrial(trial)=NaN;
  161. ytrial(trial)=NaN;
  162. end
  163. %total distance traveled during ITI, and mean distance from port
  164. binsize=0.2; %seconds
  165. if sum(rdtimes<cuetimes(trial))>0 & postsuc(trial)==1
  166. rd_time=max(rdtimes(rdtimes<cuetimes(trial)));
  167. pe_time=max(petimes(petimes<(rd_time+10)));
  168. start_time=min([pexits(petimes==pe_time) rd_time+10]);
  169. %bins=start_time:binsize:cuetimes(trial);
  170. bins=start_time:binsize:cuetimes(trial)+binsize/2;
  171. bn=0;
  172. bin_t=[];
  173. bin_x=[];
  174. bin_y=[];
  175. bin_dfp=[];
  176. %location for each bin
  177. for bin=1:length(bins)-1
  178. if sum(timestamps>bins(bin) & timestamps<bins(bin+1))>0
  179. bn=bn+1;
  180. bin_t(bn,1)=bins(bin)+binsize/2;
  181. bin_x(bn,1)=mean(xcoordinates(timestamps>bins(bin) & timestamps<bins(bin+1)));
  182. bin_y(bn,1)=mean(ycoordinates(timestamps>bins(bin) & timestamps<bins(bin+1)));
  183. bin_dfp(bn,1)=sqrt((bin_x(bn,1)-portcoord(rat,1))^2+(bin_y(bn,1)-portcoord(rat,2))^2);
  184. end
  185. end
  186. xypoints{trial,1}=cat(2,bin_x,bin_y);
  187. % subplot(5,5,rat);
  188. % hold on;
  189. % plot(bin_dfp);
  190. % xypoints{trial,1}=cat(2,bin_x,bin_y);
  191. % axis([0 25 0 500]);
  192. ITI_dfp(trial)=trapz(bin_t,bin_dfp)/(bin_t(end)-bin_t(1)); %dfp = distance from port
  193. else
  194. ITI_dfp(trial)=NaN;
  195. xypoints{trial,1}=NaN;
  196. end
  197. end
  198. %plot example traces
  199. if rat==17
  200. figure;
  201. %scatterplot of rat locations
  202. xypoints=xypoints(included_cue_trials,:);
  203. xtrial_inc=xtrial(included_cue_trials);
  204. ytrial_inc=ytrial(included_cue_trials);
  205. sucrosexy=cat(1,xypoints{post_stim==0});
  206. maltodextrinxy=cat(1,xypoints{post_stim==1});
  207. opacity=0.1;
  208. dotsize=24;
  209. sucrosetrls=xypoints(post_stim==0);
  210. maltodextrintrls=xypoints(post_stim==1);
  211. %sucrose traces
  212. subplot(1,4,1);
  213. hold on;
  214. s1=scatter(sucrosexy(:,1),sucrosexy(:,2),dotsize,[.4 .4 .4],'filled');
  215. s1.MarkerFaceAlpha = opacity;
  216. sc=scatter(xtrial_inc(post_stim==0),ytrial_inc(post_stim==0),'k','x');
  217. axis([0 950 75 750]);
  218. set(gca,'Ydir','reverse')
  219. set(gca,'xtick',[]);
  220. set(gca,'ytick',[]);
  221. plot([950 portcoord(rat,1)],[450 portcoord(rat,2)],'color','k');
  222. legend(sc,'Location at cue onset');
  223. text(955,450,'Reward Port');
  224. title('No laser');
  225. %maltodextrin traces
  226. subplot(1,4,2);
  227. hold on;
  228. s2=scatter(maltodextrinxy(:,1),maltodextrinxy(:,2),dotsize,[0 .3 1],'filled');
  229. s2.MarkerFaceAlpha = opacity;
  230. scatter(xtrial_inc(post_stim==1),ytrial_inc(post_stim==1),[],'k','x')
  231. %plot individual trial traces
  232. % for i=1:length(maltodextrintrls)
  233. % if maltodextrintrls{i,1}
  234. % plot(maltodextrintrls{i,1}(:,1),maltodextrintrls{i,1}(:,2),'color',Colors('maltodextrin'));
  235. % end
  236. % end
  237. set(gca,'Ydir','reverse')
  238. set(gca,'xtick',[]);
  239. set(gca,'ytick',[]);
  240. axis([0 950 75 750]);
  241. plot([950 portcoord(rat,1)],[450 portcoord(rat,2)],'color','k');
  242. legend(sc,'Location at cue onset');
  243. text(955,450,'Reward Port');
  244. title('Laser');
  245. end
  246. ITI_dfp_inc=ITI_dfp(included_cue_trials)';
  247. mean_distance(rat,1)=nanmean(ITI_dfp_inc(post_stim==0));
  248. mean_distance(rat,2)=nanmean(ITI_dfp_inc(post_stim==1));
  249. completed_trials(rat,1)=length(sucrosedeltime);
  250. end
  251. disp(['File #' num2str(k)]);
  252. end
  253. %% plotting measures
  254. %included rats
  255. yfp=[4 6 10 11 13 14 21];
  256. chr=[1 2 8 9 16 17 18 22 23 24];
  257. colors{2}=[0 0.3 1];
  258. colors{1}=[0.4 0.4 0.4];
  259. groups{1,1}=yfp;
  260. groups{2,1}=chr;
  261. subplot(1,8,5);
  262. hold on;
  263. plot([1 2],mean_distance(yfp,:),'color',[0.4 0.4 0.4]);
  264. errorbar(1,nanmean(mean_distance(yfp,1)),nanste(mean_distance(yfp,1),1),'color',[0.4 0.4 0.4],'marker','o','linewidth',1.5);
  265. errorbar(2,nanmean(mean_distance(yfp,2)),nanste(mean_distance(yfp,2),1),'color',[0 0.3 1],'marker','o','linewidth',1.5);
  266. ylabel('Distance from port during ITI (pixels)');
  267. xticks([1 2]);
  268. xticklabels({'No laser','Laser'});
  269. xtickangle(45);
  270. axis([0.5 2.5 0 400]);
  271. title('YFP');
  272. pval=signrank(mean_distance(yfp,1),mean_distance(yfp,2));
  273. text(1.2,375,['p = ' num2str(round(pval,2,'significant'))]);
  274. subplot(1,8,6);
  275. hold on;
  276. plot([1 2],mean_distance(chr,:),'color',[0.4 0.4 0.4]);
  277. errorbar(1,nanmean(mean_distance(chr,1)),nanste(mean_distance(chr,1),1),'color',[0.4 0.4 0.4],'marker','o','markerfacecolor',[0.4 0.4 0.4],'linewidth',1.5);
  278. errorbar(2,nanmean(mean_distance(chr,2)),nanste(mean_distance(chr,2),1),'color',[0 0.3 1],'marker','o','markerfacecolor',[0 0.3 1],'linewidth',1.5);
  279. ylabel('Distance from port during ITI (pixels)');
  280. xticks([1 2]);
  281. xticklabels({'No laser','Laser'});
  282. xtickangle(45);
  283. axis([0.5 2.5 0 400]);
  284. title('ChR2');
  285. pval=signrank(mean_distance(chr,1),mean_distance(chr,2));
  286. text(1.2,375,['p = ' num2str(round(pval,2,'significant'))]);
  287. included=zeros(24,1);
  288. included(chr)=1;
  289. included(yfp)=1;
  290. arclog=zeros(24,1);
  291. arclog(chr)=1;
  292. subplot(1,4,4);
  293. hold on;
  294. difference=(mean_distance(:,2)-mean_distance(:,1))./mean_distance(:,1);
  295. boxplot(difference(included==1),arclog(included==1),'colorgroup',[0 1],'colors',[colors{2};colors{2}],'boxstyle','filled');
  296. scatter(rand([length(yfp) 1])/4+1.2,difference(yfp),55,colors{2});
  297. scatter(rand([length(chr) 1])/4+2.2,difference(chr),55,colors{2},'filled');
  298. axis([0.7 2.74 -0.5 0.5]);
  299. plot([0 3],[0 0],'color','k');
  300. pval=ranksum(difference(yfp),difference(chr));
  301. text(1.2,0.4,['p = ' num2str(round(pval,2,'significant'))]);
  302. ylabel('Fold-change over no laser');
  303. xticks([1.22 2.22]);
  304. xticklabels({'YFP','ChR2'});
  305. dataforanova=[mean_distance(chr,1) mean_distance(chr,2);mean_distance(yfp,1) mean_distance(yfp,2)];