Changeset 1231


Ignore:
Timestamp:
08/10/06 11:23:51 (14 years ago)
Author:
melissa
Message:

updated Data Browser (better support for virtual stacks)

Location:
trunk/loci/browser
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/browser/CustomWindow.java

    r1201 r1231  
    22// CustomWindow.java 
    33// 
    4  
    5 // bug(?): possible race condition between showslice and setindices 
    64 
    75package loci.browser; 
     
    1816import javax.swing.event.ChangeEvent; 
    1917import javax.swing.event.ChangeListener; 
    20 import loci.formats.MetadataStore; 
    21 import loci.formats.OMEXMLMetadataStore; 
    2218import loci.ome.viewer.MetadataPane; 
    2319 
     
    4642  // -- Fields - widgets -- 
    4743 
    48   private JLabel zLabel, tLabel;//, waitLabel; 
     44  private JLabel zLabel, tLabel; 
    4945  private JScrollBar zSliceSel, tSliceSel; 
    50   private JLabel fpsLabel; 
    51   private JSpinner frameRate; 
    5246  private JButton xml; 
    5347  private Timer animationTimer; 
    5448  private JButton animate; 
    55   private JSpinner zMin, zMax, tMin, tMax; 
    56   private JCheckBox custom; 
     49  private JButton options; 
    5750 
    5851  // -- Constructor -- 
    5952 
    60   /** CustomWindow constructors, initialisation */ 
     53  /** CustomWindow constructors, initialization */ 
    6154  public CustomWindow(LociDataBrowser db, ImagePlus imp, ImageCanvas canvas) { 
    6255    super(imp, canvas); 
    6356    this.db = db; 
    6457    String title = imp.getTitle(); 
    65     this.setTitle(title.substring(title.lastIndexOf(File.separatorChar)+1)); 
     58    this.setTitle(title.substring(title.lastIndexOf(File.separatorChar) + 1)); 
    6659 
    6760    // create panel for image canvas 
     
    191184    gbc.gridx = 6; 
    192185    gbc.gridy = 3; 
    193     gbc.gridwidth = GridBagConstraints.REMAINDER; // end row 
    194186    gbc.gridheight = 1; 
    195187    gbc.fill = GridBagConstraints.NONE; 
     
    199191    bottom.add(animate); 
    200192 
    201     // FPS label 
    202     fpsLabel = new JLabel("fps"); 
    203  
    204     gbc.gridx = 7; 
    205     gbc.gridy = 2; 
    206     gbc.gridwidth = 1; 
    207     gbc.fill = GridBagConstraints.REMAINDER; 
    208     gbc.weightx = 0.0; 
    209     gridbag.setConstraints(fpsLabel, gbc); 
    210     bottom.add(fpsLabel); 
    211  
    212     // FPS spinner 
    213     SpinnerModel model = new SpinnerNumberModel(10, 1, 99, 1); 
    214     frameRate = new JSpinner(model); 
    215     frameRate.addChangeListener(this); 
    216  
    217     gbc.gridx = 6; 
    218     gbc.gridy = 2; 
    219     gbc.ipadx = 20; 
    220     gridbag.setConstraints(frameRate, gbc); 
    221     bottom.add(frameRate); 
    222  
    223     // custom virtualization spinners 
    224  
    225     model = new SpinnerNumberModel(1, 1, db.hasZ ? db.numZ : 1, 1); 
    226     zMin = new JSpinner(model); 
    227     model = new SpinnerNumberModel(1, 1, db.hasZ ? db.numZ : 1, 1); 
    228     zMax = new JSpinner(model); 
    229     model = new SpinnerNumberModel(1, 1, db.hasT ? db.numT : 1, 1); 
    230     tMin = new JSpinner(model); 
    231     model = new SpinnerNumberModel(1, 1, db.hasT ? db.numT : 1, 1); 
    232     tMax = new JSpinner(model); 
    233     tMin.setEnabled(false); 
    234     tMax.setEnabled(false); 
    235     zMin.setEnabled(false); 
    236     zMax.setEnabled(false); 
    237  
    238     zMin.addChangeListener(this); 
    239     zMax.addChangeListener(this); 
    240     tMin.addChangeListener(this); 
    241     tMax.addChangeListener(this); 
    242  
    243     JLabel customLabel = new JLabel("Z : from "); 
    244     gbc.gridx = 0; 
    245     gbc.gridy = 5; 
    246     gridbag.setConstraints(customLabel, gbc); 
    247     bottom.add(customLabel); 
    248  
    249     gbc.gridx = 1; 
    250     gbc.gridy = 5; 
    251     gridbag.setConstraints(zMin, gbc); 
    252     bottom.add(zMin); 
    253  
    254     customLabel = new JLabel(" to "); 
    255     gbc.gridx = 2; 
    256     gbc.gridy = 5; 
    257     gridbag.setConstraints(customLabel, gbc); 
    258     bottom.add(customLabel); 
     193    // options button 
     194 
     195    options = new JButton("Options"); 
     196    options.setActionCommand("options"); 
     197    options.addActionListener(this); 
     198    options.setEnabled(true); 
    259199 
    260200    gbc.gridx = 3; 
    261     gbc.gridy = 5; 
    262     gridbag.setConstraints(zMax, gbc); 
    263     bottom.add(zMax); 
    264  
    265     customLabel = new JLabel("T : from "); 
    266     gbc.gridx = 0; 
    267     gbc.gridy = 6; 
    268     gridbag.setConstraints(customLabel, gbc); 
    269     bottom.add(customLabel); 
    270  
    271     gbc.gridx = 1; 
    272     gbc.gridy = 6; 
    273     gridbag.setConstraints(tMin, gbc); 
    274     bottom.add(tMin); 
    275  
    276     customLabel = new JLabel(" to "); 
    277     gbc.gridx = 2; 
    278     gbc.gridy = 6; 
    279     gridbag.setConstraints(customLabel, gbc); 
    280     bottom.add(customLabel); 
    281  
    282     gbc.gridx = 3; 
    283     gbc.gridy = 6; 
    284     gridbag.setConstraints(tMax, gbc); 
    285     bottom.add(tMax); 
     201    gbc.gridy = 3; 
     202    gbc.insets = new Insets(3, 30, 3, 5); 
     203    gridbag.setConstraints(options, gbc); 
     204    bottom.add(options); 
    286205 
    287206    // OME-XML button 
     
    298217      xml.setEnabled(true); 
    299218 
    300       try { 
    301         FileInfo fi = imp.getOriginalFileInfo(); 
    302         if (fi == null) fi = new FileInfo(); 
    303         MetadataStore store = 
    304           LociDataBrowser.reader.getMetadataStore(LociDataBrowser.filename); 
    305         if (store instanceof OMEXMLMetadataStore) { 
    306           fi.description = ((OMEXMLMetadataStore) store).dumpXML(); 
    307         } 
    308         else xml.setEnabled(false); 
    309  
    310         imp.setFileInfo(fi); 
    311       } 
    312       catch (Exception e) { } 
    313  
    314219      gbc.gridx = 5; 
    315220      gbc.gridy = 3; 
     
    318223      bottom.add(xml); 
    319224    } 
    320  
    321     // swap axes button 
    322     JButton swapAxes = new JButton("Swap Axes"); 
    323     if (!db.hasZ || !db.hasT) swapAxes.setEnabled(false); 
    324     swapAxes.addActionListener(this); 
    325     swapAxes.setActionCommand("swap"); 
    326  
    327     gbc.gridx = 0; 
    328     gbc.gridy = 3; 
    329     gbc.gridwidth = 2; 
    330     gbc.insets = new Insets(0, 0, 0, 0); 
    331     gridbag.setConstraints(swapAxes, gbc); 
    332     bottom.add(swapAxes); 
    333  
    334     // checkbox to toggle custom virtualization 
    335  
    336     custom = new JCheckBox("Custom Virtualization"); 
    337     custom.addItemListener(this); 
    338     custom.setBackground(Color.white); 
    339  
    340     gbc.gridy = 4; 
    341     gbc.gridwidth = 2; // end row 
    342     gbc.anchor = GridBagConstraints.LINE_START; 
    343     gridbag.setConstraints(custom, gbc); 
    344     bottom.add(custom); 
    345  
    346225 
    347226    // create enclosing JPanel (for 5-pixel border) 
     
    363242    c = db.numC; 
    364243 
     244    if (db.numC * db.numT * db.numZ == imp.getStackSize()) { 
     245      c = db.numC; 
     246    } 
     247    else c = 1; 
     248 
    365249    pack(); 
    366250 
     
    387271  public void showSlice(int index) { 
    388272    index++; 
     273 
     274    if (db.manager != null) { 
     275      imp.setProcessor("", db.manager.getSlice(index - 1)); 
     276      index = 1; 
     277    } 
     278 
    389279    if (index >= 1 && index <= imp.getStackSize()) { 
    390280      synchronized (imp) { 
     
    398288        "; tSliceSel = " + tSliceSel.getValue() + ")"); 
    399289    } 
     290    repaint(); 
    400291  } 
    401292 
     
    410301    int textGap = 0; 
    411302 
    412     int nSlices = imp.getStackSize(); 
     303    int nSlices = db.numZ * db.numT * c; 
    413304    int currentSlice = imp.getCurrentSlice(); 
     305    if (db.manager != null) currentSlice = db.manager.getSlice(); 
    414306 
    415307    StringBuffer sb = new StringBuffer(); 
     
    464356    int type = imp.getType(); 
    465357    int stackSize = imp.getStackSize(); 
     358    if (db.manager != null) stackSize = db.manager.getSize(); 
    466359    int size = (width * height * stackSize) / 1048576; 
    467360    switch (type) { 
     
    493386  } 
    494387 
     388  /** Set the Z/T values for a custom virtualization. */ 
     389  public void setVirtualization(int[] values) { 
     390    z1 = values[0]; 
     391    z2 = values[1]; 
     392    t1 = values[2]; 
     393    t2 = values[3]; 
     394    customVirtualization = true; 
     395  } 
     396 
     397  /** Swap the axes - if the flag is set, then animate along Z. */ 
     398  public void swap(boolean isZ) { 
     399    customVirtualization = false; 
     400 
     401    if (isZ) { 
     402      zString = Z_STRING; 
     403      tString = T_STRING; 
     404    } 
     405    else { 
     406      zString = T_STRING; 
     407      tString = Z_STRING; 
     408    } 
     409    zLabel.setText(zString); 
     410    tLabel.setText(tString); 
     411    setIndices(); 
     412 
     413    repaint(); 
     414  } 
     415 
     416  /** Return true if the axes are swapped. */ 
     417  public boolean isSwapped() { return zString.equals(T_STRING); } 
     418 
     419  /** Return true if we are using a custom virtualization. */ 
     420  public boolean isCustom() { return customVirtualization; } 
     421 
     422  /** Set the frames per second, and adjust the timer accordingly. */ 
     423  public void setFps(int value) { 
     424    fps = value; 
     425    if (animationTimer != null) animationTimer.setDelay(1000 / fps); 
     426  } 
     427 
    495428  // -- Component methods -- 
    496429 
     
    502435    Object src = e.getSource(); 
    503436    String cmd = e.getActionCommand(); 
    504     if ("xml".equals(cmd)) { 
    505       //int id = imp.getID(); 
     437    if (cmd == null) cmd = ""; // prevent NullPointer 
     438    if (cmd.equals("xml")) { 
    506439      FileInfo fi = imp.getOriginalFileInfo(); 
    507440      String description = fi == null ? null : fi.description; 
     
    520453      meta.setVisible(true); 
    521454    } 
    522     else if ("swap".equals(cmd)) { 
    523       // swap labels 
    524       String tmp2 = zString; 
    525       zString = tString; 
    526       tString = tmp2; 
    527       zLabel.setText(zString); 
    528       tLabel.setText(tString); 
    529       setIndices(); 
    530  
    531       // update buttons 
    532       boolean swapped = zString.equals(T_STRING); 
    533  
    534       repaint(); // redraw info string 
    535  
    536       ((SpinnerNumberModel) tMin.getModel()).setMaximum(new Integer(swapped ? 
    537         (db.hasZ ? db.numZ : 1) : (db.hasT ? db.numT : 1))); 
    538       ((SpinnerNumberModel) tMax.getModel()).setMaximum(new Integer(swapped ? 
    539         (db.hasZ ? db.numZ : 1) : (db.hasT ? db.numT : 1))); 
    540       ((SpinnerNumberModel) zMin.getModel()).setMaximum(new Integer(swapped ? 
    541         (db.hasT ? db.numT : 1) : (db.hasZ ? db.numZ : 1))); 
    542       ((SpinnerNumberModel) zMax.getModel()).setMaximum(new Integer(swapped ? 
    543         (db.hasT ? db.numT : 1) : (db.hasZ ? db.numZ : 1))); 
    544  
    545  
    546       if (customVirtualization) { 
    547         tMin.setEnabled(swapped ? db.hasZ : db.hasT); 
    548         tMax.setEnabled(swapped ? db.hasZ : db.hasT); 
    549         zMin.setEnabled(swapped ? db.hasT : db.hasZ); 
    550         zMax.setEnabled(swapped ? db.hasT : db.hasZ); 
    551       } 
    552       else { 
    553         tMin.setEnabled(false); 
    554         tMax.setEnabled(false); 
    555         zMin.setEnabled(false); 
    556         zMax.setEnabled(false); 
    557       } 
     455    else if (cmd.equals("options")) { 
     456      OptionsWindow ow = new OptionsWindow(db.hasZ ? db.numZ : 1, 
     457        db.hasT ? db.numT : 1, this); 
     458      ow.show(); 
    558459    } 
    559460    else if (src instanceof Timer) { 
     
    562463      if (swapped) { 
    563464        z = zSliceSel.getValue() + 1; 
    564         if (customVirtualization) { 
    565           if (z > z2) z = z1; 
    566         } 
    567         else if (z > db.numZ) z = 1; 
     465        if (customVirtualization && (z > z2)) z = z1; 
     466        else if (!customVirtualization && (z > db.numZ)) z = 1; 
    568467        zSliceSel.setValue(z); 
    569468        setIndices(); 
     
    571470      else { 
    572471        t = tSliceSel.getValue() + 1; 
    573         if (customVirtualization) { 
    574           if (t > t2) t = t1; 
    575         } 
    576         else if (t > db.numT) t = 1; 
     472        if (customVirtualization && (t > t2)) t = t1; 
     473        else if (!customVirtualization && (t > db.numT)) t = 1; 
    577474        tSliceSel.setValue(t); 
    578475        setIndices(); 
     
    589486        } 
    590487 
    591         if (customVirtualization) { 
    592           setIndices(new int[] {z1, z2, t1, t2}); 
    593         } 
     488        if (customVirtualization) setIndices(new int[] {z1, z2, t1, t2}); 
    594489      } 
    595490      else { 
     
    661556 
    662557  public void stateChanged(ChangeEvent e) { 
    663  
    664     Object src = e.getSource(); 
    665     if (src == frameRate) { 
    666       fps = ((Integer) frameRate.getValue()).intValue(); 
    667       if (animationTimer != null) animationTimer.setDelay(1000 / fps); 
    668     } 
    669     else if (src == zMin) { 
    670       z1 = ((Integer) zMin.getValue()).intValue(); 
    671     } 
    672     else if (src == zMax) { 
    673       z2 = ((Integer) zMax.getValue()).intValue(); 
    674     } 
    675     else if (src == tMin) { 
    676       t1 = ((Integer) tMin.getValue()).intValue(); 
    677     } 
    678     else if (src == tMax) { 
    679       t2 = ((Integer) tMax.getValue()).intValue(); 
    680     } 
    681     else { // src == channels 
    682       JSpinner channels = (JSpinner) src; 
    683       c = ((Integer) channels.getValue()).intValue(); 
    684       showSlice(z, t, c); 
    685     } 
     558    JSpinner channels = (JSpinner) e.getSource(); 
     559    c = ((Integer) channels.getValue()).intValue(); 
     560    showSlice(z, t, c); 
    686561  } 
    687562 
     
    689564 
    690565  public synchronized void itemStateChanged(ItemEvent e) { 
    691     if (e.getSource() == custom) { 
    692       customVirtualization = custom.isSelected(); 
    693       if (customVirtualization) { 
    694         tMin.setEnabled(db.hasT); 
    695         tMax.setEnabled(db.hasT); 
    696         zMin.setEnabled(db.hasZ); 
    697         zMax.setEnabled(db.hasZ); 
    698       } 
    699       else { 
    700         tMin.setEnabled(false); 
    701         tMax.setEnabled(false); 
    702         zMin.setEnabled(false); 
    703         zMax.setEnabled(false); 
    704       } 
    705     } 
    706     else { 
    707       JCheckBox channels = (JCheckBox) e.getSource(); 
    708       c = channels.isSelected() ? 1 : 2; 
    709  
    710       if (db.virtual) {setIndices();} 
    711       showSlice(z, t, c); 
    712     } 
     566    JCheckBox channels = (JCheckBox) e.getSource(); 
     567    c = channels.isSelected() ? 1 : 2; 
     568 
     569    if (db.virtual) {setIndices();} 
     570    showSlice(z, t, c); 
    713571  } 
    714572 
  • trunk/loci/browser/ImagePlusWrapper.java

    r1201 r1231  
    1515  protected int sizeX, sizeY, sizeZ, sizeT, sizeC; 
    1616  protected String dim; 
     17  protected MetadataStore store; 
    1718  private int numTotal; // total number of images (across all stitched files) 
    1819 
     
    2122   * @param name file name, or any one 
    2223   *   of the file names if you use file stitching 
    23    * @param virtual false if use file stitching 
     24   * @param stitch true if use file stitching 
    2425   */ 
    25   public ImagePlusWrapper(String name, boolean virtual) throws 
     26  public ImagePlusWrapper(String name, boolean stitch) throws 
    2627    java.io.IOException, FormatException 
    2728  { 
    2829    FormatReader r = LociDataBrowser.reader.getReader(name); 
     30    try { 
     31      OMEXMLMetadataStore s = new OMEXMLMetadataStore(); 
     32      s.createRoot(); 
     33      r.setMetadataStore(s); 
     34    } 
     35    catch (Exception e) { } 
    2936    ChannelMerger cm = null; 
    30     if (virtual) cm = new ChannelMerger(new FileStitcher(r)); 
     37    if (stitch) cm = new ChannelMerger(new FileStitcher(r)); 
    3138    else cm = new ChannelMerger(r); 
    3239 
     
    5764      IJ.showProgress((double)i/num); 
    5865      BufferedImage img = cm.openImage(name, i); 
     66      if (img.getWidth() != sizeX || img.getHeight() != sizeY) { 
     67        try { 
     68          img = ImageTools.scale(img, sizeX, sizeY); 
     69        } 
     70        catch (Exception e) { 
     71        } 
     72      } 
     73 
    5974      ImageProcessor ip = null; 
    6075      WritableRaster raster = img.getRaster(); 
     
    86101          if (stackS == null) { 
    87102            stackS = new ImageStack(w, h); 
    88             stackS.addSlice(name + ":" + (i + 1), ip); 
    89103          } 
     104          stackS.addSlice(name + ":" + (i + 1), ip); 
    90105        } 
    91106        else if (tt == DataBuffer.TYPE_FLOAT) { 
     
    104119      } 
    105120      if (ip == null) { 
    106         ip = new ImagePlus(null, img).getProcessor(); // slow 
     121        ip = new ImagePlus(name, img).getProcessor(); // slow 
    107122        if (stackO == null) { 
    108123          stackO = new ImageStack(w, h); 
     
    133148        average + " ms per plane)"); 
    134149    } 
     150 
     151    store = cm.getMetadataStore(name); 
    135152  } 
    136153 
  • trunk/loci/browser/LociDataBrowser.java

    r1201 r1231  
    77import ij.*; 
    88import ij.gui.ImageCanvas; 
     9import ij.io.FileInfo; 
    910import ij.plugin.PlugIn; 
    1011import java.io.File; 
    11 import javax.swing.*; 
    1212import loci.formats.*; 
    1313import loci.util.FilePattern; 
     
    2727 
    2828  /** Debugging flag. */ 
    29   protected static final boolean DEBUG = true; 
     29  protected static final boolean DEBUG = false; 
    3030 
    3131  // -- Fields -- 
     
    5454  /** whether stack is accessed from disk as needed */ 
    5555  protected boolean virtual; 
     56 
     57  /** cache manager (if virtual stack is used). */ 
     58  protected CacheManager manager; 
    5659 
    5760  private ImageStack stack; 
     
    121124        lengths = new int[3]; 
    122125 
    123         if (DEBUG) { 
    124           System.err.println("zIndex = "+zIndex); 
    125           System.err.println("tIndex = "+tIndex); 
    126           System.err.println("cIndex = "+cIndex); 
    127           System.err.println("numZ = "+numZ); 
    128           System.err.println("numT = "+numT); 
    129           System.err.println("numC = "+numC); 
    130         } 
    131126        String absname = name; 
    132127        filename = absname; 
     
    144139          int num = cm.getImageCount(absname); 
    145140 
     141          int size = 20; 
     142          if (num < size) size = num; 
     143 
     144          manager = new CacheManager(size, cm, absname); 
     145          manager.init(); 
     146 
    146147          try { 
    147             ProgressMonitor progress = new ProgressMonitor(null, 
    148               "Reading image", null, 0, num); 
    149  
    150             // set dimensions appropriately 
    151  
    152148            numZ = cm.getSizeZ(absname); 
    153149            numC = cm.getSizeC(absname); 
     
    170166            lengths[cIndex] = numC; 
    171167 
    172             for (int i=0; i<num; i++) { 
    173               if (progress.isCanceled()) break; 
    174               progress.setProgress(i); 
    175               progress.setNote(" " + (i+1) + " / " + num + " (" + name + ")"); 
    176  
    177               // open image 
    178               if (stack == null) { 
    179                 stack = 
    180                   new ImageStack(cm.getSizeX(absname), cm.getSizeY(absname)); 
    181               } 
    182  
    183               stack.addSlice(absname, (new ImagePlus(absname, 
    184                 cm.openImage(absname, i))).getProcessor()); 
     168            stack = new ImageStack(cm.getSizeX(absname), cm.getSizeY(absname)); 
     169            for (int i=0; i<size; i++) { 
     170              stack.addSlice(absname + " : " + (i+1), manager.getSlice(i)); 
    185171            } 
    186             progress.setProgress(num); 
    187172 
    188173            if (stack == null || stack.getSize() == 0) { 
     
    196181          } 
    197182 
    198           reader.setMetadataStore(fr.getMetadataStore(absname)); 
    199  
    200           show(new ImagePlus(absname, stack)); 
     183          ImagePlus ip = new ImagePlus(absname, stack); 
     184          FileInfo fi = new FileInfo(); 
     185          try { 
     186            fi.description = 
     187              ((OMEXMLMetadataStore) fr.getMetadataStore(absname)).dumpXML(); 
     188          } 
     189          catch (Exception e) { } 
     190 
     191          ip.setFileInfo(fi); 
     192          show(ip); 
    201193        } 
    202194        else { 
    203           ipw = new ImagePlusWrapper(absname, virtual); 
     195          ipw = new ImagePlusWrapper(absname, true); 
    204196          numZ = ipw.sizeZ; numT = ipw.sizeT; numC = ipw.sizeC; 
    205           zIndex = ipw.dim.indexOf('Z')-2; 
    206           tIndex = ipw.dim.indexOf('T')-2; 
    207           cIndex = ipw.dim.indexOf('C')-2; 
     197          zIndex = ipw.dim.indexOf('Z') - 2; 
     198          tIndex = ipw.dim.indexOf('T') - 2; 
     199          cIndex = ipw.dim.indexOf('C') - 2; 
     200 
     201          if (ipw.getImagePlus().getStackSize() != numZ * numT * numC) { 
     202            numC = 1; 
     203          } 
    208204 
    209205          lengths[zIndex] = numZ; 
    210206          lengths[tIndex] = numT; 
    211207          lengths[cIndex] = numC; 
     208 
     209          hasZ = numZ > 1; 
     210          hasT = numT > 1; 
     211          hasC = numC > 1; 
     212 
     213          FileInfo fi = ipw.getImagePlus().getOriginalFileInfo(); 
     214          if (fi == null) fi = new FileInfo(); 
     215          try { 
     216            fi.description = ((OMEXMLMetadataStore) ipw.store).dumpXML(); 
     217          } 
     218          catch (Exception e) { } 
     219          ipw.getImagePlus().setFileInfo(fi); 
    212220 
    213221          show(ipw.getImagePlus()); 
Note: See TracChangeset for help on using the changeset viewer.