ruby-ensembl-api 0.9.6 → 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.
Files changed (62) hide show
  1. data/TUTORIAL.rdoc +1 -1
  2. data/bin/variation_effect_predictor +106 -0
  3. data/lib/ensembl.rb +2 -2
  4. data/lib/ensembl/core/activerecord.rb +119 -225
  5. data/lib/ensembl/core/collection.rb +14 -10
  6. data/lib/ensembl/core/project.rb +6 -8
  7. data/lib/ensembl/core/slice.rb +87 -123
  8. data/lib/ensembl/core/transcript.rb +49 -65
  9. data/lib/ensembl/core/transform.rb +6 -8
  10. data/lib/ensembl/db_connection.rb +56 -72
  11. data/lib/ensembl/variation/activerecord.rb +138 -8
  12. data/lib/ensembl/variation/variation.rb +284 -46
  13. data/samples/ensembl_genomes_example.rb +60 -0
  14. data/samples/examples_perl_tutorial.rb +125 -0
  15. data/samples/small_example_ruby_api.rb +34 -0
  16. data/samples/variation_example.rb +67 -0
  17. data/test/unit/{release_56 → release_60}/core/test_gene.rb +6 -6
  18. data/test/unit/release_60/core/test_project_human.rb +38 -0
  19. data/test/unit/{release_56 → release_60}/core/test_slice.rb +1 -8
  20. data/test/unit/release_60/core/test_transcript.rb +126 -0
  21. data/test/unit/{release_53 → release_60}/core/test_transform.rb +21 -21
  22. data/test/unit/release_60/variation/test_activerecord.rb +213 -0
  23. data/test/unit/release_60/variation/test_consequence.rb +158 -0
  24. data/test/unit/{release_56 → release_60}/variation/test_variation.rb +18 -17
  25. data/test/unit/test_connection.rb +2 -2
  26. data/test/unit/test_releases.rb +8 -8
  27. metadata +27 -43
  28. data/test/unit/data/seq_c6qbl.fa +0 -10
  29. data/test/unit/data/seq_cso19_coding.fa +0 -16
  30. data/test/unit/data/seq_cso19_transcript.fa +0 -28
  31. data/test/unit/data/seq_drd3_gene.fa +0 -838
  32. data/test/unit/data/seq_drd3_transcript.fa +0 -22
  33. data/test/unit/data/seq_drd4_transcript.fa +0 -24
  34. data/test/unit/data/seq_forward_composite.fa +0 -1669
  35. data/test/unit/data/seq_par_boundary.fa +0 -169
  36. data/test/unit/data/seq_rnd3_transcript.fa +0 -47
  37. data/test/unit/data/seq_ub2r1_coding.fa +0 -13
  38. data/test/unit/data/seq_ub2r1_gene.fa +0 -174
  39. data/test/unit/data/seq_ub2r1_transcript.fa +0 -26
  40. data/test/unit/data/seq_y.fa +0 -2
  41. data/test/unit/ensembl_genomes/test_collection.rb +0 -51
  42. data/test/unit/ensembl_genomes/test_gene.rb +0 -52
  43. data/test/unit/ensembl_genomes/test_slice.rb +0 -71
  44. data/test/unit/ensembl_genomes/test_variation.rb +0 -17
  45. data/test/unit/release_50/core/test_project.rb +0 -215
  46. data/test/unit/release_50/core/test_project_human.rb +0 -58
  47. data/test/unit/release_50/core/test_relationships.rb +0 -66
  48. data/test/unit/release_50/core/test_sequence.rb +0 -175
  49. data/test/unit/release_50/core/test_slice.rb +0 -121
  50. data/test/unit/release_50/core/test_transcript.rb +0 -108
  51. data/test/unit/release_50/core/test_transform.rb +0 -223
  52. data/test/unit/release_50/variation/test_activerecord.rb +0 -143
  53. data/test/unit/release_50/variation/test_variation.rb +0 -84
  54. data/test/unit/release_53/core/test_gene.rb +0 -66
  55. data/test/unit/release_53/core/test_project.rb +0 -96
  56. data/test/unit/release_53/core/test_project_human.rb +0 -65
  57. data/test/unit/release_53/core/test_slice.rb +0 -47
  58. data/test/unit/release_53/variation/test_activerecord.rb +0 -145
  59. data/test/unit/release_53/variation/test_variation.rb +0 -71
  60. data/test/unit/release_56/core/test_project.rb +0 -96
  61. data/test/unit/release_56/core/test_transform.rb +0 -63
  62. data/test/unit/release_56/variation/test_activerecord.rb +0 -142
