%% Example of main analysis of raw tracking data, which was slightly modified for each experimental round % Outputs tracking performance and other metrics for each cockroach within % the function out=roachPositionAnalysis(varargin) kymFixBool=1; % If there wasn't a filename input, manually get the file name for analysis % from user if isempty(varargin) [FileName,PathName,~] = uigetfile; fullPath=[PathName FileName]; %Otherwise, if a filename is supplied, use that as path name elseif isequal(class(varargin{1}),'char') fullPath=varargin{1}; FileName=varargin{1}; if length(varargin)>1 oldData=varargin{2}; kymFixBool=0; end end load(fullPath); [firstFrame, cohort] = roachAnalyzeMovieR2(fullPath); dateStart=strfind(FileName,'2015'); dateStr=FileName(dateStart:dateStart+9); numRoaches=size(roachAngles,2); numFrames=size(roachAngles,1); pxConv=0.0132; %cm/px (approximate) fps=7; walkThresh=1; roachAnglesNoNans=roachAngles; roachRadiusNoNans=roachRadius; roachOrientationNoNans=roachOrientation; % heal NaNs by linear interpolation for i=1:numRoaches for t=firstFrame:numFrames if isnan(roachAngles(t,i)) tempVec=roachAnglesNoNans(t:end,i); tempVec=find(~isnan(tempVec)); if numel(tempVec)>0 endPt=tempVec(1); i1=roachAngles(t-1,i); i2=roachAngles(t+endPt-1,i); d1=abs(i2-i1); d2=abs(i2+2*pi()-i1); d3=abs(i2-(i1+2*pi())); dVec=[d1 d2 d3]; if min(dVec)==d1 roachAnglesNoNans(t-1:t+endPt-1,i)=linspace(roachAngles(t-1,i),roachAngles(t+endPt-1,i),endPt+1)'; roachRadiusNoNans(t-1:t+endPt-1,i)=linspace(roachRadius(t-1,i),roachRadius(t+endPt-1,i),endPt+1)'; roachOrientationNoNans(t-1:t+endPt-1,i)=linspace(roachOrientation(t-1,i),roachOrientation(t+endPt-1,i),endPt+1)'; elseif min(dVec)==d2 else end end end end end if kymFixBool %clean up kymograph as needed newKym=roachFixKymograph(kymograph); else newKym=oldData.kymograph; end summary=cell(numRoaches,5); frameSpeeds=zeros(numFrames,numRoaches)+NaN; frameInShadeBool=zeros(numFrames,numRoaches)+NaN; frameSpeedsNoNans=zeros(numFrames,numRoaches)+NaN; frameInShadeBoolNoNans=zeros(numFrames,numRoaches)+NaN; [roachX, roachY]=pol2cart(roachAngles,roachRadius); [roachXNoNans, roachYNoNans]=pol2cart(roachAnglesNoNans,roachRadiusNoNans); socialNetwork=zeros(numRoaches,numRoaches,numFrames); socialNetworkNoNans=zeros(numRoaches,numRoaches,numFrames); for i=1:numRoaches for t=firstFrame:numFrames-1 speedTemp=sqrt( (roachXNoNans(t+1,i)-roachXNoNans(t,i)).^2 + (roachYNoNans(t+1,i)-roachYNoNans(t,i)).^2); frameSpeedsNoNans(t+1,i)=speedTemp*pxConv*fps; if ~isnan(roachAnglesNoNans(t,i)) kymBin=ceil(( (roachAnglesNoNans(t,i)+pi()) * 360/(2*pi()) )/2); frameInShadeBoolNoNans(t,i)=newKym(t,kymBin); if ~isnan(roachAngles(t,i)) frameInShadeBool(t,i)=newKym(t,kymBin); frameSpeeds(t,i)=speedTemp*pxConv*fps; end end end summary{i,1}=dateStr; summary{i,2}=cohort; summary{i,3}=codelist(i); fiveMins=firstFrame:min([firstFrame+fps*300-1 numFrames]); summary{i,4}=nanmean(frameSpeeds(fiveMins,i)); summary{i,5}=nanmean(frameInShadeBool(fiveMins,i)); summary{i,6}=nanmean(frameSpeedsNoNans(fiveMins,i)); summary{i,7}=nanmean(frameInShadeBoolNoNans(fiveMins,i)); summary{i,8}=nanmean(frameSpeeds(firstFrame:end,i)); summary{i,9}=nanmean(frameInShadeBool(firstFrame:end,i)); summary{i,10}=nanmean(frameSpeedsNoNans(firstFrame:end,i)); summary{i,11}=nanmean(frameInShadeBoolNoNans(firstFrame:end,i)); summary{i,12}=sum(isnan(roachAngles(fiveMins,i)))/2100; summary{i,13}=sum(isnan(roachAngles(firstFrame:end,i)))/size(roachAngles(firstFrame:end,i),1); summary{i,14}=nansum(frameSpeeds(firstFrame:end,i)>walkThresh)/sum(~isnan(frameSpeeds(firstFrame:end,i))); summary{i,15}=nansum(frameSpeedsNoNans(firstFrame:end,i)>walkThresh)/sum(~isnan(frameSpeedsNoNans(firstFrame:end,i))); temp=frameSpeeds(firstFrame:end,i); summary{i,16}=nanmean(temp(temp>walkThresh)); temp=frameSpeedsNoNans(firstFrame:end,i); summary{i,17}=nanmean(temp(temp>walkThresh)); for j=1:numRoaches socialNetworkNoNans(i,j,:)=pxConv*sqrt((roachXNoNans(:,i)-roachXNoNans(:,j)).^2+(roachYNoNans(:,i)-roachYNoNans(:,j)).^2); socialNetwork(i,j,:)=pxConv*sqrt((roachX(:,i)-roachX(:,j)).^2+(roachY(:,i)-roachY(:,j)).^2); end end out.summaryLegend={}; out.summaryLegend{1}='date'; out.summaryLegend{2}='cohort name'; out.summaryLegend{3}='roach ID#'; out.summaryLegend{4}='mean speed (cm/s), first 5 minutes, raw data'; out.summaryLegend{5}='fraction time in red, first 5 minutes, raw data'; out.summaryLegend{6}='mean speed (cm/s), first 5 minutes, NaNs filled'; out.summaryLegend{7}='fraction time in red, first 5 minutes, NaNs filled'; out.summaryLegend{8}='mean speed (cm/s), all time points, raw data'; out.summaryLegend{9}='fraction time in red, all time points, raw data'; out.summaryLegend{10}='mean speed (cm/s), all time points, NaNs filled'; out.summaryLegend{11}='fraction time in red, all time points, NaNs filled'; out.summaryLegend{12}='fraction NaNs, first 5 minutes'; out.summaryLegend{13}='fraction NaNs, all time points'; out.summaryLegend{14}='fraction of time moving, raw data'; out.summaryLegend{15}='fraction of time moving, NaNs filled'; out.summaryLegend{16}='speed when walking, raw data'; out.summaryLegend{17}='speed when walking, NaNs filled'; kymoCompare=zeros(numFrames,180,3); kymoCompare(:,:,1)=kymograph; kymoCompare(:,:,2)=newKym; %Plot Kymograph roachKymograph(newKym,roachAngles); out.summary=summary; out.firstFrame=firstFrame; out.fileName=fullPath; out.kymograph=kymograph; out.cleanKymograph=newKym; out.kymoCompare=kymoCompare; out.frameSpeeds=frameSpeeds; out.frameSpeedsNoNans=frameSpeedsNoNans; out.frameInShadeBool=frameInShadeBool; out.frameInShadeBoolNoNans=frameInShadeBoolNoNans; out.roachAngles=roachAngles; out.roachAnglesNoNans=roachAnglesNoNans; out.roachRadius=roachRadius; out.roachRadiusNoNans=roachRadiusNoNans; out.roachOrientation=roachOrientation; out.roachOrientationNoNans=roachOrientationNoNans; out.socialNetwork=socialNetwork; out.socialNetworkNoNans=socialNetworkNoNans; out.meanSocialNetwork=nanmean(socialNetwork,3); out.meanSocialNetworkNoNans=nanmean(socialNetworkNoNans,3);