Changeset 3482


Ignore:
Timestamp:
12/17/07 14:06:49 (12 years ago)
Author:
melissa
Message:

Added option to use a virtual stack.

Location:
trunk/loci/plugins
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/plugins/Importer.java

    r3480 r3482  
    379379          } 
    380380 
    381           for (int j=0; j<num[i]; j++) { 
    382             if (!load[j]) continue; 
    383  
    384             // limit message update rate 
    385             long clock = System.currentTimeMillis(); 
    386             if (clock - time >= 100) { 
    387               IJ.showStatus("Reading " + 
    388                 (seriesCount > 1 ? ("series " + (i + 1) + ", ") : "") + 
    389                 "plane " + (j + 1) + "/" + num[i]); 
    390               time = clock; 
    391             } 
    392             IJ.showProgress((double) q++ / total); 
    393  
    394             int ndx = FormatTools.getReorderedIndex(r, stackOrder, j); 
    395  
    396             // construct label for this slice 
    397             int[] zct = r.getZCTCoords(ndx); 
    398             StringBuffer sb = new StringBuffer(); 
    399             if (certain[i]) { 
    400               boolean first = true; 
    401               if (cCount[i] > 1) { 
    402                 if (first) first = false; 
    403                 else sb.append("; "); 
    404                 sb.append("ch:"); 
    405                 sb.append(zct[1] + 1); 
    406                 sb.append("/"); 
    407                 sb.append(sizeC[i]); 
     381          if (options.isVirtual()) { 
     382            boolean needComposite = options.isMergeChannels() && 
     383              (r.getSizeC() > 3 || (r.getPixelType() != FormatTools.UINT8 && 
     384              r.getPixelType() != FormatTools.INT8)); 
     385            stackB = new CustomStack(w, h, null, id, r, (needComposite || 
     386              !options.isMergeChannels()) ? 1 : r.getSizeC()); 
     387            for (int j=0; j<num[i]; j++) { 
     388              ((CustomStack) stackB).addSlice(constructSliceLabel(j, r, store, 
     389                i, new int[][] {zCount, cCount, tCount})); 
     390            } 
     391          } 
     392          else { 
     393            for (int j=0; j<num[i]; j++) { 
     394              if (!load[j]) continue; 
     395 
     396              // limit message update rate 
     397              long clock = System.currentTimeMillis(); 
     398              if (clock - time >= 100) { 
     399                IJ.showStatus("Reading " + 
     400                  (seriesCount > 1 ? ("series " + (i + 1) + ", ") : "") + 
     401                  "plane " + (j + 1) + "/" + num[i]); 
     402                time = clock; 
    408403              } 
    409               if (zCount[i] > 1) { 
    410                 if (first) first = false; 
    411                 else sb.append("; "); 
    412                 sb.append("z:"); 
    413                 sb.append(zct[0] + 1); 
    414                 sb.append("/"); 
    415                 sb.append(sizeZ[i]); 
     404              IJ.showProgress((double) q++ / total); 
     405 
     406              int ndx = FormatTools.getReorderedIndex(r, stackOrder, j); 
     407 
     408              String label = constructSliceLabel(ndx, r, store, i, 
     409                new int[][] {zCount, cCount, tCount}); 
     410 
     411              // get image processor for jth plane 
     412              ImageProcessor ip = Util.openProcessor(r, ndx); 
     413              if (ip == null) { 
     414                plugin.canceled = true; 
     415                return; 
    416416              } 
    417               if (tCount[i] > 1) { 
    418                 if (first) first = false; 
    419                 else sb.append("; "); 
    420                 sb.append("t:"); 
    421                 sb.append(zct[2] + 1); 
    422                 sb.append("/"); 
    423                 sb.append(sizeT[i]); 
    424               } 
    425             } 
    426             else { 
    427               sb.append("no:"); 
    428               sb.append(j + 1); 
    429               sb.append("/"); 
    430               sb.append(num[i]); 
    431             } 
    432             // put image name at the end, in case it is too long 
    433             String imageName = store.getImageName(new Integer(i)); 
    434             if (imageName != null) { 
    435               sb.append(" - "); 
    436               sb.append(imageName); 
    437             } 
    438             String label = sb.toString(); 
    439  
    440             // get image processor for jth plane 
    441             ImageProcessor ip = Util.openProcessor(r, ndx); 
    442             if (ip == null) { 
    443               plugin.canceled = true; 
    444               return; 
    445             } 
    446  
    447             // add plane to image stack 
    448             if (ip instanceof ByteProcessor) { 
    449               if (stackB == null) stackB = new ImageStack(w, h); 
    450               stackB.addSlice(label, ip); 
    451             } 
    452             else if (ip instanceof ShortProcessor) { 
    453               if (stackS == null) stackS = new ImageStack(w, h); 
    454               stackS.addSlice(label, ip); 
    455             } 
    456             else if (ip instanceof FloatProcessor) { 
    457               // merge image plane into existing stack if possible 
    458               if (stackB != null) { 
    459                 ip = ip.convertToByte(true); 
     417 
     418              // add plane to image stack 
     419              if (ip instanceof ByteProcessor) { 
     420                if (stackB == null) stackB = new ImageStack(w, h); 
    460421                stackB.addSlice(label, ip); 
    461422              } 
    462               else if (stackS != null) { 
    463                 ip = ip.convertToShort(true); 
     423              else if (ip instanceof ShortProcessor) { 
     424                if (stackS == null) stackS = new ImageStack(w, h); 
    464425                stackS.addSlice(label, ip); 
    465426              } 
    466               else { 
    467                 if (stackF == null) stackF = new ImageStack(w, h); 
    468                 stackF.addSlice(label, ip); 
     427              else if (ip instanceof FloatProcessor) { 
     428                // merge image plane into existing stack if possible 
     429                if (stackB != null) { 
     430                  ip = ip.convertToByte(true); 
     431                  stackB.addSlice(label, ip); 
     432                } 
     433                else if (stackS != null) { 
     434                  ip = ip.convertToShort(true); 
     435                  stackS.addSlice(label, ip); 
     436                } 
     437                else { 
     438                  if (stackF == null) stackF = new ImageStack(w, h); 
     439                  stackF.addSlice(label, ip); 
     440                } 
    469441              } 
    470             } 
    471             else if (ip instanceof ColorProcessor) { 
    472               if (stackO == null) stackO = new ImageStack(w, h); 
    473               stackO.addSlice(label, ip); 
     442              else if (ip instanceof ColorProcessor) { 
     443                if (stackO == null) stackO = new ImageStack(w, h); 
     444                stackO.addSlice(label, ip); 
     445              } 
    474446            } 
    475447          } 
     
    504476          } 
    505477        } 
    506         r.close(); 
    507478 
    508479        if (concatenate) { 
     
    601572  { 
    602573    if (stack == null) return; 
    603     String[] used = r.getUsedFiles(); 
    604     String title = file.substring(file.lastIndexOf(File.separator) + 1); 
    605     if (used.length > 1) { 
    606       FilePattern fp = new FilePattern(new Location(file)); 
    607       if (fp != null) title = fp.getPattern(); 
    608     } 
    609     if (series != null && !file.endsWith(series) && r.getSeriesCount() > 1) { 
    610       title += " - " + series; 
    611     } 
    612     if (title.length() > 128) { 
    613       String a = title.substring(0, 62); 
    614       String b = title.substring(title.length() - 62); 
    615       title = a + "..." + b; 
    616     } 
    617     ImagePlus imp = new ImagePlus(title, stack); 
     574    ImagePlus imp = new ImagePlus(getTitle(r, file, series), stack); 
    618575    imp.setProperty("Info", metadata.toString()); 
    619576 
     
    732689  } 
    733690 
     691  /** Get an appropriate stack title, given the file name. */ 
     692  private String getTitle(IFormatReader r, String file, String series) { 
     693    String[] used = r.getUsedFiles(); 
     694    String title = file.substring(file.lastIndexOf(File.separator) + 1); 
     695    if (used.length > 1) { 
     696      FilePattern fp = new FilePattern(new Location(file)); 
     697      if (fp != null) title = fp.getPattern(); 
     698    } 
     699    if (series != null && !file.endsWith(series) && r.getSeriesCount() > 1) { 
     700      title += " - " + series; 
     701    } 
     702    if (title.length() > 128) { 
     703      String a = title.substring(0, 62); 
     704      String b = title.substring(title.length() - 62); 
     705      title = a + "..." + b; 
     706    } 
     707    return title; 
     708  } 
     709 
     710  /** Construct slice label. */ 
     711  private String constructSliceLabel(int ndx, IFormatReader r, 
     712    MetadataRetrieve store, int series, int[][] counts) 
     713  { 
     714    r.setSeries(series); 
     715    int[] zct = r.getZCTCoords(ndx); 
     716    StringBuffer sb = new StringBuffer(); 
     717    if (r.isOrderCertain()) { 
     718      boolean first = true; 
     719      if (counts[1][series] > 1) { 
     720        if (first) first = false; 
     721        else sb.append("; "); 
     722        sb.append("ch:"); 
     723        sb.append(zct[1] + 1); 
     724        sb.append("/"); 
     725        sb.append(r.getSizeC()); 
     726      } 
     727      if (counts[0][series] > 1) { 
     728        if (first) first = false; 
     729        else sb.append("; "); 
     730        sb.append("z:"); 
     731        sb.append(zct[0] + 1); 
     732        sb.append("/"); 
     733        sb.append(r.getSizeZ()); 
     734      } 
     735      if (counts[2][series] > 1) { 
     736        if (first) first = false; 
     737        else sb.append("; "); 
     738        sb.append("t:"); 
     739        sb.append(zct[2] + 1); 
     740        sb.append("/"); 
     741        sb.append(r.getSizeT()); 
     742      } 
     743    } 
     744    else { 
     745      sb.append("no:"); 
     746      sb.append(ndx + 1); 
     747      sb.append("/"); 
     748      sb.append(r.getImageCount()); 
     749    } 
     750    // put image name at the end, in case it is too long 
     751    String imageName = store.getImageName(new Integer(series)); 
     752    if (imageName != null) { 
     753      sb.append(" - "); 
     754      sb.append(imageName); 
     755    } 
     756    return sb.toString(); 
     757  } 
     758 
    734759  /** Verifies that the given status result is OK. */ 
    735760  private boolean statusOk(int status) { 
  • trunk/loci/plugins/ImporterOptions.java

    r3478 r3482  
    111111  public static final String PREF_SERIES = "bioformats.series"; 
    112112  public static final String PREF_WINDOWLESS = "bioformats.windowless"; 
     113  public static final String PREF_VIRTUAL = "bioformats.virtual"; 
    113114 
    114115  // labels for user dialog; when trimmed these double as argument & macro keys 
     
    134135  public static final String LABEL_WINDOWLESS = "windowless"; 
    135136  public static final String LABEL_SERIES = "series"; 
     137  public static final String LABEL_VIRTUAL = "Use virtual stack"; 
    136138 
    137139  // -- Fields - GUI components -- 
     
    150152  private Checkbox autoscaleBox; 
    151153  private Choice mergeChoice; 
     154  private Checkbox virtualBox; 
    152155 
    153156  // -- Fields - core options -- 
     
    170173  private String mergeOption; 
    171174  private String seriesString; 
     175  private boolean virtual; 
    172176 
    173177  private String location; 
     
    197201  public boolean isWindowless() { return windowless; } 
    198202  public String getMergeOption() { return mergeOption; } 
     203  public boolean isVirtual() { return virtual; } 
    199204 
    200205  public boolean isViewNone() { return VIEW_NONE.equals(stackFormat); } 
     
    236241  public void setAutoscale(boolean b) { autoscale = b; } 
    237242  public void setWindowless(boolean b) { windowless = b; } 
     243  public void setVirtual(boolean b) { virtual = b; } 
    238244 
    239245  /** Loads default option values from IJ_Prefs.txt. */ 
     
    256262    seriesString = Prefs.get(PREF_SERIES, "0"); 
    257263    windowless = Prefs.get(PREF_WINDOWLESS, false); 
     264    virtual = Prefs.get(PREF_VIRTUAL, false); 
    258265 
    259266    // set SDT intensity property, if available 
     
    282289    Prefs.set(PREF_SERIES, seriesString); 
    283290    Prefs.set(PREF_WINDOWLESS, windowless); 
     291    Prefs.set(PREF_VIRTUAL, virtual); 
    284292  } 
    285293 
     
    323331      windowless = getMacroValue(arg, LABEL_WINDOWLESS, windowless); 
    324332      seriesString = Macro.getValue(arg, LABEL_SERIES, "0"); 
     333      virtual = getMacroValue(arg, LABEL_VIRTUAL, virtual); 
    325334 
    326335      location = Macro.getValue(arg, LABEL_LOCATION, location); 
     
    506515    gd.addCheckbox(LABEL_RANGE, specifyRanges); 
    507516    gd.addCheckbox(LABEL_AUTOSCALE, autoscale); 
     517    gd.addCheckbox(LABEL_VIRTUAL, virtual); 
    508518 
    509519    // extract GUI components from dialog and add listeners 
     
    528538      rangeBox = (Checkbox) boxes.get(8); 
    529539      autoscaleBox = (Checkbox) boxes.get(9); 
     540      virtualBox = (Checkbox) boxes.get(10); 
    530541      for (int i=0; i<boxes.size(); i++) { 
    531542        ((Checkbox) boxes.get(i)).addItemListener(this); 
     
    548559    specifyRanges = gd.getNextBoolean(); 
    549560    autoscale = gd.getNextBoolean(); 
     561    virtual = gd.getNextBoolean(); 
    550562 
    551563    return STATUS_OK; 
Note: See TracChangeset for help on using the changeset viewer.