@@ -4,18 +4,19 @@
4
4
  # Copyright:: Copyright (C) 2009 Francesco Strozzi <francesco.strozzi@gmail.com>
5
5
  #
6
6
  # License:: The Ruby License
7
+ #
8
+ # @author Francesco Strozzi
7
9
 
8
10
  module Ensembl
9
11
  nil
10
12
  module Core
11
- # = DESCRIPTION
12
13
  # Class to describe and handle multi-species databases
13
14
  #
14
15
  class Collection
15
- # = DESCRIPTION
16
16
  # Method to check if the current core database is a multi-species db.
17
17
  # Returns a boolean value.
18
18
  #
19
+ # @return [Boolean] True if current db is multi-species db; otherwise false.
19
20
  def self.check()
20
21
  host,user,password,db_name,port = Ensembl::Core::DBConnection.get_info
21
22
  if db_name =~/(\w+)_collection_core_.*/
@@ -24,16 +25,17 @@ module Ensembl
24
25
  return false
25
26
  end
26
27
 
27
- # = DESCRIPTION
28
28
  # Returns an array with all the Species present in a collection database.
29
- #
29
+ #
30
+ # @return [Array<String>] Array containing species names in colleciton
30
31
  def self.species()
31
32
  return Meta.find_all_by_meta_key("species.db_name").collect {|m| m.meta_value}
32
33
  end
33
34
 
34
- # = DESCRIPTION
35
- # Returns the species_id of a particular specie present in the database.
36
- #
35
+ # Returns the species_id of a particular species present in the database.
36
+ #
37
+ # @param [String] species Name of species
38
+ # @return [Integer] Species ID in the database.
37
39
  def self.get_species_id(species)
38
40
  species = species.downcase
39
41
  meta = Meta.find_by_sql("SELECT * FROM meta WHERE LOWER(meta_value) = '#{species}'")[0]
@@ -44,10 +46,12 @@ module Ensembl
44
46
  end
45
47
  end
46
48
 
47
- # = DESCRIPTION
48
- # Returns an array with all the coord_system_id associated with a particular specie and a table_name.
49
+ # Returns an array with all the coord_system_id associated with a particular species and a table_name.
49
50
  # Used inside Slice#method_missing to filter the coord_system_id using a particular species_id.
50
51
  #
52
+ # @param [String] table_name Table name
53
+ # @param [Integer] species_id ID of species in the database
54
+ # @return [Array<Integer>] Array containing coord_system IDs.
51
55
  def self.find_all_coord_by_table_name(table_name,species_id)
52
56
  all_ids = CoordSystem.find_all_by_species_id(species_id)
53
57
  return MetaCoord.find_all_by_coord_system_id_and_table_name(all_ids,table_name)
@@ -57,4 +61,4 @@ module Ensembl
57
61
 
58
62
 
59
63
  end
60
- end
64
+ end
@@ -6,10 +6,11 @@
6
6
  #
7
7
  # License:: The Ruby License
8
8
  #
9
+ # @author Jan Aerts
10
+ # @author Francesco Strozzi
9
11
  module Ensembl
10
12
  module Core
11
13
  class Slice
12
- # = DESCRIPTION
13
14
  # The Slice#project method is used to transfer coordinates from one
14
15
  # coordinate system to another. Suppose you have a slice on a
15
16
  # contig in human (let's say on contig AC000031.6.1.38703) and you
@@ -24,8 +25,7 @@ module Ensembl
24
25
  # At the moment, projections can only be done if the two coordinate
