Changeset 1201


Ignore:
Timestamp:
07/28/06 12:28:54 (14 years ago)
Author:
melissa
Message:

cleaned up Data Browser

Location:
trunk/loci/browser
Files:
3 deleted
5 edited

Legend:

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

    r1178 r1201  
    1818import javax.swing.event.ChangeEvent; 
    1919import javax.swing.event.ChangeListener; 
     20import loci.formats.MetadataStore; 
     21import loci.formats.OMEXMLMetadataStore; 
    2022import loci.ome.viewer.MetadataPane; 
    2123 
     
    3941  private int fps = 10; 
    4042  private int z = 1, t = 1, c = 1; 
    41   private int oldZ, oldT; // for virtual stack 
    4243  private boolean customVirtualization = false; 
    43   private int z1, z2, t1, t2; 
     44  private int z1 = 1, z2 = 1, t1 = 1, t2 = 1; 
    4445 
    4546  // -- Fields - widgets -- 
    4647 
    47   private JLabel zLabel, tLabel, waitLabel; 
     48  private JLabel zLabel, tLabel;//, waitLabel; 
    4849  private JScrollBar zSliceSel, tSliceSel; 
    4950  private JLabel fpsLabel; 
     
    5253  private Timer animationTimer; 
    5354  private JButton animate; 
    54   private ImageStack stack; 
    55   private JProgressBar progressBar; 
    56   private Thread thread; 
     55  private JSpinner zMin, zMax, tMin, tMax; 
     56  private JCheckBox custom; 
    5757 
    5858  // -- Constructor -- 
     
    115115    bottom.add(tLabel); 
    116116 
    117 //     waitLabel = new JLabel("  "); 
    118 //     waitLabel.setHorizontalTextPosition(JLabel.LEFT); 
    119 //     gbc.gridx = 0; 
    120 //     gbc.gridy = 4; 
    121 //     gbc.gridwidth = 3; 
    122 //     gbc.ipadx = 60; 
    123 //     gridbag.setConstraints(waitLabel, gbc); 
    124 //     bottom.add(waitLabel); 
    125  
    126117    gbc.ipadx = 30; 
    127118 
     
    195186    // animate button 
    196187    animate = new JButton(ANIM_STRING); 
    197     if (!db.hasT) animate.setEnabled(false); 
     188    if (!db.hasT && !db.hasZ) animate.setEnabled(false); 
    198189    animate.addActionListener(this); 
    199190 
     
    210201    // FPS label 
    211202    fpsLabel = new JLabel("fps"); 
    212     if (!db.hasT) fpsLabel.setEnabled(false); 
    213203 
    214204    gbc.gridx = 7; 
     
    223213    SpinnerModel model = new SpinnerNumberModel(10, 1, 99, 1); 
    224214    frameRate = new JSpinner(model); 
    225     if (!db.hasT) frameRate.setEnabled(false); 
    226215    frameRate.addChangeListener(this); 
    227216 
     
    232221    bottom.add(frameRate); 
    233222 
     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); 
     259 
     260    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); 
     286 
    234287    // OME-XML button 
    235288    boolean canDoXML = true; 
     
    243296      xml.addActionListener(this); 
    244297      xml.setActionCommand("xml"); 
    245       FileInfo fi = imp.getOriginalFileInfo(); 
    246       String description = fi == null ? null : fi.description; 
    247       if (description == null || description.length() < 5 || 
    248         !description.substring(0, 5).toLowerCase().equals("<?xml")) 
    249       { 
    250         xml.setEnabled(false); 
    251       } 
     298      xml.setEnabled(true); 
     299 
     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) { } 
    252313 
    253314      gbc.gridx = 5; 
     
    259320 
    260321    // swap axes button 
    261     JButton swapAxes= new JButton("Swap Axes"); 
     322    JButton swapAxes = new JButton("Swap Axes"); 
    262323    if (!db.hasZ || !db.hasT) swapAxes.setEnabled(false); 
    263324    swapAxes.addActionListener(this); 
    264325    swapAxes.setActionCommand("swap"); 
    265  
    266326 
    267327    gbc.gridx = 0; 
     
    272332    bottom.add(swapAxes); 
    273333 
    274     // options button 
    275     JButton options = new JButton("Options..."); 
    276     options.addActionListener(this); 
    277     options.setActionCommand("options"); 
    278  
    279     gbc.gridx = 6; 
     334    // checkbox to toggle custom virtualization 
     335 
     336    custom = new JCheckBox("Custom Virtualization"); 
     337    custom.addItemListener(this); 
     338    custom.setBackground(Color.white); 
     339 
    280340    gbc.gridy = 4; 
    281     gridbag.setConstraints(options, gbc); 
    282     bottom.add(options); 
    283  
    284  
    285     progressBar = new JProgressBar(); 
    286     progressBar.setStringPainted(true); 
    287     progressBar.setString(" "); 
    288     progressBar.setValue(0); 
    289     gbc.gridx = 1; 
    290     gbc.gridy = 4; 
    291     gbc.gridwidth = 1; 
    292     gridbag.setConstraints(progressBar, gbc); 
    293     bottom.add(progressBar); 
     341    gbc.gridwidth = 2; // end row 
     342    gbc.anchor = GridBagConstraints.LINE_START; 
     343    gridbag.setConstraints(custom, gbc); 
     344    bottom.add(custom); 
     345 
    294346 
    295347    // create enclosing JPanel (for 5-pixel border) 
     
    309361 
    310362    // repack to take extra panel into account 
    311     c = db.numC == 1 ? 2 : 1; 
     363    c = db.numC; 
    312364 
    313365    pack(); 
     
    326378    int index = db.getIndex(z - 1, t - 1, c - 1); 
    327379    if (LociDataBrowser.DEBUG) { 
    328       db.log("showSlice: index=" + index + 
     380      IJ.log("showSlice: index=" + index + 
    329381        "; z=" + z + "; t=" + t + "; c=" + c); 
    330382    } 
     
    334386  /** selects and shows slice defined by index */ 
    335387  public void showSlice(int index) { 
     388    index++; 
    336389    if (index >= 1 && index <= imp.getStackSize()) { 
    337390      synchronized (imp) { 
     
    341394    } 
    342395    else if (LociDataBrowser.DEBUG) { 
    343       db.log("invalid index: " + index + " (size = " + imp.getStackSize() + 
     396      IJ.log("invalid index: " + index + " (size = " + imp.getStackSize() + 
    344397        "; zSliceSel = " + zSliceSel.getValue() + 
    345398        "; tSliceSel = " + tSliceSel.getValue() + ")"); 
     
    358411 
    359412    int nSlices = imp.getStackSize(); 
    360  
    361     //    ImageStack stack = imp.getStack(); 
    362413    int currentSlice = imp.getCurrentSlice(); 
    363414 
     
    452503    String cmd = e.getActionCommand(); 
    453504    if ("xml".equals(cmd)) { 
    454       int id = imp.getID(); 
     505      //int id = imp.getID(); 
    455506      FileInfo fi = imp.getOriginalFileInfo(); 
    456507      String description = fi == null ? null : fi.description; 
     
    476527      zLabel.setText(zString); 
    477528      tLabel.setText(tString); 
    478       ImageStack is = imp.getStack(); 
    479       if (is instanceof VirtualStack) setIndices(); 
     529      setIndices(); 
    480530 
    481531      // update buttons 
    482532      boolean swapped = zString.equals(T_STRING); 
    483       boolean anim = (!swapped && db.hasT) || (swapped && db.hasZ); 
    484       animate.setEnabled(anim); 
    485       fpsLabel.setEnabled(anim); 
    486       frameRate.setEnabled(anim); 
     533 
    487534      repaint(); // redraw info string 
    488     } 
    489     else if ("options".equals(cmd)) { 
    490       // pops up options menu 
    491       OptionsWindow ow = new OptionsWindow(zSliceSel.getMaximum(), 
    492         tSliceSel.getMaximum()); 
    493       ow.popup(this,z,t); 
    494       setIndices(ow.getVirtualBounds()); 
    495       customVirtualization = ow.isCustomVirtualization(); 
     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      } 
    496558    } 
    497559    else if (src instanceof Timer) { 
    498       boolean swapped = zString.equals(T_STRING); 
     560      boolean swapped = zString.equals(T_STRING) || !db.hasT; 
     561 
    499562      if (swapped) { 
    500563        z = zSliceSel.getValue() + 1; 
     
    504567        else if (z > db.numZ) z = 1; 
    505568        zSliceSel.setValue(z); 
     569        setIndices(); 
    506570      } 
    507571      else { 
     
    512576        else if (t > db.numT) t = 1; 
    513577        tSliceSel.setValue(t); 
     578        setIndices(); 
    514579      } 
    515580      showSlice(z, t, c); 
     
    522587        if (db.virtual && !customVirtualization) { 
    523588          synchronized(imp) { setIndices(); } 
     589        } 
     590 
     591        if (customVirtualization) { 
     592          setIndices(new int[] {z1, z2, t1, t2}); 
    524593        } 
    525594      } 
     
    543612      System.err.println("t: "+idx[2]+" to "+idx[3]); 
    544613    } 
    545     customVirtualization = true; 
    546     ImageStack is = imp.getStack(); 
    547     int[] indices = new int[(idx[1]-idx[0]+1)*(idx[3]-idx[2]+1)]; 
     614    int[] indices = new int[(idx[1] - idx[0] + 1) * (idx[3] - idx[2] + 1)]; 
    548615    z1 = idx[0]; z2 = idx[1]; t1 = idx[2]; t2 = idx[3]; 
    549616    int k=0; 
    550     if (is instanceof VirtualStack) { 
    551       for (int i=idx[0]; i<=idx[1]; i++) { 
    552         for (int j=idx[2]; j<=idx[3]; j++) { 
    553           indices[k++] = db.getIndex(i-1,j-1,c-1); 
    554         } 
    555       } 
    556     } 
    557     ((VirtualStack) is).setIndices(indices,progressBar); 
     617 
     618    for (int i=idx[0]; i<= idx[1]; i++) { 
     619      for (int j=idx[2]; j<=idx[3]; j++) { 
     620        indices[k++] = db.getIndex(i-1, j-1, c-1); 
     621      } 
     622    } 
    558623  } 
    559624 
    560625  public synchronized void setIndices() { 
    561     customVirtualization = false; 
    562     ImageStack is = imp.getStack(); 
    563     if (is instanceof VirtualStack) { 
    564       boolean swapped = zString.equals(T_STRING); 
    565       if (swapped) { // animate top scrolling bar 
    566         int[] indices = new int[zSliceSel.getMaximum()-1]; 
    567         for (int k=0; k<indices.length; k++) { 
    568           indices[k] = db.getIndex(k,t-1,c-1); 
    569         } 
    570         if (LociDataBrowser.DEBUG) { 
    571           System.err.println("Indices:"); 
    572           for (int k=0; k<indices.length; k++) 
    573           System.err.print(indices[k]+" "); 
    574           System.err.println(); 
    575         } 
    576         ((VirtualStack) is).setIndices(indices,progressBar); 
    577       } 
    578       else { 
    579         int[] indices = new int[tSliceSel.getMaximum()-1]; 
    580         for (int k=0; k<indices.length; k++) { 
    581           indices[k] = db.getIndex(z-1,k,c-1); 
    582         } 
    583         ((VirtualStack) is).setIndices(indices,progressBar); 
     626    boolean swapped = zString.equals(T_STRING) || !db.hasT; 
     627    if (swapped) {  // animate top scrolling bar 
     628      int[] indices = new int[zSliceSel.getMaximum() - 1]; 
     629      for (int k=0; k<indices.length; k++) { 
     630        indices[k] = db.getIndex(k, t-1, c-1); 
     631      } 
     632    } 
     633    else { 
     634      int[] indices = new int[tSliceSel.getMaximum() - 1]; 
     635      for (int k=0; k<indices.length; k++) { 
     636        indices[k] = db.getIndex(z-1, k, c-1); 
    584637      } 
    585638    } 
     
    608661 
    609662  public void stateChanged(ChangeEvent e) { 
     663 
    610664    Object src = e.getSource(); 
    611665    if (src == frameRate) { 
     
    613667      if (animationTimer != null) animationTimer.setDelay(1000 / fps); 
    614668    } 
     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    } 
    615681    else { // src == channels 
    616682      JSpinner channels = (JSpinner) src; 
     
    623689 
    624690  public synchronized void itemStateChanged(ItemEvent e) { 
    625     JCheckBox channels = (JCheckBox) e.getSource(); 
    626     c = channels.isSelected() ? 1 : 2; 
    627  
    628     if (db.virtual) {setIndices();} 
    629     showSlice(z, t, c); 
     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    } 
    630713  } 
    631714 
  • trunk/loci/browser/ImagePlusWrapper.java

    r1178 r1201  
    1616  protected String dim; 
    1717  private int numTotal; // total number of images (across all stitched files) 
    18   private int numSingle; 
    1918 
    2019  /** 
     
    2726    java.io.IOException, FormatException 
    2827  { 
    29     loci.formats.ImageReader reader = new ImageReader(); 
    30     loci.formats.FormatReader r = reader.getReader(name); 
     28    FormatReader r = LociDataBrowser.reader.getReader(name); 
    3129    ChannelMerger cm = null; 
    3230    if (virtual) cm = new ChannelMerger(new FileStitcher(r)); 
    33     else  cm = new ChannelMerger(r); 
     31    else cm = new ChannelMerger(r); 
    3432 
    3533    // get # images in all matching files 
    36     numTotal = reader.getTotalImageCount(name); // gives wrong number! 
     34    numTotal = cm.getImageCount(name); 
    3735 
    38     dim = reader.getDimensionOrder(name); 
    39     sizeX = reader.getSizeX(name); 
    40     sizeY = reader.getSizeY(name); 
    41     sizeZ = reader.getSizeZ(name); 
    42     sizeT = reader.getSizeT(name); 
    43     sizeC = reader.getSizeC(name); 
    44     numSingle = reader.getImageCount(name); 
    45     System.err.println("numSingle = "+numSingle); 
    46     System.err.println("numTotal = "+numTotal); 
    47     if (!virtual) { 
    48       int num = reader.getImageCount(name); 
    49       ImageStack stackB = null, stackS = null, 
    50         stackF = null, stackO = null; 
    51       long start = System.currentTimeMillis(); 
    52       long time = start; 
    53       for (int i=0; i<num; i++) { 
    54         long clock = System.currentTimeMillis(); 
    55         if (clock - time >= 50) { 
    56           IJ.showStatus("Reading plane "+(i+1)+"/"+num); 
    57           time = clock; 
     36    dim = cm.getDimensionOrder(name); 
     37    sizeX = cm.getSizeX(name); 
     38    sizeY = cm.getSizeY(name); 
     39    sizeZ = cm.getSizeZ(name); 
     40    sizeT = cm.getSizeT(name); 
     41    sizeC = cm.getSizeC(name); 
     42    if (LociDataBrowser.DEBUG) { 
     43      System.err.println("numTotal = "+numTotal); 
     44    } 
     45 
     46    int num = cm.getImageCount(name); 
     47    ImageStack stackB = null, stackS = null, 
     48      stackF = null, stackO = null; 
     49    long start = System.currentTimeMillis(); 
     50    long time = start; 
     51    for (int i=0; i<num; i++) { 
     52      long clock = System.currentTimeMillis(); 
     53      if (clock - time >= 50) { 
     54        IJ.showStatus("Reading plane "+(i+1)+"/"+num); 
     55        time = clock; 
     56      } 
     57      IJ.showProgress((double)i/num); 
     58      BufferedImage img = cm.openImage(name, i); 
     59      ImageProcessor ip = null; 
     60      WritableRaster raster = img.getRaster(); 
     61      int c = raster.getNumBands(); 
     62      int tt = raster.getTransferType(); 
     63      int w = img.getWidth(), h = img.getHeight(); 
     64      if (c == 1) { 
     65        if (tt == DataBuffer.TYPE_BYTE) { 
     66          byte[] b = ImageTools.getBytes(img)[0]; 
     67          if (b.length > w*h) { 
     68            byte[] tmp = b; 
     69            b = new byte[w*h]; 
     70            System.arraycopy(tmp,0,b,0,b.length); 
     71          } 
     72          ip = new ByteProcessor (w,h,b,null); 
     73          if (stackB == null) { 
     74            stackB = new ImageStack(w,h); 
     75          } 
     76          stackB.addSlice(name + ":" + (i + 1), ip); 
    5877        } 
    59         IJ.showProgress((double)i/num); 
    60         BufferedImage img = cm.openStitchedImage(name, i); 
    61         ImageProcessor ip = null; 
    62         WritableRaster raster = img.getRaster(); 
    63         int c = raster.getNumBands(); 
    64         int tt = raster.getTransferType(); 
    65         int w = img.getWidth(), h = img.getHeight(); 
    66         if (c == 1) { 
    67           if (tt == DataBuffer.TYPE_BYTE) { 
    68             byte[] b = ImageTools.getBytes(img)[0]; 
    69             if (b.length > w*h) { 
    70               byte[] tmp = b; 
    71               b = new byte[w*h]; 
    72               System.arraycopy(tmp,0,b,0,b.length); 
    73             } 
    74             ip = new ByteProcessor (w,h,b,null); 
    75             if (stackB == null) { 
    76               if (virtual) stackB = new VirtualStack(w,h); 
    77               else stackB = new ImageStack(w,h); 
    78             } 
    79             stackB.addSlice(name + ":" + (i + 1), ip); 
     78        else if (tt == DataBuffer.TYPE_USHORT) { 
     79          short[] s = ImageTools.getShorts(img)[0]; 
     80          if (s.length > w*h) { 
     81            short[] tmp = s; 
     82            s = new short[w*h]; 
     83            System.arraycopy(tmp, 0, s, 0, s.length); 
    8084          } 
    81           else if (tt == DataBuffer.TYPE_USHORT) { 
    82             short[] s = ImageTools.getShorts(img)[0]; 
    83             if (s.length > w*h) { 
    84               short[] tmp = s; 
    85               s = new short[w*h]; 
    86               System.arraycopy(tmp, 0, s, 0, s.length); 
    87             } 
    88             ip = new ShortProcessor(w, h, s, null); 
    89             if (stackS == null) { 
    90               if (virtual) stackS = new VirtualStack(w, h); 
    91               else stackS = new ImageStack(w, h); 
    92               stackS.addSlice(name + ":" + (i + 1), ip); 
    93             } 
    94           } 
    95           else if (tt == DataBuffer.TYPE_FLOAT) { 
    96             float[] f = ImageTools.getFloats(img)[0]; 
    97             if (f.length > w*h) { 
    98               float[] tmp = f; 
    99               f = new float[w*h]; 
    100               System.arraycopy(tmp, 0, f, 0, f.length); 
    101             } 
    102             ip = new FloatProcessor(w, h, f, null); 
    103             if (stackF == null) { 
    104               if (virtual) stackF = new VirtualStack(w, h); 
    105               stackF = new ImageStack(w, h); 
    106             } 
    107             stackF.addSlice(name + ":" + (i + 1), ip); 
     85          ip = new ShortProcessor(w, h, s, null); 
     86          if (stackS == null) { 
     87            stackS = new ImageStack(w, h); 
     88            stackS.addSlice(name + ":" + (i + 1), ip); 
    10889          } 
    10990        } 
    110         if (ip == null) { 
    111           ip = new ImagePlus(null, img).getProcessor(); // slow 
    112           if (stackO == null) { 
    113             if (virtual) stackO = new VirtualStack(w,h); 
    114             else stackO = new ImageStack(w, h); 
     91        else if (tt == DataBuffer.TYPE_FLOAT) { 
     92          float[] f = ImageTools.getFloats(img)[0]; 
     93          if (f.length > w*h) { 
     94            float[] tmp = f; 
     95            f = new float[w*h]; 
     96            System.arraycopy(tmp, 0, f, 0, f.length); 
    11597          } 
    116           stackO.addSlice(name + ":" + (i + 1), ip); 
     98          ip = new FloatProcessor(w, h, f, null); 
     99          if (stackF == null) { 
     100            stackF = new ImageStack(w, h); 
     101          } 
     102          stackF.addSlice(name + ":" + (i + 1), ip); 
    117103        } 
    118104      } 
    119       IJ.showStatus("Creating image"); 
    120       IJ.showProgress(1); 
    121       if (stackB != null) { 
    122         imp = new ImagePlus(name, stackB); 
     105      if (ip == null) { 
     106        ip = new ImagePlus(null, img).getProcessor(); // slow 
     107        if (stackO == null) { 
     108          stackO = new ImageStack(w, h); 
     109        } 
     110        stackO.addSlice(name + ":" + (i + 1), ip); 
    123111      } 
    124       if (stackS != null) { 
    125         imp = new ImagePlus(name, stackS); 
    126       } 
    127       if (stackF != null) { 
    128         imp = new ImagePlus(name, stackF); 
    129       } 
    130       if (stackO != null) { 
    131         imp = new ImagePlus(name, stackO); 
    132       } 
    133       long end = System.currentTimeMillis(); 
    134       double elapsed = (end - start) / 1000.0; 
    135       if (num == 1) IJ.showStatus(elapsed + " seconds"); 
    136       else { 
    137         long average = (end - start) / num; 
    138         IJ.showStatus("LOCI Bio-Formats : " + elapsed + " seconds (" + 
    139           average + " ms per plane)"); 
    140       } 
     112    } 
     113    IJ.showStatus("Creating image"); 
     114    IJ.showProgress(1); 
     115    if (stackB != null) { 
     116      imp = new ImagePlus(name, stackB); 
     117    } 
     118    if (stackS != null) { 
     119      imp = new ImagePlus(name, stackS); 
     120    } 
     121    if (stackF != null) { 
     122      imp = new ImagePlus(name, stackF); 
     123    } 
     124    if (stackO != null) { 
     125      imp = new ImagePlus(name, stackO); 
     126    } 
     127    long end = System.currentTimeMillis(); 
     128    double elapsed = (end - start) / 1000.0; 
     129    if (num == 1) IJ.showStatus(elapsed + " seconds"); 
     130    else { 
     131      long average = (end - start) / num; 
     132      IJ.showStatus("LOCI Bio-Formats : " + elapsed + " seconds (" + 
     133        average + " ms per plane)"); 
    141134    } 
    142135  } 
     
    146139  public int getNumTotal() { return numTotal; } 
    147140 
    148   public int getNumSingle() { return numSingle; } 
    149  
    150141} 
    151142 
  • trunk/loci/browser/ImagePreview.java

    r1178 r1201  
    3737      //because the image we're trying to load is probably not one 
    3838      //of this program's own resources. 
    39       System.err.println("file path: "+file.getAbsolutePath()); 
     39      if (LociDataBrowser.DEBUG) { 
     40        System.err.println("file path: "+file.getAbsolutePath()); 
     41      } 
    4042 
    41       // CTR TODO this is stupid 
    4243      ImageReader ir = new ImageReader(); 
    4344      FormatReader fr = ir.getReader(file.getAbsolutePath()); 
    44       ChannelMerger cm = new ChannelMerger(fr); 
    45       BufferedImage image = cm.openImage(file.getAbsolutePath(),0); 
    46       ImageIcon tmpIcon = new ImageIcon( 
    47         Toolkit.getDefaultToolkit().createImage(image.getSource())); 
     45      BufferedImage image = fr.openImage(file.getAbsolutePath(),0); 
    4846 
    49       if (tmpIcon != null) { 
    50         if (tmpIcon.getIconWidth() > 90) { 
    51           thumbnail = new ImageIcon(tmpIcon.getImage().getScaledInstance(90, 
    52             -1, Image.SCALE_DEFAULT)); 
    53         } 
    54         else { // no need to miniaturize 
    55           thumbnail = tmpIcon; 
    56         } 
    57       } 
     47      thumbnail = 
     48        new ImageIcon(image.getScaledInstance(90, -1, Image.SCALE_DEFAULT)); 
    5849    } 
    5950    catch (Exception e) { e.printStackTrace(); } 
  • trunk/loci/browser/LociDataBrowser.java

    r1178 r1201  
    66 
    77import ij.*; 
    8 import ij.io.FileInfo; 
    98import ij.gui.ImageCanvas; 
    109import ij.plugin.PlugIn; 
    11 import java.awt.Toolkit; 
    12 import java.awt.image.BufferedImage; 
    13 import java.awt.image.ColorModel; 
    1410import java.io.File; 
    15 import java.lang.reflect.Array; 
    1611import javax.swing.*; 
    1712import loci.formats.*; 
     
    3429  protected static final boolean DEBUG = true; 
    3530 
    36   /** Prefix endings indicating numbering block represents T. */ 
    37   private static final String[] PRE_T = { 
    38     "_T", "-T", ".T", "_TP", "-TP", ".TP", "_TL", "-TL", ".TL" 
    39   }; 
    40  
    41   /** Prefix endings indicating numbering block represents Z. */ 
    42   private static final String[] PRE_Z = { 
    43     "_Z", "-Z", ".Z", "_ZS", "-ZS", ".ZS", 
    44     "_FP", "-FP", ".FP", "_SEC", "-SEC", ".SEC" 
    45   }; 
    46  
    47   /** Prefix endings indicating numbering block represents C. */ 
    48   private static final String[] PRE_C = { 
    49     "_C", "-C", ".C", "_CH", "-CH", ".CH" 
    50   }; 
    51  
    5231  // -- Fields -- 
    5332 
     
    5534  protected String[] names; 
    5635 
     36  /** The file format reader used by the plugin. */ 
     37  protected static ImageReader reader = new ImageReader(); 
     38 
     39  /** The current file name. */ 
     40  protected static String filename; 
     41 
    5742  /** whether dataset has multiple Z, T and C positions */ 
    5843  protected boolean hasZ, hasT, hasC; 
     
    7055  protected boolean virtual; 
    7156 
    72   private ImagePlus imp; 
    73  
    7457  private ImageStack stack; 
    7558 
    7659  // -- LociDataBrowser methods -- 
    77  
    78   private void slice(ImageStack is, String file, int c) { 
    79     ImageStack[] newStacks = new ImageStack[c]; 
    80     for (int i=0; i<newStacks.length; i++) { 
    81       newStacks[i] = new ImageStack(is.getWidth(), is.getHeight()); 
    82     } 
    83  
    84     for (int i=1; i<=is.getSize(); i+=c) { 
    85       for (int j=0; j<c; j++) { 
    86         newStacks[j].addSlice(is.getSliceLabel(i+j), is.getProcessor(i+j)); 
    87       } 
    88     } 
    89  
    90     for (int i=0; i<newStacks.length; i++) { 
    91       new ImagePlus(file + " - Ch" + (i+1), newStacks[i]).show(); 
    92     } 
    93   } 
    9460 
    9561  /** Displays the given ImageJ image in a 4D browser window. */ 
     
    9864 
    9965    if (stackSize == 0) { 
    100       msg("Cannot show invalid image."); 
     66      IJ.showMessage("Cannot show invalid image."); 
    10167      return; 
    10268    } 
     
    10975 
    11076    new CustomWindow(this, imp, new ImageCanvas(imp)); 
    111   } 
    112  
    113   /** 
    114    * Shows the given image in a 4D browser window, using the given parameters. 
    115    * @param imp the image to be shown 
    116    * @param labels text to be shown for each slice 
    117    * @param axes length of each dimensional axis 
    118    * @param countZ number of Z positions (should be at least 1) 
    119    * @param countT number of T positions (should be at least 1) 
    120    * @param countC number of C positions (should be at least 1) 
    121    * @param indexZ axis number of Z axis, or -1 for no Z axis 
    122    * @param indexT axis number of T axis, or -1 for no T axis 
    123    * @param indexC axis number of C axis, or -1 for no C axis 
    124    */ 
    125   public void show(ImagePlus imp, String[] labels, int[] axes, 
    126     int countZ, int countT, int countC, int indexZ, int indexT, int indexC) 
    127   { 
    128     names = labels; 
    129     lengths = axes; 
    130     numZ = countZ; 
    131     numT = countT; 
    132     numC = countC; 
    133     hasZ = numZ > 1; 
    134     hasT = numT > 1; 
    135     hasC = numC > 1; 
    136     zIndex = indexZ; 
    137     tIndex = indexT; 
    138     cIndex = indexC; 
    139     show(imp); 
    14077  } 
    14178 
     
    14683    if (tIndex >= 0) pos[tIndex] = t; 
    14784    if (cIndex >= 0) pos[cIndex] = c; 
    148 //    System.err.println("lengths.length = "+lengths.length); 
    149 //    System.err.println("pos[zIndex] = "+pos[zIndex]); 
    150 //    System.err.println("pos[tIndex] = "+pos[tIndex]); 
    151 //    System.err.println("pos[cIndex] = "+pos[cIndex]); 
    152 //    System.err.println("positionToRaster = "+ 
    153 //      (MathUtil.positionToRaster(lengths, pos) + 1)); 
    15485    return MathUtil.positionToRaster(lengths, pos); 
    15586  } 
     
    16192    double ver = Double.parseDouble(version.substring(0, 3)); 
    16293    if (ver < 1.4) { 
    163       msg("Sorry, the 4D Data Browser requires\n" + 
     94      IJ.showMessage("Sorry, the 4D Data Browser requires\n" + 
    16495        "Java 1.4 or later. You can download ImageJ\n" + 
    16596        "with JRE 5.0 from the ImageJ web site."); 
    16697      return; 
    16798    } 
    168     LociOpener lociOpener; 
    169     loci.formats.ImageReader reader = new ImageReader(); 
     99    LociOpener lociOpener = new LociOpener(); 
    170100    boolean done2 = false; 
    171101    String directory = ""; 
     
    173103    boolean quiet = false; 
    174104    // get file name and virtual stack option 
    175     lociOpener = new LociOpener(); 
    176105    stack = null; 
    177106    while (!done2) { 
     
    181110        name = lociOpener.getAbsolutePath(); 
    182111        virtual = lociOpener.getVirtual(); 
    183         VirtualStack.path = directory; 
    184112        if (name == null || lociOpener.isCanceled()) return; 
    185113        if (DEBUG) { 
    186           log("directory", directory); 
    187           log("name", name); 
    188           log("virtual", virtual); 
    189         } 
    190         System.err.println("ImageCount = "+reader.getImageCount(name)); 
     114          IJ.log("directory = " + directory); 
     115          IJ.log("name = " + name); 
     116          IJ.log("virtual = " + virtual); 
     117        } 
    191118        ImagePlusWrapper ipw = null; 
     119 
    192120        // process input 
    193         ipw = new ImagePlusWrapper(name, virtual); 
    194         numZ = ipw.sizeZ; numT = ipw.sizeT; numC = ipw.sizeC; 
    195         zIndex = ipw.dim.indexOf('Z')-2; 
    196         tIndex = ipw.dim.indexOf('T')-2; 
    197         cIndex = ipw.dim.indexOf('C')-2; 
    198         hasZ = numZ != 1; 
    199         hasT = numT != 1; 
    200         hasC = numC != 1; 
    201121        lengths = new int[3]; 
    202         lengths[zIndex] = numZ; 
    203         lengths[tIndex] = numT; 
    204         lengths[cIndex] = numC; 
    205         System.err.println("dim = "+ipw.dim); 
    206         System.err.println("zIndex = "+zIndex); 
    207         System.err.println("tIndex = "+tIndex); 
    208         System.err.println("cIndex = "+cIndex); 
    209         System.err.println("numZ = "+numZ); 
    210         System.err.println("numT = "+numT); 
    211         System.err.println("numC = "+numC); 
     122 
     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        } 
    212131        String absname = name; 
    213         name = strip(name); 
     132        filename = absname; 
     133        name = FilePattern.findPattern(new File(name)); 
    214134        name = name.substring(name.lastIndexOf(File.separatorChar)+1); 
    215         System.err.println("name = "+name); 
     135        if (DEBUG) System.err.println("name = "+name); 
    216136 
    217137        if (virtual) { 
    218           String pattern = FilePattern.findPattern(name,directory); 
    219           FilePattern fp = new FilePattern(pattern); 
    220  
    221           // CTR TODO - this is stupid 
    222           ImageReader ir = new ImageReader(); 
    223           FormatReader fr = new ChannelMerger(ir.getReader(absname)); 
    224           BufferedImage image = fr.openImage(absname, 0); 
    225           imp = new ImagePlus(name, 
    226             Toolkit.getDefaultToolkit().createImage(image.getSource())); 
    227  
    228           String[] filenames = fp.getFiles(); // all the image files 
    229           int dirLen = directory.length(); 
    230           for (int i=0; i<filenames.length; i++) { 
    231             int q = dirLen; 
    232             while (filenames[i].charAt(q) == File.separatorChar) q++; 
    233             filenames[i] = filenames[i].substring(q); 
    234           } 
    235  
    236           // read images 
    237           int depth = 0, width = 0, height = 0, type = 0; 
    238           FileInfo fi = null; 
     138          FormatReader fr = reader.getReader(absname); 
     139          fr.setMetadataStore(new OMEXMLMetadataStore()); 
     140          fr.getMetadataStore(absname).createRoot(); 
     141          FileStitcher fs = new FileStitcher(fr); 
     142          ChannelMerger cm = new ChannelMerger(fs); 
     143 
     144          int num = cm.getImageCount(absname); 
     145 
    239146          try { 
    240147            ProgressMonitor progress = new ProgressMonitor(null, 
    241               "Reading", null, 0, filenames.length); 
    242             progress.setMillisToPopup(50); 
    243             System.err.println("filenames.length = "+filenames.length); 
    244             for (int i=0; i<filenames.length; i++) { 
     148              "Reading image", null, 0, num); 
     149 
     150            // set dimensions appropriately 
     151 
     152            numZ = cm.getSizeZ(absname); 
     153            numC = cm.getSizeC(absname); 
     154            if (cm.isRGB(absname)) { 
     155              if (numC <= 3) numC = 1; 
     156              else numC /= 3; 
     157            } 
     158            numT = cm.getSizeT(absname); 
     159            hasZ = numZ > 1; 
     160            hasC = numC > 1; 
     161            hasT = numT > 1; 
     162 
     163            String order = cm.getDimensionOrder(absname); 
     164            zIndex = order.indexOf("Z") - 2; 
     165            cIndex = order.indexOf("C") - 2; 
     166            tIndex = order.indexOf("T") - 2; 
     167 
     168            lengths[zIndex] = numZ; 
     169            lengths[tIndex] = numT; 
     170            lengths[cIndex] = numC; 
     171 
     172            for (int i=0; i<num; i++) { 
    245173              if (progress.isCanceled()) break; 
    246174              progress.setProgress(i); 
    247               progress.setNote(filenames[i]); 
     175              progress.setNote(" " + (i+1) + " / " + num + " (" + name + ")"); 
    248176 
    249177              // open image 
    250               if (imp == null) { 
    251                 // invalid image 
    252                 log(filenames[i] + ": unable to open"); 
    253                 continue; 
     178              if (stack == null) { 
     179                stack = 
     180                  new ImageStack(cm.getSizeX(absname), cm.getSizeY(absname)); 
    254181              } 
    255182 
    256               if (stack == null) { 
    257                 // first image in the stack 
    258                 System.err.println("depth = "+depth); 
    259                 width = imp.getWidth(); 
    260                 height = imp.getHeight(); 
    261                 type = imp.getType(); 
    262                 System.err.println("In here!!"); 
    263                 ColorModel cm = imp.getProcessor().getColorModel(); 
    264                 stack = new VirtualStack(width, height, cm, directory); 
    265                 depth = ipw.getNumSingle(); 
    266                 ((VirtualStack)stack).stacksize = depth; 
    267               } 
    268  
    269               // verify image is sane 
    270               int w = imp.getWidth(), h = imp.getHeight(), t = imp.getType(); 
    271               if (w != width || h != height) { 
    272                 // current image dimension different than those in the stack 
    273                 log(filenames[i] + ": wrong dimensions (" + w + " x " + h + 
    274                   " instead of " + width + " x " + height + ")"); 
    275                 continue; 
    276               } 
    277               if (t != type) { 
    278                 // current image file type different than those in the stack 
    279                 log(filenames[i] + ": wrong type (" + 
    280                   t + " instead of " + type + ")"); 
    281                 continue; 
    282               } 
    283  
    284               // process every slice in each stack 
    285               for (int j=1; j<=depth; j++) { 
    286                 imp.setSlice(j); 
    287                 stack.addSlice(filenames[i], imp.getProcessor()); 
    288               } 
     183              stack.addSlice(absname, (new ImagePlus(absname, 
     184                cm.openImage(absname, i))).getProcessor()); 
    289185            } 
    290             progress.setProgress(filenames.length); 
     186            progress.setProgress(num); 
    291187 
    292188            if (stack == null || stack.getSize() == 0) { 
    293               System.err.println("stack == null is "+(stack==null)); 
    294               System.err.println("stack.getSize() == 0 is "+(stack.getSize())); 
    295               // all image files were invalid 
    296               msg("No valid files found."); 
     189              IJ.showMessage("No valid files found."); 
    297190              return; 
    298191            } 
     
    302195            if (stack != null) stack.trim(); 
    303196          } 
    304           show(new ImagePlus(name, stack)); 
    305         } 
    306         else show(ipw.getImagePlus()); 
     197 
     198          reader.setMetadataStore(fr.getMetadataStore(absname)); 
     199 
     200          show(new ImagePlus(absname, stack)); 
     201        } 
     202        else { 
     203          ipw = new ImagePlusWrapper(absname, virtual); 
     204          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; 
     208 
     209          lengths[zIndex] = numZ; 
     210          lengths[tIndex] = numT; 
     211          lengths[cIndex] = numC; 
     212 
     213          show(ipw.getImagePlus()); 
     214        } 
    307215        done2 = true; 
    308216      } 
     
    315223            "reading the data" + (msg == null ? "." : (": " + msg))); 
    316224        } 
    317         System.err.println("Read error"); 
     225        if (DEBUG) System.err.println("Read error"); 
    318226        done2 = false; 
    319227      } 
     
    321229  } 
    322230 
    323   // -- Internal LociDataBrowser methods -- 
    324  
    325   protected String strip(String name) { 
    326     // strip off endings, if any, from name 
    327     int zLen = PRE_Z.length, tLen = PRE_T.length, cLen = PRE_C.length; 
    328     String[] endings = new String[zLen + tLen + cLen]; 
    329     System.arraycopy(PRE_Z, 0, endings, 0, zLen); 
    330     System.arraycopy(PRE_T, 0, endings, zLen, tLen); 
    331     System.arraycopy(PRE_C, 0, endings, zLen + tLen, cLen); 
    332     String upper = name.toUpperCase(); 
    333     for (int i=0; i<endings.length; i++) { 
    334       if (upper.endsWith(endings[i])) { 
    335         name = name.substring(0, name.length() - endings[i].length()); 
    336         name = name.replaceAll("\\d+$", ""); // strip trailing digits 
    337         upper = name.toUpperCase(); 
    338         i = -1; // start over 
    339       } 
    340     } 
    341     return name; 
    342   } 
    343  
    344   protected void msg(String msg) { IJ.showMessage("LociDataBrowser", msg); } 
    345  
    346   protected void log(String msg) { IJ.log("LociDataBrowser: " + msg); } 
    347  
    348   protected void log(String var, Object val) { 
    349     int len = -1; 
    350     try { len = Array.getLength(val); } 
    351     catch (Exception exc) { } 
    352  
    353     if (len < 0) log(var + " = " + val); // single object 
    354     else { 
    355       StringBuffer sb = new StringBuffer(var); 
    356       sb.append(" ="); 
    357       for (int i=0; i<len; i++) { 
    358         sb.append(" "); 
    359         sb.append(Array.get(val, i).toString()); 
    360       } 
    361       log(sb.toString()); 
    362     } 
    363   } 
    364  
    365   protected void log(String var, int val) { log(var + " = " + val); } 
    366  
    367   protected void log(String var, boolean val) { log(var + " = " + val); } 
    368  
    369231} 
  • trunk/loci/browser/LociOpener.java

    r1178 r1201  
    1414import java.io.File; 
    1515import javax.swing.*; 
     16import javax.swing.filechooser.FileFilter; 
     17import loci.formats.*; 
    1618 
    1719public class LociOpener implements ItemListener { 
     
    2729    // set up the file chooser 
    2830    fc = new JFileChooser(OpenDialog.getDefaultDirectory()); 
    29     System.err.println("hahaha"); 
    3031    // add a custom file filter 
    31     fc.addChoosableFileFilter(new ImageFilter()); 
     32    FileFilter[] ff = LociDataBrowser.reader.getFileFilters(); 
     33    ff = ComboFileFilter.sortFilters(ff); 
     34    ComboFileFilter combo = 
     35      new ComboFileFilter(ff, "All supported file types"); 
     36    if (ff.length > 1) { 
     37      fc.addChoosableFileFilter(combo); 
     38    } 
     39    for (int i=0; i<ff.length; i++) { 
     40      fc.addChoosableFileFilter(ff[i]); 
     41    } 
     42    if (combo != null) fc.setFileFilter(combo); 
     43    else fc.setFileFilter(ff[0]); 
    3244 
    3345    // add the preview pane 
Note: See TracChangeset for help on using the changeset viewer.