def initialize(path, not_use_nusdas_def=false)
@debug |= $DEBUG
unless NuSDaS.is_a_NuSDaS?(path)
raise "path must be NuSDaS root directory"
end
@root = path
@meta = Hash.new
flag = false
unless not_use_nusdas_def
flag = true if fnames = parse_nusdas_def
end
fnames = path unless flag
unless search_dir(fnames, flag)
raise "No NuSDaS files are found"
end
@meta[:basetimes].sort!
@meta[:nbasetime] = @meta[:basetimes].length
unless flag
[:members, :validtimes, :planes, :planes2, :elements].each{|name|
@meta[name].sort!.flatten!
}
@meta[:validtimes] = NArray.to_na(@meta[:validtimes])
@meta[:nmember] = @meta[:members].length
@meta[:nvalidtime] = @meta[:validtimes].length
@meta[:nplane] = @meta[:planes].length
@meta[:nelement] = @meta[:elements].length
end
names = [:basetimes, :elements, :planes, :validtimes, :members]
ind_hash = Hash.new
@meta[:files].each_with_index{|hash,i|
names.each{|name|
ary = @meta[name].to_a
v = hash[name]
if v==ary
hash[name] = true
else
unless h = ind_hash[name]
ind_hash[name] = h = Hash.new
ary.each_with_index{|vv,i| h[vv] = i}
end
if Array === v || NArray === v
hash[name] = v.collect{|el| h[el]}
else
hash[name] = h[v]
end
end
}
}
np = @meta[:nplane]
nt = @meta[:nvalidtime]
nm = @meta[:nmember]
ne = @meta[:nelement]
nb = @meta[:nbasetime]
na = NArray.byte(ne, np, nt, nm, nb).fill(@@fnumber_max+1)
ind = NArray.int(ne, np, nt, nm, nb).indgen
@meta[:files].each_with_index{|h,i|
slice = [h[:elements],h[:planes],h[:validtimes],h[:members],h[:basetimes]]
pos = h[:record_pos]
mask = pos.ne(0) & pos.ne(-1)
na[ind[*slice][mask]] = i
}
@meta[:fnumber] = na
end