Changeset 6132


Ignore:
Timestamp:
04/16/10 20:17:31 (10 years ago)
Author:
curtis
Message:

More progress on Bio-Formats Importer refactoring.

Not totally happy about the status listener stuff but don't know a better way.

Location:
trunk/components
Files:
4 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/loci-plugins/src/loci/plugins/Slicer.java

    r5144 r6132  
    4141 
    4242/** 
    43  * A plugin for splitting an image stack into separate channels, focal planes 
    44  * and/or time points. 
     43 * A plugin for splitting an image stack into separate 
     44 * channels, focal planes and/or time points. 
    4545 * 
    4646 * <dl><dt><b>Source code:</b></dt> 
     
    7474    if (!LibraryChecker.checkJava() || !LibraryChecker.checkImageJ()) return; 
    7575 
     76    boolean sliceC = false; 
    7677    boolean sliceZ = false; 
    77     boolean sliceC = false; 
    7878    boolean sliceT = false; 
    7979    String stackOrder = null; 
     
    107107    } 
    108108    else { 
    109       sliceZ = 
    110         Boolean.valueOf(Macro.getValue(arg, "slice_z", "false")).booleanValue(); 
    111       sliceC = 
    112         Boolean.valueOf(Macro.getValue(arg, "slice_c", "false")).booleanValue(); 
    113       sliceT = 
    114         Boolean.valueOf(Macro.getValue(arg, "slice_t", "false")).booleanValue(); 
    115       keepOriginal = Boolean.valueOf(Macro.getValue(arg, 
    116         "keep_original", "false")).booleanValue(); 
    117       hyperstack = Boolean.valueOf( 
    118         Macro.getValue(arg, "hyper_stack", "false")).booleanValue(); 
     109      sliceC = getBooleanValue("slice_c"); 
     110      sliceZ = getBooleanValue("slice_z"); 
     111      sliceT = getBooleanValue("slice_t"); 
     112      keepOriginal = getBooleanValue("keep_original"); 
     113      hyperstack = getBooleanValue("hyper_stack"); 
    119114      stackOrder = Macro.getValue(arg, "stack_order", "XYCZT"); 
    120115    } 
    121116 
     117    if (imp.getImageStack().isVirtual()) { 
     118      IJ.error("Slicer plugin cannot be used with virtual stacks.\n" + 
     119      "Please convert the virtual stack using Image>Duplicate."); 
     120      return; 
     121    } 
     122    ImagePlus newImp = Slicer.reslice(imp, 
     123      sliceC, sliceZ, sliceT, hyperstack, stackOrder); 
     124    if (!keepOriginal) imp.close(); 
     125    newImp.show(); 
     126  } 
     127 
     128  // -- Helper methods -- 
     129 
     130  /** Gets the value of the given macro key as a boolean. */ 
     131  private boolean getBooleanValue(String key) { 
     132    return Boolean.valueOf(Macro.getValue(arg, key, "false")); 
     133  } 
     134   
     135  // -- Static utility methods -- 
     136 
     137  public static ImagePlus reslice(ImagePlus imp, 
     138    boolean sliceC, boolean sliceZ, boolean sliceT, 
     139    boolean hyperstack, String stackOrder) 
     140  { 
    122141    ImageStack stack = imp.getImageStack(); 
    123142 
    124143    if (stack.isVirtual()) { 
    125       IJ.error("Slicer plugin cannot be used with virtual stacks.\n" + 
    126         "Please convert the virtual stack using Image>Duplicate."); 
    127       return; 
     144      throw new IllegalArgumentException("Cannot reslice virtual stacks"); 
    128145    } 
    129146 
     
    156173    } 
    157174 
     175    ImagePlus newImp = null; 
    158176    for (int i=0; i<newStacks.length; i++) { 
    159177      int[] zct = FormatTools.getZCTCoords(stackOrder, sliceZ ? sizeZ : 1, 
     
    184202        p = ImagePlusTools.reorder(p, stackOrder, "XYCZT"); 
    185203        int mode = ((CompositeImage) imp).getMode(); 
    186         new CompositeImage(p, mode).show(); 
    187       } 
    188       else p.show(); 
    189     } 
    190     if (!keepOriginal) imp.close(); 
    191   } 
    192  
     204        newImp = new CompositeImage(p, mode); 
     205      } 
     206      else newImp = p; 
     207    } 
     208    return newImp; 
     209  } 
     210   
    193211} 
  • trunk/components/loci-plugins/src/loci/plugins/importer/DisplayHandler.java

    r6131 r6132  
    3838import loci.common.ReflectException; 
    3939import loci.common.ReflectedUniverse; 
     40import loci.common.StatusEvent; 
     41import loci.common.StatusListener; 
    4042import loci.common.services.DependencyException; 
    4143import loci.common.services.ServiceException; 
     
    4648import loci.formats.services.OMEXMLService; 
    4749import loci.plugins.Colorizer; 
     50import loci.plugins.Slicer; 
    4851import loci.plugins.util.ROIHandler; 
    4952import loci.plugins.util.SearchableWindow; 
     
    6265 * @author Melissa Linkert linkert at wisc.edu 
    6366 */ 
    64 public class DisplayHandler { 
     67public class DisplayHandler implements StatusListener { 
    6568 
    6669  // -- Fields -- 
     
    142145    IFormatReader r = options.getReader(); 
    143146    boolean windowless = options.isWindowless(); 
    144      
     147 
    145148    if (!options.isConcatenate() && options.isMergeChannels()) imp.show(); 
    146149 
     
    194197 
    195198      if (splitC || splitZ || splitT) { 
    196         IJ.runPlugIn("loci.plugins.Slicer", "slice_z=" + splitZ + 
    197           " slice_c=" + splitC + " slice_t=" + splitT + 
    198           " stack_order=" + stackOrder + " keep_original=false " + 
    199           "hyper_stack=" + hyper + " "); 
     199        imp = Slicer.reslice(imp, splitC, splitZ, splitT, hyper, stackOrder); 
    200200        imp.close(); 
    201201      } 
     
    273273  } 
    274274 
     275  // -- StatusListener methods -- 
     276 
     277  /** Reports status updates via ImageJ's status bar mechanism. */ 
     278  public void statusUpdated(StatusEvent e) { 
     279    String msg = e.getStatusMessage(); 
     280    if (msg != null) IJ.showStatus(msg); 
     281    int value = e.getProgressValue(); 
     282    int max = e.getProgressMaximum(); 
     283    if (value >= 0 && max >= 0) IJ.showProgress(value, max); 
     284  } 
     285 
    275286} 
  • trunk/components/loci-plugins/src/loci/plugins/importer/ImagePlusReader.java

    r6131 r6132  
    2626package loci.plugins.importer; 
    2727 
    28 import ij.IJ; 
    2928import ij.ImagePlus; 
    3029import ij.ImageStack; 
     
    4241import java.util.ArrayList; 
    4342import java.util.List; 
     43import java.util.Vector; 
    4444 
    4545import loci.common.Location; 
     46import loci.common.StatusEvent; 
     47import loci.common.StatusListener; 
     48import loci.common.StatusReporter; 
    4649import loci.common.services.DependencyException; 
    4750import loci.common.services.ServiceException; 
     
    6770 * <a href="https://skyking.microscopy.wisc.edu/svn/java/trunk/components/loci-plugins/src/loci/plugins/importer/ImagePlusReader.java">SVN</a></dd></dl> 
    6871 */ 
    69 public class ImagePlusReader { 
     72public class ImagePlusReader implements StatusReporter { 
    7073 
    7174  // -- Fields -- 
     
    7376  /** Importer options that control the reader's behavior. */ 
    7477  protected ImporterOptions options; 
     78 
     79  protected List<StatusListener> listeners = new Vector<StatusListener>(); 
    7580 
    7681  public String stackOrder;//TEMP! 
     
    99104   */ 
    100105  public ImagePlus[] openImagePlus() throws FormatException, IOException { 
    101     List<ImagePlus> imps = readPixelData(); 
     106    List<ImagePlus> imps = readImages(); 
    102107    return imps.toArray(new ImagePlus[0]); 
    103108  } 
    104109 
     110  // -- StatusReporter methods -- 
     111 
     112  public void addStatusListener(StatusListener l) { 
     113    listeners.add(l); 
     114  } 
     115 
     116  public void removeStatusListener(StatusListener l) { 
     117    listeners.remove(l); 
     118  } 
     119 
     120  public void notifyListeners(StatusEvent e) { 
     121    for (StatusListener l : listeners) l.statusUpdated(e); 
     122  } 
     123 
    105124  // -- Helper methods -- 
    106125 
    107   private List<ImagePlus> readPixelData() 
     126  private List<ImagePlus> readImages() 
    108127    throws FormatException, IOException 
    109128  { 
     129    // beginning timing 
     130    long startTime = System.currentTimeMillis(); 
     131    long time = startTime; 
     132 
    110133    ImageProcessorReader r = options.getReader(); 
    111134    List<ImagePlus> imps = new ArrayList<ImagePlus>(); 
     
    158181      fi.directory = idDir; 
    159182 
    160       long startTime = System.currentTimeMillis(); 
    161       long time = startTime; 
    162  
    163183      ImageStack stackB = null; // for byte images (8-bit) 
    164184      ImageStack stackS = null; // for short images (16-bit) 
     
    229249              ("series " + (s + 1) + ", ") : ""; 
    230250            String pLabel = "plane " + (i + 1) + "/" + total; 
    231             IJ.showStatus("Reading " + sLabel + pLabel); 
     251            notifyListeners(new StatusEvent("Reading " + sLabel + pLabel)); 
    232252            time = clock; 
    233253          } 
    234           IJ.showProgress((double) q++ / total); 
     254          notifyListeners(new StatusEvent(q++, total, null)); 
    235255 
    236256          String label = constructSliceLabel(i, r, 
     
    284304      } 
    285305 
    286       IJ.showStatus("Creating image"); 
    287       IJ.showProgress(1); 
     306      notifyListeners(new StatusEvent(1, 1, "Creating image")); 
    288307 
    289308      ImagePlus impB = createImage(stackB, s, fi, stackOrder, colorModels); 
     
    295314      if (impF != null) imps.add(impF); 
    296315      if (impO != null) imps.add(impO); 
    297  
    298       long endTime = System.currentTimeMillis(); 
    299       double elapsed = (endTime - startTime) / 1000.0; 
    300       if (r.getImageCount() == 1) { 
    301         IJ.showStatus("Bio-Formats: " + elapsed + " seconds"); 
    302       } 
    303       else { 
    304         long average = (endTime - startTime) / r.getImageCount(); 
    305         IJ.showStatus("Bio-Formats: " + elapsed + " seconds (" + 
    306           average + " ms per plane)"); 
    307       } 
    308     } 
    309  
    310     imps = concatenate(imps, stackOrder); 
     316    } 
     317 
     318    Concatenator concatenator = new Concatenator(options); 
     319    imps = concatenator.concatenate(imps, stackOrder); 
     320 
     321    // end timing 
     322    long endTime = System.currentTimeMillis(); 
     323    double elapsed = (endTime - startTime) / 1000.0; 
     324    if (r.getImageCount() == 1) { 
     325      notifyListeners(new StatusEvent("Bio-Formats: " + elapsed + " seconds")); 
     326    } 
     327    else { 
     328      long average = (endTime - startTime) / r.getImageCount(); 
     329      notifyListeners(new StatusEvent("Bio-Formats: " + 
     330        elapsed + " seconds (" + average + " ms per plane)")); 
     331    } 
    311332 
    312333    return imps; 
     
    450471  } 
    451472 
    452   /** Concatenates the list of images as appropriate. */ 
    453   private List<ImagePlus> concatenate(List<ImagePlus> imps, String stackOrder) { 
    454     if (!options.isConcatenate()) return imps; 
    455  
    456     IFormatReader r = options.getReader(); 
    457  
    458     List<Integer> widths = new ArrayList<Integer>(); 
    459     List<Integer> heights = new ArrayList<Integer>(); 
    460     List<Integer> types = new ArrayList<Integer>(); 
    461     List<ImagePlus> newImps = new ArrayList<ImagePlus>(); 
    462  
    463     for (int j=0; j<imps.size(); j++) { 
    464       ImagePlus imp = imps.get(j); 
    465       int wj = imp.getWidth(); 
    466       int hj = imp.getHeight(); 
    467       int tj = imp.getBitDepth(); 
    468       boolean append = false; 
    469       for (int k=0; k<widths.size(); k++) { 
    470         int wk = ((Integer) widths.get(k)).intValue(); 
    471         int hk = ((Integer) heights.get(k)).intValue(); 
    472         int tk = ((Integer) types.get(k)).intValue(); 
    473  
    474         if (wj == wk && hj == hk && tj == tk) { 
    475           ImagePlus oldImp = newImps.get(k); 
    476           ImageStack is = oldImp.getStack(); 
    477           ImageStack newStack = imp.getStack(); 
    478           for (int s=0; s<newStack.getSize(); s++) { 
    479             is.addSlice(newStack.getSliceLabel(s + 1), 
    480               newStack.getProcessor(s + 1)); 
    481           } 
    482           oldImp.setStack(oldImp.getTitle(), is); 
    483           newImps.set(k, oldImp); 
    484           append = true; 
    485           k = widths.size(); 
    486         } 
    487       } 
    488       if (!append) { 
    489         widths.add(new Integer(wj)); 
    490         heights.add(new Integer(hj)); 
    491         types.add(new Integer(tj)); 
    492         newImps.add(imp); 
    493       } 
    494     } 
    495  
    496     boolean splitC = options.isSplitChannels(); 
    497     boolean splitZ = options.isSplitFocalPlanes(); 
    498     boolean splitT = options.isSplitTimepoints(); 
    499  
    500     // TODO: Change IJ.runPlugIn to direct API calls in relevant plugins. 
    501     // Should not be calling show() here just to make other plugins happy! :-( 
    502     for (int j=0; j<newImps.size(); j++) { 
    503       ImagePlus imp = (ImagePlus) newImps.get(j); 
    504       imp.show(); 
    505       if (splitC || splitZ || splitT) { 
    506         IJ.runPlugIn("loci.plugins.Slicer", "slice_z=" + splitZ + 
    507           " slice_c=" + splitC + " slice_t=" + splitT + 
    508           " stack_order=" + stackOrder + " keep_original=false " + 
    509           "hyper_stack=" + options.isViewHyperstack() + " "); 
    510         imp.close(); 
    511       } 
    512       if (options.isMergeChannels() && options.isWindowless()) { 
    513         IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
    514           " merge=true merge_option=[" + options.getMergeOption() + "] " + 
    515           "series=" + r.getSeries() + " hyper_stack=" + 
    516           options.isViewHyperstack() + " "); 
    517         imp.close(); 
    518       } 
    519       else if (options.isMergeChannels()) { 
    520         IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
    521           " merge=true series=" + r.getSeries() + " hyper_stack=" + 
    522           options.isViewHyperstack() + " "); 
    523         imp.close(); 
    524       } 
    525     } 
    526  
    527     return newImps; 
    528   } 
    529  
    530473} 
  • trunk/components/loci-plugins/src/loci/plugins/importer/Importer.java

    r6131 r6132  
    133133    DisplayHandler displayHandler = new DisplayHandler(options); 
    134134    displayHandler.displayOMEXML(); 
    135     // TODO - register resultant XMLWindow with Data Browser when relevant. 
    136135  } 
    137136 
     
    141140    if (options.isViewNone()) return null; 
    142141    ImagePlusReader ipr = new ImagePlusReader(options); 
     142    ipr.addStatusListener(displayHandler); 
    143143    ImagePlus[] imps = ipr.openImagePlus(); 
    144144 
    145145    // TEMP! 
    146146    displayHandler.displayImages(imps, ipr.stackOrder, ipr.colorModels); 
    147      
     147 
    148148    return imps; 
    149149  } 
  • trunk/components/loci-plugins/src/loci/plugins/importer/SeriesDialog.java

    r5481 r6132  
    197197    }; 
    198198    masterPanel.setLayout(new GridLayout(seriesCount, 2)); 
    199     int nextComponent = 0; 
    200199 
    201200    for (int i=0; i<seriesCount; i++) { 
  • trunk/components/loci-plugins/src/loci/plugins/importer/SwapDialog.java

    r5144 r6132  
    6969   */ 
    7070  public int showDialog() { 
    71     boolean valid = false; 
    72  
    7371    GenericDialog gd = new GenericDialog("Dimension swapping options"); 
    7472 
  • trunk/components/loci-plugins/src/loci/plugins/importer/ThumbLoader.java

    r5309 r6132  
    145145  // -- Helper classes -- 
    146146 
    147   /** Helper class for sorting series by iamge plane size. */ 
    148   public class SeriesInfo implements Comparable { 
     147  /** Helper class for sorting series by image plane size. */ 
     148  public class SeriesInfo implements Comparable<SeriesInfo> { 
    149149 
    150150    private int index, size; 
     
    155155    } 
    156156 
    157     public int compareTo(Object o) { 
    158       SeriesInfo info = (SeriesInfo) o; 
     157    public int compareTo(SeriesInfo info) { 
    159158      return size - info.size; 
    160159    } 
Note: See TracChangeset for help on using the changeset viewer.