bio 1.2.1 → 1.3.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 (259) hide show
  1. data/ChangeLog +3421 -0
  2. data/KNOWN_ISSUES.rdoc +88 -0
  3. data/README.rdoc +252 -0
  4. data/README_DEV.rdoc +285 -0
  5. data/Rakefile +143 -0
  6. data/bin/bioruby +0 -0
  7. data/bin/br_biofetch.rb +0 -0
  8. data/bin/br_bioflat.rb +12 -1
  9. data/bin/br_biogetseq.rb +0 -0
  10. data/bin/br_pmfetch.rb +4 -3
  11. data/bioruby.gemspec +477 -0
  12. data/bioruby.gemspec.erb +117 -0
  13. data/doc/Changes-0.7.rd +7 -0
  14. data/doc/Changes-1.3.rdoc +239 -0
  15. data/doc/Tutorial.rd +296 -184
  16. data/doc/Tutorial.rd.html +1031 -0
  17. data/doc/Tutorial.rd.ja +111 -45
  18. data/doc/Tutorial.rd.ja.html +2225 -0
  19. data/doc/bioruby.css +281 -0
  20. data/extconf.rb +2 -0
  21. data/lib/bio.rb +29 -4
  22. data/lib/bio/appl/blast.rb +306 -121
  23. data/lib/bio/appl/blast/ddbj.rb +142 -0
  24. data/lib/bio/appl/blast/format0.rb +35 -25
  25. data/lib/bio/appl/blast/format8.rb +2 -2
  26. data/lib/bio/appl/blast/genomenet.rb +263 -0
  27. data/lib/bio/appl/blast/ncbioptions.rb +220 -0
  28. data/lib/bio/appl/blast/remote.rb +106 -0
  29. data/lib/bio/appl/blast/report.rb +260 -9
  30. data/lib/bio/appl/blast/rexml.rb +12 -5
  31. data/lib/bio/appl/blast/rpsblast.rb +277 -0
  32. data/lib/bio/appl/blast/wublast.rb +133 -12
  33. data/lib/bio/appl/blast/xmlparser.rb +35 -18
  34. data/lib/bio/appl/blat/report.rb +46 -5
  35. data/lib/bio/appl/emboss.rb +62 -13
  36. data/lib/bio/appl/fasta.rb +9 -11
  37. data/lib/bio/appl/genscan/report.rb +3 -3
  38. data/lib/bio/appl/hmmer.rb +1 -1
  39. data/lib/bio/appl/hmmer/report.rb +10 -10
  40. data/lib/bio/appl/paml/baseml.rb +95 -0
  41. data/lib/bio/appl/paml/baseml/report.rb +32 -0
  42. data/lib/bio/appl/paml/codeml.rb +242 -0
  43. data/lib/bio/appl/paml/codeml/rates.rb +67 -0
  44. data/lib/bio/appl/paml/codeml/report.rb +67 -0
  45. data/lib/bio/appl/paml/common.rb +348 -0
  46. data/lib/bio/appl/paml/common_report.rb +38 -0
  47. data/lib/bio/appl/paml/yn00.rb +103 -0
  48. data/lib/bio/appl/paml/yn00/report.rb +32 -0
  49. data/lib/bio/appl/psort.rb +2 -2
  50. data/lib/bio/appl/pts1.rb +5 -5
  51. data/lib/bio/appl/tmhmm/report.rb +10 -1
  52. data/lib/bio/command.rb +297 -41
  53. data/lib/bio/compat/features.rb +157 -0
  54. data/lib/bio/compat/references.rb +128 -0
  55. data/lib/bio/db/biosql/biosql_to_biosequence.rb +67 -0
  56. data/lib/bio/db/biosql/sequence.rb +508 -0
  57. data/lib/bio/db/embl/common.rb +28 -12
  58. data/lib/bio/db/embl/embl.rb +107 -9
  59. data/lib/bio/db/embl/embl_to_biosequence.rb +85 -0
  60. data/lib/bio/db/embl/format_embl.rb +190 -0
  61. data/lib/bio/db/embl/sptr.rb +15 -16
  62. data/lib/bio/db/fantom.rb +6 -8
  63. data/lib/bio/db/fasta.rb +10 -507
  64. data/lib/bio/db/fasta/defline.rb +532 -0
  65. data/lib/bio/db/fasta/fasta_to_biosequence.rb +63 -0
  66. data/lib/bio/db/fasta/format_fasta.rb +97 -0
  67. data/lib/bio/db/genbank/common.rb +25 -8
  68. data/lib/bio/db/genbank/format_genbank.rb +187 -0
  69. data/lib/bio/db/genbank/genbank.rb +36 -1
  70. data/lib/bio/db/genbank/genbank_to_biosequence.rb +86 -0
  71. data/lib/bio/db/gff.rb +1791 -119
  72. data/lib/bio/db/kegg/glycan.rb +2 -6
  73. data/lib/bio/db/lasergene.rb +3 -3
  74. data/lib/bio/db/medline.rb +4 -1
  75. data/lib/bio/db/newick.rb +10 -10
  76. data/lib/bio/db/pdb/chain.rb +6 -2
  77. data/lib/bio/db/pdb/pdb.rb +12 -3
  78. data/lib/bio/db/rebase.rb +7 -8
  79. data/lib/bio/db/soft.rb +3 -3
  80. data/lib/bio/feature.rb +1 -88
  81. data/lib/bio/io/biosql/biodatabase.rb +64 -0
  82. data/lib/bio/io/biosql/bioentry.rb +29 -0
  83. data/lib/bio/io/biosql/bioentry_dbxref.rb +11 -0
  84. data/lib/bio/io/biosql/bioentry_path.rb +12 -0
  85. data/lib/bio/io/biosql/bioentry_qualifier_value.rb +10 -0
  86. data/lib/bio/io/biosql/bioentry_reference.rb +10 -0
  87. data/lib/bio/io/biosql/bioentry_relationship.rb +10 -0
  88. data/lib/bio/io/biosql/biosequence.rb +11 -0
  89. data/lib/bio/io/biosql/comment.rb +7 -0
  90. data/lib/bio/io/biosql/config/database.yml +20 -0
  91. data/lib/bio/io/biosql/dbxref.rb +13 -0
  92. data/lib/bio/io/biosql/dbxref_qualifier_value.rb +12 -0
  93. data/lib/bio/io/biosql/location.rb +32 -0
  94. data/lib/bio/io/biosql/location_qualifier_value.rb +11 -0
  95. data/lib/bio/io/biosql/ontology.rb +10 -0
  96. data/lib/bio/io/biosql/reference.rb +9 -0
  97. data/lib/bio/io/biosql/seqfeature.rb +32 -0
  98. data/lib/bio/io/biosql/seqfeature_dbxref.rb +11 -0
  99. data/lib/bio/io/biosql/seqfeature_path.rb +11 -0
  100. data/lib/bio/io/biosql/seqfeature_qualifier_value.rb +20 -0
  101. data/lib/bio/io/biosql/seqfeature_relationship.rb +11 -0
  102. data/lib/bio/io/biosql/taxon.rb +12 -0
  103. data/lib/bio/io/biosql/taxon_name.rb +9 -0
  104. data/lib/bio/io/biosql/term.rb +27 -0
  105. data/lib/bio/io/biosql/term_dbxref.rb +11 -0
  106. data/lib/bio/io/biosql/term_path.rb +12 -0
  107. data/lib/bio/io/biosql/term_relationship.rb +13 -0
  108. data/lib/bio/io/biosql/term_relationship_term.rb +11 -0
  109. data/lib/bio/io/biosql/term_synonym.rb +10 -0
  110. data/lib/bio/io/das.rb +7 -7
  111. data/lib/bio/io/ddbjxml.rb +57 -0
  112. data/lib/bio/io/ensembl.rb +2 -2
  113. data/lib/bio/io/fetch.rb +28 -14
  114. data/lib/bio/io/flatfile.rb +17 -853
  115. data/lib/bio/io/flatfile/autodetection.rb +545 -0
  116. data/lib/bio/io/flatfile/buffer.rb +237 -0
  117. data/lib/bio/io/flatfile/index.rb +17 -7
  118. data/lib/bio/io/flatfile/indexer.rb +30 -12
  119. data/lib/bio/io/flatfile/splitter.rb +297 -0
  120. data/lib/bio/io/hinv.rb +442 -0
  121. data/lib/bio/io/keggapi.rb +2 -2
  122. data/lib/bio/io/ncbirest.rb +733 -0
  123. data/lib/bio/io/pubmed.rb +34 -80
  124. data/lib/bio/io/registry.rb +2 -2
  125. data/lib/bio/io/sql.rb +178 -357
  126. data/lib/bio/io/togows.rb +458 -0
  127. data/lib/bio/location.rb +106 -11
  128. data/lib/bio/pathway.rb +120 -14
  129. data/lib/bio/reference.rb +115 -101
  130. data/lib/bio/sequence.rb +164 -183
  131. data/lib/bio/sequence/adapter.rb +108 -0
  132. data/lib/bio/sequence/common.rb +22 -45
  133. data/lib/bio/sequence/compat.rb +2 -2
  134. data/lib/bio/sequence/dblink.rb +54 -0
  135. data/lib/bio/sequence/format.rb +254 -77
  136. data/lib/bio/sequence/format_raw.rb +23 -0
  137. data/lib/bio/shell.rb +3 -1
  138. data/lib/bio/shell/core.rb +2 -2
  139. data/lib/bio/shell/plugin/entry.rb +33 -4
  140. data/lib/bio/shell/plugin/ncbirest.rb +64 -0
  141. data/lib/bio/shell/plugin/togows.rb +40 -0
  142. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/bioruby_generator.rb +0 -0
  143. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/_classes.rhtml +0 -0
  144. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/_log.rhtml +0 -0
  145. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/_methods.rhtml +0 -0
  146. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/_modules.rhtml +0 -0
  147. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/_variables.rhtml +0 -0
  148. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby-bg.gif +0 -0
  149. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby-gem.png +0 -0
  150. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby-link.gif +0 -0
  151. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby.css +0 -0
  152. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby.rhtml +0 -0
  153. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby_controller.rb +0 -0
  154. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby_helper.rb +0 -0
  155. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/commands.rhtml +0 -0
  156. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/history.rhtml +0 -0
  157. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/index.rhtml +0 -0
  158. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/spinner.gif +0 -0
  159. data/lib/bio/tree.rb +4 -2
  160. data/lib/bio/util/color_scheme.rb +2 -2
  161. data/lib/bio/util/contingency_table.rb +2 -2
  162. data/lib/bio/util/restriction_enzyme.rb +2 -2
  163. data/lib/bio/util/restriction_enzyme/single_strand.rb +6 -5
  164. data/lib/bio/version.rb +25 -0
  165. data/rdoc.zsh +8 -0
  166. data/sample/any2fasta.rb +0 -0
  167. data/sample/biofetch.rb +0 -0
  168. data/sample/dbget +0 -0
  169. data/sample/demo_sequence.rb +158 -0
  170. data/sample/enzymes.rb +0 -0
  171. data/sample/fasta2tab.rb +0 -0
  172. data/sample/fastagrep.rb +72 -0
  173. data/sample/fastasort.rb +54 -0
  174. data/sample/fsplit.rb +0 -0
  175. data/sample/gb2fasta.rb +2 -3
  176. data/sample/gb2tab.rb +0 -0
  177. data/sample/gbtab2mysql.rb +0 -0
  178. data/sample/genes2nuc.rb +0 -0
  179. data/sample/genes2pep.rb +0 -0
  180. data/sample/genes2tab.rb +0 -0
  181. data/sample/genome2rb.rb +0 -0
  182. data/sample/genome2tab.rb +0 -0
  183. data/sample/goslim.rb +0 -0
  184. data/sample/gt2fasta.rb +0 -0
  185. data/sample/na2aa.rb +34 -0
  186. data/sample/pmfetch.rb +0 -0
  187. data/sample/pmsearch.rb +0 -0
  188. data/sample/ssearch2tab.rb +0 -0
  189. data/sample/tfastx2tab.rb +0 -0
  190. data/sample/vs-genes.rb +0 -0
  191. data/setup.rb +1596 -0
  192. data/test/data/blast/blastp-multi.m7 +188 -0
  193. data/test/data/command/echoarg2.bat +1 -0
  194. data/test/data/paml/codeml/control_file.txt +30 -0
  195. data/test/data/paml/codeml/output.txt +78 -0
  196. data/test/data/paml/codeml/rates +217 -0
  197. data/test/data/rpsblast/misc.rpsblast +193 -0
  198. data/test/data/soft/GDS100_partial.soft +0 -0
  199. data/test/data/soft/GSE3457_family_partial.soft +0 -0
  200. data/test/functional/bio/appl/test_pts1.rb +115 -0
  201. data/test/functional/bio/io/test_ensembl.rb +123 -80
  202. data/test/functional/bio/io/test_togows.rb +267 -0
  203. data/test/functional/bio/sequence/test_output_embl.rb +51 -0
  204. data/test/functional/bio/test_command.rb +301 -0
  205. data/test/runner.rb +17 -1
  206. data/test/unit/bio/appl/blast/test_ncbioptions.rb +112 -0
  207. data/test/unit/bio/appl/blast/test_report.rb +753 -35
  208. data/test/unit/bio/appl/blast/test_rpsblast.rb +398 -0
  209. data/test/unit/bio/appl/paml/codeml/test_rates.rb +45 -0
  210. data/test/unit/bio/appl/paml/codeml/test_report.rb +45 -0
  211. data/test/unit/bio/appl/paml/test_codeml.rb +174 -0
  212. data/test/unit/bio/appl/test_blast.rb +135 -4
  213. data/test/unit/bio/appl/test_fasta.rb +2 -2
  214. data/test/unit/bio/appl/test_pts1.rb +1 -64
  215. data/test/unit/bio/db/embl/test_common.rb +15 -15
  216. data/test/unit/bio/db/embl/test_embl.rb +4 -4
  217. data/test/unit/bio/db/embl/test_embl_rel89.rb +5 -5
  218. data/test/unit/bio/db/embl/test_embl_to_bioseq.rb +203 -0
  219. data/test/unit/bio/db/embl/test_sptr.rb +38 -1
  220. data/test/unit/bio/db/pdb/test_pdb.rb +2 -2
  221. data/test/unit/bio/db/test_gff.rb +1151 -25
  222. data/test/unit/bio/db/test_medline.rb +127 -0
  223. data/test/unit/bio/db/test_nexus.rb +5 -1
  224. data/test/unit/bio/db/test_prosite.rb +4 -4
  225. data/test/unit/bio/io/flatfile/test_autodetection.rb +375 -0
  226. data/test/unit/bio/io/flatfile/test_buffer.rb +251 -0
  227. data/test/unit/bio/io/flatfile/test_splitter.rb +369 -0
  228. data/test/unit/bio/io/test_ddbjxml.rb +8 -3
  229. data/test/unit/bio/io/test_fastacmd.rb +5 -5
  230. data/test/unit/bio/io/test_flatfile.rb +357 -106
  231. data/test/unit/bio/io/test_soapwsdl.rb +2 -2
  232. data/test/unit/bio/io/test_togows.rb +161 -0
  233. data/test/unit/bio/sequence/test_common.rb +210 -11
  234. data/test/unit/bio/sequence/test_compat.rb +3 -3
  235. data/test/unit/bio/sequence/test_dblink.rb +58 -0
  236. data/test/unit/bio/sequence/test_na.rb +2 -2
  237. data/test/unit/bio/test_command.rb +111 -50
  238. data/test/unit/bio/test_feature.rb +29 -1
  239. data/test/unit/bio/test_location.rb +566 -6
  240. data/test/unit/bio/test_pathway.rb +91 -65
  241. data/test/unit/bio/test_reference.rb +67 -13
  242. data/test/unit/bio/util/restriction_enzyme/analysis/test_calculated_cuts.rb +3 -3
  243. data/test/unit/bio/util/restriction_enzyme/analysis/test_cut_ranges.rb +3 -3
  244. data/test/unit/bio/util/restriction_enzyme/analysis/test_sequence_range.rb +3 -3
  245. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_aligned_strands.rb +4 -3
  246. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_location_pair.rb +3 -3
  247. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_location_pair_in_enzyme_notation.rb +3 -3
  248. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_locations.rb +3 -3
  249. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_locations_in_enzyme_notation.rb +3 -3
  250. data/test/unit/bio/util/restriction_enzyme/single_strand/test_cut_locations_in_enzyme_notation.rb +3 -3
  251. data/test/unit/bio/util/restriction_enzyme/test_analysis.rb +3 -3
  252. data/test/unit/bio/util/restriction_enzyme/test_cut_symbol.rb +4 -4
  253. data/test/unit/bio/util/restriction_enzyme/test_double_stranded.rb +3 -3
  254. data/test/unit/bio/util/restriction_enzyme/test_single_strand.rb +3 -3
  255. data/test/unit/bio/util/restriction_enzyme/test_single_strand_complement.rb +3 -3
  256. data/test/unit/bio/util/restriction_enzyme/test_string_formatting.rb +3 -3
  257. data/test/unit/bio/util/test_restriction_enzyme.rb +3 -3
  258. metadata +202 -167
  259. data/test/unit/bio/appl/blast/test_xmlparser.rb +0 -388
