View Javadoc
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   * @author rtyson
29   */
30  public class Q_Explorer implements PlugIn {
31  
32    /**
33     * The map canvs.
34     */
35    MapCanvas[] mapCanvs;
36  
37    /**
38     * The mov canvas.
39     */
40    MovCanvas movCanvas;
41  
42    /**
43     * The explorer window.
44     */
45    ExplorerStackWindow explorerWindow;
46  
47    /**
48     * The image manager.
49     */
50    ImageManager imageManager;
51  
52    /**
53     * The o H.
54     */
55    OutlineHandler oH;
56  
57    /*
58     * (non-Javadoc)
59     * 
60     * @see ij.plugin.PlugIn#run(java.lang.String)
61     */
62    @Override
63    public void run(String string) {
64      try {
65        // do {
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        // } while (true);
78  
79      } catch (Exception e) {
80        // IJ.error("Unknown exception");
81        e.printStackTrace();
82      }
83    }
84  
85    /**
86     * The Class MapCanvas.
87     */
88    @SuppressWarnings("serial")
89    class MapCanvas extends ImageCanvas {
90  
91      /**
92       * Instantiates a new map canvas.
93       *
94       * @param imp the imp
95       */
96      MapCanvas(ImagePlus imp) {
97        super(imp);
98      }
99  
100     /*
101      * (non-Javadoc)
102      * 
103      * @see ij.gui.ImageCanvas#mousePressed(java.awt.event.MouseEvent)
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    * The Class MovCanvas.
115    */
116   @SuppressWarnings("serial")
117   class MovCanvas extends ImageCanvas {
118 
119     /**
120      * Instantiates a new mov canvas.
121      *
122      * @param imp the imp
123      */
124     MovCanvas(ImagePlus imp) {
125       super(imp);
126     }
127 
128     /*
129      * (non-Javadoc)
130      * 
131      * @see ij.gui.ImageCanvas#mousePressed(java.awt.event.MouseEvent)
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    * The Class ExplorerStackWindow.
141    */
142   @SuppressWarnings("serial")
143   class ExplorerStackWindow extends StackWindow
144           implements ActionListener, ItemListener, ChangeListener {
145 
146     /**
147      * Instantiates a new explorer stack window.
148      *
149      * @param imp the imp
150      * @param stackCanvas the stack canvas
151      */
152     ExplorerStackWindow(ImagePlus imp, ImageCanvas stackCanvas) {
153       super(imp, stackCanvas);
154 
155     }
156 
157     /*
158      * (non-Javadoc)
159      * 
160      * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
161      */
162     @Override
163     public void itemStateChanged(ItemEvent ie) {
164     }
165 
166     /*
167      * (non-Javadoc)
168      * 
169      * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent)
170      */
171     @Override
172     public void stateChanged(ChangeEvent ce) {
173     }
174 
175     /*
176      * (non-Javadoc)
177      * 
178      * @see ij.gui.StackWindow#updateSliceSelector()
179      */
180     @Override
181     public void updateSliceSelector() {
182       super.updateSliceSelector();
183       EXp.frame = sliceSelector.getValue();
184       imageManager.updateOverlays(); // draw overlay
185     } // update the frame label, overlay, frame and set zoom
186   }
187 
188   /**
189    * Setup.
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    * Builds the windows.
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    * Map update.
221    *
222    * @param x the x
223    * @param y the y
224    */
225   void mapUpdate(int x, int y) {
226     imageManager.setSlice(y);
227   }
228 
229   /**
230    * Map 2 mov.
231    *
232    * @return the extended vector 2 d
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     // build overlays
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 }