iroki 0.0.35 → 0.0.36

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 62543daefa15a5d64a7d9b48e738bf921da3be9f
4
- data.tar.gz: e6278b2097ee763d828a43d21d95c85cc68776f4
3
+ metadata.gz: cc9840c73024ff89c424b094e52f70b474d1ffa1
4
+ data.tar.gz: 9c6cbea037206118e5e2bd3174b3553f0a00df2d
5
5
  SHA512:
6
- metadata.gz: 266753be23d1378efaa0df65621a98f8d2f8667fde2e11c742c86acebde7b0b666258e6652be86a7881da635d636baadba7e43d72faeb34a350139fd70f94a19
7
- data.tar.gz: bcd3517d8cc582d6c97929374ec1c129e52f3fae550287d9ee697626a87fc3a6bb51b68b335e02227c665c57599db541598a3efc19d92e09804f157366cb3f67
6
+ metadata.gz: e278234fdd472f4ce6452701d2c1151b7a433df70081eaaf867b7011a64edfd5ef306061ea94c7c9526d2d2892b3f2ca317f1341e56216d5ccfd107992d55915
7
+ data.tar.gz: a621bf4408197fa5db28c28b51b8c12a13284e2328a28e39cdb8ed81a46544c8d879a5b009f39235158cd2eac575c40b5d5fa22536cbb216a777ffb2ed81adf2
data/exe/iroki CHANGED
@@ -39,9 +39,9 @@ opts = Trollop.options do
39
39
  "Color branches?",
40
40
  short: "-b")
41
41
 
42
- opt(:color_taxa_names,
42
+ opt(:color_labels,
43
43
  "Color label names?",
44
- short: "-t")
44
+ short: "-l")
45
45
 
46
46
  opt(:exact,
47
47
  "Exact pattern matching")
@@ -99,7 +99,7 @@ end
99
99
 
