iroki 0.0.8 → 0.0.9
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/README.md +9 -0
- data/lib/iroki.rb +7 -0
- data/lib/iroki/biom.rb +56 -0
- data/lib/iroki/color/color.rb +20 -57
- data/lib/iroki/color/gradient.rb +45 -0
- data/lib/iroki/color/palette/palette.rb +39 -0
- data/lib/iroki/color/single_sample_gradient.rb +80 -0
- data/lib/iroki/main/main.rb +14 -9
- data/lib/iroki/version.rb +1 -1
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e8e1eeaa50a23a42dd81714d8d5301c3acc1fd5
|
4
|
+
data.tar.gz: 150d12ff4ba7d6a6b34643fba5da48b48535ae0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13ca08512ff4122f5ac178de610a9b7de166a1f8a2f3b4ae80ebe561e237d4f44d9e970c7c622140ea58a2a0fd5086cda231b8a946ca2294ed5dac728260fd33
|
7
|
+
data.tar.gz: 2877db8a1435c34ad939cda11130858445ba012ed235c0a61e1c9b413a133b7f78890c72c573704a1119fb945590aa59a04c3985069d50e939916d963fb880cc
|
data/README.md
CHANGED
@@ -104,3 +104,12 @@ Add branch length and bootstraps to `newick_to_phyloxml`.
|
|
104
104
|
### 0.0.7 ###
|
105
105
|
|
106
106
|
Add `reorder_nodes` script.
|
107
|
+
|
108
|
+
### 0.0.8 ###
|
109
|
+
|
110
|
+
- Add auto coloring with Kelly theme
|
111
|
+
- Add ability to color branches and labels separately
|
112
|
+
|
113
|
+
### 0.0.9 ###
|
114
|
+
|
115
|
+
- Add single sample color gradients (one and two color)
|
data/lib/iroki.rb
CHANGED
@@ -18,9 +18,16 @@
|
|
18
18
|
|
19
19
|
require "abort_if"
|
20
20
|
|
21
|
+
require "iroki/biom"
|
21
22
|
require "iroki/version"
|
23
|
+
|
22
24
|
require "iroki/const/const"
|
25
|
+
|
23
26
|
require "iroki/color/color"
|
27
|
+
require "iroki/color/gradient"
|
28
|
+
require "iroki/color/single_sample_gradient"
|
29
|
+
require "iroki/color/palette/palette"
|
30
|
+
|
24
31
|
require "iroki/core_ext/hash/hash"
|
25
32
|
require "iroki/core_ext/string/string"
|
26
33
|
require "iroki/core_ext/file/file"
|
data/lib/iroki/biom.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
# Copyright 2016 Ryan Moore
|
2
|
+
# Contact: moorer@udel.edu
|
3
|
+
#
|
4
|
+
# This file is part of Iroki.
|
5
|
+
#
|
6
|
+
# Iroki is free software: you can redistribute it and/or modify it
|
7
|
+
# under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Iroki is distributed in the hope that it will be useful, but
|
12
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with Iroki. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module Iroki
|
20
|
+
class Biom < File
|
21
|
+
def parse_single_sample
|
22
|
+
samples = []
|
23
|
+
counts = []
|
24
|
+
|
25
|
+
self.each_line do |line|
|
26
|
+
unless line.start_with? "#"
|
27
|
+
sample, count = line.chomp.split "\t"
|
28
|
+
|
29
|
+
samples << sample
|
30
|
+
counts << count.to_f
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
[samples, counts]
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def parse_two_sample
|
39
|
+
samples = []
|
40
|
+
counts_group1 = []
|
41
|
+
counts_group2 = []
|
42
|
+
|
43
|
+
self.each_line do |line|
|
44
|
+
unless line.start_with? "#"
|
45
|
+
sample, count1, count2 = line.chomp.split "\t"
|
46
|
+
|
47
|
+
samples << sample
|
48
|
+
counts_group1 << count1.to_f
|
49
|
+
counts_group2 << count2.to_f
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
[samples, counts_group1, counts_group2]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/iroki/color/color.rb
CHANGED
@@ -16,67 +16,30 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Iroki. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
|
19
|
+
require "color"
|
20
|
+
|
19
21
|
module Iroki
|
20
22
|
module Color
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
# BASIC_LIGHT =
|
29
|
-
# { "1" => "#FF8872",
|
30
|
-
# "2" => "#A97FFE",
|
31
|
-
# "3" => "#FFEC72",
|
32
|
-
# "4" => "#71FEA1", }
|
23
|
+
GREEN_HUE = 1 / 3.0
|
24
|
+
BLUE_HUE = 2 / 3.0
|
25
|
+
WHITE_HUE = 1.0
|
26
|
+
FULLY_SATURATED = 1
|
27
|
+
PURE_COLOR = 0.5
|
28
|
+
PURE_LIGHT = 1.0
|
33
29
|
|
34
|
-
# BASIC_DARK =
|
35
|
-
# { "1" => "#FF2800",
|
36
|
-
# "2" => "#4901DD",
|
37
|
-
# "3" => "#FFDD00",
|
38
|
-
# "4" => "#00E24D", }
|
39
30
|
|
40
|
-
# FUNKY =
|
41
|
-
# { "1" => "#FF7314",
|
42
|
-
# "2" => "#9F23FF",
|
43
|
-
# "3" => "#FFF814",
|
44
|
-
# "4" => "#14FFD8", }
|
45
31
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
# "3" => "#FFFB72",
|
50
|
-
# "4" => "#71FEE6", }
|
32
|
+
GREEN = Object::Color::HSL.from_fraction GREEN_HUE,
|
33
|
+
FULLY_SATURATED,
|
34
|
+
PURE_COLOR
|
51
35
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
# "3" => "#FFF700",
|
56
|
-
# "4" => "#00D7B3", }
|
36
|
+
BLUE = Object::Color::HSL.from_fraction BLUE_HUE,
|
37
|
+
FULLY_SATURATED,
|
38
|
+
PURE_COLOR
|
57
39
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
"3" => { name: "light_blue", hex: "#A1CAF1" },
|
62
|
-
"4" => { name: "red", hex: "#BE0032" },
|
63
|
-
"5" => { name: "buff", hex: "#C2B280" },
|
64
|
-
"6" => { name: "grey", hex: "#848482" },
|
65
|
-
"7" => { name: "green", hex: "#008856" },
|
66
|
-
"8" => { name: "purplish_pink", hex: "#E68FAC" },
|
67
|
-
"9" => { name: "blue", hex: "#0067A5" },
|
68
|
-
"10" => { name: "yellowish_pink", hex: "#F99379" },
|
69
|
-
"11" => { name: "violet", hex: "#604E97" },
|
70
|
-
"12" => { name: "orange_yellow", hex: "#F6A600" },
|
71
|
-
"13" => { name: "purplish_red", hex: "#B3446C" },
|
72
|
-
"14" => { name: "reddish_brown", hex: "#882D17" },
|
73
|
-
"15" => { name: "yellow_green", hex: "#8DB600" },
|
74
|
-
"16" => { name: "yellowish_brown", hex: "#654522" },
|
75
|
-
"17" => { name: "reddish_orange", hex: "#E25822" },
|
76
|
-
"18" => { name: "olive_green", hex: "#2B3D26" },
|
77
|
-
"19" => { name: "yellow", hex: "#F3C300" },
|
78
|
-
}
|
79
|
-
end
|
40
|
+
WHITE = Object::Color::HSL.from_fraction WHITE_HUE,
|
41
|
+
FULLY_SATURATED,
|
42
|
+
PURE_LIGHT
|
80
43
|
|
81
44
|
def self.get_tag str, palette=nil
|
82
45
|
if str.hex?
|
@@ -89,7 +52,7 @@ module Iroki
|
|
89
52
|
def self.tag_from_hex hex
|
90
53
|
assert hex.hex?, "'#{hex}' was not a valid hex code"
|
91
54
|
|
92
|
-
%Q{[&!color="#{hex}"]}
|
55
|
+
%Q{[&!color="#{hex.upcase}"]}
|
93
56
|
end
|
94
57
|
|
95
58
|
def self.tag_from_color color, palette=nil
|
@@ -110,7 +73,7 @@ module Iroki
|
|
110
73
|
hex = colors["black"]
|
111
74
|
end
|
112
75
|
|
113
|
-
%Q{[&!color="#{hex}"]}
|
76
|
+
%Q{[&!color="#{hex.upcase}"]}
|
114
77
|
end
|
115
78
|
|
116
79
|
COLORS = {
|
@@ -773,6 +736,6 @@ module Iroki
|
|
773
736
|
"yellowgreen" => "#9ACD32",
|
774
737
|
}
|
775
738
|
|
776
|
-
|
739
|
+
DARK_GREEN = Object::Color::RGB.by_hex(COLORS["darkgreen"])
|
777
740
|
end
|
778
741
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Copyright 2016 Ryan Moore
|
2
|
+
# Contact: moorer@udel.edu
|
3
|
+
#
|
4
|
+
# This file is part of Iroki.
|
5
|
+
#
|
6
|
+
# Iroki is free software: you can redistribute it and/or modify it
|
7
|
+
# under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Iroki is distributed in the hope that it will be useful, but
|
12
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with Iroki. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module Iroki
|
20
|
+
module Color
|
21
|
+
class Gradient
|
22
|
+
attr_accessor :samples, :color_hex_codes, :lumins
|
23
|
+
|
24
|
+
# scales [min, max] to [A, B]
|
25
|
+
def self.scale x, new_min=0.05, new_max=0.9, old_min=0.0, old_max=1.0
|
26
|
+
((((new_max - new_min) * (x - old_min.to_f)) / (old_max - old_min)) + new_min)
|
27
|
+
end
|
28
|
+
|
29
|
+
# scales [old_min, old_max] to [new_max, new_min]
|
30
|
+
def self.scale_reverse x, new_min=0, new_max=0, old_min=0.0, old_max=1.0
|
31
|
+
(new_max - ((((new_max - new_min) * (x - old_min.to_f)) / (old_max - old_min)) + new_min)) + new_min
|
32
|
+
end
|
33
|
+
|
34
|
+
def patterns
|
35
|
+
hash = {}
|
36
|
+
@samples.zip(@color_hex_codes).each do |(sample, hexcode)|
|
37
|
+
tag = Iroki::Color.get_tag hexcode
|
38
|
+
hash[sample] = { label: tag, branch: tag }
|
39
|
+
end
|
40
|
+
|
41
|
+
hash
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Iroki
|
2
|
+
module Color
|
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
|
+
KELLY = {
|
17
|
+
"1" => { name: "purple", hex: "#875692" },
|
18
|
+
"2" => { name: "orange", hex: "#F38400" },
|
19
|
+
"3" => { name: "light_blue", hex: "#A1CAF1" },
|
20
|
+
"4" => { name: "red", hex: "#BE0032" },
|
21
|
+
"5" => { name: "buff", hex: "#C2B280" },
|
22
|
+
"6" => { name: "grey", hex: "#848482" },
|
23
|
+
"7" => { name: "green", hex: "#008856" },
|
24
|
+
"8" => { name: "purplish_pink", hex: "#E68FAC" },
|
25
|
+
"9" => { name: "blue", hex: "#0067A5" },
|
26
|
+
"10" => { name: "yellowish_pink", hex: "#F99379" },
|
27
|
+
"11" => { name: "violet", hex: "#604E97" },
|
28
|
+
"12" => { name: "orange_yellow", hex: "#F6A600" },
|
29
|
+
"13" => { name: "purplish_red", hex: "#B3446C" },
|
30
|
+
"14" => { name: "reddish_brown", hex: "#882D17" },
|
31
|
+
"15" => { name: "yellow_green", hex: "#8DB600" },
|
32
|
+
"16" => { name: "yellowish_brown", hex: "#654522" },
|
33
|
+
"17" => { name: "reddish_orange", hex: "#E25822" },
|
34
|
+
"18" => { name: "olive_green", hex: "#2B3D26" },
|
35
|
+
"19" => { name: "yellow", hex: "#F3C300" },
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# Copyright 2016 Ryan Moore
|
2
|
+
# Contact: moorer@udel.edu
|
3
|
+
#
|
4
|
+
# This file is part of Iroki.
|
5
|
+
#
|
6
|
+
# Iroki is free software: you can redistribute it and/or modify it
|
7
|
+
# under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Iroki is distributed in the hope that it will be useful, but
|
12
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with Iroki. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module Iroki
|
20
|
+
module Color
|
21
|
+
class SingleSampleGradient < Gradient
|
22
|
+
attr_accessor :counts, :rel_abunds, :single_color
|
23
|
+
|
24
|
+
def initialize samples, counts, single_color=false
|
25
|
+
@single_color = single_color
|
26
|
+
@samples = samples
|
27
|
+
@counts = counts
|
28
|
+
@rel_abunds = counts_to_rel_abunds
|
29
|
+
@lumins = rel_abunds_to_lumins
|
30
|
+
|
31
|
+
if @single_color
|
32
|
+
@color_hex_codes = single_color_gradient_hex_codes
|
33
|
+
else
|
34
|
+
@color_hex_codes = two_color_gradient_hex_codes
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def counts_to_rel_abunds
|
41
|
+
max_count = @counts.max.to_f
|
42
|
+
|
43
|
+
@counts.map do |count|
|
44
|
+
count / max_count
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def rel_abunds_to_lumins
|
49
|
+
@rel_abunds.map do |count|
|
50
|
+
Gradient.scale_reverse count, new_min=50, new_max=97
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def two_color_gradient_hex_codes
|
55
|
+
@rel_abunds.map.with_index do |rel_abund, idx|
|
56
|
+
lumin = @lumins[idx]
|
57
|
+
|
58
|
+
col =
|
59
|
+
Iroki::Color::GREEN.mix_with Iroki::Color::BLUE, rel_abund
|
60
|
+
|
61
|
+
col.luminosity = lumin
|
62
|
+
|
63
|
+
col.html
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def single_color_gradient_hex_codes
|
68
|
+
@rel_abunds.zip(@lumins).map do |rel_abund, lumin|
|
69
|
+
amt_of_orig_color =
|
70
|
+
Gradient.scale rel_abund, new_min=10, new_max=95
|
71
|
+
|
72
|
+
col =
|
73
|
+
Iroki::Color::DARK_GREEN.lighten_by amt_of_orig_color
|
74
|
+
|
75
|
+
col.html
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/iroki/main/main.rb
CHANGED
@@ -18,6 +18,7 @@
|
|
18
18
|
|
19
19
|
require "bio"
|
20
20
|
require "set"
|
21
|
+
require "trollop"
|
21
22
|
|
22
23
|
module Iroki
|
23
24
|
module Main
|
@@ -26,6 +27,8 @@ module Iroki
|
|
26
27
|
exact: nil,
|
27
28
|
remove_bootstraps_below: nil,
|
28
29
|
color_map_f: nil,
|
30
|
+
biom_f: nil,
|
31
|
+
single_color: nil,
|
29
32
|
name_map_f: nil,
|
30
33
|
auto_color: nil,
|
31
34
|
display_auto_color_options: nil,
|
@@ -33,19 +36,15 @@ module Iroki
|
|
33
36
|
out_f: nil)
|
34
37
|
|
35
38
|
if display_auto_color_options
|
36
|
-
puts "\n Choices for --auto-color ..."
|
37
|
-
print " - kelly: up to 19 high contrast colors (purple, orange, light blue, red, ...)\n\n"
|
39
|
+
STDERR.puts "\n Choices for --auto-color ..."
|
40
|
+
STDERR.print " - kelly: up to 19 high contrast colors (purple, orange, light blue, red, ...)\n\n"
|
38
41
|
exit
|
39
42
|
end
|
40
43
|
|
41
44
|
auto_color_options = ["kelly"]
|
42
45
|
|
43
|
-
|
44
|
-
|
45
|
-
print " - kelly: up to 19 high contrast colors (purple, orange, light blue, red, ...)\n\n"
|
46
|
-
|
47
|
-
Trollop.die :auto_color, "#{auto_color} is not a valid option"
|
48
|
-
end
|
46
|
+
abort_if !auto_color.nil? && !auto_color_options.include?(auto_color),
|
47
|
+
"'#{auto_color}' is not a valid option. Try iroki --help for help."
|
49
48
|
|
50
49
|
case auto_color
|
51
50
|
when nil
|
@@ -54,10 +53,13 @@ module Iroki
|
|
54
53
|
auto_color_hash = Iroki::Color::Palette::KELLY
|
55
54
|
end
|
56
55
|
|
56
|
+
abort_if biom_f && color_map_f,
|
57
|
+
"--color-map and --biom-file cannot both be specified. Try iroki --help for help."
|
58
|
+
|
57
59
|
newick = check_file newick_f, :newick
|
58
60
|
|
59
61
|
color_f = nil
|
60
|
-
if color_taxa_names || color_branches
|
62
|
+
if !biom_f && (color_taxa_names || color_branches)
|
61
63
|
color_f = check_file color_map_f, :color_map_f
|
62
64
|
end
|
63
65
|
|
@@ -74,6 +76,9 @@ module Iroki
|
|
74
76
|
patterns = parse_color_map color_f,
|
75
77
|
exact_matching: exact,
|
76
78
|
auto_color: auto_color_hash
|
79
|
+
else
|
80
|
+
samples, counts = Biom.open(biom_f).parse_single_sample
|
81
|
+
patterns = SingleSampleGradient.new(samples, counts, single_color).patterns
|
77
82
|
end
|
78
83
|
|
79
84
|
treeio = Bio::FlatFile.open(Bio::Newick, newick)
|
data/lib/iroki/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iroki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Moore
|
@@ -194,7 +194,11 @@ files:
|
|
194
194
|
- exe/reorder_nodes
|
195
195
|
- iroki.gemspec
|
196
196
|
- lib/iroki.rb
|
197
|
+
- lib/iroki/biom.rb
|
197
198
|
- lib/iroki/color/color.rb
|
199
|
+
- lib/iroki/color/gradient.rb
|
200
|
+
- lib/iroki/color/palette/palette.rb
|
201
|
+
- lib/iroki/color/single_sample_gradient.rb
|
198
202
|
- lib/iroki/const/const.rb
|
199
203
|
- lib/iroki/core_ext/file/file.rb
|
200
204
|
- lib/iroki/core_ext/hash/hash.rb
|