-
Notifications
You must be signed in to change notification settings - Fork 1
/
RotationalPolarity
115 lines (98 loc) · 4.73 KB
/
RotationalPolarity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
%% RotationalPolarity is the main function. Calculates angles of basal rootlet orientation vectors (BROV)
% 1. In ImageJ create ROIs of lines connecting basal body to a tip of the cilium.
% 2. Measure the ROIs in ImageJ, save the measurements as csv files
% 3. Run the script
% as an input needs csv files, generated by ImageJ measurement of manually drawn lines connecting basal body to a tip of the cilium.
% Measurement file has to include following columns: 'Center X' 'Center Y' 'X' 'Y' 'Angle' 'Full length'
% Files must be organized in folders with individual csv files for each image.
%% Functions used and included:
% exclude_str_cell - excludes elements of cell array, that match a criterium
%% Functions used and NOT included. Can be downloaded from FileExchange:
% Circular Statistics Toolbox http://www.mathworks.com/matlabcentral/fileexchange/10676-circular-statistics-toolbox--directional-statistics-
function RotationalPolarity(top_folder)
% Calculates angles of basal rootlet orientation vectors (BROV)
% top_folder - folder containing subfolders with csv files
% as an input needs csv files, generated by ImageJ measurement of manually drawn lines connecting basal body to a tip of the cilium.
% Measurement file has to include following columns: 'Center X' 'Center Y' 'X' 'Y' 'Angle' 'Full length'
% Files must be organized in folders with individual csv files for each image.
%% list folders
folders=rdir([top_folder,'\*']);
dircheck=[folders.isdir];
folders={folders.name};
folders=folders(dircheck);
[selectedFolders,ok]=listdlg('ListString',folders,'SelectionMode','multiple'); %selection is an array of double
if ok
selectedFolders=folders(selectedFolders)';
else
msgbox('No folders were selected','Exiting...');
return
end
%% Processing folders
for ff=1:numel(selectedFolders)
curr_folder=selectedFolders{ff,1};
csv_files=dir([curr_folder,'\*.csv']);
csv_files={csv_files.name};
correct_files_indices=exclude_str_cell('angles',csv_files');
csv_files=csv_files(correct_files_indices);
summary_file=fopen([curr_folder,'\all_angles.csv'],'w');
fprintf(summary_file,'File,Mean Angle,Angle Standard Deviation\n');
all_angles_normalized=[];
for cs=1:length(csv_files)
curr_data_file=[curr_folder,'\',csv_files{1,cs}];
csv_import_all=importdata(curr_data_file);
csv_import=csv_import_all.data;
%% create polar plot
angles=deg2rad(csv_import(:,6));
uniq_angles=unique(angles);
angle_freq = histc( angles, uniq_angles);
ang_file=fopen(strrep(curr_data_file,'.csv','_angles.csv'),'w');
mean_angle=round(wrapTo360(radtodeg(circ_mean(angles))));
std_angle=radtodeg(circ_std(angles));
%% normalization
ang_diff=90-wrapTo180(mean_angle);
ang_norm=wrapTo180(csv_import(:,6))+ang_diff;
all_angles_normalized=cat(1,all_angles_normalized,ang_norm);
fprintf(ang_file,'Mean angle:,%d\n',mean_angle);
fprintf(ang_file,'Angle standard deviation:,%.1f\n\n',std_angle);
un_angles_degrees=round(wrapTo360(radtodeg(uniq_angles)));
fprintf(ang_file,'Angle,Number of occurences\n');
sorted_angles=sortrows([un_angles_degrees,angle_freq]);
fprintf(ang_file,'%d,%d\n',sorted_angles');
[x,y] = pol2cart(uniq_angles,angle_freq);
compass(x,y);
saveas(gcf,strrep(curr_data_file,'.csv','.jpg'),'jpg');
saveas(gcf,strrep(curr_data_file,'.csv','.fig'),'fig');
fprintf(summary_file,'%s,%.1f,%.2f\n',csv_files{1,cs},mean_angle,std_angle);
end
graph_id=rose(deg2rad(all_angles_normalized));figure(gcf); %plotting a graph
saveas(gcf,[curr_folder,'normalized_angles.jpg']);
%% formatting the graph
x = get(graph_id,'Xdata');
y = get(graph_id,'Ydata');
g=patch(x,y,'y','FaceColor','b');
hHiddenText = findall(gca,'type','text');
f_col=repmat({'off'},numel(hHiddenText),1);
set(hHiddenText,{'Visible'},f_col);
%end formatting the graph
saveas(gcf,[curr_folder,'normalized_angles_notext.jpg']);
xlswrite([curr_folder,'normalized_angles.xlsx'],all_angles_normalized)
fclose('all');
end
end
%% exclude_str_cell
function indices = exclude_str_cell( str, cell_array )
%str - string to search for
%cell_array - cell array where the seach is done
indices=[];
if size(cell_array,1)==1
if size(cell_array,2)>1
cell_array=cell_array';
end
end
for r=1:size(cell_array,1)
if strfind(cell_array{r,1},str)
else
indices=cat(1,indices,r);
end
end
end