| Class | NumRu::HE5GdField |
| In: |
lib/hdfeos5.rb
|
| Parent: | Object |
HE5GdField クラスに関して
| MissValAtts | = | ["MissingValue","_FillValue"] |
# File lib/hdfeos5.rb, line 951
951: def create(file, gname, fldname, xdimsize, ydimsize, upleftpt, lowrightpt)
952: if(file.is_a?(String))
953: gdid = HE5Gd.create(file, gname, xdimsize, ydimsize, upleftpt, lowrightpt)
954: elsif(!file.is_a?(HE5))
955: raise TypeError,
956: "1st arg must be a HDF-EOS5 (file object) or a String (path)"
957: end
958: file.var(fldname)
959: end
# File lib/hdfeos5.rb, line 961
961: def open(file, gname, fldname)
962: if(file.is_a?(String))
963: gdid = HE5Gd.open(file, gname)
964: elsif(!file.is_a?(HE5))
965: raise TypeError,
966: "1st arg must be a HDF-EOS5 (file object) or a String (path)"
967: end
968: gdid.var(fldname)
969: end
# File lib/hdfeos5.rb, line 1265
1265: def [](*a)
1266: if a.length == 0
1267: return self.get
1268: end
1269: a = __rubber_expansion(a)
1270: first = Array.new
1271: last = Array.new
1272: stride = Array.new
1273: set_stride = false
1274: a.each{|i|
1275: if(i.is_a?(Fixnum))
1276: first.push(i)
1277: last.push(i)
1278: stride.push(1)
1279: elsif(i.is_a?(Range))
1280: first.push(i.first)
1281: last.push(i.exclude_end? ? i.last-1 : i.last)
1282: stride.push(1)
1283: elsif(i.is_a?(Hash))
1284: r = (i.to_a[0])[0]
1285: s = (i.to_a[0])[1]
1286: if ( !( r.is_a?(Range) ) || ! ( s.is_a?(Integer) ) )
1287: raise TypeError, "Hash argument must be {a_Range, step}"
1288: end
1289: first.push(r.first)
1290: last.push(r.exclude_end? ? r.last-1 : r.last)
1291: stride.push(s)
1292: set_stride = true
1293: elsif(i.is_a?(TrueClass))
1294: first.push(0)
1295: last.push(-1)
1296: stride.push(1)
1297: elsif( i.is_a?(Array) || i.is_a?(NArray))
1298: a_new = a.dup
1299: at = a.index(i)
1300: i = NArray.to_na(i) if i.is_a?(Array)
1301: for n in 0..i.length-1
1302: a_new[at] = i[n]..i[n]
1303: na_tmp = self[*a_new]
1304: if n==0 then
1305: k = at
1306: if at > 0
1307: a[0..at-1].each{|x| if x.is_a?(Fixnum) then k -= 1 end}
1308: end
1309: shape_tmp = na_tmp.shape
1310: shape_tmp[k] = i.length
1311: na = na_tmp.class.new(na_tmp.typecode,*shape_tmp)
1312: index_tmp = Array.new(shape_tmp.length,true)
1313: end
1314: index_tmp[k] = n..n
1315: na[*index_tmp] = na_tmp
1316: end
1317: return na
1318: else
1319: raise TypeError, "argument must be Fixnum, Range, Hash, TrueClass, Array, or NArray"
1320: end
1321: }
1322:
1323: if(set_stride)
1324: na = self.get({"start"=>first, "end"=>last, "stride"=>stride})
1325: else
1326: na = self.get({"start"=>first, "end"=>last})
1327: end
1328: shape = na.shape
1329: (a.length-1).downto(0){ |i|
1330: shape.delete_at(i) if a[i].is_a?(Fixnum)
1331: }
1332: na.reshape!( *shape )
1333: na
1334: end
# File lib/hdfeos5.rb, line 1336
1336: def []=(*a)
1337: val = a.pop
1338: a = __rubber_expansion(a)
1339: first = Array.new
1340: last = Array.new
1341: stride = Array.new
1342: set_stride = false
1343: a.each{|i|
1344: if(i.is_a?(Fixnum))
1345: first.push(i)
1346: last.push(i)
1347: stride.push(1)
1348: elsif(i.is_a?(Range))
1349: first.push(i.first)
1350: last.push(i.exclude_end? ? i.last-1 : i.last)
1351: stride.push(1)
1352: elsif(i.is_a?(Hash))
1353: r = (i.to_a[0])[0]
1354: s = (i.to_a[0])[1]
1355: if ( !( r.is_a?(Range) ) || ! ( s.is_a?(Integer) ) )
1356: raise ArgumentError, "Hash argument must be {first..last, step}"
1357: end
1358: first.push(r.first)
1359: last.push(r.exclude_end? ? r.last-1 : r.last)
1360: stride.push(s)
1361: set_stride = true
1362: elsif(i.is_a?(TrueClass))
1363: first.push(0)
1364: last.push(-1)
1365: stride.push(1)
1366: elsif(i.is_a?(Array) || i.is_a?(NArray))
1367: a_new = a.dup
1368: at = a.index(i)
1369: i = NArray.to_na(i) if i.is_a?(Array)
1370: val = NArray.to_na(val) if val.is_a?(Array)
1371: rank_of_subset = a.dup.delete_if{|v| v.is_a?(Fixnum)}.length
1372: if val.rank != rank_of_subset
1373: raise "rank of the rhs (#{val.rank}) is not equal to the rank "+
1374: "of the subset specified by #{a.inspect} (#{rank_of_subset})"
1375: end
1376: k = at
1377: a[0..at-1].each{|x| if x.is_a?(Fixnum) then k -= 1 end}
1378: if i.length != val.shape[k]
1379: raise "length of the #{k+1}-th dim of rhs is incorrect "+
1380: "(#{i.length} for #{val.shape[k]})"
1381: end
1382: index_tmp = Array.new(val.rank,true) if !val.is_a?(Numeric) #==>Array-like
1383: for n in 0..i.length-1
1384: a_new[at] = i[n]..i[n]
1385: if !val.is_a?(Numeric) then
1386: index_tmp[k] = n..n
1387: self[*a_new] = val[*index_tmp]
1388: else
1389: self[*a_new] = val
1390: end
1391: end
1392: return self
1393: else
1394: raise TypeError, "argument must be Fixnum, Range, Hash, TrueClass, Array, or NArray"
1395: end
1396: }
1397:
1398: if(set_stride)
1399: self.put(val, {"start"=>first, "end"=>last, "stride"=>stride})
1400: else
1401: self.put(val, {"start"=>first, "end"=>last})
1402: end
1403: end
# File lib/hdfeos5.rb, line 1033
1033: def att_names
1034: nattrs, attrnames, strbufsize = inqlocattrs()
1035: return attrnames.split(/,/)
1036: end
# File lib/hdfeos5.rb, line 1001
1001: def dim(dimid)
1002: rank, dims, ntype, dimlist = fieldinfo()
1003: return dimlist.split(",")[dimid]
1004: end
# File lib/hdfeos5.rb, line 1011
1011: def dim_names
1012: rank, dims, ntype, dimlist = fieldinfo()
1013: return dimlist.split(",").reverse
1014: end
# File lib/hdfeos5.rb, line 1006
1006: def dim_val(dimid)
1007: rank, dims, ntype, dimlist = fieldinfo()
1008: return dimlist.split(",")[dimid]
1009: end
# File lib/hdfeos5.rb, line 1038
1038: def each_att
1039: attlist=Array.new
1040: attnames=att_names()
1041: attnum = natts()
1042: attnames.each{|attname|
1043: list=Array.new
1044: attrval=att(attname)
1045: list.push(attname, attrval)
1046: attlist.push(list)
1047: }
1048: attlist
1049: end
# File lib/hdfeos5.rb, line 1025
1025: def get_att(attname)
1026: if att_names.include?(attname)
1027: get_att_(attname)
1028: else
1029: nil
1030: end
1031: end
# File lib/hdfeos5.rb, line 1232
1232: def get_with_miss(*args)
1233: na = simple_get(*args)
1234: mv = nil
1235: MissValAtts.each do |nm|
1236: mv = get_att(nm)
1237: break if !mv.nil?
1238: end
1239: if mv.nil?
1240: na
1241: else
1242: NArrayMiss.to_nam_no_dup( na, (na.ne(mv[0])) )
1243: end
1244: end
# File lib/hdfeos5.rb, line 1405
1405: def inspect
1406: 'HE5GdField:'+grid.file.path+'?var='+name
1407: end
# File lib/hdfeos5.rb, line 1020
1020: def natts
1021: nattrs, attrname, strbufsize = inqlocattrs()
1022: return nattrs
1023: end
# File lib/hdfeos5.rb, line 995
995: def ndims
996: rank, dims, ntype, dimlist = fieldinfo()
997: return rank
998: end
# File lib/hdfeos5.rb, line 972
972: def ntype
973: rank, dims, ntype, dimlist = fieldinfo()
974: return ntype
975: end
# File lib/hdfeos5.rb, line 1051
1051: def put_att(name,value,atttype=nil)
1052: count = Array.new
1053: count[0] = value.size
1054: writelocattr(name,atttype,count,value)
1055: end
# File lib/hdfeos5.rb, line 978
978: def shape
979: rank, dims, ntype, dimlist = fieldinfo()
980: return dims[-1..0].to_a # NArray --> reverced --> Array
981: end
# File lib/hdfeos5.rb, line 985
985: def shape_ul0
986: sh = shape_current
987: dim_names.each_with_index do |dnm,i|
988: if dnm == "Unlim"
989: sh[i] = 0
990: end
991: end
992: sh
993: end
# File lib/hdfeos5.rb, line 1147
1147: def simple_get(hash=nil)
1148: if hash == nil
1149: if self.ntype == "char" || self.ntype=="byte"
1150: get_vars_char([0,0,0,0,0,0,0,0], nil, nil)
1151: elsif self.ntype=="sint"
1152: get_vars_short([0,0,0,0,0,0,0,0], nil, nil)
1153: elsif self.ntype=="int"
1154: get_vars_int([0,0,0,0,0,0,0,0], nil, nil)
1155: elsif self.ntype=="sfloat"
1156: get_vars_float([0,0,0,0,0,0,0,0], nil, nil)
1157: elsif self.ntype=="float"
1158: get_vars_double([0,0,0,0,0,0,0,0], nil, nil)
1159: else
1160: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
1161: end
1162: elsif hash.key?("index")==true || hash.key?("start")==true
1163: h_sta = hash["start"]
1164: endq = hash.key?("end")
1165: strq = hash.key?("stride")
1166: if endq == false && strq == false
1167: if self.ntype == "char" || self.ntype=="byte"
1168: get_vars_char(h_sta, nil, nil)
1169: elsif self.ntype=="sint"
1170: get_vars_short(h_sta, nil, nil)
1171: elsif self.ntype=="int"
1172: get_vars_int(h_sta, nil, nil)
1173: elsif self.ntype=="sfloat"
1174: get_vars_float(h_sta, nil, nil)
1175: elsif self.ntype=="float"
1176: get_vars_double(h_sta, nil, nil)
1177: else
1178: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
1179: end
1180: elsif endq == true && strq == false
1181: h_end = hash["end"]
1182: if self.ntype == "char" || self.ntype=="byte"
1183: get_vars_char(h_sta, nil, h_end)
1184: elsif self.ntype=="sint"
1185: get_vars_short(h_sta, nil, h_end)
1186: elsif self.ntype=="int"
1187: get_vars_int(h_sta, nil, h_end)
1188: elsif self.ntype=="sfloat"
1189: get_vars_float(h_sta, nil, h_end)
1190: elsif self.ntype=="float"
1191: get_vars_double(h_sta, nil, h_end)
1192: else
1193: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
1194: end
1195: elsif endq == false && strq == true
1196: h_str = hash["stride"]
1197: if self.ntype == "char" || self.ntype=="byte"
1198: get_vars_char(h_sta, h_str, nil)
1199: elsif self.ntype=="sint"
1200: get_vars_short(h_sta, h_str, nil)
1201: elsif self.ntype=="int"
1202: get_vars_int(h_sta, h_str, nil)
1203: elsif self.ntype=="sfloat"
1204: get_vars_float(h_sta, h_str, nil)
1205: elsif self.ntype=="float"
1206: get_vars_double(h_sta, h_str, nil)
1207: else
1208: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
1209: end
1210: else endq == true && strq == true
1211: h_end = hash["end"]
1212: h_str = hash["stride"]
1213: if self.ntype == "char" || self.ntype=="byte"
1214: get_vars_char(h_sta, h_str, h_end)
1215: elsif self.ntype=="sint"
1216: get_vars_short(h_sta, h_str, h_end)
1217: elsif self.ntype=="int"
1218: get_vars_int(h_sta, h_str, h_end)
1219: elsif self.ntype=="sfloat"
1220: get_vars_float(h_sta, h_str, h_end)
1221: elsif self.ntype=="float"
1222: get_vars_double(h_sta, h_str, h_end)
1223: else
1224: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
1225: end
1226: end
1227: else
1228: raise ArgumentError,"{'start'}=>{ARRAY} or {'index'}=>{ARRAY} is needed"
1229: end
1230: end
# File lib/hdfeos5.rb, line 1061
1061: def simple_put(var,hash=nil)
1062: if hash == nil
1063: if self.ntype == "char" || self.ntype=="byte"
1064: put_vars_char([0,0,0,0,0,0,0,0], nil, nil, var)
1065: elsif self.ntype=="sint"
1066: put_vars_short([0,0,0,0,0,0,0,0], nil, nil, var)
1067: elsif self.ntype=="int"
1068: put_vars_int([0,0,0,0,0,0,0,0], nil, nil, var)
1069: elsif self.ntype=="sfloat"
1070: put_vars_float([0,0,0,0,0,0,0,0], nil, nil, var)
1071: elsif self.ntype=="float"
1072: put_vars_double([0,0,0,0,0,0,0,0], nil, nil, var)
1073: else
1074: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
1075: end
1076: elsif hash.key?("index")==true || hash.key?("start")==true
1077: h_sta = hash["start"]
1078: endq = hash.key?("end")
1079: strq = hash.key?("stride")
1080: if endq == false && strq == false
1081: if self.ntype == "char" || self.ntype=="byte"
1082: put_vars_char(h_sta, nil, nil, var)
1083: elsif self.ntype=="sint"
1084: put_vars_short(h_sta, nil, nil, var)
1085: elsif self.ntype=="int"
1086: put_vars_int(h_sta, nil, nil, var)
1087: elsif self.ntype=="sfloat"
1088: put_vars_float(h_sta, nil, nil, var)
1089: elsif self.ntype=="float"
1090: put_vars_double(h_sta, nil, nil, var)
1091: else
1092: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
1093: end
1094: elsif endq == true && strq == false
1095: h_end = hash["end"]
1096: if self.ntype == "char" || self.ntype=="byte"
1097: put_vars_char(h_sta, nil, h_end, var)
1098: elsif self.ntype=="sint"
1099: put_vars_short(h_sta, nil, h_end, var)
1100: elsif self.ntype=="int"
1101: put_vars_int(h_sta, nil, h_end, var)
1102: elsif self.ntype=="sfloat"
1103: put_vars_float(h_sta, nil, h_end, var)
1104: elsif self.ntype=="float"
1105: put_vars_double(h_sta, nil, h_end, var)
1106: else
1107: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
1108: end
1109: elsif endq == false && strq == true
1110: h_str = hash["stride"]
1111: if self.ntype == "char" || self.ntype=="byte"
1112: put_vars_char(h_sta, h_str, nil, var)
1113: elsif self.ntype=="sint"
1114: put_vars_short(h_sta, h_str, nil, var)
1115: elsif self.ntype=="int"
1116: put_vars_int(h_sta, h_str, nil, var)
1117: elsif self.ntype=="sfloat"
1118: put_vars_float(h_sta, h_str, nil, var)
1119: elsif self.ntype=="float"
1120: put_vars_double(h_sta, h_str, nil, var)
1121: else
1122: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
1123: end
1124: else endq == true && strq == true
1125: h_end = hash["end"]
1126: h_str = hash["stride"]
1127: if self.ntype == "char" || self.ntype=="byte"
1128: put_vars_char(h_sta, h_str, h_end, var)
1129: elsif self.ntype=="sint"
1130: put_vars_short(h_sta, h_str, h_end, var)
1131: elsif self.ntype=="int"
1132: put_vars_int(h_sta, h_str, h_end, var)
1133: elsif self.ntype=="sfloat"
1134: put_vars_float(h_sta, h_str, h_end, var)
1135: elsif self.ntype=="float"
1136: put_vars_double(h_sta, h_str, h_end, var)
1137: else
1138: raise ArgumentError, "variable type isn't supported in HDF-EOS5"
1139: end
1140: end
1141: else
1142: raise ArgumentError,"{'start'}=>{ARRAY} or {'index'}=>{ARRAY} is needed"
1143: end
1144: end
# File lib/hdfeos5.rb, line 1247
1247: def __rubber_expansion( args )
1248: if (id = args.index(false)) # substitution into id
1249: # false is incuded
1250: alen = args.length
1251: if args.rindex(false) != id
1252: raise ArguemntError,"only one rubber dimension is permitted"
1253: elsif alen > rank+1
1254: raise ArgumentError, "too many args"
1255: end
1256: ar = ( id!=0 ? args[0..id-1] : [] )
1257: args = ar + [true]*(rank-alen+1) + args[id+1..-1]
1258: elsif args.length == 0 # to support empty [], []=
1259: args = [true]*rank
1260: end
1261: args
1262: end