Changeset 5857


Ignore:
Timestamp:
01/29/10 15:12:59 (10 years ago)
Author:
curtis
Message:

Progress on Bio-Formats Importer refactoring. Probably some new bugs.

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

Legend:

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

    r5769 r5857  
    4646import java.util.Enumeration; 
    4747import java.util.Hashtable; 
    48 import java.util.StringTokenizer; 
    4948import java.util.Vector; 
    5049 
     
    5352import loci.common.ReflectedUniverse; 
    5453import loci.formats.ChannelMerger; 
    55 import loci.formats.ChannelSeparator; 
    56 import loci.formats.DimensionSwapper; 
    5754import loci.formats.FilePattern; 
    58 import loci.formats.FileStitcher; 
    5955import loci.formats.FormatException; 
    6056import loci.formats.FormatTools; 
    6157import loci.formats.IFormatReader; 
    62 import loci.formats.ImageReader; 
    6358import loci.formats.MetadataTools; 
    64 import loci.formats.StatusEvent; 
    65 import loci.formats.StatusListener; 
    6659import loci.formats.gui.XMLWindow; 
    67 import loci.formats.meta.IMetadata; 
    6860import loci.formats.meta.MetadataRetrieve; 
    6961import loci.plugins.Colorizer; 
    7062import loci.plugins.LociImporter; 
    7163import loci.plugins.prefs.OptionsDialog; 
     64import loci.plugins.util.BF; 
    7265import loci.plugins.util.BFVirtualStack; 
    7366import loci.plugins.util.DataBrowser; 
    7467import loci.plugins.util.ImagePlusReader; 
    7568import loci.plugins.util.ImagePlusTools; 
    76 import loci.plugins.util.LociPrefs; 
    7769import loci.plugins.util.ROIHandler; 
    7870import loci.plugins.util.SearchableWindow; 
    7971import loci.plugins.util.VirtualImagePlus; 
     72import loci.plugins.util.VirtualReader; 
    8073import loci.plugins.util.WindowTools; 
    8174 
     
    113106  // -- Importer API methods -- 
    114107 
    115   /** Executes the plugin. */ 
    116   public void run(String arg) { 
    117  
    118     // -- Step 0: parse core options -- 
    119  
    120     debug("parse core options"); 
    121  
     108  /** Parses core importer options. */ 
     109  public ImporterOptions parseOptions(String arg, boolean quiet) { 
     110    BF.debug("parse core options"); 
    122111    ImporterOptions options = null; 
    123112    try { 
     
    125114    } 
    126115    catch (IOException exc) { 
    127       WindowTools.reportException(exc); 
     116      WindowTools.reportException(exc, quiet); 
    128117    } 
    129118    options.loadOptions(); 
    130119    options.parseArg(arg); 
    131  
    132     // -- Step 1: check if new version is available -- 
    133  
    134     debug("check if new version is available"); 
     120    return options; 
     121  } 
     122 
     123  /** Checks if a new version of the LOCI plugins is available. */ 
     124  public void checkNewVersion(ImporterOptions options) { 
     125    BF.debug("check if new version is available"); 
    135126 
    136127    UpgradeDialog upgradeDialog = new UpgradeDialog(options); 
    137128    int status = upgradeDialog.showDialog(); 
    138129    if (!statusOk(status)) return; 
    139  
    140     // -- Step 2: construct reader and check id -- 
    141  
    142     debug("construct reader and check id"); 
    143  
    144     LocationDialog locationDialog = new LocationDialog(options); 
    145     status = locationDialog.showDialog(); 
    146     if (!statusOk(status)) return; 
    147  
    148     IdDialog idDialog = new IdDialog(options); 
    149     status = idDialog.showDialog(); 
    150     if (!statusOk(status)) return; 
    151  
    152     String id = options.getId(); 
    153     boolean quiet = options.isQuiet(); 
    154  
    155     Location idLoc = null; 
    156     String idName = id; 
    157     if (options.isLocal()) { 
    158       idLoc = new Location(id); 
    159       idName = idLoc.getName(); 
    160     } 
    161     else if (options.isOME() || options.isOMERO()) { 
    162       // NB: strip out username and password when opening from OME/OMERO 
    163       StringTokenizer st = new StringTokenizer(id, "?&"); 
    164       StringBuffer idBuf = new StringBuffer(); 
    165       int tokenCount = 0; 
    166       while (st.hasMoreTokens()) { 
    167         String token = st.nextToken(); 
    168         if (token.startsWith("username=") || token.startsWith("password=")) { 
    169           continue; 
    170         } 
    171         if (tokenCount == 1) idBuf.append("?"); 
    172         else if (tokenCount > 1) idBuf.append("&"); 
    173         idBuf.append(token); 
    174         tokenCount++; 
    175       } 
    176       idName = idBuf.toString(); 
    177     } 
    178  
    179     IFormatReader base = null; 
    180     if (options.isLocal() || options.isHTTP()) { 
    181       IJ.showStatus("Identifying " + idName); 
    182       ImageReader reader = ImagePlusReader.makeImageReader(); 
    183       try { base = reader.getReader(id); } 
    184       catch (FormatException exc) { 
    185         WindowTools.reportException(exc, quiet, 
    186           "Sorry, there was an error reading the file."); 
     130  } 
     131 
     132  /** Executes the plugin. */ 
     133  public void run(String arg) { 
     134 
     135    // -- Step 0: parse core options -- 
     136 
     137    ImporterOptions options = parseOptions(arg, false); 
     138 
     139    // -- Step 1: check if new version is available -- 
     140 
     141    checkNewVersion(options); 
     142    if (plugin.canceled) return; 
     143 
     144    // -- Step 2: harvest additional options -- 
     145 
     146    BF.debug("get parameter values"); 
     147 
     148    try { 
     149      boolean success = options.showDialogs(); 
     150      if (!success) { 
     151        plugin.canceled = true; 
    187152        return; 
    188153      } 
    189       catch (IOException exc) { 
    190         WindowTools.reportException(exc, quiet, 
    191           "Sorry, there was a I/O problem reading the file."); 
    192         return; 
    193       } 
    194     } 
    195     else if (options.isOMERO()) { 
    196       // NB: avoid dependencies on optional loci.ome.io package 
    197       try { 
    198         ReflectedUniverse ru = new ReflectedUniverse(); 
    199         ru.exec("import loci.ome.io.OMEROReader"); 
    200         base = (IFormatReader) ru.exec("new OMEROReader()"); 
    201       } 
    202       catch (ReflectException exc) { 
    203         WindowTools.reportException(exc, options.isQuiet(), 
    204           "Sorry, there was a problem constructing the OMERO I/O engine"); 
    205         return; 
    206       } 
    207     } 
    208     else if (options.isOME()) { 
    209       // NB: avoid dependencies on optional loci.ome.io package 
    210       try { 
    211         ReflectedUniverse ru = new ReflectedUniverse(); 
    212         ru.exec("import loci.ome.io.OMEReader"); 
    213         base = (IFormatReader) ru.exec("new OMEReader()"); 
    214       } 
    215       catch (ReflectException exc) { 
    216         WindowTools.reportException(exc, options.isQuiet(), 
    217           "Sorry, there was a problem constructing the OME I/O engine"); 
    218         return; 
    219       } 
    220     } 
    221     else { 
    222       WindowTools.reportException(null, options.isQuiet(), 
    223         "Sorry, there has been an internal error: unknown data source"); 
    224     } 
    225     IMetadata omexmlMeta = MetadataTools.createOMEXMLMetadata(); 
    226     base.setMetadataStore(omexmlMeta); 
    227  
    228     IJ.showStatus(""); 
    229     base.addStatusListener(new StatusEchoer()); 
    230  
    231     // -- Step 3: get parameter values -- 
    232  
    233     debug("get parameter values"); 
    234  
    235     boolean windowless = options.isWindowless() || LociPrefs.isWindowless(base); 
    236     if (!windowless) { 
    237       ImporterDialog importerDialog = new ImporterDialog(options); 
    238       status = importerDialog.showDialog(); 
    239     } 
    240     if (!statusOk(status)) return; 
    241  
    242     boolean mergeChannels = options.isMergeChannels(); 
    243     boolean colorize = options.isColorize(); 
    244     boolean showMetadata = options.isShowMetadata(); 
    245     boolean showOMEXML = options.isShowOMEXML(); 
    246     boolean groupFiles = options.isGroupFiles(); 
    247     boolean ungroupFiles = options.isUngroupFiles(); 
    248     boolean concatenate = options.isConcatenate(); 
    249     boolean specifyRanges = options.isSpecifyRanges(); 
    250     boolean cropOnImport = options.doCrop(); 
    251     boolean swapDimensions = options.isSwapDimensions(); 
    252     quiet = options.isQuiet(); 
    253  
    254     // save options as new defaults 
    255     if (!quiet) options.setFirstTime(false); 
    256     options.saveOptions(); 
    257  
    258     // -- Step 4: analyze and read from data source -- 
    259  
    260     debug("analyze and read from data source"); 
    261  
    262     IJ.showStatus("Analyzing " + idName); 
    263  
    264     try { 
    265       base.setMetadataFiltered(true); 
    266       base.setOriginalMetadataPopulated(true); 
    267       base.setGroupFiles(!ungroupFiles); 
    268       base.setId(id); 
    269  
    270       int pixelType = base.getPixelType(); 
    271       String currentFile = base.getCurrentFile(); 
    272  
    273       // -- Step 4a: prompt for the file pattern, if necessary -- 
    274  
    275       if (groupFiles) { 
    276         debug("prompt for the file pattern"); 
    277         FilePatternDialog filePatternDialog = new FilePatternDialog(options); 
    278         status = filePatternDialog.showDialog(); 
    279         if (!statusOk(status)) return; 
    280         id = options.getId(); 
    281         if (id == null) id = currentFile; 
    282         FilePattern fp = new FilePattern(id); 
    283         if (!fp.isValid()) { 
    284           id = currentFile; 
    285         } 
    286       } 
    287       else debug("no need to prompt for file pattern"); 
    288  
    289       if (groupFiles) base = new FileStitcher(base, true); 
    290       if (options.isVirtual() || !options.isMergeChannels() || 
    291         FormatTools.getBytesPerPixel(base.getPixelType()) != 1) 
    292       { 
    293         base = new ChannelSeparator(base); 
    294       } 
    295       // NB: VirtualReader extends DimensionSwapper 
    296       VirtualReader virtualReader = new VirtualReader(base); 
    297       ImagePlusReader r = new ImagePlusReader(virtualReader); 
    298       r.setId(id); 
    299  
    300       // -- Step 4b: prompt for which series to import, if necessary -- 
    301  
    302       // populate series-related variables 
    303       int seriesCount = r.getSeriesCount(); 
    304       int[] num = new int[seriesCount]; 
    305       int[] sizeC = new int[seriesCount]; 
    306       int[] sizeZ = new int[seriesCount]; 
    307       int[] sizeT = new int[seriesCount]; 
    308       boolean[] certain = new boolean[seriesCount]; 
    309       int[] cBegin = new int[seriesCount]; 
    310       int[] cEnd = new int[seriesCount]; 
    311       int[] cStep = new int[seriesCount]; 
    312       int[] zBegin = new int[seriesCount]; 
    313       int[] zEnd = new int[seriesCount]; 
    314       int[] zStep = new int[seriesCount]; 
    315       int[] tBegin = new int[seriesCount]; 
    316       int[] tEnd = new int[seriesCount]; 
    317       int[] tStep = new int[seriesCount]; 
    318       boolean[] series = new boolean[seriesCount]; 
    319       for (int i=0; i<seriesCount; i++) { 
    320         r.setSeries(i); 
    321         num[i] = r.getImageCount(); 
    322         sizeC[i] = r.getEffectiveSizeC(); 
    323         sizeZ[i] = r.getSizeZ(); 
    324         sizeT[i] = r.getSizeT(); 
    325         certain[i] = r.isOrderCertain(); 
    326         cBegin[i] = zBegin[i] = tBegin[i] = 0; 
    327         //cEnd[i] = certain[i] ? sizeC[i] - 1 : num[i] - 1; 
    328         cEnd[i] = sizeC[i] - 1; 
    329         zEnd[i] = sizeZ[i] - 1; 
    330         tEnd[i] = sizeT[i] - 1; 
    331         cStep[i] = zStep[i] = tStep[i] = 1; 
    332       } 
    333       series[0] = true; 
    334  
    335       // build descriptive label for each series 
    336       String[] seriesLabels = new String[seriesCount]; 
    337       for (int i=0; i<seriesCount; i++) { 
    338         r.setSeries(i); 
    339         StringBuffer sb = new StringBuffer(); 
    340         sb.append("Series_"); 
    341         sb.append((i + 1)); 
    342         sb.append(": "); 
    343         String name = omexmlMeta.getImageName(i); 
    344         if (name != null && name.length() > 0) { 
    345           sb.append(name); 
    346           sb.append(": "); 
    347         } 
    348         sb.append(r.getSizeX()); 
    349         sb.append(" x "); 
    350         sb.append(r.getSizeY()); 
    351         sb.append("; "); 
    352         sb.append(num[i]); 
    353         sb.append(" plane"); 
    354         if (num[i] > 1) { 
    355           sb.append("s"); 
    356           if (certain[i]) { 
    357             sb.append(" ("); 
    358             boolean first = true; 
    359             if (sizeC[i] > 1) { 
    360               sb.append(sizeC[i]); 
    361               sb.append("C"); 
    362               first = false; 
    363             } 
    364             if (sizeZ[i] > 1) { 
    365               if (!first) sb.append(" x "); 
    366               sb.append(sizeZ[i]); 
    367               sb.append("Z"); 
    368               first = false; 
    369             } 
    370             if (sizeT[i] > 1) { 
    371               if (!first) sb.append(" x "); 
    372               sb.append(sizeT[i]); 
    373               sb.append("T"); 
    374               first = false; 
    375             } 
    376             sb.append(")"); 
    377           } 
    378         } 
    379         seriesLabels[i] = sb.toString(); 
    380         //seriesLabels[i] = seriesLabels[i].replaceAll(" ", "_"); 
    381       } 
    382  
    383       if (seriesCount > 1 && !options.openAllSeries() && !options.isViewNone()) 
    384       { 
    385         debug("prompt for which series to import"); 
    386         SeriesDialog seriesDialog = new SeriesDialog(options, 
    387           r, seriesLabels, series); 
    388         status = seriesDialog.showDialog(); 
    389         if (!statusOk(status)) return; 
    390       } 
    391       else debug("no need to prompt for series"); 
    392  
    393       if (options.openAllSeries() || options.isViewNone()) { 
    394         Arrays.fill(series, true); 
    395       } 
    396  
    397       // -- Step 4c: prompt for dimension swapping parameters, if necessary -- 
    398  
    399       if (swapDimensions) { 
    400         debug("prompt for dimension swapping parameters"); 
    401  
    402         SwapDialog swapDialog = new SwapDialog(options, virtualReader, series); 
    403         status = swapDialog.showDialog(); 
    404         if (!statusOk(status)) return; 
    405  
    406         for (int i=0; i<seriesCount; i++) { 
    407           r.setSeries(i); 
    408           num[i] = r.getImageCount(); 
    409           sizeC[i] = r.getEffectiveSizeC(); 
    410           sizeZ[i] = r.getSizeZ(); 
    411           sizeT[i] = r.getSizeT(); 
    412           certain[i] = r.isOrderCertain(); 
    413           cBegin[i] = zBegin[i] = tBegin[i] = 0; 
    414           cEnd[i] = sizeC[i] - 1; 
    415           zEnd[i] = sizeZ[i] - 1; 
    416           tEnd[i] = sizeT[i] - 1; 
    417           cStep[i] = zStep[i] = tStep[i] = 1; 
    418         } 
    419       } 
    420       else debug("no need to prompt for dimension swapping"); 
    421  
    422       // -- Step 4d: prompt for the range of planes to import, if necessary -- 
    423  
    424       if (specifyRanges) { 
    425         boolean needRange = false; 
    426         for (int i=0; i<seriesCount; i++) { 
    427           if (series[i] && num[i] > 1) needRange = true; 
    428         } 
    429         if (needRange) { 
    430           debug("prompt for planar ranges"); 
    431           IJ.showStatus(""); 
    432           RangeDialog rangeDialog = new RangeDialog(options, 
    433             r, series, seriesLabels, cBegin, cEnd, cStep, 
    434             zBegin, zEnd, zStep, tBegin, tEnd, tStep); 
    435           status = rangeDialog.showDialog(); 
    436           if (!statusOk(status)) return; 
    437         } 
    438         else debug("no need to prompt for planar ranges"); 
    439       } 
    440       else debug("open all planes"); 
    441       int[] cCount = new int[seriesCount]; 
    442       int[] zCount = new int[seriesCount]; 
    443       int[] tCount = new int[seriesCount]; 
    444       for (int i=0; i<seriesCount; i++) { 
    445         if (!series[i]) continue; 
    446         cCount[i] = (cEnd[i] - cBegin[i] + cStep[i]) / cStep[i]; 
    447         zCount[i] = (zEnd[i] - zBegin[i] + zStep[i]) / zStep[i]; 
    448         tCount[i] = (tEnd[i] - tBegin[i] + tStep[i]) / tStep[i]; 
    449       } 
    450  
    451       Rectangle[] cropOptions = new Rectangle[seriesCount]; 
    452       for (int i=0; i<cropOptions.length; i++) { 
    453         if (series[i] && cropOnImport) cropOptions[i] = new Rectangle(); 
    454       } 
    455       if (cropOnImport) { 
    456         CropDialog cropDialog = new CropDialog(options, 
    457           r, seriesLabels, series, cropOptions); 
    458         status = cropDialog.showDialog(); 
    459         if (!statusOk(status)) return; 
    460       } 
    461  
    462       // -- Step 4e: display metadata, if appropriate -- 
    463  
    464       if (showMetadata) { 
    465         debug("display metadata"); 
     154      ImagePlusReader r = options.getReader(); 
     155 
     156      // -- Step 3: prompt for more information as needed -- 
     157 
     158      BF.debug("analyze and read from data source"); 
     159 
     160      IJ.showStatus("Analyzing " + options.getIdName()); 
     161 
     162      // -- Step 4: display metadata, if appropriate -- 
     163 
     164      if (options.isShowMetadata()) { 
     165        BF.debug("display metadata"); 
    466166        IJ.showStatus("Populating metadata"); 
    467167 
    468168        // display standard metadata in a table in its own window 
    469169        Hashtable meta = r.getMetadata(); 
    470         //if (seriesCount == 1) meta = r.getMetadata(); 
    471         meta.put(options.getLocation(), currentFile); 
    472         int digits = digits(seriesCount); 
    473         for (int i=0; i<seriesCount; i++) { 
    474           if (!series[i]) continue; 
     170        //if (r.getSeriesCount() == 1) meta = r.getMetadata(); 
     171        meta.put(options.getLocation(), options.getCurrentFile()); 
     172        int digits = digits(r.getSeriesCount()); 
     173        for (int i=0; i<r.getSeriesCount(); i++) { 
     174          if (!options.isSeriesOn(i)) continue; 
    475175          r.setSeries(i); 
    476176          //meta.putAll(r.getCoreMetadata().seriesMetadata[i]); 
    477177 
    478           String s = omexmlMeta.getImageName(i); 
    479           if ((s == null || s.trim().length() == 0) && seriesCount > 1) { 
     178          String s = options.getMetadata().getImageName(i); 
     179          if ((s == null || s.trim().length() == 0) && r.getSeriesCount() > 1) { 
    480180            StringBuffer sb = new StringBuffer(); 
    481181            sb.append("Series "); 
     
    505205        String metaString = getMetadataString(meta, "\t"); 
    506206 
    507         SearchableWindow w = new SearchableWindow("Original Metadata - " + id, 
    508           "Key\tValue", metaString, 400, 400); 
     207        SearchableWindow w = new SearchableWindow("Original Metadata - " + 
     208          options.getIdName(), "Key\tValue", metaString, 400, 400); 
    509209        w.setVisible(true); 
    510210      } 
    511       else debug("skip metadata"); 
    512  
    513       if (showOMEXML) { 
    514         debug("show OME-XML"); 
     211      else BF.debug("skip metadata"); 
     212 
     213      if (options.isShowOMEXML()) { 
     214        BF.debug("show OME-XML"); 
    515215        if (options.isViewBrowser()) { 
    516216          // NB: Data Browser has its own internal OME-XML metadata window, 
     
    519219        } 
    520220        else { 
    521           XMLWindow metaWindow = new XMLWindow("OME Metadata - " + id); 
     221          XMLWindow metaWindow = 
     222            new XMLWindow("OME Metadata - " + options.getIdName()); 
    522223          try { 
    523             metaWindow.setXML(MetadataTools.getOMEXML(omexmlMeta)); 
     224            metaWindow.setXML(MetadataTools.getOMEXML(options.getMetadata())); 
    524225            WindowTools.placeWindow(metaWindow); 
    525226            metaWindow.setVisible(true); 
     
    535236        } 
    536237      } 
    537       else debug("skip OME-XML"); 
    538  
    539       // -- Step 4f: read pixel data -- 
     238      else BF.debug("skip OME-XML"); 
     239 
     240      // -- Step 5: read pixel data -- 
    540241 
    541242      if (options.isViewNone()) return; // nothing to display 
    542243 
    543       debug("read pixel data"); 
    544  
    545       IJ.showStatus("Reading " + currentFile); 
     244      BF.debug("read pixel data"); 
     245 
     246      IJ.showStatus("Reading " + options.getCurrentFile()); 
    546247 
    547248      if (options.isVirtual()) { 
    548249        int totalSeries = 0; 
    549         for (int i=0; i<seriesCount; i++) { 
    550           if (series[i]) totalSeries++; 
    551         } 
    552         virtualReader.setRefCount(totalSeries); 
    553       } 
    554  
    555       for (int i=0; i<seriesCount; i++) { 
    556         if (!series[i]) continue; 
     250        for (int i=0; i<r.getSeriesCount(); i++) { 
     251          if (options.isSeriesOn(i)) totalSeries++; 
     252        } 
     253        ((VirtualReader) r.getReader()).setRefCount(totalSeries); 
     254      } 
     255 
     256      for (int i=0; i<r.getSeriesCount(); i++) { 
     257        if (!options.isSeriesOn(i)) continue; 
    557258        r.setSeries(i); 
    558259 
    559         boolean[] load = new boolean[num[i]]; 
    560         for (int c=cBegin[i]; c<=cEnd[i]; c+=cStep[i]) { 
    561           for (int z=zBegin[i]; z<=zEnd[i]; z+=zStep[i]) { 
    562             for (int t=tBegin[i]; t<=tEnd[i]; t+=tStep[i]) { 
     260        boolean[] load = new boolean[r.getImageCount()]; 
     261        int cBegin = options.getCBegin(i); 
     262        int cEnd = options.getCEnd(i); 
     263        int cStep = options.getCStep(i); 
     264        int zBegin = options.getZBegin(i); 
     265        int zEnd = options.getZEnd(i); 
     266        int zStep = options.getZStep(i); 
     267        int tBegin = options.getTBegin(i); 
     268        int tEnd = options.getTEnd(i); 
     269        int tStep = options.getTStep(i); 
     270        for (int c=cBegin; c<=cEnd; c+=cStep) { 
     271          for (int z=zBegin; z<=zEnd; z+=zStep) { 
     272            for (int t=tBegin; t<=tEnd; t+=tStep) { 
    563273              //int index = r.isOrderCertain() ? r.getIndex(z, c, t) : c; 
    564274              int index = r.getIndex(z, c, t); 
     
    568278        } 
    569279        int total = 0; 
    570         for (int j=0; j<num[i]; j++) if (load[j]) total++; 
     280        for (int j=0; j<r.getImageCount(); j++) if (load[j]) total++; 
    571281 
    572282        FileInfo fi = new FileInfo(); 
    573283 
    574284        // populate other common FileInfo fields 
    575         String idDir = idLoc == null ? null : idLoc.getParent(); 
     285        String idDir = options.getIdLocation() == null ? 
     286          null : options.getIdLocation().getParent(); 
    576287        if (idDir != null && !idDir.endsWith(File.separator)) { 
    577288          idDir += File.separator; 
    578289        } 
    579         fi.fileName = idName; 
     290        fi.fileName = options.getIdName(); 
    580291        fi.directory = idDir; 
    581292 
     
    591302        ImageStack stackO = null; // for all other images (24-bit RGB) 
    592303 
    593         int w = cropOnImport ? cropOptions[i].width : r.getSizeX(); 
    594         int h = cropOnImport ? cropOptions[i].height : r.getSizeY(); 
     304        Rectangle cropRegion = options.getCropRegion(i); 
     305        int w = options.doCrop() ? cropRegion.width : r.getSizeX(); 
     306        int h = options.doCrop() ? cropRegion.height : r.getSizeY(); 
    595307        int c = r.getRGBChannelCount(); 
    596308        int type = r.getPixelType(); 
     
    601313          stackOrder = r.getDimensionOrder(); 
    602314        } 
    603         virtualReader.setOutputOrder(stackOrder); 
    604  
    605         omexmlMeta.setPixelsDimensionOrder(stackOrder, i, 0); 
     315        ((VirtualReader) r.getReader()).setOutputOrder(stackOrder); 
     316 
     317        options.getMetadata().setPixelsDimensionOrder(stackOrder, i, 0); 
    606318 
    607319        // dump OME-XML to ImageJ's description field, if available 
    608         fi.description = MetadataTools.getOMEXML(omexmlMeta); 
     320        fi.description = MetadataTools.getOMEXML(options.getMetadata()); 
    609321 
    610322        if (options.isVirtual()) { 
     
    618330          r.setSeries(i); 
    619331          // NB: ImageJ 1.39+ is required for VirtualStack 
    620           BFVirtualStack virtualStackB = new BFVirtualStack(id, 
    621             r, colorize, doMerge, options.isRecord()); 
     332          BFVirtualStack virtualStackB = new BFVirtualStack(options.getId(), 
     333            r, options.isColorize(), doMerge, options.isRecord()); 
    622334          stackB = virtualStackB; 
    623335          if (doMerge) { 
    624             cCount[i] = 1; 
    625             for (int j=0; j<num[i]; j++) { 
     336            for (int j=0; j<r.getImageCount(); j++) { 
    626337              int[] pos = r.getZCTCoords(j); 
    627338              if (pos[1] > 0) continue; 
    628339              String label = constructSliceLabel( 
    629340                new ChannelMerger(r).getIndex(pos[0], pos[1], pos[2]), 
    630                 new ChannelMerger(r), omexmlMeta, i, zCount, cCount, tCount); 
     341                new ChannelMerger(r), options.getMetadata(), i, 
     342                options.getZCount(i), options.getCCount(i), 
     343                options.getTCount(i)); 
    631344              virtualStackB.addSlice(label); 
    632345            } 
    633346          } 
    634347          else { 
    635             for (int j=0; j<num[i]; j++) { 
     348            for (int j=0; j<r.getImageCount(); j++) { 
    636349              String label = constructSliceLabel(j, r, 
    637                 omexmlMeta, i, zCount, cCount, tCount); 
     350                options.getMetadata(), i, options.getZCount(i), 
     351                options.getCCount(i), options.getTCount(i)); 
    638352              virtualStackB.addSlice(label); 
    639353            } 
     
    643357          if (r.isIndexed()) colorModels = new IndexColorModel[r.getSizeC()]; 
    644358 
    645           for (int j=0; j<num[i]; j++) { 
     359          for (int j=0; j<r.getImageCount(); j++) { 
    646360            if (!load[j]) continue; 
    647361 
     
    650364            if (clock - time >= 100) { 
    651365              IJ.showStatus("Reading " + 
    652                 (seriesCount > 1 ? ("series " + (i + 1) + ", ") : "") + 
     366                (r.getSeriesCount() > 1 ? ("series " + (i + 1) + ", ") : "") + 
    653367                "plane " + (j + 1) + "/" + total); 
    654368              time = clock; 
     
    659373 
    660374            String label = constructSliceLabel(ndx, r, 
    661               omexmlMeta, i, zCount, cCount, tCount); 
     375              options.getMetadata(), i, options.getZCount(i), 
     376              options.getCCount(i), options.getTCount(i)); 
    662377 
    663378            // get image processor for jth plane 
    664             ImageProcessor[] p = r.openProcessors(ndx, cropOptions[i]); 
     379            ImageProcessor[] p = r.openProcessors(ndx, cropRegion); 
    665380            ImageProcessor ip = p[0]; 
    666381            if (p.length > 1) { 
     
    711426        IJ.showProgress(1); 
    712427 
    713         String seriesName = omexmlMeta.getImageName(i); 
    714  
    715         showStack(stackB, currentFile, seriesName, omexmlMeta, 
    716           cCount[i], zCount[i], tCount[i], sizeZ[i], sizeC[i], sizeT[i], 
    717           fi, r, options, metadata, windowless); 
    718         showStack(stackS, currentFile, seriesName, omexmlMeta, 
    719           cCount[i], zCount[i], tCount[i], sizeZ[i], sizeC[i], sizeT[i], 
    720           fi, r, options, metadata, windowless); 
    721         showStack(stackF, currentFile, seriesName, omexmlMeta, 
    722           cCount[i], zCount[i], tCount[i], sizeZ[i], sizeC[i], sizeT[i], 
    723           fi, r, options, metadata, windowless); 
    724         showStack(stackO, currentFile, seriesName, omexmlMeta, 
    725           cCount[i], zCount[i], tCount[i], sizeZ[i], sizeC[i], sizeT[i], 
    726           fi, r, options, metadata, windowless); 
     428        String seriesName = options.getMetadata().getImageName(i); 
     429 
     430        showStack(stackB, options.getCurrentFile(), seriesName, 
     431          options.getMetadata(), options.getCCount(i), 
     432          options.getZCount(i), options.getTCount(i), 
     433          r.getSizeZ(), r.getEffectiveSizeC(), r.getSizeT(), 
     434          fi, r, options, metadata, options.isWindowless()); 
     435        showStack(stackS, options.getCurrentFile(), seriesName, 
     436          options.getMetadata(), options.getCCount(i), 
     437          options.getZCount(i), options.getTCount(i), 
     438          r.getSizeZ(), r.getEffectiveSizeC(), r.getSizeT(), 
     439          fi, r, options, metadata, options.isWindowless()); 
     440        showStack(stackF, options.getCurrentFile(), seriesName, 
     441          options.getMetadata(), options.getCCount(i), 
     442          options.getZCount(i), options.getTCount(i), 
     443          r.getSizeZ(), r.getEffectiveSizeC(), r.getSizeT(), 
     444          fi, r, options, metadata, options.isWindowless()); 
     445        showStack(stackO, options.getCurrentFile(), seriesName, 
     446          options.getMetadata(), options.getCCount(i), 
     447          options.getZCount(i), options.getTCount(i), 
     448          r.getSizeZ(), r.getEffectiveSizeC(), r.getSizeT(), 
     449          fi, r, options, metadata, options.isWindowless()); 
    727450 
    728451        long endTime = System.currentTimeMillis(); 
    729452        double elapsed = (endTime - startTime) / 1000.0; 
    730         if (num[i] == 1) { 
     453        if (r.getImageCount() == 1) { 
    731454          IJ.showStatus("Bio-Formats: " + elapsed + " seconds"); 
    732455        } 
    733456        else { 
    734           long average = (endTime - startTime) / num[i]; 
     457          long average = (endTime - startTime) / r.getImageCount(); 
    735458          IJ.showStatus("Bio-Formats: " + elapsed + " seconds (" + 
    736459            average + " ms per plane)"); 
     
    738461      } 
    739462 
    740       if (concatenate) { 
     463      if (options.isConcatenate()) { 
    741464        Vector widths = new Vector(); 
    742465        Vector heights = new Vector(); 
     
    791514            imp.close(); 
    792515          } 
    793           if (mergeChannels && windowless) { 
     516          if (options.isMergeChannels() && options.isWindowless()) { 
    794517            IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
    795518              " merge=true merge_option=[" + options.getMergeOption() + "] " + 
     
    798521            imp.close(); 
    799522          } 
    800           else if (mergeChannels) { 
     523          else if (options.isMergeChannels()) { 
    801524            IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
    802525              " merge=true series=" + r.getSeries() + " hyper_stack=" + 
     
    807530      } 
    808531 
    809       // display ROIs, if necessary 
     532      // -- Step 6: display ROIs, if necessary -- 
    810533 
    811534      if (options.showROIs()) { 
    812         debug("display ROIs"); 
    813  
    814         ROIHandler.openROIs(omexmlMeta, 
     535        BF.debug("display ROIs"); 
     536 
     537        ROIHandler.openROIs(options.getMetadata(), 
    815538          (ImagePlus[]) imps.toArray(new ImagePlus[0])); 
    816539      } 
    817       else debug("skip ROIs"); 
    818  
    819       // -- Step 5: finish up -- 
    820  
    821       debug("finish up"); 
     540      else BF.debug("skip ROIs"); 
     541 
     542      // -- Step 7: finish up -- 
     543 
     544      BF.debug("finish up"); 
    822545 
    823546      try { 
     
    832555    } 
    833556    catch (FormatException exc) { 
    834       WindowTools.reportException(exc, quiet, 
     557      WindowTools.reportException(exc, options.isQuiet(), 
    835558        "Sorry, there was a problem reading the data."); 
    836559    } 
    837560    catch (IOException exc) { 
    838       WindowTools.reportException(exc, quiet, 
     561      WindowTools.reportException(exc, options.isQuiet(), 
    839562        "Sorry, there was an I/O problem reading the data."); 
    840563    } 
     
    877600    boolean hyper = options.isViewHyperstack() || options.isViewBrowser(); 
    878601    imp.setOpenAsHyperStack(hyper); 
    879     boolean mergeChannels = options.isMergeChannels(); 
    880     boolean concatenate = options.isConcatenate(); 
    881602    int nSlices = imp.getNSlices(); 
    882603    int nFrames = imp.getNFrames(); 
     
    899620    int t = r.getSizeT(); 
    900621 
    901     if (!concatenate && mergeChannels) imp.show(); 
     622    if (!options.isConcatenate() && options.isMergeChannels()) imp.show(); 
    902623 
    903624    if (imp.isVisible() && !options.isVirtual()) { 
     
    960681      // NB: ImageJ 1.39+ is required for hyperstacks 
    961682 
    962       if (!concatenate) { 
     683      if (!options.isConcatenate()) { 
    963684        if (options.isViewBrowser()) { 
    964685          DataBrowser dataBrowser = new DataBrowser(imp, null, 
     
    968689        else if (!imp.isVisible()) imp.show(); 
    969690 
    970         boolean colorize = options.isColorize(); 
    971691        boolean customColorize = options.isCustomColorize(); 
    972692        boolean browser = options.isViewBrowser(); 
    973693        boolean virtual = options.isVirtual(); 
    974694 
    975         if (colorize || customColorize) { 
     695        if (options.isColorize() || customColorize) { 
    976696          IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
    977697            " merge=false colorize=true ndx=" + (customColorize ? "-1" : "0") + 
     
    1052772  private String constructSliceLabel(int ndx, IFormatReader r, 
    1053773    MetadataRetrieve retrieve, int series, 
    1054     int[] zCount, int[] cCount, int[] tCount) 
     774    int zCount, int cCount, int tCount) 
    1055775  { 
    1056776    r.setSeries(series); 
     
    1060780    StringBuffer sb = new StringBuffer(); 
    1061781    boolean first = true; 
    1062     if (cCount[series] > 1) { 
     782    if (cCount > 1) { 
    1063783      if (first) first = false; 
    1064784      else sb.append("; "); 
     
    1074794      } 
    1075795    } 
    1076     if (zCount[series] > 1) { 
     796    if (zCount > 1) { 
    1077797      if (first) first = false; 
    1078798      else sb.append("; "); 
     
    1082802      sb.append(r.getSizeZ()); 
    1083803    } 
    1084     if (tCount[series] > 1) { 
     804    if (tCount > 1) { 
    1085805      if (first) first = false; 
    1086806      else sb.append("; "); 
     
    1124844  } 
    1125845 
    1126   /** Prints a debugging message to the ImageJ log if debug mode is set. */ 
    1127   private void debug(String msg) { 
    1128     if (IJ.debugMode) IJ.log("Bio-Formats Importer: " + msg); 
    1129   } 
    1130  
    1131846  // -- Main method -- 
    1132847 
     
    1142857  } 
    1143858 
    1144   // -- Helper classes -- 
    1145  
    1146   /** Used to echo status messages to the ImageJ status bar. */ 
    1147   private static class StatusEchoer implements StatusListener { 
    1148     public void statusUpdated(StatusEvent e) { 
    1149       IJ.showStatus(e.getStatusMessage()); 
    1150     } 
    1151   } 
    1152  
    1153   private class VirtualReader extends DimensionSwapper { 
    1154     private int refCount; 
    1155  
    1156     // -- Constructor -- 
    1157  
    1158     public VirtualReader(IFormatReader r) { 
    1159       super(r); 
    1160       refCount = 0; 
    1161     } 
    1162  
    1163     // -- VirtualReader API methods -- 
    1164  
    1165     public void setRefCount(int refCount) { 
    1166       this.refCount = refCount; 
    1167     } 
    1168  
    1169     // -- IFormatReader API methods -- 
    1170  
    1171     public void close() throws IOException { 
    1172       if (refCount > 0) refCount--; 
    1173       if (refCount == 0) super.close(); 
    1174     } 
    1175  
    1176   } 
    1177  
    1178859} 
  • trunk/components/loci-plugins/src/loci/plugins/importer/ImporterOptions.java

    r5729 r5857  
    2626package loci.plugins.importer; 
    2727 
     28import ij.IJ; 
     29 
     30import java.awt.Rectangle; 
    2831import java.io.IOException; 
     32import java.util.Arrays; 
     33import java.util.StringTokenizer; 
    2934 
    3035import loci.common.Location; 
     36import loci.common.ReflectException; 
     37import loci.common.ReflectedUniverse; 
     38import loci.formats.ChannelSeparator; 
     39import loci.formats.FilePattern; 
     40import loci.formats.FileStitcher; 
     41import loci.formats.FormatException; 
     42import loci.formats.FormatTools; 
     43import loci.formats.IFormatReader; 
     44import loci.formats.ImageReader; 
     45import loci.formats.MetadataTools; 
     46import loci.formats.meta.IMetadata; 
     47import loci.plugins.prefs.OptionsDialog; 
    3148import loci.plugins.prefs.OptionsList; 
    3249import loci.plugins.prefs.StringOption; 
     50import loci.plugins.util.BF; 
     51import loci.plugins.util.IJStatusEchoer; 
     52import loci.plugins.util.ImagePlusReader; 
    3353import loci.plugins.util.LibraryChecker; 
     54import loci.plugins.util.LociPrefs; 
     55import loci.plugins.util.VirtualReader; 
     56import loci.plugins.util.WindowTools; 
    3457 
    3558/** 
     
    108131  public static final String ORDER_XYTZC   = "XYTZC"; 
    109132 
     133  // -- Fields - derived values -- 
     134 
     135  protected ImagePlusReader r; 
     136  protected String idName; 
     137  protected Location idLoc; 
     138  protected IMetadata meta; 
     139  protected String currentFile; 
     140 
     141  // series options 
     142  protected boolean[] series; 
     143 
     144  // range options 
     145  protected int[] cBegin, cEnd, cStep, cCount; 
     146  protected int[] zBegin, zEnd, zStep, zCount; 
     147  protected int[] tBegin, tEnd, tStep, tCount; 
     148 
     149  // crop options 
     150  protected Rectangle[] cropRegion; 
     151 
     152  // -- Fields - internal -- 
     153 
     154  private IFormatReader baseReader; 
     155  private VirtualReader virtualReader; 
     156  private String[] seriesLabels; 
     157 
    110158  // -- Constructor -- 
    111159 
     
    125173  } 
    126174 
    127   // -- ImporterOptions methods -- 
     175  // -- ImporterOptions methods - option harvesting -- 
    128176 
    129177  /** Parses the plugin argument for parameter values. */ 
     
    155203    } 
    156204  } 
     205 
     206  /** 
     207   * Displays dialog boxes prompting for additional configuration details. 
     208   * 
     209   * Which dialogs are shown depends on a variety of factors, including the 
     210   * current configuration (i.e., which options are enabled), whether quiet or 
     211   * windowless mode is set, and whether the method is being called from within 
     212   * a macro. 
     213   * 
     214   * After calling this method, derived field values will also be populated. 
     215   * 
     216   * @return true if harvesting went OK, or false if something went wrong 
     217   *   (e.g., the user canceled a dialog box) 
     218   * 
     219   * @see ij.gui.GenericDialog 
     220   */ 
     221  public boolean showDialogs() throws FormatException, IOException { 
     222    baseReader = null; 
     223    idName = null; 
     224    idLoc = null; 
     225 
     226    if (!promptLocation()) return false; 
     227    if (!promptId()) return false; 
     228 
     229    computeNameAndLocation(); 
     230    createBaseReader(); 
     231 
     232    if (!promptOptions()) return false; 
     233 
     234    // save options as new defaults 
     235    if (!isQuiet()) setFirstTime(false); 
     236    saveOptions(); 
     237 
     238    IJ.showStatus("Analyzing " + getIdName()); 
     239 
     240    baseReader.setMetadataFiltered(true); 
     241    baseReader.setOriginalMetadataPopulated(true); 
     242    baseReader.setGroupFiles(!isUngroupFiles()); 
     243    baseReader.setId(getId()); 
     244 
     245    currentFile = baseReader.getCurrentFile(); 
     246 
     247    if (!promptFilePattern()) return false; 
     248 
     249    initializeReader(); 
     250 
     251    if (!promptSeries()) return false; 
     252    if (!promptSwap()) return false; 
     253    if (!promptRange()) return false; 
     254    if (!promptCrop()) return false; 
     255 
     256    computeRangeCounts(); 
     257 
     258    return true; 
     259  } 
     260 
     261  // -- ImporterOptions methods - base options accessors and mutators -- 
    157262 
    158263  // autoscale 
     
    327432  // windowless 
    328433  public String getWindowlessInfo() { return getInfo(KEY_WINDOWLESS); } 
    329   public boolean isWindowless() { return isSet(KEY_WINDOWLESS); } 
     434  public boolean isWindowless() { 
     435    if (baseReader != null && LociPrefs.isWindowless(baseReader)) return true; 
     436    return isSet(KEY_WINDOWLESS); 
     437  } 
    330438  public void setWindowless(boolean b) { setValue(KEY_WINDOWLESS, b); } 
    331439 
     440  // -- ImporterOptions methods - derived values accessors -- 
     441 
     442  public String getIdName() { return idName; } 
     443  public Location getIdLocation() { return idLoc; } 
     444  public ImagePlusReader getReader() { return r; } 
     445  public IMetadata getMetadata() { return meta; } 
     446  public String getCurrentFile() { return currentFile; } 
     447 
     448  // series options 
     449  public int getCBegin(int s) { return cBegin[s]; } 
     450  public int getCEnd(int s) { return cEnd[s]; } 
     451  public int getCStep(int s) { return cStep[s]; } 
     452  public int getCCount(int s) { return cCount[s]; } 
     453  public int getZBegin(int s) { return zBegin[s]; } 
     454  public int getZEnd(int s) { return zEnd[s]; } 
     455  public int getZStep(int s) { return zStep[s]; } 
     456  public int getZCount(int s) { return zCount[s]; } 
     457  public int getTBegin(int s) { return tBegin[s]; } 
     458  public int getTEnd(int s) { return tEnd[s]; } 
     459  public int getTStep(int s) { return tStep[s]; } 
     460  public int getTCount(int s) { return tCount[s]; } 
     461  public boolean isSeriesOn(int s) { return series[s]; } 
     462 
     463  // crop options 
     464  public Rectangle getCropRegion(int s) { return cropRegion[s]; } 
     465 
     466  // -- Helper methods -- 
     467 
     468  /** Initializes the idName and idLoc derived values. */ 
     469  private void computeNameAndLocation() { 
     470    String id = getId(); 
     471 
     472    idLoc = null; 
     473    idName = id; 
     474    if (isLocal()) { 
     475      idLoc = new Location(id); 
     476      idName = idLoc.getName(); 
     477    } 
     478    else if (isOME() || isOMERO()) { 
     479      // NB: strip out username and password when opening from OME/OMERO 
     480      StringTokenizer st = new StringTokenizer(id, "?&"); 
     481      StringBuffer idBuf = new StringBuffer(); 
     482      int tokenCount = 0; 
     483      while (st.hasMoreTokens()) { 
     484        String token = st.nextToken(); 
     485        if (token.startsWith("username=") || token.startsWith("password=")) { 
     486          continue; 
     487        } 
     488        if (tokenCount == 1) idBuf.append("?"); 
     489        else if (tokenCount > 1) idBuf.append("&"); 
     490        idBuf.append(token); 
     491        tokenCount++; 
     492      } 
     493      idName = idBuf.toString(); 
     494    } 
     495  } 
     496 
     497  /** 
     498   * Initializes an {@link loci.formats.IFormatReader} 
     499   * according to the current configuration. 
     500   */ 
     501  private void createBaseReader() { 
     502    if (isLocal() || isHTTP()) { 
     503      if (!isQuiet()) IJ.showStatus("Identifying " + idName); 
     504      ImageReader reader = ImagePlusReader.makeImageReader(); 
     505      try { baseReader = reader.getReader(getId()); } 
     506      catch (FormatException exc) { 
     507        WindowTools.reportException(exc, isQuiet(), 
     508          "Sorry, there was an error reading the file."); 
     509        return; 
     510      } 
     511      catch (IOException exc) { 
     512        WindowTools.reportException(exc, isQuiet(), 
     513          "Sorry, there was a I/O problem reading the file."); 
     514        return; 
     515      } 
     516    } 
     517    else if (isOMERO()) { 
     518      // NB: avoid dependencies on optional loci.ome.io package 
     519      try { 
     520        ReflectedUniverse ru = new ReflectedUniverse(); 
     521        ru.exec("import loci.ome.io.OMEROReader"); 
     522        baseReader = (IFormatReader) ru.exec("new OMEROReader()"); 
     523      } 
     524      catch (ReflectException exc) { 
     525        WindowTools.reportException(exc, isQuiet(), 
     526          "Sorry, there was a problem constructing the OMERO I/O engine"); 
     527        return; 
     528      } 
     529    } 
     530    else if (isOME()) { 
     531      // NB: avoid dependencies on optional loci.ome.io package 
     532      try { 
     533        ReflectedUniverse ru = new ReflectedUniverse(); 
     534        ru.exec("import loci.ome.io.OMEReader"); 
     535        baseReader = (IFormatReader) ru.exec("new OMEReader()"); 
     536      } 
     537      catch (ReflectException exc) { 
     538        WindowTools.reportException(exc, isQuiet(), 
     539          "Sorry, there was a problem constructing the OME I/O engine"); 
     540        return; 
     541      } 
     542    } 
     543    else { 
     544      WindowTools.reportException(null, isQuiet(), 
     545        "Sorry, there has been an internal error: unknown data source"); 
     546    } 
     547    meta = MetadataTools.createOMEXMLMetadata(); 
     548    baseReader.setMetadataStore(meta); 
     549 
     550    if (!isQuiet()) IJ.showStatus(""); 
     551    baseReader.addStatusListener(new IJStatusEchoer()); 
     552  } 
     553 
     554  private boolean promptLocation() { 
     555    LocationDialog dialog = new LocationDialog(this); 
     556    return dialog.showDialog() == OptionsDialog.STATUS_OK; 
     557  } 
     558 
     559  private boolean promptId() { 
     560    IdDialog dialog = new IdDialog(this); 
     561    return dialog.showDialog() == OptionsDialog.STATUS_OK; 
     562  } 
     563 
     564  private boolean promptOptions() { 
     565    if (isWindowless()) return true; 
     566 
     567    ImporterDialog dialog = new ImporterDialog(this); 
     568    return dialog.showDialog() == OptionsDialog.STATUS_OK; 
     569  } 
     570 
     571  /** Prompts for the file pattern, if necessary. May override id value. */ 
     572  private boolean promptFilePattern() throws FormatException, IOException { 
     573    if (!isGroupFiles()) { 
     574      BF.debug("no need to prompt for file pattern"); 
     575      return true; 
     576    } 
     577    BF.debug("prompt for the file pattern"); 
     578 
     579    FilePatternDialog dialog = new FilePatternDialog(this); 
     580    if (dialog.showDialog() != OptionsDialog.STATUS_OK) return false; 
     581 
     582    String id = getId(); 
     583    if (id == null) id = currentFile; 
     584    FilePattern fp = new FilePattern(id); 
     585    if (!fp.isValid()) id = currentFile; 
     586    setId(id); // CTR CHECK -- probably the wrong way to do this 
     587    return true; 
     588  } 
     589 
     590  /** Initializes the ImagePlusReader derived value. */ 
     591  private void initializeReader() throws FormatException, IOException { 
     592    if (isGroupFiles()) baseReader = new FileStitcher(baseReader, true); 
     593    if (isVirtual() || !isMergeChannels() || 
     594      FormatTools.getBytesPerPixel(baseReader.getPixelType()) != 1) 
     595    { 
     596      baseReader = new ChannelSeparator(baseReader); 
     597    } 
     598    virtualReader = new VirtualReader(baseReader); 
     599    r = new ImagePlusReader(virtualReader); 
     600    r.setId(getId()); 
     601  } 
     602 
     603  /** Prompts for which series to import, if necessary. */ 
     604  private boolean promptSeries() throws FormatException, IOException { 
     605    // initialize series-related derived values 
     606    series = new boolean[r.getSeriesCount()]; 
     607    series[0] = true; 
     608 
     609    // build descriptive label for each series 
     610    int seriesCount = r.getSeriesCount(); 
     611    seriesLabels = new String[seriesCount]; 
     612    for (int i=0; i<seriesCount; i++) { 
     613      r.setSeries(i); 
     614      StringBuffer sb = new StringBuffer(); 
     615      sb.append("Series_"); 
     616      sb.append((i + 1)); 
     617      sb.append(": "); 
     618      String name = getMetadata().getImageName(i); 
     619      if (name != null && name.length() > 0) { 
     620        sb.append(name); 
     621        sb.append(": "); 
     622      } 
     623      sb.append(r.getSizeX()); 
     624      sb.append(" x "); 
     625      sb.append(r.getSizeY()); 
     626      sb.append("; "); 
     627      sb.append(r.getImageCount()); 
     628      sb.append(" plane"); 
     629      if (r.getImageCount() > 1) { 
     630        sb.append("s"); 
     631        if (r.isOrderCertain()) { 
     632          sb.append(" ("); 
     633          boolean first = true; 
     634          if (r.getEffectiveSizeC() > 1) { 
     635            sb.append(r.getEffectiveSizeC()); 
     636            sb.append("C"); 
     637            first = false; 
     638          } 
     639          if (r.getSizeZ() > 1) { 
     640            if (!first) sb.append(" x "); 
     641            sb.append(r.getSizeZ()); 
     642            sb.append("Z"); 
     643            first = false; 
     644          } 
     645          if (r.getSizeT() > 1) { 
     646            if (!first) sb.append(" x "); 
     647            sb.append(r.getSizeT()); 
     648            sb.append("T"); 
     649            first = false; 
     650          } 
     651          sb.append(")"); 
     652        } 
     653      } 
     654      seriesLabels[i] = sb.toString(); 
     655      //seriesLabels[i] = seriesLabels[i].replaceAll(" ", "_"); 
     656    } 
     657 
     658    if (seriesCount > 1 && !openAllSeries() && !isViewNone()) { 
     659      BF.debug("prompt for which series to import"); 
     660      SeriesDialog dialog = new SeriesDialog(this, r, seriesLabels, series); 
     661      if (dialog.showDialog() != OptionsDialog.STATUS_OK) return false; 
     662    } 
     663    else BF.debug("no need to prompt for series"); 
     664 
     665    if (openAllSeries() || isViewNone()) { 
     666      Arrays.fill(series, true); 
     667    } 
     668    return true; 
     669  } 
     670 
     671  /** Prompts for dimension swapping parameters, if necessary. */ 
     672  private boolean promptSwap() { 
     673    if (!isSwapDimensions()) { 
     674      BF.debug("no need to prompt for dimension swapping"); 
     675      return true; 
     676    } 
     677    BF.debug("prompt for dimension swapping parameters"); 
     678 
     679    SwapDialog dialog = new SwapDialog(this, virtualReader, series); 
     680    return dialog.showDialog() == OptionsDialog.STATUS_OK; 
     681  } 
     682 
     683  /** Prompts for the range of planes to import, if necessary. */ 
     684  private boolean promptRange() { 
     685    // initialize range-related derived values 
     686    int seriesCount = r.getSeriesCount(); 
     687    cBegin = new int[seriesCount]; 
     688    cEnd = new int[seriesCount]; 
     689    cStep = new int[seriesCount]; 
     690    zBegin = new int[seriesCount]; 
     691    zEnd = new int[seriesCount]; 
     692    zStep = new int[seriesCount]; 
     693    tBegin = new int[seriesCount]; 
     694    tEnd = new int[seriesCount]; 
     695    tStep = new int[seriesCount]; 
     696 
     697    for (int i=0; i<seriesCount; i++) { 
     698      r.setSeries(i); 
     699      cBegin[i] = zBegin[i] = tBegin[i] = 0; 
     700      cEnd[i] = r.getEffectiveSizeC() - 1; 
     701      zEnd[i] = r.getSizeZ() - 1; 
     702      tEnd[i] = r.getSizeT() - 1; 
     703      cStep[i] = zStep[i] = tStep[i] = 1; 
     704    } 
     705 
     706 
     707    if (!isSpecifyRanges()) { 
     708      BF.debug("open all planes"); 
     709      return true; 
     710    } 
     711    boolean needRange = false; 
     712    for (int i=0; i<seriesCount; i++) { 
     713      if (series[i] && r.getImageCount() > 1) needRange = true; 
     714    } 
     715    if (!needRange) { 
     716      BF.debug("no need to prompt for planar ranges"); 
     717      return true; 
     718    } 
     719    BF.debug("prompt for planar ranges"); 
     720    IJ.showStatus(""); 
     721 
     722    RangeDialog dialog = new RangeDialog(this, 
     723      r, series, seriesLabels, cBegin, cEnd, cStep, 
     724      zBegin, zEnd, zStep, tBegin, tEnd, tStep); 
     725    return dialog.showDialog() == OptionsDialog.STATUS_OK; 
     726  } 
     727 
     728  /** Prompts for cropping details, if necessary. */ 
     729  private boolean promptCrop() { 
     730    // initialize crop-related derived values 
     731    cropRegion = new Rectangle[r.getSeriesCount()]; 
     732    for (int i=0; i<cropRegion.length; i++) { 
     733      if (series[i] && doCrop()) cropRegion[i] = new Rectangle(); 
     734    } 
     735 
     736    if (!doCrop()) { 
     737      BF.debug("no need to prompt for cropping region"); 
     738      return true; 
     739    } 
     740    BF.debug("prompt for cropping region"); 
     741 
     742    CropDialog dialog = new CropDialog(this, 
     743      r, seriesLabels, series, cropRegion); 
     744    return dialog.showDialog() == OptionsDialog.STATUS_OK; 
     745  } 
     746 
     747  /** Initializes the cCount, zCount and tCount derived values. */ 
     748  private void computeRangeCounts() { 
     749    int seriesCount = r.getSeriesCount(); 
     750    cCount = new int[seriesCount]; 
     751    zCount = new int[seriesCount]; 
     752    tCount = new int[seriesCount]; 
     753    for (int i=0; i<seriesCount; i++) { 
     754      if (!series[i]) cCount[i] = zCount[i] = tCount[i] = 0; 
     755      else { 
     756        if (isMergeChannels()) cCount[i] = 1; 
     757        else cCount[i] = (cEnd[i] - cBegin[i] + cStep[i]) / cStep[i]; 
     758        zCount[i] = (zEnd[i] - zBegin[i] + zStep[i]) / zStep[i]; 
     759        tCount[i] = (tEnd[i] - tBegin[i] + tStep[i]) / tStep[i]; 
     760      } 
     761    } 
     762  } 
     763 
    332764} 
  • trunk/components/loci-plugins/src/loci/plugins/util/LociPrefs.java

    r5111 r5857  
    3636 * <a href="https://skyking.microscopy.wisc.edu/svn/java/trunk/components/loci-plugins/src/loci/plugins/util/LociPrefs.java">SVN</a></dd></dl> 
    3737 */ 
    38 public class LociPrefs { 
     38public final class LociPrefs { 
    3939 
    4040  // -- Constants -- 
  • trunk/components/loci-plugins/src/loci/plugins/util/WindowTools.java

    r5256 r5857  
    171171 
    172172  /** Reports the given exception with stack trace in an ImageJ error dialog. */ 
     173  public static void reportException(Throwable t, boolean quiet) { 
     174    reportException(t, quiet, null); 
     175  } 
     176 
     177  /** Reports the given exception with stack trace in an ImageJ error dialog. */ 
    173178  public static void reportException(Throwable t, boolean quiet, String msg) { 
    174179    IJ.showStatus(""); 
Note: See TracChangeset for help on using the changeset viewer.