macroape 4.0.2 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +17 -17
- data/Gemfile +4 -4
- data/LICENSE +22 -22
- data/README.md +70 -70
- data/Rakefile.rb +49 -49
- data/TODO.txt +46 -46
- data/benchmark/benchmark_helper.rb +4 -4
- data/benchmark/similarity_benchmark.rb +52 -52
- data/bin/align_motifs +4 -4
- data/bin/eval_alignment +4 -4
- data/bin/eval_similarity +4 -4
- data/bin/find_pvalue +4 -4
- data/bin/find_threshold +4 -4
- data/bin/preprocess_collection +4 -4
- data/bin/scan_collection +4 -4
- data/lib/macroape.rb +14 -11
- data/lib/macroape/aligned_pair_intersection.rb +61 -62
- data/lib/macroape/cli.rb +191 -188
- data/lib/macroape/cli/align_motifs.rb +120 -100
- data/lib/macroape/cli/eval_alignment.rb +157 -156
- data/lib/macroape/cli/eval_similarity.rb +138 -137
- data/lib/macroape/cli/find_pvalue.rb +93 -87
- data/lib/macroape/cli/find_threshold.rb +103 -96
- data/lib/macroape/cli/preprocess_collection.rb +169 -161
- data/lib/macroape/cli/scan_collection.rb +171 -163
- data/lib/macroape/collection.rb +29 -0
- data/lib/macroape/motif_with_thresholds.rb +18 -0
- data/lib/macroape/pwm_compare.rb +39 -44
- data/lib/macroape/pwm_compare_aligned.rb +139 -130
- data/lib/macroape/{counting.rb → pwm_counting.rb} +175 -121
- data/lib/macroape/support/inverf.rb +13 -0
- data/lib/macroape/support/partial_sums.rb +17 -0
- data/lib/macroape/version.rb +4 -4
- data/macroape.gemspec +19 -19
- data/spec/count_distribution_spec.rb +112 -109
- data/spec/inverf_spec.rb +23 -0
- data/spec/partial_sums_spec.rb +28 -0
- data/spec/spec_helper.rb +11 -11
- data/test/align_motifs_test.rb +42 -43
- data/test/data/AHR_si.pwm +10 -10
- data/test/data/KLF3_f1.pcm +16 -16
- data/test/data/KLF3_f1.pwm +16 -16
- data/test/data/KLF4_f2.pcm +11 -11
- data/test/data/KLF4_f2.pwm +11 -11
- data/test/data/KLF4_f2_scan_results_all.txt +2 -2
- data/test/data/KLF4_f2_scan_results_default_cutoff.txt +1 -1
- data/test/data/KLF4_f2_scan_results_precise_mode.txt +2 -2
- data/test/data/SP1_f1.pcm +12 -12
- data/test/data/SP1_f1.pwm +12 -12
- data/test/data/SP1_f1_revcomp.pcm +12 -12
- data/test/data/SP1_f1_revcomp.pwm +12 -12
- data/test/data/medium_motif.pwm +8 -8
- data/test/data/short_motif.pwm +7 -7
- data/test/data/test_collection.yaml +231 -214
- data/test/data/test_collection/GABPA_f1.pwm +14 -14
- data/test/data/test_collection/KLF4_f2.pwm +10 -10
- data/test/data/test_collection/SP1_f1.pwm +12 -12
- data/test/data/test_collection_pcm/GABPA_f1.pcm +14 -14
- data/test/data/test_collection_pcm/KLF4_f2.pcm +11 -11
- data/test/data/test_collection_pcm/SP1_f1.pcm +12 -12
- data/test/data/test_collection_single_file.txt +38 -38
- data/test/data/test_collection_single_file_pcm.txt +37 -37
- data/test/data/test_collection_weak.yaml +231 -214
- data/test/eval_alignment_test.rb +90 -111
- data/test/eval_similarity_test.rb +105 -123
- data/test/find_pvalue_test.rb +34 -39
- data/test/find_threshold_test.rb +87 -91
- data/test/preprocess_collection_test.rb +56 -65
- data/test/scan_collection_test.rb +42 -48
- data/test/test_helper.rb +159 -160
- metadata +14 -10
- data/test/data/collection_pcm_without_thresholds.yaml +0 -188
- data/test/data/collection_without_thresholds.yaml +0 -188
@@ -1,137 +1,138 @@
|
|
1
|
-
require_relative '../../macroape'
|
2
|
-
|
3
|
-
module Macroape
|
4
|
-
module CLI
|
5
|
-
module EvalSimilarity
|
6
|
-
|
7
|
-
def self.main(argv)
|
8
|
-
doc = <<-EOS.strip_doc
|
9
|
-
Command-line format:
|
10
|
-
#{run_tool_cmd} <1st matrix pat-file> <2nd matrix pat-file> [options]
|
11
|
-
|
12
|
-
Options:
|
13
|
-
[-p <P-value>]
|
14
|
-
[-d <discretization level>]
|
15
|
-
[--pcm] - treat the input file as Position Count Matrix. PCM-to-PWM transformation to be done internally.
|
16
|
-
[--boundary lower|upper] Upper boundary (default) means that the obtained P-value is greater than or equal to the requested P-value
|
17
|
-
[-b <background probabilities] ACGT - 4 numbers, comma-delimited(spaces not allowed), sum should be equal to 1, like 0.25,0.24,0.26,0.25
|
18
|
-
[--first-threshold <threshold for the first matrix>]
|
19
|
-
[--second-threshold <threshold for the second matrix>]
|
20
|
-
|
21
|
-
Examples:
|
22
|
-
#{run_tool_cmd} motifs/KLF4_f2.pat motifs/SP1_f1.pat -p 0.0005 -d 100 -b 0.3,0.2,0.2,0.3
|
23
|
-
EOS
|
24
|
-
|
25
|
-
if argv.empty? || ['-h', '--h', '-help', '--help'].any?{|help_option| argv.include?(help_option)}
|
26
|
-
$stderr.puts doc
|
27
|
-
exit
|
28
|
-
end
|
29
|
-
|
30
|
-
pvalue = 0.0005
|
31
|
-
discretization = 10.0
|
32
|
-
|
33
|
-
first_background =
|
34
|
-
second_background =
|
35
|
-
|
36
|
-
max_hash_size = 10000000
|
37
|
-
max_pair_hash_size = 10000
|
38
|
-
pvalue_boundary = :upper
|
39
|
-
|
40
|
-
data_model = argv.delete('--pcm') ?
|
41
|
-
first_file = argv.shift
|
42
|
-
second_file = argv.shift
|
43
|
-
raise 'You should specify two input files' unless first_file and second_file
|
44
|
-
|
45
|
-
until argv.empty?
|
46
|
-
case argv.shift
|
47
|
-
when '-p'
|
48
|
-
pvalue = argv.shift.to_f
|
49
|
-
when '-d'
|
50
|
-
discretization = argv.shift.to_f
|
51
|
-
when '--max-hash-size'
|
52
|
-
max_hash_size = argv.shift.to_i
|
53
|
-
when '--max-2d-hash-size'
|
54
|
-
max_pair_hash_size = argv.shift.to_i
|
55
|
-
when '-b'
|
56
|
-
second_background = first_background = argv.shift
|
57
|
-
when '-b1'
|
58
|
-
first_background = argv.shift
|
59
|
-
when '-b2'
|
60
|
-
second_background = argv.shift
|
61
|
-
when '--boundary'
|
62
|
-
pvalue_boundary = argv.shift.to_sym
|
63
|
-
raise 'boundary should be either lower or upper' unless pvalue_boundary == :lower || pvalue_boundary == :upper
|
64
|
-
when '--first-threshold'
|
65
|
-
predefined_threshold_first = argv.shift.to_f
|
66
|
-
when '--second-threshold'
|
67
|
-
predefined_threshold_second = argv.shift.to_f
|
68
|
-
end
|
69
|
-
end
|
70
|
-
raise 'background should be symmetric: p(A)=p(T) and p(G) = p(C)' unless first_background
|
71
|
-
raise 'background should be symmetric: p(A)=p(T) and p(G) = p(C)' unless second_background
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
info.
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
end
|
1
|
+
require_relative '../../macroape'
|
2
|
+
|
3
|
+
module Macroape
|
4
|
+
module CLI
|
5
|
+
module EvalSimilarity
|
6
|
+
|
7
|
+
def self.main(argv)
|
8
|
+
doc = <<-EOS.strip_doc
|
9
|
+
Command-line format:
|
10
|
+
#{run_tool_cmd} <1st matrix pat-file> <2nd matrix pat-file> [options]
|
11
|
+
|
12
|
+
Options:
|
13
|
+
[-p <P-value>]
|
14
|
+
[-d <discretization level>]
|
15
|
+
[--pcm] - treat the input file as Position Count Matrix. PCM-to-PWM transformation to be done internally.
|
16
|
+
[--boundary lower|upper] Upper boundary (default) means that the obtained P-value is greater than or equal to the requested P-value
|
17
|
+
[-b <background probabilities] ACGT - 4 numbers, comma-delimited(spaces not allowed), sum should be equal to 1, like 0.25,0.24,0.26,0.25
|
18
|
+
[--first-threshold <threshold for the first matrix>]
|
19
|
+
[--second-threshold <threshold for the second matrix>]
|
20
|
+
|
21
|
+
Examples:
|
22
|
+
#{run_tool_cmd} motifs/KLF4_f2.pat motifs/SP1_f1.pat -p 0.0005 -d 100 -b 0.3,0.2,0.2,0.3
|
23
|
+
EOS
|
24
|
+
|
25
|
+
if argv.empty? || ['-h', '--h', '-help', '--help'].any?{|help_option| argv.include?(help_option)}
|
26
|
+
$stderr.puts doc
|
27
|
+
exit
|
28
|
+
end
|
29
|
+
|
30
|
+
pvalue = 0.0005
|
31
|
+
discretization = 10.0
|
32
|
+
|
33
|
+
first_background = Bioinform::Background::Wordwise
|
34
|
+
second_background = Bioinform::Background::Wordwise
|
35
|
+
|
36
|
+
max_hash_size = 10000000
|
37
|
+
max_pair_hash_size = 10000
|
38
|
+
pvalue_boundary = :upper
|
39
|
+
|
40
|
+
data_model = argv.delete('--pcm') ? :pcm : :pwm
|
41
|
+
first_file = argv.shift
|
42
|
+
second_file = argv.shift
|
43
|
+
raise 'You should specify two input files' unless first_file and second_file
|
44
|
+
|
45
|
+
until argv.empty?
|
46
|
+
case argv.shift
|
47
|
+
when '-p'
|
48
|
+
pvalue = argv.shift.to_f
|
49
|
+
when '-d'
|
50
|
+
discretization = argv.shift.to_f
|
51
|
+
when '--max-hash-size'
|
52
|
+
max_hash_size = argv.shift.to_i
|
53
|
+
when '--max-2d-hash-size'
|
54
|
+
max_pair_hash_size = argv.shift.to_i
|
55
|
+
when '-b'
|
56
|
+
second_background = first_background = Bioinform::Background.from_string(argv.shift)
|
57
|
+
when '-b1'
|
58
|
+
first_background = Bioinform::Background.from_string(argv.shift)
|
59
|
+
when '-b2'
|
60
|
+
second_background = Bioinform::Background.from_string(argv.shift)
|
61
|
+
when '--boundary'
|
62
|
+
pvalue_boundary = argv.shift.to_sym
|
63
|
+
raise 'boundary should be either lower or upper' unless pvalue_boundary == :lower || pvalue_boundary == :upper
|
64
|
+
when '--first-threshold'
|
65
|
+
predefined_threshold_first = argv.shift.to_f
|
66
|
+
when '--second-threshold'
|
67
|
+
predefined_threshold_second = argv.shift.to_f
|
68
|
+
end
|
69
|
+
end
|
70
|
+
raise 'background should be symmetric: p(A)=p(T) and p(G) = p(C)' unless first_background.symmetric?
|
71
|
+
raise 'background should be symmetric: p(A)=p(T) and p(G) = p(C)' unless second_background.symmetric?
|
72
|
+
|
73
|
+
raise "Error! File #{first_file} don't exist" unless File.exist?(first_file)
|
74
|
+
input_first = File.read(first_file)
|
75
|
+
input_first = Bioinform::MatrixParser.new.parse!(input_first)
|
76
|
+
|
77
|
+
raise "Error! File #{second_file} don't exist" unless File.exist?(second_file)
|
78
|
+
input_second = File.read(second_file)
|
79
|
+
input_second = Bioinform::MatrixParser.new.parse!(input_second)
|
80
|
+
|
81
|
+
case data_model
|
82
|
+
when :pcm
|
83
|
+
pcm_first = Bioinform::MotifModel::PCM.new(input_first[:matrix]).named(input_first[:name])
|
84
|
+
pwm_first = Bioinform::ConversionAlgorithms::PCM2PWMConverter.new(pseudocount: :log, background: first_background).convert(pcm_first)
|
85
|
+
pcm_second = Bioinform::MotifModel::PCM.new(input_second[:matrix]).named(input_second[:name])
|
86
|
+
pwm_second = Bioinform::ConversionAlgorithms::PCM2PWMConverter.new(pseudocount: :log, background: second_background).convert(pcm_second)
|
87
|
+
when :pwm
|
88
|
+
pwm_first = Bioinform::MotifModel::PWM.new(input_first[:matrix]).named(input_first[:name])
|
89
|
+
pwm_second = Bioinform::MotifModel::PWM.new(input_second[:matrix]).named(input_second[:name])
|
90
|
+
end
|
91
|
+
|
92
|
+
pwm_first = pwm_first.discreted(discretization)
|
93
|
+
pwm_second = pwm_second.discreted(discretization)
|
94
|
+
|
95
|
+
counting_first = PWMCounting.new(pwm_first, background: first_background, max_hash_size: max_hash_size)
|
96
|
+
counting_second = PWMCounting.new(pwm_second, background: second_background, max_hash_size: max_hash_size)
|
97
|
+
|
98
|
+
cmp = Macroape::PWMCompare.new(counting_first, counting_second).tap{|x| x.max_pair_hash_size = max_pair_hash_size }
|
99
|
+
|
100
|
+
if predefined_threshold_first
|
101
|
+
threshold_first = predefined_threshold_first * discretization
|
102
|
+
else
|
103
|
+
if pvalue_boundary == :lower
|
104
|
+
threshold_first = counting_first.threshold(pvalue)
|
105
|
+
else
|
106
|
+
threshold_first = counting_first.weak_threshold(pvalue)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
if predefined_threshold_second
|
111
|
+
threshold_second = predefined_threshold_second * discretization
|
112
|
+
else
|
113
|
+
if pvalue_boundary == :lower
|
114
|
+
threshold_second = counting_second.threshold(pvalue)
|
115
|
+
else
|
116
|
+
threshold_second = counting_second.weak_threshold(pvalue)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
info = cmp.jaccard(threshold_first, threshold_second)
|
121
|
+
info.merge!(predefined_threshold_first: predefined_threshold_first,
|
122
|
+
predefined_threshold_second: predefined_threshold_second,
|
123
|
+
threshold_first: threshold_first.to_f / discretization,
|
124
|
+
threshold_second: threshold_second.to_f / discretization,
|
125
|
+
discretization: discretization,
|
126
|
+
first_background: first_background,
|
127
|
+
second_background: second_background,
|
128
|
+
requested_pvalue: pvalue,
|
129
|
+
pvalue_boundary: pvalue_boundary)
|
130
|
+
puts Helper.similarity_info_string(info)
|
131
|
+
|
132
|
+
rescue => err
|
133
|
+
$stderr.puts "\n#{err}\n#{err.backtrace.first(5).join("\n")}\n\nUse --help option for help\n\n#{doc}"
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -1,87 +1,93 @@
|
|
1
|
-
require_relative '../../macroape'
|
2
|
-
|
3
|
-
module Macroape
|
4
|
-
module CLI
|
5
|
-
module FindPValue
|
6
|
-
|
7
|
-
def self.main(argv)
|
8
|
-
doc = <<-EOS.strip_doc
|
9
|
-
Command-line format:
|
10
|
-
#{run_tool_cmd} <pat-file> <threshold list>... [options]
|
11
|
-
|
12
|
-
Options:
|
13
|
-
[-d <discretization level>]
|
14
|
-
[--pcm] - treat the input file as Position Count Matrix. PCM-to-PWM transformation to be done internally.
|
15
|
-
[-b <background probabilities] ACGT - 4 numbers, comma-delimited(spaces not allowed), sum should be equal to 1, like 0.25,0.24,0.26,0.25
|
16
|
-
|
17
|
-
Examples:
|
18
|
-
#{run_tool_cmd} motifs/KLF4_f2.pat 7.32
|
19
|
-
#{run_tool_cmd} motifs/KLF4_f2.pat 7.32 4.31 5.42 -d 1000 -b 0.2,0.3,0.3,0.2
|
20
|
-
EOS
|
21
|
-
|
22
|
-
if argv.empty? || ['-h', '--h', '-help', '--help'].any?{|help_option| argv.include?(help_option)}
|
23
|
-
$stderr.puts doc
|
24
|
-
exit
|
25
|
-
end
|
26
|
-
|
27
|
-
discretization = 10000
|
28
|
-
background =
|
29
|
-
thresholds = []
|
30
|
-
max_hash_size = 10000000
|
31
|
-
|
32
|
-
data_model = argv.delete('--pcm') ?
|
33
|
-
filename = argv.shift
|
34
|
-
|
35
|
-
loop do
|
36
|
-
begin
|
37
|
-
Float(argv.first)
|
38
|
-
thresholds << argv.shift.to_f
|
39
|
-
rescue
|
40
|
-
raise StopIteration
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
raise 'No input. You should specify input file' unless filename
|
45
|
-
raise 'You should specify at least one threshold' if thresholds.empty?
|
46
|
-
|
47
|
-
until argv.empty?
|
48
|
-
case argv.shift
|
49
|
-
when '-b'
|
50
|
-
background = argv.shift
|
51
|
-
when '-d'
|
52
|
-
discretization = argv.shift.to_f
|
53
|
-
when '--max-hash-size'
|
54
|
-
max_hash_size = argv.shift.to_i
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
1
|
+
require_relative '../../macroape'
|
2
|
+
|
3
|
+
module Macroape
|
4
|
+
module CLI
|
5
|
+
module FindPValue
|
6
|
+
|
7
|
+
def self.main(argv)
|
8
|
+
doc = <<-EOS.strip_doc
|
9
|
+
Command-line format:
|
10
|
+
#{run_tool_cmd} <pat-file> <threshold list>... [options]
|
11
|
+
|
12
|
+
Options:
|
13
|
+
[-d <discretization level>]
|
14
|
+
[--pcm] - treat the input file as Position Count Matrix. PCM-to-PWM transformation to be done internally.
|
15
|
+
[-b <background probabilities] ACGT - 4 numbers, comma-delimited(spaces not allowed), sum should be equal to 1, like 0.25,0.24,0.26,0.25
|
16
|
+
|
17
|
+
Examples:
|
18
|
+
#{run_tool_cmd} motifs/KLF4_f2.pat 7.32
|
19
|
+
#{run_tool_cmd} motifs/KLF4_f2.pat 7.32 4.31 5.42 -d 1000 -b 0.2,0.3,0.3,0.2
|
20
|
+
EOS
|
21
|
+
|
22
|
+
if argv.empty? || ['-h', '--h', '-help', '--help'].any?{|help_option| argv.include?(help_option)}
|
23
|
+
$stderr.puts doc
|
24
|
+
exit
|
25
|
+
end
|
26
|
+
|
27
|
+
discretization = 10000
|
28
|
+
background = Bioinform::Background::Wordwise
|
29
|
+
thresholds = []
|
30
|
+
max_hash_size = 10000000
|
31
|
+
|
32
|
+
data_model = argv.delete('--pcm') ? :pcm : :pwm
|
33
|
+
filename = argv.shift
|
34
|
+
|
35
|
+
loop do
|
36
|
+
begin
|
37
|
+
Float(argv.first)
|
38
|
+
thresholds << argv.shift.to_f
|
39
|
+
rescue
|
40
|
+
raise StopIteration
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
raise 'No input. You should specify input file' unless filename
|
45
|
+
raise 'You should specify at least one threshold' if thresholds.empty?
|
46
|
+
|
47
|
+
until argv.empty?
|
48
|
+
case argv.shift
|
49
|
+
when '-b'
|
50
|
+
background = Bioinform::Background.from_string(argv.shift)
|
51
|
+
when '-d'
|
52
|
+
discretization = argv.shift.to_f
|
53
|
+
when '--max-hash-size'
|
54
|
+
max_hash_size = argv.shift.to_i
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
raise "Error! File #{filename} doesn't exist" unless File.exist?(filename)
|
59
|
+
input = File.read(filename)
|
60
|
+
|
61
|
+
parser = Bioinform::MatrixParser.new
|
62
|
+
motif_data = parser.parse!(input)
|
63
|
+
case data_model
|
64
|
+
when :pcm
|
65
|
+
pcm = Bioinform::MotifModel::PCM.new(motif_data[:matrix]).named(motif_data[:name])
|
66
|
+
pwm = Bioinform::ConversionAlgorithms::PCM2PWMConverter.new(pseudocount: :log, background: background).convert(pcm)
|
67
|
+
when :pwm
|
68
|
+
pwm = Bioinform::MotifModel::PWM.new(motif_data[:matrix]).named(motif_data[:name])
|
69
|
+
end
|
70
|
+
|
71
|
+
pwm = pwm.discreted(discretization)
|
72
|
+
counting = PWMCounting.new(pwm, background: background, max_hash_size: max_hash_size)
|
73
|
+
|
74
|
+
counts = counting.counts_by_thresholds(* thresholds.map{|count| count * discretization})
|
75
|
+
infos = []
|
76
|
+
thresholds.each do |threshold|
|
77
|
+
count = counts[threshold * discretization]
|
78
|
+
pvalue = count.to_f / (counting.vocabulary_volume)
|
79
|
+
infos << {threshold: threshold,
|
80
|
+
number_of_recognized_words: count,
|
81
|
+
pvalue: pvalue}
|
82
|
+
end
|
83
|
+
|
84
|
+
puts Helper.find_pvalue_info_string(infos,
|
85
|
+
{discretization: discretization,
|
86
|
+
background: background} )
|
87
|
+
rescue => err
|
88
|
+
$stderr.puts "\n#{err}\n#{err.backtrace.first(5).join("\n")}\n\nUse --help option for help\n\n#{doc}"
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|