25
26
  # systems are linked directly in the 'assembly' table.
26
27
  #
27
- # = USAGE
28
- #
28
+ # @example
29
29
  # # Get a contig slice in cow and project to scaffold level
30
30
  # # (i.e. going from a high rank coord system to a lower rank coord
31
31
  # # system)
@@ -47,11 +47,9 @@ module Ensembl
47
47
  # puts second_bit.class #--> Gap
48
48
  # puts third_bit.display_name #--> scaffold:Btau_3.1:Chr4.003.106:1:738311:1
49
49
  #
50
- # ---
51
- # *Arguments*:
52
- # * coord_system_name:: name of coordinate system to project
53
- # coordinates to
54
- # *Returns*:: an array consisting of Slices and, if necessary, Gaps
50
+ # @param [String] coord_system_name Name of coordinate system to project
51
+ # coordinates to
52
+ # @return [Array<Slice, Gap>] Array of Slices and, if necessary, Gaps
55
53
  def project(coord_system_name)
56
54
  answer = Array.new # an array of slices
57
55
  unless Ensembl::SESSION.coord_systems.has_key?(self.seq_region.coord_system_id)
@@ -6,12 +6,13 @@
6
6
  #
7
7
  # License:: The Ruby License
8
8
  #
9
+ # @author Jan Aerts
10
+ # @author Francesco Strozzi
9
11
  nil
10
12
  module Ensembl
11
13
  nil
12
14
  module Core
13
15
 
14
- # = DESCRIPTION
15
16
  # From the perl API tutorial
16
17
  # (http://www.ensembl.org/info/software/core/core_tutorial.html): "A
17
18
  # Slice object represents a continuous region of a genome. Slices can be
@@ -21,7 +22,7 @@ module Ensembl
21
22
  # In contrast to almost all other classes of Ensembl::Core,
22
23
  # the Slice class is not based on ActiveRecord.
23
24
  #
24
- # = USAGE
25
+ # @example
25
26
  # chr4 = SeqRegion.find_by_name('4')
26
27
  # my_slice = Slice.new(chr4, 95000, 98000, -1)
27
28
  # puts my_slice.display_name #--> 'chromosome:4:Btau_3.1:95000:98000:1'
@@ -32,20 +33,17 @@ module Ensembl
32
33
  ## CREATE A SLICE
33
34
  #################
34
35
 
35
- # = DESCRIPTION
36
36
  # Create a new Slice object from scratch.
37
37
  #
38
- # = USAGE
38
+ # @example
39
39
  # chr4 = SeqRegion.find_by_name('4')
40
40
  # my_slice = Slice.new(chr4, 95000, 98000, -1)
41
- # ---
42
- # *Arguments*:
43
- # * seq_region: SeqRegion object
44
- # * start: start position of the Slice on the SeqRegion (default = 1)
45
- # * stop: stop position of the Slice on the SeqRegion (default: end of
46
- # SeqRegion)
47
- # * strand: strand of the Slice relative to the SeqRegion (default = 1)
48
- # *Returns*:: Slice object
41
+ #
42
+ # @param [SeqRegion] seq_region SeqRegion object
43
+ # @param [Integer] start Start position of the slice on the seq_region
44
+ # @param [Integer] stop Stop position of the slice on the seq_region
45
+ # @param [Integer] strand Strand that the slice should be
46
+ # @return [Slice] Slice object
49
47
  def initialize(seq_region, start = 1, stop = seq_region.length, strand = 1)
50
48
  if start.nil?
51
49
  start = 1
@@ -60,29 +58,28 @@ module Ensembl
60
58
  @seq = nil
61
59
  end
62
60
 
63
- # = DESCRIPTION
64
61
  # Create a Slice without first creating the SeqRegion object.
65
62
  #
66
- # = USAGE
63
+ # @example
67
64
  # my_slice_1 = Slice.fetch_by_region('chromosome','4',95000,98000,1)
68
65
  #
