Changeset 2755


Ignore:
Timestamp:
05/06/07 14:16:06 (13 years ago)
Author:
melissa
Message:

Added new methods to IFormatReader to allow more flexible file grouping:

  • void setGroupFiles(boolean)
  • boolean isGroupFiles()
  • boolean mustGroupFiles(String)
Location:
trunk/loci/formats
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/FileStitcher.java

    r2725 r2755  
    471471    FormatTools.assertId(currentId, true, 2); 
    472472    return reader.getSeries(); 
     473  } 
     474 
     475  /* @see IFormatReader#setGroupFiles(boolean) */ 
     476  public void setGroupFiles(boolean group) { 
     477    for (int i=0; i<readers.length; i++) readers[i].setGroupFiles(group); 
     478  } 
     479 
     480  /* @see IFormatReader#isGroupFiles() */ 
     481  public boolean isGroupFiles() { 
     482    return readers[0].isGroupFiles(); 
     483  } 
     484 
     485  /* @see IFormatReader#mustGroupFiles(String) */ 
     486  public boolean mustGroupFiles(String id) throws FormatException, IOException { 
     487    return readers[0].mustGroupFiles(id); 
    473488  } 
    474489 
  • trunk/loci/formats/FormatReader.java

    r2701 r2755  
    6262  /** Whether or not to collect metadata. */ 
    6363  protected boolean collectMetadata = true; 
     64 
     65  /** Whether or not to group multi-file formats. */ 
     66  protected boolean group = true; 
    6467 
    6568  /** 
     
    365368    return series; 
    366369  } 
     370   
     371  /* @see IFormatReader#setGroupFiles(boolean) */ 
     372  public void setGroupFiles(boolean group) { 
     373    FormatTools.assertId(currentId, false, 1); 
     374    this.group = group; 
     375  } 
     376 
     377  /* @see IFormatReader#isGroupFiles() */ 
     378  public boolean isGroupFiles() { 
     379    return group; 
     380  } 
     381 
     382  /* @see IFormatReader#mustGroupFiles(String) */ 
     383  public boolean mustGroupFiles(String id) throws FormatException, IOException { 
     384    return false;  
     385  } 
    367386 
    368387  /* @see IFormatReader#setNormalized(boolean) */ 
  • trunk/loci/formats/IFormatReader.java

    r2687 r2755  
    194194  boolean isMetadataCollected(); 
    195195 
     196  /** Specifies whether or not to force grouping in multi-file formats. */ 
     197  void setGroupFiles(boolean group); 
     198 
     199  /** Returns true if we should group files in multi-file formats.*/ 
     200  boolean isGroupFiles(); 
     201 
     202  /**  
     203   * Returns true if it we have to group the files  
     204   * in order to read the dataset.  
     205   */ 
     206  boolean mustGroupFiles(String id) throws FormatException, IOException; 
     207 
    196208  /** Returns an array of filenames needed to open this dataset. */ 
    197209  String[] getUsedFiles(); 
  • trunk/loci/formats/ImageReader.java

    r2754 r2755  
    384384  } 
    385385 
     386  /* @see IFormatReader#setGroupFiles(boolean) */ 
     387  public void setGroupFiles(boolean group) { 
     388    FormatTools.assertId(currentId, false, 2);  
     389    for (int i=0; i<readers.length; i++) readers[i].setGroupFiles(group);  
     390  } 
     391 
     392  /* @see IFormatReader#isGroupFiles() */ 
     393  public boolean isGroupFiles() { 
     394    return readers[0].isGroupFiles(); 
     395  } 
     396 
     397  /* @see IFormatReader#mustGroupFiles(String) */ 
     398  public boolean mustGroupFiles(String id) throws FormatException, IOException { 
     399    return getReader(id).mustGroupFiles(id); 
     400  } 
     401 
    386402  /* @see IFormatReader#setNormalized(boolean) */ 
    387403  public void setNormalized(boolean normalize) { 
  • trunk/loci/formats/ReaderWrapper.java

    r2674 r2755  
    194194  } 
    195195 
     196  public void setGroupFiles(boolean group) { 
     197    reader.setGroupFiles(group); 
     198  } 
     199 
     200  public boolean isGroupFiles() { 
     201    return reader.isGroupFiles(); 
     202  } 
     203 
     204  public boolean mustGroupFiles(String id) throws FormatException, IOException { 
     205    return reader.mustGroupFiles(id); 
     206  } 
     207 
    196208  public void setNormalized(boolean normalize) { 
    197209    reader.setNormalized(normalize); 
  • trunk/loci/formats/in/ICSReader.java

    r2701 r2755  
    9393  public boolean isThisType(byte[] block) { 
    9494    return false; 
     95  } 
     96 
     97  /* @see loci.formats.IFormatReader#mustGroupFiles(String) */ 
     98  public boolean mustGroupFiles(String id) { 
     99    return true; 
    95100  } 
    96101 
  • trunk/loci/formats/in/LeicaReader.java

    r2725 r2755  
    105105      return false; 
    106106    } 
     107  } 
     108 
     109  /* @see loci.formats.IFormatReader#mustGroupFiles(String) */ 
     110  public boolean mustGroupFiles(String id) throws FormatException, IOException { 
     111    return id.toLowerCase().endsWith(".lei"); 
    107112  } 
    108113 
     
    201206    else if (!lname.endsWith(".tif") && !lname.endsWith(".tiff")) return false; 
    202207    if (!open) return true; // now allowed to be any more thorough 
     208    if (!isGroupFiles()) return false; 
    203209 
    204210    // just checking the filename isn't enough to differentiate between 
  • trunk/loci/formats/in/MetamorphReader.java

    r2743 r2755  
    2828import java.io.*; 
    2929import java.text.DecimalFormat; 
    30 import java.util.Hashtable; 
    31 import java.util.StringTokenizer; 
     30import java.util.*; 
    3231import loci.formats.*; 
    3332 
     
    7069 
    7170  /** Constructs a new Metamorph reader. */ 
    72   public MetamorphReader() { super("Metamorph STK", "stk"); } 
     71  public MetamorphReader() {  
     72    super("Metamorph STK", new String[] {"stk", "nd"});  
     73  } 
    7374 
    7475  // -- IFormatReader API methods -- 
     
    109110  } 
    110111 
    111   /* @see loci.formats.IFormatReader#openBytes(int) */ 
    112   //public byte[] openBytes(int no) throws FormatException, IOException { 
    113     //FormatTools.assertId(currentId, true, 1); 
    114     //if (stks.length == 1) return super.openBytes(no);  
    115     //return null; // TODO  
    116   //} 
     112  /* @see loci.formats.IFormatReader#mustGroupFiles(String) */ 
     113  public boolean mustGroupFiles(String id) throws FormatException, IOException { 
     114    if (id.toLowerCase().endsWith(".nd")) return true; 
     115    return false;  
     116  } 
     117 
     118  /* @see loci.formats.IFormatReader#getUsedFiles() */ 
     119  public String[] getUsedFiles() { 
     120    return stks == null ? super.getUsedFiles() : stks; 
     121  } 
    117122 
    118123  /* @see loci.formats.IFormatReader#openBytes(int, byte[]) */ 
    119   //public byte[] openBytes(int no, byte[] buf) 
    120   //  throws FormatException, IOException 
    121   //{ 
    122   //  FormatTools.assertId(currentId, true, 1); 
    123   //  if (stks.length == 1) return super.openBytes(no, buf);  
    124   //  return null; // TODO  
    125   //} 
     124  public byte[] openBytes(int no, byte[] buf) 
     125    throws FormatException, IOException 
     126  { 
     127    FormatTools.assertId(currentId, true, 1); 
     128    if (stks == null || stks.length == 1) return super.openBytes(no, buf);  
     129   
     130    int[] coords = FormatTools.getZCTCoords(this, no);  
     131    int ndx = coords[1] * getEffectiveSizeC() + coords[2] * core.sizeT[0]; 
     132     
     133    RandomAccessStream tmp = new RandomAccessStream(stks[ndx]); 
     134    Hashtable[] fds = TiffTools.getIFDs(tmp); 
     135    TiffTools.getSamples(fds[coords[0]], tmp, buf); 
     136    tmp.close(); 
     137    return buf;  
     138  } 
    126139 
    127140  /* @see loci.formats.IFormatReader#openImage(int) */ 
    128   //public BufferedImage openImage(int no) throws FormatException, IOException { 
    129   //  FormatTools.assertId(currentId, true, 1); 
    130   //  if (stks.length == 1) return super.openImage(no);  
    131   //  return null; // TODO  
    132   //} 
     141  public BufferedImage openImage(int no) throws FormatException, IOException { 
     142    FormatTools.assertId(currentId, true, 1); 
     143    if (stks == null || stks.length == 1) return super.openImage(no);  
     144   
     145    int[] coords = FormatTools.getZCTCoords(this, no);  
     146    int ndx = no / core.sizeZ[0]; 
     147 
     148    initFile(stks[ndx]);  
     149    return TiffTools.getImage(ifds[coords[0]], in); 
     150  } 
     151 
     152  /* @see loci.formats.FormatReader#initFile(String) */ 
     153  protected void initFile(String id) throws FormatException, IOException { 
     154    if (id.toLowerCase().endsWith(".nd")) { 
     155      if (currentId != null) { 
     156        String[] s = getUsedFiles(); 
     157        for (int i=0; i<s.length; i++) { 
     158          if (id.equals(s[i])) return; 
     159        } 
     160      } 
     161 
     162      close(); 
     163      currentId = id; 
     164      metadata = new Hashtable(); 
     165 
     166      core = new CoreMetadata(1); 
     167      Arrays.fill(core.orderCertain, true); 
     168 
     169      // reinitialize the MetadataStore 
     170      getMetadataStore().createRoot(); 
     171     
     172      // find an associated STK file 
     173      String stkFile = id.substring(0, id.lastIndexOf(".")); 
     174      String[] dirList =  
     175        new Location(id).getAbsoluteFile().getParentFile().list(); 
     176      for (int i=0; i<dirList.length; i++) { 
     177        String s = dirList[i].toLowerCase(); 
     178        if (s.endsWith(".stk") && (dirList[i].startsWith(stkFile + "_w"))) { 
     179          stkFile = dirList[i]; 
     180          break; 
     181        } 
     182      } 
     183       
     184      super.initFile(stkFile);  
     185    } 
     186    else super.initFile(id); 
     187  
     188    Location ndfile = null; 
     189 
     190    if (!id.toLowerCase().endsWith(".nd")) { 
     191      Location abs = new Location(currentId).getAbsoluteFile(); 
     192      String absPath = abs.getPath().substring( 
     193        abs.getPath().lastIndexOf(File.separator));  
     194      ndfile = new Location(abs.getParent(),  
     195        absPath.substring(0, absPath.indexOf("_")) + ".nd"); 
     196      if (!ndfile.exists()) { 
     197        ndfile =  
     198          new Location(ndfile.getAbsolutePath().replaceAll(".nd", ".ND")); 
     199      } 
     200    } 
     201    else { 
     202      ndfile = new Location(id); 
     203    } 
     204 
     205    if (ndfile.exists() && (mustGroupFiles(id) || isGroupFiles())) { 
     206      RandomAccessStream ndStream =  
     207        new RandomAccessStream(ndfile.getAbsolutePath()); 
     208      String line = ndStream.readLine().trim(); 
     209 
     210      while (!line.equals("\"EndFile\"")) { 
     211        String key = line.substring(1, line.indexOf(",") - 1).trim(); 
     212        String value = line.substring(line.indexOf(",") + 1).trim(); 
     213      
     214        addMeta(key, value); 
     215        line = ndStream.readLine().trim();  
     216      } 
     217     
     218      // figure out how many files we need  
     219     
     220      String z = (String) getMeta("NZSteps"); 
     221      String c = (String) getMeta("NWavelengths"); 
     222      String t = (String) getMeta("NTimePoints"); 
     223 
     224      int zc = core.sizeZ[0], cc = core.sizeC[0], tc = core.sizeT[0]; 
     225 
     226      if (z != null) zc = Integer.parseInt(z);  
     227      if (c != null) cc = Integer.parseInt(c);  
     228      if (t != null) tc = Integer.parseInt(t);  
     229 
     230      int numFiles = cc * tc;  
     231 
     232      stks = new String[numFiles]; 
     233    
     234      String prefix = ndfile.getPath(); 
     235      prefix = prefix.substring(prefix.lastIndexOf(File.separator) + 1, 
     236        prefix.lastIndexOf(".")); 
     237 
     238      int pt = 0; 
     239      for (int i=0; i<tc; i++) { 
     240        for (int j=0; j<cc; j++) { 
     241          String chName = (String) getMeta("WaveName" + (j + 1)); 
     242          chName = chName.substring(1, chName.length() - 1);  
     243          stks[pt] = prefix + "_w" + (j + 1) + chName + "_t" +  
     244            (i + 1) + ".STK"; 
     245          pt++; 
     246        } 
     247      }  
     248   
     249      ndfile = ndfile.getAbsoluteFile();  
     250 
     251      for (int i=0; i<numFiles; i++) { 
     252        Location l = new Location(ndfile.getParent(), stks[i]); 
     253        if (!l.exists()) { 
     254          stks = null; 
     255          return; 
     256        } 
     257        stks[i] = l.getAbsolutePath(); 
     258      }  
     259     
     260      core.sizeZ[0] = zc; 
     261      core.sizeC[0] = cc; 
     262      core.sizeT[0] = tc; 
     263      core.imageCount[0] = zc * tc * cc;  
     264      core.currentOrder[0] = "XYZCT";  
     265    } 
     266  } 
    133267 
    134268  // -- Internal BaseTiffReader API methods -- 
     
    305439      if (debug) exc.printStackTrace(); 
    306440    } 
    307   
    308     Location abs = new Location(currentId).getAbsoluteFile(); 
    309     String absPath = abs.getPath().substring( 
    310       abs.getPath().lastIndexOf(File.separator));  
    311     Location ndfile = new Location(abs.getParent(),  
    312       absPath.substring(0, absPath.indexOf("_")) + ".nd"); 
    313     if (!ndfile.exists()) { 
    314       ndfile = new Location(ndfile.getAbsolutePath().replaceAll(".nd", ".ND")); 
    315     } 
    316  
    317     if (ndfile.exists()) { 
    318       RandomAccessStream ndStream =  
    319         new RandomAccessStream(ndfile.getAbsolutePath()); 
    320       String line = ndStream.readLine().trim(); 
    321  
    322       while (!line.equals("\"EndFile\"")) { 
    323         String key = line.substring(1, line.indexOf(",") - 1).trim(); 
    324         String value = line.substring(line.indexOf(",") + 1).trim(); 
    325       
    326         addMeta(key, value); 
    327         line = ndStream.readLine().trim();  
    328       } 
    329      
    330       // figure out how many files we need  
    331      
    332       String z = (String) getMeta("NZSteps"); 
    333       String c = (String) getMeta("NWavelengths"); 
    334       String t = (String) getMeta("NTimePoints"); 
    335  
    336       int zc = core.sizeZ[0], cc = core.sizeC[0], tc = core.sizeT[0]; 
    337  
    338       if (z != null) zc = Integer.parseInt(z);  
    339       if (c != null) cc = Integer.parseInt(c);  
    340       if (t != null) tc = Integer.parseInt(t);  
    341  
    342       int numFiles = (zc * cc * tc) /  
    343         (core.sizeZ[0] * core.sizeT[0] * getEffectiveSizeC()); 
    344  
    345       stks = new String[numFiles]; 
    346       // TODO : finish internal stitching logic  
    347     } 
    348441  } 
    349442 
  • trunk/loci/formats/in/OIFReader.java

    r2701 r2755  
    7171  public boolean isThisType(byte[] block) { 
    7272    return false; 
     73  } 
     74 
     75  /* @see loci.formats.IFormatReader#mustGroupFiles(String) */ 
     76  public boolean mustGroupFiles(String id) throws FormatException, IOException { 
     77    return true; 
    7378  } 
    7479 
  • trunk/loci/formats/in/PerkinElmerReader.java

    r2726 r2755  
    6767  /* @see loci.formats.IFormatReader#isThisType(byte[]) */ 
    6868  public boolean isThisType(byte[] block) { return false; } 
     69 
     70  /* @see loci.formats.IFormatReader#mustGroupFiles(String) */ 
     71  public boolean mustGroupFiles(String id) throws FormatException, IOException { 
     72    return true; 
     73  } 
    6974 
    7075  /* @see loci.formats.IFormatReader#openBytes(int) */ 
  • trunk/loci/formats/in/PrairieReader.java

    r2726 r2755  
    100100      return false; 
    101101    } 
     102  } 
     103 
     104  /* @see loci.formats.IFormatReader#mustGroupFiles(String) */ 
     105  public boolean mustGroupFiles(String id) throws FormatException, IOException { 
     106    id = id.toLowerCase(); 
     107    return id.endsWith(".cfg") || id.endsWith(".xml"); 
    102108  } 
    103109 
     
    156162  public boolean isThisType(String name, boolean open) { 
    157163    if (!super.isThisType(name, open)) return false; // check extension 
     164    if (!isGroupFiles()) return false; 
    158165 
    159166    // check if there is an XML file in the same directory 
  • trunk/loci/formats/readers.txt

    r2711 r2755  
    5959loci.formats.in.ICSReader          # ics, ids 
    6060loci.formats.in.OIFReader          # oif, various 
    61 loci.formats.in.PerkinElmerReader  # csv, htm, tim, zpo [TIFF+companion] 
     61loci.formats.in.PerkinElmerReader  # csv, htm, tim, zpo [(TIFF or RAW)+companion] 
    6262 
    6363# readers requiring third-party libraries 
Note: See TracChangeset for help on using the changeset viewer.