Changeset 3305


Ignore:
Timestamp:
10/23/07 09:52:28 (12 years ago)
Author:
melissa
Message:

Added stack slicing plugin, which replaces the channel splitting logic in the importer plugin.

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

Legend:

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

    r3277 r3305  
    124124    boolean mergeChannels = options.isMergeChannels(); 
    125125    boolean colorize = options.isColorize(); 
    126     boolean splitWindows = options.isSplitWindows(); 
    127126    boolean showMetadata = options.isShowMetadata(); 
    128127    boolean groupFiles = options.isGroupFiles(); 
     
    190189        certain[i] = r.isOrderCertain(); 
    191190        cBegin[i] = zBegin[i] = tBegin[i] = 0; 
    192         if (certain[i]) { 
    193           cEnd[i] = sizeC[i] - 1; 
    194           zEnd[i] = sizeZ[i] - 1; 
    195           tEnd[i] = sizeT[i] - 1; 
    196         } 
    197         else cEnd[i] = num[i] - 1; 
     191        cEnd[i] = sizeC[i] - 1; 
     192        zEnd[i] = sizeZ[i] - 1; 
     193        tEnd[i] = sizeT[i] - 1; 
    198194        cStep[i] = zStep[i] = tStep[i] = 1; 
    199195      } 
     
    346342          boolean[] load = new boolean[num[i]]; 
    347343          if (!viewNone) { 
    348             if (certain[i]) { 
    349               for (int c=cBegin[i]; c<=cEnd[i]; c+=cStep[i]) { 
    350                 for (int z=zBegin[i]; z<=zEnd[i]; z+=zStep[i]) { 
    351                   for (int t=tBegin[i]; t<=tEnd[i]; t+=tStep[i]) { 
    352                     int index = r.getIndex(z, c, t); 
    353                     load[index] = true; 
    354                   } 
     344            for (int c=cBegin[i]; c<=cEnd[i]; c+=cStep[i]) { 
     345              for (int z=zBegin[i]; z<=zEnd[i]; z+=zStep[i]) { 
     346                for (int t=tBegin[i]; t<=tEnd[i]; t+=tStep[i]) { 
     347                  int index = r.getIndex(z, c, t); 
     348                  load[index] = true; 
    355349                } 
    356350              } 
    357             } 
    358             else { 
    359               for (int j=cBegin[i]; j<=cEnd[i]; j+=cStep[i]) load[j] = true; 
    360351            } 
    361352          } 
     
    558549          } 
    559550 
     551          boolean splitC = options.isSplitChannels(); 
     552          boolean splitZ = options.isSplitFocalPlanes(); 
     553          boolean splitT = options.isSplitTimepoints(); 
     554 
    560555          for (int i=0; i<newImps.size(); i++) { 
    561             ((ImagePlus) newImps.get(i)).show(); 
     556            ImagePlus imp = (ImagePlus) newImps.get(i); 
     557            imp.show(); 
     558            if (splitC || splitZ || splitT) { 
     559              IJ.runPlugIn("loci.plugins.Slicer", "sliceZ=" + splitZ + 
     560                ", sliceC=" + splitC + ", sliceT=" + splitT + ", stackOrder=" + 
     561                stackOrder + ", keepOriginal=false"); 
     562            } 
    562563          } 
    563564        } 
     
    605606  { 
    606607    if (stack == null) return; 
    607     if (!options.isMergeChannels() && options.isSplitWindows()) { 
    608       slice(stack, file, series, zCount, cCount, tCount, fi, r, fs, options); 
    609     } 
    610     else { 
    611       ImagePlus imp = new ImagePlus(file + " - " + series, stack); 
    612       imp.setProperty("Info", "File full path=" + file + 
    613         "\nSeries name=" + series + "\n"); 
    614  
    615       // retrieve the spatial calibration information, if available 
    616       applyCalibration(store, imp, r.getSeries()); 
    617       imp.setFileInfo(fi); 
    618       imp.setDimensions(cCount, zCount, tCount); 
    619       displayStack(imp, r, fs, options); 
    620     } 
    621   } 
    622  
    623   /** Opens each channel of the source stack in a separate window. */ 
    624   private void slice(ImageStack is, String file, String series, int z, int c, 
    625     int t, FileInfo fi, IFormatReader r, FileStitcher fs, 
    626     ImporterOptions options) 
    627     throws FormatException, IOException 
    628   { 
    629     boolean range = options.isSpecifyRanges(); 
    630  
    631     int step = 1; 
    632     if (range) step = c = r.getSizeC(); 
    633  
    634     ImageStack[] newStacks = new ImageStack[c]; 
    635     for (int i=0; i<newStacks.length; i++) { 
    636       newStacks[i] = new ImageStack(is.getWidth(), is.getHeight()); 
    637     } 
    638  
    639     int[][] indices = new int[c][is.getSize() / c]; 
    640     int[] pt = new int[c]; 
    641     Arrays.fill(pt, 0); 
    642  
    643     for (int i=0; i<is.getSize(); i++) { 
    644       int[] zct = FormatTools.getZCTCoords(stackOrder, r.getSizeZ(), 
    645         r.getSizeC(), r.getSizeT(), r.getImageCount(), i); 
    646       int cndx = zct[1]; 
    647       indices[cndx][pt[cndx]++] = i; 
    648     } 
    649  
    650     for (int i=0; i<c; i++) { 
    651       if (range) { 
    652         for (int j=0; j<z*t; j++) { 
    653           int ndx = j*step + 1; 
    654           newStacks[i].addSlice(is.getSliceLabel(ndx), is.getProcessor(ndx)); 
    655         } 
    656       } 
    657       else { 
    658         for (int j=0; j<indices[i].length; j++) { 
    659           newStacks[i].addSlice(is.getSliceLabel(indices[i][j] + 1), 
    660             is.getProcessor(indices[i][j] + 1)); 
    661         } 
    662       } 
    663     } 
     608    ImagePlus imp = new ImagePlus(file + " - " + series, stack); 
     609    imp.setProperty("Info", "File full path=" + file + 
     610      "\nSeries name=" + series + "\n"); 
    664611 
    665612    // retrieve the spatial calibration information, if available 
    666  
    667     for (int i=0; i<newStacks.length; i++) { 
    668       ImagePlus imp = new ImagePlus(file + " - " + series + " - Ch" + (i+1), 
    669         newStacks[i]); 
    670       imp.setProperty("Info", "File full path=" + file + 
    671         "\nSeries name=" + series + "\n"); 
    672       applyCalibration((OMEXMLMetadata) r.getMetadataStore(), imp, 
    673         r.getSeries()); 
    674  
    675       // colorize channels; mostly copied from the ImageJ source 
    676  
    677       if (options.isColorize()) { 
    678         fi.reds = new byte[256]; 
    679         fi.greens = new byte[256]; 
    680         fi.blues = new byte[256]; 
    681  
    682         for (int j=0; j<256; j++) { 
    683           switch (i) { 
    684             case 0: fi.reds[j] = (byte) j; break; 
    685             case 1: fi.greens[j] = (byte) j; break; 
    686             case 2: fi.blues[j] = (byte) j; break; 
    687           } 
    688         } 
    689  
    690         ImageProcessor ip = imp.getProcessor(); 
    691         ColorModel cm = 
    692           new IndexColorModel(8, 256, fi.reds, fi.greens, fi.blues); 
    693  
    694         ip.setColorModel(cm); 
    695         if (imp.getStackSize() > 1) imp.getStack().setColorModel(cm); 
    696       } 
    697  
    698       imp.setFileInfo(fi); 
    699       imp.setDimensions(1, r.getSizeZ(), r.getSizeT()); 
    700       displayStack(imp, r, fs, options); 
    701     } 
     613    applyCalibration(store, imp, r.getSeries()); 
     614    imp.setFileInfo(fi); 
     615    imp.setDimensions(cCount, zCount, tCount); 
     616    displayStack(imp, r, fs, options); 
    702617  } 
    703618 
     
    708623    boolean mergeChannels = options.isMergeChannels(); 
    709624    boolean concatenate = options.isConcatenate(); 
     625    int nChannels = imp.getNChannels(); 
     626    int nSlices = imp.getNSlices(); 
     627    int nFrames = imp.getNFrames(); 
    710628    if (options.isAutoscale()) Util.adjustColorRange(imp); 
    711629 
     
    769687    } 
    770688 
    771     imp.setDimensions( 
    772       imp.getStackSize() / (imp.getNSlices() * imp.getNFrames()), 
    773       imp.getNSlices(), imp.getNFrames()); 
     689    boolean splitC = options.isSplitChannels(); 
     690    boolean splitZ = options.isSplitFocalPlanes(); 
     691    boolean splitT = options.isSplitTimepoints(); 
     692 
     693    imp.setDimensions(imp.getStackSize() / (nSlices * nFrames), 
     694      nSlices, nFrames); 
     695 
    774696    if (options.isViewBrowser()) { } 
    775697    else if (options.isViewImage5D()) { 
     
    801723    } 
    802724    else if (!options.isViewNone()) { 
    803       if (options.isIndividualWindows() && !(imp instanceof CustomImage)) { 
    804         ImageStack is = imp.getStack(); 
    805         for (int i=0; i<is.getSize(); i++) { 
    806           ImageStack s = new ImageStack(is.getWidth(), is.getHeight()); 
    807           int ndx = i + 1; 
    808           s.addSlice(is.getSliceLabel(ndx), is.getProcessor(ndx)); 
    809  
    810           ImagePlus p = new ImagePlus(imp.getTitle(), s); 
    811           if (!concatenate) p.show(); 
    812           else imps.add(p); 
    813         } 
    814       } 
    815       else if (options.isIndividualWindows()) { 
    816         ImageStack is = imp.getStack(); 
    817  
    818         for (int zz=0; zz<r.getSizeZ(); zz++) { 
    819           for (int tt=0; tt<r.getSizeT(); tt++) { 
    820             ImageStack s = new ImageStack(is.getWidth(), is.getHeight()); 
    821             for (int cc=0; cc<r.getSizeC(); cc++) { 
    822               int ndx = FormatTools.getIndex("XYCTZ", r.getSizeZ(), 
    823                 r.getSizeC(), r.getSizeT(), is.getSize(), zz, cc, tt) + 1; 
    824               s.addSlice(is.getSliceLabel(ndx), is.getProcessor(ndx)); 
    825             } 
    826             ImagePlus p = new ImagePlus(imp.getTitle(), s); 
    827             CustomImage custom = new CustomImage(p, "XYCTZ", 1, 1, 
    828               r.getSizeC(), options.isAutoscale()); 
    829             if (!concatenate) custom.show(); 
    830             else imps.add(custom); 
    831           } 
    832         } 
    833       } 
    834       else { 
    835         if (!concatenate) imp.show(); 
    836         else imps.add(imp); 
    837       } 
     725      if (!concatenate) { 
     726        imp.show(); 
     727        if (splitC || splitZ || splitT) { 
     728          IJ.runPlugIn("loci.plugins.Slicer", "slice_z=" + splitZ + 
     729            " slice_c=" + splitC + " slice_t=" + splitT + 
     730            " stack_order=" + stackOrder + " keep_original=false"); 
     731        } 
     732      } 
     733      else imps.add(imp); 
    838734    } 
    839735  } 
     
    884780 
    885781    for (int i=0; i<s.getSize(); i++) { 
    886       int[] zct = FormatTools.getZCTCoords(stackOrder, sizeZ, r.getEffectiveSizeC(), 
    887         sizeT, r.getImageCount(), i); 
     782      int[] zct = FormatTools.getZCTCoords(stackOrder, sizeZ, 
     783        r.getEffectiveSizeC(), sizeT, r.getImageCount(), i); 
    888784      int cndx = zct[1]; 
    889785      indices[cndx][pt[cndx]++] = i; 
  • trunk/loci/plugins/ImporterOptions.java

    r3277 r3305  
    9494  public static final String PREF_MERGE = "bioformats.mergeChannels"; 
    9595  public static final String PREF_COLORIZE = "bioformats.colorize"; 
    96   public static final String PREF_SPLIT = "bioformats.splitWindows"; 
    97   public static final String PREF_INDIVIDUAL = "bioformats.individualWindows"; 
     96  public static final String PREF_C = "bioformats.splitWindows"; 
     97  public static final String PREF_Z = "bioformats.splitFocalPlanes"; 
     98  public static final String PREF_T = "bioformats.splitTimepoints"; 
    9899  public static final String PREF_SWAP = "bioformats.swapDimensions"; 
    99100  public static final String PREF_METADATA = "bioformats.showMetadata"; 
     
    110111  public static final String LABEL_MERGE = "Merge_channels to RGB"; 
    111112  public static final String LABEL_COLORIZE = "Colorize channels"; 
    112   public static final String LABEL_SPLIT = 
    113     "Split_channels into separate windows"; 
    114   public static final String LABEL_INDIVIDUAL = 
    115     "Split_planes into separate windows"; 
    116   public static final String LABEL_SWAP = "Specify_stack organization";  
     113  public static final String LABEL_C = "Split_channels into separate windows"; 
     114  public static final String LABEL_Z = 
     115    "Split_focal planes into separate windows"; 
     116  public static final String LABEL_T = "Split_timepoints into separate windows"; 
     117  public static final String LABEL_SWAP = "Specify_stack organization"; 
    117118  public static final String LABEL_METADATA = 
    118119    "Display_metadata in results window"; 
     
    133134  private Checkbox mergeBox; 
    134135  private Checkbox colorizeBox; 
    135   private Checkbox splitBox; 
    136   private Checkbox individualBox; 
     136  private Checkbox splitCBox; 
     137  private Checkbox splitZBox; 
     138  private Checkbox splitTBox; 
    137139  private Checkbox swapBox; 
    138140  private Checkbox metadataBox; 
     
    149151  private boolean mergeChannels; 
    150152  private boolean colorize; 
    151   private boolean splitWindows; 
    152   private boolean individualWindows; 
     153  private boolean splitChannels; 
     154  private boolean splitFocalPlanes; 
     155  private boolean splitTimepoints; 
    153156  private boolean swapDimensions; 
    154157  private boolean showMetadata; 
     
    174177  public boolean isMergeChannels() { return mergeChannels; } 
    175178  public boolean isColorize() { return colorize; } 
    176   public boolean isSplitWindows() { return splitWindows; } 
    177   public boolean isIndividualWindows() { return individualWindows; } 
     179  public boolean isSplitChannels() { return splitChannels; } 
     180  public boolean isSplitFocalPlanes() { return splitFocalPlanes; } 
     181  public boolean isSplitTimepoints() { return splitTimepoints; } 
    178182  public boolean isSwapDimensions() { return swapDimensions; } 
    179183  public boolean isShowMetadata() { return showMetadata; } 
     
    209213  public void setMergeChannels(boolean b) { mergeChannels = b; } 
    210214  public void setColorize(boolean b) { colorize = b; } 
    211   public void setSplitWindows(boolean b) { splitWindows = b; } 
    212   public void setIndividualWindows(boolean b) { individualWindows = b; } 
     215  public void setSplitChannels(boolean b) { splitChannels = b; } 
     216  public void setSplitFocalPlanes(boolean b) { splitFocalPlanes = b; } 
     217  public void setSplitTimepoints(boolean b) { splitTimepoints = b; } 
    213218  public void setSwapDimensions(boolean b) { swapDimensions = b; } 
    214219  public void setShowMetadata(boolean b) { showMetadata = b; } 
     
    225230    mergeChannels = Prefs.get(PREF_MERGE, false); 
    226231    colorize = Prefs.get(PREF_COLORIZE, false); 
    227     splitWindows = Prefs.get(PREF_SPLIT, true); 
    228     individualWindows = Prefs.get(PREF_INDIVIDUAL, false); 
     232    splitChannels = Prefs.get(PREF_C, true); 
     233    splitFocalPlanes = Prefs.get(PREF_Z, false); 
     234    splitTimepoints = Prefs.get(PREF_T, false); 
    229235    swapDimensions = Prefs.get(PREF_SWAP, false); 
    230236    showMetadata = Prefs.get(PREF_METADATA, false); 
     
    243249    Prefs.set(PREF_MERGE, mergeChannels); 
    244250    Prefs.set(PREF_COLORIZE, colorize); 
    245     Prefs.set(PREF_SPLIT, splitWindows); 
    246     Prefs.set(PREF_INDIVIDUAL, individualWindows); 
     251    Prefs.set(PREF_C, splitChannels); 
     252    Prefs.set(PREF_Z, splitFocalPlanes); 
     253    Prefs.set(PREF_T, splitTimepoints); 
    247254    Prefs.set(PREF_SWAP, swapDimensions); 
    248255    Prefs.set(PREF_METADATA, showMetadata); 
     
    281288      mergeChannels = getMacroValue(arg, LABEL_MERGE, mergeChannels); 
    282289      colorize = getMacroValue(arg, LABEL_COLORIZE, colorize); 
    283       splitWindows = getMacroValue(arg, LABEL_COLORIZE, splitWindows); 
    284       individualWindows = 
    285         getMacroValue(arg, LABEL_INDIVIDUAL, individualWindows); 
     290      splitChannels = getMacroValue(arg, LABEL_C, splitChannels); 
     291      splitFocalPlanes = getMacroValue(arg, LABEL_Z, splitFocalPlanes); 
     292      splitTimepoints = getMacroValue(arg, LABEL_T, splitTimepoints); 
    286293      swapDimensions = getMacroValue(arg, LABEL_SWAP, swapDimensions); 
    287294      showMetadata = getMacroValue(arg, LABEL_METADATA, showMetadata); 
     
    448455    gd.addCheckbox(LABEL_MERGE, mergeChannels); 
    449456    gd.addCheckbox(LABEL_COLORIZE, colorize); 
    450     gd.addCheckbox(LABEL_SPLIT, splitWindows); 
    451     gd.addCheckbox(LABEL_INDIVIDUAL, individualWindows); 
     457    gd.addCheckbox(LABEL_C, splitChannels); 
     458    gd.addCheckbox(LABEL_Z, splitFocalPlanes); 
     459    gd.addCheckbox(LABEL_T, splitTimepoints); 
    452460    gd.addCheckbox(LABEL_SWAP, swapDimensions); 
    453461    gd.addCheckbox(LABEL_METADATA, showMetadata); 
     
    470478      mergeBox = (Checkbox) boxes.get(0); 
    471479      colorizeBox = (Checkbox) boxes.get(1); 
    472       splitBox = (Checkbox) boxes.get(2); 
    473       individualBox = (Checkbox) boxes.get(3); 
    474       swapBox = (Checkbox) boxes.get(4); 
    475       metadataBox = (Checkbox) boxes.get(5); 
    476       groupBox = (Checkbox) boxes.get(6); 
    477       concatenateBox = (Checkbox) boxes.get(7); 
    478       rangeBox = (Checkbox) boxes.get(8); 
    479       autoscaleBox = (Checkbox) boxes.get(9); 
     480      splitCBox = (Checkbox) boxes.get(2); 
     481      splitZBox = (Checkbox) boxes.get(3); 
     482      splitTBox = (Checkbox) boxes.get(4); 
     483      swapBox = (Checkbox) boxes.get(5); 
     484      metadataBox = (Checkbox) boxes.get(6); 
     485      groupBox = (Checkbox) boxes.get(7); 
     486      concatenateBox = (Checkbox) boxes.get(8); 
     487      rangeBox = (Checkbox) boxes.get(9); 
     488      autoscaleBox = (Checkbox) boxes.get(10); 
    480489      for (int i=0; i<boxes.size(); i++) { 
    481490        ((Checkbox) boxes.get(i)).addItemListener(this); 
     
    490499    mergeChannels = gd.getNextBoolean(); 
    491500    colorize = gd.getNextBoolean(); 
    492     splitWindows = gd.getNextBoolean(); 
    493     individualWindows = gd.getNextBoolean(); 
     501    splitChannels = gd.getNextBoolean(); 
     502    splitFocalPlanes = gd.getNextBoolean(); 
     503    splitTimepoints = gd.getNextBoolean(); 
    494504    swapDimensions = gd.getNextBoolean(); 
    495505    showMetadata = gd.getNextBoolean(); 
     
    730740      else if (s.equals(VIEW_BROWSER)) { 
    731741        colorizeBox.setState(false); // NB: temporary 
    732         splitBox.setState(false); 
     742        splitCBox.setState(false); 
    733743        rangeBox.setState(false); 
    734744      } 
     
    742752      if (mergeBox.getState()) { 
    743753        colorizeBox.setState(false); 
    744         splitBox.setState(false); 
     754        splitCBox.setState(false); 
    745755        String s = stackChoice.getSelectedItem(); 
    746756        if (s.equals(VIEW_IMAGE_5D)) stackChoice.select(VIEW_STANDARD); 
     
    750760      if (colorizeBox.getState()) { 
    751761        mergeBox.setState(false); 
    752         splitBox.setState(true); 
     762        splitCBox.setState(true); 
    753763        // NB: temporary 
    754764        String s = stackChoice.getSelectedItem(); 
     
    756766      } 
    757767    } 
    758     else if (src == splitBox) { 
    759       if (splitBox.getState()) { 
     768    else if (src == splitCBox) { 
     769      if (splitCBox.getState()) { 
    760770        mergeBox.setState(false); 
    761771        String s = stackChoice.getSelectedItem(); 
  • trunk/loci/plugins/plugins.config

    r3086 r3305  
    2323 
    2424#Plugins>LOCI, "Bio-Formats Master Importer", loci.plugins.LociImporter("") 
     25Plugins>LOCI, "Stack Slicer", loci.plugins.Slicer("") 
    2526Plugins>LOCI, "4D Data Browser", loci.plugins.LociImporter("location=[Local machine] group=true view=[4D Data Browser]") 
    2627Plugins>LOCI, "Bio-Formats Importer", loci.plugins.LociImporter("location=[Local machine]") 
Note: See TracChangeset for help on using the changeset viewer.