69
- # ---
70
- # *Arguments*:
71
- # * coord_system: name of CoordSystem (required)
72
- # * seq_region: name of SeqRegion (required)
73
- # * start: start of Slice on SeqRegion (default = 1)
74
- # * stop: stop of Slice on SeqRegion (default = end of SeqRegion)
75
- # * strand: strand of Slice on SeqRegion
76
- # *Returns*:: Ensembl::Core::Slice object
66
+ # @param [String] coord_system_name Name of coordinate system
67
+ # @param [String] seq_region_name name of the seq_region
68
+ # @param [Integer] start Start position of the slice on the seq_region
69
+ # @param [Integer] stop Stop position of the slice on the seq_region
70
+ # @param [Integer] strand Strand that the slice should be
71
+ # @param [String] species Name of species in case of multi-species database
72
+ # @param [Integer] version Version number of the coordinate system
73
+ # @return [Slice] Slice object
77
74
  def self.fetch_by_region(coord_system_name, seq_region_name, start = nil, stop = nil, strand = 1, species = Ensembl::SESSION.collection_species ,version = nil)
78
75
  all_coord_systems = nil
79
76
  if Collection.check
80
77
  species = species.downcase
81
78
  if species.nil?
82
- raise ArgumentError, "When using multi-species db, you must pass a specie name to get the correct Slice"
79
+ raise ArgumentError, "When using multi-species db, you must pass a species name to get the correct Slice"
83
80
  else
84
81
  species_id = Collection.get_species_id(species)
85
- raise ArgumentError, "No specie found in the database with this name: #{species}" if species_id.nil?
82
+ raise ArgumentError, "No species found in the database with this name: #{species}" if species_id.nil?
86
83
  all_coord_systems = Ensembl::Core::CoordSystem.find_all_by_name_and_species_id(coord_system_name,species_id)
87
84
  end
88
85
  else
@@ -111,16 +108,14 @@ module Ensembl
111
108
  return Ensembl::Core::Slice.new(seq_region, start, stop, strand)
112
109
  end
113
110
 
114
- # = DESCRIPTION
115
111
  # Create a Slice based on a Gene
116
112
  #
117
- # = USAGE
113
+ # @example
118
114
  # my_slice = Slice.fetch_by_gene_stable_id('ENSG00000184895')
119
115
  #
120
- # ---
121
- # *Arguments*:
122
- # * gene_stable_id: Ensembl gene stable_id (required)
123
- # *Returns*:: Ensembl::Core::Slice object
116
+ # @param [String] gene_stable_id Ensembl gene stable ID
117
+ # @param [Integer] flanking_seq_length Length of the flanking sequence
118
+ # @return [Slice] Slice object
124
119
  def self.fetch_by_gene_stable_id(gene_stable_id, flanking_seq_length = 0)
125
120
  gene_stable_id = Ensembl::Core::GeneStableId.find_by_stable_id(gene_stable_id)
126
121
  gene = gene_stable_id.gene
@@ -129,16 +124,14 @@ module Ensembl
129
124
  return Ensembl::Core::Slice.new(seq_region, gene.seq_region_start - flanking_seq_length, gene.seq_region_end + flanking_seq_length, gene.seq_region_strand)
130
125
  end
131
126
 
132
- # = DESCRIPTION
133
127
  # Create a Slice based on a Transcript
134
128
  #
135
- # = USAGE
129
+ # @example
136
130
  # my_slice = Slice.fetch_by_transcript_stable_id('ENST00000383673')
137
131
  #
138
- # ---
139
- # *Arguments*:
140
- # * transcript_stable_id: Ensembl transcript stable_id (required)
141
- # *Returns*:: Ensembl::Core::Slice object
132
+ # @param [String] transcript_stable_id Ensembl transcript stable ID
133
+ # @param [Integer] flanking_seq_length Length of the flanking sequence
134
+ # @return [Slice] Slice object
142
135
  def self.fetch_by_transcript_stable_id(transcript_stable_id, flanking_seq_length = 0)
143
136
  transcript_stable_id = Ensembl::Core::TranscriptStableId.find_by_stable_id(transcript_stable_id)
