Changeset 4165


Ignore:
Timestamp:
07/07/08 13:42:13 (12 years ago)
Author:
melissa
Message:

Added support for MINC MRI format. Moved all NetCDF reflection logic into loci.formats.NetcdfTools.

Location:
trunk/loci/formats
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/in/ImarisHDFReader.java

    r4132 r4165  
    3939public class ImarisHDFReader extends FormatReader { 
    4040 
    41   // -- Constants -- 
    42  
    43   private static final String NO_NETCDF_MSG = 
    44     "NetCDF is required to read Imaris 5.5 files.  Please obtain " + 
    45     "the necessary JAR files from http://loci.wisc.edu/ome/formats.html"; 
    46  
    47   // -- Static fields -- 
    48  
    49   private static boolean noNetCDF = false; 
    50   private static ReflectedUniverse r = createReflectedUniverse(); 
    51  
    52   private static ReflectedUniverse createReflectedUniverse() { 
    53     r = null; 
    54     try { 
    55       r = new ReflectedUniverse(); 
    56       r.exec("import ucar.ma2.Array"); 
    57       r.exec("import ucar.ma2.ArrayByte"); 
    58       r.exec("import ucar.nc2.Attribute"); 
    59       r.exec("import ucar.nc2.Group"); 
    60       r.exec("import ucar.nc2.NetcdfFile"); 
    61     } 
    62     catch (ReflectException exc) { 
    63       noNetCDF = true; 
    64       if (debug) LogTools.trace(exc); 
    65     } 
    66     catch (UnsupportedClassVersionError exc) { 
    67       noNetCDF = true; 
    68       if (debug) LogTools.trace(exc); 
    69     } 
    70     return r; 
    71   } 
    72  
    7341  // -- Fields -- 
    7442 
     
    7644  private Object previousImage; 
    7745  private int previousImageNumber; 
    78   private Vector channelParameters; 
    7946  private float pixelSizeX, pixelSizeY, pixelSizeZ; 
    8047  private float minX, minY, minZ, maxX, maxY, maxZ; 
    8148  private int seriesCount; 
     49  private NetcdfTools netcdf; 
     50 
     51  // channel parameters 
     52  private Vector emWave, exWave, channelMin, channelMax; 
     53  private Vector gain, pinhole, channelName, microscopyMode; 
    8254 
    8355  // -- Constructor -- 
     
    8860    blockCheckLen = 8; 
    8961    suffixSufficient = false; 
    90  
    91     // HACK - NetCDF prints a fair number of warning messages to stdout 
    92     // we need to filter these out so that they don't interfere with omebf 
    93     PrintStream out = new PrintStream(System.out) { 
    94       public void print(String s) { 
    95         if (s == null || !s.trim().startsWith("WARN:")) super.print(s); 
    96       } 
    97       public void println(String s) { 
    98         if (s == null || !s.trim().startsWith("WARN:")) super.println(s); 
    99       } 
    100     }; 
    101     System.setOut(out); 
    10262  } 
    10363 
     
    12989    if (zct[1] != oldZCT[1] || zct[2] != oldZCT[2] || series != previousSeries) 
    13090    { 
    131       try { 
    132         r.exec("ncfile = NetcdfFile.open(currentId)"); 
    133         r.exec("g = ncfile.getRootGroup()"); 
    134         findGroup("DataSet", "g", "g"); 
    135         findGroup("ResolutionLevel_" + series, "g", "g"); 
    136         findGroup("TimePoint_" + zct[2], "g", "g"); 
    137         findGroup("Channel_" + zct[1], "g", "g"); 
    138         r.setVar("name", "Data"); 
    139         r.exec("var = g.findVariable(name)"); 
    140         r.exec("pixelData = var.read()"); 
    141         r.exec("data = pixelData.copyToNDJavaArray()"); 
    142         previousImage = r.getVar("data"); 
    143       } 
    144       catch (ReflectException exc) { 
    145         if (debug) LogTools.trace(exc); 
    146         return null; 
    147       } 
     91      previousImage = netcdf.getVariableValue("/DataSet/ResolutionLevel_" + 
     92        series + "/TimePoint_" + zct[2] + "/Channel_" + zct[1] + "/Data"); 
    14893    } 
    14994    previousImageNumber = no; 
     
    191136    previousImage = null; 
    192137    seriesCount = 0; 
    193     channelParameters = null; 
    194138    pixelSizeX = pixelSizeY = pixelSizeZ = 0; 
    195139    minX = minY = minZ = maxX = maxY = maxZ = 0; 
    196140 
    197     try { 
    198       r.exec("ncfile.close()"); 
    199     } 
    200     catch (ReflectException e) { 
    201       if (debug) LogTools.trace(e); 
    202     } 
     141    if (netcdf != null) netcdf.close(); 
     142    netcdf = null; 
    203143  } 
    204144 
     
    209149    super.initFile(id); 
    210150 
    211     if (noNetCDF) throw new FormatException(NO_NETCDF_MSG); 
     151    netcdf = new NetcdfTools(id); 
    212152 
    213153    pixelSizeX = pixelSizeY = pixelSizeZ = 1.0f; 
     154 
     155    emWave = new Vector(); 
     156    exWave = new Vector(); 
     157    channelMin = new Vector(); 
     158    channelMax = new Vector(); 
     159    gain = new Vector(); 
     160    pinhole = new Vector(); 
     161    channelName = new Vector(); 
     162    microscopyMode = new Vector(); 
    214163 
    215164    seriesCount = 0; 
     
    219168      new FilterMetadata(getMetadataStore(), isMetadataFiltered()); 
    220169 
    221     // initialize the file 
    222  
    223     try { 
    224       r.setVar("currentId", Location.getMappedId(id)); 
    225       r.exec("ncfile = NetcdfFile.open(currentId)"); 
    226       r.exec("root = ncfile.getRootGroup()"); 
    227     } 
    228     catch (ReflectException exc) { 
    229       if (debug) LogTools.trace(exc); 
    230     } 
    231  
    232     getValue("root", "ImarisDataSet"); 
    233     getValue("root", "ImarisVersion"); 
    234  
    235170    // read all of the metadata key/value pairs 
    236171 
    237     findGroup("DataSetInfo", "root", "dataSetInfo"); 
    238     findGroup("DataSet", "root", "dataSet"); 
    239  
    240     channelParameters = new Vector(); 
    241  
    242     try { 
    243       List l = new Vector(); 
    244       l.add(r.getVar("dataSetInfo")); 
    245       parseGroups(l); 
    246       l.clear(); 
    247       l.add(r.getVar("dataSet")); 
    248       parseGroups(l); 
    249     } 
    250     catch (ReflectException exc) { 
    251       if (debug) LogTools.trace(exc); 
     172    Vector attributes = netcdf.getAttributeList(); 
     173    for (int i=0; i<attributes.size(); i++) { 
     174      String attr = (String) attributes.get(i); 
     175      String name = attr.substring(attr.lastIndexOf("/") + 1); 
     176      String value = netcdf.getAttributeValue(attr); 
     177      if (value == null) continue; 
     178      value = value.trim(); 
     179 
     180      if (name.equals("X")) { 
     181        core.sizeX[0] = Integer.parseInt(value); 
     182      } 
     183      else if (name.equals("Y")) { 
     184        core.sizeY[0] = Integer.parseInt(value); 
     185      } 
     186      else if (name.equals("Z")) { 
     187        core.sizeZ[0] = Integer.parseInt(value); 
     188      } 
     189      else if (name.equals("FileTimePoints")) { 
     190        core.sizeT[0] = Integer.parseInt(value); 
     191      } 
     192      else if (name.equals("RecordingEntrySampleSpacing")) { 
     193        pixelSizeX = Float.parseFloat(value); 
     194      } 
     195      else if (name.equals("RecordingEntryLineSpacing")) { 
     196        pixelSizeY = Float.parseFloat(value); 
     197      } 
     198      else if (name.equals("RecordingEntryPlaneSpacing")) { 
     199        pixelSizeZ = Float.parseFloat(value); 
     200      } 
     201      else if (name.equals("ExtMax0")) maxX = Float.parseFloat(value); 
     202      else if (name.equals("ExtMax1")) maxY = Float.parseFloat(value); 
     203      else if (name.equals("ExtMax2")) maxZ = Float.parseFloat(value); 
     204      else if (name.equals("ExtMin0")) minX = Float.parseFloat(value); 
     205      else if (name.equals("ExtMin1")) minY = Float.parseFloat(value); 
     206      else if (name.equals("ExtMin2")) minZ = Float.parseFloat(value); 
     207 
     208      if (attr.startsWith("/DataSet/ResolutionLevel_")) { 
     209        int slash = attr.indexOf("/", 25); 
     210        int n = Integer.parseInt(attr.substring(25, slash == -1 ? 
     211          attr.length() : slash)); 
     212        if (n == seriesCount) seriesCount++; 
     213      } 
     214 
     215      if (attr.startsWith("/DataSetInfo/Channel_")) { 
     216        if (value.indexOf(" ") != -1) { 
     217          value = value.substring(value.indexOf(" ") + 1); 
     218        } 
     219        if (value.indexOf("-") != -1) { 
     220          value = value.substring(value.indexOf("-") + 1); 
     221        } 
     222        if (value.indexOf(".") != -1) { 
     223          value = value.substring(0, value.indexOf(".")); 
     224        } 
     225 
     226        int underscore = attr.indexOf("_") + 1; 
     227        int cIndex = Integer.parseInt(attr.substring(underscore, 
     228          attr.indexOf("/", underscore))); 
     229        if (cIndex == core.sizeC[0]) core.sizeC[0]++; 
     230 
     231        if (name.equals("Gain")) gain.add(value); 
     232        else if (name.equals("LSMEmissionWavelength")) emWave.add(value); 
     233        else if (name.equals("LSMExcitationWavelength")) exWave.add(value); 
     234        else if (name.equals("Max")) channelMax.add(value); 
     235        else if (name.equals("Min")) channelMin.add(value); 
     236        else if (name.equals("Pinhole")) pinhole.add(value); 
     237        else if (name.equals("Name")) channelName.add(value); 
     238        else if (name.equals("MicroscopyMode")) microscopyMode.add(value); 
     239      } 
     240 
     241      if (value != null) addMeta(name, value); 
    252242    } 
    253243 
     
    266256 
    267257      for (int i=1; i<seriesCount; i++) { 
    268         findGroup("ResolutionLevel_" + i, "dataSet", "g"); 
    269         findGroup("TimePoint_0", "g", "g"); 
    270         findGroup("Channel_0", "g", "g"); 
    271         core.sizeX[i] = Integer.parseInt(getValue("g", "ImageSizeX")); 
    272         core.sizeY[i] = Integer.parseInt(getValue("g", "ImageSizeY")); 
    273         core.sizeZ[i] = Integer.parseInt(getValue("g", "ImageSizeZ")); 
     258        String group = 
     259          "/DataSet/ResolutionLevel_" + i + "/TimePoint_0/Channel_0"; 
     260        core.sizeX[i] = 
     261          Integer.parseInt(netcdf.getAttributeValue(group + "/ImageSizeX")); 
     262        core.sizeY[i] = 
     263          Integer.parseInt(netcdf.getAttributeValue(group + "/ImageSizeY")); 
     264        core.sizeZ[i] = 
     265          Integer.parseInt(netcdf.getAttributeValue(group + "/ImageSizeZ")); 
    274266        core.imageCount[i] = core.sizeZ[i] * core.sizeC[0] * core.sizeT[0]; 
    275267      } 
     
    280272    // to check the pixels themselves 
    281273 
    282     try { 
    283       findGroup("ResolutionLevel_0", "dataSet", "g"); 
    284       findGroup("TimePoint_0", "g", "g"); 
    285       findGroup("Channel_0", "g", "g"); 
    286       r.setVar("name", "Data"); 
    287       r.exec("var = g.findVariable(name)"); 
    288       r.exec("pixelData = var.read()"); 
    289       r.exec("data = pixelData.copyToNDJavaArray()"); 
    290       Object pix = r.getVar("data"); 
    291       if (pix instanceof byte[][][]) { 
    292         Arrays.fill(core.pixelType, FormatTools.UINT8); 
    293       } 
    294       else if (pix instanceof short[][][]) { 
    295         Arrays.fill(core.pixelType, FormatTools.UINT16); 
    296       } 
    297       else if (pix instanceof int[][][]) { 
    298         Arrays.fill(core.pixelType, FormatTools.UINT32); 
    299       } 
    300       else if (pix instanceof float[][][]) { 
    301         Arrays.fill(core.pixelType, FormatTools.FLOAT); 
    302       } 
    303     } 
    304     catch (ReflectException exc) { 
    305       if (debug) LogTools.trace(exc); 
     274    Object pix = netcdf.getVariableValue( 
     275      "/DataSet/ResolutionLevel_0/TimePoint_0/Channel_0/Data"); 
     276    if (pix instanceof byte[][][]) { 
     277      Arrays.fill(core.pixelType, FormatTools.UINT8); 
     278    } 
     279    else if (pix instanceof short[][][]) { 
     280      Arrays.fill(core.pixelType, FormatTools.UINT16); 
     281    } 
     282    else if (pix instanceof int[][][]) { 
     283      Arrays.fill(core.pixelType, FormatTools.UINT32); 
     284    } 
     285    else if (pix instanceof float[][][]) { 
     286      Arrays.fill(core.pixelType, FormatTools.FLOAT); 
    306287    } 
    307288 
     
    326307    } 
    327308 
     309    int cIndex = 0; 
    328310    for (int s=0; s<seriesCount; s++) { 
    329311      store.setImageName("Resolution Level " + s, s); 
    330312      MetadataTools.setDefaultCreationDate(store, id, s); 
    331313      for (int i=0; i<core.sizeC[s]; i++) { 
    332         String[] params = (String[]) channelParameters.get(i); 
    333  
    334314        Float gainValue = null; 
    335         try { gainValue = new Float(params[0]); } 
    336         catch (NumberFormatException e) { } 
    337         catch (NullPointerException e) { } 
    338         Integer pinholeValue = null, emWaveValue = null, exWaveValue = null; 
    339         try { pinholeValue = new Integer(params[5]); } 
    340         catch (NumberFormatException e) { } 
    341         catch (NullPointerException e) { } 
    342         try { 
    343           if (params[1].indexOf("-") != -1) { 
    344             params[1] = params[1].substring(params[1].indexOf("-") + 1); 
    345           } 
    346           emWaveValue = new Integer(params[1]); 
    347         } 
    348         catch (NumberFormatException e) { } 
    349         catch (NullPointerException e) { } 
    350         try { 
    351           if (params[2].indexOf("-") != -1) { 
    352             params[2] = params[2].substring(params[2].indexOf("-") + 1); 
    353           } 
    354           exWaveValue = new Integer(params[2]); 
    355         } 
    356         catch (NumberFormatException e) { } 
    357         catch (NullPointerException e) { } 
     315        Integer pinholeValue = null, emWaveValue = null, exWaveValue; 
     316 
     317        if (cIndex < gain.size()) { 
     318          try { 
     319            gainValue = new Float((String) gain.get(cIndex)); 
     320          } 
     321          catch (NumberFormatException e) { 
     322            if (debug) LogTools.trace(e); 
     323          } 
     324        } 
     325        if (cIndex < pinhole.size()) { 
     326          try { 
     327            pinholeValue = new Integer((String) pinhole.get(cIndex)); 
     328          } 
     329          catch (NumberFormatException e) { 
     330            if (debug) LogTools.trace(e); 
     331          } 
     332        } 
     333        if (cIndex < emWave.size()) { 
     334          try { 
     335            emWaveValue = new Integer((String) emWave.get(cIndex)); 
     336          } 
     337          catch (NumberFormatException e) { 
     338            if (debug) LogTools.trace(e); 
     339          } 
     340        } 
     341        if (cIndex < exWave.size()) { 
     342          try { 
     343            exWaveValue = new Integer((String) exWave.get(cIndex)); 
     344          } 
     345          catch (NumberFormatException e) { 
     346            if (debug) LogTools.trace(e); 
     347          } 
     348        } 
    358349 
    359350        // CHECK 
    360351        /* 
    361         store.setLogicalChannelName(params[6], s, i); 
     352        store.setLogicalChannelName((String) channelName.get(cIndex), s, i); 
    362353        store.setDetectorSettingsGain(gainValue, s, i); 
    363354        store.setLogicalChannelPinholeSize(pinholeValue, s, i); 
    364         store.setLogicalChannelMode(params[7], s, i); 
     355        store.setLogicalChannelMode((String) microscopyMode.get(cIndex), s, i); 
    365356        store.setLogicalChannelEmWave(emWaveValue, s, i); 
    366357        store.setLogicalChannelExWave(exWaveValue, s, i); 
     
    368359 
    369360        Double minValue = null, maxValue = null; 
    370         try { minValue = new Double(params[4]); } 
    371         catch (NumberFormatException exc) { } 
    372         catch (NullPointerException exc) { } 
    373         try { maxValue = new Double(params[3]); } 
    374         catch (NumberFormatException exc) { } 
    375         catch (NullPointerException exc) { } 
     361 
     362        if (cIndex < channelMin.size()) { 
     363          try { 
     364            minValue = new Double((String) channelMin.get(cIndex)); 
     365          } 
     366          catch (NumberFormatException e) { 
     367            if (debug) LogTools.trace(e); 
     368          } 
     369        } 
     370        if (cIndex < channelMax.size()) { 
     371          try { 
     372            maxValue = new Double((String) channelMax.get(cIndex)); 
     373          } 
     374          catch (NumberFormatException e) { 
     375            if (debug) LogTools.trace(e); 
     376          } 
     377        } 
    376378 
    377379        // CTR CHECK 
     
    380382//          store.setChannelGlobalMinMax(i, minValue, maxValue, new Integer(s)); 
    381383//        } 
    382       } 
    383     } 
    384   } 
    385  
    386   // -- Helper methods -- 
    387  
    388   private String getValue(String group, String name) { 
    389     try { 
    390       r.setVar("name", name); 
    391       r.exec("attribute = " + group + ".findAttribute(name)"); 
    392       if (r.getVar("attribute") == null) return null; 
    393       r.exec("isString = attribute.isString()"); 
    394       if (!((Boolean) r.getVar("isString")).booleanValue()) return null; 
    395       r.exec("array = attribute.getValues()"); 
    396       r.exec("s = array.copyTo1DJavaArray()"); 
    397       Object[] s = (Object[]) r.getVar("s"); 
    398       StringBuffer sb = new StringBuffer(); 
    399       for (int i=0; i<s.length; i++) { 
    400         sb.append((String) s[i]); 
    401       } 
    402       String st = sb.toString(); 
    403  
    404       if (name.equals("X")) { 
    405         core.sizeX[0] = Integer.parseInt(st.trim()); 
    406       } 
    407       else if (name.equals("Y")) { 
    408         core.sizeY[0] = Integer.parseInt(st.trim()); 
    409       } 
    410       else if (name.equals("Z")) { 
    411         core.sizeZ[0] = Integer.parseInt(st.trim()); 
    412       } 
    413       else if (name.equals("FileTimePoints")) { 
    414         core.sizeT[0] = Integer.parseInt(st.trim()); 
    415       } 
    416       else if (name.equals("RecordingEntrySampleSpacing")) { 
    417         pixelSizeX = Float.parseFloat(st.trim()); 
    418       } 
    419       else if (name.equals("RecordingEntryLineSpacing")) { 
    420         pixelSizeY = Float.parseFloat(st.trim()); 
    421       } 
    422       else if (name.equals("RecordingEntryPlaneSpacing")) { 
    423         pixelSizeZ = Float.parseFloat(st.trim()); 
    424       } 
    425       else if (name.equals("ExtMax0")) maxX = Float.parseFloat(st.trim()); 
    426       else if (name.equals("ExtMax1")) maxY = Float.parseFloat(st.trim()); 
    427       else if (name.equals("ExtMax2")) maxZ = Float.parseFloat(st.trim()); 
    428       else if (name.equals("ExtMin0")) minX = Float.parseFloat(st.trim()); 
    429       else if (name.equals("ExtMin1")) minY = Float.parseFloat(st.trim()); 
    430       else if (name.equals("ExtMin2")) minZ = Float.parseFloat(st.trim()); 
    431  
    432       if (st != null) addMeta(name, st); 
    433       return st; 
    434     } 
    435     catch (ReflectException exc) { 
    436       if (debug) LogTools.trace(exc); 
    437     } 
    438     return null; 
    439   } 
    440  
    441   /** 
    442    * Look for a group of the given name within the given parent group. 
    443    * Stores the resulting group object in a variable whose name is the 
    444    * value of 'store'. 
    445    */ 
    446   private Object findGroup(String name, String parent, String store) { 
    447     try { 
    448       r.setVar("name", name); 
    449       r.exec(store + " = " + parent + ".findGroup(name)"); 
    450       return r.getVar(store); 
    451     } 
    452     catch (ReflectException exc) { 
    453       if (debug) LogTools.trace(exc); 
    454     } 
    455     return null; 
    456   } 
    457  
    458   private void parseGroups(List groups) throws ReflectException { 
    459     for (int i=0; i<groups.size(); i++) { 
    460       r.setVar("group", groups.get(i)); 
    461       r.exec("groupName = group.getName()"); 
    462       String groupName = (String) r.getVar("groupName"); 
    463       if (debug) LogTools.println("Parsing group: " + groupName); 
    464  
    465       if (groupName.startsWith("/DataSet/ResolutionLevel_")) { 
    466         int slash = groupName.indexOf("/", 25); 
    467         int n = Integer.parseInt(groupName.substring(25, 
    468           slash == -1 ? groupName.length() : slash)); 
    469         if (n == seriesCount) seriesCount++; 
    470       } 
    471  
    472       r.exec("attributes = group.getAttributes()"); 
    473       List l = (List) r.getVar("attributes"); 
    474       String[] params = new String[8]; 
    475       for (int j=0; j<l.size(); j++) { 
    476         r.setVar("attr", l.get(j)); 
    477         r.exec("name = attr.getName()"); 
    478         String name = (String) r.getVar("name"); 
    479         String v = getValue("group", (String) r.getVar("name")); 
    480         if (groupName.startsWith("/DataSetInfo/Channel_")) { 
    481           if (name.equals("Gain")) params[0] = v; 
    482           else if (name.equals("LSMEmissionWavelength")) params[1] = v; 
    483           else if (name.equals("LSMExcitationWavelength")) params[2] = v; 
    484           else if (name.equals("Max")) { 
    485             params[3] = v; 
    486           } 
    487           else if (name.equals("Min")) { 
    488             params[4] = v; 
    489           } 
    490           else if (name.equals("Pinhole")) params[5] = v; 
    491           else if (name.equals("Name")) params[6] = v; 
    492           else if (name.equals("MicroscopyMode")) params[7] = v; 
    493         } 
    494       } 
    495  
    496       if (groupName.indexOf("/Channel_") != -1) { 
    497         int ndx = groupName.indexOf("/Channel_") + 9; 
    498         int end = groupName.indexOf("/", ndx); 
    499         if (end == -1) end = groupName.length(); 
    500         int n = Integer.parseInt(groupName.substring(ndx, end)); 
    501         if (n == core.sizeC[0]) { 
    502           for (int j=0; j<6; j++) { 
    503             if (params[j] != null) { 
    504               if (params[j].indexOf(" ") != -1) { 
    505                 params[j] = params[j].substring(params[j].indexOf(" ") + 1); 
    506               } 
    507               if (params[j].indexOf("-") != -1) { 
    508                 params[j] = params[j].substring(params[j].indexOf("-") + 1); 
    509               } 
    510               if (params[j].indexOf(".") != -1) { 
    511                 params[j] = params[j].substring(0, params[j].indexOf(".")); 
    512               } 
    513             } 
    514           } 
    515  
    516           channelParameters.add(params); 
    517           core.sizeC[0]++; 
    518         } 
    519       } 
    520  
    521       r.exec("groups = group.getGroups()"); 
    522       parseGroups((List) r.getVar("groups")); 
     384        cIndex++; 
     385      } 
    523386    } 
    524387  } 
  • trunk/loci/formats/readers.txt

    r4140 r4165  
    5959loci.formats.in.FEIReader             # img 
    6060loci.formats.in.NAFReader             # naf 
     61loci.formats.in.MINCReader            # mnc 
    6162 
    6263# multi-extension messes 
Note: See TracChangeset for help on using the changeset viewer.