Changeset 7079
- Timestamp:
- 10/15/10 21:15:59 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/maven/projects/slim-plugin/src/main/java/loci/slim/SLIMProcessor.java
r7059 r7079 35 35 package loci.slim; 36 36 37 //TODO need to add fiji-lib.jar to maven repository:38 //import fiji.util.gui.GenericDialogPlus;39 40 37 import ij.IJ; 41 38 import ij.ImagePlus; … … 49 46 import ij.process.ImageProcessor; 50 47 48 import imagej.process.ImageUtils; 49 51 50 import imagej.io.ImageOpener; 52 51 … … 58 57 import java.util.ArrayList; 59 58 import java.util.HashMap; 59 import java.util.HashSet; 60 import java.util.List; 60 61 import java.util.Map; 62 import java.util.Set; 61 63 import java.util.prefs.Preferences; 62 64 … … 68 70 import loci.slim.ui.IStartStopListener; 69 71 import loci.slim.ui.IUserInterfacePanel; 70 import loci.slim.ui.IUserInterfacePanelListener;71 72 import loci.slim.ui.UserInterfacePanel; 72 73 import loci.common.DataTools; … … 84 85 import loci.formats.IFormatReader; 85 86 86 import mpicbg.imglib.cursor.Cursor;87 87 import mpicbg.imglib.cursor.LocalizableByDimCursor; 88 88 import mpicbg.imglib.image.Image; 89 //import mpicbg.imglib.Type;90 89 import mpicbg.imglib.type.numeric.RealType; 90 91 import net.java.sezpoz.Index; 92 import net.java.sezpoz.IndexItem; 91 93 92 94 /** … … 100 102 */ 101 103 public class SLIMProcessor <T extends RealType<T>> implements MouseListener { 102 //public class SLIMProcessor <T extends Type> {103 104 private static final String X = "X"; 104 105 private static final String Y = "Y"; … … 156 157 private int m_minWave, m_waveStep; //, m_maxWave; 157 158 158 // fit parameters159 // private int m_numExp;160 // private int m_binRadius;161 // private int m_cutBins;162 // private int m_maxPeak;163 164 165 159 public enum FitRegion { 166 160 SUMMED, ROI, POINT, EACH … … 194 188 private int m_debug = 0; 195 189 196 /** 197 * Run thread for the plugin. 198 * 199 * @param arg 200 */ 201 public void run(String arg) { 190 public SLIMProcessor() { 202 191 m_fitInProgress = false; 203 192 m_fitted = false; 204 205 IUserInterfacePanel uiPanel = new UserInterfacePanel(true); 206 JPanel panel = uiPanel.getPanel(); 207 208 m_channel = 0; //TODO s/b a JSlider that controls current channel 209 193 } 194 195 public void processImage(Image<T> image) { 210 196 boolean success = false; 211 if (showFileDialog(getFileFromPreferences())) { 212 if (m_fakeData) { 213 fakeData(); 214 success = true; 215 } 216 else { 217 if (newLoadData(m_file)) { 218 saveFileInPreferences(m_file); 219 success = true; 220 } 221 } 222 } 223 224 if (success) { 197 System.out.println("processImage " + image); 198 if (newLoadData(image)) { 225 199 // create a grayscale image from the data 226 200 createGlobalGrayScale(); … … 237 211 } 238 212 } 239 240 // ask for which file to load 241 /* if (showFileDialog(getFileFromPreferences())) { 242 // load the file 243 if (loadFile(m_file)) { 244 if (m_fakeData) { 245 fakeData(); 246 } 247 else { 248 saveFileInPreferences(m_file); 249 } 250 // show parameters from file 251 if (showParamsDialog()) { 252 if (!m_fakeData) { 253 loadData(); 254 } 255 // create a grayscale image from the data 256 createGlobalGrayScale(); 257 while (true) { 258 // ask what kind of fit 259 if (!showFitDialog()) { 260 break; 261 } 262 // ask for fit parameters 263 if (!showFitParamsDialog()) { 264 break; 265 } 266 fitData(); 267 } 268 } 269 } 270 else { 271 //TODO shouldn't UI be separate? 272 IJ.error("File Error", "Unable to load file."); 273 } 274 }*/ 275 } 276 277 /** 278 * Prompts for a .sdt file. 279 * 280 * @param defaultFile 281 * @return 282 */ 283 private boolean showFileDialog(String defaultFile) { 284 //TODO shouldn't UI be in separate class? 285 //TODO need to include fiji-lib.jar in repository: 286 //GenericDialogPlus dialog = new GenericDialogPlus("Load Data"); 287 GenericDialog dialog = new GenericDialog("Load Data"); 288 //TODO works with GenericDialogPlus, dialog.addFileField("File:", defaultFile, 24); 289 dialog.addStringField("File", defaultFile); 290 dialog.addCheckbox("Fake data", m_fakeData); 291 dialog.showDialog(); 292 if (dialog.wasCanceled()) { 293 return false; 294 } 295 296 m_file = dialog.getNextString(); 297 m_fakeData = dialog.getNextBoolean(); 298 299 return true; 300 } 301 302 private boolean newLoadData(String file) { 303 ImageOpener imageOpener = new ImageOpener(); 304 Image<T> image = null; 305 try { 306 image = imageOpener.openImage(file); 307 } 308 catch (Exception e) { 309 System.out.println("Error " + e.getMessage()); 310 } 311 312 int[] dimensions = image.getDimensions(); 313 Map map = dimensionMap(image.getName()); 314 Integer xIndex, yIndex, lifetimeIndex, channelIndex; 315 xIndex = (Integer) map.get(X); 316 yIndex = (Integer) map.get(Y); 317 lifetimeIndex = (Integer) map.get(LIFETIME); 318 if (null != xIndex && null != yIndex && null != lifetimeIndex) { 319 m_width = dimensions[xIndex]; 320 m_height = dimensions[yIndex]; 321 m_timeBins = dimensions[lifetimeIndex]; 322 } 323 else { 324 System.out.println("Can't find dimensions of .sdt Image " + image.getName()); 325 return false; 326 } 327 m_channels = 1; 328 channelIndex = (Integer) map.get(CHANNELS); 329 if (null != channelIndex) { 330 m_channels = dimensions[channelIndex]; 331 } 332 333 System.out.println("width " + m_width + " height " + m_height + " timeBins " + m_timeBins + " channels " + m_channels); 213 /* 214 m_width = ImageUtils.getWidth(image); 215 m_height = ImageUtils.getHeight(image); 216 m_timeBins = ImageUtils.getDimSize(image, FormatTools.LIFETIME, 0); 217 334 218 m_data = new int[m_channels][m_height][m_width][m_timeBins]; 335 final LocalizableByDimCursor< T> cursor = image.createLocalizableByDimCursor();219 final LocalizableByDimCursor<?> cursor = image.createLocalizableByDimCursor(); 336 220 int x, y, bin, channel; 337 221 for (channel = 0; channel < m_channels; ++channel) { … … 354 238 } 355 239 } 240 241 // patch things up 242 m_timeRange = 10.0f; 243 m_minWave = 400; 244 m_waveStep = 10; 245 */ 246 } 247 248 /** 249 * Run method for the plugin. Throws up a file dialog. 250 * 251 * @param arg 252 */ 253 public void process(String arg) { 254 //IUserInterfacePanel uiPanel = new UserInterfacePanel(true); 255 //JPanel panel = uiPanel.getPanel(); 256 257 m_channel = 0; //TODO s/b a JSlider that controls current channel 258 259 boolean success = false; 260 if (showFileDialog(getFileFromPreferences())) { 261 if (m_fakeData) { 262 fakeData(); 263 success = true; 264 } 265 else { 266 if (newLoadData(loadImage(m_file))) { 267 saveFileInPreferences(m_file); 268 success = true; 269 } 270 } 271 } 272 273 if (success) { 274 // create a grayscale image from the data 275 createGlobalGrayScale(); 276 while (true) { 277 // ask what kind fo fit 278 if (!showFitDialog()) { 279 break; 280 } 281 // ask for fit parameters 282 if (!showFitParamsDialog()) { 283 break; 284 } 285 fitData(); 286 } 287 } 288 } 289 290 /** 291 * Prompts for a .sdt file. 292 * 293 * @param defaultFile 294 * @return 295 */ 296 private boolean showFileDialog(String defaultFile) { 297 //TODO shouldn't UI be in separate class? 298 //TODO need to include fiji-lib.jar in repository: 299 //GenericDialogPlus dialog = new GenericDialogPlus("Load Data"); 300 GenericDialog dialog = new GenericDialog("Load Data"); 301 //TODO works with GenericDialogPlus, dialog.addFileField("File:", defaultFile, 24); 302 dialog.addStringField("File", defaultFile); 303 dialog.addCheckbox("Fake data", m_fakeData); 304 dialog.showDialog(); 305 if (dialog.wasCanceled()) { 306 return false; 307 } 308 309 m_file = dialog.getNextString(); 310 m_fakeData = dialog.getNextBoolean(); 311 312 return true; 313 } 314 315 private Image<T> loadImage(String file) { 316 ImageOpener imageOpener = new ImageOpener(); 317 Image<T> image = null; 318 try { 319 image = imageOpener.openImage(file); 320 } 321 catch (Exception e) { 322 System.out.println("Error " + e.getMessage()); 323 } 324 return image; 325 } 326 327 private boolean newLoadData(Image<T> image) { 328 int[] dimensions = image.getDimensions(); 329 System.out.println("dimensions size is " + dimensions.length); 330 /* 331 Map map = dimensionMap(image.getName()); 332 Integer xIndex, yIndex, lifetimeIndex, channelIndex; 333 xIndex = (Integer) map.get(X); 334 yIndex = (Integer) map.get(Y); 335 lifetimeIndex = (Integer) map.get(LIFETIME); 336 if (null != xIndex && null != yIndex && null != lifetimeIndex) { 337 m_width = dimensions[xIndex]; 338 m_height = dimensions[yIndex]; 339 m_timeBins = dimensions[lifetimeIndex]; 340 } 341 else { 342 System.out.println("Can't find dimensions of .sdt Image " + image.getName()); 343 return false; 344 } 345 m_channels = 1; 346 channelIndex = (Integer) map.get(CHANNELS); 347 if (null != channelIndex) { 348 System.out.println("Do have channel dimension"); 349 m_channels = dimensions[channelIndex]; 350 } 351 else System.out.println("Don't have channel dimension"); 352 */ 353 Integer xIndex, yIndex, lifetimeIndex, channelIndex; 354 m_width = ImageUtils.getWidth(image); 355 m_height = ImageUtils.getHeight(image); 356 m_channels = ImageUtils.getNChannels(image); 357 m_timeBins = ImageUtils.getDimSize(image, FormatTools.LIFETIME); 358 System.out.println("timeBins is " + m_timeBins); 359 int index = 0; 360 xIndex = index++; 361 yIndex = index++; 362 if (m_channels > 1) { 363 channelIndex = index++; 364 } 365 else { 366 channelIndex = null; 367 } 368 lifetimeIndex = index; 369 370 System.out.println("width " + m_width + " height " + m_height + " timeBins " + m_timeBins + " channels " + m_channels); 371 m_data = new int[m_channels][m_height][m_width][m_timeBins]; 372 final LocalizableByDimCursor<T> cursor = image.createLocalizableByDimCursor(); 373 int x, y, bin, channel; 374 for (channel = 0; channel < m_channels; ++channel) { 375 if (null != channelIndex) { 376 dimensions[channelIndex] = channel; 377 } 378 for (y = 0; y < m_height; ++y) { 379 dimensions[yIndex] = y; 380 for (x = 0; x < m_width; ++x) { 381 dimensions[xIndex] = x; 382 for (bin = 0; bin < m_timeBins; ++bin) { 383 dimensions[lifetimeIndex] = bin; 384 cursor.moveTo(dimensions); 385 m_data[channel][y][x][bin] = (int) cursor.getType().getRealFloat(); 386 } 387 } 388 } 389 } 356 390 cursor.close(); 357 391 // print out some useful information about the image … … 364 398 // patch things up 365 399 m_timeRange = 10.0f; 400 m_minWave = 400; 401 m_waveStep = 10; 366 402 367 403 return true; … … 371 407 * This method parses a string of the format: 372 408 * "Name [X Y Timebins]" and builds a map with 373 * the dimensions 'X', 'Y', and 'Timebins'. 409 * the dimensions 'X', 'Y', and 'Timebins' mapped 410 * to the dimension indices. 374 411 * 375 412 * Temporary kludge. 376 413 */ 377 private Map dimensionMap(String name) { 378 Map map = new HashMap<String, Integer>(); 414 private Map<String, Integer> dimensionMap(String name) { 415 System.out.println("name is " + name); 416 Map<String, Integer> map = new HashMap<String, Integer>(); 379 417 int startIndex = name.indexOf('[') + 1; 380 418 int endIndex = name.indexOf(']');
Note: See TracChangeset
for help on using the changeset viewer.