Changeset 6114


Ignore:
Timestamp:
04/09/10 15:37:40 (10 years ago)
Author:
curtis
Message:

Begin rearranging some code.

File:
1 edited

Legend:

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

    r6045 r6114  
    114114  // -- Importer API methods -- 
    115115 
    116   /** Parses core importer options. */ 
    117   public ImporterOptions parseOptions(String arg, boolean quiet) { 
     116  /** Executes the plugin. */ 
     117  public void run(String arg) { 
     118    ImporterOptions options = parseOptions(arg, false); 
     119 
     120    checkNewVersion(options); 
     121    if (plugin.canceled) return; 
     122 
     123    try { 
     124      harvestAdditionalOptions(options); 
     125      if (plugin.canceled) return; 
     126 
     127      displayMetadata(options); 
     128      if (plugin.canceled) return; 
     129 
     130      readPixelData(options); 
     131      if (plugin.canceled) return; 
     132 
     133      displayROIs(options); 
     134      if (plugin.canceled) return; 
     135 
     136      finishUp(options); 
     137      if (plugin.canceled) return; 
     138    } 
     139    catch (FormatException exc) { 
     140      WindowTools.reportException(exc, options.isQuiet(), 
     141        "Sorry, there was a problem reading the data."); 
     142    } 
     143    catch (IOException exc) { 
     144      WindowTools.reportException(exc, options.isQuiet(), 
     145        "Sorry, there was an I/O problem reading the data."); 
     146    } 
     147  } 
     148 
     149  // -- Helper methods -- 
     150 
     151  // -- CTR BEGIN TEMP helper methods -- 
     152 
     153  // Step 0: parse core options 
     154  private ImporterOptions parseOptions(String arg, boolean quiet) { 
    118155    BF.debug("parse core options"); 
    119156    ImporterOptions options = null; 
     
    129166  } 
    130167 
     168  // Step 1: check if new version is available 
    131169  /** Checks if a new version of the LOCI plugins is available. */ 
    132   public void checkNewVersion(ImporterOptions options) { 
     170  private void checkNewVersion(ImporterOptions options) { 
    133171    BF.debug("check if new version is available"); 
    134172 
     
    138176  } 
    139177 
    140   /** Executes the plugin. */ 
    141   public void run(String arg) { 
    142  
    143     // -- Step 0: parse core options -- 
    144  
    145     ImporterOptions options = parseOptions(arg, false); 
    146  
    147     // -- Step 1: check if new version is available -- 
    148  
    149     checkNewVersion(options); 
    150     if (plugin.canceled) return; 
    151  
    152     // -- Step 2: harvest additional options -- 
    153  
     178  // Step 2: harvest additional options 
     179  private void harvestAdditionalOptions(ImporterOptions options) 
     180    throws FormatException, IOException 
     181  { 
    154182    BF.debug("get parameter values"); 
    155  
    156     try { 
    157       boolean success = options.showDialogs(); 
    158       if (!success) { 
    159         plugin.canceled = true; 
    160         return; 
    161       } 
    162       ImagePlusReader r = options.getReader(); 
    163  
    164       BF.debug("analyze and read from data source"); 
    165  
    166       IJ.showStatus("Analyzing " + options.getIdName()); 
    167  
    168       // -- Step 3: display metadata, if appropriate -- 
    169  
    170       if (options.isShowMetadata()) { 
    171         BF.debug("display metadata"); 
    172         IJ.showStatus("Populating metadata"); 
    173  
    174         // display standard metadata in a table in its own window 
    175         ImporterMetadata meta = options.getOriginalMetadata(); 
    176         meta.showMetadataWindow(options.getIdName()); 
    177       } 
    178       else BF.debug("skip metadata"); 
    179  
    180       if (options.isShowOMEXML()) { 
    181         BF.debug("show OME-XML"); 
    182         if (options.isViewBrowser()) { 
    183           // NB: Data Browser has its own internal OME-XML metadata window, 
    184           // which we'll trigger once we have created a Data Browser. 
    185           // So there is no need to pop up a separate OME-XML here. 
    186         } 
    187         else { 
    188           XMLWindow metaWindow = 
    189             new XMLWindow("OME Metadata - " + options.getIdName()); 
    190           Exception exc = null; 
    191           try { 
    192             ServiceFactory factory = new ServiceFactory(); 
    193             OMEXMLService service = factory.getInstance(OMEXMLService.class); 
    194             metaWindow.setXML(service.getOMEXML(options.getOMEMetadata())); 
    195             WindowTools.placeWindow(metaWindow); 
    196             metaWindow.setVisible(true); 
    197           } 
    198           catch (DependencyException e) { exc = e; } 
    199           catch (ServiceException e) { exc = e; } 
    200           catch (ParserConfigurationException e) { exc = e; } 
    201           catch (SAXException e) { exc = e; } 
    202  
    203           if (exc != null) { 
    204             WindowTools.reportException(exc, options.isQuiet(), 
    205               "Sorry, there was a problem displaying the OME metadata"); 
    206           } 
    207         } 
    208       } 
    209       else BF.debug("skip OME-XML"); 
    210  
    211       // -- Step 5: read pixel data -- 
    212  
    213       if (options.isViewNone()) return; // nothing to display 
    214  
    215       BF.debug("read pixel data"); 
    216  
    217       IJ.showStatus("Reading " + options.getCurrentFile()); 
    218  
    219       if (options.isVirtual()) { 
    220         int totalSeries = 0; 
    221         for (int s=0; s<r.getSeriesCount(); s++) { 
    222           if (options.isSeriesOn(s)) totalSeries++; 
    223         } 
    224         ((VirtualReader) r.getReader()).setRefCount(totalSeries); 
    225       } 
    226  
    227       for (int s=0; s<r.getSeriesCount(); s++) { 
    228         if (!options.isSeriesOn(s)) continue; 
    229         r.setSeries(s); 
    230  
    231         boolean[] load = new boolean[r.getImageCount()]; 
    232         int cBegin = options.getCBegin(s); 
    233         int cEnd = options.getCEnd(s); 
    234         int cStep = options.getCStep(s); 
    235         int zBegin = options.getZBegin(s); 
    236         int zEnd = options.getZEnd(s); 
    237         int zStep = options.getZStep(s); 
    238         int tBegin = options.getTBegin(s); 
    239         int tEnd = options.getTEnd(s); 
    240         int tStep = options.getTStep(s); 
    241         for (int c=cBegin; c<=cEnd; c+=cStep) { 
    242           for (int z=zBegin; z<=zEnd; z+=zStep) { 
    243             for (int t=tBegin; t<=tEnd; t+=tStep) { 
    244               //int index = r.isOrderCertain() ? r.getIndex(z, c, t) : c; 
    245               int index = r.getIndex(z, c, t); 
    246               load[index] = true; 
    247             } 
    248           } 
    249         } 
    250         int total = 0; 
    251         for (int j=0; j<r.getImageCount(); j++) if (load[j]) total++; 
    252  
    253         FileInfo fi = new FileInfo(); 
    254  
    255         // populate other common FileInfo fields 
    256         String idDir = options.getIdLocation() == null ? 
    257           null : options.getIdLocation().getParent(); 
    258         if (idDir != null && !idDir.endsWith(File.separator)) { 
    259           idDir += File.separator; 
    260         } 
    261         fi.fileName = options.getIdName(); 
    262         fi.directory = idDir; 
    263  
    264         long startTime = System.currentTimeMillis(); 
    265         long time = startTime; 
    266  
    267         ImageStack stackB = null; // for byte images (8-bit) 
    268         ImageStack stackS = null; // for short images (16-bit) 
    269         ImageStack stackF = null; // for floating point images (32-bit) 
    270         ImageStack stackO = null; // for all other images (24-bit RGB) 
    271  
    272         Rectangle cropRegion = options.getCropRegion(s); 
    273         int w = options.doCrop() ? cropRegion.width : r.getSizeX(); 
    274         int h = options.doCrop() ? cropRegion.height : r.getSizeY(); 
    275         int c = r.getRGBChannelCount(); 
    276         int type = r.getPixelType(); 
    277  
    278         int q = 0; 
    279         stackOrder = options.getStackOrder(); 
    280         if (stackOrder.equals(ImporterOptions.ORDER_DEFAULT)) { 
    281           stackOrder = r.getDimensionOrder(); 
    282         } 
    283         ((VirtualReader) r.getReader()).setOutputOrder(stackOrder); 
    284  
    285         options.getOMEMetadata().setPixelsDimensionOrder(stackOrder, s, 0); 
    286  
    287         // dump OME-XML to ImageJ's description field, if available 
    288  
     183    boolean success = options.showDialogs(); 
     184    if (!success) { 
     185      plugin.canceled = true; 
     186      return; 
     187    } 
     188    ImagePlusReader r = options.getReader(); 
     189 
     190    BF.debug("analyze and read from data source"); 
     191 
     192    IJ.showStatus("Analyzing " + options.getIdName()); 
     193  } 
     194 
     195  // Step 3: display metadata, if appropriate 
     196  private void displayMetadata(ImporterOptions options) throws IOException { 
     197    if (options.isShowMetadata()) { 
     198      BF.debug("display metadata"); 
     199      IJ.showStatus("Populating metadata"); 
     200 
     201      // display standard metadata in a table in its own window 
     202      ImporterMetadata meta = options.getOriginalMetadata(); 
     203      meta.showMetadataWindow(options.getIdName()); 
     204    } 
     205    else BF.debug("skip metadata"); 
     206 
     207    if (options.isShowOMEXML()) { 
     208      BF.debug("show OME-XML"); 
     209      if (options.isViewBrowser()) { 
     210        // NB: Data Browser has its own internal OME-XML metadata window, 
     211        // which we'll trigger once we have created a Data Browser. 
     212        // So there is no need to pop up a separate OME-XML here. 
     213      } 
     214      else { 
     215        XMLWindow metaWindow = 
     216          new XMLWindow("OME Metadata - " + options.getIdName()); 
     217        Exception exc = null; 
    289218        try { 
    290219          ServiceFactory factory = new ServiceFactory(); 
    291220          OMEXMLService service = factory.getInstance(OMEXMLService.class); 
    292           fi.description = service.getOMEXML(options.getOMEMetadata()); 
    293         } 
    294         catch (DependencyException de) { } 
    295         catch (ServiceException se) { } 
    296  
    297         if (options.isVirtual()) { 
    298           int cSize = r.getSizeC(); 
    299           int pt = r.getPixelType(); 
    300           boolean doMerge = options.isMergeChannels(); 
    301           boolean eight = pt != FormatTools.UINT8 && pt != FormatTools.INT8; 
    302           boolean needComposite = doMerge && (cSize > 3 || eight); 
    303           int merge = (needComposite || !doMerge) ? 1 : cSize; 
    304  
    305           r.setSeries(s); 
    306           // NB: ImageJ 1.39+ is required for VirtualStack 
    307           BFVirtualStack virtualStackB = new BFVirtualStack(options.getId(), 
    308             r, options.isColorize(), doMerge, options.isRecord()); 
    309           stackB = virtualStackB; 
    310           if (doMerge) { 
    311             for (int j=0; j<r.getImageCount(); j++) { 
    312               int[] pos = r.getZCTCoords(j); 
    313               if (pos[1] > 0) continue; 
    314               String label = constructSliceLabel( 
    315                 new ChannelMerger(r).getIndex(pos[0], pos[1], pos[2]), 
    316                 new ChannelMerger(r), options.getOMEMetadata(), s, 
    317                 options.getZCount(s), options.getCCount(s), 
    318                 options.getTCount(s)); 
    319               virtualStackB.addSlice(label); 
    320             } 
    321           } 
    322           else { 
    323             for (int j=0; j<r.getImageCount(); j++) { 
    324               String label = constructSliceLabel(j, r, 
    325                 options.getOMEMetadata(), s, options.getZCount(s), 
    326                 options.getCCount(s), options.getTCount(s)); 
    327               virtualStackB.addSlice(label); 
    328             } 
     221          metaWindow.setXML(service.getOMEXML(options.getOMEMetadata())); 
     222          WindowTools.placeWindow(metaWindow); 
     223          metaWindow.setVisible(true); 
     224        } 
     225        catch (DependencyException e) { exc = e; } 
     226        catch (ServiceException e) { exc = e; } 
     227        catch (ParserConfigurationException e) { exc = e; } 
     228        catch (SAXException e) { exc = e; } 
     229 
     230        if (exc != null) { 
     231          WindowTools.reportException(exc, options.isQuiet(), 
     232            "Sorry, there was a problem displaying the OME metadata"); 
     233        } 
     234      } 
     235    } 
     236    else BF.debug("skip OME-XML"); 
     237  } 
     238 
     239  // Step 5: read pixel data 
     240  private void readPixelData(ImporterOptions options) 
     241    throws FormatException, IOException 
     242  { 
     243    if (options.isViewNone()) return; // nothing to display 
     244 
     245    BF.debug("read pixel data"); 
     246 
     247    IJ.showStatus("Reading " + options.getCurrentFile()); 
     248 
     249    ImagePlusReader r = options.getReader(); 
     250 
     251    if (options.isVirtual()) { 
     252      int totalSeries = 0; 
     253      for (int s=0; s<r.getSeriesCount(); s++) { 
     254        if (options.isSeriesOn(s)) totalSeries++; 
     255      } 
     256      ((VirtualReader) r.getReader()).setRefCount(totalSeries); 
     257    } 
     258 
     259    for (int s=0; s<r.getSeriesCount(); s++) { 
     260      if (!options.isSeriesOn(s)) continue; 
     261      r.setSeries(s); 
     262 
     263      boolean[] load = new boolean[r.getImageCount()]; 
     264      int cBegin = options.getCBegin(s); 
     265      int cEnd = options.getCEnd(s); 
     266      int cStep = options.getCStep(s); 
     267      int zBegin = options.getZBegin(s); 
     268      int zEnd = options.getZEnd(s); 
     269      int zStep = options.getZStep(s); 
     270      int tBegin = options.getTBegin(s); 
     271      int tEnd = options.getTEnd(s); 
     272      int tStep = options.getTStep(s); 
     273      for (int c=cBegin; c<=cEnd; c+=cStep) { 
     274        for (int z=zBegin; z<=zEnd; z+=zStep) { 
     275          for (int t=tBegin; t<=tEnd; t+=tStep) { 
     276            //int index = r.isOrderCertain() ? r.getIndex(z, c, t) : c; 
     277            int index = r.getIndex(z, c, t); 
     278            load[index] = true; 
     279          } 
     280        } 
     281      } 
     282      int total = 0; 
     283      for (int j=0; j<r.getImageCount(); j++) if (load[j]) total++; 
     284 
     285      FileInfo fi = new FileInfo(); 
     286 
     287      // populate other common FileInfo fields 
     288      String idDir = options.getIdLocation() == null ? 
     289        null : options.getIdLocation().getParent(); 
     290      if (idDir != null && !idDir.endsWith(File.separator)) { 
     291        idDir += File.separator; 
     292      } 
     293      fi.fileName = options.getIdName(); 
     294      fi.directory = idDir; 
     295 
     296      long startTime = System.currentTimeMillis(); 
     297      long time = startTime; 
     298 
     299      ImageStack stackB = null; // for byte images (8-bit) 
     300      ImageStack stackS = null; // for short images (16-bit) 
     301      ImageStack stackF = null; // for floating point images (32-bit) 
     302      ImageStack stackO = null; // for all other images (24-bit RGB) 
     303 
     304      Rectangle cropRegion = options.getCropRegion(s); 
     305      int w = options.doCrop() ? cropRegion.width : r.getSizeX(); 
     306      int h = options.doCrop() ? cropRegion.height : r.getSizeY(); 
     307      int c = r.getRGBChannelCount(); 
     308      int type = r.getPixelType(); 
     309 
     310      int q = 0; 
     311      stackOrder = options.getStackOrder(); 
     312      if (stackOrder.equals(ImporterOptions.ORDER_DEFAULT)) { 
     313        stackOrder = r.getDimensionOrder(); 
     314      } 
     315      ((VirtualReader) r.getReader()).setOutputOrder(stackOrder); 
     316 
     317      options.getOMEMetadata().setPixelsDimensionOrder(stackOrder, s, 0); 
     318 
     319      // dump OME-XML to ImageJ's description field, if available 
     320 
     321      try { 
     322        ServiceFactory factory = new ServiceFactory(); 
     323        OMEXMLService service = factory.getInstance(OMEXMLService.class); 
     324        fi.description = service.getOMEXML(options.getOMEMetadata()); 
     325      } 
     326      catch (DependencyException de) { } 
     327      catch (ServiceException se) { } 
     328 
     329      if (options.isVirtual()) { 
     330        int cSize = r.getSizeC(); 
     331        int pt = r.getPixelType(); 
     332        boolean doMerge = options.isMergeChannels(); 
     333        boolean eight = pt != FormatTools.UINT8 && pt != FormatTools.INT8; 
     334        boolean needComposite = doMerge && (cSize > 3 || eight); 
     335        int merge = (needComposite || !doMerge) ? 1 : cSize; 
     336 
     337        r.setSeries(s); 
     338        // NB: ImageJ 1.39+ is required for VirtualStack 
     339        BFVirtualStack virtualStackB = new BFVirtualStack(options.getId(), 
     340          r, options.isColorize(), doMerge, options.isRecord()); 
     341        stackB = virtualStackB; 
     342        if (doMerge) { 
     343          for (int j=0; j<r.getImageCount(); j++) { 
     344            int[] pos = r.getZCTCoords(j); 
     345            if (pos[1] > 0) continue; 
     346            String label = constructSliceLabel( 
     347              new ChannelMerger(r).getIndex(pos[0], pos[1], pos[2]), 
     348              new ChannelMerger(r), options.getOMEMetadata(), s, 
     349              options.getZCount(s), options.getCCount(s), 
     350              options.getTCount(s)); 
     351            virtualStackB.addSlice(label); 
    329352          } 
    330353        } 
    331354        else { 
    332           if (r.isIndexed()) colorModels = new IndexColorModel[r.getSizeC()]; 
    333  
    334           for (int i=0; i<r.getImageCount(); i++) { 
    335             if (!load[i]) continue; 
    336  
    337             // limit message update rate 
    338             long clock = System.currentTimeMillis(); 
    339             if (clock - time >= 100) { 
    340               String sLabel = r.getSeriesCount() > 1 ? 
    341                 ("series " + (s + 1) + ", ") : ""; 
    342               String pLabel = "plane " + (i + 1) + "/" + total; 
    343               IJ.showStatus("Reading " + sLabel + pLabel); 
    344               time = clock; 
    345             } 
    346             IJ.showProgress((double) q++ / total); 
    347  
    348             String label = constructSliceLabel(i, r, 
     355          for (int j=0; j<r.getImageCount(); j++) { 
     356            String label = constructSliceLabel(j, r, 
    349357              options.getOMEMetadata(), s, options.getZCount(s), 
    350358              options.getCCount(s), options.getTCount(s)); 
    351  
    352             // get image processor for ith plane 
    353             ImageProcessor[] p = r.openProcessors(i, cropRegion); 
    354             ImageProcessor ip = p[0]; 
    355             if (p.length > 1) { 
    356               ip = ImagePlusTools.makeRGB(p).getProcessor(); 
    357             } 
    358             if (ip == null) { 
    359               plugin.canceled = true; 
    360               return; 
    361             } 
    362  
    363             int channel = r.getZCTCoords(i)[1]; 
    364             if (colorModels != null && p.length == 1) { 
    365               colorModels[channel] = (IndexColorModel) ip.getColorModel(); 
    366             } 
    367  
    368             // add plane to image stack 
    369             if (ip instanceof ByteProcessor) { 
    370               if (stackB == null) stackB = new ImageStack(w, h); 
     359            virtualStackB.addSlice(label); 
     360          } 
     361        } 
     362      } 
     363      else { 
     364        if (r.isIndexed()) colorModels = new IndexColorModel[r.getSizeC()]; 
     365 
     366        for (int i=0; i<r.getImageCount(); i++) { 
     367          if (!load[i]) continue; 
     368 
     369          // limit message update rate 
     370          long clock = System.currentTimeMillis(); 
     371          if (clock - time >= 100) { 
     372            String sLabel = r.getSeriesCount() > 1 ? 
     373              ("series " + (s + 1) + ", ") : ""; 
     374            String pLabel = "plane " + (i + 1) + "/" + total; 
     375            IJ.showStatus("Reading " + sLabel + pLabel); 
     376            time = clock; 
     377          } 
     378          IJ.showProgress((double) q++ / total); 
     379 
     380          String label = constructSliceLabel(i, r, 
     381            options.getOMEMetadata(), s, options.getZCount(s), 
     382            options.getCCount(s), options.getTCount(s)); 
     383 
     384          // get image processor for ith plane 
     385          ImageProcessor[] p = r.openProcessors(i, cropRegion); 
     386          ImageProcessor ip = p[0]; 
     387          if (p.length > 1) { 
     388            ip = ImagePlusTools.makeRGB(p).getProcessor(); 
     389          } 
     390          if (ip == null) { 
     391            plugin.canceled = true; 
     392            return; 
     393          } 
     394 
     395          int channel = r.getZCTCoords(i)[1]; 
     396          if (colorModels != null && p.length == 1) { 
     397            colorModels[channel] = (IndexColorModel) ip.getColorModel(); 
     398          } 
     399 
     400          // add plane to image stack 
     401          if (ip instanceof ByteProcessor) { 
     402            if (stackB == null) stackB = new ImageStack(w, h); 
     403            stackB.addSlice(label, ip); 
     404          } 
     405          else if (ip instanceof ShortProcessor) { 
     406            if (stackS == null) stackS = new ImageStack(w, h); 
     407            stackS.addSlice(label, ip); 
     408          } 
     409          else if (ip instanceof FloatProcessor) { 
     410            // merge image plane into existing stack if possible 
     411            if (stackB != null) { 
     412              ip = ip.convertToByte(true); 
    371413              stackB.addSlice(label, ip); 
    372414            } 
    373             else if (ip instanceof ShortProcessor) { 
    374               if (stackS == null) stackS = new ImageStack(w, h); 
     415            else if (stackS != null) { 
     416              ip = ip.convertToShort(true); 
    375417              stackS.addSlice(label, ip); 
    376418            } 
    377             else if (ip instanceof FloatProcessor) { 
    378               // merge image plane into existing stack if possible 
    379               if (stackB != null) { 
    380                 ip = ip.convertToByte(true); 
    381                 stackB.addSlice(label, ip); 
    382               } 
    383               else if (stackS != null) { 
    384                 ip = ip.convertToShort(true); 
    385                 stackS.addSlice(label, ip); 
    386               } 
    387               else { 
    388                 if (stackF == null) stackF = new ImageStack(w, h); 
    389                 stackF.addSlice(label, ip); 
    390               } 
     419            else { 
     420              if (stackF == null) stackF = new ImageStack(w, h); 
     421              stackF.addSlice(label, ip); 
    391422            } 
    392             else if (ip instanceof ColorProcessor) { 
    393               if (stackO == null) stackO = new ImageStack(w, h); 
    394               stackO.addSlice(label, ip); 
     423          } 
     424          else if (ip instanceof ColorProcessor) { 
     425            if (stackO == null) stackO = new ImageStack(w, h); 
     426            stackO.addSlice(label, ip); 
     427          } 
     428        } 
     429      } 
     430 
     431      IJ.showStatus("Creating image"); 
     432      IJ.showProgress(1); 
     433 
     434      showStack(stackB, s, fi, options); 
     435      showStack(stackS, s, fi, options); 
     436      showStack(stackF, s, fi, options); 
     437      showStack(stackO, s, fi, options); 
     438 
     439      long endTime = System.currentTimeMillis(); 
     440      double elapsed = (endTime - startTime) / 1000.0; 
     441      if (r.getImageCount() == 1) { 
     442        IJ.showStatus("Bio-Formats: " + elapsed + " seconds"); 
     443      } 
     444      else { 
     445        long average = (endTime - startTime) / r.getImageCount(); 
     446        IJ.showStatus("Bio-Formats: " + elapsed + " seconds (" + 
     447          average + " ms per plane)"); 
     448      } 
     449    } 
     450 
     451    if (options.isConcatenate()) { 
     452      ArrayList<Integer> widths = new ArrayList<Integer>(); 
     453      ArrayList<Integer> heights = new ArrayList<Integer>(); 
     454      ArrayList<Integer> types = new ArrayList<Integer>(); 
     455      ArrayList<ImagePlus> newImps = new ArrayList<ImagePlus>(); 
     456 
     457      for (int j=0; j<imps.size(); j++) { 
     458        ImagePlus imp = imps.get(j); 
     459        int wj = imp.getWidth(); 
     460        int hj = imp.getHeight(); 
     461        int tj = imp.getBitDepth(); 
     462        boolean append = false; 
     463        for (int k=0; k<widths.size(); k++) { 
     464          int wk = ((Integer) widths.get(k)).intValue(); 
     465          int hk = ((Integer) heights.get(k)).intValue(); 
     466          int tk = ((Integer) types.get(k)).intValue(); 
     467 
     468          if (wj == wk && hj == hk && tj == tk) { 
     469            ImagePlus oldImp = newImps.get(k); 
     470            ImageStack is = oldImp.getStack(); 
     471            ImageStack newStack = imp.getStack(); 
     472            for (int s=0; s<newStack.getSize(); s++) { 
     473              is.addSlice(newStack.getSliceLabel(s + 1), 
     474                newStack.getProcessor(s + 1)); 
    395475            } 
    396           } 
    397         } 
    398  
    399         IJ.showStatus("Creating image"); 
    400         IJ.showProgress(1); 
    401  
    402         showStack(stackB, s, fi, options); 
    403         showStack(stackS, s, fi, options); 
    404         showStack(stackF, s, fi, options); 
    405         showStack(stackO, s, fi, options); 
    406  
    407         long endTime = System.currentTimeMillis(); 
    408         double elapsed = (endTime - startTime) / 1000.0; 
    409         if (r.getImageCount() == 1) { 
    410           IJ.showStatus("Bio-Formats: " + elapsed + " seconds"); 
    411         } 
    412         else { 
    413           long average = (endTime - startTime) / r.getImageCount(); 
    414           IJ.showStatus("Bio-Formats: " + elapsed + " seconds (" + 
    415             average + " ms per plane)"); 
    416         } 
    417       } 
    418  
    419       if (options.isConcatenate()) { 
    420         ArrayList<Integer> widths = new ArrayList<Integer>(); 
    421         ArrayList<Integer> heights = new ArrayList<Integer>(); 
    422         ArrayList<Integer> types = new ArrayList<Integer>(); 
    423         ArrayList<ImagePlus> newImps = new ArrayList<ImagePlus>(); 
    424  
    425         for (int j=0; j<imps.size(); j++) { 
    426           ImagePlus imp = imps.get(j); 
    427           int wj = imp.getWidth(); 
    428           int hj = imp.getHeight(); 
    429           int tj = imp.getBitDepth(); 
    430           boolean append = false; 
    431           for (int k=0; k<widths.size(); k++) { 
    432             int wk = ((Integer) widths.get(k)).intValue(); 
    433             int hk = ((Integer) heights.get(k)).intValue(); 
    434             int tk = ((Integer) types.get(k)).intValue(); 
    435  
    436             if (wj == wk && hj == hk && tj == tk) { 
    437               ImagePlus oldImp = newImps.get(k); 
    438               ImageStack is = oldImp.getStack(); 
    439               ImageStack newStack = imp.getStack(); 
    440               for (int s=0; s<newStack.getSize(); s++) { 
    441                 is.addSlice(newStack.getSliceLabel(s + 1), 
    442                   newStack.getProcessor(s + 1)); 
    443               } 
    444               oldImp.setStack(oldImp.getTitle(), is); 
    445               newImps.set(k, oldImp); 
    446               append = true; 
    447               k = widths.size(); 
    448             } 
    449           } 
    450           if (!append) { 
    451             widths.add(new Integer(wj)); 
    452             heights.add(new Integer(hj)); 
    453             types.add(new Integer(tj)); 
    454             newImps.add(imp); 
    455           } 
    456         } 
    457  
    458         boolean splitC = options.isSplitChannels(); 
    459         boolean splitZ = options.isSplitFocalPlanes(); 
    460         boolean splitT = options.isSplitTimepoints(); 
    461  
    462         for (int j=0; j<newImps.size(); j++) { 
    463           ImagePlus imp = (ImagePlus) newImps.get(j); 
    464           imp.show(); 
    465           if (splitC || splitZ || splitT) { 
    466             IJ.runPlugIn("loci.plugins.Slicer", "slice_z=" + splitZ + 
    467               " slice_c=" + splitC + " slice_t=" + splitT + 
    468               " stack_order=" + stackOrder + " keep_original=false " + 
    469               "hyper_stack=" + options.isViewHyperstack() + " "); 
    470             imp.close(); 
    471           } 
    472           if (options.isMergeChannels() && options.isWindowless()) { 
    473             IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
    474               " merge=true merge_option=[" + options.getMergeOption() + "] " + 
    475               "series=" + r.getSeries() + " hyper_stack=" + 
    476               options.isViewHyperstack() + " "); 
    477             imp.close(); 
    478           } 
    479           else if (options.isMergeChannels()) { 
    480             IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
    481               " merge=true series=" + r.getSeries() + " hyper_stack=" + 
    482               options.isViewHyperstack() + " "); 
    483             imp.close(); 
    484           } 
    485         } 
    486       } 
    487  
    488       // -- Step 6: display ROIs, if necessary -- 
    489  
    490       if (options.showROIs()) { 
    491         BF.debug("display ROIs"); 
    492  
    493         ImagePlus[] impsArray = imps.toArray(new ImagePlus[0]); 
    494         ROIHandler.openROIs(options.getOMEMetadata(), impsArray); 
    495       } 
    496       else BF.debug("skip ROIs"); 
    497  
    498       // -- Step 7: finish up -- 
    499  
    500       BF.debug("finish up"); 
    501  
    502       try { 
    503         if (!options.isVirtual()) r.close(); 
    504       } 
    505       catch (IOException exc) { 
    506         WindowTools.reportException(exc, options.isQuiet(), 
    507           "Sorry, there was a problem closing the file"); 
    508       } 
    509  
    510       plugin.success = true; 
    511     } 
    512     catch (FormatException exc) { 
    513       WindowTools.reportException(exc, options.isQuiet(), 
    514         "Sorry, there was a problem reading the data."); 
     476            oldImp.setStack(oldImp.getTitle(), is); 
     477            newImps.set(k, oldImp); 
     478            append = true; 
     479            k = widths.size(); 
     480          } 
     481        } 
     482        if (!append) { 
     483          widths.add(new Integer(wj)); 
     484          heights.add(new Integer(hj)); 
     485          types.add(new Integer(tj)); 
     486          newImps.add(imp); 
     487        } 
     488      } 
     489 
     490      boolean splitC = options.isSplitChannels(); 
     491      boolean splitZ = options.isSplitFocalPlanes(); 
     492      boolean splitT = options.isSplitTimepoints(); 
     493 
     494      for (int j=0; j<newImps.size(); j++) { 
     495        ImagePlus imp = (ImagePlus) newImps.get(j); 
     496        imp.show(); 
     497        if (splitC || splitZ || splitT) { 
     498          IJ.runPlugIn("loci.plugins.Slicer", "slice_z=" + splitZ + 
     499            " slice_c=" + splitC + " slice_t=" + splitT + 
     500            " stack_order=" + stackOrder + " keep_original=false " + 
     501            "hyper_stack=" + options.isViewHyperstack() + " "); 
     502          imp.close(); 
     503        } 
     504        if (options.isMergeChannels() && options.isWindowless()) { 
     505          IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
     506            " merge=true merge_option=[" + options.getMergeOption() + "] " + 
     507            "series=" + r.getSeries() + " hyper_stack=" + 
     508            options.isViewHyperstack() + " "); 
     509          imp.close(); 
     510        } 
     511        else if (options.isMergeChannels()) { 
     512          IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
     513            " merge=true series=" + r.getSeries() + " hyper_stack=" + 
     514            options.isViewHyperstack() + " "); 
     515          imp.close(); 
     516        } 
     517      } 
     518    } 
     519  } 
     520 
     521  // Step 6: display ROIs, if necessary 
     522  private void displayROIs(ImporterOptions options) { 
     523    if (options.showROIs()) { 
     524      BF.debug("display ROIs"); 
     525 
     526      ImagePlus[] impsArray = imps.toArray(new ImagePlus[0]); 
     527      ROIHandler.openROIs(options.getOMEMetadata(), impsArray); 
     528    } 
     529    else BF.debug("skip ROIs"); 
     530  } 
     531 
     532  // Step 7: finish up 
     533  private void finishUp(ImporterOptions options) { 
     534    BF.debug("finish up"); 
     535 
     536    ImagePlusReader r = options.getReader(); 
     537 
     538    try { 
     539      if (!options.isVirtual()) r.close(); 
    515540    } 
    516541    catch (IOException exc) { 
    517542      WindowTools.reportException(exc, options.isQuiet(), 
    518         "Sorry, there was an I/O problem reading the data."); 
    519     } 
    520   } 
    521  
    522   // -- Helper methods -- 
     543        "Sorry, there was a problem closing the file"); 
     544    } 
     545 
     546    plugin.success = true; 
     547  } 
     548 
     549  // -- CTR END TEMP helper methods -- 
    523550 
    524551  /** 
Note: See TracChangeset for help on using the changeset viewer.