1 package com.github.celldynamics.quimp;
2
3 import java.awt.Polygon;
4 import java.io.File;
5 import java.io.IOException;
6 import java.util.ArrayList;
7 import java.util.Arrays;
8
9 import com.github.celldynamics.quimp.filesystem.StatsCollection;
10 import com.github.celldynamics.quimp.geom.ExtendedVector2d;
11
12 import ij.IJ;
13 import ij.ImagePlus;
14 import ij.gui.PolygonRoi;
15 import ij.gui.Roi;
16 import ij.measure.Measurements;
17 import ij.process.ImageProcessor;
18 import ij.process.ImageStatistics;
19
20
21
22
23
24
25
26
27
28
29
30 public class CellStatsEval implements Measurements {
31
32
33
34 private CellStats statH;
35
36
37
38
39 OutlineHandler outputH;
40
41
42
43
44 File outfile;
45
46
47
48
49 ImagePlus iplus;
50
51
52
53
54 ImageProcessor iproc;
55
56
57
58
59 ImageStatistics is;
60
61
62
63
64
65
66 double scale;
67
68
69
70
71
72
73 double frameInterval;
74
75
76
77
78
79
80
81
82
83
84
85
86
87 public CellStatsEval(OutlineHandler oh, ImagePlus ip, File f, double s, double fi) {
88 IJ.showStatus("BOA-Calculating Cell stats");
89 outputH = oh;
90 outfile = f;
91 iplus = ip;
92 iproc = ip.getProcessor();
93 scale = s;
94 frameInterval = fi;
95
96 FrameStatistics[] stats = record();
97 iplus.setSlice(1);
98 iplus.killRoi();
99 if (f == null) {
100 buildData(stats);
101 } else {
102 try {
103 buildData(stats);
104 FrameStatistics.write(stats, outfile, s, fi);
105 } catch (IOException e) {
106 IJ.error("could not open out file");
107 }
108 }
109 }
110
111
112
113
114
115
116
117
118
119
120 public CellStatsEval(OutlineHandler oh, ImagePlus ip, double s, double fi) {
121 this(oh, ip, null, s, fi);
122 }
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139 private FrameStatistics[] record() {
140
141 FrameStatisticstistics.html#FrameStatistics">FrameStatistics[] stats = new FrameStatistics[outputH.getSize()];
142
143 double distance = 0;
144 Outline o;
145 PolygonRoi roi;
146 int store;
147
148 for (int f = outputH.getStartFrame(); f <= outputH.getEndFrame(); f++) {
149 IJ.showProgress(f, outputH.getEndFrame());
150 store = f - outputH.getStartFrame();
151
152 o = outputH.getStoredOutline(f);
153 iplus.setSlice(f);
154 stats[store] = new FrameStatistics();
155
156 Polygon opoly = o.asPolygon();
157 roi = new PolygonRoi(opoly, Roi.POLYGON);
158
159 iplus.setRoi(roi);
160 is = iplus.getStatistics(AREA + CENTROID + ELLIPSE + SHAPE_DESCRIPTORS);
161
162
163
164 stats[store].frame = f;
165 stats[store].area = is.area;
166 stats[store].centroid.setX(is.xCentroid);
167 stats[store].centroid.setY(is.yCentroid);
168
169 stats[store].elongation = is.major / is.minor;
170 stats[store].perimiter = roi.getLength();
171 stats[store].circularity =
172 4 * Math.PI * (stats[store].area / (stats[store].perimiter * stats[store].perimiter));
173 stats[store].displacement =
174 ExtendedVector2d.lengthP2P(stats[0].centroid, stats[store].centroid);
175
176 if (store != 0) {
177 stats[store].speed =
178 ExtendedVector2d.lengthP2P(stats[store - 1].centroid, stats[store].centroid);
179 distance += ExtendedVector2d.lengthP2P(stats[store - 1].centroid, stats[store].centroid);
180 stats[store].dist = distance;
181 } else {
182 stats[store].dist = 0;
183 stats[store].speed = 0;
184 }
185
186 if (distance != 0) {
187 stats[store].persistance = stats[store].displacement / distance;
188 } else {
189 stats[store].persistance = 0;
190 }
191
192 }
193
194
195 for (int f = outputH.getStartFrame(); f <= outputH.getEndFrame(); f++) {
196 store = f - outputH.getStartFrame();
197 stats[store].centroidToPixels(scale);
198 }
199
200 return stats;
201 }
202
203
204
205
206
207
208
209
210 private void buildData(FrameStatistics[] s) {
211 statH = new CellStats(new ArrayList<FrameStatistics>(Arrays.asList(s)));
212 }
213
214
215
216
217
218
219
220
221
222 public CellStats getStatH() {
223 return statH;
224 }
225
226 }