forked from mporter-gre/mtools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
selectROIFilesForDistanceMeasure.m
126 lines (115 loc) · 5.65 KB
/
selectROIFilesForDistanceMeasure.m
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
116
117
118
119
120
121
122
123
124
125
126
function selectROIFilesForDistanceMeasure(credentials, conditions, handles)
%Measure distances between objects in 2D/3D. User selects ROI files
%containing rectangular ROIs containing the objects intended for
%segmentation. For each ROI a projection of the relevant Zs is displayed
%and user selects channel(s) to display segmented. User can scroll through
%Z to see all of the objects for that channel, and clicks on the two
%objects they want to know the distance between. If metadata exists in the
%DB the results are expressed in microns, otherwise pixels are used.
%Results are saved in an Excel spreadsheet, or a .csv file if Excel is not
%found.
%
%
%Author Michael Porter [email protected]
% Copyright (C) 2009-2014 University of Dundee.
% All rights reserved.
%
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License along
% with this program; if not, write to the Free Software Foundation, Inc.,
% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
numConditions = length(conditions);
paths = handles.conditionsPaths;
files = handles.conditionsFiles;
for thisCondition = 1:numConditions
if iscell(files{thisCondition})
numFiles = length(files{thisCondition});
for thisFile = 1:numFiles
[ROIIdx{thisCondition}{thisFile} roishapeIdx{thisCondition}{thisFile} badImage badCredentials data{thisCondition}{thisFile}] = distanceMeasure(paths{thisCondition}, files{thisCondition}{thisFile}, credentials, thisFile, numFiles, thisCondition, numConditions, handles);
if badImage == 0
if badCredentials == 1
return;
end
else
badImages = [badImages; thisCondition, thisFile];
dataOut = [dataOut; {paths{thisCondition}, files{thisCondition}{thisFile}, 'Bad image or ROI file', '', '', ''}];
continue;
end
end
else
thisFile = 1;
numFiles{thisCondition} = 1;
[ROIIdx{thisCondition}{thisFile} roishapeIdx{thisCondition}{thisFile} badImage, badCredentials, measureSegChannel, data{thisCondition}{thisFile}] = distanceMeasure(paths{thisCondition}, files{thisCondition}{thisFile}, credentials, thisFile, numFiles{thisCondition}, thisCondition, numConditions, handles);
if badImage == 0
numROI = length(ROIIdx{thisCondition}{thisFile}{1});
else
%dataOut = [dataOut; {paths{thisCondition}, files{thisCondition}{thisFile}, 'Bad image or ROI file', '', '', ''}];
continue;
end
end
end
mainHeader = {'Original Image', 'Condition', 'ROI number', 'Object 1 Channel', 'Object 2 Channel', 'Centroid 1 (x,y,z)', 'Centroid 2 (x,y,z)', 'Distance', 'Units'};
emptyLine = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '};
dataOut = mainHeader;
%Create the data structure for writing out to .xls
for thisCondition = 1:numConditions
numFiles = length(ROIIdx{thisCondition});
for thisFile = 1:numFiles
if iscell(files{thisCondition})
%numFiles{thisCondition} = length(files{thisCondition});
for thisFile = 1:numFiles
numROI = length(ROIIdx{thisCondition}{thisFile});
for thisROI = 1:numROI
dataOut = [dataOut; {roishapeIdx{thisCondition}{thisFile}{thisROI}.origName conditions{thisCondition} num2str(thisROI) data{thisCondition}{thisFile}{thisROI}{1}{1} data{thisCondition}{thisFile}{thisROI}{2}{1} num2str(data{thisCondition}{thisFile}{thisROI}{7}.Centroid) num2str(data{thisCondition}{thisFile}{thisROI}{8}.Centroid) data{thisCondition}{thisFile}{thisROI}{9}} data{thisCondition}{thisFile}{thisROI}{10}];
end
end
else
thisFile = 1;
numROI = length(ROIIdx{thisCondition}{thisFile});
for thisROI = 1:numROI
dataOut = [dataOut; {roishapeIdx{thisCondition}{thisFile}{thisROI}.origName conditions{thisCondition} num2str(thisROI) data{thisCondition}{thisFile}{1} data{thisCondition}{thisFile}{2} data{thisCondition}{thisFile}{7} data{thisCondition}{thisFile}{8} data{thisCondition}{thisFile}{9}} data{thisCondition}{thisFile}{10}];
end
end
end
end
[saveFile savePath] = uiputfile('*.xls','Save Results',[handles.currDir, '/DistanceMeasurements.xls']);
if isnumeric(saveFile) && isnumeric(savePath)
return;
end
try
xlswrite([savePath saveFile], dataOut);
catch
%If the xlswriter fails (no MSOffice installed, e.g.) then manually
%create a .csv file. Turn every cell to string to make it easier.
largestCell = 0;
[rows cols] = size(dataOut);
for thisRow = 1:rows
for thisCol = 1:cols
if isnumeric(dataOut{thisRow, thisCol})
dataOut{thisRow, thisCol} = num2str(dataOut{thisRow, thisCol});
end
end
end
delete([savePath saveFile]); %Delete the .xls file and save again as .csv
[savePart remain] = strtok(saveFile, '.');
saveFile = [savePart '.csv'];
fid = fopen([savePath saveFile], 'w');
for thisRow = 1:rows
for thisCol = 1:cols
fprintf(fid, '%s', dataOut{thisRow, thisCol});
fprintf(fid, '%s', ',');
end
fprintf(fid, '%s\n', '');
end
fclose(fid);
end
end