100
100
  Iroki::Main.main(
101
101
  color_branches: opts[:color_branches],
102
- color_taxa_names: opts[:color_taxa_names],
102
+ color_taxa_names: opts[:color_labels],
103
103
  exact: opts[:exact],
104
104
  remove_bootstraps_below: opts[:remove_bootstraps_below],
105
105
  color_map_f: opts[:color_map],
@@ -49,7 +49,8 @@ module Iroki
49
49
  first_line_count = the_counts.count
50
50
  else
51
51
  abort_unless first_line_count == the_counts.count,
52
- "Line number #{idx+1} (#{line.inspect}) in the " +
52
+ "Line number #{idx+1} (#{line.inspect}) " +
53
+ "in the " +
53
54
  "biom file has #{the_counts.count} " +
54
55
  "columns when it should have " +
55
56
  "#{first_line_count} columns like the " +
@@ -725,8 +725,16 @@ module Iroki
725
725
  colors = COLORS
726
726
  end
727
727
 
728
- abort_unless colors.has_key?(col),
729
- "Color '#{col}' is not defined."
728
+ unless colors.has_key? col
729
+ if col.match(/\A[0-9]+\Z/)
730
+ msg = "Color '#{col}' is not defined. " +
731
+ "Did you forget the --auto-color option?"
732
+ else
733
+ msg = "Color '#{col}' is not defined."
734
+ end
735
+
736
+ abort_if true, msg
737
+ end
730
738
 
731
739
  hex = colors[col]
732
740
  %Q{[&!color="#{hex.upcase}"]}
@@ -55,7 +55,7 @@ module Iroki
55
55
  old_min = old_min.to_f
56
56
  old_max = old_max.to_f
57
57
 
58
- (new_max - ((((new_max - new_min) * (x - old_min.to_f)) / (old_max - old_min)) + new_min)) + new_min
58
+ (new_max - ((((new_max - new_min) * (x - old_min.to_f)) / (old_max - old_min)) + new_min)) + new_min
59
59
  end
60
60
 
61
61
  def patterns
@@ -1,18 +1,6 @@
1
1
  module Iroki
2
2
  module Color
3
3
  module Palette
4
- # BASIC =
5
- # { "1" => "#FF3814", # red
6
- # "2" => "#712BFF", # blue
7
- # "3" => "#FFDF14", # yellow
8
- # "4" => "#14FF63", } # green
9
-
10
- # FUNKY =
11
- # { "1" => "#FF7314",
12
- # "2" => "#9F23FF",
13
- # "3" => "#FFF814",
14
- # "4" => "#14FFD8", }
15
-
16
4
  KELLY = {
17
5
  "1" => { name: "purple", hex: "#875692" },
18
6
  "2" => { name: "orange", hex: "#F38400" },
@@ -53,8 +53,6 @@ module Iroki
53
53
 
54
54
  col =
55
55
  Iroki::Color::GREEN.mix_with Iroki::Color::BLUE, rel_abund
56
- # col =
57
- # Iroki::Color::BLUE.mix_with Iroki::Color::GREEN, rel_abund
58
56
 
59
57
  col.luminosity = lumin
60
58
 
@@ -65,7 +63,6 @@ module Iroki
65
63
  def single_color_gradient_hex_codes
66
64
  @rel_abunds.zip(@lumins).map do |rel_abund, lumin|
67
65
  amt_of_orig_color =
68
- # scale rel_abund, new_min=10, new_max=95
69
66
  scale rel_abund, new_min=@min_lumin, new_max=@max_lumin
70
67
 
71
68
  col =
@@ -18,17 +18,6 @@
18
18
 
19
19
  module Iroki
20
20
  module Const
21
- COPYRIGHT = "2016 Ryan Moore"
22
- CONTACT = "moorer@udel.edu"
23
- WEBSITE = "https://github.com/mooreryan/color_tree"
24
- LICENSE = "GPLv3"
25
-
26
- VERSION_BANNER = " # Version: #{Iroki::VERSION}
27
- # Copyright #{COPYRIGHT}
28
- # Contact: #{CONTACT}
29
- # Website: #{WEBSITE}
30
- # License: #{LICENSE}"
31
-
32
21
  FIG = 'begin figtree;
33
22
  set appearance.backgroundColorAttribute="Default";
34
23
  set appearance.backgroundColour=#-1;
@@ -21,14 +21,14 @@ def color_given? str
21
21
  end
22
22
 
23
23
  # TODO spec this for hex matching
24
- def has_label_tag? str
24
+ def label_tag? str
25
25
  m = str.match(/\Alabel:(#?\p{Alnum}+)\Z/i)
26
26
 
27
27
  m[1] if m
28
28
  end
29
29
 
30
30
  # TODO spec this for hex matching
31
- def has_branch_tag? str
31
+ def branch_tag? str
32
32
  m = str.match(/\Abranch:(#?\p{Alnum}+)\Z/i)
33
33
 
34
34
  m[1] if m
@@ -60,87 +60,8 @@ module Iroki
60
60
  arg
61
61
  end
62
62
 
63
- # TODO this is now pointless
64
- def parse_color_map fname,
65
- exact_matching: true,
66
- auto_color: false
67
-
68
- check_file fname, :color_map
69
-
70
-
71
- patterns = {}
72
- Object::File.open(fname, "rt").each_line do |line|
73
- unless line.start_with? "#"
74
- label_tag = ""
75
- branch_tag = ""
76
-
77
- pattern, label_color, branch_color = line.chomp.split "\t"
78
-
79
- # color = "black" if color.nil? || color.empty?
80
-
81
- assert pattern, "found no pattern"
82
-
83
- if exact_matching # TODO should this really be everytime?
84
- pattern = pattern#.clean_name
85
- else
86
- # TODO flag bad regexp
87
- pattern = Regexp.new pattern
88
- end
89
-
90
- if color_given?(label_color) && color_given?(branch_color)
91
- abort_if(has_label_tag?(label_color) &&
92
- has_label_tag?(branch_color),
93
- "Label tag specified twice for '#{line}'")
94
-
95
- abort_if(has_branch_tag?(label_color) &&
96
- has_branch_tag?(branch_color),
97
- "Branch tag specified twice for '#{line}'")
98
- end
99
-
100
- if color_given?(label_color) && !color_given?(branch_color)
101
- if (color = has_label_tag? label_color)
102
- label_tag = Iroki::Color.get_tag color, auto_color
103
- elsif (color = has_branch_tag? label_color)
104
- branch_tag = Iroki::Color.get_tag color, auto_color
105
- else
106
- label_tag = Iroki::Color.get_tag label_color, auto_color
107
- branch_tag = Iroki::Color.get_tag label_color, auto_color
108
- end
109
- else
110
- if color_given? label_color
111
- if (color = has_label_tag? label_color)
112
- label_tag = Iroki::Color.get_tag color, auto_color
113
- elsif (color = has_branch_tag? label_color)
114
- branch_tag = Iroki::Color.get_tag color, auto_color
115
- else
116
- label_tag = Iroki::Color.get_tag label_color, auto_color
117
- end
118
- end
119
-
120
- if color_given? branch_color
121
- if (color = has_branch_tag? branch_color)
122
- branch_tag = Iroki::Color.get_tag color, auto_color
123
- elsif (color = has_label_tag? branch_color)
124
- label_tag = Iroki::Color.get_tag color, auto_color
125
- else
126
- branch_tag = Iroki::Color.get_tag branch_color, auto_color
127
- end
128
- end
129
- end
130
-
131
- # if auto_color
132
- # patterns[pattern] = "[&!color=\"#{auto_colors[color]}\"]"
133
- # else
134
- # patterns[pattern] = Iroki::Color.get_tag color, auto_color
135
- # end
136
-
137
- patterns[pattern] = { label: label_tag, branch: branch_tag }
138
- end
139
- end
140
-
141
- patterns
142
- end
143
-
63
+ # TODO what's the point of the iroki_to_name? To allow wonky
64
+ # chars maybe?
144
65
  def parse_color_map_iroki(fname,
145
66
  iroki_to_name,
146
67
  exact_matching: true,
@@ -168,7 +89,6 @@ module Iroki
168
89
  assert pattern, "found no pattern"
169
90
 
170
91
  if exact_matching # TODO should this really be everytime?
171
- # pattern = pattern.clean_name
172
92
  if name_to_iroki.has_key? pattern
173
93
  pattern = name_to_iroki[pattern]
174
94
  else
@@ -181,56 +101,72 @@ module Iroki
181
101
  pattern = Regexp.new pattern
182
102
  end
183
103
 
184
- if color_given?(label_color) && color_given?(branch_color)
185
- abort_if(has_label_tag?(label_color) &&
186
- has_label_tag?(branch_color),
187
- "Label tag specified twice for '#{line}'")
188
104
 
189
- abort_if(has_branch_tag?(label_color) &&
190
- has_branch_tag?(branch_color),
191
- "Branch tag specified twice for '#{line}'")
105
+ if color_given?(label_color) && color_given?(branch_color)
106
+ if label_tag?(label_color) &&
107
+ label_tag?(branch_color)
108
+
109
+ abort_unless label_color == branch_color,
110
+ "Label tags specified twice for " +
111
+ "#{line.inspect}, but the tags don't " +
112
+ "match."
113
+
114
+ # ie both are label tags specifying the same color
115
+ branch_color = nil
116
+ elsif branch_tag?(label_color) &&
117
+ branch_tag?(branch_color)
118
+
119
+ abort_unless label_color == branch_color,
120
+ "Branch tags specified twice for " +
121
+ "#{line.inspect}, but the tags don't " +
122
+ "match."
123
+
124
+ # ie both are branch tags specifying the same color
125
+ label_color = nil
126
+ end
192
127
  end
193
128
 
194
129
  if color_given?(label_color) && !color_given?(branch_color)
195
- if (color = has_label_tag? label_color)
130
+ if (color = label_tag? label_color)
196
131
  label_tag = Iroki::Color.get_tag color, auto_color
197
- elsif (color = has_branch_tag? label_color)
132
+ elsif (color = branch_tag? label_color)
198
133
  branch_tag = Iroki::Color.get_tag color, auto_color
199
- elsif line.match(/\t\Z/) # empty branch color, branch will be black
200
- label_tag = Iroki::Color.get_tag label_color, auto_color
134
+ elsif line.match(/\t\Z/) # empty branch color, branch
135
+ # will be black
136
+ label_tag = Iroki::Color.get_tag label_color,
137
+ auto_color
201
138
  else
202
- label_tag = Iroki::Color.get_tag label_color, auto_color
203
- branch_tag = Iroki::Color.get_tag label_color, auto_color
139
+ label_tag = Iroki::Color.get_tag label_color,
140
+ auto_color
141
+ branch_tag = Iroki::Color.get_tag label_color,
142
+ auto_color
204
143
  end
205
144
  else
206
145
  if color_given? label_color
207
- if (color = has_label_tag? label_color)
146
+ if (color = label_tag? label_color)
208
147
  label_tag = Iroki::Color.get_tag color, auto_color
209
- elsif (color = has_branch_tag? label_color)
148
+ elsif (color = branch_tag? label_color)
210
149
  branch_tag = Iroki::Color.get_tag color, auto_color
211
150
  else
212
- label_tag = Iroki::Color.get_tag label_color, auto_color
151
+ label_tag = Iroki::Color.get_tag label_color,
152
+ auto_color
213
153
  end
214
154
  end
215
155
 
216
156
  if color_given? branch_color
217
- if (color = has_branch_tag? branch_color)
157
+ if (color = branch_tag? branch_color)
218
158
  branch_tag = Iroki::Color.get_tag color, auto_color
219
- elsif (color = has_label_tag? branch_color)
159
+ elsif (color = label_tag? branch_color)
220
160
  label_tag = Iroki::Color.get_tag color, auto_color
221
161
  else
222
- branch_tag = Iroki::Color.get_tag branch_color, auto_color
162
+ branch_tag = Iroki::Color.get_tag branch_color,
163
+ auto_color
223
164
  end
224
165
  end
225
166
  end
226
167
 
227
- # if auto_color
228
- # patterns[pattern] = "[&!color=\"#{auto_colors[color]}\"]"
229
- # else
230
- # patterns[pattern] = Iroki::Color.get_tag color, auto_color
231
- # end
232
-
233
- patterns[pattern] = { label: label_tag, branch: branch_tag }
168
+ patterns[pattern] = { label: label_tag,
169
+ branch: branch_tag }
234
170
  end
235
171
  end
236
172
 
@@ -258,9 +194,6 @@ module Iroki
258
194
  abort_if newname.nil? || newname.empty?,
259
195
  "Column 2 missing for line: #{line.inspect}"
260
196
 
261
- # oldname = oldname.clean_name
262
- # newname = newname.clean_name
263
-
264
197
  abort_if name_map.has_key?(oldname),
265
198
  "#{oldname} is repeated in column 1"
266
199
 
@@ -12,16 +12,13 @@ module Iroki
12
12
  end
13
13
 
14
14
  def clean
15
- # puts %Q{clean: #{self}, #{self.gsub(/'/, '"')}}
16
15
  self.gsub(/'/, '"')
17
16
  end
18
17
 
19
18
  def single_quote
20
19
  if self.match /\A'.*'\Z/
21
- # puts %Q{single_quote if: #{self}, outputing #{self.dup}}
22
20
  self.dup
23
21
  else
24
- # puts %Q{single_quote else: #{self}, returning '#{self.clean}'}
25
22
  %Q['#{self.clean}']
26
23
  end
27
24
  end
@@ -31,11 +28,8 @@ module Iroki
31
28
  name = match[1]
32
29
  color = match[2]
33
30
 
34
- # puts %Q{clean_name if: #{self}, returning #{name.single_quote + color}}
35
31
  name.single_quote + color
36
- # name + color
37
32
  else
38
- # puts %Q{clean_name else: #{self}, returning #{self.single_quote}}
39
33
  self.single_quote
40
34
  end
41
35
  end
@@ -44,11 +38,9 @@ module Iroki
44
38
  self.strip.gsub(/[^\p{Alnum}_]+/, "_").gsub(/_+/, "_")
45
39
  end
46
40
 
47
-
48
41
  def has_single_quote?
49
42
  self.match(/'/)
50
43
  end
51
-
52
44
  end
53
45
  end
54
46
  end
@@ -261,6 +261,19 @@ module Iroki
261
261
  # newick = treeio.next_entry
262
262
  str = File.read newick
263
263
  newick = Bio::Newick.new str, parser: :iroki
264
+
265
+ # Warn if there is extra info in the newick file
266
+ if newick &&
267
+ newick.entry_overrun &&
268
+ !newick.entry_overrun.chomp.empty?
269
+
270
+ AbortIf.logger.warn {
271
+ "Extra info (#{newick.entry_overrun}) in newick file " +
272
+ "(#{newick_f}) will be ignored. " +
273
+ "Does your newick file contain multiple trees?"
274
+ }
275
+ end
276
+
264
277
  tree = newick.tree
265
278
 
266
279
  # puts [:tree_first_parsed, tree.newick(indent: false)]
@@ -15,6 +15,9 @@ module Iroki
15
15
  # @param [Bio::Tree] a bio ruby tree object
16
16
  #
17
17
  # @return [Hash] iroki_name (string) => quoted_orig_name (string)
18
+ #
19
+ # @todo not a good name as it doesn't actually change the names in
20
+ # the tree
18
21
  def self.change_names tree
19
22
  idx = -1
20
23
  realname = {}
@@ -50,12 +53,15 @@ module Iroki
50
53
  hash.values.map(&:single_quote)
51
54
  end
52
55
 
53
- def self.gsub_iroki_newick_string tre_str, iroki_to_name, name_map=nil
56
+ def self.gsub_iroki_newick_string tre_str,
57
+ iroki_to_name,
58
+ name_map=nil
54
59
  if name_map
55
60
  vals = self.quoted_vals name_map
56
61
  name_map_quoted = Hash[name_map.keys.zip(vals)]
57
62
 
58
- iroki_to_new_name = self.combine_hashes iroki_to_name, name_map_quoted
63
+ iroki_to_new_name =
64
+ self.combine_hashes iroki_to_name, name_map_quoted
59
65
  else
60
66
  vals = self.quoted_vals iroki_to_name
61
67
 
@@ -65,22 +71,33 @@ module Iroki
65
71
  tre_str.gsub(/iroki[0-9]+iroki/, iroki_to_new_name)
66
72
  end
67
73
 
68
- def self.iroki_to_color iroki_to_name, color_map, name_map, nil_val=nil
74
+ def self.iroki_to_color iroki_to_name,
75
+ color_map,
76
+ name_map,
77
+ nil_val=nil
69
78
  if name_map
70
79
  old_names = name_map.keys
71
80
  new_names = name_map.values
72
81
 
73
- color_map_is_for_old_names = color_map.keys.all? { |key| old_names.include? key }
74
- color_map_is_for_new_names = color_map.keys.all? { |key| new_names.include? key }
82
+ color_map_is_for_old_names =
83
+ color_map.keys.all? { |key| old_names.include? key }
84
+
85
+ color_map_is_for_new_names =
86
+ color_map.keys.all? { |key| new_names.include? key }
75
87
 
76
88
  if color_map_is_for_old_names
77
- iroki_to_color = self.combine_hashes iroki_to_name, color_map, nil_val
89
+ iroki_to_color =
90
+ self.combine_hashes iroki_to_name, color_map, nil_val
78
91
  elsif color_map_is_for_new_names
79
- iroki_to_new_name = self.combine_hashes iroki_to_name, name_map
92
+ iroki_to_new_name =
93
+ self.combine_hashes iroki_to_name, name_map
80
94
 
81
- iroki_to_color = self.combine_hashes iroki_to_new_name, color_map, nil_val
95
+ iroki_to_color =
96
+ self.combine_hashes iroki_to_new_name, color_map, nil_val
82
97
  else # some old, some new
83
- abort_if true, "The color map has both old and new names in the first column."
98
+ abort_if true,
99
+ "The color map has both old and new names in " +
100
+ "the first column."
84
101
  end
85
102
 
86
103
  iroki_to_color
@@ -42,16 +42,21 @@ module Iroki
42
42
  end
43
43
  else
44
44
  assert iroki_to_name, "iroki_to_name arg is nil"
45
- assert iroki_to_name[node.to_s], "iroki_to_name is missing #{node.to_s}"
45
+ assert iroki_to_name[node.to_s],
46
+ "iroki_to_name is missing #{node.to_s}"
46
47
  node_s = iroki_to_name[node.to_s]
47
48
 
48
49
  patterns.each do |pattern, this_color|
49
50
  if node_s =~ pattern
50
51
  abort_if already_matched,
51
- "Non specific matching for #{node_s}"
52
+ "Non specific matching for #{node_s}. " +
53
+ "Previously matched pattern was " +
54
+ "#{already_matched.inspect}. Current pattern " +
55
+ "is " +
56
+ "#{pattern.inspect}. Color was #{this_color}."
52
57
 
53
58
  color = this_color
54
- already_matched = true
59
+ already_matched = pattern
55
60
  end
56
61
  end
57
62
 
@@ -93,7 +98,10 @@ module Iroki
93
98
 
94
99
  # NOTE: this was originally before cleaning the node name a
95
100
  # couple lines up, does it matter that it is after?
96
- color = add_color_to_leaf_branch patterns, node, exact, iroki_to_name
101
+ color = add_color_to_leaf_branch patterns,
102
+ node,
103
+ exact,
104
+ iroki_to_name
97
105
 
98
106
  # add color to the name
99
107
  node.name = node.name + color[:branch] if color
@@ -18,7 +18,7 @@
18
18
 
19
19
  # Library metadata
20
20
  module Iroki
21
- VERSION = "0.0.35"
21
+ VERSION = "0.0.36"
22
22
  COPYRIGHT = "2015 - 2017 Ryan Moore"
23
23
  CONTACT = "moorer@udel.edu"
24
24
  WEBSITE = "https://github.com/mooreryan/iroki"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iroki
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.35
4
+ version: 0.0.36
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Moore
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-14 00:00:00.000000000 Z
11
+ date: 2017-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler