Changeset 5991 for branches/4.1


Ignore:
Timestamp:
03/04/10 12:08:55 (10 years ago)
Author:
melissa
Message:

Prevent an exception if the XML encoding is not specified and adjust the well/position count if TIFFs are missing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/4.1/components/bio-formats/src/loci/formats/in/ScanrReader.java

    r5661 r5991  
    2525 
    2626import java.io.IOException; 
     27import java.util.Hashtable; 
    2728import java.util.Vector; 
    2829 
     
    6768  private int fieldRows, fieldColumns; 
    6869  private Vector<String> channelNames = new Vector<String>(); 
    69   private Vector<String> wellLabels = new Vector<String>(); 
     70  private Hashtable<String, Integer> wellLabels = 
     71    new Hashtable<String, Integer>(); 
    7072  private String plateName; 
    7173 
     
    178180 
    179181    // make sure we have the .xml file 
    180     if (!checkSuffix(id, "xml")) { 
     182    if (!checkSuffix(id, "xml") && isGroupFiles()) { 
    181183      Location parent = new Location(id).getAbsoluteFile().getParentFile(); 
    182184      if (checkSuffix(id, "tif")) { 
     
    196198      } 
    197199    } 
     200    else if (!isGroupFiles() && checkSuffix(id, "tif")) { 
     201      TiffReader r = new TiffReader(); 
     202      r.setMetadataStore(getMetadataStore()); 
     203      r.setId(id); 
     204      core = r.getCoreMetadata(); 
     205      metadata = r.getMetadata(); 
     206      metadataStore = r.getMetadataStore(); 
     207      r.close(); 
     208      tiffs = new String[] {id}; 
     209      reader = new MinimalTiffReader(); 
     210 
     211      return; 
     212    } 
    198213 
    199214    Location dir = new Location(id).getAbsoluteFile().getParentFile(); 
     
    209224    // parse XML metadata 
    210225 
    211     String xml = DataTools.readFile(id); 
     226    String xml = DataTools.readFile(id).trim(); 
     227 
     228    // add the appropriate encoding, as some ScanR XML files use non-UTF8 
     229    // characters without specifying an encoding 
     230 
     231    if (xml.startsWith("<?")) { 
     232      xml = xml.substring(xml.indexOf("?>") + 2); 
     233    } 
     234    xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" + xml; 
     235 
    212236    XMLTools.parseXML(xml, new ScanrHandler()); 
    213237 
     
    215239    Vector<String> uniqueColumns = new Vector<String>(); 
    216240 
    217     for (String well : wellLabels) { 
     241    for (String well : wellLabels.keySet()) { 
    218242      if (!Character.isLetter(well.charAt(0))) continue; 
    219243      String row = well.substring(0, 1).trim(); 
     
    249273    // get list of TIFF files 
    250274 
    251     dir = new Location(dir, "data"); 
    252     list = dir.list(true); 
     275    Location dataDir = new Location(dir, "data"); 
     276    list = dataDir.list(true); 
     277    if (list == null) { 
     278      // try to find the TIFFs in the current directory 
     279      list = dir.list(true); 
     280    } 
     281    else dir = dataDir; 
    253282    if (nTimepoints == 0) { 
    254283      nTimepoints = list.length / (nChannels * nWells * nPos * nSlices); 
     
    259288 
    260289    int next = 0; 
     290    String[] keys = wellLabels.keySet().toArray(new String[wellLabels.size()]); 
     291    int realPosCount = 0; 
    261292    for (int well=0; well<nWells; well++) { 
    262       String wellPos = getBlock(well + 1, "W"); 
     293      Integer w = wellLabels.get(keys[well]); 
     294      int wellIndex = w == null ? well + 1 : w.intValue(); 
     295 
     296      String wellPos = getBlock(wellIndex, "W"); 
     297      int originalIndex = next; 
    263298 
    264299      for (int pos=0; pos<nPos; pos++) { 
    265300        String posPos = getBlock(pos + 1, "P"); 
     301        int posIndex = next; 
    266302 
    267303        for (int z=0; z<nSlices; z++) { 
     
    284320          } 
    285321        } 
    286       } 
    287     } 
     322        if (posIndex != next) realPosCount++; 
     323      } 
     324      if (next == originalIndex) { 
     325        wellLabels.remove(keys[well]); 
     326      } 
     327    } 
     328 
     329    if (wellLabels.size() != nWells) { 
     330      uniqueRows.clear(); 
     331      uniqueColumns.clear(); 
     332      for (String well : wellLabels.keySet()) { 
     333        if (!Character.isLetter(well.charAt(0))) continue; 
     334        String row = well.substring(0, 1).trim(); 
     335        String column = well.substring(1).trim(); 
     336        if (!uniqueRows.contains(row) && row.length() > 0) uniqueRows.add(row); 
     337        if (!uniqueColumns.contains(column) && column.length() > 0) { 
     338          uniqueColumns.add(column); 
     339        } 
     340      } 
     341 
     342      wellRows = uniqueRows.size(); 
     343      wellColumns = uniqueColumns.size(); 
     344      nWells = wellRows * wellColumns; 
     345    } 
     346    nPos = realPosCount; 
    288347 
    289348    reader = new MinimalTiffReader(); 
     
    292351    int sizeY = reader.getSizeY(); 
    293352    int pixelType = reader.getPixelType(); 
     353 
     354    // we strongly suspect that ScanR incorrectly records the 
     355    // signedness of the pixels 
     356 
     357    switch (pixelType) { 
     358      case FormatTools.INT8: 
     359        pixelType = FormatTools.UINT8; 
     360        break; 
     361      case FormatTools.UINT8: 
     362        pixelType = FormatTools.INT8; 
     363        break; 
     364      case FormatTools.INT16: 
     365        pixelType = FormatTools.UINT16; 
     366        break; 
     367      case FormatTools.UINT16: 
     368        pixelType = FormatTools.INT16; 
     369        break; 
     370    } 
     371 
    294372    boolean rgb = reader.isRGB(); 
    295373    boolean interleaved = reader.isInterleaved(); 
     
    328406    } 
    329407 
    330     store.setPlateRowNamingConvention("A", 0); 
    331     store.setPlateColumnNamingConvention("1", 0); 
     408    if (wellRows > 26) { 
     409      store.setPlateRowNamingConvention("1", 0); 
     410      store.setPlateColumnNamingConvention("A", 0); 
     411    } 
     412    else { 
     413      store.setPlateRowNamingConvention("A", 0); 
     414      store.setPlateColumnNamingConvention("1", 0); 
     415    } 
    332416    store.setPlateName(plateName, 0); 
    333417 
     
    351435      store.setImageID(imageID, i); 
    352436 
    353       String name = "Well " + String.valueOf((char) ('A' + wellRow)) + 
    354         (wellCol + 1) + ", Field " + (field + 1); 
     437      String row = 
     438        String.valueOf(wellRows > 26 ? wellRow + 1 : (char) ('A' + wellRow)); 
     439      String col = 
     440        String.valueOf(wellRows > 26 ? (char) ('A' + wellCol) : wellCol + 1); 
     441      String name = "Well " + row + col + ", Field " + (field + 1) + 
     442        " (Spot " + (i + 1) + ")"; 
    355443      store.setImageName(name, i); 
    356444    } 
     
    363451    private String key, value; 
    364452    private String qName; 
     453 
     454    private String wellIndex; 
    365455 
    366456    // -- DefaultHandler API methods -- 
     
    404494        } 
    405495        else if (key.equals("well selection table + cDNA")) { 
    406           wellLabels.add(value); 
     496          if (Character.isDigit(value.charAt(0))) { 
     497            wellIndex = value; 
     498          } 
     499          else { 
     500            wellLabels.put(value, new Integer(wellIndex)); 
     501          } 
    407502        } 
    408503      } 
Note: See TracChangeset for help on using the changeset viewer.