Changeset 5826 for branches/4.1


Ignore:
Timestamp:
01/22/10 12:18:02 (10 years ago)
Author:
melissa
Message:

Fixed float/double parsing for ND2 files that have a decimal delimiter not equal to the current locale's decimal delimiter.

File:
1 edited

Legend:

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

    r5680 r5826  
    2525 
    2626import java.io.IOException; 
     27import java.text.DecimalFormatSymbols; 
    2728import java.util.Hashtable; 
    2829import java.util.StringTokenizer; 
     
    8586  private int numSeries; 
    8687 
    87   private double pixelSizeX, pixelSizeY, pixelSizeZ; 
     88  private float pixelSizeX, pixelSizeY, pixelSizeZ; 
     89  private Float pinholeSize; 
    8890  private String voltage, mag, na, objectiveModel, immersion, correction; 
    8991 
     
    9294  private Vector<Integer> exWave, emWave, power; 
    9395  private Vector<Hashtable<String, String>> rois; 
     96  private Vector<Float> posX, posY, posZ; 
    9497 
    9598  private String cameraModel; 
     
    193196      power = null; 
    194197      cameraModel = null; 
     198      posX = posY = posZ = null; 
    195199      fieldIndex = 0; 
    196200      rois = null; 
     201      pinholeSize = null; 
    197202    } 
    198203  } 
     
    215220    power = new Vector<Integer>(); 
    216221    rois = new Vector<Hashtable<String, String>>(); 
     222    posX = new Vector<Float>(); 
     223    posY = new Vector<Float>(); 
     224    posZ = new Vector<Float>(); 
    217225 
    218226    in = new RandomAccessInputStream(id); 
     
    220228    if (in.read() == -38 && in.read() == -50) { 
    221229      // newer version of ND2 - doesn't use JPEG2000 
     230      status("Searching for blocks"); 
    222231 
    223232      isJPEG = false; 
     
    234243      Vector<int[]> customDataLengths = new Vector<int[]>(); 
    235244 
    236       while (in.getFilePointer() < in.length() - 1 && 
    237         in.getFilePointer() >= 0) 
     245      // search for blocks 
     246      byte[] sigBytes = {-38, -50, -66, 10}; // 0xDACEBE0A 
     247      final String sig = new String(sigBytes); 
     248      while (in.getFilePointer() < in.length() - 1 && in.getFilePointer() >= 0) 
    238249      { 
    239         int b1 = in.read(); 
    240         int b2 = in.read(); 
    241         int b3 = in.read(); 
    242         int b4 = in.read(); 
    243         while (b1 != -38 || b2 != -50 || b3 != -66 || b4 != 10) { 
    244           if (in.getFilePointer() >= in.length() - 1) break; 
    245           b1 = b2; 
    246           b2 = b3; 
    247           b3 = b4; 
    248           b4 = in.read(); 
    249         } 
    250         if (in.getFilePointer() >= in.length() - 1) break; 
     250        in.findString(false, 1024, sig); // empirically, 1KB blocks work well 
     251        if (in.getFilePointer() > in.length() - 24) break; 
    251252 
    252253        int lenOne = in.readInt(); 
     
    255256        in.skipBytes(4); 
    256257 
     258        long fp = in.getFilePointer(); 
    257259        String blockType = in.readString(12); 
    258         long fp = in.getFilePointer() - 12; 
     260 
     261        int percent = (int) (100 * fp / in.length()); 
     262        status("Parsing block '" + blockType + "' " + percent + "%"); 
     263 
    259264        int skip = len - 12 - lenOne * 2; 
    260265        if (skip <= 0) skip += lenOne * 2; 
     
    760765    private String prefix = null; 
    761766    private String prevRuntype = null; 
     767    private String prevElement = null; 
    762768 
    763769    public void endElement(String uri, String localName, String qName, 
     
    767773        prefix = null; 
    768774      } 
     775      if (qName.equals(prevElement)) { 
     776        prevElement = null; 
     777      } 
    769778    } 
    770779 
     
    772781      Attributes attributes) 
    773782    { 
     783      if ("CLxListVariant".equals(attributes.getValue("runtype"))) { 
     784        prevElement = qName; 
     785      } 
     786 
    774787      String value = attributes.getValue("value"); 
    775788      if (qName.equals("uiWidth")) { 
     
    792805        parseKeyAndValue(qName, value, prevRuntype); 
    793806      } 
     807      else if ("dPosX".equals(prevElement) && qName.startsWith("item_")) { 
     808        posX.add(new Float(sanitizeFloat(value))); 
     809      } 
     810      else if ("dPosY".equals(prevElement) && qName.startsWith("item_")) { 
     811        posY.add(new Float(sanitizeFloat(value))); 
     812      } 
     813      else if ("dPosZ".equals(prevElement) && qName.startsWith("item_")) { 
     814        posZ.add(new Float(sanitizeFloat(value))); 
     815      } 
    794816      else if (qName.startsWith("item_")) { 
    795817        int v = Integer.parseInt(qName.substring(qName.indexOf("_") + 1)); 
     
    827849        rois.add(roi); 
    828850      } 
     851      else if (qName.equals("dPinholeRadius")) { 
     852        pinholeSize = new Float(sanitizeFloat(value)); 
     853        addGlobalMeta("Pinhole size", value); 
     854      } 
    829855      else { 
    830856        StringBuffer sb = new StringBuffer(); 
     
    868894    } 
    869895 
    870     // populate PlaneTiming data 
     896    // populate PlaneTiming and StagePosition data 
    871897    for (int i=0; i<getSeriesCount(); i++) { 
    872898      if (tsT.size() > 0) { 
     
    874900        for (int n=0; n<getImageCount(); n++) { 
    875901          int[] coords = getZCTCoords(n); 
    876           int stampIndex = coords[2]; 
     902          int stampIndex = coords[2] + i * getSizeT(); 
    877903          if (tsT.size() == getImageCount()) stampIndex = n; 
    878           float stamp = tsT.get(stampIndex).floatValue(); 
     904          double stamp = tsT.get(stampIndex).doubleValue(); 
    879905          store.setPlaneTimingDeltaT(new Float(stamp), i, 0, n); 
    880906 
     
    884910          } 
    885911        } 
     912      } 
     913      for (int n=0; n<getImageCount(); n++) { 
     914        if (i < posX.size()) { 
     915          store.setStagePositionPositionX(posX.get(i), i, 0, n); 
     916          addSeriesMeta("X position", posX.get(i)); 
     917          addGlobalMeta("X position for position #" + (i + 1), posX.get(i)); 
     918        } 
     919        if (i < posY.size()) { 
     920          store.setStagePositionPositionY(posY.get(i), i, 0, n); 
     921          addSeriesMeta("Y position" + (i + 1), posY.get(i)); 
     922          addGlobalMeta("X position for position #" + (i + 1), posX.get(i)); 
     923        } 
     924        if (i < posZ.size()) { 
     925          store.setStagePositionPositionZ(posZ.get(i), i, 0, n); 
     926          addSeriesMeta("Z position" + (i + 1), posZ.get(i)); 
     927          addGlobalMeta("X position for position #" + (i + 1), posX.get(i)); 
     928        } 
     929 
    886930      } 
    887931    } 
     
    895939      for (int c=0; c<getEffectiveSizeC(); c++) { 
    896940        int index = i * getSizeC() + c; 
     941        if (pinholeSize != null) { 
     942          store.setLogicalChannelPinholeSize(pinholeSize, i, c); 
     943        } 
    897944        if (index < channelNames.size()) { 
    898945          store.setLogicalChannelName(channelNames.get(index), i, c); 
     
    929976    // populate DetectorSettings 
    930977    if (voltage != null) { 
     978      voltage = sanitizeFloat(voltage); 
    931979      store.setDetectorSettingsVoltage(new Float(voltage), 0, 0); 
    932980    } 
    933981 
    934982    // populate Objective 
    935     if (na != null) store.setObjectiveLensNA(new Float(na), 0, 0); 
     983    if (na != null) { 
     984      na = sanitizeFloat(na); 
     985      store.setObjectiveLensNA(new Float(na), 0, 0); 
     986    } 
    936987    if (mag != null) { 
     988      mag = sanitizeFloat(mag); 
    937989      store.setObjectiveCalibratedMagnification(new Float(mag), 0, 0); 
    938990    } 
     
    10111063    addGlobalMeta(key, value); 
    10121064    if (key.endsWith("dCalibration")) { 
    1013       pixelSizeX = Double.parseDouble(value); 
     1065      pixelSizeX = Float.parseFloat(sanitizeFloat(value)); 
    10141066      pixelSizeY = pixelSizeX; 
    10151067    } 
    1016     else if (key.endsWith("dZStep")) pixelSizeZ = Double.parseDouble(value); 
    1017     else if (key.endsWith("Gain")) gain.add(new Float(value)); 
     1068    else if (key.endsWith("dZStep")) { 
     1069      pixelSizeZ = Float.parseFloat(sanitizeFloat(value)); 
     1070    } 
     1071    else if (key.endsWith("Gain")) gain.add(new Float(sanitizeFloat(value))); 
    10181072    else if (key.endsWith("dLampVoltage")) voltage = value; 
    10191073    else if (key.endsWith("dObjectiveMag") && mag == null) mag = value; 
     
    10391093    } 
    10401094    else if (key.endsWith("dTimeMSec")) { 
    1041       long v = (long) Double.parseDouble(value); 
     1095      long v = (long) Float.parseFloat(sanitizeFloat(value)); 
    10421096      if (!ts.contains(new Long(v))) { 
    10431097        ts.add(new Long(v)); 
     
    10461100    } 
    10471101    else if (key.endsWith("dZPos")) { 
    1048       long v = (long) Double.parseDouble(value); 
     1102      long v = (long) Float.parseFloat(sanitizeFloat(value)); 
    10491103      if (!zs.contains(new Long(v))) { 
    10501104        zs.add(new Long(v)); 
     
    11491203              int last = v[1].lastIndexOf(" "); 
    11501204              if (last != -1) v[1] = v[1].substring(0, last); 
    1151               speed.add(new Float(v[1])); 
     1205              speed.add(new Float(sanitizeFloat(v[1]))); 
    11521206            } 
    11531207            else if (v[0].equals("Temperature")) { 
    11541208              String temp = v[1].replaceAll("[\\D&&[^-.]]", ""); 
    1155               temperature.add(new Float(temp)); 
     1209              temperature.add(new Float(sanitizeFloat(temp))); 
    11561210            } 
    11571211            else if (v[0].equals("Exposure")) { 
    11581212              String[] s = v[1].trim().split(" "); 
    11591213              try { 
    1160                 double time = Double.parseDouble(s[0]); 
     1214                float time = Float.parseFloat(sanitizeFloat(s[0])); 
    11611215                // TODO: check for other units 
    11621216                if (s[1].equals("ms")) time /= 1000; 
     
    11701224            int last = v[0].indexOf(" ", space + 1); 
    11711225            if (last == -1) last = v[0].length(); 
    1172             pixelSizeZ = Double.parseDouble(v[0].substring(space, last)); 
     1226            pixelSizeZ = 
     1227              Float.parseFloat(sanitizeFloat(v[0].substring(space, last))); 
    11731228          } 
    11741229          else if (v[0].equals("Line")) { 
     
    11861241              } 
    11871242              else if (nextKey.equals("Power")) { 
    1188                 power.add(new Integer((int) Double.parseDouble(nextValue))); 
     1243                nextValue = sanitizeFloat(nextValue); 
     1244                power.add(new Integer((int) Float.parseFloat(nextValue))); 
    11891245              } 
    11901246            } 
     
    11951251  } 
    11961252 
     1253  private String sanitizeFloat(String value) { 
     1254    char separator = new DecimalFormatSymbols().getDecimalSeparator(); 
     1255    if (value.indexOf(separator) == -1) { 
     1256      char usedSeparator = separator == '.' ? ',' : '.'; 
     1257      value = value.replace(usedSeparator, separator); 
     1258    } 
     1259    return value; 
     1260  } 
     1261 
    11971262} 
Note: See TracChangeset for help on using the changeset viewer.