144
137
  transcript = transcript_stable_id.transcript
@@ -147,17 +140,15 @@ module Ensembl
147
140
  return Ensembl::Core::Slice.new(seq_region, transcript.seq_region_start - flanking_seq_length, transcript.seq_region_end + flanking_seq_length, transcript.seq_region_strand)
148
141
  end
149
142
 
150
- # = DESCRIPTION
151
143
  # Create an array of all Slices for a given coordinate system.
152
144
  #
153
- # = USAGE
145
+ # @example
154
146
  # slices = Slice.fetch_all('chromosome')
155
147
  #
156
- # ---
157
- # *Arguments*:
158
- # * coord_system_name:: name of coordinate system (default = chromosome)
159
- # * coord_system_version:: version of coordinate system (default = nil)
160
- # *Returns*:: an array of Ensembl::Core::Slice objects
148
+ # @param [String] coord_system_name Name of coordinate system
149
+ # @param [String] species Name of species
150
+ # @param [Integer] version Version of coordinate system
151
+ # @return [Array<Slice>] Array of Slice objects
161
152
  def self.fetch_all(coord_system_name = 'chromosome',species = Ensembl::SESSION.collection_species ,version = nil)
162
153
  answer = Array.new
163
154
  coord_system = nil
@@ -187,50 +178,45 @@ module Ensembl
187
178
  ## GENERAL METHODS
188
179
  ##################
189
180
 
190
- # = DESCRIPTION
191
181
  # Get the length of a slice
192
182
  #
193
- # = USAGE
183
+ # @example
194
184
  # chr4 = SeqRegion.find_by_name('4')
195
185
  # my_slice = Slice.new(chr4, 95000, 98000, -1)
196
186
  # puts my_slice.length
197
- # ---
198
- # *Arguments*:: none
199
- # *Returns*:: Integer
187
+ #
188
+ # @return [Integer] Length of the slice
200
189
  def length
201
190
  return self.stop - self.start + 1
202
191
  end
203
192
 
204
- # = DESCRIPTION
205
193
  # The display_name method returns a full name of this slice, containing
206
194
  # the name of the coordinate system, the sequence region, start and
207
195
  # stop positions on that sequence region and the strand. E.g. for a slice
208
196
  # of bovine chromosome 4 from position 95000 to 98000 on the reverse strand,
209
197
  # the display_name would look like: chromosome:4:Btau_3.1:95000:98000:-1
210
198
  #
211
- # = USAGE
199
+ # @example
212
200
  # puts my_slice.display_name
213
- # ---
214
- # *Arguments*:: none
215
- # *Result*:: String
201
+ #
202
+ # @return [String] Nicely formatted name of the Slice
216
203
  def display_name
217
204
  return [self.seq_region.coord_system.name, self.seq_region.coord_system.version, self.seq_region.name, self.start.to_s, self.stop.to_s, self.strand.to_s].join(':')
218
205
  end
219
206
  alias to_s display_name
220
207
 
221
- # = DESCRIPTION
222
208
  # The Slice#overlaps? method checks if this slice overlaps another one.
223
209
  # The other slice has to be on the same coordinate system
224
210
  #
225
- # = USAGE
211
+ # @example
226
212
  # slice_a = Slice.fetch_by_region('chromosome','X',1,1000)
227
213
  # slice_b = Slice.fetch_by_region('chromosome','X',900,1500)
228
214
  # if slice_a.overlaps?(slice_b)
229
215
  # puts "There slices overlap"
230
216
  # end
231
- # ---
232
- # *Arguments*:: another slice
233
- # *Returns*:: true or false
217
+ #
218
+ # @param [Slice] other_slice Another slice
219
+ # @return [Boolean] True if slices overlap, otherwise false
234
220
  def overlaps?(other_slice)
235
221
  if ! other_slice.class == Slice
236
222
  raise RuntimeError, "The Slice#overlaps? method takes a Slice object as its arguments."
@@ -249,19 +235,18 @@ module Ensembl
249
235
  end
250
236
  end
251
237
 