@@ -0,0 +1,348 @@
1
+ #
2
+ # = bio/appl/paml/common.rb - Basic wrapper class common to PAML programs
3
+ #
4
+ # Copyright:: Copyright (C) 2008
5
+ # Michael D. Barton <mail@michaelbarton.me.uk>,
6
+ # Naohisa Goto <ng@bioruby.org>
7
+ #
8
+ # License:: The Ruby License
9
+ #
10
+ # == Description
11
+ #
12
+ # This file contains Bio::PAML::Common, a basic wrapper class for
13
+ # running PAML programs.
14
+ #
15
+ # == References
16
+ #
17
+ # * http://abacus.gene.ucl.ac.uk/software/paml.html
18
+ #
19
+
20
+ require 'tempfile'
21
+ require 'bio/command'
22
+ require 'bio/alignment'
23
+
24
+ module Bio
25
+ module PAML
26
+
27
+ autoload :Codeml, 'bio/appl/paml/codeml'
28
+ autoload :Baseml, 'bio/appl/paml/baseml'
29
+ autoload :Yn00, 'bio/appl/paml/yn00'
30
+ #--
31
+ # The autoload of Common::Report, Codeml::Report, Codeml::Rates,
32
+ # Baseml::Report, Yn00::Report are described inside the classes.
33
+ #++
34
+
35
+ # == Description
36
+ #
37
+ # Bio::PAML::Common is a basic wrapper class for PAML programs.
38
+ # The class provides methods for generating the necessary configuration
39
+ # file, and running a program.
40
+ #
41
+ class Common
42
+
43
+ autoload :Report, 'bio/appl/paml/common_report'
44
+
45
+ # Default parameters. Should be redefined in subclass.
46
+ DEFAULT_PARAMETERS = {}
47
+
48
+ # Default program. Should be redifined in subclass.
49
+ DEFAULT_PROGRAM = nil
50
+
51
+ # Parameters described in the control file. (Hash)
52
+ # Each key of the hash must be a Symbol object, and each value
53
+ # must be a String object or nil.
54
+ attr_accessor :parameters
55
+
56
+ # Preferred order of parameters.
57
+ DEFAULT_PARAMETERS_ORDER = %w( seqfile outfile treefile
58
+ noisy verbose runmode seqtype CodonFreq ndata clock
59
+ aaDist aaRatefile model NSsites icode Mgene
60
+ fix_kappa kappa fix_omega omega fix_alpha alpha Malpha ncatG
61
+ fix_rho rho nparK nhomo getSE RateAncestor
62
+ Small_Diff cleandata fix_blength method ).collect { |x| x.to_sym }
63
+
64
+ # Creates a wrapper instance, which will run using the specified
65
+ # binary location or the command in the PATH.
66
+ # If program is specified as nil, DEFAULT_PROGRAM is used.
67
+ # Default parameters are automatically loaded and merged with
68
+ # the specified parameters.
69
+ # ---
70
+ # *Arguments*:
71
+ # * (optional) _program_: path to the program, or command name (String)
72
+ # * (optional) _params_: parameters (Hash)
73
+ def initialize(program = nil, params = {})
74
+ @program = program || self.class::DEFAULT_PROGRAM
75
+ set_default_parameters
76
+ self.parameters.update(params)
77
+ end
78
+
79
+ # Runs the program on the parameters in the passed control file.
80
+ # No parameters checks are performed.
81
+ # All internal parameters are ignored and are kept untouched.
82
+ # The output and report attributes are cleared in this method.
83
+ #
84
+ # Warning about PAML's behavior:
85
+ # PAML writes supplemental output files in the current directory
86
+ # with fixed file names which can not be changed with parameters
87
+ # or command-line options, for example, rates, rst, and rub.
88
+ # This behavior may ovarwrite existing files, especially
89
+ # previous supplemental results.
90
+ #
91
+ # ---
92
+ # *Arguments*:
93
+ # * (optional) _control_file_: file name of control file (String)
94
+ # *Returns*:: messages printed to the standard output (String)
95
+ def run(control_file)
96
+ exec_local([ control_file ])
97
+ end
98
+
99
+
100
+ # Runs the program on the internal parameters with the specified
101
+ # sequence alignment and tree.
102
+ #
103
+ # Note that parameters[:seqfile] and parameters[:outfile]
104
+ # are always modified, and parameters[:treefile] is modified
105
+ # when tree is specified.
106
+ #
107
+ # To prevent overwrite of existing files by PAML, this method
108
+ # automatically creates a temporary directory and the program
109
+ # is run inside the directory. After the end of the program,
110
+ # the temporary directory is automatically removed.
111
+ #
112
+ # ---
113
+ # *Arguments*:
114
+ # * (required) _alignment_: Bio::Alignment object or similar object
115
+ # * (optional) _tree_: Bio::Tree object
116
+ # *Returns*:: Report object
117
+ def query(alignment, tree = nil)
118
+ astr = alignment.output(:phylipnon)
119
+ if tree then
120
+ tstr = [ sprintf("%3d %2d\n", tree.leaves.size, 1), "\n",
121
+ tree.output(:newick,
122
+ { :indent => false,
123
+ :bootstrap_style => :disabled,
124
+ :branch_length_style => :disabled })
125
+ ].join('')
126
+ else
127
+ tstr = nil
128
+ end
129
+ str = _query_by_string(astr, tstr)
130
+ @report = self.class::Report.new(str)
131
+ @report
132
+ end
133
+
134
+ # Runs the program on the internal parameters with the specified
135
+ # sequence alignment data string and tree data string.
136
+ #
137
+ # Note that parameters[:outfile] is always modified, and
138
+ # parameters[:seqfile] and parameters[:treefile] are modified when
139
+ # alignment and tree are specified respectively.
140
+ #
141
+ # It raises RuntimeError if seqfile is not specified in the argument
142
+ # or in the parameter.
143
+ #
144
+ # For other information, see the document of query method.
145
+ #
146
+ # ---
147
+ # *Arguments*:
148
+ # * (optional) _alignment_: String
149
+ # * (optional) _tree_: String or nil
150
+ # *Returns*:: contents of output file (String)
151
+ def query_by_string(alignment = nil, tree = nil)
152
+ _query_by_string(alignment, tree)
153
+ end
154
+
155
+ # (private) implementation of query_by_string().
156
+ def _query_by_string(alignment = nil, tree = nil)
157
+ @parameters ||= {}
158
+ Bio::Command.mktmpdir('paml') do |path|
159
+ #$stderr.puts path.inspect
160
+ filenames = []
161
+ begin
162
+ # preparing outfile
163
+ outfile = Tempfile.new('out', path)
164
+ outfile.close(false)
165
+ outfn = File.basename(outfile.path)
166
+ self.parameters[:outfile] = outfn
167
+ filenames.push outfn
168
+ # preparing seqfile
169
+ if alignment then
170
+ seqfile = Tempfile.new('seq', path)
171
+ seqfile.print alignment
172
+ seqfile.close(false)
173
+ seqfn = File.basename(seqfile.path)
174
+ self.parameters[:seqfile] = seqfn
175
+ filenames.push seqfn
176
+ end
177
+ # preparing treefile
178
+ if tree then
179
+ treefile = Tempfile.new('tree', path)
180
+ treefile.print tree
181
+ treefile.close(false)
182
+ treefn = File.basename(treefile.path)
183
+ self.parameters[:treefile] = treefn
184
+ filenames.push treefn
185
+ end
186
+ # preparing control file
187
+ ctlfile = Tempfile.new('control', path)
188
+ ctlfile.print self.dump_parameters
189
+ ctlfile.close(false)
190
+ ctlfn = File.basename(ctlfile.path)
191
+ filenames.push ctlfn
192
+ # check parameters
193
+ if errors = check_parameters then
194
+ msg = errors.collect { |e| "error in parameter #{e[0]}: #{e[1]}" }
195
+ raise RuntimeError, msg.join("; ")
196
+ end
197
+ # exec command
198
+ stdout = exec_local([ ctlfn ], { :chdir => path })
199
+ # get main output
200
+ outfile.open
201
+ @output = outfile.read
202
+ # get supplemental result files
203
+ @supplemental_outputs = {}
204
+ (Dir.entries(path) - filenames).each do |name|
205
+ next unless /\A\w/ =~ name
206
+ fn = File.join(path, name)
207
+ if File.file?(fn) then
208
+ @supplemental_outputs[name] = File.read(fn)
209
+ end
210
+ end
211
+ ensure
212
+ outfile.close(true) if outfile
213
+ seqfile.close(true) if seqfile
214
+ treefile.close(true) if treefile
215
+ ctlfile.close(true) if ctlfile
216
+ end
217
+ end
218
+ @output
219
+ end
220
+ private :_query_by_string
221
+
222
+ # the last result of the program (String)
223
+ attr_reader :output
224
+
225
+ # Report object created from the last result
226
+ attr_reader :report
227
+
228
+ # the last exit status of the program
229
+ attr_reader :exit_status
230
+
231
+ # the last output to the stdout (String)
232
+ attr_reader :data_stdout
233
+
234
+ # the last executed command (Array of String)
235
+ attr_reader :command
236
+
237
+ # contents of supplemental output files (Hash).
238
+ # Each key is a file name and value is content of the file.
239
+ attr_reader :supplemental_outputs
240
+
241
+ # Loads parameters from the specified string.
242
+ # Note that all previous parameters are erased.
243
+ # Returns the parameters as a hash.
244
+ # ---
245
+ # *Arguments*:
246
+ # * (required) _str_: contents of a PAML control file (String)
247
+ # *Returns*:: parameters (Hash)
248
+ def load_parameters(str)
249
+ hash = {}
250
+ str.each_line do |line|
251
+ param, value = parse_parameter(line)
252
+ hash[param] = value if param
253
+ end
254
+ self.parameters = hash
255
+ end
256
+
257
+ # Loads system-wide default parameters.
258
+ # Note that all previous parameters are erased.
259
+ # Returns the parameters as a hash.
260
+ # ---
261
+ # *Returns*:: parameters (Hash)
262
+ def set_default_parameters
263
+ self.parameters = self.class::DEFAULT_PARAMETERS.merge(Hash.new)
264
+ end
265
+
266
+ # Shows parameters (content of control file) as a string.
267
+ # The string can be used for control file.
268
+ # ---
269
+ # *Returns*:: string representation of the parameters (String)
270
+ def dump_parameters
271
+ keyorder = DEFAULT_PARAMETERS_ORDER
272
+ keys = parameters.keys
273
+ str = ''
274
+ keys.sort do |x, y|
275
+ (keyorder.index(x) || (keyorder.size + keys.index(x))) <=>
276
+ (keyorder.index(y) || (keyorder.size + keys.index(y)))
277
+ end.each do |key|
278
+ value = parameters[key]
279
+ # Note: spaces are required in both side of the "=".
280
+ str.concat "#{key.to_s} = #{value.to_s}\n" if value
281
+ end
282
+ str
283
+ end
284
+
285
+ private
286
+
287
+ # (private) clear attributes except program and parameters
288
+ def reset
289
+ @command = nil
290
+ @output = nil
291
+ @report = nil
292
+ @exit_status = nil
293
+ @data_stdout = nil
294
+ @supplemental_outputs = nil
295
+ end
296
+
297
+ # (private) parses a parameter in a line
298
+ # ---
299
+ # *Arguments*:
300
+ # * (required) _line_: single line string (String)
301
+ # *Returns*:: parameter name (Symbol or nil), value (String or nil)
302
+ def parse_parameter(line)
303
+ # remove comment
304
+ line = line.sub(/\*.*/, '')
305
+ # Note: spaces are required in both side of the "=".
306
+ param, value = line.strip.split(/\s+=\s+/, 2)
307
+ if !param or param.empty? then
308
+ param = nil
309
+ else
310
+ param = param.to_sym
311
+ end
312
+ return param, value
313
+ end
314
+
315
+ # (private) Runs the program on the parameters in the passed control file.
316
+ # No parameter check are executed.
317
+ # ---
318
+ # *Arguments*:
319
+ # * (optional) _control_file_: file name of control file (String)
320
+ # *Returns*:: messages printed to the standard output (String)
321
+ def exec_local(arguments, options = {})
322
+ reset
323
+ cmd = [ @program, *arguments ]
324
+ @command = cmd
325
+ stdout = Bio::Command.query_command(cmd, nil, options)
326
+ @exit_status = $?
327
+ @data_stdout = stdout
328
+ stdout
329
+ end
330
+
331
+ # (private) Checks parameters.
332
+ # Returns nil if no errors found. Otherwise, returns an Array
333
+ # containing [ parameter, message ] pairs.
334
+ # ---
335
+ # *Arguments*:
336
+ # *Returns*:: nil or Array
337
+ def check_parameters
338
+ errors = []
339
+ param = self.parameters
340
+ if !param[:seqfile] or param[:seqfile].empty? then
341
+ errors.push([ :seqfile, 'seqfile not specified' ])
342
+ end
343
+ errors.empty? ? nil : errors
344
+ end
345
+
346
+ end #class Common
347
+ end #module PAML
348
+ end #module Bio
@@ -0,0 +1,38 @@
1
+ #
2
+ # = bio/appl/paml/common_report.rb - basic report class for PAML results
3
+ #
4
+ # Copyright:: Copyright (C) 2008
5
+ # Naohisa Goto <ng@bioruby.org>
6
+ #
7
+ # License:: The Ruby License
8
+ #
9
+ # == Description
10
+ #
11
+ # This file contains Bio::PAML::Common::Report, a basic report class
12
+ # for PAML program's results.
13
+ #
14
+ # == References
15
+ #
16
+ # * http://abacus.gene.ucl.ac.uk/software/paml.html
17
+ #
18
+
19
+ require 'bio/appl/paml/common'
20
+
21
+ module Bio::PAML
22
+ class Common
23
+
24
+ # UNDER CONSTRUCTION.
25
+ #
26
+ # Bio::PAML::Common::Report is a basic report class for PAML program's
27
+ # results. It will have common function for baseml and codeml.
28
+ #
29
+ # Normally, users should not use this class directly.
30
+ class Report
31
+
32
+ # Creates a new Report object.
33
+ def initialize(str)
34
+ end
35
+ end #class Report
36
+
37
+ end #class Common
38
+ end #module Bio::PAML
@@ -0,0 +1,103 @@
1
+ #
2
+ # = bio/appl/paml/baseml.rb - Wrapper for running PAML program yn00
3
+ #
4
+ # Copyright:: Copyright (C) 2008
5
+ # Naohisa Goto <ng@bioruby.org>
6
+ #
7
+ # License:: The Ruby License
8
+ #
9
+ # == Description
10
+ #
11
+ # This file contains Bio::PAML::Yn00, a wrapper class running yn00.
12
+ #
13
+ # == References
14
+ #
15
+ # * http://abacus.gene.ucl.ac.uk/software/paml.html
16
+ #
17
+
18
+ require 'bio/appl/paml/common'
19
+
20
+ module Bio::PAML
21
+
22
+ # == Description
23
+ #
24
+ # Bio::PAML::Yn00 is a wrapper for running PAML yn00 program.
25
+ #
26
+ # Because most of the methods in this class are inherited from
27
+ # Bio::PAML::Common, see documents of Bio::PAML::Common for details.
28
+ #
29
+ # == Examples
30
+ #
31
+ # Example 1:
32
+ #
33
+ # require 'bio'
34
+ # # Reads multi-fasta formatted file and gets a Bio::Alignment object.
35
+ # alignment = Bio::FlatFile.open(Bio::Alignment::MultiFastaFormat,
36
+ # 'example.fst').alignment
37
+ # # Creates a Yn00 object
38
+ # baseml = Bio::PAML::Yn00.new
39
+ # # Sets parameters
40
+ # baseml.parameters[:verbose] = 1
41
+ # baseml.parameters[:icode] = 0
42
+ # # You can also set many parameters at a time.
43
+ # baseml.parameters.update({ :weighting => 0, :commonf3x4 => 0 })
44
+ # # Executes yn00 with the alignment
45
+ # report = yn00.query(alignment)
46
+ #
47
+ class Yn00 < Common
48
+
49
+ autoload :Report, 'bio/appl/paml/yn00/report'
50
+
51
+ # Default program name
52
+ DEFAULT_PROGRAM = 'yn00'.freeze
53
+
54
+ # Default parameters when running baseml.
55
+ #
56
+ # The parameters whose values are different from the baseml defalut
57
+ # value (described in pamlDOC.pdf) in PAML 4.1 are:
58
+ # seqfile, outfile, treefile, ndata, noisy, verbose
59
+ #
60
+ DEFAULT_PARAMETERS = {
61
+ # Essential argumemts
62
+ :seqfile => nil,
63
+ :outfile => nil,
64
+ # Optional arguments
65
+ :verbose => 1,
66
+ :icode => 0,
67
+ :weighting => 0,
68
+ :commonf3x4 => 0
69
+ }
70
+
71
+ # Runs the program on the internal parameters with the specified
72
+ # sequence alignment.
73
+ # Note that parameters[:seqfile] and parameters[:outfile]
74
+ # are always modified.
75
+ #
76
+ # For other important information, see the document of
77
+ # Bio::PAML::Common#query.
78
+ #
79
+ # ---
80
+ # *Arguments*:
81
+ # * (required) _alignment_: Bio::Alignment object or similar object
82
+ # *Returns*:: Report object
83
+ def query(alignment)
84
+ super(alignment)
85
+ end
86
+
87
+ # Runs the program on the internal parameters with the specified
88
+ # sequence alignment as a String object.
89
+ #
90
+ # For other important information, see the document of
91
+ # query and Bio::PAML::Common#query_by_string methods.
92
+ #
93
+ # ---
94
+ # *Arguments*:
95
+ # * (required) _alignment_: Bio::Alignment object or similar object
96
+ # *Returns*:: Report object
97
+ def query_by_string(alignment = nil)
98
+ super(alignment)
99
+ end
100
+
101
+ end #class Yn00
102
+ end #module Bio::PAML
103
+