Skip to content
Permalink
master
Switch branches/tags

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?
Go to file
 
 
Cannot retrieve contributors at this time
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