Class: SequenceLogo::CanvasFactory

Inherits:
Object
  • Object
show all
Defined in:
lib/sequence_logo/canvas_factory.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(letter_images, options = {}) ⇒ CanvasFactory

Returns a new instance of CanvasFactory.



9
10
11
12
13
14
15
16
# File 'lib/sequence_logo/canvas_factory.rb', line 9

def initialize(letter_images, options = {})
  @letter_images = letter_images # .map{|letter_image| letter_image.dup.resize(x_size, y_size) }
  @logo_shift = options[:logo_shift] || 300
  @x_unit = options[:x_unit] || 30
  @y_unit = options[:y_unit] || 60
  @text_size = options[:text_size] || 24
  @background_fill = options[:background_fill] || Magick::SolidFill.new('transparent')
end

Instance Attribute Details

#background_fillObject (readonly)

Returns the value of attribute background_fill.



6
7
8
# File 'lib/sequence_logo/canvas_factory.rb', line 6

def background_fill
  @background_fill
end

#letter_imagesObject (readonly)

Returns the value of attribute letter_images.



7
8
9
# File 'lib/sequence_logo/canvas_factory.rb', line 7

def letter_images
  @letter_images
end

#logo_shiftObject (readonly)

Returns the value of attribute logo_shift.



6
7
8
# File 'lib/sequence_logo/canvas_factory.rb', line 6

def logo_shift
  @logo_shift
end

#text_sizeObject (readonly)

Returns the value of attribute text_size.



6
7
8
# File 'lib/sequence_logo/canvas_factory.rb', line 6

def text_size
  @text_size
end

#x_unitObject (readonly)

Returns the value of attribute x_unit.



6
7
8
# File 'lib/sequence_logo/canvas_factory.rb', line 6

def x_unit
  @x_unit
end

#y_unitObject (readonly)

Returns the value of attribute y_unit.



6
7
8
# File 'lib/sequence_logo/canvas_factory.rb', line 6

def y_unit
  @y_unit
end

Class Method Details

.letter_images(scheme_dir) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/sequence_logo/canvas_factory.rb', line 84

def self.letter_images(scheme_dir)
  if File.exist?(File.join(scheme_dir,'a.png'))
    extension = 'png'
  elsif File.exist?(File.join(scheme_dir,'a.gif'))
    extension = 'gif'
  else
    raise "Scheme not exists in folder #{scheme_dir}"
  end

  letter_files = %w[a c g t].collect{|letter| File.join(scheme_dir, "#{letter}.#{extension}") }
  Magick::ImageList.new(*letter_files)
end

Instance Method Details

#letter_image(letter, x_size = x_unit, y_size = y_unit) ⇒ Object



70
71
72
73
74
75
76
77
78
# File 'lib/sequence_logo/canvas_factory.rb', line 70

def letter_image(letter, x_size = x_unit, y_size = y_unit)
  case letter
  when Numeric
    index = letter
  else
    index = letter_index(letter)
  end
  letter_images[index].dup.resize(x_size, y_size)
end

#letter_index(letter) ⇒ Object



80
81
82
# File 'lib/sequence_logo/canvas_factory.rb', line 80

def letter_index(letter)
  {'A' => 0 ,'C' => 1,'G' => 2 ,'T' => 3}[letter.to_s.upcase]
end

#logo_canvasObject



41
42
43
# File 'lib/sequence_logo/canvas_factory.rb', line 41

def logo_canvas
  LogoCanvas.new(letter_images, x_unit: x_unit, y_unit: y_unit)
end

#logo_for_ordered_letters(letters_with_heights) ⇒ Object

Takes an enumerable with relative (0 to 1) heights of letters and draws them scaled appropriately



46
47
48
# File 'lib/sequence_logo/canvas_factory.rb', line 46

def logo_for_ordered_letters(letters_with_heights)
  logo_for_ordered_letters_nonscaling(rescale_letters(letters_with_heights))
end

#logo_with_name(image, name) ⇒ Object



34
35
36
37
38
39
# File 'lib/sequence_logo/canvas_factory.rb', line 34

def logo_with_name(image, name)
  canvas = HorizontalGluingCanvas.new
  canvas.add_image text_image(name, image.rows)
  canvas.add_image image
  canvas.image
end

#shifted_logo(image, shift) ⇒ Object



27
28
29
30
31
32
# File 'lib/sequence_logo/canvas_factory.rb', line 27

def (image, shift)
  canvas = HorizontalGluingCanvas.new
  canvas.add_image Magick::Image.new(shift * x_unit, image.rows){ self.background_color = 'transparent' }
  canvas.add_image image
  canvas.image
end

#text_image(text, img_height = y_unit) ⇒ Object



18
19
20
21
22
23
24
25
# File 'lib/sequence_logo/canvas_factory.rb', line 18

def text_image(text, img_height = y_unit)
  text_img = Magick::Image.new(logo_shift, img_height){ self.background_color = 'transparent' }
  annotation = Magick::Draw.new
  annotation.pointsize(text_size)
  annotation.text(10, img_height / 2, text)
  annotation.draw(text_img)
  text_img
end