252
- # = DESCRIPTION
253
238
  # The Slice#within? method checks if this slice is contained withing another one.
254
239
  # The other slice has to be on the same coordinate system
255
240
  #
256
- # = USAGE
241
+ # @example
257
242
  # slice_a = Slice.fetch_by_region('chromosome','X',1,1000)
258
243
  # slice_b = Slice.fetch_by_region('chromosome','X',900,950)
259
244
  # if slice_b.overlaps?(slice_a)
260
245
  # puts "Slice b is within slice a"
261
246
  # end
262
- # ---
263
- # *Arguments*:: another slice
264
- # *Returns*:: true or false
247
+ #
248
+ # @param [Slice] other_slice Another slice
249
+ # @return [Boolean] True if this slice is within other_slice, otherwise false
265
250
  def within?(other_slice)
266
251
  if ! other_slice.class == Slice
267
252
  raise RuntimeError, "The Slice#overlaps? method takes a Slice object as its arguments."
@@ -280,11 +265,10 @@ module Ensembl
280
265
  end
281
266
  end
282
267
 
283
- # = DESCRIPTION
284
268
  # The Slice#excise method removes a bit of a slice and returns the
285
269
  # remainder as separate slices.
286
270
  #
287
- # = USAGE
271
+ # @example
288
272
  # original_slice = Slice.fetch_by_region('chromosome','X',1,10000)
289
273
  # new_slices = original_slice.excise([500..750, 1050..1075])
290
274
  # new_slices.each do |s|
@@ -295,10 +279,9 @@ module Ensembl
295
279
  # # chromosome:X:1:499:1
296
280
  # # chromosome:X:751:1049:1
297
281
  # # chromosome:X:1076:10000:1
298
- # ---
299
- # *Arguments*:
300
- # * ranges: array of ranges (required)
301
- # *Returns*:: array of Slice objects
282
+ #
283
+ # @param [Array<Range>] Array of ranges to excise
284
+ # @return [Array<Slice>] Array of slices
302
285
  def excise(ranges)
303
286
  if ranges.class != Array
304
287
  raise RuntimeError, "Argument should be an array of ranges"
@@ -326,7 +309,6 @@ module Ensembl
326
309
  return answer
327
310
  end
328
311
 
329
- # = DESCRIPTION
330
312
  # Get the sequence of the Slice as a Bio::Sequence::NA object.
331
313
  #
332
314
  # If the Slice is on a CoordSystem that is not seq_level, it will try
@@ -338,12 +320,10 @@ module Ensembl
338
320
  # Caution: Bio::Sequence::NA makes the sequence
339
321
  # downcase!!
340
322
  #
341
- # = USAGE
323
+ # @example
342
324
  # my_slice.seq.seq.to_s
343
325
  #
344
- # ---
345
- # *Arguments*:: none
346
- # *Returns*:: Bio::Sequence::NA object
326
+ # @return [Bio::Sequence::NA] Slice sequence as a Bio::Sequence::NA object
347
327
  def seq
348
328
  # If we already accessed the sequence, we can just
349
329
  # call the instance variable. Otherwise, we'll have
@@ -381,34 +361,28 @@ module Ensembl
381
361
  raise NotImplementedError
382
362
  end
383
363
 
384
- # = DESCRIPTION
385
364
  # Take a sub_slice from an existing one.
386
365
  #
387
- # = USAGE
366
+ # @example
388
367
  # my_sub_slice = my_slice.sub_slice(400,500)
389
368
  #
390
- # ---
391
- # *Arguments*:
392
- # * start: start of subslice relative to slice (default: start of slice)
393
- # * stop: stop of subslice relative to slice (default: stop of slice)
394
- # *Returns*:: Ensembl::Core::Slice object
369
+ # @param [Integer] start Start of subslice relative to slice
370
+ # @param [Integer] stop Stop of subslice relative to slice
371
+ # @return [Slice] Slice object
395
372
  def sub_slice(start = self.start, stop = self.stop)
396
373
  return self.class.new(self.seq_region, start, stop, self.strand)
397
374
  end
