1 package com.github.celldynamics.quimp;
2
3 import java.awt.event.ActionListener;
4 import java.awt.event.ItemEvent;
5 import java.awt.event.ItemListener;
6 import java.awt.event.MouseEvent;
7 import java.io.File;
8
9 import javax.swing.event.ChangeEvent;
10 import javax.swing.event.ChangeListener;
11
12 import com.github.celldynamics.quimp.filesystem.FileExtensions;
13 import com.github.celldynamics.quimp.geom.ExtendedVector2d;
14
15 import ij.IJ;
16 import ij.ImagePlus;
17 import ij.gui.ImageCanvas;
18 import ij.gui.ImageWindow;
19 import ij.gui.Overlay;
20 import ij.gui.StackWindow;
21 import ij.io.OpenDialog;
22 import ij.plugin.PlugIn;
23 import ij.plugin.TextReader;
24 import ij.process.ImageProcessor;
25
26
27
28
29
30 public class Q_Explorer implements PlugIn {
31
32
33
34
35 MapCanvas[] mapCanvs;
36
37
38
39
40 MovCanvas movCanvas;
41
42
43
44
45 ExplorerStackWindow explorerWindow;
46
47
48
49
50 ImageManager imageManager;
51
52
53
54
55 OutlineHandler oH;
56
57
58
59
60
61
62 @Override
63 public void run(String string) {
64 try {
65
66 OpenDialog od =
67 new OpenDialog("Open paramater file (" + FileExtensions.configFileExt + ")...",
68 OpenDialog.getLastDirectory(), "");
69 if (od.getFileName() == null) {
70 return;
71 }
72 File paramFile = new File(od.getDirectory(), od.getFileName());
73 EXp.qp = new QParams(paramFile);
74 EXp.qp.readParams();
75 setup();
76 return;
77
78
79 } catch (Exception e) {
80
81 e.printStackTrace();
82 }
83 }
84
85
86
87
88 @SuppressWarnings("serial")
89 class MapCanvas extends ImageCanvas {
90
91
92
93
94
95
96 MapCanvas(ImagePlus imp) {
97 super(imp);
98 }
99
100
101
102
103
104
105 @Override
106 public void mousePressed(MouseEvent e) {
107 super.mousePressed(e);
108 IJ.log("Map pressed at: (" + offScreenX(e.getX()) + "," + offScreenY(e.getY()) + ")");
109 mapUpdate(e.getX(), e.getY());
110 }
111 }
112
113
114
115
116 @SuppressWarnings("serial")
117 class MovCanvas extends ImageCanvas {
118
119
120
121
122
123
124 MovCanvas(ImagePlus imp) {
125 super(imp);
126 }
127
128
129
130
131
132
133 @Override
134 public void mousePressed(MouseEvent e) {
135 IJ.log("Movie pressed at: (" + offScreenX(e.getX()) + "," + offScreenY(e.getY()) + ")");
136 }
137 }
138
139
140
141
142 @SuppressWarnings("serial")
143 class ExplorerStackWindow extends StackWindow
144 implements ActionListener, ItemListener, ChangeListener {
145
146
147
148
149
150
151
152 ExplorerStackWindow(ImagePlus imp, ImageCanvas stackCanvas) {
153 super(imp, stackCanvas);
154
155 }
156
157
158
159
160
161
162 @Override
163 public void itemStateChanged(ItemEvent ie) {
164 }
165
166
167
168
169
170
171 @Override
172 public void stateChanged(ChangeEvent ce) {
173 }
174
175
176
177
178
179
180 @Override
181 public void updateSliceSelector() {
182 super.updateSliceSelector();
183 EXp.frame = sliceSelector.getValue();
184 imageManager.updateOverlays();
185 }
186 }
187
188
189
190
191 void setup() {
192 oH = new OutlineHandler(EXp.qp);
193 if (!oH.readSuccess) {
194 IJ.error("Failed to read " + EXp.qp.getSnakeQP().getName());
195 return;
196 }
197 imageManager = new ImageManager(oH);
198 buildWindows();
199 }
200
201
202
203
204 void buildWindows() {
205 mapCanvs = new MapCanvas[imageManager.nbMaps];
206 mapCanvs[0] = new MapCanvas(imageManager.mapsIpl[0]);
207 new ImageWindow(imageManager.mapsIpl[0], mapCanvs[0]);
208 imageManager.mapsIpl[0].show();
209
210 movCanvas = new MovCanvas(imageManager.movieIpl);
211 explorerWindow = new ExplorerStackWindow(imageManager.movieIpl, movCanvas);
212
213 imageManager.movieIpl.show();
214 imageManager.movieIpl.setSlice(1);
215 EXp.frame = 1;
216 imageManager.updateOverlays();
217 }
218
219
220
221
222
223
224
225 void mapUpdate(int x, int y) {
226 imageManager.setSlice(y);
227 }
228
229
230
231
232
233
234 ExtendedVector2d map2Mov() {
235 return new ExtendedVector2d(-1, -1);
236 }
237 }
238
239 class ImageManager {
240
241 ImagePlus[] mapsIpl;
242 ImagePlus movieIpl;
243 ImagePlus xMap;
244 ImagePlus yMap;
245 Overlay[] movOverlay;
246 ExtendedVector2d mapCoord;
247 ExtendedVector2d movCoord;
248 int nbMaps;
249
250 ImageManager(OutlineHandler oH) {
251 nbMaps = 1;
252 mapsIpl = new ImagePlus[1];
253
254 xMap = openMap(EXp.qp.getxmapFile(), "xMap");
255 yMap = openMap(EXp.qp.getxmapFile(), "yMap");
256
257 mapsIpl[0] = openMap(EXp.qp.getMotilityFile(), "Motility Map");
258
259 movieIpl = IJ.openImage(EXp.qp.getSegImageFile().getAbsolutePath());
260 movOverlay = new Overlay[movieIpl.getStackSize()];
261
262
263 movOverlay = new Overlay[movieIpl.getStackSize()];
264 for (int i = 1; i <= movieIpl.getStackSize(); i++) {
265 movOverlay[i - 1] = new Overlay();
266 if (oH.isOutlineAt(i)) {
267 movOverlay[i - 1].add(oH.getStoredOutline(i).asFloatRoi());
268 }
269 }
270
271 }
272
273 private ImagePlus openMap(File f, String n) {
274
275 if (!f.exists()) {
276 IJ.log("Could not open " + f.getName());
277 return null;
278 }
279
280 TextReader textR = new TextReader();
281 ImageProcessor ip = textR.open(f.getAbsolutePath());
282 return new ImagePlus(n, ip);
283 }
284
285 void updateOverlays() {
286 movieIpl.setOverlay(movOverlay[EXp.frame - 1]);
287 }
288
289 void setSlice(int i) {
290 movieIpl.setSlice(i);
291 EXp.frame = i;
292 this.updateOverlays();
293 }
294
295 }
296
297 class EXp {
298
299 static QParams qp;
300 static int frame;
301
302 EXp() {
303
304 }
305
306 }