bio-svgenes 0.4.0 → 0.4.1

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.4.1
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "bio-svgenes"
8
- s.version = "0.4.0"
8
+ s.version = "0.4.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Dan MacLean"]
12
- s.date = "2014-01-03"
12
+ s.date = "2014-01-06"
13
13
  s.description = "This bio-gem facilitates the creation of pretty, publication quality SVG images from feature data."
14
14
  s.email = "maclean.daniel@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -231,16 +231,23 @@ module Bio
231
231
  old_nt_per_px_x = @nt_per_px_x
232
232
  @tracks.each do |track|
233
233
  highest = track.features.map { |feat|
234
- feat_end = feat.end
235
- feat_end += (8 * @nt_per_px_x * feat.id.to_s.length).to_i if feat.id
236
- feat_end
234
+ compute_boundaries(feat)[1]
237
235
  }.max
238
- @scale_stop = highest if highest > @scale_stop
239
- @nt_per_px_x = (@scale_stop - @scale_start).to_f / @width.to_f
236
+ if highest > @scale_stop
237
+ @scale_stop = highest
238
+ @nt_per_px_x = (@scale_stop - @scale_start).to_f / @width.to_f
239
+ end
240
240
  end
241
241
  end while (@nt_per_px_x - old_nt_per_px_x).abs > 1
242
242
  end
243
243
 
244
+ def compute_boundaries(feature)
245
+ feat_end = feature.end
246
+ feat_end += (8 * @nt_per_px_x * feature.id.to_s.length).to_i if feature.id and @nt_per_px_x
247
+ [feature.start, feat_end]
248
+ end
249
+
250
+
244
251
  #Adds scale bar to the list of objects to be rendered in the final
245
252
  def draw_scale
246
253
  Glyph.scale(:start => @scale_start,
@@ -322,7 +329,7 @@ module Bio
322
329
  if track.label
323
330
  draw_label(:text => track.name, :y => @track_top += 30, :x => 3)
324
331
  end
325
- track.get_rows ##work out how many rows and which features belong in each row...
332
+ track.get_rows(self) ##work out how many rows and which features belong in each row...
326
333
  track.features.each_with_index do |f, index|
327
334
  x = to_px(f.start - @scale_start) #bottom left of feature
328
335
  all_sub_blocks = []
@@ -118,31 +118,47 @@ class Track
118
118
 
119
119
  #Calculates how many rows are needed per track for overlapping features
120
120
  #and which row each feature should be in. Usually only called by the enclosing Bio::Graphics::Page object.
121
- def get_rows
122
- current_row = 1
123
- @feature_rows = Array.new(@features.length,1)
121
+ def get_rows(page=nil)
122
+ @feature_rows = Array.new(@features.length, -1)
123
+ rows = Hash.new { |h,k| h[k] = [] }
124
124
  @features.each_with_index do |f1, i|
125
- @features.each_with_index do |f2, j|
126
- next if i == j or j <= i
127
- if overlaps(f1,f2)
128
- @feature_rows[i] += 1
125
+ current_row = 1
126
+ begin
127
+ found = true
128
+ rows[current_row].each_with_index do |f2, j|
129
+ if overlaps(f1, f2, page)
130
+ found = false
131
+ current_row += 1
132
+ break
133
+ end
129
134
  end
130
- end
131
- @number_rows = @feature_rows.max
135
+ end until found
136
+ @feature_rows[i] = current_row
137
+ rows[current_row] << f1
132
138
  end
139
+ @number_rows = @feature_rows.max
133
140
  end
134
141
 
135
142
  #Calculates whether two Bio::Graphics::MiniFeature objects overlap by examining their start and end positions.
143
+ #If the page where they are placed is given, then the function also considers the features' labels.
136
144
  #
137
145
  #+args+
138
146
  #* f1 - a Bio::Graphics::MiniFeature object
139
147
  #* f2 - a Bio::Graphics::MiniFeature object
140
- def overlaps(f1, f2)
141
- (f1.start >= f2.start and f1.start <= f2.end) or (f1.end >= f2.start and f1.end <= f2.end)
148
+ #* page - the optional Bio::Graphics::Page object where the features are placed
149
+ def overlaps(f1, f2, page=nil)
150
+ if not page
151
+ b1 = [f1.start, f1.end]
152
+ b2 = [f2.start, f2.end]
153
+ else
154
+ b1 = page.compute_boundaries(f1)
155
+ b2 = page.compute_boundaries(f2)
156
+ end
157
+ (b2[0] <= b1[1]) and (b1[0] <= b2[1])
142
158
  end
143
159
 
144
160
  end
145
161
 
146
162
 
147
163
  end
148
- end
164
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bio-svgenes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-03 00:00:00.000000000 Z
12
+ date: 2014-01-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: shoulda
@@ -333,7 +333,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
333
333
  version: '0'
334
334
  segments:
335
335
  - 0
336
- hash: -4059527771038564991
336
+ hash: -1702096108071708551
337
337
  required_rubygems_version: !ruby/object:Gem::Requirement
338
338
  none: false
339
339
  requirements: