| Class | NumRu::HE5ZaField |
| In: |
lib/hdfeos5.rb
|
| Parent: | Object |
HE5ZaField クラスに関して
| MissValAtts | = | ["MissingValue","_FillValue"] |
# File lib/hdfeos5.rb, line 2017
2017: def create(file, zname,fldname)
2018: if(file.is_a?(String))
2019: zaid = HE5Za.create(file, zname)
2020: elsif(!file.is_a?(HE5))
2021: raise TypeError,
2022: "1st arg must be a HDF-EOS5 (file object) or a String (path)"
2023: end
2024: file.var(fldname)
2025: end
# File lib/hdfeos5.rb, line 2027
2027: def open(file, zname, fldname)
2028: if(file.is_a?(String))
2029: zaid = HE5Za.open(file, zname)
2030: elsif(!file.is_a?(HE5))
2031: raise TypeError,
2032: "1st arg must be a HDF-EOS5 (file object) or a String (path)"
2033: end
2034: zaid.var(fldname)
2035: end
# File lib/hdfeos5.rb, line 2331
2331: def [](*a)
2332: if a.length == 0
2333: return self.get
2334: end
2335: a = __rubber_expansion(a)
2336: first = Array.new
2337: last = Array.new
2338: stride = Array.new
2339: set_stride = false
2340: a.each{|i|
2341: if(i.is_a?(Fixnum))
2342: first.push(i)
2343: last.push(i)
2344: stride.push(1)
2345: elsif(i.is_a?(Range))
2346: first.push(i.first)
2347: last.push(i.exclude_end? ? i.last-1 : i.last)
2348: stride.push(1)
2349: elsif(i.is_a?(Hash))
2350: r = (i.to_a[0])[0]
2351: s = (i.to_a[0])[1]
2352: if ( !( r.is_a?(Range) ) || ! ( s.is_a?(Integer) ) )
2353: raise TypeError, "Hash argument must be {a_Range, step}"
2354: end
2355: first.push(r.first)
2356: last.push(r.exclude_end? ? r.last-1 : r.last)
2357: stride.push(s)
2358: set_stride = true
2359: elsif(i.is_a?(TrueClass))
2360: first.push(0)
2361: last.push(-1)
2362: stride.push(1)
2363: elsif( i.is_a?(Array) || i.is_a?(NArray))
2364: a_new = a.dup
2365: at = a.index(i)
2366: i = NArray.to_na(i) if i.is_a?(Array)
2367: for n in 0..i.length-1
2368: a_new[at] = i[n]..i[n]
2369: na_tmp = self[*a_new]
2370: if n==0 then
2371: k = at
2372: if at > 0
2373: a[0..at-1].each{|x| if x.is_a?(Fixnum) then k -= 1 end}
2374: end
2375: shape_tmp = na_tmp.shape
2376: shape_tmp[k] = i.length
2377: na = na_tmp.class.new(na_tmp.typecode,*shape_tmp)
2378: index_tmp = Array.new(shape_tmp.length,true)
2379: end
2380: index_tmp[k] = n..n
2381: na[*index_tmp] = na_tmp
2382: end
2383: return na
2384: else
2385: raise TypeError, "argument must be Fixnum, Range, Hash, TrueClass, Array, or NArray"
2386: end
2387: }
2388:
2389: if(set_stride)
2390: na = self.get({"start"=>first, "end"=>last, "stride"=>stride})
2391: else
2392: na = self.get({"start"=>first, "end"=>last})
2393: end
2394: shape = na.shape
2395: (a.length-1).downto(0){ |i|
2396: shape.delete_at(i) if a[i].is_a?(Fixnum)
2397: }
2398: na.reshape!( *shape )
2399: na
2400: end
# File lib/hdfeos5.rb, line 2402
2402: def []=(*a)
2403: val = a.pop
2404: a = __rubber_expansion(a)
2405: first = Array.new
2406: last = Array.new
2407: stride = Array.new
2408: set_stride = false
2409: a.each{|i|
2410: if(i.is_a?(Fixnum))
2411: first.push(i)
2412: last.push(i)
2413: stride.push(1)
2414: elsif(i.is_a?(Range))
2415: first.push(i.first)
2416: last.push(i.exclude_end? ? i.last-1 : i.last)
2417: stride.push(1)
2418: elsif(i.is_a?(Hash))
2419: r = (i.to_a[0])[0]
2420: s = (i.to_a[0])[1]
2421: if ( !( r.is_a?(Range) ) || ! ( s.is_a?(Integer) ) )
2422: raise ArgumentError, "Hash argument must be {first..last, step}"
2423: end
2424: first.push(r.first)
2425: last.push(r.exclude_end? ? r.last-1 : r.last)
2426: stride.push(s)
2427: set_stride = true
2428: elsif(i.is_a?(TrueClass))
2429: first.push(0)
2430: last.push(-1)
2431: stride.push(1)
2432: elsif(i.is_a?(Array) || i.is_a?(NArray))
2433: a_new = a.dup
2434: at = a.index(i)
2435: i = NArray.to_na(i) if i.is_a?(Array)
2436: val = NArray.to_na(val) if val.is_a?(Array)
2437: rank_of_subset = a.dup.delete_if{|v| v.is_a?(Fixnum)}.length
2438: if val.rank != rank_of_subset
2439: raise "rank of the rhs (#{val.rank}) is not equal to the rank "+
2440: "of the subset specified by #{a.inspect} (#{rank_of_subset})"
2441: end
2442: k = at
2443: a[0..at-1].each{|x| if x.is_a?(Fixnum) then k -= 1 end}
2444: if i.length != val.shape[k]
2445: raise "length of the #{k+1}-th dim of rhs is incorrect "+
2446: "(#{i.length} for #{val.shape[k]})"
2447: end
2448: index_tmp = Array.new(val.rank,true) if !val.is_a?(Numeric) #==>Array-like
2449: for n in 0..i.length-1
2450: a_new[at] = i[n]..i[n]
2451: if !val.is_a?(Numeric) then
2452: index_tmp[k] = n..n
2453: self[*a_new] = val[*index_tmp]
2454: else
2455: self[*a_new] = val
2456: end
2457: end
2458: return self
2459: else
2460: raise TypeError, "argument must be Fixnum, Range, Hash, TrueClass, Array, or NArray"
2461: end
2462: }
2463:
2464: if(set_stride)
2465: self.put(val, {"start"=>first, "end"=>last, "stride"=>stride})
2466: else
2467: self.put(val, {"start"=>first, "end"=>last})
2468: end
2469: end
# File lib/hdfeos5.rb, line 2099
2099: def att_names
2100: nattrs, attrnames, strbufsize = inqlocattrs()
2101: return attrnames.split(/,/)
2102: end
# File lib/hdfeos5.rb, line 2067
2067: def dim(dimid)
2068: rank, dims, ntype, dimlist =fieldinfo()
2069: return dimlist.split(",")[dimid]
2070: end
# File lib/hdfeos5.rb, line 2077
2077: def dim_names
2078: rank, dims, ntype, dimlist =fieldinfo()
2079: return dimlist.split(",").reverse
2080: end
# File lib/hdfeos5.rb, line 2072
2072: def dim_val(dimid)
2073: rank, dims, ntype, dimlist =fieldinfo()
2074: return dimlist.split(",")[dimid]
2075: end
# File lib/hdfeos5.rb, line 2104
2104: def each_att
2105: attlist=Array.new
2106: attnames=att_names()
2107: attnum = natts()
2108: attnames.each{|attname|
2109: list=Array.new
2110: attrval=att(attname)
2111: list.push(attname, attrval)
2112: attlist.push(list)
2113: }
2114: attlist
2115: end
# File lib/hdfeos5.rb, line 2091
2091: def get_att(attname)
2092: if att_names.include?(attname)
2093: get_att_(attname)
2094: else
2095: nil
2096: end
2097: end
# File lib/hdfeos5.rb, line 2298
2298: def get_with_miss(*args)
2299: na = simple_get(*args)
2300: mv = nil
2301: MissValAtts.each do |nm|
2302: mv = get_att(nm)
2303: break if !mv.nil?
2304: end
2305: if mv.nil?
2306: na
2307: else
2308: NArrayMiss.to_nam_no_dup( na, (na.ne(mv[0])) )
2309: end
2310: end
# File lib/hdfeos5.rb, line 2471
2471: def inspect
2472: 'HE5ZaField:'+za.file.path+'?var='+name
2473: end
# File lib/hdfeos5.rb, line 2086
2086: def natts
2087: nattrs, attrname, strbufsize = inqlocattrs()
2088: return nattrs
2089: end
# File lib/hdfeos5.rb, line 2061
2061: def ndims
2062: rank, dims, ntype, dimlist =fieldinfo()
2063: return rank
2064: end
# File lib/hdfeos5.rb, line 2038
2038: def ntype
2039: rank, dims, ntype, dimlist = fieldinfo()
2040: return ntype
2041: end
# File lib/hdfeos5.rb, line 2117
2117: def put_att(name,value,atttype=nil)
2118: count = Array.new
2119: count[0] = value.size
2120: writelocattr(name,atttype,count,value)
2121: end
# File lib/hdfeos5.rb, line 2044
2044: def shape
2045: rank, dims, ntype, dimlist =fieldinfo
2046: return dims[-1..0].to_a # NArray --> reverced --> Array
2047: end
# File lib/hdfeos5.rb, line 2051
2051: def shape_ul0
2052: sh = shape_current
2053: dim_names.each_with_index do |dnm,i|
2054: if dnm == "Unlim"
2055: sh[i] = 0
2056: end
2057: end
2058: sh
2059: end
# File lib/hdfeos5.rb, line 2213
2213: def simple_get(hash=nil)
2214: if hash == nil
2215: if self.ntype == "char" || self.ntype=="byte"
2216: get_vars_char([0,0,0,0,0,0,0,0], nil, nil)
2217: elsif self.ntype=="sint"
2218: get_vars_short([0,0,0,0,0,0,0,0], nil, nil)
2219: elsif self.ntype=="int"
2220: get_vars_int([0,0,0,0,0,0,0,0], nil, nil)
2221: elsif self.ntype=="sfloat"
2222: get_vars_float([0,0,0,0,0,0,0,0], nil, nil)
2223: elsif self.ntype=="float"
2224: get_vars_double([0,0,0,0,0,0,0,0], nil, nil)
2225: else
2226: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
2227: end
2228: elsif hash.key?("index")==true || hash.key?("start")==true
2229: h_sta = hash["start"]
2230: endq = hash.key?("end")
2231: strq = hash.key?("stride")
2232: if endq == false && strq == false
2233: if self.ntype == "char" || self.ntype=="byte"
2234: get_vars_char(h_sta, nil, nil)
2235: elsif self.ntype=="sint"
2236: get_vars_short(h_sta, nil, nil)
2237: elsif self.ntype=="int"
2238: get_vars_int(h_sta, nil, nil)
2239: elsif self.ntype=="sfloat"
2240: get_vars_float(h_sta, nil, nil)
2241: elsif self.ntype=="float"
2242: get_vars_double(h_sta, nil, nil)
2243: else
2244: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
2245: end
2246: elsif endq == true && strq == false
2247: h_end = hash["end"]
2248: if self.ntype == "char" || self.ntype=="byte"
2249: get_vars_char(h_sta, nil, h_end)
2250: elsif self.ntype=="sint"
2251: get_vars_short(h_sta, nil, h_end)
2252: elsif self.ntype=="int"
2253: get_vars_int(h_sta, nil, h_end)
2254: elsif self.ntype=="sfloat"
2255: get_vars_float(h_sta, nil, h_end)
2256: elsif self.ntype=="float"
2257: get_vars_double(h_sta, nil, h_end)
2258: else
2259: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
2260: end
2261: elsif endq == false && strq == true
2262: h_str = hash["stride"]
2263: if self.ntype == "char" || self.ntype=="byte"
2264: get_vars_char(h_sta, h_str, nil)
2265: elsif self.ntype=="sint"
2266: get_vars_short(h_sta, h_str, nil)
2267: elsif self.ntype=="int"
2268: get_vars_int(h_sta, h_str, nil)
2269: elsif self.ntype=="sfloat"
2270: get_vars_float(h_sta, h_str, nil)
2271: elsif self.ntype=="float"
2272: get_vars_double(h_sta, h_str, nil)
2273: else
2274: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
2275: end
2276: else endq == true && strq == true
2277: h_end = hash["end"]
2278: h_str = hash["stride"]
2279: if self.ntype == "char" || self.ntype=="byte"
2280: get_vars_char(h_sta, h_str, h_end)
2281: elsif self.ntype=="sint"
2282: get_vars_short(h_sta, h_str, h_end)
2283: elsif self.ntype=="int"
2284: get_vars_int(h_sta, h_str, h_end)
2285: elsif self.ntype=="sfloat"
2286: get_vars_float(h_sta, h_str, h_end)
2287: elsif self.ntype=="float"
2288: get_vars_double(h_sta, h_str, h_end)
2289: else
2290: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
2291: end
2292: end
2293: else
2294: raise ArgumentError,"{'start'}=>{ARRAY} or {'index'}=>{ARRAY} is needed"
2295: end
2296: end
# File lib/hdfeos5.rb, line 2127
2127: def simple_put(var,hash=nil)
2128: if hash == nil
2129: if self.ntype == "char" || self.ntype=="byte"
2130: put_vars_char([0,0,0,0,0,0,0,0], nil, nil, var)
2131: elsif self.ntype=="sint"
2132: put_vars_short([0,0,0,0,0,0,0,0], nil, nil, var)
2133: elsif self.ntype=="int"
2134: put_vars_int([0,0,0,0,0,0,0,0], nil, nil, var)
2135: elsif self.ntype=="sfloat"
2136: put_vars_float([0,0,0,0,0,0,0,0], nil, nil, var)
2137: elsif self.ntype=="float"
2138: put_vars_double([0,0,0,0,0,0,0,0], nil, nil, var)
2139: else
2140: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
2141: end
2142: elsif hash.key?("index")==true || hash.key?("start")==true
2143: h_sta = hash["start"]
2144: endq = hash.key?("end")
2145: strq = hash.key?("stride")
2146: if endq == false && strq == false
2147: if self.ntype == "char" || self.ntype=="byte"
2148: put_vars_char(h_sta, nil, nil, var)
2149: elsif self.ntype=="sint"
2150: put_vars_short(h_sta, nil, nil, var)
2151: elsif self.ntype=="int"
2152: put_vars_int(h_sta, nil, nil, var)
2153: elsif self.ntype=="sfloat"
2154: put_vars_float(h_sta, nil, nil, var)
2155: elsif self.ntype=="float"
2156: put_vars_double(h_sta, nil, nil, var)
2157: else
2158: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
2159: end
2160: elsif endq == true && strq == false
2161: h_end = hash["end"]
2162: if self.ntype == "char" || self.ntype=="byte"
2163: put_vars_char(h_sta, nil, h_end, var)
2164: elsif self.ntype=="sint"
2165: put_vars_short(h_sta, nil, h_end, var)
2166: elsif self.ntype=="int"
2167: put_vars_int(h_sta, nil, h_end, var)
2168: elsif self.ntype=="sfloat"
2169: put_vars_float(h_sta, nil, h_end, var)
2170: elsif self.ntype=="float"
2171: put_vars_double(h_sta, nil, h_end, var)
2172: else
2173: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
2174: end
2175: elsif endq == false && strq == true
2176: h_str = hash["stride"]
2177: if self.ntype == "char" || self.ntype=="byte"
2178: put_vars_char(h_sta, h_str, nil, var)
2179: elsif self.ntype=="sint"
2180: put_vars_short(h_sta, h_str, nil, var)
2181: elsif self.ntype=="int"
2182: put_vars_int(h_sta, h_str, nil, var)
2183: elsif self.ntype=="sfloat"
2184: put_vars_float(h_sta, h_str, nil, var)
2185: elsif self.ntype=="float"
2186: put_vars_double(h_sta, h_str, nil, var)
2187: else
2188: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
2189: end
2190: else endq == true && strq == true
2191: h_end = hash["end"]
2192: h_str = hash["stride"]
2193: if self.ntype == "char" || self.ntype=="byte"
2194: put_vars_char(h_sta, h_str, h_end, var)
2195: elsif self.ntype=="sint"
2196: put_vars_short(h_sta, h_str, h_end, var)
2197: elsif self.ntype=="int"
2198: put_vars_int(h_sta, h_str, h_end, var)
2199: elsif self.ntype=="sfloat"
2200: put_vars_float(h_sta, h_str, h_end, var)
2201: elsif self.ntype=="float"
2202: put_vars_double(h_sta, h_str, h_end, var)
2203: else
2204: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
2205: end
2206: end
2207: else
2208: raise ArgumentError,"{'start'}=>{ARRAY} or {'index'}=>{ARRAY} is needed"
2209: end
2210: end
# File lib/hdfeos5.rb, line 2313
2313: def __rubber_expansion( args )
2314: if (id = args.index(false)) # substitution into id
2315: # false is incuded
2316: alen = args.length
2317: if args.rindex(false) != id
2318: raise ArguemntError,"only one rubber dimension is permitted"
2319: elsif alen > rank+1
2320: raise ArgumentError, "too many args"
2321: end
2322: ar = ( id!=0 ? args[0..id-1] : [] )
2323: args = ar + [true]*(rank-alen+1) + args[id+1..-1]
2324: elsif args.length == 0 # to support empty [], []=
2325: args = [true]*rank
2326: end
2327: args
2328: end