% Calculate new participant PFI data, outside of catch events. clear all; close all; clc; try cd('/Users/MattDavidson/Desktop/FromIrenes Mac/Real_Experiment/Data Experiment copy/newplots-MD') catch cd('/Users/matthewdavidson/Desktop/FromIrenes Mac/Data Experiment copy/newplots-MD') end basedir=pwd; dbstop if error %% %load data structure % goodppants = [1:3, 7:9, 11:14, 16:27,29]; allppants=1:29; badppants = [8, 15,28, 4 , 7,5 6,10]; allppants(badppants)=[]; % save('MD_AllBP_perppant.mat', 'goodppants', '-append'); load('MD_AllBP_perppant.mat'); %load Catch Performance structure load('Catchperformance.mat') %work with retained participants. fontsize=25; job.removeCatchperiodsfromBPtrace=0; %Three types of analysis (IVs( RMfactors)). Number absent, location absent, and flicker %speed. job.calcPFIdataperNum=0; %resaves into PFI_only with new fields in structure.. job.calcPFIdataperFreqandLoc=0; %resaves into PFI_only with new fields in structure.. job.concatPFIacrossPpants_num=0; job.concatPFIacrossPpants_freqandLoc=0; job.createShufflePFIdata_pernum=0; job.calcPFIdataperNum_shuffled=0; job.concatPFIacrossPpants_num_shuffled=0; %redo the stats. job.RMANOVA_PFI_byNum=1; job.RMANOVA_PFI_byNum_vs_shuffled=0; % export ppant mean to excel file for analysis in JASP. job.exportDatatoExcelfolonDesktop=1; %plot the results for PFI, in separate bar graphs. job.plotBehaviouraldata=0; job.plotBehaviouraldata_num_with_shuffled=0; % supplementary analyses. job.plotPFIdata_asfunctionofTrialNumber=0; %to see if increase in PFI with time on task, by type of PFI. job.concatPpantDurationsbyPFI_num=0; %for plotting histogram of disap durations, by number gone in PFI job.plothistofDisapdurationbynumbergone=0; %see above. job.plothistofDisapdurationbynumbergone_perppants=0; %cut off duration? %% if job.removeCatchperiodsfromBPtrace==1 PFI_only=[]; for ippant=1:29 %do all ppants, just analyze / plot retained, in case we change criteria at some point. BPtmp= ppantTrialDatawithDetails(ippant).AllBPData; catchremovedallBPtmp=BPtmp; for itrial=1:24 %some trials had catch start / end ,yet no actual target removal. if ppantTrialDatawithDetails(ippant).TrialDetails(itrial).TotalCatchTargetsRemoved > 0 %new analysis, replacing the catch target with NaNs, to remove from averaging. catchstart= ppantTrialDatawithDetails(ippant).TrialDetails(itrial).Catchstart_frames; catchend=ppantTrialDatawithDetails(ippant).TrialDetails(itrial).Catchend_frames; for iloc=1:4 switch iloc case 1 %check TL checkloc=ppantTrialDatawithDetails(ippant).TrialDetails(itrial).TL_Catch; case 2 checkloc=ppantTrialDatawithDetails(ippant).TrialDetails(itrial).TR_Catch; case 3 checkloc=ppantTrialDatawithDetails(ippant).TrialDetails(itrial).BL_Catch; case 4 checkloc=ppantTrialDatawithDetails(ippant).TrialDetails(itrial).BR_Catch; end if checkloc==1 %if this BP location contained catch event %convert section of that BP trace to nan nantrain = nan(1,(catchend-catchstart)+1); tmptrace=squeeze(BPtmp(itrial,iloc,:))'; tmptrace(1,catchstart:catchend)=nantrain; catchremovedallBPtmp(itrial,iloc, :)=tmptrace; end end catchdur= ppantTrialDatawithDetails(ippant).TrialDetails(itrial).totalCatchdur; PFI_only(ippant).Trial(itrial).allBPs= squeeze(catchremovedallBPtmp(itrial,:,:)); PFI_only(ippant).Trial(itrial).resultTriallength= length(BPtmp) - catchdur; else PFI_only(ippant).Trial(itrial).allBPs= squeeze(BPtmp(itrial,:,:)); PFI_only(ippant).Trial(itrial).resultTriallength= length(BPtmp); end end end save('PFI_data', 'PFI_only') end %% %% if job.calcPFIdataperNum==1 %% load('PFI_data.mat') %% for ippant = 1:29 for itrial=1:24 allBPtmp= PFI_only(ippant).Trial(itrial).allBPs; accumBP = squeeze(nansum(allBPtmp,1)); %combine each locations BP. dur1Disap=0; %total time PFI dur2Disap=0; dur3Disap=0; %3 or more %tally disappearances. OneTargetDisap=0; TwoTargetDisap=0; ThreeormoreTargetDisap=0; framestamp1_begin=[]; framestamp1_end=[]; framestamp2_begin=[]; framestamp2_end=[]; framestamp3_begin=[]; framestamp3_end=[]; rowis = (itrial+1) + 24*(ippant-1); %6th column is logical index for trial reject if strcmp(catchStruct{rowis,6},'0'); for timeDur=2:(length(accumBP)-1) if accumBP(1,timeDur)==1 %if single button is pressed. if accumBP(1,timeDur-1)~=1 %single button onset if framestamp1_begin>0 framestamp1_begin= [framestamp1_begin, timeDur]; else framestamp1_begin= timeDur; end OneTargetDisap=OneTargetDisap+1; end if accumBP(1,timeDur+1)~=1 || timeDur==length(accumBP)-1 %singlebutton release if framestamp1_end>0 framestamp1_end= [framestamp1_end, timeDur+1]; else framestamp1_end= timeDur+1; end end elseif accumBP(1,timeDur)==2 if accumBP(1,timeDur-1)~=2 %double button onset if framestamp2_begin>0 framestamp2_begin= [framestamp2_begin, timeDur]; else framestamp2_begin= timeDur; end TwoTargetDisap=TwoTargetDisap+1; end if accumBP(1,timeDur+1)~=2 || timeDur==length(accumBP)-1 %singlebutton offset if framestamp2_end>0 framestamp2_end= [framestamp2_end, timeDur+1]; else framestamp2_end= timeDur+1; end end elseif accumBP(1,timeDur)==3 if accumBP(1,timeDur-1)~=3 %double button onset if framestamp3_begin>0 framestamp3_begin= [framestamp3_begin, timeDur]; else framestamp3_begin= timeDur; end ThreeormoreTargetDisap=ThreeormoreTargetDisap+1; end if accumBP(1,timeDur+1)~=3 || timeDur==length(accumBP)-1 %singlebutton offset if framestamp3_end>0 framestamp3_end= [framestamp3_end, timeDur+1]; else framestamp3_end= timeDur+1; end end end end %in case a button was held until the end of a trial, we %need to remove these last disapperances if length(framestamp1_begin) > length(framestamp1_end) %adjust length framestamp1_begin= framestamp1_begin(1:length(framestamp1_end)); OneTargetDisap = length(framestamp1_begin); end %same for 2 and three target instances. if length(framestamp2_begin) > length(framestamp2_end) framestamp2_begin= framestamp2_begin(1:length(framestamp2_end)); TwoTargetDisap = length(framestamp2_begin); end if length(framestamp3_begin) > length(framestamp3_end) framestamp3_begin= framestamp3_begin(1:length(framestamp3_end)); ThreeormoreTargetDisap = length(framestamp3_begin); end alldurs1 = framestamp1_end - framestamp1_begin; alldurs2 = framestamp2_end - framestamp2_begin; alldurs3= framestamp3_end - framestamp3_begin; dur1Disap = sum(alldurs1); dur2Disap = sum(alldurs2); dur3Disap = sum(alldurs3); %store per ppant %mean duration per individual disap (in seconds). PFI_only(ippant).Trial(itrial).meanPFIduration_perdisap_1target = dur1Disap/OneTargetDisap/60; PFI_only(ippant).Trial(itrial).meanPFIduration_perdisap_2target = dur2Disap/TwoTargetDisap/60; PFI_only(ippant).Trial(itrial).meanPFIduration_perdisap_3ormoretarget = dur3Disap/ThreeormoreTargetDisap/60; % total duration per trial (in seconds) PFI_only(ippant).Trial(itrial).PFItotalduration_disap_1target = dur1Disap/60; PFI_only(ippant).Trial(itrial).PFItotalduration_disap_2target = dur2Disap/60; PFI_only(ippant).Trial(itrial).PFItotalduration_disap_3ormoretarget = dur3Disap/60; %frequency of PFI per trial (how many times PFI occurs) PFI_only(ippant).Trial(itrial).PFI_num1target_unadjusted = OneTargetDisap; PFI_only(ippant).Trial(itrial).PFI_num2target_unadjusted = TwoTargetDisap; PFI_only(ippant).Trial(itrial).PFI_num3ormoretarget_unadjusted = ThreeormoreTargetDisap; %record time stamps (in frames) of these events. PFI_only(ippant).Trial(itrial).PFI_disap_1target_framestart= framestamp1_begin; PFI_only(ippant).Trial(itrial).PFI_disap_1target_frameend= framestamp1_end; PFI_only(ippant).Trial(itrial).PFI_disap_1target_durs= alldurs1; PFI_only(ippant).Trial(itrial).PFI_disap_2target_framestart= framestamp2_begin; PFI_only(ippant).Trial(itrial).PFI_disap_2target_frameend= framestamp2_end; PFI_only(ippant).Trial(itrial).PFI_disap_2target_durs= alldurs2; PFI_only(ippant).Trial(itrial).PFI_disap_3ormoretarget_framestart= framestamp3_begin; PFI_only(ippant).Trial(itrial).PFI_disap_3ormoretarget_frameend= framestamp3_end; PFI_only(ippant).Trial(itrial).PFI_disap_3ormoretarget_durs= alldurs3; %collect PFI_only(ippant).Trial(itrial).Goodtrial=1; else PFI_only(ippant).Trial(itrial).Goodtrial=0; end end end save('PFI_data', 'PFI_only') end %% if job.calcPFIdataperFreqandLoc==1 %% load('PFI_data.mat') %% for ippant = 1:29 for itrial=1:24 allBPtmp= PFI_only(ippant).Trial(itrial).allBPs; rowis = (itrial+1) + 24*(ippant-1); %6th column is logical index for trial reject if strcmp(catchStruct{rowis,6},'0'); for iloc=1:4 switch iloc case 1 freq=ppantTrialDatawithDetails(ippant).TrialDetails(itrial).TL_Freq; case 2 freq=ppantTrialDatawithDetails(ippant).TrialDetails(itrial).TR_Freq; case 3 freq=ppantTrialDatawithDetails(ippant).TrialDetails(itrial).BL_Freq; case 4 freq=ppantTrialDatawithDetails(ippant).TrialDetails(itrial).BR_Freq; end %channel for certain location. BPuse = allBPtmp(iloc,:); %collect stats. %only dealing with single button disaps. dur1Disap=0; %total time PFI OneTargetDisap=0; framestamp1_begin=[]; framestamp1_end=[]; for timeDur=2:(length(BPuse)-1) if BPuse(1,timeDur)==1 if BPuse(1,timeDur-1)~=1 %single button onset if framestamp1_begin>0 framestamp1_begin= [framestamp1_begin, timeDur]; else framestamp1_begin= timeDur; end OneTargetDisap=OneTargetDisap+1; end if BPuse(1,timeDur+1)~=1 || timeDur==length(BPuse)-1 %singlebutton offset if framestamp1_end>0 framestamp1_end= [framestamp1_end, timeDur+1]; else framestamp1_end= timeDur+1; end end end end % %in case a button was held until the end of a trial, we % %need to remove these last disapperances if length(framestamp1_begin) > length(framestamp1_end) %adjust length framestamp1_begin= framestamp1_begin(1:length(framestamp1_end)); OneTargetDisap = length(framestamp1_begin); end alldurs1 = framestamp1_end - framestamp1_begin; dur1Disap = sum(alldurs1); % %include filter in case these disaps are very short, ie % %transits not real data. % skipdis = []; % for ich = 1:length(alldurs1) % % if alldurs1(ich)<30 %frames half second. % skipdis= [skipdis, ich]; % end % end % switch iloc case 1 PFI_only(ippant).Trial(itrial).meanPFIduration_perdisap_1target_TL = dur1Disap/60/OneTargetDisap; PFI_only(ippant).Trial(itrial).PFItotalduration_disap_1target_TL = dur1Disap/60; PFI_only(ippant).Trial(itrial).PFI_num1target_unadjusted_TL = OneTargetDisap; PFI_only(ippant).Trial(itrial).PFI_disap_1target_durs_TL= alldurs1; PFI_only(ippant).Trial(itrial).PFI_disap_1target_TL_framestart= framestamp1_begin; PFI_only(ippant).Trial(itrial).PFI_disap_1target_TL_frameend= framestamp1_end; case 2 PFI_only(ippant).Trial(itrial).meanPFIduration_perdisap_1target_TR = dur1Disap/60/OneTargetDisap; PFI_only(ippant).Trial(itrial).PFItotalduration_disap_1target_TR = dur1Disap/60; PFI_only(ippant).Trial(itrial).PFI_num1target_unadjusted_TR = OneTargetDisap; PFI_only(ippant).Trial(itrial).PFI_disap_1target_durs_TR= alldurs1; PFI_only(ippant).Trial(itrial).PFI_disap_1target_TR_framestart= framestamp1_begin; PFI_only(ippant).Trial(itrial).PFI_disap_1target_TR_frameend= framestamp1_end; case 3 PFI_only(ippant).Trial(itrial).meanPFIduration_perdisap_1target_BL = dur1Disap/60/OneTargetDisap; PFI_only(ippant).Trial(itrial).PFItotalduration_disap_1target_BL = dur1Disap/60; PFI_only(ippant).Trial(itrial).PFI_num1target_unadjusted_BL = OneTargetDisap; PFI_only(ippant).Trial(itrial).PFI_disap_1target_durs_BL= alldurs1; PFI_only(ippant).Trial(itrial).PFI_disap_1target_BL_framestart= framestamp1_begin; PFI_only(ippant).Trial(itrial).PFI_disap_1target_BL_frameend= framestamp1_end; case 4 PFI_only(ippant).Trial(itrial).meanPFIduration_perdisap_1target_BR = dur1Disap/60/OneTargetDisap; PFI_only(ippant).Trial(itrial).PFItotalduration_disap_1target_BR = dur1Disap/60; PFI_only(ippant).Trial(itrial).PFI_num1target_unadjusted_BR = OneTargetDisap; PFI_only(ippant).Trial(itrial).PFI_disap_1target_durs_BR= alldurs1; PFI_only(ippant).Trial(itrial).PFI_disap_1target_BR_framestart= framestamp1_begin; PFI_only(ippant).Trial(itrial).PFI_disap_1target_BR_frameend= framestamp1_end; end % %collect PFI_only(ippant).Trial(itrial).Goodtrial=1; end PFI_only(ippant).Trial(itrial).TL_Freq= ppantTrialDatawithDetails(ippant).TrialDetails(itrial).TL_Freq; PFI_only(ippant).Trial(itrial).TR_Freq= ppantTrialDatawithDetails(ippant).TrialDetails(itrial).TR_Freq; PFI_only(ippant).Trial(itrial).BL_Freq= ppantTrialDatawithDetails(ippant).TrialDetails(itrial).BL_Freq; PFI_only(ippant).Trial(itrial).BR_Freq= ppantTrialDatawithDetails(ippant).TrialDetails(itrial).BR_Freq; %%%%% also new combination comparing Left/Right and %%%%% Up/Down. for iloc=1:4 end else PFI_only(ippant).Trial(itrial).Goodtrial=0; end end end save('PFI_data', 'PFI_only') end %% %% if job.concatPFIacrossPpants_num==1 load('PFI_data') Freq_NumPFI_acrossTrials = nan(29,24,3); mDurperNumPFI_acrossTrials=nan(29,24,3); totalDurperNumPFI_acrossTrials=nan(29,24,3); for ippant = 1:29 for itrial=1:24 if PFI_only(ippant).Trial(itrial).Goodtrial==1 %not rejected usedata=PFI_only(ippant).Trial(itrial); %single targets first Freq_NumPFI_acrossTrials(ippant,itrial,1) = usedata.PFI_num1target_unadjusted; mDurperNumPFI_acrossTrials(ippant,itrial,1)=usedata.meanPFIduration_perdisap_1target; totalDurperNumPFI_acrossTrials(ippant,itrial,1)=usedata.PFItotalduration_disap_1target; %double Freq_NumPFI_acrossTrials(ippant,itrial,2) = usedata.PFI_num2target_unadjusted; mDurperNumPFI_acrossTrials(ippant,itrial,2)=usedata.meanPFIduration_perdisap_2target; totalDurperNumPFI_acrossTrials(ippant,itrial,2)=usedata.PFItotalduration_disap_2target; %'2 or more' Freq_NumPFI_acrossTrials(ippant,itrial,3) = usedata.PFI_num3ormoretarget_unadjusted; mDurperNumPFI_acrossTrials(ippant,itrial,3)=usedata.meanPFIduration_perdisap_3ormoretarget; totalDurperNumPFI_acrossTrials(ippant,itrial,3)=usedata.PFItotalduration_disap_3ormoretarget; end end end save('PFI_data_concat', 'Freq_NumPFI_acrossTrials', 'mDurperNumPFI_acrossTrials', 'totalDurperNumPFI_acrossTrials') end %% if job.concatPFIacrossPpants_freqandLoc==1 load('PFI_data_concat') %sort by flicker frequency of target Freq_FreqPFI_acrossTrials = nan(29,24,4); mDurperFreqPFI_acrossTrials=nan(29,24,4); totalDurperFreqPFI_acrossTrials=nan(29,24,4); %and location Freq_LocPFI_acrossTrials = nan(29,24,4); mDurperLocPFI_acrossTrials=nan(29,24,4); totalDurperLocPFI_acrossTrials=nan(29,24,4); for ippant = 1:29 for itrial=1:24 if PFI_only(ippant).Trial(itrial).Goodtrial==1 %not rejected usedata=PFI_only(ippant).Trial(itrial); %location is easy, store first, Freq_LocPFI_acrossTrials(ippant,itrial,1) = usedata.PFI_num1target_unadjusted_TL; Freq_LocPFI_acrossTrials(ippant,itrial,2) = usedata.PFI_num1target_unadjusted_TR; Freq_LocPFI_acrossTrials(ippant,itrial,3) = usedata.PFI_num1target_unadjusted_BL; Freq_LocPFI_acrossTrials(ippant,itrial,4) = usedata.PFI_num1target_unadjusted_BR; mDurperLocPFI_acrossTrials(ippant,itrial,1)=usedata.meanPFIduration_perdisap_1target_TL; mDurperLocPFI_acrossTrials(ippant,itrial,2)=usedata.meanPFIduration_perdisap_1target_TR; mDurperLocPFI_acrossTrials(ippant,itrial,3)=usedata.meanPFIduration_perdisap_1target_BL; mDurperLocPFI_acrossTrials(ippant,itrial,4)=usedata.meanPFIduration_perdisap_1target_BR; totalDurperLocPFI_acrossTrials(ippant,itrial, 1)=usedata.PFItotalduration_disap_1target_TL; totalDurperLocPFI_acrossTrials(ippant,itrial, 2)=usedata.PFItotalduration_disap_1target_TR; totalDurperLocPFI_acrossTrials(ippant,itrial, 3)=usedata.PFItotalduration_disap_1target_BL; totalDurperLocPFI_acrossTrials(ippant,itrial, 4)=usedata.PFItotalduration_disap_1target_BR; %Now determine correct frequency for each location, before storage. %rank locations. locswas = [usedata.TL_Freq, usedata.TR_Freq, usedata.BL_Freq, usedata.BR_Freq]; %8Hz first, find the index in Location order, for %appropriate frequency. for ifreq=1:4 switch ifreq case 1 ind= find(locswas==8); case 2 ind= find(locswas==13); case 3 ind= find(locswas==15); case 4 ind= find(locswas==18); end Freq_FreqPFI_acrossTrials(ippant,itrial,ifreq) = Freq_LocPFI_acrossTrials(ippant,itrial,ind); mDurperFreqPFI_acrossTrials(ippant,itrial,ifreq)=mDurperLocPFI_acrossTrials(ippant,itrial,ind); totalDurperFreqPFI_acrossTrials(ippant,itrial, ifreq)=totalDurperLocPFI_acrossTrials(ippant,itrial, ind); end end end end save('PFI_data_concat', 'Freq_FreqPFI_acrossTrials',... 'Freq_LocPFI_acrossTrials',... 'mDurperFreqPFI_acrossTrials',... 'mDurperLocPFI_acrossTrials',... 'totalDurperFreqPFI_acrossTrials',... 'totalDurperLocPFI_acrossTrials','-append') end %% based on IG's code (reshuffle_analysis) if job.createShufflePFIdata_pernum==1 load('MD_AllBP_perppant.mat') allRandomAllPP =zeros(length(allppants),200,5,3600); for ippant=1:length(allppants) goodPP=allppants(ippant); cd(basedir) BPdata=ppantTrialDatawithDetails(goodPP).AllBPData; allRandom = zeros(200,5, 3600); for countRand=1:200 %index of four random trials. randTrial=randi([1 24],1,4); %make sure none are the same: while length(unique(randTrial))<4 randTrial=randi([1 24],1,4); end %take a location on screen from separate trials, and concatenate. plotTable(1,:)=BPdata(randTrial(1),1,:); plotTable(2,:)=BPdata(randTrial(2),2,:); plotTable(3,:)=BPdata(randTrial(3),3,:); plotTable(4,:)=BPdata(randTrial(4),4,:); %accumulative sum plotTable(5,:)=sum(plotTable(1:4,:),1); allRandom(countRand,:,:)= plotTable; end allRandomAllPP(ippant,:,:,:)=allRandom; end save('ShuffledData', 'allRandomAllPP') %% end if job.calcPFIdataperNum_shuffled==1 %resaves into ShuffledData cd(basedir) load('ShuffledData') for ippant = 1:size(allRandomAllPP,1) for itrial=1:200 accumBP = squeeze(allRandomAllPP(ippant,itrial,5,:))'; %combine each locations BP. dur1Disap=0; %total time PFI dur2Disap=0; dur3Disap=0; %3 or more OneTargetDisap=0; TwoTargetDisap=0; ThreeormoreTargetDisap=0; framestamp1_begin=[]; framestamp1_end=[]; framestamp2_begin=[]; framestamp2_end=[]; framestamp3_begin=[]; framestamp3_end=[]; for timeDur=2:(length(accumBP)-1) if accumBP(1,timeDur)==1 if accumBP(1,timeDur-1)~=1 %single button onset if framestamp1_begin>0 framestamp1_begin= [framestamp1_begin, timeDur]; else framestamp1_begin= timeDur; end OneTargetDisap=OneTargetDisap+1; end if accumBP(1,timeDur+1)~=1 || timeDur==length(accumBP)-1 %singlebutton offset if framestamp1_end>0 framestamp1_end= [framestamp1_end, timeDur+1]; else framestamp1_end= timeDur+1; end end elseif accumBP(1,timeDur)==2 if accumBP(1,timeDur-1)~=2 %double button onset if framestamp2_begin>0 framestamp2_begin= [framestamp2_begin, timeDur]; else framestamp2_begin= timeDur; end TwoTargetDisap=TwoTargetDisap+1; end if accumBP(1,timeDur+1)~=2 || timeDur==length(accumBP)-1 %singlebutton offset if framestamp2_end>0 framestamp2_end= [framestamp2_end, timeDur+1]; else framestamp2_end= timeDur+1; end end elseif accumBP(1,timeDur)==3 if accumBP(1,timeDur-1)~=3 %double button onset if framestamp3_begin>0 framestamp3_begin= [framestamp3_begin, timeDur]; else framestamp3_begin= timeDur; end ThreeormoreTargetDisap=ThreeormoreTargetDisap+1; end if accumBP(1,timeDur+1)~=3 || timeDur==length(accumBP)-1 %singlebutton offset if framestamp3_end>0 framestamp3_end= [framestamp3_end, timeDur+1]; else framestamp3_end= timeDur+1; end end end end %in case a button was held until the end of a trial, we %need to remove these last disapperances if length(framestamp1_begin) > length(framestamp1_end) %adjust length framestamp1_begin= framestamp1_begin(1:length(framestamp1_end)); OneTargetDisap = length(framestamp1_begin); end %same for 2 and three target instances. if length(framestamp2_begin) > length(framestamp2_end) framestamp2_begin= framestamp2_begin(1:length(framestamp2_end)); TwoTargetDisap = length(framestamp2_begin); end if length(framestamp3_begin) > length(framestamp3_end) framestamp3_begin= framestamp3_begin(1:length(framestamp3_end)); ThreeormoreTargetDisap = length(framestamp3_begin); end alldurs1 = framestamp1_end - framestamp1_begin; alldurs2 = framestamp2_end - framestamp2_begin; alldurs3= framestamp3_end - framestamp3_begin; dur1Disap = sum(alldurs1); dur2Disap = sum(alldurs2); dur3Disap = sum(alldurs3); %store per ppant %mean duration per individual disap (in seconds). shuffledPFI(ippant).Trial(itrial).meanPFIduration_perdisap_1target = dur1Disap/60/OneTargetDisap; shuffledPFI(ippant).Trial(itrial).meanPFIduration_perdisap_2target = dur2Disap/60/TwoTargetDisap; shuffledPFI(ippant).Trial(itrial).meanPFIduration_perdisap_3ormoretarget = dur3Disap/60/ThreeormoreTargetDisap; % total duration per trial (in seconds) shuffledPFI(ippant).Trial(itrial).PFItotalduration_disap_1target = dur1Disap/60; shuffledPFI(ippant).Trial(itrial).PFItotalduration_disap_2target = dur2Disap/60; shuffledPFI(ippant).Trial(itrial).PFItotalduration_disap_3ormoretarget = dur3Disap/60; %frequency of PFI per trial (how many times PFI occurs) shuffledPFI(ippant).Trial(itrial).PFI_num1target_unadjusted = OneTargetDisap; shuffledPFI(ippant).Trial(itrial).PFI_num2target_unadjusted = TwoTargetDisap; shuffledPFI(ippant).Trial(itrial).PFI_num3ormoretarget_unadjusted = ThreeormoreTargetDisap; %record time stamps (in frames) of these events. shuffledPFI(ippant).Trial(itrial).PFI_disap_1target_framestart= framestamp1_begin; shuffledPFI(ippant).Trial(itrial).PFI_disap_1target_frameend= framestamp1_end; shuffledPFI(ippant).Trial(itrial).PFI_disap_1target_durs= alldurs1; shuffledPFI(ippant).Trial(itrial).PFI_disap_2target_framestart= framestamp2_begin; shuffledPFI(ippant).Trial(itrial).PFI_disap_2target_frameend= framestamp2_end; shuffledPFI(ippant).Trial(itrial).PFI_disap_2target_durs= alldurs2; shuffledPFI(ippant).Trial(itrial).PFI_disap_3ormoretarget_framestart= framestamp3_begin; shuffledPFI(ippant).Trial(itrial).PFI_disap_3ormoretarget_frameend= framestamp3_end; shuffledPFI(ippant).Trial(itrial).PFI_disap_3ormoretarget_durs= alldurs3; %collect shuffledPFI(ippant).Trial(itrial).Goodtrial=1; end end save('ShuffledData', 'shuffledPFI', '-append') end if job.concatPFIacrossPpants_num_shuffled==1 cd(basedir) load('ShuffledData') Freq_NumPFI_acrossTrials_shuffled = nan(length(allppants),200,3); mDurperNumPFI_acrossTrials_shuffled=nan(length(allppants),200,3); totalDurperNumPFI_acrossTrials_shuffled=nan(length(allppants),200,3); for ippant = 1:length(shuffledPFI) for itrial=1:200 if shuffledPFI(ippant).Trial(itrial).Goodtrial==1 %not rejected usedata=shuffledPFI(ippant).Trial(itrial); %single targets first Freq_NumPFI_acrossTrials_shuffled(ippant,itrial,1) = usedata.PFI_num1target_unadjusted; mDurperNumPFI_acrossTrials_shuffled(ippant,itrial,1)=usedata.meanPFIduration_perdisap_1target; totalDurperNumPFI_acrossTrials_shuffled(ippant,itrial,1)=usedata.PFItotalduration_disap_1target; %double Freq_NumPFI_acrossTrials_shuffled(ippant,itrial,2) = usedata.PFI_num2target_unadjusted; mDurperNumPFI_acrossTrials_shuffled(ippant,itrial,2)=usedata.meanPFIduration_perdisap_2target; totalDurperNumPFI_acrossTrials_shuffled(ippant,itrial,2)=usedata.PFItotalduration_disap_2target; %'2 or more' Freq_NumPFI_acrossTrials_shuffled(ippant,itrial,3) = usedata.PFI_num3ormoretarget_unadjusted; mDurperNumPFI_acrossTrials_shuffled(ippant,itrial,3)=usedata.meanPFIduration_perdisap_3ormoretarget; totalDurperNumPFI_acrossTrials_shuffled(ippant,itrial,3)=usedata.PFItotalduration_disap_3ormoretarget; end end end save('ShuffledData', 'Freq_NumPFI_acrossTrials_shuffled', 'mDurperNumPFI_acrossTrials_shuffled', 'totalDurperNumPFI_acrossTrials_shuffled', '-append') end %% Plot Behavioural output. if job.plotBehaviouraldata ==1 cd(basedir) load('PFI_data_concat') cd('Figures') cd('Behavioural Bar Plots') for iIV=1:2 switch iIV case 1 %look at frequency of target flicker p1= Freq_FreqPFI_acrossTrials; p2= mDurperFreqPFI_acrossTrials; p3= totalDurperFreqPFI_acrossTrials; xlabelis = 'Flicker frequency of absent target'; xticks = [{'8Hz'} {'13Hz'}, {'15Hz'}, {'18Hz'}]; case 2 %look at mean duration of disappearance per trial. p1= Freq_LocPFI_acrossTrials; p2= mDurperLocPFI_acrossTrials; p3= totalDurperLocPFI_acrossTrials; xlabelis = 'Location of absent target'; xticks = [{'TL'} {'TR'}, {'BL'}, {'BR'}]; case 3 p1= Freq_NumPFI_acrossTrials; p2= mDurperNumPFI_acrossTrials; p3= totalDurperNumPFI_acrossTrials; xlabelis = 'Number of targets absent'; xticks = [{'1'} {'2'}, {'3'}]; end clf for iDV=1:3 %take mean within, then across ppants. %within subplot(1,3,iDV) switch iDV case 1 datatoplot=p1; yis='Instances of PFI per trial'; case 2 datatoplot=p2; yis='Mean duration per PFI'; case 3 datatoplot=p3; yis= 'Total PFI duration per trial'; end %only look at good ppants. datanow1=squeeze(datatoplot(allppants,:,:)); datanow=squeeze(nanmean(datanow1,2)); % calculate error bars according to %confidence interval for within subj designs. (Cousineau, %2005) % y = x - mXsub + mXGroup, x = datanow; mXppant =squeeze( mean(x,2)); %mean across conditions we are comparing (within ppant ie. RMfactors) mXgroup = mean(mean(mXppant)); %mean overall (remove b/w sub differences %for each observation, subjtract the subj average, add %the group average. NEWdata = x - repmat(mXppant, 1,size(x,2)) + repmat(mXgroup, size(x)); % mean to plot mData = squeeze(nanmean(NEWdata,1)); %compute stErr %which version? stErr = std(NEWdata)/sqrt(size(datanow,1)); % bar(mData) hold on xis=1:length(mData); errorbar(xis,mData,stErr, 'LineStyle', ['none'],'linewidth', 2 ) % title(['PFI data by ' xlabelis], 'fontsize', fontsize) axis('tight') switch iDV case 1 ylabel([yis]); ylimsa=[0 6]; set(gca, 'ytick', [0:1:ylimsa(2)]) case 2 ylabel({[yis ' [secs]']}); % ylimsa=[0 22]; set(gca, 'ytick', [0:1:ylimsa(2)]) case 3 ylabel({[yis ' [secs]']}); ylimsa=[0 22]; set(gca, 'ytick', [0:2:ylimsa(2)]) end axis tight ylim([ylimsa]) set(gca, 'xticklabel', xticks) set(gca, 'fontsize', fontsize) end printfilename = ['PFI data by ' xlabelis]; set(gcf, 'color', 'w') print('-dpng', printfilename) end end if job.plotBehaviouraldata_num_with_shuffled==1 %slim version of the above. cd(basedir) load('PFI_data_concat') load('ShuffledData') cd('Figures') cd('Behavioural Bar Plots') for iIV=2 switch iIV case 1 %look at frequency of target flicker p1= Freq_FreqPFI_acrossTrials; p2= mDurperFreqPFI_acrossTrials; p3= totalDurperFreqPFI_acrossTrials; xlabelis = 'Flicker frequency of absent target'; xticks = [{'8Hz'} {'13Hz'}, {'15Hz'}, {'18Hz'}]; case 2 %compare shuffled to number absent p1= Freq_NumPFI_acrossTrials; p2= mDurperNumPFI_acrossTrials; p3= totalDurperNumPFI_acrossTrials; xlabelis = 'Number of targets absent'; xticks = [{'1'} {'2'}, {'3'}]; % allocate shuffled data. s1=Freq_NumPFI_acrossTrials_shuffled; s2= mDurperNumPFI_acrossTrials_shuffled; s3= totalDurperNumPFI_acrossTrials_shuffled; case 3 %compare location p1= Freq_LocPFI_acrossTrials; p2= mDurperLocPFI_acrossTrials; p3= totalDurperLocPFI_acrossTrials; xlabelis = 'Location of absent target'; xticks = [{'TL'} {'TR'}, {'BL'}, {'BR'}]; end clf for iDV=1:3 %take mean within, then across ppants. %within subplot(1,3,iDV) switch iDV case 1 datatoplot=p1; shuffledtoplot=s1; yis='Instances of PFI per trial'; case 2 datatoplot=p2; shuffledtoplot=s2; yis='Mean duration per PFI'; case 3 datatoplot=p3; shuffledtoplot=s3; yis= 'Total PFI duration per trial'; end %% %only look at good ppants. datanowreal=squeeze(nanmean(datatoplot(allppants,:,:),2)); datanowshuffled=squeeze(nanmean(shuffledtoplot,2)); %across mDataReal=squeeze(nanmean(datanowreal,1)); mDataShuff=squeeze(nanmean(datanowshuffled,1)); %rearrange for plots mData = [mDataReal(1,1), mDataShuff(1,1); mDataReal(1,2), mDataShuff(1,2); mDataReal(1,3), mDataShuff(1,3)]; %standard err m for id=1:2 switch id case 1 x=datanowreal; case 2 x=datanowshuffled; end mXppant =squeeze( mean(x,2)); %mean across conditions we are comparing (within ppant ie. RMfactors) mXgroup = mean(mean(mXppant)); %mean overall (remove b/w sub differences %for each observation, subjtract the subj average, add %the group average. NEWdata = x - repmat(mXppant, 1,size(x,2)) + repmat(mXgroup, size(x)); stErr = std(NEWdata)/sqrt(size(x,1)); switch id case 1 stErrReal = stErr; case 2 stErrShuffled= stErr; end end stErr=[stErrReal(1), stErrShuffled(1);stErrReal(2), stErrShuffled(2);stErrReal(3), stErrShuffled(3) ]; % bar(mData); %% hold on offset=.15; xis=[1-offset, 1+offset; 2-offset, 2+offset; 3-offset,3+offset]; errorbar(xis,mData,stErr,'linestyle', ['none'], 'linewidth', 2 ) %% legend 'Real' 'Shuffled' axis('tight') switch iDV case 1 ylabel([yis]); ylimsa=[0 12]; set(gca, 'ytick', [0:1:ylimsa(2)]) case 2 ylabel({[yis ' [secs]']}); ylimsa=[0 3]; set(gca, 'ytick', [0:1:ylimsa(2)]) case 3 ylabel({[yis ' [secs]']}); ylimsa=[0 20]; set(gca, 'ytick', [0:2:ylimsa(2)]) end axis tight ylim([ylimsa]) set(gca, 'xticklabel', xticks) set(gca, 'fontsize', fontsize) xlabel(xlabelis) end end %% set(gcf, 'color', 'w') printfilename = ['PFI data by ' xlabelis ' shuffled']; print('-dpng', printfilename) end %% Now the stats for the PFI data if job.RMANOVA_PFI_byNum==1 cd(basedir) %load relevant data load('PFI_data') for itest = 1:9 clearvars 'DV*' 'subjects' 'factorarray' switch itest case 1 data= Freq_NumPFI_acrossTrials; DVis='Instances of PFI'; IV = 'Number_absent'; case 2 data= mDurperNumPFI_acrossTrials; DVis='Mean duration per PFI'; IV = 'Number_absent'; case 3 data= totalDurperNumPFI_acrossTrials; DVis = 'Total PFI per trial'; IV = 'Number_absent'; case 4 data= Freq_FreqPFI_acrossTrials; DVis='Instances of PFI'; IV = 'Frequency_flicker'; case 5 data= mDurperFreqPFI_acrossTrials; DVis='Mean duration per PFI'; IV = 'Frequency_flicker'; case 6 data= totalDurperFreqPFI_acrossTrials; DVis = 'Total PFI per trial'; IV = 'Frequency_flicker'; case 7 data= Freq_LocPFI_acrossTrials; DVis='Instances of PFI'; IV = 'Location_absent'; case 8 data= mDurperLocPFI_acrossTrials; DVis='Mean duration per PFI'; IV = 'Location_absent'; case 9 data= totalDurperLocPFI_acrossTrials; DVis = 'Total PFI per trial'; IV = 'Location_absent'; end %% take mean within ppants, testd= squeeze(nanmean(data(goodppants,:,:),2)); %reshape to single column for JvB rmanova DV = reshape(testd, [size(testd,1)*size(testd,2),1]); %JvB rmanova can't handle nan, so find and replace with zero. nanis = find(isnan(DV)); DV(nanis)=0; %create identifers factorarray = zeros(size(DV,1),1); %first denote ppants nppants = 1:size(testd,1); % place in column subjects=repmat(nppants', [size(testd,2), 1]); %factor array for conds (can be 3 or 4 depending on IV). for icond=1:size(testd,2) %% conds= zeros(1, length(nppants))' + icond; %place correctly rows=nppants + (length(nppants)*(icond-1)); factorarray(rows,1)=conds; end %% % rmanova_return = rmanova(data,factorarray,subjects [,varnames] [,btw_ss_col]) rmanova_results = rmanova(DV, factorarray, subjects, { num2str(IV)}); switch itest case 1 anova_FreqbyNumPFI=rmanova_results; case 2 anova_mDurbyNumPFI=rmanova_results; case 3 anova_totalDurbyNumPFI=rmanova_results; case 4 anova_FreqbyFreqPFI=rmanova_results; case 5 anova_mDurbyFreqPFI=rmanova_results; case 6 anova_totalDurbyFreqPFI=rmanova_results; case 7 anova_FreqbyLocPFI=rmanova_results; case 8 anova_mDurbyLocPFI=rmanova_results; case 9 anova_totalDurbyLocPFI=rmanova_results; end end save('PFI_data_rmANOVAresults',... 'anova_FreqbyFreqPFI',... 'anova_FreqbyLocPFI',... 'anova_FreqbyNumPFI',... 'anova_mDurbyFreqPFI',... 'anova_mDurbyLocPFI',... 'anova_mDurbyNumPFI',... 'anova_totalDurbyFreqPFI',... 'anova_totalDurbyLocPFI',... 'anova_totalDurbyNumPFI') end if job.RMANOVA_PFI_byNum_vs_shuffled==1 cd(basedir) %load relevant data load('PFI_data') load('Shuffleddata') load('MD_AllBP_perppant.mat', 'goodppants') for itest = 1:3 clearvars 'DV*' 'subjects' 'factorarray' switch itest case 1 data1= Freq_NumPFI_acrossTrials; data2=Freq_NumPFI_acrossTrials_shuffled; DVis='Instances of PFI'; IV = 'Number_absent'; case 2 data1= mDurperNumPFI_acrossTrials; data2= mDurperNumPFI_acrossTrials_shuffled; DVis='Mean duration per PFI'; IV = 'Number_absent'; case 3 data1= totalDurperNumPFI_acrossTrials; data2= totalDurperNumPFI_acrossTrials_shuffled; DVis = 'Total PFI per trial'; IV = 'Number_absent'; end %% take mean within ppants, testd_real= squeeze(nanmean(data1(goodppants,:,:),2)); testd_shuff= squeeze(nanmean(data2,2)); %only have shuffled for goodppants. %reshape to single column for JvB rmanova DV1 = reshape(testd_real, [size(testd_real,1)*size(testd_real,2),1]); DV2 = reshape(testd_shuff, [size(testd_shuff,1)*size(testd_shuff,2),1]); DV=[DV1;DV2]; %JvB rmanova can't handle nan, so find and replace with zero. nanis = find(isnan(DV)); DV(nanis)=0; %create identifers factorarray = zeros(size(DV,1),2); %first denote ppants nppants = 1:size(testd_real,1); % place in column subjects=repmat(nppants', [size(testd_real,2)*2, 1]); %factor array for conds . First column for number absent. for icond=1:size(testd_real,2) %% conds= zeros(1, length(nppants))' + icond; %place correctly rows=nppants + (length(nppants)*(icond-1)); factorarray(rows,1)=conds; end %% %second column for datatype factorarray(1:78,2)=ones(78,1); %extend (rough hack) factorarray(79:end,1)=factorarray(1:78,1); factorarray(79:end,2)=[ones(78,1)]*2; %% % rmanova_return = rmanova(data,factorarray,subjects [,varnames] [,btw_ss_col]) rmanova_results = rmanova(DV, factorarray, subjects, { num2str(IV) 'datatype'}, 2); switch itest case 1 anova_FreqbyNumPFI_vsshuffled=rmanova_results; case 2 anova_mDurbyNumPFI_vsshuffled=rmanova_results; case 3 anova_totalDurbyNumPFI_vsshuffled=rmanova_results; end end save('PFI_data_rmANOVAresults',... 'anova_FreqbyNumPFI_vsshuffled',... 'anova_mDurbyNumPFI_vsshuffled',... 'anova_totalDurbyNumPFI_vsshuffled', '-append') % % end %% Supplementary analyses. if job.plotPFIdata_asfunctionofTrialNumber==1 load('PFI_data') for datatype=1:3 switch datatype case 1 datais= Freq_NumPFI_acrossTrials; titleis= 'Instances of PFI per trial, across participants'; yvec = [0 15]; ylab = 'Number per trial (#)'; case 2 datais= mDurperNumPFI_acrossTrials; titleis= 'mean duration of each PFI instance, each trial, across participants'; ylab = 'Individual PFI duration per trial (s)'; case 3 datais= totalDurperNumPFI_acrossTrials; titleis= 'Total Duration of PFI, each trial, across participants'; ylab = 'Total PFI duration per trial (s)'; end % squeeze per num of targets missing. clf for numt=1:3 switch numt case 1 col= 'b'; caseis = ' for single targets'; case 2 col= 'k'; caseis = ' for two targets'; case 3 col='r'; caseis = ' for three (or more) targets'; end %% plotme = squeeze(datais(goodppants,:,numt)); errplotme = nanstd(plotme)/sqrt(size(plotme,1)); % plot([itrial itrial], nanmean(plotme), ['r' '*']) % bar(itrial, nanmean(plotme)) hold on errorbar(1:24, nanmean(plotme), errplotme , [ col '-*']); end %% xt=set(gca, 'xtick', [1:24]); xlabel('Trial Number', 'fontsize', fontsize) title(titleis, 'fontsize', fontsize); ylim(yvec) ylabel(ylab, 'fontsize', fontsize) legend 'for single target' 'for two targets' 'for three (or more) targets') set(gca, 'fontsize', fontsize) %% print('-dpng', [titleis ]) %% end end %% if job.concatPpantDurationsbyPFI_num==1 load('PFI_data') PFIdurations_struct=[]; counter=1; allsingle=[]; alldouble=[]; alltriple=[]; for ippant = goodppants ppantstruct=[]; for itrial = 1:24 %calculate durations and save if itrial==1 ppantstruct.singleDisaps = PFI_only(ippant).Trial(itrial).PFI_disap_1target_durs; ppantstruct.doubleDisaps = PFI_only(ippant).Trial(itrial).PFI_disap_2target_durs; ppantstruct.tripleDisaps = PFI_only(ippant).Trial(itrial).PFI_disap_3ormoretarget_durs; else ppantstruct.singleDisaps = [ppantstruct.singleDisaps, PFI_only(ippant).Trial(itrial).PFI_disap_1target_durs]; ppantstruct.doubleDisaps = [ppantstruct.doubleDisaps, PFI_only(ippant).Trial(itrial).PFI_disap_2target_durs]; ppantstruct.tripleDisaps = [ppantstruct.tripleDisaps, PFI_only(ippant).Trial(itrial).PFI_disap_3ormoretarget_durs]; end allsingle = [ allsingle , ppantstruct.singleDisaps]; alldouble = [ alldouble , ppantstruct.doubleDisaps]; alltriple = [ alltriple , ppantstruct.tripleDisaps]; end PFIdurations_struct(counter).dursperppant=ppantstruct; counter=counter+1; end PFIdurations_allSingle=allsingle; PFIdurations_allDouble=alldouble; PFIdurations_allTriple=alltriple; %% save('PFI_data.mat', 'PFIdurations_struct', 'PFIdurations_allSingle','PFIdurations_allDouble', 'PFIdurations_allTriple' , '-append') end %% if job.plothistofDisapdurationbynumbergone==1 %plot histogram of disapperances by numer of targets PFI. load('PFI_data.mat') for itarg=1:3 switch itarg case 1 usedata=PFIdurations_allSingle/60; col='b'; printname='Distribution of the duration of Single target Disappearances'; case 2 usedata=PFIdurations_allDouble/60; col='k'; printname= 'Distribution of the duration of Two target Disappearances'; case 3 usedata=PFIdurations_allTriple/60; col='r'; printname= 'Distribution of the duration of Three or more target Disappearances'; end %% clf histogram(usedata, 'Facecolor', [col]); title({[printname];['Across n=' num2str(length(PFIdurations_struct)) ' ppants']}, 'fontsize', fontsize) xlabel('Seconds', 'fontsize', fontsize) ylabel('Count', 'fontsize', fontsize) legend(['max duration ' num2str(max(usedata)) 's']) set(gca, 'fontsize', fontsize) %% print('-dpng', printname) end end %% if job.plothistofDisapdurationbynumbergone_perppants ==1 load('PFI_data.mat') exampleppants=[24,26,29]; for ippant = exampleppants idx=find(goodppants==ippant); for itarg=1:3 switch itarg case 1 usedata=PFIdurations_struct(idx).dursperppant.singleDisaps/60; col='b'; printname=['Distribution of the duration of Single target Disappearances for ppant ' num2str(ippant)]; case 2 usedata=PFIdurations_struct(idx).dursperppant.doubleDisaps/60; col='k'; printname=['Distribution of the duration of Two target Disappearances for ppant ' num2str(ippant)]; case 3 usedata=PFIdurations_struct(idx).dursperppant.tripleDisaps/60; col='r'; printname= ['Distribution of the duration of Three or more target Disappearances ppant' num2str(ippant)]; end %% clf histogram(usedata, 'Facecolor', [col]); title(printname, 'fontsize', fontsize) xlabel('Seconds', 'fontsize', fontsize) ylabel('Count', 'fontsize', fontsize) legend(['max duration ' num2str(max(usedata)) 's']) set(gca, 'fontsize', fontsize) %% print('-dpng', printname) end end end if job.exportDatatoExcelfolonDesktop==1; %% cd(basedir) %load relevant data load('PFI_data_concat') load('Shuffleddata') load('MD_AllBP_perppant.mat') % we have a number of different datatypes to append. % ppants x Hz % ppants x Loc % ppants x Num % ppants x Num shuff. % % all have 3 DV types (frequency, duartion, mduration). %% TableforExport=table(); thisentry=1; %initialize counter. %% for itype = 1:3 switch itype case 1 %first case is Hz data searchfor ='*FreqPFI*'; case 2 searchfor ='*LocPFI*'; case 3 searchfor ='*NumPFI_acrossTrials*'; end %index relevant variables in workspace varsstore = whos([searchfor], 'variables'); %cycle through and add to table (must have same number of %rows (ie ppants). for indvar= 1:length(varsstore) tmpdata = eval(varsstore(indvar).name); mtmp = squeeze(nanmean(tmpdata,2)); if size(mtmp,1)~=21; mtmp= mtmp(allppants,:); end %append horizontally to table. TableforExport=[TableforExport, table(mtmp)]; TableforExport.Properties.VariableNames(thisentry)={varsstore(indvar).name}; thisentry=thisentry+1; end end %% writetable(TableforExport, 'TableforExport.csv') end