Changeset 7470


Ignore:
Timestamp:
12/28/10 12:05:39 (9 years ago)
Author:
melissa
Message:

Allow virtual stacks to be sliced. Closes #580.

Location:
trunk/components/loci-plugins/src/loci/plugins
Files:
3 edited

Legend:

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

    r7123 r7470  
    3737import ij.process.LUT; 
    3838 
     39import java.io.IOException; 
     40 
     41import loci.formats.FormatException; 
    3942import loci.formats.FormatTools; 
     43import loci.plugins.util.BFVirtualStack; 
     44import loci.plugins.util.ImageProcessorReader; 
    4045import loci.plugins.util.LibraryChecker; 
     46import loci.plugins.util.VirtualImagePlus; 
     47import loci.plugins.util.WindowTools; 
    4148 
    4249/** 
     
    7279    boolean hyperstack = imp.isHyperStack(); 
    7380 
    74     if (stack.isVirtual()) { 
    75       throw new IllegalArgumentException("Cannot reslice virtual stacks"); 
    76     } 
    77  
    7881    Calibration calibration = imp.getCalibration(); 
    7982 
     
    8790    if (sliceT) slicesPerStack /= sizeT; 
    8891 
    89     ImageStack[] newStacks = 
    90       new ImageStack[stack.getSize() / slicesPerStack]; 
     92    int realSizeZ = sliceZ ? 1 : sizeZ; 
     93    int realSizeC = sliceC ? 1 : sizeC; 
     94    int realSizeT = sliceT ? 1 : sizeT; 
     95 
     96    BFVirtualStack virtualStack = null; 
     97    if (stack instanceof BFVirtualStack) { 
     98      virtualStack = (BFVirtualStack) stack; 
     99    } 
     100 
     101    ImageStack[] newStacks = new ImageStack[stack.getSize() / slicesPerStack]; 
    91102    for (int i=0; i<newStacks.length; i++) { 
    92       newStacks[i] = new ImageStack(stack.getWidth(), stack.getHeight()); 
    93     } 
    94  
     103      newStacks[i] = makeStack(stack); 
     104      if (newStacks[i] == null) return null; 
     105    } 
     106 
     107    int stackZ = sliceZ ? sizeZ : 1; 
     108    int stackC = sliceC ? sizeC : 1; 
     109    int stackT = sliceT ? sizeT : 1; 
     110 
     111    int[][] planeIndexes = new int[newStacks.length][slicesPerStack]; 
    95112    for (int i=0; i<sizeZ*sizeC*sizeT; i++) { 
    96113      int[] zct = FormatTools.getZCTCoords(stackOrder, sizeZ, sizeC, sizeT, 
    97114        stack.getSize(), i); 
    98       int stackNdx = FormatTools.getIndex(stackOrder, sliceZ ? sizeZ : 1, 
    99         sliceC ? sizeC : 1, sliceT ? sizeT : 1, newStacks.length, 
    100         sliceZ ? zct[0] : 0, sliceC ? zct[1] : 0, sliceT ? zct[2] : 0); 
    101  
    102       newStacks[stackNdx].addSlice(stack.getSliceLabel(i + 1), 
    103         stack.getProcessor(i + 1)); 
     115      int stackNdx = FormatTools.getIndex(stackOrder, stackZ, stackC, stackT, 
     116        newStacks.length, sliceZ ? zct[0] : 0, sliceC ? zct[1] : 0, 
     117        sliceT ? zct[2] : 0); 
     118      String label = stack.getSliceLabel(i + 1); 
     119 
     120      if (virtualStack != null) { 
     121        ((BFVirtualStack) newStacks[stackNdx]).addSlice(label); 
     122        int sliceNdx = FormatTools.getIndex(stackOrder, realSizeZ, realSizeC, 
     123          realSizeT, slicesPerStack, sliceZ ? 0 : zct[0], sliceC ? 0 : zct[1], 
     124          sliceT ? 0 : zct[2]); 
     125        planeIndexes[stackNdx][sliceNdx] = i; 
     126      } 
     127      else { 
     128        newStacks[stackNdx].addSlice(label, stack.getProcessor(i + 1)); 
     129      } 
    104130    } 
    105131 
     
    107133    double maxValue = Math.pow(2, imp.getBytesPerPixel() * 8) - 1; 
    108134    for (int i=0; i<newStacks.length; i++) { 
    109       int[] zct = FormatTools.getZCTCoords(stackOrder, sliceZ ? sizeZ : 1, 
    110         sliceC ? sizeC : 1, sliceT ? sizeT : 1, newStacks.length, i); 
     135      if (virtualStack != null) { 
     136        ((BFVirtualStack) newStacks[i]).setPlaneIndexes(planeIndexes[i]); 
     137      } 
     138 
     139      int[] zct = FormatTools.getZCTCoords(stackOrder, stackZ, stackC, stackT, 
     140        newStacks.length, i); 
    111141 
    112142      if (imp.isComposite()) { 
     
    125155      if (sliceC) title += " C=" + zct[1]; 
    126156 
    127       ImagePlus p = new ImagePlus(title, newStacks[i]); 
     157      ImagePlus p = null; 
     158 
     159      if (virtualStack != null) { 
     160        p = new VirtualImagePlus(title, newStacks[i]); 
     161        ((VirtualImagePlus) p).setReader(virtualStack.getReader()); 
     162      } 
     163      else { 
     164        p = new ImagePlus(title, newStacks[i]); 
     165      } 
     166 
    128167      p.setProperty("Info", imp.getProperty("Info")); 
    129       p.setDimensions(sliceC ? 1 : sizeC, sliceZ ? 1 : sizeZ, 
    130         sliceT ? 1 : sizeT); 
     168      p.setDimensions(realSizeC, realSizeZ, realSizeT); 
    131169      p.setCalibration(calibration); 
    132170      p.setFileInfo(imp.getOriginalFileInfo()); 
     
    244282  } 
    245283 
     284  /** Returns a new ImageStack using the given ImageStack as a template. */ 
     285  private ImageStack makeStack(ImageStack stack) { 
     286    if (!(stack instanceof BFVirtualStack)) { 
     287      return new ImageStack(stack.getWidth(), stack.getHeight()); 
     288    } 
     289 
     290    BFVirtualStack virtualStack = (BFVirtualStack) stack; 
     291    String path = virtualStack.getPath(); 
     292    ImageProcessorReader reader = virtualStack.getReader(); 
     293 
     294    try { 
     295      return new BFVirtualStack(path, reader, false, false, false); 
     296    } 
     297    catch (FormatException e) { 
     298      WindowTools.reportException(e); 
     299    } 
     300    catch (IOException e) { 
     301      WindowTools.reportException(e); 
     302    } 
     303    return null; 
     304  } 
     305 
    246306} 
  • trunk/components/loci-plugins/src/loci/plugins/in/MainDialog.java

    r6891 r7470  
    530530 
    531531    boolean splitEnabled = !isStackNone && !isStackBrowser && 
    532       !isStackImage5D && !isStackView5D && !isVirtual; 
    533     // TODO: Make splitting work with Data Browser & virtual stacks. 
     532      !isStackImage5D && !isStackView5D; 
     533    // TODO: Make splitting work with Data Browser. 
    534534 
    535535    // splitCBox 
  • trunk/components/loci-plugins/src/loci/plugins/util/BFVirtualStack.java

    r7022 r7470  
    7373  private int[] len; 
    7474 
     75  private int[] planeIndexes; 
     76 
    7577  // -- Static utility methods -- 
    7678 
     
    140142  } 
    141143 
     144  public void setPlaneIndexes(int[] planeIndexes) { 
     145    this.planeIndexes = planeIndexes; 
     146  } 
     147 
    142148  // -- VirtualStack API methods -- 
    143149 
     
    152158      } 
    153159    } 
    154     int[] pos = reader.getZCTCoords(n - 1); 
    155     if (merge) pos = new ChannelMerger(reader).getZCTCoords(n - 1); 
    156     int[] cachePos = FormatTools.rasterToPosition(len, n - 1); 
     160    int sliceIndex = planeIndexes == null ? n - 1 : planeIndexes[n - 1]; 
     161    int[] pos = reader.getZCTCoords(sliceIndex); 
     162    if (merge) pos = new ChannelMerger(reader).getZCTCoords(sliceIndex); 
     163    int[] cachePos = FormatTools.rasterToPosition(len, sliceIndex); 
    157164    ImageProcessor ip = null; 
    158165 
     
    251258    reader.setSeries(series); 
    252259    if (merge) return new ChannelMerger(reader).getImageCount(); 
    253     return reader.getImageCount(); 
     260    return planeIndexes == null ? reader.getImageCount() : planeIndexes.length; 
    254261  } 
    255262 
Note: See TracChangeset for help on using the changeset viewer.