398
375
 
399
- # = DESCRIPTION
400
376
  # Creates overlapping subslices for a given Slice.
401
377
  #
402
- # = USAGE
378
+ # @example
403
379
  # my_slice.split(50000, 250).each do |sub_slice|
404
380
  # puts sub_slice.display_name
405
381
  # end
406
382
  #
407
- # ---
408
- # *Arguments*:
409
- # * max_size: maximal size of subslices (default: 100000)
410
- # * overlap: overlap in bp between consecutive subslices (default: 0)
411
- # *Returns*:: array of Ensembl::Core::Slice objects
383
+ # @param [Integer] max_size Maximal size of subslices
384
+ # @param [Integer] overlap Overlap in bp between consecutive subslices
385
+ # @return [Array<Slice>] Array of Slice objects
412
386
  def split(max_size = 100000, overlap = 0)
413
387
  sub_slices = Array.new
414
388
  i = 0
@@ -532,7 +506,6 @@ SQL
532
506
  end
533
507
 
534
508
 
535
- # = DESCRIPTION
536
509
  # Get all MiscFeatures that are located on a Slice for a given MiscSet.
537
510
  #
538
511
  # Pitfall: just looks at the CoordSystem that the Slice is located on.
@@ -540,14 +513,13 @@ SQL
540
513
  # CoordSystem, but all misc_features are annotated on SeqRegions of
541
514
  # the 'scaffold' CoordSystem, this method will return an empty array.
542
515
  #
543
- # = USAGE
516
+ # @example
544
517
  # my_slice.misc_features('encode').each do |feature|
545
518
  # puts feature.to_yaml
546
519
  # end
547
- # ---
548
- # *Arguments*:
549
- # * code: code of MiscSet
550
- # *Returns*:: array of MiscFeature objects
520
+ #
521
+ # @param [String] code Code of MiscSet
522
+ # @return [Array<MiscFeature>] Array of MiscFeature objects
551
523
  def misc_features(code)
552
524
  answer = Array.new
553
525
  if code.nil?
@@ -568,7 +540,6 @@ SQL
568
540
  return answer
569
541
  end
570
542
 
571
- # = DESCRIPTION
572
543
  # Get all DnaAlignFeatures that are located on a Slice for a given Analysis.
573
544
  #
574
545
  # Pitfall: just looks at the CoordSystem that the Slice is located on.
@@ -576,14 +547,13 @@ SQL
576
547
  # CoordSystem, but all dna_align_features are annotated on SeqRegions of
577
548
  # the 'scaffold' CoordSystem, this method will return an empty array.
578
549
  #
579
- # = USAGE
550
+ # @example
580
551
  # my_slice.dna_align_features('Vertrna').each do |feature|
581
552
  # puts feature.to_yaml
582
553
  # end
583
- # ---
584
- # *Arguments*:
585
- # * code: name of analysis
586
- # *Returns*:: array of DnaAlignFeature objects
554
+ #
555
+ # @param [String] analysis_name Name of analysis
556
+ # @return [Array<DnaAlignFeature>] Array of DnaAlignFeature objects
587
557
  def dna_align_features(analysis_name = nil)
588
558
  if analysis_name.nil?
589
559
  return DnaAlignFeature.find_by_sql('SELECT * FROM dna_align_feature WHERE seq_region_id = ' + self.seq_region.id.to_s + ' AND seq_region_start >= ' + self.start.to_s + ' AND seq_region_end <= ' + self.stop.to_s)
@@ -593,7 +563,6 @@ SQL
593
563
  end
594
564
  end
595
565
 
596
- # = DESCRIPTION
597
566
  # Get all ProteinAlignFeatures that are located on a Slice for a given Analysis.
598
567
  #
599
568
  # Pitfall: just looks at the CoordSystem that the Slice is located on.
@@ -601,14 +570,13 @@ SQL
601
570
  # CoordSystem, but all protein_align_features are annotated on SeqRegions of
602
571
  # the 'scaffold' CoordSystem, this method will return an empty array.
603
572
  #
