VideoAnalysis_Arch.m 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. clear all;
  2. analyzedlcfiles=0;
  3. %% get data from DeepLabCut files
  4. if analyzedlcfiles
  5. %original videos needed, available upon request. otherwise, use
  6. %pre-generated struct below
  7. ffmpeg_path='C:\FFmpeg\bin';
  8. address=['']; %where are the running files located
  9. files=dir([address,'\\*_*']);
  10. videoaddress=[''];
  11. videofiles=dir([videoaddress,'\\*Op*']);
  12. for k=1:length(files)
  13. filename=fullfile(files(k).folder,files(k).name);
  14. rat=str2num(files(k).name(3:4)); %rat #
  15. videofile=[videofiles(k).folder '\' videofiles(k).name];
  16. %get timestamp data
  17. [timestamps,xcoordinates,ycoordinates]=AnalyzeDeepLabCutPP(filename,videofile,ffmpeg_path);
  18. VideoData{rat,1}=timestamps;
  19. VideoData{rat,2}=xcoordinates;
  20. VideoData{rat,3}=ycoordinates;
  21. end
  22. save('PPVideoData.mat','VideoData');
  23. else
  24. load('PPVideoData.mat');
  25. end
  26. %%
  27. spreadsheet=importdata('PPVideoKey.xlsx');
  28. spreadsheetrat=spreadsheet.textdata(2:end,1);
  29. for i=1:length(spreadsheetrat)
  30. sprat(i,1)=str2num(spreadsheetrat{i,1}(3:4));
  31. end
  32. lighton(sprat,1)=spreadsheet.data(:,1);
  33. portcoord(sprat,1)=spreadsheet.data(:,2);
  34. portcoord(sprat,2)=spreadsheet.data(:,3);
  35. cutoff(sprat,1)=spreadsheet.data(:,5);
  36. Colors = load_colors();
  37. trlactivity={[];[];[]};
  38. trldistance={[];[];[]};
  39. address=['/Data/ArchBehavior']; %where are the running files located
  40. files=dir([address,'//*!*']); %mac
  41. for k=1:length(files)
  42. filename=fullfile(files(k).folder,files(k).name);
  43. file=fopen(filename);
  44. L=textscan(file,'%s','Delimiter',':');
  45. fclose('all');
  46. rat=str2num(files(k).name(end-1:end));
  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==18
  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. %plot individual trial traces
  218. % for i=1:length(sucrosetrls)
  219. % if sucrosetrls{i,1}
  220. % plot(sucrosetrls{i,1}(:,1),sucrosetrls{i,1}(:,2),'color',Colors('sucrose'));
  221. % end
  222. % end
  223. axis([0 950 75 750]);
  224. set(gca,'Ydir','reverse')
  225. set(gca,'xtick',[]);
  226. set(gca,'ytick',[]);
  227. plot([950 portcoord(rat,1)],[450 portcoord(rat,2)],'color','k');
  228. legend(sc,'Location at cue onset');
  229. text(955,450,'Reward Port');
  230. title('No laser');
  231. %maltodextrin traces
  232. subplot(1,4,2);
  233. hold on;
  234. s2=scatter(maltodextrinxy(:,1),maltodextrinxy(:,2),dotsize,[0 .6 .4],'filled');
  235. s2.MarkerFaceAlpha = opacity;
  236. scatter(xtrial_inc(post_stim==1),ytrial_inc(post_stim==1),[],'k','x')
  237. %plot individual trial traces
  238. % for i=1:length(maltodextrintrls)
  239. % if maltodextrintrls{i,1}
  240. % plot(maltodextrintrls{i,1}(:,1),maltodextrintrls{i,1}(:,2),'color',Colors('maltodextrin'));
  241. % end
  242. % end
  243. set(gca,'Ydir','reverse')
  244. set(gca,'xtick',[]);
  245. set(gca,'ytick',[]);
  246. axis([0 950 75 750]);
  247. plot([950 portcoord(rat,1)],[450 portcoord(rat,2)],'color','k');
  248. legend(sc,'Location at cue onset');
  249. text(955,450,'Reward Port');
  250. title('Laser');
  251. end
  252. ITI_dfp_inc=ITI_dfp(included_cue_trials)';
  253. mean_distance(rat,1)=nanmean(ITI_dfp_inc(post_stim==0));
  254. mean_distance(rat,2)=nanmean(ITI_dfp_inc(post_stim==1));
  255. completed_trials(rat,1)=length(sucrosedeltime);
  256. disp(['File #' num2str(k)]);
  257. end
  258. %% plotting measures
  259. %included rats
  260. yfp=[1 2 6 9 10 15 23];
  261. arc=[3 4 8 11 13 18 22];
  262. colors{2}=[0 0.6 0.4];
  263. colors{1}=[0.4 0.4 0.4];
  264. groups{1,1}=yfp;
  265. groups{2,1}=arc;
  266. % a={};
  267. % for group=1:2
  268. % subplot(1,4,3);
  269. % hold on
  270. %
  271. % a{group}=scatter(mean_distance(groups{group,1},1),mean_distance(groups{group,1},2),55,colors{group},'filled');
  272. % title('Distance from port during ITI (pixels)');
  273. % plot([0 500],[0 500],'color','k','linewidth',1);
  274. % xlabel('No stim');
  275. % ylabel('Stim');
  276. % end
  277. % legend([a{:}],'YFP','ARCH','location','southeast');
  278. % axis([100 350 100 350]);
  279. subplot(1,8,5);
  280. hold on;
  281. plot([1 2],mean_distance(yfp,:),'color',[0.4 0.4 0.4]);
  282. 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);
  283. errorbar(2,nanmean(mean_distance(yfp,2)),nanste(mean_distance(yfp,2),1),'color',[0 0.6 0.4],'marker','o','linewidth',1.5);
  284. ylabel('Distance from port during ITI (pixels)');
  285. xticks([1 2]);
  286. xticklabels({'No laser','Laser'});
  287. xtickangle(45);
  288. axis([0.5 2.5 0 400]);
  289. title('YFP');
  290. pval=signrank(mean_distance(yfp,1),mean_distance(yfp,2));
  291. text(1.2,375,['p = ' num2str(round(pval,5))]);
  292. subplot(1,8,6);
  293. hold on;
  294. plot([1 2],mean_distance(arc,:),'color',[0.4 0.4 0.4]);
  295. errorbar(1,nanmean(mean_distance(arc,1)),nanste(mean_distance(arc,1),1),'color',[0.4 0.4 0.4],'marker','o','markerfacecolor',[0.4 0.4 0.4],'linewidth',1.5);
  296. errorbar(2,nanmean(mean_distance(arc,2)),nanste(mean_distance(arc,2),1),'color',[0 0.6 0.4],'marker','o','markerfacecolor',[0 0.6 0.4],'linewidth',1.5);
  297. ylabel('Distance from port during ITI (pixels)');
  298. xticks([1 2]);
  299. xticklabels({'No laser','Laser'});
  300. xtickangle(45);
  301. axis([0.5 2.5 0 400]);
  302. title('Arch');
  303. pval=signrank(mean_distance(arc,1),mean_distance(arc,2));
  304. text(1.2,375,['p = ' num2str(round(pval,5))]);
  305. included=zeros(24,1);
  306. included(arc)=1;
  307. included(yfp)=1;
  308. arclog=zeros(24,1);
  309. arclog(arc)=1;
  310. subplot(1,4,4);
  311. hold on;
  312. difference=(mean_distance(:,2)-mean_distance(:,1))./mean_distance(:,1);
  313. boxplot(difference(included==1),arclog(included==1),'colorgroup',[0 1],'colors',[colors{2};colors{2}],'boxstyle','filled');
  314. scatter(rand([length(yfp) 1])/4+1.2,difference(yfp),55,colors{2});
  315. scatter(rand([length(arc) 1])/4+2.2,difference(arc),55,colors{2},'filled');
  316. axis([0.7 2.74 -0.5 0.5]);
  317. plot([0 3],[0 0],'color','k');
  318. pval=ranksum(difference(yfp),difference(arc));
  319. text(1.2,0.4,['p = ' num2str(round(pval,5))]);
  320. ylabel('Fold-change over no laser');
  321. xticks([1.22 2.22]);
  322. xticklabels({'YFP','Arch'});
  323. dataforanova=[mean_distance(arc,1) mean_distance(arc,2);mean_distance(yfp,1) mean_distance(yfp,2)];