Changeset 2784


Ignore:
Timestamp:
05/15/07 15:19:13 (13 years ago)
Author:
curtis
Message:

More cleanup and modularization of Bio-Formats Importer plugin.

Location:
trunk/loci/plugins
Files:
2 edited

Legend:

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

    r2779 r2784  
    3232import ij.process.*; 
    3333import ij.text.TextWindow; 
    34 import java.awt.*; 
    3534import java.awt.image.*; 
    3635import java.io.*; 
    3736import java.util.*; 
    38 import javax.swing.Box; 
    3937import loci.formats.*; 
    4038import loci.formats.ome.OMEReader; 
     
    135133    boolean viewView5D = options.isViewView5D(); 
    136134 
    137     // -- Step 4: read file -- 
     135    // -- Step 4: analyze and read from data source -- 
    138136 
    139137    IJ.showStatus("Analyzing " + id); 
    140138 
    141139    try { 
    142       // -- Step 4a: do some preparatory work -- 
    143  
    144       if (viewImage5D) mergeChannels = false; 
    145  
    146140      FileStitcher fs = null; 
    147141      r.setMetadataFiltered(true); 
     
    151145      String currentFile = r.getCurrentFile(); 
    152146 
     147      // -- Step 4a: prompt for the file pattern, if necessary -- 
     148 
    153149      if (groupFiles) { 
    154         fs = new FileStitcher(r, true); 
    155         // prompt user to confirm file pattern (or grab from macro options) 
    156         id = FilePattern.findPattern(idLoc); 
    157         GenericDialog gd = new GenericDialog("Bio-Formats File Stitching"); 
    158         int len = id.length() + 1; 
    159         if (len > 80) len = 80; 
    160         gd.addStringField("Pattern: ", id, len); 
    161         gd.showDialog(); 
    162         if (gd.wasCanceled()) { 
    163           plugin.canceled = true; 
    164           return; 
    165         } 
    166         id = gd.getNextString(); 
    167         r = fs; 
    168       } 
     150        status = options.promptFilePattern(); 
     151        if (!statusOk(status)) return; 
     152        id = options.getId(); 
     153      } 
     154 
     155      // CTR FIXME -- why is the file stitcher separate from the reader? 
     156      // (answer: because of the clunkiness of the 4D Data Browser integration) 
     157      if (groupFiles) r = fs = new FileStitcher(r, true); 
    169158      r = new ChannelSeparator(r); 
    170159      r.setId(id); 
    171160 
    172       // store OME metadata into OME-XML structure, if available 
    173  
     161      // -- Step 4b: prompt for which series to import, if necessary -- 
     162 
     163      // populate series-related variables 
    174164      int seriesCount = r.getSeriesCount(); 
    175       boolean[] series = new boolean[seriesCount]; 
    176       series[0] = true; 
    177  
    178       // build descriptive string and range for each series 
    179       String[] seriesStrings = new String[seriesCount]; 
    180165      int[] num = new int[seriesCount]; 
    181166      int[] sizeC = new int[seriesCount]; 
     
    192177      int[] tEnd = new int[seriesCount]; 
    193178      int[] tStep = new int[seriesCount]; 
     179      boolean[] series = new boolean[seriesCount]; 
    194180      for (int i=0; i<seriesCount; i++) { 
    195181        r.setSeries(i); 
     
    207193        else cEnd[i] = num[i] - 1; 
    208194        cStep[i] = zStep[i] = tStep[i] = 1; 
     195      } 
     196      series[0] = true; 
     197 
     198      // build descriptive label for each series 
     199      String[] seriesLabels = new String[seriesCount]; 
     200      for (int i=0; i<seriesCount; i++) { 
     201        r.setSeries(i); 
    209202        StringBuffer sb = new StringBuffer(); 
    210203        String name = store.getImageName(new Integer(i)); 
     
    244237          } 
    245238        } 
    246         seriesStrings[i] = sb.toString(); 
    247       } 
    248  
    249       // -- Step 3a: prompt for the series to open, if necessary -- 
     239        seriesLabels[i] = sb.toString(); 
     240      } 
    250241 
    251242      if (seriesCount > 1) { 
    252         GenericDialog gd = new GenericDialog("Bio-Formats Series Options"); 
    253  
    254         GridBagLayout gdl = (GridBagLayout) gd.getLayout(); 
    255         GridBagConstraints gbc = new GridBagConstraints(); 
    256         gbc.gridx = 2; 
    257         gbc.gridwidth = GridBagConstraints.REMAINDER; 
    258  
    259         Panel[] p = new Panel[seriesCount]; 
    260         for (int i=0; i<seriesCount; i++) { 
    261           gd.addCheckbox(seriesStrings[i], series[i]); 
    262           r.setSeries(i); 
    263           int sx = r.getThumbSizeX() + 10; 
    264           int sy = r.getThumbSizeY(); 
    265           p[i] = new Panel(); 
    266           p[i].add(Box.createRigidArea(new Dimension(sx, sy))); 
    267           gbc.gridy = i; 
    268           gdl.setConstraints(p[i], gbc); 
    269           gd.add(p[i]); 
    270         } 
    271         Util.addScrollBars(gd); 
    272         ThumbLoader loader = new ThumbLoader(r, p, gd); 
    273         gd.showDialog(); 
    274         loader.stop(); 
    275         if (gd.wasCanceled()) { 
    276           plugin.canceled = true; 
    277           return; 
    278         } 
    279  
    280         int[] widths = new int[seriesCount]; 
    281         int[] heights = new int[seriesCount]; 
    282         int[] types = new int[seriesCount]; 
    283         int[] channels = new int[seriesCount]; 
    284  
    285         for (int i=0; i<seriesCount; i++) { 
    286           series[i] = gd.getNextBoolean(); 
    287           r.setSeries(i); 
    288           widths[i] = r.getSizeX(); 
    289           heights[i] = r.getSizeY(); 
    290           types[i] = r.getPixelType(); 
    291           channels[i] = r.getSizeC(); 
    292         } 
    293  
    294         if (concatenate) { 
    295           for (int i=0; i<seriesCount; i++) { 
    296             if (!series[i]) { 
    297               for (int j=0; j<seriesCount; j++) { 
    298                 if (j != i && series[j] && widths[j] == widths[i] && 
    299                   heights[j] == heights[i] && types[j] == types[i] && 
    300                   channels[j] == channels[i]) 
    301                 { 
    302                   series[i] = true; 
    303                   j = seriesCount; 
    304                 } 
    305               } 
    306             } 
    307           } 
    308         } 
    309       } 
    310  
    311       // -- Step 4b: prompt for the range of planes to import, if necessary -- 
     243        status = options.promptSeries(r, seriesLabels, series); 
     244        if (!statusOk(status)) return; 
     245      } 
     246 
     247      // -- Step 4c: prompt for the range of planes to import, if necessary -- 
    312248 
    313249      if (specifyRanges) { 
     
    318254        if (needRange) { 
    319255          IJ.showStatus(""); 
    320           GenericDialog gd = new GenericDialog("Bio-Formats Range Options"); 
    321           for (int i=0; i<seriesCount; i++) { 
    322             if (!series[i]) continue; 
    323             gd.addMessage(seriesStrings[i].replaceAll("_", " ")); 
    324             String s = seriesCount > 1 ? "_" + (i + 1) : ""; 
    325             if (certain[i]) { 
    326               if (sizeC[i] > 1) { 
    327                 gd.addNumericField("C_Begin" + s, cBegin[i] + 1, 0); 
    328                 gd.addNumericField("C_End" + s, cEnd[i] + 1, 0); 
    329                 gd.addNumericField("C_Step" + s, cStep[i], 0); 
    330               } 
    331               if (sizeZ[i] > 1) { 
    332                 gd.addNumericField("Z_Begin" + s, zBegin[i] + 1, 0); 
    333                 gd.addNumericField("Z_End" + s, zEnd[i] + 1, 0); 
    334                 gd.addNumericField("Z_Step" + s, zStep[i], 0); 
    335               } 
    336               if (sizeT[i] > 1) { 
    337                 gd.addNumericField("T_Begin" + s, tBegin[i] + 1, 0); 
    338                 gd.addNumericField("T_End" + s, tEnd[i] + 1, 0); 
    339                 gd.addNumericField("T_Step" + s, tStep[i], 0); 
    340               } 
    341             } 
    342             else { 
    343               gd.addNumericField("Begin" + s, cBegin[i] + 1, 0); 
    344               gd.addNumericField("End" + s, cEnd[i] + 1, 0); 
    345               gd.addNumericField("Step" + s, cStep[i], 0); 
    346             } 
    347           } 
    348           Util.addScrollBars(gd); 
    349           gd.showDialog(); 
    350           if (gd.wasCanceled()) { 
    351             plugin.canceled = true; 
    352             return; 
    353           } 
    354           for (int i=0; i<seriesCount; i++) { 
    355             if (!series[i]) continue; 
    356             if (certain[i]) { 
    357               if (sizeC[i] > 1) { 
    358                 cBegin[i] = (int) gd.getNextNumber() - 1; 
    359                 cEnd[i] = (int) gd.getNextNumber() - 1; 
    360                 cStep[i] = (int) gd.getNextNumber(); 
    361               } 
    362               if (sizeZ[i] > 1) { 
    363                 zBegin[i] = (int) gd.getNextNumber() - 1; 
    364                 zEnd[i] = (int) gd.getNextNumber() - 1; 
    365                 zStep[i] = (int) gd.getNextNumber(); 
    366               } 
    367               if (sizeT[i] > 1) { 
    368                 tBegin[i] = (int) gd.getNextNumber() - 1; 
    369                 tEnd[i] = (int) gd.getNextNumber() - 1; 
    370                 tStep[i] = (int) gd.getNextNumber(); 
    371               } 
    372             } 
    373             else { 
    374               cBegin[i] = (int) gd.getNextNumber() - 1; 
    375               cEnd[i] = (int) gd.getNextNumber() - 1; 
    376               cStep[i] = (int) gd.getNextNumber(); 
    377             } 
    378             int maxC = certain[i] ? sizeC[i] : num[i]; 
    379             if (cBegin[i] < 0) cBegin[i] = 0; 
    380             if (cBegin[i] >= maxC) cBegin[i] = maxC - 1; 
    381             if (cEnd[i] < cBegin[i]) cEnd[i] = cBegin[i]; 
    382             if (cEnd[i] >= maxC) cEnd[i] = maxC - 1; 
    383             if (cStep[i] < 1) cStep[i] = 1; 
    384             if (zBegin[i] < 0) zBegin[i] = 0; 
    385             if (zBegin[i] >= sizeZ[i]) zBegin[i] = sizeZ[i] - 1; 
    386             if (zEnd[i] < zBegin[i]) zEnd[i] = zBegin[i]; 
    387             if (zEnd[i] >= sizeZ[i]) zEnd[i] = sizeZ[i] - 1; 
    388             if (zStep[i] < 1) zStep[i] = 1; 
    389             if (tBegin[i] < 0) tBegin[i] = 0; 
    390             if (tBegin[i] >= sizeT[i]) tBegin[i] = sizeT[i] - 1; 
    391             if (tEnd[i] < tBegin[i]) tEnd[i] = tBegin[i]; 
    392             if (tEnd[i] >= sizeT[i]) tEnd[i] = sizeT[i] - 1; 
    393             if (tStep[i] < 1) tStep[i] = 1; 
    394           } 
     256          status = options.promptRange(r, series, seriesLabels, 
     257            cBegin, cEnd, cStep, zBegin, zEnd, zStep, tBegin, tEnd, tStep); 
     258          if (!statusOk(status)) return; 
    395259        } 
    396260      } 
     
    404268      } 
    405269 
    406       // -- Step 4c: display metadata, when appropriate -- 
     270      // -- Step 4d: display metadata, if appropriate -- 
    407271 
    408272      if (showMetadata) { 
     
    411275        // display standard metadata in a table in its own window 
    412276        Hashtable meta = new Hashtable(); 
    413         if (r.getSeriesCount() == 1) meta = r.getMetadata(); 
     277        if (seriesCount == 1) meta = r.getMetadata(); 
    414278        meta.put(idType, currentFile); 
    415279        int digits = digits(seriesCount); 
     
    430294          } 
    431295          else s = ""; 
    432           final String pad = " "; 
     296          final String pad = " "; // puts core values first when alphabetizing 
    433297          meta.put(pad + s + "SizeX", new Integer(r.getSizeX())); 
    434298          meta.put(pad + s + "SizeY", new Integer(r.getSizeY())); 
     
    466330      } 
    467331 
    468       // -- Step 4d: read pixel data -- 
     332      // -- Step 4e: read pixel data -- 
    469333 
    470334      // only read data explicitly if not using 4D Data Browser 
     
    702566  // -- Helper methods -- 
    703567 
     568  /** 
     569   * Displays the given image stack according to 
     570   * the specified parameters and import options. 
     571   */ 
    704572  private void showStack(ImageStack stack, String label, 
    705573    OMEXMLMetadataStore store, int cCount, int zCount, int tCount, 
     
    842710      else if (mergeChannels && r.getSizeC() >= 4) { 
    843711        // ask the user what they would like to do... 
     712        // CTR FIXME -- migrate into ImporterOptions? 
     713        // also test with macros, and merging multiple image stacks 
     714        // (i.e., what happens if this code executes more than once?) 
    844715 
    845716        int planes1 = r.getImageCount() / 2; 
     
    1009880  } 
    1010881 
     882  /** Computes the given value's number of digits. */ 
    1011883  private int digits(int value) { 
    1012884    int digits = 0; 
     
    1018890  } 
    1019891 
     892  /** Verifies that the given status result is OK. */ 
    1020893  private boolean statusOk(int status) { 
    1021894    if (status == ImporterOptions.STATUS_CANCELED) plugin.canceled = true; 
     
    1023896  } 
    1024897 
     898  /** Reports the given exception with stack trace in an ImageJ error dialog. */ 
    1025899  private void reportException(Throwable t, boolean quiet, String msg) { 
    1026900    t.printStackTrace(); 
  • trunk/loci/plugins/ImporterOptions.java

    r2779 r2784  
    2929import ij.gui.GenericDialog; 
    3030import ij.io.OpenDialog; 
    31 import java.awt.Checkbox; 
    32 import java.awt.Choice; 
     31import java.awt.*; 
    3332import java.awt.event.ItemEvent; 
    3433import java.awt.event.ItemListener; 
    3534import java.util.Vector; 
    36 import loci.formats.Location; 
     35import javax.swing.Box; 
     36import loci.formats.*; 
    3737 
    3838/** 
     
    273273      } 
    274274      else { // isOME 
     275        // CTR FIXME -- eliminate this kludge 
    275276        IJ.runPlugIn("loci.plugins.OMEPlugin", ""); 
    276277        return STATUS_FINISHED; 
     
    368369  } 
    369370 
     371  /** 
     372   * Gets file pattern from id, macro options, or user prompt if necessary. 
     373   * @return status of operation 
     374   */ 
     375  public int promptFilePattern() { 
     376    id = FilePattern.findPattern(idLoc); 
     377 
     378    // prompt user to confirm file pattern (or grab from macro options) 
     379    GenericDialog gd = new GenericDialog("Bio-Formats File Stitching"); 
     380    int len = id.length() + 1; 
     381    if (len > 80) len = 80; 
     382    gd.addStringField("Pattern: ", id, len); 
     383    gd.showDialog(); 
     384    if (gd.wasCanceled()) return STATUS_CANCELED; 
     385    id = gd.getNextString(); 
     386    return STATUS_OK; 
     387  } 
     388 
     389  /** 
     390   * Gets which series to open from macro options, or user prompt if necessary. 
     391   * @param r The reader to use for extracting details of each series. 
     392   * @param seriesLabels Label to display to user identifying each series. 
     393   * @param series Boolean array indicating which series to include 
     394   *   (populated by this method). 
     395   * @return status of operation 
     396   */ 
     397  public int promptSeries(IFormatReader r, 
     398    String[] seriesLabels, boolean[] series) 
     399  { 
     400    int seriesCount = r.getSeriesCount(); 
     401 
     402    // prompt user to specify series inclusion (or grab from macro options) 
     403    GenericDialog gd = new GenericDialog("Bio-Formats Series Options"); 
     404 
     405    GridBagLayout gdl = (GridBagLayout) gd.getLayout(); 
     406    GridBagConstraints gbc = new GridBagConstraints(); 
     407    gbc.gridx = 2; 
     408    gbc.gridwidth = GridBagConstraints.REMAINDER; 
     409 
     410    Panel[] p = new Panel[seriesCount]; 
     411    for (int i=0; i<seriesCount; i++) { 
     412      gd.addCheckbox(seriesLabels[i], series[i]); 
     413      r.setSeries(i); 
     414      int sx = r.getThumbSizeX() + 10; // a little extra padding 
     415      int sy = r.getThumbSizeY(); 
     416      p[i] = new Panel(); 
     417      p[i].add(Box.createRigidArea(new Dimension(sx, sy))); 
     418      gbc.gridy = i; 
     419      gdl.setConstraints(p[i], gbc); 
     420      gd.add(p[i]); 
     421    } 
     422    Util.addScrollBars(gd); 
     423    ThumbLoader loader = new ThumbLoader(r, p, gd); 
     424    gd.showDialog(); 
     425    loader.stop(); 
     426    if (gd.wasCanceled()) return STATUS_CANCELED; 
     427 
     428    for (int i=0; i<seriesCount; i++) series[i] = gd.getNextBoolean(); 
     429 
     430    if (concatenate) { 
     431      // toggle on compatible series 
     432      // CTR FIXME -- why are we doing this? 
     433      for (int i=0; i<seriesCount; i++) { 
     434        if (series[i]) continue; 
     435 
     436        r.setSeries(i); 
     437        int sizeX = r.getSizeX(); 
     438        int sizeY = r.getSizeY(); 
     439        int pixelType = r.getPixelType(); 
     440        int sizeC = r.getSizeC(); 
     441 
     442        for (int j=0; j<seriesCount; j++) { 
     443          if (j == i || !series[j]) continue; 
     444          r.setSeries(j); 
     445          if (sizeX == r.getSizeX() && sizeY == r.getSizeY() && 
     446            pixelType == r.getPixelType() && sizeC == r.getSizeC()) 
     447          { 
     448            series[i] = true; 
     449            break; 
     450          } 
     451        } 
     452      } 
     453    } 
     454 
     455    return STATUS_OK; 
     456  } 
     457 
     458  /** 
     459   * Gets the range of image planes to open from macro options, 
     460   * or user prompt if necessary. 
     461   * @param r The reader to use for extracting details of each series. 
     462   * @param series Boolean array indicating the series 
     463   *   for which ranges should be determined. 
     464   * @param seriesLabels Label to display to user identifying each series 
     465   * @param cBegin First C index to include (populated by this method). 
     466   * @param cEnd Last C index to include (populated by this method). 
     467   * @param cStep C dimension step size (populated by this method). 
     468   * @param zBegin First Z index to include (populated by this method). 
     469   * @param zEnd Last Z index to include (populated by this method). 
     470   * @param zStep Z dimension step size (populated by this method). 
     471   * @param tBegin First T index to include (populated by this method). 
     472   * @param tEnd Last T index to include (populated by this method). 
     473   * @param tStep T dimension step size (populated by this method). 
     474   * @return status of operation 
     475   */ 
     476  public int promptRange(IFormatReader r, 
     477    boolean[] series, String[] seriesLabels, 
     478    int[] cBegin, int[] cEnd, int[] cStep, 
     479    int[] zBegin, int[] zEnd, int[] zStep, 
     480    int[] tBegin, int[] tEnd, int[] tStep) 
     481  { 
     482    int seriesCount = r.getSeriesCount(); 
     483 
     484    // prompt user to specify series ranges (or grab from macro options) 
     485    GenericDialog gd = new GenericDialog("Bio-Formats Range Options"); 
     486    for (int i=0; i<seriesCount; i++) { 
     487      if (!series[i]) continue; 
     488      r.setSeries(i); 
     489      gd.addMessage(seriesLabels[i].replaceAll("_", " ")); 
     490      String s = seriesCount > 1 ? "_" + (i + 1) : ""; 
     491      if (r.isOrderCertain()) { 
     492        if (r.getEffectiveSizeC() > 1) { 
     493          gd.addNumericField("C_Begin" + s, cBegin[i] + 1, 0); 
     494          gd.addNumericField("C_End" + s, cEnd[i] + 1, 0); 
     495          gd.addNumericField("C_Step" + s, cStep[i], 0); 
     496        } 
     497        if (r.getSizeZ() > 1) { 
     498          gd.addNumericField("Z_Begin" + s, zBegin[i] + 1, 0); 
     499          gd.addNumericField("Z_End" + s, zEnd[i] + 1, 0); 
     500          gd.addNumericField("Z_Step" + s, zStep[i], 0); 
     501        } 
     502        if (r.getSizeT() > 1) { 
     503          gd.addNumericField("T_Begin" + s, tBegin[i] + 1, 0); 
     504          gd.addNumericField("T_End" + s, tEnd[i] + 1, 0); 
     505          gd.addNumericField("T_Step" + s, tStep[i], 0); 
     506        } 
     507      } 
     508      else { 
     509        gd.addNumericField("Begin" + s, cBegin[i] + 1, 0); 
     510        gd.addNumericField("End" + s, cEnd[i] + 1, 0); 
     511        gd.addNumericField("Step" + s, cStep[i], 0); 
     512      } 
     513    } 
     514    Util.addScrollBars(gd); 
     515    gd.showDialog(); 
     516    if (gd.wasCanceled()) return STATUS_CANCELED; 
     517 
     518    for (int i=0; i<seriesCount; i++) { 
     519      if (!series[i]) continue; 
     520      r.setSeries(i); 
     521      int sizeC = r.getEffectiveSizeC(); 
     522      int sizeZ = r.getSizeZ(); 
     523      int sizeT = r.getSizeT(); 
     524      boolean certain = r.isOrderCertain(); 
     525 
     526      if (certain) { 
     527        if (r.getEffectiveSizeC() > 1) { 
     528          cBegin[i] = (int) gd.getNextNumber() - 1; 
     529          cEnd[i] = (int) gd.getNextNumber() - 1; 
     530          cStep[i] = (int) gd.getNextNumber(); 
     531        } 
     532        if (r.getSizeZ() > 1) { 
     533          zBegin[i] = (int) gd.getNextNumber() - 1; 
     534          zEnd[i] = (int) gd.getNextNumber() - 1; 
     535          zStep[i] = (int) gd.getNextNumber(); 
     536        } 
     537        if (r.getSizeT() > 1) { 
     538          tBegin[i] = (int) gd.getNextNumber() - 1; 
     539          tEnd[i] = (int) gd.getNextNumber() - 1; 
     540          tStep[i] = (int) gd.getNextNumber(); 
     541        } 
     542      } 
     543      else { 
     544        cBegin[i] = (int) gd.getNextNumber() - 1; 
     545        cEnd[i] = (int) gd.getNextNumber() - 1; 
     546        cStep[i] = (int) gd.getNextNumber(); 
     547      } 
     548      int maxC = certain ? sizeC : r.getImageCount(); 
     549      if (cBegin[i] < 0) cBegin[i] = 0; 
     550      if (cBegin[i] >= maxC) cBegin[i] = maxC - 1; 
     551      if (cEnd[i] < cBegin[i]) cEnd[i] = cBegin[i]; 
     552      if (cEnd[i] >= maxC) cEnd[i] = maxC - 1; 
     553      if (cStep[i] < 1) cStep[i] = 1; 
     554      if (zBegin[i] < 0) zBegin[i] = 0; 
     555      if (zBegin[i] >= sizeZ) zBegin[i] = sizeZ - 1; 
     556      if (zEnd[i] < zBegin[i]) zEnd[i] = zBegin[i]; 
     557      if (zEnd[i] >= sizeZ) zEnd[i] = sizeZ - 1; 
     558      if (zStep[i] < 1) zStep[i] = 1; 
     559      if (tBegin[i] < 0) tBegin[i] = 0; 
     560      if (tBegin[i] >= sizeT) tBegin[i] = sizeT - 1; 
     561      if (tEnd[i] < tBegin[i]) tEnd[i] = tBegin[i]; 
     562      if (tEnd[i] >= sizeT) tEnd[i] = sizeT - 1; 
     563      if (tStep[i] < 1) tStep[i] = 1; 
     564    } 
     565 
     566    return STATUS_OK; 
     567  } 
     568 
    370569  // -- ItemListener API methods -- 
    371570 
Note: See TracChangeset for help on using the changeset viewer.