Changeset 6819


Ignore:
Timestamp:
08/18/10 17:25:14 (9 years ago)
Author:
melissa
Message:

Factored ND2Handler out of NativeND2Reader. See #529.

Location:
trunk/components/bio-formats/src/loci/formats/in
Files:
1 added
1 edited

Legend:

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

    r6800 r6819  
    2525 
    2626import java.io.IOException; 
    27 import java.text.DecimalFormatSymbols; 
     27import java.util.ArrayList; 
    2828import java.util.Hashtable; 
    29 import java.util.StringTokenizer; 
    30 import java.util.Vector; 
    3129 
    3230import loci.common.ByteArrayHandle; 
     
    4745import ome.xml.model.primitives.NonNegativeInteger; 
    4846import ome.xml.model.primitives.PositiveInteger; 
    49  
    50 import org.xml.sax.Attributes; 
    51 import org.xml.sax.helpers.DefaultHandler; 
    5247 
    5348/** 
     
    8681  private boolean isLossless; 
    8782 
    88   private Vector<Long> zs = new Vector<Long>(); 
    89   private Vector<Long> ts = new Vector<Long>(); 
    90   private Vector<Double> tsT = new Vector<Double>(); 
    91  
    92   private int numSeries; 
    93  
    94   private double pixelSizeX, pixelSizeY, pixelSizeZ; 
    95   private Double pinholeSize; 
    96   private String voltage, mag, na, objectiveModel, immersion, correction; 
    97   private String refractiveIndex; 
    98  
    99   private Vector<String> channelNames, modality, binning; 
    100   private Vector<Double> speed, gain, temperature, exposureTime; 
    101   private Vector<Integer> exWave, emWave, power; 
    102   private Vector<Hashtable<String, String>> rois; 
    103   private Vector<Double> posX, posY, posZ; 
    104  
    105   private String cameraModel; 
     83  private ArrayList<Double> tsT = new ArrayList<Double>(); 
    10684 
    10785  private int fieldIndex; 
    10886 
    10987  private long xOffset, yOffset, zOffset; 
     88 
     89  private ArrayList<Double> posX; 
     90  private ArrayList<Double> posY; 
     91  private ArrayList<Double> posZ; 
    11092 
    11193  // -- Constructor -- 
     
    177159    if (!fileOnly) { 
    178160      offsets = null; 
    179       zs.clear(); 
    180       ts.clear(); 
    181161      isJPEG = isLossless = false; 
    182162      codec = null; 
    183       numSeries = 0; 
    184163      tsT.clear(); 
    185164 
    186       pixelSizeX = pixelSizeY = pixelSizeZ = 0f; 
    187       voltage = mag = na = objectiveModel = immersion = correction = null; 
    188       refractiveIndex = null; 
    189       channelNames = null; 
    190       binning = null; 
    191       speed = null; 
    192       gain = null; 
    193       temperature = null; 
    194       exposureTime = null; 
    195       modality = null; 
    196       exWave = null; 
    197       emWave = null; 
    198       power = null; 
    199       cameraModel = null; 
     165      fieldIndex = 0; 
     166      xOffset = yOffset = zOffset = 0; 
    200167      posX = posY = posZ = null; 
    201       fieldIndex = 0; 
    202       rois = null; 
    203       pinholeSize = null; 
    204       xOffset = yOffset = zOffset = 0; 
    205168    } 
    206169  } 
     
    212175    super.initFile(id); 
    213176 
    214     channelNames = new Vector<String>(); 
    215     binning = new Vector<String>(); 
    216     speed = new Vector<Double>(); 
    217     gain = new Vector<Double>(); 
    218     temperature = new Vector<Double>(); 
    219     exposureTime = new Vector<Double>(); 
    220     modality = new Vector<String>(); 
    221     exWave = new Vector<Integer>(); 
    222     emWave = new Vector<Integer>(); 
    223     power = new Vector<Integer>(); 
    224     rois = new Vector<Hashtable<String, String>>(); 
    225     posX = new Vector<Double>(); 
    226     posY = new Vector<Double>(); 
    227     posZ = new Vector<Double>(); 
    228  
    229177    in = new RandomAccessInputStream(id); 
    230178 
     
    239187      // assemble offsets to each block 
    240188 
    241       Vector<String> imageNames = new Vector<String>(); 
    242       Vector<Long> imageOffsets = new Vector<Long>(); 
    243       Vector<int[]> imageLengths = new Vector<int[]>(); 
    244       Vector<Long> customDataOffsets = new Vector<Long>(); 
    245       Vector<int[]> customDataLengths = new Vector<int[]>(); 
     189      ArrayList<String> imageNames = new ArrayList<String>(); 
     190      ArrayList<Long> imageOffsets = new ArrayList<Long>(); 
     191      ArrayList<int[]> imageLengths = new ArrayList<int[]>(); 
     192      ArrayList<Long> customDataOffsets = new ArrayList<Long>(); 
     193      ArrayList<int[]> customDataLengths = new ArrayList<int[]>(); 
    246194 
    247195      ByteArrayHandle xml = new ByteArrayHandle(); 
     
    354302      // parse XML blocks 
    355303 
    356       DefaultHandler handler = new ND2Handler(); 
    357  
    358304      String xmlString = new String(xml.getBytes(), 0, (int) xml.length()); 
    359305      xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ND2>" + 
     
    362308      core[0].dimensionOrder = ""; 
    363309 
     310      ND2Handler handler = new ND2Handler(core); 
    364311      XMLTools.parseXML(xmlString, handler); 
     312 
     313      isLossless = handler.isLossless(); 
     314      fieldIndex = handler.getFieldIndex(); 
     315      Hashtable<String, Object> globalMetadata = handler.getMetadata(); 
     316      for (String key : globalMetadata.keySet()) { 
     317        addGlobalMeta(key, globalMetadata.get(key)); 
     318      } 
     319 
     320      int numSeries = handler.getSeriesCount(); 
    365321 
    366322      // rearrange image data offsets 
     
    484440      } 
    485441 
    486       Vector<long[]> tmpOffsets = new Vector<long[]>(); 
     442      ArrayList<long[]> tmpOffsets = new ArrayList<long[]>(); 
    487443      for (int i=0; i<offsets.length; i++) { 
    488444        if (offsets[i][0] > 0) tmpOffsets.add(offsets[i]); 
     
    551507 
    552508      if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) { 
     509        posX = handler.getXPositions(); 
     510        posY = handler.getYPositions(); 
     511        posZ = handler.getZPositions(); 
     512 
    553513        if (customDataOffsets.size() > 0) { 
    554514          in.seek(customDataOffsets.get(0).longValue()); 
     
    593553      } 
    594554 
    595       populateMetadataStore(); 
     555      populateMetadataStore(handler); 
    596556      return; 
    597557    } 
     
    604564    LOGGER.info("Calculating image offsets"); 
    605565 
    606     Vector<Long> vs = new Vector<Long>(); 
     566    ArrayList<Long> vs = new ArrayList<Long>(); 
    607567 
    608568    long pos = in.getFilePointer(); 
     
    678638    LOGGER.info("Parsing XML"); 
    679639 
     640    ArrayList<Long> zs = new ArrayList<Long>(); 
     641    ArrayList<Long> ts = new ArrayList<Long>(); 
     642 
     643    int numSeries = 0; 
     644    ND2Handler handler = null; 
    680645    if (off > 0 && off < in.length() - 5 && (in.length() - off - 5) > 14) { 
    681646      in.seek(off + 4); 
     
    715680      LOGGER.info("Finished assembling XML string"); 
    716681 
    717       DefaultHandler handler = new ND2Handler(); 
    718  
    719682      // strip out invalid characters 
    720683      int offset = 0; 
     
    732695 
    733696      String xml = sb.toString().substring(offset, len - offset); 
     697      handler = new ND2Handler(core); 
    734698      XMLTools.parseXML(xml, handler); 
    735699      xml = null; 
     700 
     701      isLossless = handler.isLossless(); 
     702      fieldIndex = handler.getFieldIndex(); 
     703      zs = handler.getZSections(); 
     704      ts = handler.getTimepoints(); 
     705      numSeries = handler.getSeriesCount(); 
     706      Hashtable<String, Object> globalMetadata = handler.getMetadata(); 
     707      for (String key : globalMetadata.keySet()) { 
     708        addGlobalMeta(key, globalMetadata.get(key)); 
     709      } 
    736710    } 
    737711 
     
    810784    } 
    811785 
    812     populateMetadataStore(); 
     786    populateMetadataStore(handler); 
    813787  } 
    814788 
    815   // -- Helper class -- 
    816  
    817   /** SAX handler for parsing XML. */ 
    818   class ND2Handler extends DefaultHandler { 
    819     private String prefix = null; 
    820     private String prevRuntype = null; 
    821     private String prevElement = null; 
    822  
    823     public void endElement(String uri, String localName, String qName, 
    824       Attributes attributes) 
    825     { 
    826       if (qName.equals("CalibrationSeq") || qName.equals("MetadataSeq")) { 
    827         prefix = null; 
    828       } 
    829       if (qName.equals(prevElement)) { 
    830         prevElement = null; 
    831       } 
    832     } 
    833  
    834     public void startElement(String uri, String localName, String qName, 
    835       Attributes attributes) 
    836     { 
    837       if ("CLxListVariant".equals(attributes.getValue("runtype"))) { 
    838         prevElement = qName; 
    839       } 
    840  
    841       String value = attributes.getValue("value"); 
    842       if (qName.equals("uiWidth")) { 
    843         core[0].sizeX = Integer.parseInt(value); 
    844       } 
    845       else if (qName.equals("uiWidthBytes") || qName.equals("uiBpcInMemory")) { 
    846         int div = qName.equals("uiWidthBytes") ? getSizeX() : 8; 
    847         int bytes = Integer.parseInt(value) / div; 
    848  
    849         try { 
    850           core[0].pixelType = 
    851             FormatTools.pixelTypeFromBytes(bytes, false, false); 
    852         } 
    853         catch (FormatException e) { } 
    854         parseKeyAndValue(qName, value, prevRuntype); 
    855       } 
    856       else if ("dPosX".equals(prevElement) && qName.startsWith("item_")) { 
    857         posX.add(new Double(sanitizeDouble(value))); 
    858       } 
    859       else if ("dPosY".equals(prevElement) && qName.startsWith("item_")) { 
    860         posY.add(new Double(sanitizeDouble(value))); 
    861       } 
    862       else if ("dPosZ".equals(prevElement) && qName.startsWith("item_")) { 
    863         posZ.add(new Double(sanitizeDouble(value))); 
    864       } 
    865       else if (qName.startsWith("item_")) { 
    866         int v = Integer.parseInt(qName.substring(qName.indexOf("_") + 1)); 
    867         if (v == numSeries) { 
    868           fieldIndex = getDimensionOrder().length(); 
    869           numSeries++; 
    870         } 
    871       } 
    872       else if (qName.equals("uiCompCount")) { 
    873         int v = Integer.parseInt(value); 
    874         core[0].sizeC = (int) Math.max(getSizeC(), v); 
    875       } 
    876       else if (qName.equals("uiHeight")) { 
    877         core[0].sizeY = Integer.parseInt(value); 
    878       } 
    879       else if (qName.startsWith("TextInfo")) { 
    880         parseKeyAndValue(qName, attributes.getValue("Text"), prevRuntype); 
    881         parseKeyAndValue(qName, value, prevRuntype); 
    882       } 
    883       else if (qName.equals("dCompressionParam")) { 
    884         isLossless = Integer.parseInt(value) > 0; 
    885         parseKeyAndValue(qName, value, prevRuntype); 
    886       } 
    887       else if (qName.equals("CalibrationSeq") || qName.equals("MetadataSeq")) { 
    888         prefix = qName + " " + attributes.getValue("_SEQUENCE_INDEX"); 
    889       } 
    890       else if (qName.equals("HorizontalLine") || qName.equals("VerticalLine") || 
    891         qName.equals("Text")) 
    892       { 
    893         Hashtable<String, String> roi = new Hashtable<String, String>(); 
    894         roi.put("ROIType", qName); 
    895         for (int q=0; q<attributes.getLength(); q++) { 
    896           roi.put(attributes.getQName(q), attributes.getValue(q)); 
    897         } 
    898         rois.add(roi); 
    899       } 
    900       else if (qName.equals("dPinholeRadius")) { 
    901         pinholeSize = new Double(sanitizeDouble(value)); 
    902         addGlobalMeta("Pinhole size", value); 
    903       } 
    904       else { 
    905         StringBuffer sb = new StringBuffer(); 
    906         if (prefix != null) { 
    907           sb.append(prefix); 
    908           sb.append(" "); 
    909         } 
    910         sb.append(qName); 
    911         parseKeyAndValue(sb.toString(), value, prevRuntype); 
    912       } 
    913  
    914       prevRuntype = attributes.getValue("runtype"); 
    915     } 
    916   } 
    917  
    918789  // -- Helper methods -- 
    919790 
    920   private void populateMetadataStore() throws FormatException { 
     791  private void populateMetadataStore(ND2Handler handler) throws FormatException 
     792  { 
    921793    MetadataStore store = makeFilterMetadata(); 
    922794    MetadataTools.populatePixels(store, this, true); 
     
    942814    // populate Dimensions data 
    943815    for (int i=0; i<getSeriesCount(); i++) { 
    944       store.setPixelsPhysicalSizeX(pixelSizeX, i); 
    945       store.setPixelsPhysicalSizeY(pixelSizeY, i); 
    946       store.setPixelsPhysicalSizeZ(pixelSizeZ, i); 
     816      store.setPixelsPhysicalSizeX(handler.getPixelSizeX(), i); 
     817      store.setPixelsPhysicalSizeY(handler.getPixelSizeY(), i); 
     818      store.setPixelsPhysicalSizeZ(handler.getPixelSizeZ(), i); 
    947819    } 
    948820 
    949821    // populate PlaneTiming and StagePosition data 
     822    ArrayList<Double> exposureTime = handler.getExposureTimes(); 
    950823    for (int i=0; i<getSeriesCount(); i++) { 
    951824      if (tsT.size() > 0) { 
     
    964837        } 
    965838      } 
     839 
     840      if (posX == null) posX = handler.getXPositions(); 
     841      if (posY == null) posY = handler.getYPositions(); 
     842      if (posZ == null) posZ = handler.getZPositions(); 
     843 
    966844      for (int n=0; n<getImageCount(); n++) { 
    967845        int index = i * getImageCount() + n; 
     
    990868    String detectorID = MetadataTools.createLSID("Detector", 0, 0); 
    991869    store.setDetectorID(detectorID, 0, 0); 
    992     store.setDetectorModel(cameraModel, 0, 0); 
     870    store.setDetectorModel(handler.getCameraModel(), 0, 0); 
    993871    store.setDetectorType(getDetectorType("Other"), 0, 0); 
     872 
     873    ArrayList<String> channelNames = handler.getChannelNames(); 
     874    ArrayList<String> modality = handler.getModalities(); 
     875    ArrayList<String> binning = handler.getBinnings(); 
     876    ArrayList<Double> speed = handler.getSpeeds(); 
     877    ArrayList<Double> gain = handler.getGains(); 
     878    ArrayList<Double> temperature = handler.getTemperatures(); 
     879    ArrayList<Integer> exWave = handler.getExcitationWavelengths(); 
     880    ArrayList<Integer> emWave = handler.getEmissionWavelengths(); 
     881    ArrayList<Integer> power = handler.getPowers(); 
     882    ArrayList<Hashtable<String, String>> rois = handler.getROIs(); 
    994883 
    995884    for (int i=0; i<getSeriesCount(); i++) { 
    996885      for (int c=0; c<getEffectiveSizeC(); c++) { 
    997886        int index = i * getSizeC() + c; 
     887        Double pinholeSize = handler.getPinholeSize(); 
    998888        if (pinholeSize != null) { 
    999889          store.setChannelPinholeSize(pinholeSize, i, c); 
     
    1036926 
    1037927    // populate DetectorSettings 
     928    Double voltage = handler.getVoltage(); 
    1038929    if (voltage != null) { 
    1039       voltage = sanitizeDouble(voltage); 
    1040       store.setDetectorSettingsVoltage(new Double(voltage), 0, 0); 
     930      store.setDetectorSettingsVoltage(voltage, 0, 0); 
    1041931    } 
    1042932 
    1043933    // populate Objective 
     934    Double na = handler.getNumericalAperture(); 
    1044935    if (na != null) { 
    1045       na = sanitizeDouble(na); 
    1046       store.setObjectiveLensNA(new Double(na), 0, 0); 
    1047     } 
     936      store.setObjectiveLensNA(na, 0, 0); 
     937    } 
     938    Double mag = handler.getMagnification(); 
    1048939    if (mag != null) { 
    1049       mag = sanitizeDouble(mag); 
    1050       store.setObjectiveCalibratedMagnification(new Double(mag), 0, 0); 
    1051     } 
    1052     if (objectiveModel != null) { 
    1053       store.setObjectiveModel(objectiveModel, 0, 0); 
    1054     } 
     940      store.setObjectiveCalibratedMagnification(mag, 0, 0); 
     941    } 
     942    store.setObjectiveModel(handler.getObjectiveModel(), 0, 0); 
     943 
     944    String immersion = handler.getImmersion(); 
    1055945    if (immersion == null) immersion = "Other"; 
    1056946    store.setObjectiveImmersion(getImmersion(immersion), 0, 0); 
     947 
     948    String correction = handler.getCorrection(); 
    1057949    if (correction == null || correction.length() == 0) correction = "Other"; 
    1058950    store.setObjectiveCorrection(getCorrection(correction), 0, 0); 
     
    1062954    store.setObjectiveID(objectiveID, 0, 0); 
    1063955 
    1064     if (refractiveIndex != null) { 
    1065       refractiveIndex = sanitizeDouble(refractiveIndex); 
    1066     } 
     956    Double refractiveIndex = handler.getRefractiveIndex(); 
    1067957 
    1068958    for (int i=0; i<getSeriesCount(); i++) { 
    1069959      store.setImageObjectiveSettingsID(objectiveID, i); 
    1070960      if (refractiveIndex != null) { 
    1071         store.setImageObjectiveSettingsRefractiveIndex( 
    1072           new Double(refractiveIndex), i); 
     961        store.setImageObjectiveSettingsRefractiveIndex(refractiveIndex, i); 
    1073962      } 
    1074963    } 
     
    11201009  } 
    11211010 
    1122   private void parseKeyAndValue(String key, String value, String runtype) { 
    1123     if (key == null || value == null) return; 
    1124     addGlobalMeta(key, value); 
    1125     if (key.endsWith("dCalibration")) { 
    1126       pixelSizeX = Double.parseDouble(sanitizeDouble(value)); 
    1127       pixelSizeY = pixelSizeX; 
    1128     } 
    1129     else if (key.endsWith("dZStep")) { 
    1130       pixelSizeZ = Double.parseDouble(sanitizeDouble(value)); 
    1131     } 
    1132     else if (key.endsWith("Gain")) gain.add(new Double(sanitizeDouble(value))); 
    1133     else if (key.endsWith("dLampVoltage")) voltage = value; 
    1134     else if (key.endsWith("dObjectiveMag") && mag == null) mag = value; 
    1135     else if (key.endsWith("dObjectiveNA")) na = value; 
    1136     else if (key.endsWith("dRefractIndex1")) refractiveIndex = value; 
    1137     else if (key.equals("sObjective") || key.equals("wsObjectiveName")) { 
    1138       String[] tokens = value.split(" "); 
    1139       int magIndex = -1; 
    1140       for (int i=0; i<tokens.length; i++) { 
    1141         if (tokens[i].indexOf("x") != -1) { 
    1142           magIndex = i; 
    1143           break; 
    1144         } 
    1145       } 
    1146       StringBuffer s = new StringBuffer(); 
    1147       for (int i=0; i<magIndex; i++) { 
    1148         s.append(tokens[i]); 
    1149       } 
    1150       correction = s.toString(); 
    1151       if (magIndex >= 0) { 
    1152         mag = tokens[magIndex].substring(0, tokens[magIndex].indexOf("x")); 
    1153       } 
    1154       if (magIndex + 1 < tokens.length) immersion = tokens[magIndex + 1]; 
    1155     } 
    1156     else if (key.endsWith("dTimeMSec")) { 
    1157       long v = (long) Double.parseDouble(sanitizeDouble(value)); 
    1158       if (!ts.contains(new Long(v))) { 
    1159         ts.add(new Long(v)); 
    1160         addGlobalMeta("number of timepoints", ts.size()); 
    1161       } 
    1162     } 
    1163     else if (key.endsWith("dZPos")) { 
    1164       long v = (long) Double.parseDouble(sanitizeDouble(value)); 
    1165       if (!zs.contains(new Long(v))) { 
    1166         zs.add(new Long(v)); 
    1167       } 
    1168     } 
    1169     else if (key.endsWith("uiCount")) { 
    1170       if (runtype != null) { 
    1171         if (runtype.endsWith("ZStackLoop")) { 
    1172           if (getSizeZ() == 0) { 
    1173             core[0].sizeZ = Integer.parseInt(value); 
    1174             if (getDimensionOrder().indexOf("Z") == -1) { 
    1175               core[0].dimensionOrder = "Z" + getDimensionOrder(); 
    1176             } 
    1177           } 
    1178         } 
    1179         else if (runtype.endsWith("TimeLoop")) { 
    1180           if (getSizeT() == 0) { 
    1181             core[0].sizeT = Integer.parseInt(value); 
    1182             if (getDimensionOrder().indexOf("T") == -1) { 
    1183               core[0].dimensionOrder = "T" + getDimensionOrder(); 
    1184             } 
    1185           } 
    1186         } 
    1187       } 
    1188     } 
    1189     else if (key.endsWith("uiBpcSignificant")) { 
    1190       core[0].bitsPerPixel = Integer.parseInt(value); 
    1191     } 
    1192     else if (key.equals("VirtualComponents")) { 
    1193       if (getSizeC() == 0) { 
    1194         core[0].sizeC = Integer.parseInt(value); 
    1195         if (getDimensionOrder().indexOf("C") == -1) { 
    1196           core[0].dimensionOrder += "C" + getDimensionOrder(); 
    1197         } 
    1198       } 
    1199     } 
    1200     else if (key.startsWith("TextInfoItem") || key.endsWith("TextInfoItem")) { 
    1201       metadata.remove(key); 
    1202       value = value.replaceAll("&#x000d;&#x000a;", "\n"); 
    1203       StringTokenizer tokens = new StringTokenizer(value, "\n"); 
    1204       while (tokens.hasMoreTokens()) { 
    1205         String t = tokens.nextToken().trim(); 
    1206         if (t.startsWith("Dimensions:")) { 
    1207           t = t.substring(11); 
    1208           StringTokenizer dims = new StringTokenizer(t, " x "); 
    1209  
    1210           if (getSizeZ() == 0) core[0].sizeZ = 1; 
    1211           if (getSizeT() == 0) core[0].sizeT = 1; 
    1212           if (getSizeC() == 0) core[0].sizeC = 1; 
    1213  
    1214           while (dims.hasMoreTokens()) { 
    1215             String dim = dims.nextToken().trim(); 
    1216             int v = Integer.parseInt(dim.replaceAll("\\D", "")); 
    1217             v = (int) Math.max(v, 1); 
    1218             if (dim.startsWith("XY")) { 
    1219               numSeries = v; 
    1220               if (numSeries > 1) { 
    1221                 int x = getSizeX(); 
    1222                 int y = getSizeY(); 
    1223                 int z = getSizeZ(); 
    1224                 int tSize = getSizeT(); 
    1225                 int c = getSizeC(); 
    1226                 String order = getDimensionOrder(); 
    1227                 core = new CoreMetadata[numSeries]; 
    1228                 for (int i=0; i<numSeries; i++) { 
    1229                   core[i] = new CoreMetadata(); 
    1230                   core[i].sizeX = x; 
    1231                   core[i].sizeY = y; 
    1232                   core[i].sizeZ = z == 0 ? 1 : z; 
    1233                   core[i].sizeC = c == 0 ? 1 : c; 
    1234                   core[i].sizeT = tSize == 0 ? 1 : tSize; 
    1235                   core[i].dimensionOrder = order; 
    1236                 } 
    1237               } 
    1238             } 
    1239             else if (dim.startsWith("T")) { 
    1240               if (getSizeT() <= 1 || v < getSizeT()) { 
    1241                 core[0].sizeT = v; 
    1242               } 
    1243             } 
    1244             else if (dim.startsWith("Z")) { 
    1245               if (getSizeZ() <= 1) { 
    1246                 core[0].sizeZ = v; 
    1247               } 
    1248             } 
    1249             else if (getSizeC() <= 1) { 
    1250               core[0].sizeC = v; 
    1251             } 
    1252           } 
    1253  
    1254           core[0].imageCount = getSizeZ() * getSizeC() * getSizeT(); 
    1255         } 
    1256         else if (t.startsWith("Number of Picture Planes")) { 
    1257           core[0].sizeC = Integer.parseInt(t.replaceAll("\\D", "")); 
    1258         } 
    1259         else { 
    1260           String[] v = t.split(":"); 
    1261           if (v.length == 2) { 
    1262             v[1] = v[1].trim(); 
    1263             if (v[0].equals("Name")) { 
    1264               channelNames.add(v[1]); 
    1265             } 
    1266             else if (v[0].equals("Modality")) { 
    1267               modality.add(v[1]); 
    1268             } 
    1269             else if (v[0].equals("Camera Type")) { 
    1270               cameraModel = v[1]; 
    1271             } 
    1272             else if (v[0].equals("Binning")) { 
    1273               binning.add(v[1]); 
    1274             } 
    1275             else if (v[0].equals("Readout Speed")) { 
    1276               int last = v[1].lastIndexOf(" "); 
    1277               if (last != -1) v[1] = v[1].substring(0, last); 
    1278               speed.add(new Double(sanitizeDouble(v[1]))); 
    1279             } 
    1280             else if (v[0].equals("Temperature")) { 
    1281               String temp = v[1].replaceAll("[\\D&&[^-.]]", ""); 
    1282               temperature.add(new Double(sanitizeDouble(temp))); 
    1283             } 
    1284             else if (v[0].equals("Exposure")) { 
    1285               String[] s = v[1].trim().split(" "); 
    1286               try { 
    1287                 double time = Double.parseDouble(sanitizeDouble(s[0])); 
    1288                 // TODO: check for other units 
    1289                 if (s[1].equals("ms")) time /= 1000; 
    1290                 exposureTime.add(new Double(time)); 
    1291               } 
    1292               catch (NumberFormatException e) { } 
    1293             } 
    1294             else if (v[0].equals("{Pinhole Size}")) { 
    1295               pinholeSize = new Double(sanitizeDouble(v[1])); 
    1296               addGlobalMeta("Pinhole size", v[1]); 
    1297             } 
    1298           } 
    1299           else if (v[0].startsWith("- Step")) { 
    1300             int space = v[0].indexOf(" ", v[0].indexOf("Step") + 1); 
    1301             int last = v[0].indexOf(" ", space + 1); 
    1302             if (last == -1) last = v[0].length(); 
    1303             pixelSizeZ = 
    1304               Double.parseDouble(sanitizeDouble(v[0].substring(space, last))); 
    1305           } 
    1306           else if (v[0].equals("Line")) { 
    1307             String[] values = t.split(";"); 
    1308             for (int q=0; q<values.length; q++) { 
    1309               int colon = values[q].indexOf(":"); 
    1310               if (colon < 0) continue; 
    1311               String nextKey = values[q].substring(0, colon).trim(); 
    1312               String nextValue = values[q].substring(colon + 1).trim(); 
    1313               if (nextKey.equals("Emission wavelength")) { 
    1314                 emWave.add(new Integer(nextValue)); 
    1315               } 
    1316               else if (nextKey.equals("Excitation wavelength")) { 
    1317                 exWave.add(new Integer(nextValue)); 
    1318               } 
    1319               else if (nextKey.equals("Power")) { 
    1320                 nextValue = sanitizeDouble(nextValue); 
    1321                 power.add(new Integer((int) Double.parseDouble(nextValue))); 
    1322               } 
    1323             } 
    1324           } 
    1325           else if (v.length > 1) { 
    1326             v[0] = v[0].replace('{', ' '); 
    1327             v[0] = v[0].replace('}', ' '); 
    1328             addGlobalMeta(v[0].trim(), v[1]); 
    1329           } 
    1330         } 
    1331       } 
    1332     } 
    1333   } 
    1334  
    1335   private String sanitizeDouble(String value) { 
    1336     value = value.replaceAll("[^0-9,\\.]", ""); 
    1337     char separator = new DecimalFormatSymbols().getDecimalSeparator(); 
    1338     if (value.indexOf(separator) == -1) { 
    1339       char usedSeparator = separator == '.' ? ',' : '.'; 
    1340       value = value.replace(usedSeparator, separator); 
    1341       try { 
    1342         Double.parseDouble(value); 
    1343       } 
    1344       catch (Exception e) { 
    1345         value = value.replace(separator, usedSeparator); 
    1346       } 
    1347     } 
    1348     return value; 
    1349   } 
    1350  
    13511011  private Codec createCodec(boolean isJPEG) { 
    13521012    return isJPEG ? new JPEG2000Codec() : new ZlibCodec(); 
Note: See TracChangeset for help on using the changeset viewer.