Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
MatlabMain/find_transients.m
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
89 lines (77 sloc)
4.01 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function files = find_transients(files,exp_ids,rep_ids,shift,centremass_option) | |
% obtain frames when LED switches on and off (at frames when the light | |
% intensity changes abruptly the absolute difference in mean intensity between two | |
% successive frames exceeds shift times the mean fluctuations observed between successive frames) | |
for i = exp_ids | |
for ii = rep_ids | |
meanI_frames = files{i,ii}.RawData.meanI_fullframe; | |
d_meanI = abs(diff(meanI_frames)); | |
d_meanI = d_meanI-mean(d_meanI); | |
times = find(d_meanI > shift); | |
% cluster times of abrupt change based on distance between point within 4 | |
% frames | |
MaxDist = 4; | |
Map = unique( abs(bsxfun(@minus,times(:),times(:).'))<=MaxDist ,'rows'); | |
events = NaN(7,size(Map,1)); | |
Abrupt_changes = cell(size(Map,1),1); | |
for iii = 1:size(Map,1) | |
seq = floor(mean(times(Map(iii,:))))-2:floor(mean(times(Map(iii,:))))+2; | |
temp_seq = d_meanI(seq); %meanI_frames( seq ); | |
[~, peak_t] = max(temp_seq); | |
Abrupt_changes{iii} = [seq(peak_t+1)-3 : seq(peak_t+1)+3]; | |
events(:,iii) = meanI_frames( [seq(peak_t+1)-3 : seq(peak_t+1)+3] ); | |
end | |
% define types of changes (synch, on and off transients) | |
criterion = abs(diff(events)); | |
diff_events = diff(events); | |
sign_inversion = NaN(size(criterion,2),1); | |
continuity_flag = NaN(size(criterion,2),1); | |
value_d = NaN(size(criterion,2),1); | |
for c = 1:size(criterion,2); | |
ctemp = criterion(:,c); | |
ind = find(ctemp < max(ctemp)/10); | |
diff_events(ind,c) = zeros(length(ind),1); | |
[a,b] = sort(ctemp,'descend'); | |
sign_inversion(c) = sign(diff_events(b(1),c)).*sign(diff_events(b(2),c)); | |
value_d(c) = mean(diff_events(b(1:2),c)); | |
continuity_flag(c) = abs(diff(b(1:2))) == 1; | |
end | |
synch_events = find(sign_inversion < 0); | |
onset_events = find(sign_inversion >= 0 & value_d > 0); | |
offset_events = find(sign_inversion >= 0 & value_d < 0); | |
single_frame_precision = find(continuity_flag == 0); | |
% find centre of mass of events of abrupt change | |
centre_mass = zeros(length(Abrupt_changes),1); | |
timestamp = zeros(length(Abrupt_changes),2); | |
for iii = 1:length(Abrupt_changes) | |
tempseq = Abrupt_changes{iii}'; | |
intensities = meanI_frames(tempseq); | |
centre_mass(iii) = sum(tempseq.*intensities) / sum(intensities); | |
if ismember(iii,synch_events) | ismember(iii,onset_events) | |
sort_intensities = sort(intensities); | |
frame = find(intensities > mean(sort_intensities(1:3))+0.1*mean(sort_intensities(1:3)),1,'first'); | |
else ismember(iii,offset_events) | |
sort_intensities = sort(intensities,'descend'); | |
frame = find(intensities < mean(sort_intensities(1:3))-0.1*mean(sort_intensities(1:3)),1,'first'); | |
end | |
timestamp(iii,:) = tempseq([frame-1:frame]); | |
end | |
if centremass_option | |
files{i,ii}.synch_timestamps = sort(centre_mass(synch_events)); | |
files{i,ii}.onset_timestamps = sort(centre_mass(onset_events)); | |
files{i,ii}.offset_timestamps = sort(centre_mass(offset_events)); | |
else | |
files{i,ii}.synch_timestamps = timestamp(synch_events,:); | |
files{i,ii}.onset_timestamps = timestamp(onset_events,:); | |
files{i,ii}.offset_timestamps = timestamp(offset_events,:); | |
end | |
figure, plot(meanI_frames), hold on | |
y_lim = ylim; | |
for iii = 1:length(Abrupt_changes) | |
plot([mean(timestamp(iii,:)) mean(timestamp(iii,:))],y_lim,'k') | |
plot([centre_mass(iii) centre_mass(iii)],y_lim,'r') | |
end | |
title(['synch, onset & offsets: files{ ',num2str(i),' , ',num2str(ii),' }',... | |
' in black time defined based on change > 10%; in red time defined based on centre of mass']) | |
end | |
end | |