604
- # = USAGE
573
+ # @example
605
574
  # my_slice.protein_align_features('Uniprot').each do |feature|
606
575
  # puts feature.to_yaml
607
576
  # end
608
- # ---
609
- # *Arguments*:
610
- # * code: name of analysis
611
- # *Returns*:: array of ProteinAlignFeature objects
577
+ #
578
+ # @param [String] analysis_name Name of analysis
579
+ # @return [Array<ProteinAlignFeature>] Array of ProteinAlignFeature objects
612
580
  def protein_align_features(analysis_name)
613
581
  if analysis_name.nil?
614
582
  return ProteinAlignFeature.find_by_sql('SELECT * FROM protein_align_feature WHERE seq_region_id = ' + self.seq_region.id.to_s + ' AND seq_region_start >= ' + self.start.to_s + ' AND seq_region_end <= ' + self.stop.to_s)
@@ -623,9 +591,8 @@ SQL
623
591
  ############################
624
592
 
625
593
 
626
- #= DESCRIPTION
627
594
  # Method to retrieve Variation features from Ensembl::Core::Slice objects
628
- #= USAGE
595
+ # @example
629
596
  # slice = Slice.fetch_by_region('chromosome',1,50000,51000)
630
597
  # variations = slice.get_variation_features
631
598
  # variations.each do |vf|
@@ -642,17 +609,17 @@ SQL
642
609
  Ensembl::Variation::VariationFeature.find(:all,:conditions => ["flags = 'genotyped' AND seq_region_id = ? AND seq_region_start >= ? AND seq_region_end <= ?",self.seq_region.seq_region_id,self.start,self.stop])
643
610
  end
644
611
 
612
+ def get_structural_variations
613
+ variation_connection()
614
+ Ensembl::Variation::StructuralVariation.find(:all,:conditions => ["seq_region_id = ? AND seq_region_start >= ? AND seq_region_end <= ?",self.seq_region.seq_region_id,self.start,self.stop])
615
+ end
616
+
645
617
  private
646
618
 
647
619
  def variation_connection()
648
620
  if !Ensembl::Variation::DBConnection.connected?
649
- host,user,password,db_name,port = Ensembl::Core::DBConnection.get_info
650
- if db_name =~/(\w+_\w+)_\w+_(\d+)_\S+/ then
651
- species,release = $1,$2
652
- Ensembl::Variation::DBConnection.connect(species,release.to_i,:username => user, :password => password,:host => host, :port => port)
653
- else
654
- raise NameError, "Can't get Variation Database name from #{db_name}. Are you using non conventional names?"
655
- end
621
+ host,user,password,db_name,port,species,release = Ensembl::Core::DBConnection.get_info
622
+ Ensembl::Variation::DBConnection.connect(species,release.to_i,:username => user, :password => password,:host => host, :port => port)
656
623
  end
657
624
 
658
625
  end
@@ -660,25 +627,22 @@ SQL
660
627
 
661
628
  end #Slice
662
629
 
663
- # = DESCRIPTION
664
630
  # The Gap class is similar to the Slice object, but describes a gap and
665
631
  # therefore can easily be described by coordinate system and size.
666
632
  #
667
633
  class Gap
668
634
  attr_accessor :coord_system, :size
669
635
 
670
- # = DESCRIPTION
671
636
  # Create a new Gap object from scratch.
672
637
  #
673
- # = USAGE
638
+ # @example
674
639
  # my_coord_system = CoordSystem.find_by_name('chromosome')
675
640
  # # Create a gap of 10kb.
676
641
  # gap = Gap.new(my_coord_system, 10000)
677
- # ---
678
- # *Arguments*:
679
- # * coord_system: CoordSystem object (required)
680
- # * length: length of the gap (required)
681
- # *Returns*:: Gap object
642
+ #
643
+ # @param [CoordSystem] coord_system Coordinate system object
644
+ # @param [Integer] size Length of the gap
645
+ # @return [Gap] Gap object
682
646
  def initialize(coord_system, size)
683
647
  @coord_system, @size = coord_system, size
684
648
  end