bio 1.5.2 → 1.6.0.pre.20181210

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +12 -11
  3. data/ChangeLog +14 -3106
  4. data/{gemfiles/Gemfile.travis-ruby2.2 → Gemfile} +0 -1
  5. data/KNOWN_ISSUES.rdoc +0 -5
  6. data/README.rdoc +11 -18
  7. data/RELEASE_NOTES.rdoc +34 -291
  8. data/Rakefile +13 -9
  9. data/appveyor.yml +21 -0
  10. data/bioruby.gemspec +7 -78
  11. data/bioruby.gemspec.erb +8 -27
  12. data/doc/ChangeLog-1.5.0 +2919 -0
  13. data/doc/RELEASE_NOTES-1.5.0.rdoc +285 -0
  14. data/doc/Tutorial.rd +6 -108
  15. data/doc/Tutorial.rd.html +19 -98
  16. data/gemfiles/Gemfile.travis-jruby1.8 +3 -5
  17. data/gemfiles/Gemfile.travis-jruby1.9 +0 -3
  18. data/gemfiles/Gemfile.travis-rbx +0 -1
  19. data/gemfiles/Gemfile.travis-ruby1.8 +4 -4
  20. data/gemfiles/Gemfile.travis-ruby1.9 +0 -1
  21. data/gemfiles/prepare-gemspec.rb +4 -0
  22. data/lib/bio.rb +0 -10
  23. data/lib/bio/data/codontable.rb +99 -3
  24. data/lib/bio/io/togows.rb +5 -5
  25. data/lib/bio/version.rb +6 -8
  26. data/sample/test_restriction_enzyme_long.rb +1 -1
  27. data/test/unit/bio/data/test_codontable.rb +3 -0
  28. metadata +11 -77
  29. data/bin/bioruby +0 -47
  30. data/bin/br_biofetch.rb +0 -71
  31. data/bin/br_bioflat.rb +0 -293
  32. data/bin/br_biogetseq.rb +0 -45
  33. data/bin/br_pmfetch.rb +0 -422
  34. data/lib/bio/db/biosql/biosql_to_biosequence.rb +0 -78
  35. data/lib/bio/db/biosql/sequence.rb +0 -444
  36. data/lib/bio/db/phyloxml/phyloxml.xsd +0 -582
  37. data/lib/bio/db/phyloxml/phyloxml_elements.rb +0 -1197
  38. data/lib/bio/db/phyloxml/phyloxml_parser.rb +0 -1001
  39. data/lib/bio/db/phyloxml/phyloxml_writer.rb +0 -227
  40. data/lib/bio/io/biosql/ar-biosql.rb +0 -257
  41. data/lib/bio/io/biosql/biosql.rb +0 -39
  42. data/lib/bio/io/biosql/config/database.yml +0 -21
  43. data/lib/bio/io/sql.rb +0 -79
  44. data/lib/bio/shell.rb +0 -44
  45. data/lib/bio/shell/core.rb +0 -578
  46. data/lib/bio/shell/demo.rb +0 -146
  47. data/lib/bio/shell/interface.rb +0 -217
  48. data/lib/bio/shell/irb.rb +0 -94
  49. data/lib/bio/shell/object.rb +0 -71
  50. data/lib/bio/shell/plugin/blast.rb +0 -42
  51. data/lib/bio/shell/plugin/codon.rb +0 -218
  52. data/lib/bio/shell/plugin/das.rb +0 -58
  53. data/lib/bio/shell/plugin/emboss.rb +0 -23
  54. data/lib/bio/shell/plugin/entry.rb +0 -137
  55. data/lib/bio/shell/plugin/flatfile.rb +0 -101
  56. data/lib/bio/shell/plugin/midi.rb +0 -430
  57. data/lib/bio/shell/plugin/ncbirest.rb +0 -68
  58. data/lib/bio/shell/plugin/obda.rb +0 -45
  59. data/lib/bio/shell/plugin/psort.rb +0 -56
  60. data/lib/bio/shell/plugin/seq.rb +0 -248
  61. data/lib/bio/shell/plugin/togows.rb +0 -40
  62. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/bioruby_generator.rb +0 -29
  63. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/_classes.rhtml +0 -4
  64. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/_log.rhtml +0 -27
  65. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/_methods.rhtml +0 -11
  66. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/_modules.rhtml +0 -4
  67. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/_variables.rhtml +0 -7
  68. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby-bg.gif +0 -0
  69. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby-gem.png +0 -0
  70. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby-link.gif +0 -0
  71. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby.css +0 -368
  72. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby.rhtml +0 -47
  73. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby_controller.rb +0 -144
  74. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby_helper.rb +0 -47
  75. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/commands.rhtml +0 -8
  76. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/history.rhtml +0 -10
  77. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/index.rhtml +0 -26
  78. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/spinner.gif +0 -0
  79. data/lib/bio/shell/script.rb +0 -25
  80. data/lib/bio/shell/setup.rb +0 -108
  81. data/lib/bio/shell/web.rb +0 -102
  82. data/sample/test_phyloxml_big.rb +0 -205
  83. data/test/data/phyloxml/apaf.xml +0 -666
  84. data/test/data/phyloxml/bcl_2.xml +0 -2097
  85. data/test/data/phyloxml/made_up.xml +0 -144
  86. data/test/data/phyloxml/ncbi_taxonomy_mollusca_short.xml +0 -65
  87. data/test/data/phyloxml/phyloxml_examples.xml +0 -415
  88. data/test/unit/bio/db/biosql/tc_biosql.rb +0 -114
  89. data/test/unit/bio/db/biosql/ts_suite_biosql.rb +0 -8
  90. data/test/unit/bio/db/test_phyloxml.rb +0 -821
  91. data/test/unit/bio/db/test_phyloxml_writer.rb +0 -334
  92. data/test/unit/bio/shell/plugin/test_seq.rb +0 -187
  93. data/test/unit/bio/test_shell.rb +0 -20
