Changeset 3959


Ignore:
Timestamp:
04/18/08 17:44:13 (12 years ago)
Author:
curtis
Message:

Progress on metadata store autogenerator. MetadataStore/MetadataRetrieve API
should be stable, but OME-XML metadata stores are still not ready.

Location:
trunk/loci/formats/auto
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/auto/EntityList.java

    r3917 r3959  
    4343 * |  |   \- subPackage = ome 
    4444 * |  |   \- version = 2007-06 
    45  * |  |   \- legacy = false 
    4645 * |  |--+ 200802 
    4746 * |  |   ... 
     
    225224  public void setEntity(String entity) { 
    226225    ent = entity; 
     226    prop = null; 
    227227  } 
    228228 
  • trunk/loci/formats/auto/MetaEntityList.java

    r3934 r3959  
    6666  public String version() { return value("version"); } 
    6767 
    68   public boolean legacy() { return "true".equals(value("legacy")); } 
    69  
    7068  // -- MetaEntityList API methods - entities -- 
    7169 
     
    7573  public String path() { return value("path"); } 
    7674 
     75  public String defaultPath() { return value("path", null, ent, prop); } 
     76 
    7777  /** List of nodes in the path, with markup symbols. Derived from path. */ 
    7878  public String[] pathNodes() { return path().split("\\/"); } 
     
    9090  public String indicesList(boolean doTypes, boolean doVars, boolean doLast) { 
    9191    return indicesList(path(), doTypes, doVars, doLast); 
     92  } 
     93 
     94  public String defaultIndicesList(boolean doTypes, boolean doVars, boolean doLast) { 
     95    return indicesList(defaultPath(), doTypes, doVars, doLast); 
    9296  } 
    9397 
     
    114118      } 
    115119    } 
     120    Collections.sort(unique); 
    116121    return unique; 
    117122  } 
     
    121126  public String type() { return value("type"); } 
    122127 
    123   /** Conversion method to call, if any. Derived from type. */ 
    124   public String convert() { 
    125     String type = type(); 
    126     String defaultType = value("type", null, ent, prop); 
    127     if (type.equals(defaultType)) return null; 
    128     return type + "To" + defaultType; 
    129   } 
     128  public String defaultType() { return value("type", null, ent, prop); } 
    130129 
    131130  public String getter() { 
    132131    String getter = value("getter"); 
    133     return getter == null ? "get" + name() : getter; 
    134   } 
    135  
    136   public String setter() { 
     132    String s = getter == null ? "get" + name() : getter; 
     133 
     134    // inject conversion method if needed 
     135    String type = type(); 
     136    String defaultType = defaultType(); 
     137    if (type.equals(defaultType)) s = s + "()"; 
     138    else s = var(type) + "To" + defaultType + "(" + s + "())"; 
     139    return s; 
     140  } 
     141 
     142  public String setter(String value) { 
    137143    String setter = value("setter"); 
    138     return setter == null ? "set" + name() : setter; 
     144    String s = setter == null ? "set" + name() : setter; 
     145 
     146    // inject conversion method if needed 
     147    String type = type(); 
     148    String defaultType = defaultType(); 
     149    if (type.equals(defaultType)) s = s + "(" + value + ")"; 
     150    else s = s + "(" + var(defaultType) + "To" + type + "(" + value + "))"; 
     151    return s; 
    139152  } 
    140153 
     
    199212    StringBuffer sb = new StringBuffer(); 
    200213    Vector<String> indices = indices(path); 
    201     if (!doLast) indices.remove(indices.size() - 1); // ignore last element 
     214    if (!doLast && indices.size() > 0) { 
     215      indices.remove(indices.size() - 1); // ignore last element 
     216    } 
    202217    boolean first = true; 
    203218    for (String index : indices) { 
  • trunk/loci/formats/auto/OMEXMLMetadata.vm

    r3934 r3959  
    8888#foreach ($entity in $q.entities()) 
    8989#set ($dummy = $q.setEntity($entity)) 
    90 #if ($entity.countable()) 
     90#if ($q.countable()) 
    9191#set ($last = $q.last()) 
    9292 
    93   /* @see loci.formats.meta.MetadataRetrieve#get$entity.name()Count($entity.indicesList(true, false, false)) */ 
    94   public int get$entity.name()Count($entity.indicesList(true, true, false)) { 
    95     if (true) return 0;//TEMP! 
     93  /* @see loci.formats.meta.MetadataRetrieve#get${entity}Count($q.indicesList(true, false, false)) */ 
     94  public int get${entity}Count($q.indicesList(true, true, false)) { 
     95    return 0;//TEMP 
     96/* 
    9697#if ($q.path() == "-") 
    97     // NB: $entity.name() unsupported for schema version $version 
     98    // NB: $entity unsupported for schema version $q.version() 
    9899    return -1; 
    99100#else 
     
    103104    return -1; 
    104105#end##if "-" 
     106*/ 
    105107  } 
    106108#end##if countable 
     
    116118#foreach ($prop in $q.props()) 
    117119#set ($dummy = $q.setProperty($prop)) 
    118 #set ($convert = $q.convert()) 
    119 #set ($var = $q.var($q.last())) 
    120 #set ($get = $q.getter()); 
    121  
    122   /* @see loci.formats.meta.MetadataRetrieve#get$entity$prop$q.indicesList(true, false)) */ 
    123   public $q.type() get$entity$prop($q.indicesList(true, true)) { 
     120 
     121  /* @see loci.formats.meta.MetadataRetrieve#get$entity$prop($q.defaultIndicesList(true, false, true)) */ 
     122  public $q.defaultType() get$entity$prop($q.defaultIndicesList(true, true, true)) { 
    124123#if ($q.path() == "-") 
    125124    // NB: $prop unsupported for schema version $q.version() 
    126125    return null; 
    127126#else 
    128     ${last}Node $lastVar = get${last}Node($entity.indicesList(false, true), false); 
    129 #if ($convert != null) 
    130     return $lastVar == null ? null : $convert(${lastVar}.$q.getter()); $lastVar${mappedName}To$q.type()(${lastVar}.$mappedPrefix$mappedName()); 
    131 #else 
    132     return $lastVar == null ? null : ${lastVar}.$mappedPrefix$mappedName(); 
    133 #end##if $convert 
     127    ${last}Node $lastVar = get${last}Node($q.indicesList(false, true), false); 
     128    return $lastVar == null ? null : ${lastVar}.$q.getter(); 
    134129#end##if "-" 
    135130  } 
     
    170165    this.root = (OMENode) root; 
    171166  } 
    172 #foreach ($entity in $entities) 
    173 #set ($last = $entity.last($versionKey)) 
    174 #set ($lastVar = $entity.lastVar($versionKey)) 
    175  
    176   // - $entity.name() property storage - 
    177 #foreach ($prop in $entity.props()) 
    178 #set ($varName = $prop.varName()) 
    179 #set ($mappedName = $prop.mappedName($versionKey)) 
    180 #set ($convert = $mappedName.endsWith("%")) 
    181 #set ($mappedName = $mappedName.replaceAll("%", "")) 
    182  
    183   /* @see loci.formats.meta.MetadataStore#set$entity$prop($q.type(), $q.indicesList(true, false)) */ 
    184   public void set$entity$prop($q.type() $varName, $q.indicesList(true, true)) { 
     167#foreach ($entity in $q.entities()) 
     168#set ($dummy = $q.setEntity($entity)) 
     169#set ($last = $q.last()) 
     170#set ($lastVar = $q.var($last)) 
     171 
     172  // - $entity property storage - 
     173#foreach ($prop in $q.props()) 
     174#set ($dummy = $q.setProperty($prop)) 
     175#set ($varName = $q.var($prop)) 
     176 
     177  /* @see loci.formats.meta.MetadataStore#set$entity$prop($q.defaultType(), $q.defaultIndicesList(true, false, true)) */ 
     178  public void set$entity$prop($q.defaultType() $varName, $q.defaultIndicesList(true, true, true)) { 
    185179#if ($q.path() == "-") 
    186180    // NB: $prop unsupported for schema version $q.version() 
    187181#else 
    188182    if ($varName == null) return; 
    189     ${last}Node $lastVar = get${last}Node($entity.indicesList(false, true), true); 
    190 #if ($convert) 
    191     ${lastVar}.set$mappedName($lastVar${mappedName}From$q.type()($varName)); 
    192 #else 
    193     ${lastVar}.set$mappedName($varName); 
    194 #end##if $convert 
     183    ${last}Node $lastVar = get${last}Node($q.indicesList(false, true), true); 
     184    ${lastVar}.$q.setter($varName); 
    195185#end##if "-" 
    196186  } 
     
    201191#foreach ($path in $q.unique()) 
    202192#set ($last = $q.last($path)) 
     193#set ($lastVar = $q.var($last)) 
    203194 
    204195  // $path 
    205196  private ${last}Node get${last}Node($q.indicesList($path, true, true, true), boolean create) { 
    206     int ndx, count; 
    207     List list; 
    208     // get OME node 
    209     OMENode ome = (OMENode) root; 
    210 #set ($var = "ome") 
    211 #set ($pVar = "ome") 
    212 #set ($pNode = "OME") 
    213 #set ($multiCount = 0) 
    214 #foreach ($node in $path.split("\\/")) 
    215 #set ($multi = $node.endsWith("+")) 
    216 #set ($ref = $node.startsWith("@")) 
    217 #set ($bang = $node.startsWith("@!")) 
    218 #set ($node = $node.replaceAll("[@!+]", "")) 
    219 #set ($ca = $pVar.equals("ca")) 
    220 #set ($var = $q.var($node)) 
    221     // get $node node 
    222 #if ($node.equals("CA")) 
    223 #set ($node = "CustomAttributes") 
    224 #end##if CA 
     197#set ($slash = $path.lastIndexOf("/")) 
     198#if ($slash < 0) 
     199#set ($pre = "") 
     200#set ($node = "OME") 
     201#else 
     202#set ($pre = $path.substring(0, $slash)) 
     203#set ($node = $q.last($pre)) 
     204#end##if $slash < 0 
     205#set ($node = $node.replaceAll("\\+", "")) 
     206#set ($nodeVar = $q.var($node)) 
     207#set ($multi = $path.endsWith("+")) 
     208#set ($indices = $q.indicesList($pre, false, true, true)) 
     209#if ($indices == "") 
     210    ${node}Node $nodeVar = (${node}Node) root; 
     211#else 
     212    // get $pre node 
     213    ${node}Node $nodeVar = get${node}Node($indices, create); 
     214    if ($nodeVar == null) return null; 
     215#end##if $indices == "" 
     216    // get $last node 
    225217#if ($multi) 
    226 #set ($prop = $q.indices($path).get($multiCount)) 
    227 #set ($multiCount = $multiCount + 1) 
    228     ndx = ${var}Index; 
    229 #if ($ca) 
    230     count = ${pVar}.countCAList("$node"); 
    231 #elseif ($q.legacy()) 
    232     count = ${pVar}.count${node}List(); 
    233 #else 
    234     count = ${pVar}.get${node}Count(); 
    235 #end##if $ca, $legacy 
    236     if (!create && ndx >= count) return null; 
    237 #if ($ref) 
    238     for (int i=count; i<=ndx; i++) { 
    239       new ${node}Node(ca).set$pNode($pVar); 
    240     } 
    241 #else 
    242     for (int i=count; i<=ndx; i++) new ${node}Node($pVar); 
    243 #end##if $ref 
    244 #if ($ca) 
    245     list = ${pVar}.getCAList("$node"); 
    246 #else 
    247     list = ${pVar}.get${node}List(); 
    248 #end##if $ca 
    249     ${node}Node $var = (${node}Node) list.get(ndx); 
    250 #else 
    251 #if ($ca || $ref) 
    252 #if ($bang) 
    253 #set ($extra = "By$pNode") 
    254 #else 
    255 #set ($extra = "") 
    256 #end##if $bang 
    257     ${node}Node $var = null; 
    258 #if ($ca) 
    259     count = ca.countCAList("$node"); 
    260     if (count >= 1) { 
    261       $var = (${node}Node) ca.getCAList("$node").get(0); 
    262     } 
    263 #else 
    264     count = ${pVar}.count${node}List$extra(); 
    265     if (count >= 1) { 
    266       $var = (${node}Node) ${pVar}.get${node}List$extra().get(0); 
    267     } 
    268 #end##if $ca 
    269 #else 
    270     ${node}Node $var = ${pVar}.get$node(); 
    271 #end##if $ca || $ref 
    272     if ($var == null) { 
    273       if (!create) return null; 
    274 #if ($ref) 
    275       $var = new ${node}Node(ca); 
    276       ${var}.set$pNode($pVar); 
    277 #else 
    278       $var = new ${node}Node($pVar); 
    279 #end##if $ref 
    280     } 
     218    int count = ${nodeVar}.get${last}Count(); 
     219    if (!create && count >= ${lastVar}Index) return null; 
     220    for (int i=count; i<=${lastVar}Index; i++) new ${last}Node($nodeVar); 
     221    List list = ${nodeVar}.get${last}List(); 
     222    return (${last}Node) list.get(${lastVar}Index); 
     223#else 
     224    return ${nodeVar}.get$last(); 
    281225#end##if $multi 
    282 #set ($pNode = $node) 
    283 #set ($pVar = $var) 
    284 #end##foreach $node 
    285     return $var; 
    286   } 
    287 #end##foreach $entity 
     226  } 
     227#end##foreach $path 
    288228 
    289229} 
  • trunk/loci/formats/auto/entities.txt

    r3917 r3959  
    2424# loci.formats.meta package, and loci.formats.ome.OMEXML*Metadata classes. 
    2525 
    26 # Path key and syntax notes: 
    27 # 
    28 # 1) Path elements ending in plus (+) have maxOccurs > 1 and generate an 
    29 #    index parameter to allow differentiation between them. 
    30 # 
    31 # 2) Path elements beginning with at (@) are not direct children of the 
    32 #    previous element, but instead reference the parent via an ID reference. 
    33 # 
    34 # 3) Path elements beginning with at-bang (@!) also use a parent reference but 
    35 #    the API is slightly different -- e.g., for a LightSource accessing a 
    36 #    child Laser, the method is lightSource.getLaserListByLightSource() 
    37 #    rather than lightSource.getLaserList(). 
     26# Path elements ending in plus (+) have maxOccurs > 1 and generate an 
     27# index parameter to allow differentiation between them. 
    3828 
    3929### Entities for 5D Image information ### 
     
    6050description = the creation date of the image 
    6151 
    62 [Image CreationDate 2003FC] 
    63 getter = getCreated 
    64 setter = setCreated 
    65  
    6652[Image Description] 
    6753type = String 
     
    7561description = A pixels set in the metadata store. 
    7662 
    77 [Pixels 2003FC] 
    78 path = Image+/CA/Pixels+ 
    79  
    8063[Pixels ID] 
    8164type = String 
    8265getter = getNodeID 
    83 setter = getNodeID 
     66setter = setNodeID 
    8467description = TODO 
    8568 
     
    11194type = Boolean 
    11295description = endianness of the pixels set 
    113  
    114 [Pixels BigEndian 2003FC] 
    115 getter = isBigEndian 
    11696 
    11797[Pixels DimensionOrder] 
     
    131111 
    132112[Dimensions 2003FC] 
    133 path = Image+/CA/Dimensions 
     113path = Image+ 
    134114 
    135115[Dimensions PhysicalSizeX] 
     
    161141description = the distance between adjacent time points in seconds 
    162142 
    163 [Dimensions TimeIncrement 2003FC] 
    164 getter = getPixelSizeT 
    165 setter = setPixelSizeT 
    166  
    167143[Dimensions WaveStart] 
    168144type = Integer 
    169145description = the starting wavelength in nanometers 
    170146 
    171 [Dimensions WaveStart 2003FC] 
    172 path = - 
    173  
    174147[Dimensions WaveIncrement] 
    175148type = Integer 
    176149description = the distance between adjacent wavelengths in nanometers 
    177  
    178 [Dimensions WaveIncrement 2003FC] 
    179 type = Float 
    180 getter = getPixelSizeC 
    181 setter = setPixelSizeC 
    182150 
    183151## ImagingEnvironment ## 
     
    186154path = Image+/ImagingEnvironment 
    187155description = the imaging environment for a particular image 
    188  
    189 [ImagingEnvironment 2003FC] 
    190 path = Image+/CA/ImagingEnvironment 
    191156 
    192157[ImagingEnvironment Temperature] 
     
    280245 
    281246[LogicalChannel 2003FC] 
    282 path = Image+/CA/LogicalChannel+ 
     247path = Image+/ChannelInfo+ 
    283248 
    284249[LogicalChannel ID] 
     
    320285description = the excitation wavelength 
    321286 
    322 [LogicalChannel ExWave 2003FC] 
    323 getter = getExcitationWavelength 
    324 setter = setExcitationWavelength 
    325  
    326287[LogicalChannel EmWave] 
    327288type = Integer 
    328289description = the emission wavelength 
    329290 
    330 [LogicalChannel EmWave 2003FC] 
    331 getter = getEmissionWavelength 
    332 setter = setEmissionWavelength 
    333  
    334291[LogicalChannel Fluor] 
    335292type = String 
     
    341298 
    342299[LogicalChannel NdFilter 2003FC] 
    343 getter = getNDFilter 
    344 setter = setNDFilter 
     300getter = getNDfilter 
     301setter = setNDfilter 
    345302 
    346303[LogicalChannel PockelCellSetting] 
     
    360317 
    361318[ChannelComponent 2003FC] 
    362 path = Image+/CA/LogicalChannel+/@PixelChannelComponent+ 
     319path = Image+/ChannelInfo+/ChannelComponent+ 
    363320 
    364321[ChannelComponent Index] 
     
    381338path = Image+/DisplayOptions 
    382339description = various display options for a particular pixels set 
    383  
    384 [DisplayOptions 2003FC] 
    385 path = Image+/CA/DisplayOptions 
    386340 
    387341[DisplayOptions ID] 
     
    603557              for a particular image 
    604558 
    605 [DisplayOptionsProjection 2003FC] 
    606 path = Image+/CA/DisplayOptions 
    607  
    608559[DisplayOptionsProjection ZStart] 
    609560type = Integer 
     
    611562              in the maximum intensity projection 
    612563 
     564[DisplayOptionsProjection ZStart 2003FC] 
     565getter = getZstart 
     566setter = setZstart 
     567 
    613568[DisplayOptionsProjection ZStop] 
    614569type = Integer 
    615570description = the last focal plane to include \ 
    616571              in the maximum intensity projection 
     572 
     573[DisplayOptionsProjection ZStop 2003FC] 
     574getter = getZstop 
     575setter = setZstop 
    617576 
    618577## DisplayOptionsTime ## 
     
    622581description = time range-related display options for a particular image 
    623582 
    624 [DisplayOptionsTime 2003FC] 
    625 path = Image+/CA/DisplayOptions 
    626  
    627583[DisplayOptionsTime TStart] 
    628584type = Integer 
    629585description = the first time point to include in the animation 
    630586 
     587[DisplayOptionsTime TStart 2003FC] 
     588getter = getTstart 
     589setter = setTstart 
     590 
    631591[DisplayOptionsTime TStop] 
    632592type = Integer 
    633593description = the last time point to include in the animation 
     594 
     595[DisplayOptionsTime TStop 2003FC] 
     596getter = getTstop 
     597setter = setTstop 
    634598 
    635599## ROI ## 
     
    641605              with a particular index 
    642606 
    643 [ROI 2003FC] 
    644 path = Image+/CA/DisplayOptions/@DisplayROI+ 
    645  
    646607[ROI ID] 
    647608type = String 
     
    691652 
    692653[DetectorSettings 2003FC] 
    693 path = Image+/CA/LogicalChannel+ 
     654path = Image+/ChannelInfo+/DetectorRef 
    694655 
    695656[DetectorSettings Detector] 
    696657type = String 
    697 # TODO 
     658getter = getNodeID 
     659setter = setNodeID 
    698660description = the detector associated with this channel 
    699661 
     
    702664description = the detector offset 
    703665 
    704 [DetectorSettings Offset 2003FC] 
    705 getter = getDetectorOffset 
    706 setter = setDetectorOffset 
    707  
    708666[DetectorSettings Gain] 
    709667type = Float 
    710668description = the detector gain 
    711  
    712 [DetectorSettings Gain 2003FC] 
    713 getter = getDetectorGain 
    714 setter = setDetectorGain 
    715669 
    716670## LightSourceSettings ## 
     
    721675 
    722676[LightSourceSettings 2003FC] 
    723 path = Image+/CA/LogicalChannel+ 
     677path = Image+/ChannelInfo+/LightSourceRef 
    724678 
    725679[LightSourceSettings LightSource] 
    726680type = String 
    727 # TODO 
     681getter = getNodeID 
     682setter = setNodeID 
    728683description = the primary light source 
    729684 
     
    732687description = the primary light source attenuation 
    733688 
    734 [LightSourceSettings Attenuation 2003FC] 
    735 getter = getLightAttenuation 
    736 setter = setLightAttenuation 
    737  
    738689[LightSourceSettings Wavelength] 
    739690type = Integer 
    740691description = the primary light source wavelength 
    741  
    742 [LightSourceSettings Wavelength 2003FC] 
    743 getter = getLightWavelength 
    744 setter = setLightWavelength 
    745692 
    746693### Entities for other Image-specific information ### 
     
    752699description = a stage label in the metadata store with a particular index 
    753700 
    754 [StageLabel 2003FC] 
    755 path = Image+/CA/StageLabel 
    756  
    757701[StageLabel Name] 
    758702type = String 
     
    780724description = an instrument in the metadata store with a particular index 
    781725 
    782 [Instrument 2003FC] 
    783 path = CA/Instrument+ 
    784  
    785726[Instrument ID] 
    786727type = String 
     
    795736path = Instrument+/LightSource+ 
    796737description = a light source for a particular instrument 
    797  
    798 [LightSource 2003FC] 
    799 path = CA/Instrument+/@LightSource+ 
    800738 
    801739[LightSource ID] 
     
    823761description = a laser for a particular instrument 
    824762 
    825 [Laser 2003FC] 
    826 path = CA/Instrument+/@LightSource+/@!Laser 
    827  
    828763[Laser Type] 
    829764type = String 
     
    848783[Laser FrequencyMultiplication 2003FC] 
    849784type = Boolean 
    850 getter = isFrequencyDoubled 
     785getter = getFrequencyDoubled 
    851786setter = setFrequencyDoubled 
    852787 
     
    856791 
    857792[Laser Tuneable 2003FC] 
    858 getter = isTunable 
     793getter = getTunable 
    859794setter = setTunable 
    860795 
     
    869804description = a filament for a particular instrument 
    870805 
    871 [Filament 2003FC] 
    872 path = CA/Instrument+/@LightSource+/@Filament 
    873  
    874806[Filament Type] 
    875807type = String 
     
    886818description = an arc for a particular instrument 
    887819 
    888 [Arc 2003FC] 
    889 path = CA/Instrument+/@LightSource+/@Arc 
    890  
    891820[Arc Type] 
    892821type = String 
     
    904833description = a detector for a particular instrument 
    905834 
    906 [Detector 2003FC] 
    907 path = CA/Instrument+/@Detector+ 
    908  
    909835[Detector ID] 
    910836type = String 
     
    947873path = Instrument+/Objective+ 
    948874description = an objective for a particular instrument 
    949  
    950 [Objective 2003FC] 
    951 path = CA/Instrument+/@Objective+ 
    952875 
    953876[Objective ID] 
     
    11161039description = an optical transfer function for a particular instrument 
    11171040 
    1118 [OTF 2003FC] 
    1119 path = CA/Instrument+/@OTF+ 
    1120  
    11211041[OTF ID] 
    11221042type = String 
     
    11421062 
    11431063[OTF OpticalAxisAveraged 2003FC] 
    1144 getter = isOpticalAxisAverage 
    1145 setter = setOpticalAxisAverage 
     1064getter = getOpticalAxisAvrg 
     1065setter = setOpticalAxisAvrg 
    11461066 
    11471067### Entities for Experimenter details ### 
     
    11541074description = an experimenter in the metadata store with a particular index 
    11551075 
    1156 [Experimenter 2003FC] 
    1157 path = CA/Experimenter+ 
    1158  
    11591076[Experimenter ID] 
    11601077type = String 
  • trunk/loci/formats/auto/versions.txt

    r3917 r3959  
    2929#subPackage = ome 
    3030#version = 2008-02 
    31 #legacy = false 
    3231 
    3332[200706] 
     
    3736subPackage = ome 
    3837version = 2007-06 
    39 legacy = false 
    4038 
    4139[2003FC] 
    4240className = OMEXML2003FCMetadata 
    4341id = OMEXML2003FCMetadata.java 
    44 basePackage = org.openmicroscopy.xml 
    45 subPackage = st 
     42basePackage = ome.xml.r2003fc 
     43subPackage = ome 
    4644version = 2003-FC 
    47 legacy = true 
Note: See TracChangeset for help on using the changeset viewer.