seis_ruby 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +23 -4
- data/Rakefile +10 -0
- data/bin/seis_ruby +1 -1
- data/lib/seis_ruby/application.rb +76 -0
- data/lib/seis_ruby/command.rb +15 -0
- data/lib/seis_ruby/core_ext/file.rb +7 -0
- data/lib/seis_ruby/core_ext.rb +5 -0
- data/lib/seis_ruby/data/cmtsolution.rb +84 -64
- data/lib/seis_ruby/data/sac/ascii/head.rb +49 -0
- data/lib/seis_ruby/data/sac/ascii.rb +61 -0
- data/lib/seis_ruby/data/sac/binary/head.rb +5 -0
- data/lib/seis_ruby/data/sac/binary.rb +26 -0
- data/lib/seis_ruby/data/sac/body.rb +62 -0
- data/lib/seis_ruby/data/sac/head.rb +162 -0
- data/lib/seis_ruby/data/sac.rb +99 -3
- data/lib/seis_ruby/data.rb +6 -5
- data/lib/seis_ruby/database/global_cmt_catalog_search/cmtsolution_format.rb +30 -0
- data/lib/seis_ruby/database/global_cmt_catalog_search.rb +44 -0
- data/lib/seis_ruby/database.rb +3 -0
- data/lib/seis_ruby/version.rb +1 -1
- data/lib/seis_ruby.rb +12 -3
- data/seis_ruby.gemspec +8 -14
- data/test/data/000000001.SAC +0 -0
- data/test/data/000000001.SAC_ascii +32 -0
- data/test/seis_ruby/command_test.rb +19 -0
- data/test/seis_ruby/core_ext/file_test.rb +7 -0
- data/test/seis_ruby/data/cmtsolution_test.rb +63 -0
- data/test/seis_ruby/data/sac/ascii_test.rb +15 -0
- data/test/seis_ruby/data/sac/binary_test.rb +15 -0
- data/test/seis_ruby/data/sac/body_test.rb +27 -0
- data/test/seis_ruby/data/sac/head_test.rb +78 -0
- data/test/seis_ruby/data/sac_test.rb +52 -0
- data/test/seis_ruby/database/global_cmt_catalog_search/cmtsolution_format_test.rb +142 -0
- data/test/seis_ruby/database/global_cmt_catalog_search_test.rb +10 -0
- data/test/seis_ruby_test.rb +0 -0
- data/test/test_helper.rb +7 -0
- data/test.watchr +13 -0
- metadata +79 -54
- data/lib/seis_ruby/bin/seis_ruby_runner.rb +0 -58
- data/lib/seis_ruby/bin.rb +0 -6
- data/lib/seis_ruby/io/gcmt_catalog/custom_html_parser.rb +0 -16
- data/lib/seis_ruby/io/gcmt_catalog.rb +0 -50
- data/lib/seis_ruby/io.rb +0 -6
- data/rakefile +0 -8
- data/spec/seis_ruby/data/cmtsolution_spec.rb +0 -83
- data/spec/seis_ruby/io/gcmt_catalog_spec.rb +0 -19
- data/spec/seis_ruby/io/scrape.yaml +0 -3972
- data/spec/spec_helper.rb +0 -18
data/lib/seis_ruby/data/sac.rb
CHANGED
@@ -1,6 +1,102 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# @see http://www.iris.edu/software/sac/manual/file_format.html SAC User Manual/SAC Data Format
|
2
|
+
class ::SeisRuby::Data::Sac < ::SeisRuby::Data
|
3
|
+
require 'seis_ruby/data/sac/head'
|
4
|
+
require 'seis_ruby/data/sac/body'
|
5
|
+
require 'seis_ruby/data/sac/binary'
|
6
|
+
require 'seis_ruby/data/sac/ascii'
|
7
|
+
|
8
|
+
def self.load_file(file)
|
9
|
+
raw_data = File.read_uri(file)
|
10
|
+
type = type_from_file(file)
|
11
|
+
meta_data = {file: file}
|
12
|
+
|
13
|
+
load(raw_data, type, meta_data)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.load(raw_data, type = :binary, meta_data = {})
|
17
|
+
new(raw_data, type, meta_data)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.type_from_file(file)
|
21
|
+
if ::SeisRuby::Data::Sac::Binary.uri_for_self?(file)
|
22
|
+
:binary
|
23
|
+
elsif ::SeisRuby::Data::Sac::Ascii.uri_for_self?(file)
|
24
|
+
:ascii
|
25
|
+
else
|
26
|
+
raise ArgumentError, "Unsupported extension: #{ext}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.uri_for_self?(uri)
|
31
|
+
::SeisRuby::Data::Sac::Binary.uri_for_self?(uri) || ::SeisRuby::Data::Sac::Ascii.uri_for_self?(uri)
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize(raw_data, type = :binary, meta_data = {})
|
35
|
+
@raw_data = raw_data
|
36
|
+
@meta_data = meta_data
|
37
|
+
parse!(type)
|
38
|
+
end
|
39
|
+
|
40
|
+
attr_accessor :head # Header
|
41
|
+
attr_accessor :body # Wave
|
42
|
+
|
43
|
+
::SeisRuby::Data::Sac::Head::NAMES.each{|name|
|
44
|
+
define_method(name){@head[name]}
|
45
|
+
define_method("#{name}="){|val| @head[name] = val}}
|
46
|
+
|
47
|
+
def dump_file(file)
|
48
|
+
open(file, 'wb'){|io|
|
49
|
+
io.write(module_from_type(type_from_file(file)).dump(@head, @body))
|
50
|
+
io.flush
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def dump(type = :binary)
|
55
|
+
module_from_type(type).dump(@head, @body)
|
56
|
+
end
|
57
|
+
|
58
|
+
def eql?(other)
|
59
|
+
self.class == other.class\
|
60
|
+
&& @meta_data.eql?(other.meta_data)\
|
61
|
+
&& @raw_data.eql?(other.raw_data)\
|
62
|
+
&& @head.eql?(other.head)\
|
63
|
+
&& @body.eql?(other.body)
|
64
|
+
end
|
65
|
+
|
66
|
+
def hash
|
67
|
+
[self.class, @meta_data, @raw_data, @head, @body].hash
|
68
|
+
end
|
69
|
+
|
70
|
+
def ==(other)
|
71
|
+
@head == other.head\
|
72
|
+
&& @body == other.body
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def type_from_file(file)
|
78
|
+
self.class.type_from_file(file)
|
79
|
+
end
|
80
|
+
|
81
|
+
def module_from_type(type)
|
82
|
+
case type
|
83
|
+
when :binary
|
84
|
+
::SeisRuby::Data::Sac::Binary
|
85
|
+
when :ascii
|
86
|
+
::SeisRuby::Data::Sac::Ascii
|
87
|
+
else
|
88
|
+
raise ArgumentError, "Unsupported type: #{type}"
|
4
89
|
end
|
5
90
|
end
|
91
|
+
|
92
|
+
def parse!(type)
|
93
|
+
@head, @body = module_from_type(type).parse(@raw_data)
|
94
|
+
check_consistency
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def check_consistency
|
100
|
+
|
101
|
+
end
|
6
102
|
end
|
data/lib/seis_ruby/data.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
class ::SeisRuby::Data
|
2
|
+
require 'seis_ruby/data/sac'
|
3
|
+
require 'seis_ruby/data/cmtsolution'
|
4
|
+
|
5
|
+
attr_accessor :meta_data # Meta data about raw data.
|
6
|
+
attr_accessor :raw_data # Raw data.
|
6
7
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ::SeisRuby::Database::GlobalCmtCatalogSearch::CmtsolutionFormat
|
2
|
+
require 'mechanize'
|
3
|
+
|
4
|
+
class << self
|
5
|
+
def load_file(uri)
|
6
|
+
agent = Mechanize.new{|a|
|
7
|
+
a.pluggable_parser.html = CustomHtmlParser
|
8
|
+
}
|
9
|
+
agent.get(uri)
|
10
|
+
|
11
|
+
events\
|
12
|
+
= agent.page.search('pre')\
|
13
|
+
.find{|e| e.text =~ /event name:/}\
|
14
|
+
.text.split("\n\n")\
|
15
|
+
.delete_if{|t| t.strip.empty?}\
|
16
|
+
.map{|text| ::SeisRuby::Data::Cmtsolution.load(text, {file: uri})}
|
17
|
+
|
18
|
+
unless next_link = agent.page.links.find{|elem| elem.text == 'More solutions'}
|
19
|
+
return events
|
20
|
+
end
|
21
|
+
events.concat(load_file(next_link.uri))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class CustomHtmlParser < ::Mechanize::Page
|
26
|
+
def initialize(uri = nil, response = nil, body = nil, code = nil, mech = nil)
|
27
|
+
super(uri, response, body.gsub(/<=/, '<='), code, mech)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module ::SeisRuby::Database::GlobalCmtCatalogSearch
|
2
|
+
require 'seis_ruby/database/global_cmt_catalog_search/cmtsolution_format'
|
3
|
+
|
4
|
+
# Examples of target URI
|
5
|
+
# http://www.globalcmt.org/cgi-bin/globalcmt-cgi-bin/CMT4/form?itype=ymd&yr=1976&mo=1&day=1&oyr=1976&omo=1&oday=1&jyr=1976&jday=1&ojyr=1&ojday=1&otype=nd&nday=400&lmw=0&umw=10&lms=0&ums=10&lmb=0&umb=10&llat=-90&ulat=90&llon=-180&ulon=180&lhd=0&uhd=1000<s=-9999&uts=9999&lpe1=0&upe1=90&lpe2=0&upe2=90&list=4
|
6
|
+
# http://www.ldeo.columbia.edu/cgi-bin/globalcmt-cgi-bin/CMT4/form?itype=ymd&yr=1976&mo=1&day=1&oyr=1976&omo=1&oday=1&jyr=1976&jday=1&ojyr=1&ojday=1&otype=nd&nday=400&lmw=0&umw=10&lms=0&ums=10&lmb=0&umb=10&llat=-90&ulat=90&llon=-180&ulon=180&lhd=0&uhd=1000<s=-9999&uts=9999&lpe1=0&upe1=90&lpe2=0&upe2=90&list=4&start=99
|
7
|
+
URI_FOR_SELF_REG = /\Ahttp:\/\/www\.(?:globalcmt\.org|ldeo\.columbia\.edu)\/cgi-bin\/globalcmt-cgi-bin\/CMT4\/form\?.*list=([0-5]+).*/
|
8
|
+
|
9
|
+
class << self
|
10
|
+
# @param [String] uri
|
11
|
+
# @return [Boolean]
|
12
|
+
def uri_for_self?(uri)
|
13
|
+
uri =~ URI_FOR_SELF_REG
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param [String] uri URI of a first page of Global CMT Catalog Search result.
|
17
|
+
# @return [Array<Hash>] {::SeisRuby::Data::Cmtsolution#parse}
|
18
|
+
def load_file(uri)
|
19
|
+
raise ArgumentError, "Not a URI of #{self}: #{uri}" unless uri =~ URI_FOR_SELF_REG
|
20
|
+
module_from_list_number(Regexp.last_match(1).to_i).load_file(uri)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def module_from_list_number(list_number)
|
26
|
+
case list_number
|
27
|
+
when 0
|
28
|
+
raise NotImplementedError, "Standard"
|
29
|
+
when 1
|
30
|
+
raise NotImplementedError, "List of event names"
|
31
|
+
when 2
|
32
|
+
raise NotImplementedError, "GMT psvelomeca input"
|
33
|
+
when 3
|
34
|
+
raise NotImplementedError, "GMT psmeca input"
|
35
|
+
when 4
|
36
|
+
::SeisRuby::Database::GlobalCmtCatalogSearch::CmtsolutionFormat
|
37
|
+
when 5
|
38
|
+
raise NotImplementedError, "Full format"
|
39
|
+
else
|
40
|
+
raise ArgumentError, "Unsupported list number: #{list_number}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/seis_ruby/version.rb
CHANGED
data/lib/seis_ruby.rb
CHANGED
@@ -1,5 +1,14 @@
|
|
1
|
-
|
1
|
+
# @see ::SeisRuby::Command Module functions.
|
2
|
+
module ::SeisRuby
|
3
|
+
AUTHOR = 'Kasahara Amato'
|
4
|
+
LICENSE = 'GNU GENERAL PUBLIC LICENSE Version 3'
|
5
|
+
|
6
|
+
require 'seis_ruby/core_ext'
|
2
7
|
require 'seis_ruby/version'
|
3
|
-
require '
|
4
|
-
|
8
|
+
require 'seis_ruby/data'
|
9
|
+
require 'seis_ruby/database'
|
10
|
+
require 'seis_ruby/command'
|
11
|
+
require 'seis_ruby/application'
|
12
|
+
|
13
|
+
extend ::SeisRuby::Command
|
5
14
|
end
|
data/seis_ruby.gemspec
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
gem_name = File.basename(Dir.pwd)
|
2
|
-
require 'rainbow'
|
3
2
|
require 'ruby_patch'
|
4
3
|
|
5
4
|
dir = File.join(__DIR__, 'lib')
|
@@ -11,29 +10,24 @@ Gem::Specification.new do |s|
|
|
11
10
|
s.name = gem_name
|
12
11
|
s.summary = "Ruby library for earthquake science."
|
13
12
|
s.version = SeisRuby::VERSION
|
14
|
-
s.add_development_dependency '
|
15
|
-
s.add_development_dependency 'simplecov', '~> 0.6'
|
16
|
-
s.add_runtime_dependency 'rainbow', '~> 1.1'
|
13
|
+
s.add_development_dependency 'watchr', '~> 0.7'
|
17
14
|
s.add_runtime_dependency 'thor', '~> 0.15'
|
18
15
|
s.add_runtime_dependency 'mechanize', '~> 2.5'
|
19
|
-
s.
|
16
|
+
s.add_development_dependency 'pry', '>= 0.9.10'
|
17
|
+
s.add_development_dependency 'ruby_patch', '>= 1.1.0'
|
20
18
|
s.author = 'kshramt'
|
21
|
-
s.description = "Ruby library for earthquake science.
|
19
|
+
s.description = "Ruby library for earthquake science."
|
22
20
|
s.executables << 'seis_ruby'
|
23
|
-
s.post_install_message =
|
21
|
+
s.post_install_message = <<-EOS
|
24
22
|
|
25
23
|
|
26
|
-
SeisRuby #{::SeisRuby::VERSION}
|
27
|
-
Thank you for installing.
|
28
24
|
Please execute following command:
|
29
25
|
|
30
|
-
#{::SeisRuby::
|
31
|
-
|
32
|
-
Enjoy!
|
26
|
+
#{::SeisRuby::Application::COMMAND} generate_completion
|
33
27
|
|
34
28
|
|
35
29
|
EOS
|
36
|
-
|
37
|
-
s.required_ruby_version = '~> 1.9'
|
30
|
+
s.required_ruby_version = '>= 1.9.3'
|
38
31
|
s.test_files.concat `git ls-files spec`.split.select{|path| path =~ /_spec\.rb/}
|
32
|
+
s.test_files.concat `git ls-files test`.split.select{|path| path =~ /_test\.rb/}
|
39
33
|
end
|
Binary file
|
@@ -0,0 +1,32 @@
|
|
1
|
+
0.02500000 -12345.00 -12345.00 1.000000e+10 -12345.00
|
2
|
+
0.0005380000 725.6500 -292.0595 -12345.00 2.000000
|
3
|
+
-12345.00 -12345.00 -12345.00 -12345.00 -12345.00
|
4
|
+
-12345.00 -12345.00 -12345.00 -12345.00 -12345.00
|
5
|
+
-12345.00 -12345.00 -12345.00 -12345.00 -12345.00
|
6
|
+
-12345.00 -12345.00 -12345.00 -12345.00 -12345.00
|
7
|
+
-12345.00 0.000000 90.00000 1000.000 2.000000
|
8
|
+
0.000000 0.000000 -12345.00 10000.00 7.000000
|
9
|
+
-12345.00 -12345.00 -12345.00 -12345.00 -12345.00
|
10
|
+
-12345.00 -12345.00 -12345.00 -12345.00 -12345.00
|
11
|
+
10018.76 90.00000 270.0000 90.00000 -12345.00
|
12
|
+
-12345.00 -12345.00 0.000000 0.000000 -12345.00
|
13
|
+
-12345.00 -12345.00 -12345.00 -12345.00 -12345.00
|
14
|
+
-12345.00 -12345.00 -12345.00 -12345.00 -12345.00
|
15
|
+
2012 100 1 2 3
|
16
|
+
4 6 0 0 9
|
17
|
+
-12345 -12345 -12345 -12345 -12345
|
18
|
+
1 5 -12345 -12345 -12345
|
19
|
+
-12345 -12345 -12345 -12345 -12345
|
20
|
+
-12345 -12345 -12345 -12345 -12345
|
21
|
+
-12345 -12345 -12345 -12345 -12345
|
22
|
+
1 0 0 1 0
|
23
|
+
TEST -12345
|
24
|
+
10 -12345 -12345
|
25
|
+
-12345 -12345 -12345
|
26
|
+
-12345 -12345 -12345
|
27
|
+
-12345 -12345 -12345
|
28
|
+
-12345 -12345 -12345
|
29
|
+
-12345 -12345 BHZ
|
30
|
+
XX -12345 -12345
|
31
|
+
-24370.00 -29946.00 -24963.00 -26414.00 -27634.00
|
32
|
+
-23068.00 -20123.00 -24239.00 -21714.00
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ::CommandTest < ::MiniTest::Unit::TestCase
|
4
|
+
SAC_ASCII_FILE = "test/data/000000001.SAC_ascii"
|
5
|
+
SAC_BINARY_FILE = "test/data/000000001.SAC"
|
6
|
+
|
7
|
+
def test_load_file_sac_binary
|
8
|
+
assert(::SeisRuby.load_file(SAC_BINARY_FILE))
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_load_file_sac_ascii
|
12
|
+
assert(::SeisRuby.load_file(SAC_ASCII_FILE))
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_load_file_global_cmt_catalog_search
|
16
|
+
assert(::SeisRuby.load_file('http://www.globalcmt.org/cgi-bin/globalcmt-cgi-bin/CMT4/form?itype=ymd&yr=1976&mo=1&day=1&oyr=1976&omo=1&oday=1&jyr=1976&jday=1&ojyr=1&ojday=1&otype=nd&nday=400&lmw=0&umw=10&lms=0&ums=10&lmb=0&umb=10&llat=-90&ulat=90&llon=-180&ulon=180&lhd=0&uhd=1000<s=-9999&uts=9999&lpe1=0&upe1=90&lpe2=0&upe2=90&list=4'))
|
17
|
+
assert(::SeisRuby.load_file('http://www.ldeo.columbia.edu/cgi-bin/globalcmt-cgi-bin/CMT4/form?itype=ymd&yr=1976&mo=1&day=1&oyr=1976&omo=1&oday=1&jyr=1976&jday=1&ojyr=1&ojday=1&otype=nd&nday=400&lmw=0&umw=10&lms=0&ums=10&lmb=0&umb=10&llat=-90&ulat=90&llon=-180&ulon=180&lhd=0&uhd=1000<s=-9999&uts=9999&lpe1=0&upe1=90&lpe2=0&upe2=90&list=4&start=99'))
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ::CmtsolutionTest < ::MiniTest::Unit::TestCase
|
4
|
+
RAW_DATA = <<-EOS
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
MLI 1976 1 2 3 29 39.60 -28.6100 -177.6400 59.0 6.2 0.0 KERMADEC ISLANDS REGION
|
9
|
+
event name: 010176A
|
10
|
+
time shift: 13.8000
|
11
|
+
half duration: 9.4000
|
12
|
+
latitude: -29.2500
|
13
|
+
longitude: -176.9600
|
14
|
+
depth: 47.8000
|
15
|
+
Mrr: 7.680000e+26
|
16
|
+
Mtt: 9.000000e+24
|
17
|
+
Mpp: -7.770000e+26
|
18
|
+
Mrt: 1.390000e+26
|
19
|
+
Mrp: 4.520000e+26
|
20
|
+
Mtp: -3.260000e+26
|
21
|
+
|
22
|
+
|
23
|
+
EOS
|
24
|
+
|
25
|
+
def test_load
|
26
|
+
cmtsolution = ::SeisRuby::Data::Cmtsolution.load(RAW_DATA, {file: '(test)'})
|
27
|
+
hypocenter_table = {
|
28
|
+
data_source: 'MLI',
|
29
|
+
year: 1976,
|
30
|
+
month: 1,
|
31
|
+
day: 2,
|
32
|
+
hour: 3,
|
33
|
+
minute: 29,
|
34
|
+
second: 39.6,
|
35
|
+
latitude: -28.61,
|
36
|
+
longitude: -177.64,
|
37
|
+
depth: 59.0,
|
38
|
+
mb: 6.2,
|
39
|
+
ms: 0.0,
|
40
|
+
region_name: 'KERMADEC ISLANDS REGION',
|
41
|
+
}
|
42
|
+
centroid_table = {
|
43
|
+
event_name: '010176A',
|
44
|
+
time_shift: 13.8,
|
45
|
+
half_duration: 9.4,
|
46
|
+
latitude: -29.25,
|
47
|
+
longitude: -176.96,
|
48
|
+
depth: 47.8,
|
49
|
+
mrr: 7.68e+26,
|
50
|
+
mtt: 9.0e+24,
|
51
|
+
mpp: -7.77e+26,
|
52
|
+
mrt: 1.39e+26,
|
53
|
+
mrp: 4.52e+26,
|
54
|
+
mtp: -3.26e+26,
|
55
|
+
}
|
56
|
+
assert_equal(hypocenter_table, cmtsolution.hypocenter.table)
|
57
|
+
assert_equal(centroid_table, cmtsolution.centroid.table)
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_time
|
61
|
+
assert_equal(Time.gm(1976, 1, 2, 3, 29, 39, 600000), ::SeisRuby::Data::Cmtsolution.load(RAW_DATA, {file: '(test)'}).hypocenter.origin_time)
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ::AsciiTest < ::MiniTest::Unit::TestCase
|
4
|
+
RAW_DATA = File.read "test/data/000000001.SAC_ascii"
|
5
|
+
|
6
|
+
def test_parse
|
7
|
+
assert_equal(
|
8
|
+
[Hash, Array],
|
9
|
+
::SeisRuby::Data::Sac::Ascii.parse(RAW_DATA).map(&:class))
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_dump
|
13
|
+
assert(::SeisRuby::Data::Sac::Binary.dump({iftype: :itime}, []))
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ::BinaryTest < ::MiniTest::Unit::TestCase
|
4
|
+
RAW_DATA = File.read("test/data/000000001.SAC")
|
5
|
+
|
6
|
+
def test_parse
|
7
|
+
assert_equal(
|
8
|
+
[Hash, Array],
|
9
|
+
::SeisRuby::Data::Sac::Binary.parse(RAW_DATA).map(&:class))
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_dump
|
13
|
+
assert(::SeisRuby::Data::Sac::Binary.dump({iftype: :itime}, []))
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ::BodyTest < ::MiniTest::Unit::TestCase
|
4
|
+
T = ::SeisRuby::Data::Sac::Body
|
5
|
+
|
6
|
+
def test_shape_body
|
7
|
+
[
|
8
|
+
[[1, 2, 3, 4], {iftype: :itime}, [1, 2, 3, 4]],
|
9
|
+
[[[3, 1], [4, 2]], {iftype: :ixy}, [1, 2, 3, 4]],
|
10
|
+
[[[3, 1], [4, 2]], {iftype: :iamph}, [1, 2, 3, 4]],
|
11
|
+
[[Complex(1, 3), Complex(2, 4)], {iftype: :irlim}, [1, 2, 3, 4]],
|
12
|
+
[[[1, 3, 5], [2, 4, 6]], {iftype: :ixyz, nxsize: 2}, [1, 2, 3, 4, 5, 6]],
|
13
|
+
].each{|expect, head, body|
|
14
|
+
assert_equal(expect, T.shape_body(body, head))}
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_body_for_dump
|
18
|
+
[
|
19
|
+
[[1, 2, 3, 4], {iftype: :itime}, [1, 2, 3, 4]],
|
20
|
+
[[1, 2, 3, 4], {iftype: :ixy}, [[3, 1], [4, 2]]],
|
21
|
+
[[1, 2, 3, 4], {iftype: :iamph}, [[3, 1], [4, 2]]],
|
22
|
+
[[1, 2, 3, 4], {iftype: :irlim}, [Complex(1, 3), Complex(2, 4)]],
|
23
|
+
[[1, 2, 3, 4, 5, 6], {iftype: :ixyz, nxsize: 2}, [[1, 3, 5], [2, 4, 6]]],
|
24
|
+
].each{|expect, head, body|
|
25
|
+
assert_equal(expect, T.body_for_dump(body, head))}
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class HeadTest < ::MiniTest::Unit::TestCase
|
4
|
+
require 'ostruct'
|
5
|
+
|
6
|
+
# undefined, valid, invalid
|
7
|
+
# :f -12345.0, 42.0, :sym
|
8
|
+
# :n -12345, 42, :sym
|
9
|
+
# :i -12445, :sym, (-1, 0, 87, 88)
|
10
|
+
# :l -12345, (1, 0), /
|
11
|
+
# :k "-12345", "42", /
|
12
|
+
|
13
|
+
T = ::SeisRuby::Data::Sac::Head
|
14
|
+
|
15
|
+
F_FROM = T::CONVERTER_FROM_HEAD_FLOAT
|
16
|
+
N_FROM = T::CONVERTER_FROM_HEAD_INTEGER
|
17
|
+
I_FROM = T::CONVERTER_FROM_HEAD_ENUMERATED_VALUE
|
18
|
+
L_FROM = T::CONVERTER_FROM_HEAD_LOGICAL
|
19
|
+
K_FROM = T::CONVERTER_FROM_HEAD_STRING
|
20
|
+
|
21
|
+
def test_convert_from_head_undefined
|
22
|
+
assert_nil(F_FROM.call(-12345.0))
|
23
|
+
assert_nil(N_FROM.call(-12345))
|
24
|
+
assert_nil(I_FROM.call(-12345))
|
25
|
+
assert_nil(K_FROM.call("-12345"))
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_convert_from_head_valid
|
29
|
+
assert_equal(42.0, F_FROM.call(42.0))
|
30
|
+
assert_equal(42, N_FROM.call(42))
|
31
|
+
assert_equal(:itime, I_FROM.call(1))
|
32
|
+
assert_equal(:ipostq, I_FROM.call(42))
|
33
|
+
assert_equal(:iu, I_FROM.call(86))
|
34
|
+
assert_equal(true, L_FROM.call(1))
|
35
|
+
assert_equal(false, L_FROM.call(0))
|
36
|
+
assert_equal("42", K_FROM.call("42"))
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_convert_from_head_invalid
|
40
|
+
assert_raises(ArgumentError, NoMethodError){F_FROM.call(:'1.0')}
|
41
|
+
assert_raises(ArgumentError, NoMethodError){N_FROM.call(:'1')}
|
42
|
+
assert_raises(ArgumentError, NoMethodError){I_FROM.call(-1)}
|
43
|
+
assert_raises(ArgumentError, NoMethodError){I_FROM.call(0)}
|
44
|
+
assert_raises(ArgumentError, NoMethodError){I_FROM.call(87)}
|
45
|
+
assert_raises(ArgumentError, NoMethodError){I_FROM.call(88)}
|
46
|
+
end
|
47
|
+
|
48
|
+
F_TO = T::CONVERTER_TO_HEAD_FLOAT
|
49
|
+
N_TO = T::CONVERTER_TO_HEAD_INTEGER
|
50
|
+
I_TO = T::CONVERTER_TO_HEAD_ENUMERATED_VALUE
|
51
|
+
L_TO = T::CONVERTER_TO_HEAD_LOGICAL
|
52
|
+
K_TO = T::CONVERTER_TO_HEAD_STRING
|
53
|
+
|
54
|
+
def test_convert_to_head_undefined
|
55
|
+
assert_equal(-12345.0, F_TO.call(nil))
|
56
|
+
assert_equal(-12345, N_TO.call(nil))
|
57
|
+
assert_equal(-12345, I_TO.call(nil))
|
58
|
+
assert_equal(0, L_TO.call(nil))
|
59
|
+
assert_equal("-12345", K_TO.call(nil))
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_convert_to_head_valid
|
63
|
+
assert_equal(42.0, F_TO.call(42.0))
|
64
|
+
assert_equal(42, N_TO.call(42))
|
65
|
+
assert_equal(1, I_TO.call(:itime))
|
66
|
+
assert_equal(42, I_TO.call(:ipostq))
|
67
|
+
assert_equal(86, I_TO.call(:iu))
|
68
|
+
assert_equal(1, L_TO.call(true))
|
69
|
+
assert_equal(0, L_TO.call(false))
|
70
|
+
assert_equal("42", K_TO.call("42"))
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_convert_to_head_invalid
|
74
|
+
assert_raises(ArgumentError, NoMethodError){F_TO.call(:"42.0")}
|
75
|
+
assert_raises(ArgumentError, NoMethodError){N_TO.call(:"42")}
|
76
|
+
assert_raises(ArgumentError, NoMethodError){I_TO.call(:this_is_not_exist)}
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ::SacTest < ::MiniTest::Unit::TestCase
|
4
|
+
ASCII_FILE = "test/data/000000001.SAC_ascii"
|
5
|
+
BINARY_FILE = "test/data/000000001.SAC"
|
6
|
+
def test_new_binary
|
7
|
+
assert(::SeisRuby::Data::Sac.new(File.read(BINARY_FILE), :binary))
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_new_ascii
|
11
|
+
assert(::SeisRuby::Data::Sac.new(File.read(ASCII_FILE), :ascii))
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_load
|
15
|
+
assert(::SeisRuby::Data::Sac.load(File.read(BINARY_FILE), :binary))
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_parse_binary
|
19
|
+
sac = ::SeisRuby::Data::Sac.load(File.read(BINARY_FILE), :binary)
|
20
|
+
assert(sac.head)
|
21
|
+
assert_equal(Hash, sac.head.class)
|
22
|
+
assert(sac.body)
|
23
|
+
assert_equal(sac.body.class, Array)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_load_file
|
27
|
+
assert(::SeisRuby::Data::Sac.load_file(BINARY_FILE))
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_dump
|
31
|
+
sac = ::SeisRuby::Data::Sac.load_file(BINARY_FILE)
|
32
|
+
assert(sac.dump(:binary))
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_dump_file
|
36
|
+
assert(::SeisRuby::Data::Sac.load_file(BINARY_FILE).dump_file(BINARY_FILE + '.sac'))
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_binary_not_break_file
|
40
|
+
sac_binary_original = ::SeisRuby::Data::Sac.load_file(BINARY_FILE)
|
41
|
+
sac_binary_original.dump_file(BINARY_FILE + '.sac')
|
42
|
+
sac_binary_dumped = ::SeisRuby::Data::Sac.load_file(BINARY_FILE + '.sac')
|
43
|
+
assert_equal(sac_binary_original, sac_binary_dumped)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_ascii_not_break_file
|
47
|
+
sac_ascii_original = ::SeisRuby::Data::Sac.load_file(ASCII_FILE)
|
48
|
+
sac_ascii_original.dump_file(ASCII_FILE + '.sac_ascii')
|
49
|
+
sac_ascii_dumped = ::SeisRuby::Data::Sac.load_file(ASCII_FILE + '.sac_ascii')
|
50
|
+
assert_equal(sac_ascii_original, sac_ascii_dumped)
|
51
|
+
end
|
52
|
+
end
|