Changeset 6095


Ignore:
Timestamp:
04/06/10 13:35:42 (10 years ago)
Author:
melissa
Message:

Cleaned up BD Pathway reader a bit; the reader now parses more metadata and respects MetadataOptions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/bio-formats/src/loci/formats/in/BDReader.java

    r6065 r6095  
    2525package loci.formats.in; 
    2626 
    27 import java.io.*; 
    28 import java.util.*; 
    29  
     27import java.io.BufferedReader; 
     28import java.io.File; 
     29import java.io.FileReader; 
     30import java.io.IOException; 
     31import java.util.Arrays; 
     32import java.util.Vector; 
     33 
     34import loci.common.DataTools; 
    3035import loci.common.Location; 
    3136import loci.common.RandomAccessInputStream; 
     
    5661  // -- Constants -- 
    5762  private static final String EXPERIMENT_FILE = "Experiment.exp"; 
    58   private static final String[] META_EXT = {"drt","dye","exp","plt"}; 
     63  private static final String[] META_EXT = {"drt", "dye", "exp", "plt", "txt"}; 
    5964 
    6065  // -- Fields -- 
     
    6671  private MinimalTiffReader reader; 
    6772 
     73  private String roiFile; 
     74  private int[] emWave, exWave; 
     75  private double[] gain, offset, exposure; 
     76  private String binning, objective; 
     77 
    6878  // -- Constructor -- 
    6979 
     
    102112 
    103113    String software = ifd.getIFDTextValue(IFD.SOFTWARE); 
     114    if (software == null) return false; 
    104115 
    105116    return software.trim().startsWith("MATROX Imaging Library"); 
     
    164175 
    165176  // -- Internal FormatReader API methods -- 
    166   public IniList readMetaData(String id) throws IOException { 
    167     IniList exp = (new IniParser()).parseINI( 
    168       new BufferedReader(new FileReader(id))); 
    169     IniList plate = null; 
    170     // Read Plate File 
    171     for (String filename : metadataFiles) { 
    172       if (filename.endsWith(".plt")) { 
    173         plate = (new IniParser()).parseINI( 
    174           new BufferedReader(new FileReader(filename))); 
    175       } 
    176       else if (filename.endsWith("RoiSummary.txt")) { 
    177         RandomAccessInputStream s = new RandomAccessInputStream(filename); 
    178         String line = s.readLine().trim(); 
    179         while (!line.endsWith(".adf\"")) { 
    180           line = s.readLine().trim(); 
    181         } 
    182         plateName = line.substring(line.indexOf(":")).trim(); 
    183         plateName = plateName.replace('/', File.separatorChar); 
    184         plateName = plateName.replace('\\', File.separatorChar); 
    185         for (int i=0; i<3; i++) { 
    186           plateName = 
    187             plateName.substring(0, plateName.lastIndexOf(File.separator)); 
    188         } 
    189         plateName = 
    190           plateName.substring(plateName.lastIndexOf(File.separator) + 1); 
    191  
    192         s.close(); 
    193       } 
    194     } 
    195     if (plate == null) throw new IOException("No Plate File"); 
    196  
    197     IniTable plateType = plate.getTable("PlateType"); 
    198  
    199     if (plateName == null) { 
    200       plateName = plateType.get("Brand"); 
    201     } 
    202     plateDescription = 
    203       plateType.get("Brand") + " " + plateType.get("Description"); 
    204  
    205     Location dir = new Location(id).getAbsoluteFile().getParentFile(); 
    206     for (String filename : dir.list()) { 
    207       if (filename.startsWith("Well ")) { 
    208         wellLabels.add(filename.split("\\s|\\.")[1]); 
    209       } 
    210     } 
    211  
    212     core = new CoreMetadata[wellLabels.size()]; 
    213  
    214     core[0] = new CoreMetadata(); 
    215  
    216  
    217 // Hack for current testing/development purposes 
    218 // Not all channels have the same Z!!! How to handle??? 
    219 // FIXME FIXME FIXME 
    220     core[0].sizeZ=1; 
    221 // FIXME FIXME FIXME 
    222 // END OF HACK 
    223  
    224     core[0].sizeC = Integer.parseInt(exp.getTable("General").get("Dyes")); 
    225  
    226     for (int i=1; i<=core[0].sizeC; i++) { 
    227       channelNames.add(exp.getTable("Dyes").get(Integer.toString(i))); 
    228     } 
    229  
    230     // Count Images 
    231     core[0].sizeT = 0; 
    232     Location well = new Location(dir.getAbsolutePath(), 
    233       "Well " + wellLabels.get(1)); 
    234     for (String filename : well.list()) { 
    235       if (filename.startsWith(channelNames.get(0)) && 
    236          filename.endsWith(".tif")) 
    237       { 
    238         core[0].sizeT++; 
    239       } 
    240     } 
    241     return exp; 
    242   } 
    243177 
    244178  /* @see loci.formats.FormatReader#initFile(String) */ 
     
    252186      Location f = new Location(dir, file); 
    253187      if (!f.isDirectory()) { 
    254         for (String ext : META_EXT) { 
    255           if (checkSuffix(id, ext)) { 
    256             metadataFiles.add(f.getAbsolutePath()); 
    257           } 
     188        if (checkSuffix(file, META_EXT)) { 
     189          metadataFiles.add(f.getAbsolutePath()); 
    258190        } 
    259191      } 
     
    262194    // parse Experiment metadata 
    263195    IniList experiment = readMetaData(id); 
     196 
     197    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     198      objective = experiment.getTable("Geometry").get("Name"); 
     199      IniTable camera = experiment.getTable("Camera"); 
     200      binning = camera.get("BinX") + "x" + camera.get("BinY"); 
     201 
     202      parseChannelData(dir); 
     203 
     204      addGlobalMeta("Objective", objective); 
     205      addGlobalMeta("Camera binning", binning); 
     206    } 
     207 
    264208    Vector<String> uniqueRows = new Vector<String>(); 
    265209    Vector<String> uniqueColumns = new Vector<String>(); 
     
    281225    if (nChannels == 0) nChannels = 1; 
    282226 
    283     tiffs = getTiffs(dir.getAbsoluteFile().toString()); 
    284  
    285     // []   files = new String[nChannels * nWells * nTimepoints * nSlices]; 
     227    tiffs = getTiffs(dir.getAbsolutePath()); 
    286228 
    287229    reader = new MinimalTiffReader(); 
     
    316258    MetadataStore store = 
    317259      new FilterMetadata(getMetadataStore(), isMetadataFiltered()); 
    318     MetadataTools.populatePixels(store, this); 
    319  
    320     // populate LogicalChannel data 
    321     for (int i=0; i<getSeriesCount(); i++) { 
    322       for (int c=0; c<getSizeC(); c++) { 
    323         store.setLogicalChannelName(channelNames.get(c), i, c); 
    324       } 
    325     } 
    326  
    327     store.setPlateRowNamingConvention("A", 0); 
    328     store.setPlateColumnNamingConvention("01", 0); 
    329     store.setPlateName(plateName, 0); 
    330     store.setPlateDescription(plateDescription, 0); 
     260    boolean populatePlanes = 
     261      getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL; 
     262    MetadataTools.populatePixels(store, this, populatePlanes); 
    331263 
    332264    for (int i=0; i<getSeriesCount(); i++) { 
     
    347279      store.setImageName(name, i); 
    348280    } 
    349   } 
     281 
     282    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     283      String instrumentID = MetadataTools.createLSID("Instrument", 0); 
     284      store.setInstrumentID(instrumentID, 0); 
     285 
     286      String objectiveID = MetadataTools.createLSID("Objective", 0, 0); 
     287      store.setObjectiveID(objectiveID, 0, 0); 
     288      if (objective != null) { 
     289        String[] tokens = objective.split(" "); 
     290        String mag = tokens[0].replaceAll("[xX]", ""); 
     291        String na = null; 
     292        int naIndex = 0; 
     293        for (int i=0; i<tokens.length; i++) { 
     294          if (tokens[i].equals("NA")) { 
     295            naIndex = i + 1; 
     296            na = tokens[naIndex]; 
     297            break; 
     298          } 
     299        } 
     300 
     301        store.setObjectiveNominalMagnification(new Integer(mag), 0, 0); 
     302        if (na != null) { 
     303          na = na.substring(0, 1) + "." + na.substring(1); 
     304          store.setObjectiveLensNA(new Double(na), 0, 0); 
     305        } 
     306        if (naIndex + 1 < tokens.length) { 
     307          store.setObjectiveManufacturer(tokens[naIndex + 1], 0, 0); 
     308        } 
     309      } 
     310 
     311      // populate LogicalChannel data 
     312      for (int i=0; i<getSeriesCount(); i++) { 
     313        store.setImageInstrumentRef(instrumentID, i); 
     314        store.setObjectiveSettingsObjective(objectiveID, i); 
     315 
     316        for (int c=0; c<getSizeC(); c++) { 
     317          store.setLogicalChannelName(channelNames.get(c), i, c); 
     318          store.setLogicalChannelEmWave(emWave[c], i, c); 
     319          store.setLogicalChannelExWave(exWave[c], i, c); 
     320 
     321          String detectorID = MetadataTools.createLSID("Detector", 0, c); 
     322          store.setDetectorID(detectorID, 0, c); 
     323          store.setDetectorSettingsDetector(detectorID, i, c); 
     324          store.setDetectorSettingsGain(gain[c], i, c); 
     325          store.setDetectorSettingsOffset(offset[c], i, c); 
     326          store.setDetectorSettingsBinning(binning, i, c); 
     327        } 
     328 
     329        for (int p=0; p<getImageCount(); p++) { 
     330          int[] zct = getZCTCoords(p); 
     331          store.setPlaneTimingExposureTime(exposure[zct[1]], i, 0, p); 
     332        } 
     333      } 
     334 
     335      store.setPlateRowNamingConvention("A", 0); 
     336      store.setPlateColumnNamingConvention("01", 0); 
     337      store.setPlateName(plateName, 0); 
     338      store.setPlateDescription(plateDescription, 0); 
     339 
     340      parseROIs(store); 
     341    } 
     342  } 
     343 
     344  // -- Helper methods -- 
    350345 
    351346  /* Locate the experiment file given any file in set */ 
     
    358353      for (String file : parent.list()) { 
    359354        if (file.equals(EXPERIMENT_FILE)) { 
    360           id = new Location(parent, file).getAbsolutePath(); 
    361           break; 
    362         } 
    363       } 
    364       if (!checkSuffix(id, "exp")) { 
    365         throw new FormatException("Could not find " + EXPERIMENT_FILE + 
    366           " in " + parent.getAbsolutePath()); 
    367       } 
     355          return new Location(parent, file).getAbsolutePath(); 
     356        } 
     357      } 
     358      throw new FormatException("Could not find " + EXPERIMENT_FILE + 
     359        " in " + parent.getAbsolutePath()); 
    368360    } 
    369361    return id; 
    370362  } 
    371363 
    372   public String[] getTiffs(String dir) { 
    373     LinkedList<String> files = new LinkedList<String>(); 
    374     FileFilter wellDirFilter = new FileFilter() { 
    375       public boolean accept(File file) { 
    376           return file.isDirectory() && file.getName().startsWith("Well "); 
    377       } 
    378     }; 
    379     FileFilter tiffFilter = new FileFilter() { 
    380       public boolean accept(File file) { 
    381         return file.getName().matches(".* - n\\d\\d\\d\\d\\d\\d\\.tif"); 
    382       } 
    383     }; 
    384  
    385     File[] dirs = (new File(dir)).listFiles(wellDirFilter); 
    386  
    387     Arrays.sort(dirs); 
    388  
    389     for (File well : dirs) { 
    390       File[] found = well.listFiles(tiffFilter); 
    391       Arrays.sort(found); 
    392       for (File file : found) { 
    393         files.add(file.getAbsolutePath()); 
    394       } 
    395     } 
    396  
    397     return files.toArray(new String[files.size()]); 
    398   } 
     364  private IniList readMetaData(String id) throws IOException { 
     365    IniParser parser = new IniParser(); 
     366    IniList exp = parser.parseINI(new BufferedReader(new FileReader(id))); 
     367    IniList plate = null; 
     368    // Read Plate File 
     369    for (String filename : metadataFiles) { 
     370      if (checkSuffix(filename, "plt")) { 
     371        plate = parser.parseINI(new BufferedReader(new FileReader(filename))); 
     372      } 
     373      else if (filename.endsWith("RoiSummary.txt")) { 
     374        roiFile = filename; 
     375        if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     376          RandomAccessInputStream s = new RandomAccessInputStream(filename); 
     377          String line = s.readLine().trim(); 
     378          while (!line.endsWith(".adf\"")) { 
     379            line = s.readLine().trim(); 
     380          } 
     381          plateName = line.substring(line.indexOf(":")).trim(); 
     382          plateName = plateName.replace('/', File.separatorChar); 
     383          plateName = plateName.replace('\\', File.separatorChar); 
     384          for (int i=0; i<3; i++) { 
     385            plateName = 
     386              plateName.substring(0, plateName.lastIndexOf(File.separator)); 
     387          } 
     388          plateName = 
     389            plateName.substring(plateName.lastIndexOf(File.separator) + 1); 
     390 
     391          s.close(); 
     392        } 
     393      } 
     394    } 
     395    if (plate == null) throw new IOException("No Plate File"); 
     396 
     397    IniTable plateType = plate.getTable("PlateType"); 
     398 
     399    if (plateName == null) { 
     400      plateName = plateType.get("Brand"); 
     401    } 
     402    plateDescription = 
     403      plateType.get("Brand") + " " + plateType.get("Description"); 
     404 
     405    Location dir = new Location(id).getAbsoluteFile().getParentFile(); 
     406    for (String filename : dir.list()) { 
     407      if (filename.startsWith("Well ")) { 
     408        wellLabels.add(filename.split("\\s|\\.")[1]); 
     409      } 
     410    } 
     411 
     412    core = new CoreMetadata[wellLabels.size()]; 
     413 
     414    core[0] = new CoreMetadata(); 
     415 
     416 
     417// Hack for current testing/development purposes 
     418// Not all channels have the same Z!!! How to handle??? 
     419// FIXME FIXME FIXME 
     420    core[0].sizeZ=1; 
     421// FIXME FIXME FIXME 
     422// END OF HACK 
     423 
     424    core[0].sizeC = Integer.parseInt(exp.getTable("General").get("Dyes")); 
     425    core[0].bitsPerPixel = 
     426      Integer.parseInt(exp.getTable("Camera").get("BitdepthUsed")); 
     427 
     428    IniTable dyeTable = exp.getTable("Dyes"); 
     429    for (int i=1; i<=getSizeC(); i++) { 
     430      channelNames.add(dyeTable.get(Integer.toString(i))); 
     431    } 
     432 
     433    // Count Images 
     434    core[0].sizeT = 0; 
     435    Location well = new Location(dir.getAbsolutePath(), 
     436      "Well " + wellLabels.get(1)); 
     437    for (String filename : well.list()) { 
     438      if (filename.startsWith(channelNames.get(0)) && filename.endsWith(".tif")) 
     439      { 
     440        core[0].sizeT++; 
     441      } 
     442    } 
     443    return exp; 
     444  } 
     445 
     446  private void parseChannelData(Location dir) throws IOException { 
     447    emWave = new int[channelNames.size()]; 
     448    exWave = new int[channelNames.size()]; 
     449    exposure = new double[channelNames.size()]; 
     450    gain = new double[channelNames.size()]; 
     451    offset = new double[channelNames.size()]; 
     452 
     453    for (int c=0; c<channelNames.size(); c++) { 
     454      Location dyeFile = new Location(dir, channelNames.get(c) + ".dye"); 
     455      IniList dye = new IniParser().parseINI( 
     456        new BufferedReader(new FileReader(dyeFile.getAbsolutePath()))); 
     457 
     458      IniTable numerator = dye.getTable("Numerator"); 
     459      String em = numerator.get("Emission"); 
     460      em = em.substring(0, em.indexOf(" ")); 
     461      emWave[c] = Integer.parseInt(em); 
     462 
     463      String ex = numerator.get("Excitation"); 
     464      ex = ex.substring(0, ex.lastIndexOf(" ")); 
     465      if (ex.indexOf(" ") != -1) { 
     466        ex = ex.substring(ex.lastIndexOf(" ") + 1); 
     467      } 
     468      exWave[c] = Integer.parseInt(ex); 
     469 
     470      exposure[c] = Double.parseDouble(numerator.get("Exposure")); 
     471      gain[c] = Double.parseDouble(numerator.get("Gain")); 
     472      offset[c] = Double.parseDouble(numerator.get("Offset")); 
     473    } 
     474  } 
     475 
     476  private String[] getTiffs(String dir) { 
     477    Location f = new Location(dir); 
     478    Vector<String> files = new Vector<String>(); 
     479 
     480    for (String filename : f.list(true)) { 
     481      Location file = new Location(f, filename).getAbsoluteFile(); 
     482      if (file.isDirectory() && filename.startsWith("Well ")) { 
     483        for (String tiff : file.list(true)) { 
     484          if (tiff.matches(".* - n\\d\\d\\d\\d\\d\\d\\.tif")) { 
     485            files.add(new Location(file, tiff).getAbsolutePath()); 
     486          } 
     487        } 
     488      } 
     489    } 
     490 
     491    String[] tiffFiles = files.toArray(new String[files.size()]); 
     492    Arrays.sort(tiffFiles); 
     493    return tiffFiles; 
     494  } 
     495 
     496  private void parseROIs(MetadataStore store) throws IOException { 
     497    String roiData = DataTools.readFile(roiFile); 
     498    String[] lines = roiData.split("\r\n"); 
     499 
     500    int firstRow = 0; 
     501    while (!lines[firstRow].startsWith("ROI")) firstRow++; 
     502    firstRow += 2; 
     503 
     504    for (int i=firstRow; i<lines.length; i++) { 
     505      String[] cols = lines[i].split("\t"); 
     506      if (cols.length < 6) break; 
     507 
     508      if (cols[2].trim().length() > 0) { 
     509        store.setRectX(cols[2], 0, i - firstRow, 0); 
     510        store.setRectY(cols[3], 0, i - firstRow, 0); 
     511        store.setRectWidth(cols[4], 0, i - firstRow, 0); 
     512        store.setRectHeight(cols[5], 0, i - firstRow, 0); 
     513      } 
     514    } 
     515  } 
     516 
    399517} 
Note: See TracChangeset for help on using the changeset viewer.