@@ -1,1197 +0,0 @@
1
- #
2
- # = bio/db/phyloxml_elements.rb - PhyloXML Element classes
3
- #
4
- # Copyright:: Copyright (C) 2009
5
- # Diana Jaunzeikare <latvianlinuxgirl@gmail.com>
6
- # License:: The Ruby License
7
- #
8
- #
9
- # == Description
10
- #
11
- # This file containts the classes to represent PhyloXML elements.
12
- #
13
- # == References
14
- #
15
- # * http://www.phyloxml.org
16
- #
17
- # * https://www.nescent.org/wg_phyloinformatics/PhyloSoC:PhyloXML_support_in_BioRuby
18
-
19
- require 'bio/tree'
20
- require 'bio/sequence'
21
- require 'bio/reference'
22
-
23
- # Autoload definition
24
- module Bio
25
- module PhyloXML
26
- autoload :Parser, 'bio/db/phyloxml/phyloxml_parser'
27
- autoload :Writer, 'bio/db/phyloxml/phyloxml_writer'
28
- end
29
- end
30
-
31
- require 'libxml'
32
-
33
- module Bio
34
-
35
- # This is general Taxonomy class.
36
-
37
- class Taxonomy
38
- #pattern = [a-zA-Z0-9_]{2,10} Can refer to any code/abbreviation/mnemonic, such as Bsu for Bacillus subtilis.
39
- attr_accessor :code
40
-
41
- # String.
42
- attr_accessor :scientific_name
43
- # An array of strings
44
- attr_accessor :common_names
45
-
46
- # value comes from list: domain kingdom, subkingdom, branch, infrakingdom,
47
- # superphylum, phylum, subphylum, infraphylum, microphylum, superdivision,
48
- # division, subdivision, infradivision, superclass, class, subclass,
49
- # infraclass, superlegion, legion, sublegion, infralegion, supercohort,
50
- # cohort, subcohort, infracohort, superorder, order, suborder,
51
- # superfamily, family, subfamily, supertribe, tribe, subtribe, infratribe,
52
- # genus, subgenus, superspecies, species, subspecies, variety, subvariety,
53
- # form, subform, cultivar, unknown, other
54
- attr_accessor :rank
55
-
56
- # is used to keep the authority, such as 'J. G. Cooper, 1863', associated with the 'scientific_name'.
57
- attr_accessor :authority
58
-
59
- # An array of strings. Holds synonyms for scientific names or common names.
60
- attr_accessor :synonyms
61
-
62
-
63
- def initialize
64
- @common_names = []
65
- @synonyms = []
66
- end
67
- end
68
-
69
- module PhyloXML
70
-
71
-
72
- # Taxonomy class
73
- class Taxonomy < Bio::Taxonomy
74
- # String. Unique identifier of a taxon.
75
- attr_accessor :taxonomy_id
76
- #Used to link other elements to a taxonomy (on the xml-level)
77
- attr_accessor :id_source
78
- # Uri object
79
- attr_accessor :uri
80
-
81
- # Array of Other objects. Used to save additional information from other than
82
- # PhyloXML namspace.
83
- attr_accessor :other
84
-
85
- def initialize
86
- super
87
- @other = []
88
- end
89
-
90
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
91
- def to_xml
92
- taxonomy = LibXML::XML::Node.new('taxonomy')
93
- taxonomy["type"] = @type if (defined? @type) && @type
94
- taxonomy["id_source"] = @id_source if (defined? @id_source) && @id_source
95
-
96
- PhyloXML::Writer.generate_xml(taxonomy, self, [[:complex, 'id', (defined? @taxonomy_id) ? @taxonomy_id : nil],
97
- [:pattern, 'code', (defined? @code) ? @code : nil, Regexp.new("^[a-zA-Z0-9_]{2,10}$")],
98
- [:simple, 'scientific_name', (defined? @scientific_name) ? @scientific_name : nil],
99
- [:simple, 'authority', (defined? @authority) ? @authority : nil],
100
- [:simplearr, 'common_name', (defined? @common_names) ? @common_names : nil],
101
- [:simplearr, 'synonym', (defined? @synonyms) ? @synonyms : nil],
102
- [:simple, 'rank', (defined? @rank) ? @rank : nil],
103
- [:complex, 'uri',(defined? @uri) ? @uri : nil]])
104
- #@todo anything else
105
-
106
-
107
- return taxonomy
108
- end
109
-
110
- end
111
-
112
- # Object to hold one phylogeny element (and its subelements.) Extended version of Bio::Tree.
113
- class Tree < Bio::Tree
114
- # String. Name of tree (name subelement of phylogeny element).
115
- attr_accessor :name
116
-
117
- # Id object.
118
- attr_accessor :phylogeny_id
119
-
120
- # String. Description of tree.
121
- attr_accessor :description
122
-
123
- # Boolean. Can be used to indicate that the phylogeny is not allowed to be rooted differently (i.e. because it is associated with root dependent data, such as gene duplications).
124
- attr_accessor :rerootable
125
-
126
- # Boolean. Required element.
127
- attr_accessor :rooted
128
-
129
- # Array of Property object. Allows for typed and referenced properties from external resources to be attached.
130
- attr_accessor :properties
131
-
132
- # CladeRelation object. This is used to express a typed relationship between two clades. For example it could be used to describe multiple parents of a clade.
133
- attr_accessor :clade_relations
134
-
135
- # SequenceRelation object. This is used to express a typed relationship between two sequences. For example it could be used to describe an orthology.
136
- attr_accessor :sequence_relations
137
-
138
- # Array of confidence object
139
- attr_accessor :confidences
140
-
141
- # String.
142
- attr_accessor :branch_length_unit
143
-
144
- # String. Indicate the type of phylogeny (i.e. 'gene tree').
145
- attr_accessor :type
146
-
147
- # String. Date
148
- attr_accessor :date
149
-
150
- # Array of Other objects. Used to save additional information from other than
151
- # PhyloXML namspace.
152
- attr_accessor :other
153
-
154
- def initialize
155
- super
156
- @sequence_relations = []
157
- @clade_relations = []
158
- @confidences = []
159
- @properties = []
160
- @other = []
161
- end
162
-
163
- end
164
-
165
-
166
- # == Description
167
- # Class to hold clade element of phyloXML.
168
- class Node
169
-
170
- # Events at the root node of a clade (e.g. one gene duplication).
171
- attr_accessor :events
172
-
173
- # String. Used to link other elements to a clade (node) (on the xml-level).
174
- attr_accessor :id_source
175
-
176
- # String. Name of the node.
177
- attr_accessor :name
178
-
179
- # Float. Branch width for this node (including parent branch). Applies for the whole clade unless overwritten in sub-clades.
180
- attr_reader :width
181
-
182
- def width=(str)
183
- @width = str.to_f
184
- end
185
-
186
- # Array of Taxonomy objects. Describes taxonomic information for a clade.
187
- attr_accessor :taxonomies
188
-
189
- # Array of Confidence objects. Indicates the support for a clade/parent branch.
190
- attr_accessor :confidences
191
-
192
- # BranchColor object. Apply for the whole clade unless overwritten in sub-clade.
193
- attr_accessor :color
194
-
195
- # Id object
196
- attr_accessor :node_id
197
-
198
- # Array of Sequence objects. Represents a molecular sequence (Protein, DNA, RNA) associated with a node.
199
- attr_accessor :sequences
200
-
201
- # BinaryCharacters object. The names and/or counts of binary characters present, gained, and lost at the root of a clade.
202
- attr_accessor :binary_characters
203
-
204
- # Array of Distribution objects. The geographic distribution of the items of a clade (species, sequences), intended for phylogeographic applications.
205
- attr_accessor :distributions
206
-
207
- # Date object. A date associated with a clade/node.
208
- attr_accessor :date
209
-
210
- #Array of Reference objects. A literature reference for a clade.
211
- attr_accessor :references
212
-
213
- #An array of Property objects, for example depth for sea animals.
214
- attr_accessor :properties
215
-
216
- # Array of Other objects. Used to save additional information from other than
217
- # PhyloXML namspace.
218
- attr_accessor :other
219
-
220
- def initialize
221
- @confidences = []
222
- @sequences = []
223
- @taxonomies = []
224
- @distributions = []
225
- @references = []
226
- @properties = []
227
- @other = []
228
- end
229
-
230
-
231
- # Converts to a Bio::Tree::Node object. If it contains several taxonomies
232
- # Bio::Tree::Node#scientific name will get the scientific name of the first
233
- # taxonomy.
234
- #
235
- # If there are several confidence values, the first with bootstrap type will
236
- # be returned as Bio::Tree::Node#bootstrap
237
- #
238
- # tree = phyloxmlparser.next_tree
239
- #
240
- # node = tree.get_node_by_name("A").to_biotreenode
241
- #
242
- # ---
243
- # *Returns*:: Bio::Tree::Node
244
- def to_biotreenode
245
- node = Bio::Tree::Node.new
246
- node.name = @name
247
- node.scientific_name = @taxonomies[0].scientific_name if not @taxonomies.empty?
248
- #@todo what if there are more?
249
- node.taxonomy_id = @taxonomies[0].taxononmy_id if @taxonomies[0] != nil
250
-
251
- if not @confidences.empty?
252
- @confidences.each do |confidence|
253
- if confidence.type == "bootstrap"
254
- node.bootstrap = confidence.value
255
- break
256
- end
257
- end
258
- end
259
- return node
260
- end
261
-
262
- # Extracts the relevant information from node (specifically taxonomy and
263
- # sequence) to create Bio::Sequence object. Node can have several sequences,
264
- # so parameter to this method is to specify which sequence to extract.
265
- #
266
- # ---
267
- # *Returns*:: Bio::Sequence
268
- def extract_biosequence(seq_i=0)
269
-
270
- seq = @sequences[seq_i].to_biosequence
271
- seq.classification = []
272
- @taxonomies.each do |t|
273
- seq.classification << t.scientific_name
274
- if t.rank == "species"
275
- seq.species = t.scientific_name
276
- end
277
- end
278
-
279
- #seq.division => .. http://www.ebi.ac.uk/embl/Documentation/User_manual/usrman.html#3_2
280
- # It doesn't seem there is anything in PhyloXML corresponding to this.
281
-
282
- return seq
283
- end
284
-
285
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
286
- def to_xml(branch_length, write_branch_length_as_subelement)
287
- clade = LibXML::XML::Node.new('clade')
288
-
289
- PhyloXML::Writer.generate_xml(clade, self, [[:simple, 'name', (defined? @name) ? @name : nil]])
290
-
291
- if branch_length != nil
292
- if write_branch_length_as_subelement
293
- clade << LibXML::XML::Node.new('branch_length', branch_length.to_s)
294
- else
295
- clade["branch_length"] = branch_length.to_s
296
- end
297
- end
298
-
299
- #generate all elements, except clade
300
- PhyloXML::Writer.generate_xml(clade, self, [
301
- [:attr, "id_source"],
302
- [:objarr, 'confidence', 'confidences'],
303
- [:simple, 'width', (defined? @width) ? @width : nil],
304
- [:complex, 'branch_color', (defined? @branch_color) ? @branch_color : nil],
305
- [:simple, 'node_id', (defined? @node_id) ? @node_id : nil],
306
- [:objarr, 'taxonomy', 'taxonomies'],
307
- [:objarr, 'sequence', 'sequences'],
308
- [:complex, 'events', (defined? @events) ? @events : nil],
309
- [:complex, 'binary_characters', (defined? @binary_characters) ? @binary_characters : nil],
310
- [:objarr, 'distribution', 'distributions'],
311
- [:complex, 'date', (defined? @date) ? @date : nil],
312
- [:objarr, 'reference', 'references'],
313
- [:objarr, 'propery', 'properties']])
314
-
315
- return clade
316
- end
317
-
318
- end #Node
319
-
320
- # == Description
321
- # Events at the root node of a clade (e.g. one gene duplication).
322
- class Events
323
- #value comes from list: transfer, fusion, speciation_or_duplication, other, mixed, unassigned
324
- attr_reader :type
325
-
326
- # Integer
327
- attr_reader :duplications, :speciations, :losses
328
-
329
- # Confidence object
330
- attr_reader :confidence
331
-
332
- #---
333
- #def confidence=(type, value)
334
- # @confidence = Confidence.new(type, value)
335
- #end
336
- #+++
337
-
338
- # Confidence object
339
- def confidence=(conf)
340
- @confidence = conf
341
- end
342
-
343
- # Integer
344
- def duplications=(str)
345
- @duplications = str.to_i
346
- end
347
-
348
- # Integer
349
- def losses=(str)
350
- @losses = str.to_i
351
- end
352
-
353
- # Integer
354
- def speciations=(str)
355
- @speciations=str.to_i
356
- end
357
-
358
- #value comes from list: transfer, fusion, speciation_or_duplication, other, mixed, unassigned
359
- def type=(str)
360
- @type = str
361
- #@todo add unit test for this
362
- if not ['transfer','fusion','speciation_or_duplication','other','mixed', 'unassigned'].include?(str)
363
- raise "Warning #{str} is not one of the allowed values"
364
- end
365
- end
366
-
367
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
368
- def to_xml
369
- #@todo add unit test
370
- events = LibXML::XML::Node.new('events')
371
- PhyloXML::Writer.generate_xml(events, self, [
372
- [:simple, 'type', (defined? @type) ? @type : nil],
373
- [:simple, 'duplications', (defined? @duplications) ? @duplications : nil],
374
- [:simple, 'speciations', (defined? @speciations) ? @speciations : nil],
375
- [:simple, 'losses', (defined? @losses) ? @losses : nil],
376
- [:complex, 'confidence', (defined? @confidence) ? @confidence : nil]])
377
- return events
378
- end
379
-
380
- end
381
-
382
- # A general purpose confidence element. For example this can be used to express
383
- # the bootstrap support value of a clade (in which case the 'type' attribute
384
- # is 'bootstrap').
385
- class Confidence
386
- # String. The type of confidence measure, for example, bootstrap.
387
- attr_accessor :type
388
- # Float. The value of confidence measure.
389
- attr_accessor :value
390
-
391
- def initialize(type, value)
392
- @type = type
393
- @value = value.to_f
394
- end
395
-
396
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
397
- def to_xml
398
- if @type == nil
399
- raise "Type is a required attribute for confidence."
400
- else
401
- confidence = LibXML::XML::Node.new('confidence', @value.to_s)
402
- confidence["type"] = @type
403
- return confidence
404
- end
405
- end
406
- end
407
-
408
- # == Description
409
- #
410
- # The geographic distribution of the items of a clade (species, sequences),
411
- # intended for phylogeographic applications.
412
- class Distribution
413
- # String. Free text description of location.
414
- attr_accessor :desc
415
- # Array of Point objects. Holds coordinates of the location.
416
- attr_accessor :points
417
- # Array of Polygon objects.
418
- attr_accessor :polygons
419
-
420
- def initialize
421
- @points = []
422
- @polygons = []
423
- end
424
-
425
-
426
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
427
- def to_xml
428
- distr = LibXML::XML::Node.new('distribution')
429
- PhyloXML::Writer.generate_xml(distr, self, [
430
- [:simple, 'desc', @desc],
431
- [:objarr, 'point', 'points'],
432
- [:objarr, 'polygon', 'polygons']])
433
- return distr
434
- end
435
-
436
- end #Distribution class
437
-
438
-
439
- # == Description
440
- #
441
- # The coordinates of a point with an optional altitude. Required attribute
442
- # 'geodetic_datum' is used to indicate the geodetic datum (also called
443
- # 'map datum'), for example Google's KML uses 'WGS84'.
444
- class Point
445
- # Float. Latitude
446
- attr_reader :lat
447
-
448
- # Float. Longitute
449
- attr_reader :long
450
-
451
- # Float. Altitude
452
- attr_reader :alt
453
-
454
- # String. Altitude unit.
455
- attr_accessor :alt_unit
456
-
457
- # Geodedic datum / map datum
458
- attr_accessor :geodetic_datum
459
-
460
- # Float. Latitude
461
- def lat=(str)
462
- @lat = str.to_f unless str.nil?
463
- end
464
-
465
- # Float. Longitute
466
- def long=(str)
467
- @long = str.to_f unless str.nil?
468
- end
469
-
470
- # Float. Altitude
471
- def alt=(str)
472
- @alt = str.to_f unless str.nil?
473
- end
474
-
475
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
476
- def to_xml
477
- raise "Geodedic datum is a required attribute of Point element." if @geodetic_datum.nil?
478
-
479
- p = LibXML::XML::Node.new('point')
480
- p["geodetic_datum"] = @geodetic_datum
481
- p["alt_unit"] = @alt_unit if @alt_unit != nil
482
- PhyloXML::Writer.generate_xml(p, self, [
483
- [:simple, 'lat', @lat],
484
- [:simple, 'long', @long],
485
- [:simple, 'alt', @alt]])
486
- return p
487
- #@todo check if characters are correctly generated, like Zuric
488
- end
489
-
490
- end
491
-
492
-
493
- # == Description
494
- #
495
- # A polygon defined by a list of Points objects.
496
- class Polygon
497
- # Array of Point objects.
498
- attr_accessor :points
499
-
500
- def initialize
501
- @points = []
502
- end
503
-
504
-
505
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
506
- def to_xml
507
- if @points.length > 2
508
- pol = LibXML::XML::Node.new('polygon')
509
- @points.each do |p|
510
- pol << p.to_xml
511
- end
512
- return pol
513
- end
514
- end
515
-
516
-
517
- end
518
-
519
- # == Description
520
- # Element Sequence is used to represent a molecular sequence (Protein, DNA,
521
- # RNA) associated with a node.
522
- class Sequence
523
- # Type of sequence (rna, dna, protein)
524
- attr_accessor :type
525
-
526
- # Full name (e.g. muscle Actin )
527
- attr_accessor :name
528
-
529
- # String. Used to link with other elements.
530
- attr_accessor :id_source
531
-
532
- # String. One intended use for 'id_ref' is to link a sequence to a taxonomy
533
- # (via the taxonomy's 'id_source') in the case of multiple sequences and taxonomies per node.
534
- attr_accessor :id_ref
535
-
536
- # short (maximal ten characters) symbol of the sequence (e.g. 'ACTM')
537
- attr_accessor :symbol
538
- # Accession object. Holds source and identifier for the sequence.
539
- attr_accessor :accession
540
- # String. Location of a sequence on a genome/chromosome
541
- attr_accessor :location
542
- # String. The actual sequence is stored here.
543
- attr_reader :mol_seq
544
-
545
- # Boolean. used to indicated that this molecular sequence is aligned with
546
- # all other sequences in the same phylogeny for which 'is aligned' is true
547
- # as well (which, in most cases, means that gaps were introduced, and that
548
- # all sequences for which 'is aligned' is true must have the same length)
549
- attr_reader :is_aligned
550
-
551
- # Uri object
552
- attr_accessor :uri
553
- # Array of Annotation objects. Annotations of molecular sequence.
554
- attr_accessor :annotations
555
- # DomainArchitecture object. Describes domain architecture of a protein.
556
- attr_accessor :domain_architecture
557
-
558
- # Array of Other objects. Used to save additional information from other than
559
- # PhyloXML namspace.
560
- attr_accessor :other
561
-
562
- def initialize
563
- @annotations = []
564
- @other = []
565
- end
566
-
567
- def is_aligned=(str)
568
- if str=='true'
569
- @is_aligned=true
570
- elsif str=='false'
571
- @is_aligned = false
572
- else
573
- @is_aligned = nil
574
- end
575
- end
576
-
577
- def is_aligned?
578
- @is_aligned
579
- end
580
-
581
- def mol_seq=(str)
582
- if str =~ /^[a-zA-Z\.\-\?\*_]+$/
583
- @mol_seq = str
584
- else
585
- raise "mol_seq element of Sequence does not follow the pattern."
586
- end
587
- end
588
-
589
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
590
- def to_xml
591
-
592
- seq = LibXML::XML::Node.new('sequence')
593
- if (defined? @type) && @type
594
- if ["dna", "rna", "protein"].include?(@type)
595
- seq["type"] = @type
596
- else
597
- raise "Type attribute of Sequence has to be one of dna, rna or a."
598
- end
599
- end
600
-
601
- PhyloXML::Writer.generate_xml(seq, self, [
602
- [:attr, 'id_source'],
603
- [:attr, 'id_ref'],
604
- [:pattern, 'symbol', (defined? @symbol) ? @symbol : nil, Regexp.new("^\\S{1,10}$")],
605
- [:complex, 'accession', (defined? @accession) ? @accession : nil],
606
- [:simple, 'name', (defined? @name) ? @name : nil],
607
- [:simple, 'location', (defined? @location) ? @location : nil]])
608
-
609
- if (defined? @mol_seq) && @mol_seq
610
- molseq = LibXML::XML::Node.new('mol_seq', @mol_seq)
611
- molseq["is_aligned"] = @is_aligned.to_s if (defined? @is_aligned) && @is_aligned != nil
612
- seq << molseq
613
- end
614
-
615
- PhyloXML::Writer.generate_xml(seq, self, [
616
- #[:pattern, 'mol_seq', @mol_seq, Regexp.new("^[a-zA-Z\.\-\?\*_]+$")],
617
- [:complex, 'uri', (defined? @uri) ? @uri : nil],
618
- [:objarr, 'annotation', 'annotations'],
619
- [:complex, 'domain_architecture', (defined? @domain_architecture) ? @domain_architecture : nil]])
620
- #@todo test domain_architecture
621
- #any
622
- return seq
623
- end
624
-
625
- # converts Bio::PhyloXML:Sequence to Bio::Sequence object.
626
- # ---
627
- # *Returns*:: Bio::Sequence
628
- def to_biosequence
629
- #type is not a required attribute in phyloxml (nor any other Sequence
630
- #element) it might not hold any value, so we will not check what type it is.
631
- seq = Bio::Sequence.auto(@mol_seq)
632
-
633
- seq.id_namespace = @accession.source
634
- seq.entry_id = @accession.value
635
- # seq.primary_accession = @accession.value could be this
636
- seq.definition = @name
637
- #seq.comments = @name //this one?
638
- if (defined? @uri) && @uri
639
- h = {'url' => @uri.uri,
640
- 'title' => @uri.desc }
641
- ref = Bio::Reference.new(h)
642
- seq.references << ref
643
- end
644
- seq.molecule_type = 'RNA' if @type == 'rna'
645
- seq.molecule_type = 'DNA' if @type == 'dna'
646
-
647
- #@todo deal with the properties. There might be properties which look
648
- #like bio sequence attributes or features
649
- return seq
650
- end
651
-
652
- end
653
-
654
- # == Description
655
- # Element Accession is used to capture the local part in a sequence
656
- # identifier.
657
- class Accession
658
- #String. Source of the accession id. Example: "UniProtKB"
659
- attr_accessor :source
660
-
661
- #String. Value of the accession id. Example: "P17304"
662
- attr_accessor :value
663
-
664
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
665
- def to_xml
666
- raise "Source attribute is required for Accession object." if @source == nil
667
- accession = LibXML::XML::Node.new('accession', @value)
668
- accession['source'] = @source
669
- return accession
670
- end
671
-
672
- end
673
-
674
- # A uniform resource identifier. In general, this is expected to be an URL
675
- # (for example, to link to an image on a website, in which case the 'type'
676
- # attribute might be 'image' and 'desc' might be 'image of a California
677
- # sea hare')
678
- class Uri
679
- # String. Description of the uri. For example, image of a California sea hare'
680
- attr_accessor :desc
681
- # String. For example, image.
682
- attr_accessor :type
683
- # String. URL of the resource.
684
- attr_accessor :uri
685
-
686
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
687
- def to_xml
688
- if @uri != nil
689
- xml_node = LibXML::XML::Node.new('uri', @uri)
690
- Writer.generate_xml(xml_node, self, [
691
- [:attr, 'desc'],
692
- [:attr, 'type']])
693
- return xml_node
694
- end
695
- end
696
- end
697
-
698
- # == Description
699
- #
700
- # The annotation of a molecular sequence. It is recommended to annotate by
701
- # using the optional 'ref' attribute (some examples of acceptable values
702
- # for the ref attribute: 'GO:0008270', 'KEGG:Tetrachloroethene degradation',
703
- # 'EC:1.1.1.1').
704
- class Annotation
705
- # String. For example, 'GO:0008270', 'KEGG:Tetrachloroethene degradation',
706
- # 'EC:1.1.1.1'
707
- attr_accessor :ref
708
- # String
709
- attr_accessor :source
710
- # String. evidence for a annotation as free text (e.g. 'experimental')
711
- attr_accessor :evidence
712
- # String. Type of the annotation.
713
- attr_accessor :type
714
- # String. Free text description.
715
- attr_accessor :desc
716
- # Confidence object. Type and value of support for a annotation.
717
- attr_accessor :confidence
718
- # Array of Property objects. Allows for further, typed and referenced
719
- # annotations from external resources
720
- attr_accessor :properties
721
- # Uri object.
722
- attr_accessor :uri
723
-
724
- def initialize
725
- #@todo add unit test for this, since didn't break anything when changed from property to properties
726
- @properties = []
727
- end
728
-
729
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
730
- def to_xml
731
- annot = LibXML::XML::Node.new('annotation')
732
- annot["ref"] = @ref if (defined? @ref) && @ref
733
- PhyloXML::Writer.generate_xml(annot, self, [[:simple, 'desc', (defined? @desc) ? @desc : nil],
734
- [:complex, 'confidence', (defined? @confidence) ? @confidence : nil],
735
- [:objarr, 'property', 'properties'],
736
- [:complex, 'uri', (defined? @uri) ? @uri : nil]])
737
- return annot
738
- end
739
- end
740
-
741
- class Id
742
- # The provider of Id, for example, NCBI.
743
- attr_accessor :provider
744
- # The value of Id.
745
- attr_accessor :value
746
-
747
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
748
- def to_xml
749
- xml_node = LibXML::XML::Node.new('id', @value)
750
- xml_node["provider"] = @provider if @provider != nil
751
- return xml_node
752
- end
753
- end
754
-
755
- # == Description
756
- # This indicates the color of a node when rendered (the color applies
757
- # to the whole node and its children unless overwritten by the
758
- # color(s) of sub clades).
759
- class BranchColor
760
- #Integer
761
- attr_reader :red, :green, :blue
762
-
763
- def red=(str)
764
- @red = str.to_i
765
- end
766
-
767
- def green=(str)
768
- @green = str.to_i
769
- end
770
-
771
- def blue=(str)
772
- @blue = str.to_i
773
- end
774
-
775
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
776
- def to_xml
777
- #@todo add unit test
778
- if @red == nil
779
- raise "Subelement red of BranchColor element should not be nil"
780
- elsif @green == nil
781
- raise "Subelement green of BranchColor element should not be nil"
782
- elsif @blue == nil
783
- raise "Subelement blue of BranchColor element should not be nil"
784
- end
785
-
786
- c = LibXML::XML::Node.new('branch_color')
787
- PhyloXML::Writer.generate_xml(c, self, [
788
- [:simple, 'red', @red],
789
- [:simple, 'green', @green],
790
- [:simple, 'blue', @blue]])
791
- return c
792
- end
793
-
794
- end
795
-
796
- # == Description
797
- # A date associated with a clade/node. Its value can be numerical by
798
- # using the 'value' element and/or free text with the 'desc' element'
799
- # (e.g. 'Silurian'). If a numerical value is used, it is recommended to
800
- # employ the 'unit' attribute to indicate the type of the numerical
801
- # value (e.g. 'mya' for 'million years ago').
802
- class Date
803
- # String. Units in which value is stored.
804
- attr_accessor :unit
805
-
806
- # Free text description of the date.
807
- attr_accessor :desc
808
-
809
- # Integer. Minimum and maximum of the value.
810
- attr_reader :minimum, :maximum
811
-
812
- # Integer. Value of the date.
813
- attr_reader :value
814
-
815
- def minimum=(str)
816
- @minimum = str.to_i
817
- end
818
-
819
- def maximum=(str)
820
- @maximum = str.to_i
821
- end
822
-
823
- def value= (str)
824
- @value = str.to_i
825
- end
826
-
827
- # Returns value + unit, for exampe "7 mya"
828
- def to_s
829
- return "#{value} #{unit}"
830
- end
831
-
832
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
833
- def to_xml
834
- date = LibXML::XML::Node.new('date')
835
- PhyloXML::Writer.generate_xml(date, self, [
836
- [:attr, 'unit'],
837
- [:simple, 'desc', (defined? @desc) ? @desc : nil],
838
- [:simple, 'value', (defined? @value) ? @value : nil],
839
- [:simple, 'minimum', (defined? @minimum) ? @minimum : nil],
840
- [:simple, 'maximum', (defined? @maximum) ? @maximum : nil]])
841
- return date
842
- end
843
-
844
- end
845
-
846
- # == Description
847
- # This is used describe the domain architecture of a protein. Attribute
848
- # 'length' is the total length of the protein
849
- class DomainArchitecture
850
- # Integer. Total length of the protein
851
- attr_reader :length
852
-
853
- # Array of ProteinDomain objects.
854
- attr_reader :domains
855
-
856
- # Integer. Total length of the protein
857
- def length=(str)
858
- @length = str.to_i
859
- end
860
-
861
- def initialize
862
- @domains = []
863
- end
864
-
865
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
866
- def to_xml
867
- xml_node = LibXML::XML::Node.new('domain_architecture')
868
- PhyloXML::Writer.generate_xml(xml_node, self,[
869
- [:attr, 'length'],
870
- [:objarr, 'domain', 'domains']])
871
- return xml_node
872
- end
873
- end
874
-
875
-
876
- # == Description
877
- # To represent an individual domain in a domain architecture. The
878
- # name/unique identifier is described via the 'id' attribute.
879
- class ProteinDomain
880
- #Float, for example to store E-values 4.7E-14
881
- attr_reader :confidence
882
-
883
- # String
884
- attr_accessor :id, :value
885
-
886
- # Integer. Beginning of the domain.
887
- attr_reader :from
888
-
889
- # Integer. End of the domain.
890
- attr_reader :to
891
-
892
- # Integer. Beginning of the domain.
893
- def from=(str)
894
- @from = str.to_i
895
- end
896
-
897
- # Integer. End of the domain.
898
- def to=(str)
899
- @to = str.to_i
900
- end
901
-
902
- #Float, for example to store E-values 4.7E-14
903
- def confidence=(str)
904
- @confidence = str.to_f
905
- end
906
-
907
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
908
- def to_xml
909
- if @from == nil
910
- raise "from attribute of ProteinDomain class is required."
911
- elsif @to == nil
912
- raise "to attribute of ProteinDomain class is required."
913
- else
914
- xml_node = LibXML::XML::Node.new('domain', @value)
915
- xml_node["from"] = @from.to_s
916
- xml_node["to"] = @to.to_s
917
- xml_node["id"] = @id if (defined? @id) && @id
918
- xml_node["confidence"] = @confidence.to_s
919
-
920
- return xml_node
921
- end
922
-
923
- end
924
-
925
- end
926
-
927
-
928
- #Property allows for typed and referenced properties from external resources
929
- #to be attached to 'Phylogeny', 'Clade', and 'Annotation'. The value of a
930
- #property is its mixed (free text) content. Attribute 'datatype' indicates
931
- #the type of a property and is limited to xsd-datatypes (e.g. 'xsd:string',
932
- #'xsd:boolean', 'xsd:integer', 'xsd:decimal', 'xsd:float', 'xsd:double',
933
- #'xsd:date', 'xsd:anyURI'). Attribute 'applies_to' indicates the item to
934
- #which a property applies to (e.g. 'node' for the parent node of a clade,
935
- #'parent_branch' for the parent branch of a clade). Attribute 'id_ref' allows
936
- #to attached a property specifically to one element (on the xml-level).
937
- #Optional attribute 'unit' is used to indicate the unit of the property.
938
- #An example: <property datatype="xsd:integer" ref="NOAA:depth" applies_to="clade" unit="METRIC:m"> 200 </property>
939
- class Property
940
- # String
941
- attr_accessor :ref, :unit, :id_ref, :value
942
-
943
- # String
944
- attr_reader :datatype, :applies_to
945
-
946
- def datatype=(str)
947
- #@todo add unit test or maybe remove, if assume that xml is valid.
948
- unless ['xsd:string','xsd:boolean','xsd:decimal','xsd:float','xsd:double',
949
- 'xsd:duration','xsd:dateTime','xsd:time','xsd:date','xsd:gYearMonth',
950
- 'xsd:gYear','xsd:gMonthDay','xsd:gDay','xsd:gMonth','xsd:hexBinary',
951
- 'xsd:base64Binary','xsd:anyURI','xsd:normalizedString','xsd:token',
952
- 'xsd:integer','xsd:nonPositiveInteger','xsd:negativeInteger',
953
- 'xsd:long','xsd:int','xsd:short','xsd:byte','xsd:nonNegativeInteger',
954
- 'xsd:unsignedLong','xsd:unsignedInt','xsd:unsignedShort',
955
- 'xsd:unsignedByte','xsd:positiveInteger'].include?(str)
956
- raise "Warning: #{str} is not in the list of allowed values."
957
- end
958
- @datatype = str
959
- end
960
-
961
- def applies_to=(str)
962
- unless ['phylogeny','clade','node','annotation','parent_branch','other'].include?(str)
963
- puts "Warning: #{str} is not in the list of allowed values."
964
- end
965
- @applies_to = str
966
- end
967
-
968
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
969
- def to_xml
970
- #@todo write unit test for this
971
- raise "ref is an required element of property" if @ref.nil?
972
- raise "datatype is an required element of property" if @datatype.nil?
973
- raise "applies_to is an required element of property" if @applies_to.nil?
974
-
975
- property = LibXML::XML::Node.new('property')
976
- Writer.generate_xml(property, self, [
977
- [:attr, 'ref'],
978
- [:attr, 'unit'],
979
- [:attr, 'datatype'],
980
- [:attr, 'applies_to'],
981
- [:attr, 'id_ref']])
982
-
983
- property << @value if @value != nil
984
- return property
985
- end
986
- end
987
-
988
- # == Description
989
- # A literature reference for a clade. It is recommended to use the 'doi'
990
- # attribute instead of the free text 'desc' element whenever possible.
991
- class Reference
992
- # String. Digital Object Identifier.
993
- attr_accessor :doi
994
-
995
- # String. Free text description.
996
- attr_accessor :desc
997
-
998
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
999
- def to_xml
1000
- ref = LibXML::XML::Node.new('reference')
1001
- Writer.generate_xml(ref, self, [
1002
- [:attr, 'doi'],
1003
- [:simple, 'desc', (defined? @desc) ? @desc : nil]])
1004
- return ref
1005
- end
1006
-
1007
- end
1008
-
1009
- # == Description
1010
- #
1011
- # This is used to express a typed relationship between two clades.
1012
- # For example it could be used to describe multiple parents of a clade.
1013
- class CladeRelation
1014
- # Float
1015
- attr_reader :distance
1016
- # String. Id of the referenced parents of a clade.
1017
- attr_accessor :id_ref_0, :id_ref_1
1018
- # String
1019
- attr_accessor :type
1020
- # Confidence object
1021
- attr_accessor :confidence
1022
-
1023
- # Float
1024
- def distance=(str)
1025
- @distance = str.to_f
1026
- end
1027
-
1028
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
1029
- def to_xml
1030
- if @id_ref_0 == nil or @id_ref_1 == nil or @type == nil
1031
- raise "Attributes id_ref_0, id_ref_1, type are required elements by SequenceRelation element."
1032
- else
1033
- cr = LibXML::XML::Node.new('clade_relation')
1034
- Writer.generate_xml(cr, self, [
1035
- [:attr, 'id_ref_0'],
1036
- [:attr, 'id_ref_1'],
1037
- [:attr, 'distance'],
1038
- [:attr, 'type'],
1039
- [:complex, 'confidence', (defined? @confidnece) ? @confidnece : nil]])
1040
-
1041
- return cr
1042
- end
1043
- end
1044
-
1045
- end
1046
-
1047
-
1048
- # == Description
1049
- # The names and/or counts of binary characters present, gained, and
1050
- # lost at the root of a clade.
1051
- class BinaryCharacters
1052
- attr_accessor :bc_type, :gained, :lost, :present, :absent
1053
- attr_reader :gained_count, :lost_count, :present_count, :absent_count
1054
-
1055
- def gained_count=(str)
1056
- @gained_count = str.to_i
1057
- end
1058
-
1059
- def lost_count=(str)
1060
- @lost_count = str.to_i
1061
- end
1062
-
1063
- def present_count=(str)
1064
- @present_count = str.to_i
1065
- end
1066
-
1067
- def absent_count=(str)
1068
- @absent_count = str.to_i
1069
- end
1070
-
1071
- def initialize
1072
- @gained = []
1073
- @lost = []
1074
- @present = []
1075
- @absent = []
1076
- end
1077
-
1078
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
1079
- def to_xml
1080
- bc = LibXML::XML::Node.new('binary_characters')
1081
- bc['type'] = @bc_type
1082
- PhyloXML::Writer.generate_xml(bc, self, [
1083
- [:attr, 'gained_count'],
1084
- [:attr, 'lost_count'],
1085
- [:attr, 'present_count'],
1086
- [:attr, 'absent_count']])
1087
-
1088
- if not @gained.empty?
1089
- gained_xml = LibXML::XML::Node.new('gained')
1090
- PhyloXML::Writer.generate_xml(gained_xml, self, [[:simplearr, 'bc', @gained]])
1091
- bc << gained_xml
1092
- end
1093
-
1094
- if not @lost.empty?
1095
- lost_xml = LibXML::XML::Node.new('lost')
1096
- PhyloXML::Writer.generate_xml(lost_xml, self, [[:simplearr, 'bc', @lost]])
1097
- bc << lost_xml
1098
- end
1099
-
1100
- if not @present.empty?
1101
- present_xml = LibXML::XML::Node.new('present')
1102
- PhyloXML::Writer.generate_xml(present_xml, self, [[:simplearr, 'bc', @present]])
1103
- bc << present_xml
1104
- end
1105
-
1106
- if not @absent.empty?
1107
- absent_xml = LibXML::XML::Node.new('absent')
1108
- PhyloXML::Writer.generate_xml(absent_xml, self, [[:simplearr, 'bc', @absent]])
1109
- bc << absent_xml
1110
- end
1111
-
1112
- return bc
1113
- end
1114
-
1115
-
1116
- end
1117
-
1118
- # == Description
1119
- # This is used to express a typed relationship between two sequences.
1120
- # For example it could be used to describe an orthology (in which case
1121
- # attribute 'type' is 'orthology').
1122
- class SequenceRelation
1123
- # String
1124
- attr_accessor :id_ref_0, :id_ref_1
1125
-
1126
- # String. Allowed values: "orthology", "one_to_one_orthology",
1127
- # "super_orthology", "paralogy", "ultra_paralogy", "xenology",
1128
- # "unknown", "other"
1129
- attr_reader :type
1130
-
1131
- # Float
1132
- attr_reader :distance
1133
-
1134
- #@todo it has Confidences objects.
1135
-
1136
- def distance=(str)
1137
- @distance = str.to_f if str != nil
1138
- end
1139
-
1140
- # String. Allowed values: "orthology", "one_to_one_orthology",
1141
- # "super_orthology", "paralogy", "ultra_paralogy", "xenology",
1142
- # "unknown", "other"
1143
- def type=(str)
1144
- #@todo do warning instead?
1145
- #@todo do validation at actually writing xml
1146
- allowed_values = ["orthology", "one_to_one_orthology", "super_orthology", "paralogy",
1147
- "ultra_paralogy", "xenology", "unknown", "other"]
1148
- if not allowed_values.include? str
1149
- raise "SequenceRelation#type has to be one one of #{allowed_values.join("; ")}"
1150
- else
1151
- @type = str
1152
- end
1153
- end
1154
-
1155
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
1156
- def to_xml
1157
- if @id_ref_0 == nil or @id_ref_1 == nil or @type == nil
1158
- raise "Attributes id_ref_0, id_ref_1, type are required elements by SequenceRelation element."
1159
- else
1160
- sr = LibXML::XML::Node.new('sequence_relation')
1161
- sr['id_ref_0'] = @id_ref_0
1162
- sr['id_ref_1'] = @id_ref_1
1163
- sr['distance'] = @distance.to_s if (defined? @distance) && @distance
1164
- sr['type'] = @type
1165
- return sr
1166
- end
1167
- end
1168
-
1169
- end
1170
-
1171
- class Other
1172
- attr_accessor :element_name, :attributes, :children, :value
1173
-
1174
- def initialize
1175
- @children = []
1176
- @attributes = Hash.new
1177
- end
1178
-
1179
- # Converts elements to xml representation. Called by PhyloXML::Writer class.
1180
- def to_xml
1181
- o = LibXML::XML::Node.new(@element_name)
1182
- @attributes.each do |key, value|
1183
- o[key] = value
1184
- end
1185
- o << value if value != nil
1186
- children.each do |child_node|
1187
- o << child_node.to_xml
1188
- end
1189
- return o
1190
- end
1191
-
1192
- end
1193
-
1194
-
1195
- end #module PhyloXML
1196
-
1197
- end #end module Bio