bio 1.0.0 → 1.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 (340) hide show
  1. data/bin/bioruby +14 -122
  2. data/bin/br_biofetch.rb +2 -2
  3. data/bin/br_bioflat.rb +2 -2
  4. data/bin/br_biogetseq.rb +2 -2
  5. data/bin/br_pmfetch.rb +3 -3
  6. data/doc/Changes-0.7.rd +77 -0
  7. data/doc/KEGG_API.rd +523 -232
  8. data/doc/KEGG_API.rd.ja +529 -207
  9. data/doc/Tutorial.rd +48 -11
  10. data/lib/bio.rb +59 -6
  11. data/lib/bio/alignment.rb +713 -103
  12. data/lib/bio/appl/bl2seq/report.rb +2 -18
  13. data/lib/bio/appl/blast.rb +108 -91
  14. data/lib/bio/appl/blast/format0.rb +33 -18
  15. data/lib/bio/appl/blast/format8.rb +6 -20
  16. data/lib/bio/appl/blast/report.rb +293 -429
  17. data/lib/bio/appl/blast/rexml.rb +8 -22
  18. data/lib/bio/appl/blast/wublast.rb +21 -12
  19. data/lib/bio/appl/blast/xmlparser.rb +180 -183
  20. data/lib/bio/appl/blat/report.rb +127 -30
  21. data/lib/bio/appl/clustalw.rb +87 -59
  22. data/lib/bio/appl/clustalw/report.rb +20 -22
  23. data/lib/bio/appl/emboss.rb +113 -20
  24. data/lib/bio/appl/fasta.rb +173 -198
  25. data/lib/bio/appl/fasta/format10.rb +244 -347
  26. data/lib/bio/appl/gcg/msf.rb +212 -0
  27. data/lib/bio/appl/gcg/seq.rb +195 -0
  28. data/lib/bio/appl/genscan/report.rb +5 -23
  29. data/lib/bio/appl/hmmer.rb +8 -45
  30. data/lib/bio/appl/hmmer/report.rb +2 -20
  31. data/lib/bio/appl/iprscan/report.rb +374 -0
  32. data/lib/bio/appl/mafft.rb +87 -50
  33. data/lib/bio/appl/mafft/report.rb +151 -44
  34. data/lib/bio/appl/muscle.rb +52 -0
  35. data/lib/bio/appl/phylip/alignment.rb +129 -0
  36. data/lib/bio/appl/phylip/distance_matrix.rb +96 -0
  37. data/lib/bio/appl/probcons.rb +41 -0
  38. data/lib/bio/appl/psort.rb +89 -96
  39. data/lib/bio/appl/psort/report.rb +6 -22
  40. data/lib/bio/appl/pts1.rb +263 -0
  41. data/lib/bio/appl/sim4.rb +26 -36
  42. data/lib/bio/appl/sim4/report.rb +2 -18
  43. data/lib/bio/appl/sosui/report.rb +5 -20
  44. data/lib/bio/appl/spidey/report.rb +2 -2
  45. data/lib/bio/appl/targetp/report.rb +4 -20
  46. data/lib/bio/appl/tcoffee.rb +55 -0
  47. data/lib/bio/appl/tmhmm/report.rb +4 -20
  48. data/lib/bio/command.rb +235 -64
  49. data/lib/bio/data/aa.rb +21 -26
  50. data/lib/bio/data/codontable.rb +2 -20
  51. data/lib/bio/data/na.rb +19 -4
  52. data/lib/bio/db.rb +27 -12
  53. data/lib/bio/db/aaindex.rb +2 -20
  54. data/lib/bio/db/embl/common.rb +4 -21
  55. data/lib/bio/db/embl/embl.rb +33 -85
  56. data/lib/bio/db/embl/sptr.rb +612 -302
  57. data/lib/bio/db/embl/swissprot.rb +10 -29
  58. data/lib/bio/db/embl/trembl.rb +10 -29
  59. data/lib/bio/db/embl/uniprot.rb +10 -29
  60. data/lib/bio/db/fantom.rb +15 -20
  61. data/lib/bio/db/fasta.rb +3 -3
  62. data/lib/bio/db/genbank/common.rb +37 -46
  63. data/lib/bio/db/genbank/ddbj.rb +6 -18
  64. data/lib/bio/db/genbank/genbank.rb +47 -186
  65. data/lib/bio/db/genbank/genpept.rb +4 -17
  66. data/lib/bio/db/genbank/refseq.rb +4 -17
  67. data/lib/bio/db/gff.rb +103 -35
  68. data/lib/bio/db/go.rb +4 -20
  69. data/lib/bio/db/kegg/brite.rb +26 -36
  70. data/lib/bio/db/kegg/compound.rb +81 -85
  71. data/lib/bio/db/kegg/drug.rb +98 -0
  72. data/lib/bio/db/kegg/enzyme.rb +133 -110
  73. data/lib/bio/db/kegg/expression.rb +2 -20
  74. data/lib/bio/db/kegg/genes.rb +208 -238
  75. data/lib/bio/db/kegg/genome.rb +164 -285
  76. data/lib/bio/db/kegg/glycan.rb +114 -157
  77. data/lib/bio/db/kegg/keggtab.rb +242 -303
  78. data/lib/bio/db/kegg/kgml.rb +117 -160
  79. data/lib/bio/db/kegg/orthology.rb +112 -0
  80. data/lib/bio/db/kegg/reaction.rb +54 -69
  81. data/lib/bio/db/kegg/taxonomy.rb +331 -0
  82. data/lib/bio/db/lasergene.rb +209 -0
  83. data/lib/bio/db/litdb.rb +3 -27
  84. data/lib/bio/db/medline.rb +228 -249
  85. data/lib/bio/db/nbrf.rb +3 -3
  86. data/lib/bio/db/newick.rb +510 -0
  87. data/lib/bio/db/nexus.rb +1854 -0
  88. data/lib/bio/db/pdb.rb +5 -17
  89. data/lib/bio/db/pdb/atom.rb +2 -18
  90. data/lib/bio/db/pdb/chain.rb +2 -18
  91. data/lib/bio/db/pdb/chemicalcomponent.rb +2 -18
  92. data/lib/bio/db/pdb/model.rb +2 -18
  93. data/lib/bio/db/pdb/pdb.rb +73 -34
  94. data/lib/bio/db/pdb/residue.rb +4 -20
  95. data/lib/bio/db/pdb/utils.rb +2 -18
  96. data/lib/bio/db/prosite.rb +403 -422
  97. data/lib/bio/db/rebase.rb +84 -40
  98. data/lib/bio/db/soft.rb +404 -0
  99. data/lib/bio/db/transfac.rb +5 -17
  100. data/lib/bio/feature.rb +106 -52
  101. data/lib/bio/io/das.rb +32 -42
  102. data/lib/bio/io/dbget.rb +2 -20
  103. data/lib/bio/io/ddbjxml.rb +77 -138
  104. data/lib/bio/io/ebisoap.rb +158 -0
  105. data/lib/bio/io/ensembl.rb +229 -0
  106. data/lib/bio/io/fastacmd.rb +89 -82
  107. data/lib/bio/io/fetch.rb +163 -96
  108. data/lib/bio/io/flatfile.rb +170 -73
  109. data/lib/bio/io/flatfile/bdb.rb +3 -16
  110. data/lib/bio/io/flatfile/index.rb +2 -2
  111. data/lib/bio/io/flatfile/indexer.rb +3 -2
  112. data/lib/bio/io/higet.rb +12 -31
  113. data/lib/bio/io/keggapi.rb +210 -269
  114. data/lib/bio/io/ncbisoap.rb +155 -0
  115. data/lib/bio/io/pubmed.rb +169 -147
  116. data/lib/bio/io/registry.rb +4 -20
  117. data/lib/bio/io/soapwsdl.rb +43 -38
  118. data/lib/bio/io/sql.rb +242 -305
  119. data/lib/bio/location.rb +407 -285
  120. data/lib/bio/map.rb +410 -0
  121. data/lib/bio/pathway.rb +558 -695
  122. data/lib/bio/reference.rb +272 -75
  123. data/lib/bio/sequence.rb +255 -13
  124. data/lib/bio/sequence/aa.rb +71 -10
  125. data/lib/bio/sequence/common.rb +187 -33
  126. data/lib/bio/sequence/compat.rb +59 -4
  127. data/lib/bio/sequence/format.rb +54 -7
  128. data/lib/bio/sequence/generic.rb +3 -3
  129. data/lib/bio/sequence/na.rb +328 -26
  130. data/lib/bio/shell.rb +11 -4
  131. data/lib/bio/shell/core.rb +221 -160
  132. data/lib/bio/shell/demo.rb +18 -15
  133. data/lib/bio/shell/interface.rb +14 -12
  134. data/lib/bio/shell/irb.rb +95 -0
  135. data/lib/bio/shell/object.rb +45 -26
  136. data/lib/bio/shell/plugin/blast.rb +42 -0
  137. data/lib/bio/shell/plugin/codon.rb +22 -14
  138. data/lib/bio/shell/plugin/das.rb +58 -0
  139. data/lib/bio/shell/plugin/emboss.rb +2 -2
  140. data/lib/bio/shell/plugin/entry.rb +22 -11
  141. data/lib/bio/shell/plugin/flatfile.rb +2 -2
  142. data/lib/bio/shell/plugin/keggapi.rb +13 -6
  143. data/lib/bio/shell/plugin/midi.rb +4 -4
  144. data/lib/bio/shell/plugin/obda.rb +2 -2
  145. data/lib/bio/shell/plugin/psort.rb +56 -0
  146. data/lib/bio/shell/plugin/seq.rb +35 -8
  147. data/lib/bio/shell/plugin/soap.rb +87 -0
  148. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/bioruby_generator.rb +29 -0
  149. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/_classes.rhtml +4 -0
  150. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/_log.rhtml +27 -0
  151. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/_methods.rhtml +11 -0
  152. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/_modules.rhtml +4 -0
  153. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/_variables.rhtml +7 -0
  154. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby-bg.gif +0 -0
  155. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby-console.png +0 -0
  156. data/lib/bio/shell/rails/{public/images/icon.png → vendor/plugins/generators/bioruby/templates/bioruby-gem.png} +0 -0
  157. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby-link.gif +0 -0
  158. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby.css +369 -0
  159. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby.rhtml +47 -0
  160. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby_controller.rb +144 -0
  161. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby_helper.rb +47 -0
  162. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/commands.rhtml +8 -0
  163. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/history.rhtml +10 -0
  164. data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/index.rhtml +22 -0
  165. data/lib/bio/shell/script.rb +25 -0
  166. data/lib/bio/shell/setup.rb +109 -0
  167. data/lib/bio/shell/web.rb +70 -58
  168. data/lib/bio/tree.rb +850 -0
  169. data/lib/bio/util/color_scheme.rb +84 -107
  170. data/lib/bio/util/color_scheme/buried.rb +5 -24
  171. data/lib/bio/util/color_scheme/helix.rb +5 -24
  172. data/lib/bio/util/color_scheme/hydropathy.rb +5 -24
  173. data/lib/bio/util/color_scheme/nucleotide.rb +5 -24
  174. data/lib/bio/util/color_scheme/strand.rb +5 -24
  175. data/lib/bio/util/color_scheme/taylor.rb +5 -24
  176. data/lib/bio/util/color_scheme/turn.rb +5 -24
  177. data/lib/bio/util/color_scheme/zappo.rb +5 -24
  178. data/lib/bio/util/contingency_table.rb +70 -43
  179. data/lib/bio/util/restriction_enzyme.rb +228 -0
  180. data/lib/bio/util/restriction_enzyme/analysis.rb +249 -0
  181. data/lib/bio/util/restriction_enzyme/analysis_basic.rb +217 -0
  182. data/lib/bio/util/restriction_enzyme/cut_symbol.rb +107 -0
  183. data/lib/bio/util/restriction_enzyme/double_stranded.rb +321 -0
  184. data/lib/bio/util/restriction_enzyme/double_stranded/aligned_strands.rb +130 -0
  185. data/lib/bio/util/restriction_enzyme/double_stranded/cut_location_pair.rb +103 -0
  186. data/lib/bio/util/restriction_enzyme/double_stranded/cut_location_pair_in_enzyme_notation.rb +38 -0
  187. data/lib/bio/util/restriction_enzyme/double_stranded/cut_locations.rb +76 -0
  188. data/lib/bio/util/restriction_enzyme/double_stranded/cut_locations_in_enzyme_notation.rb +107 -0
  189. data/lib/bio/util/restriction_enzyme/enzymes.yaml +7061 -0
  190. data/lib/bio/util/restriction_enzyme/range/cut_range.rb +24 -0
  191. data/lib/bio/util/restriction_enzyme/range/cut_ranges.rb +47 -0
  192. data/lib/bio/util/restriction_enzyme/range/horizontal_cut_range.rb +67 -0
  193. data/lib/bio/util/restriction_enzyme/range/sequence_range.rb +257 -0
  194. data/lib/bio/util/restriction_enzyme/range/sequence_range/calculated_cuts.rb +242 -0
  195. data/lib/bio/util/restriction_enzyme/range/sequence_range/fragment.rb +51 -0
  196. data/lib/bio/util/restriction_enzyme/range/sequence_range/fragments.rb +41 -0
  197. data/lib/bio/util/restriction_enzyme/range/vertical_cut_range.rb +77 -0
  198. data/lib/bio/util/restriction_enzyme/single_strand.rb +199 -0
  199. data/lib/bio/util/restriction_enzyme/single_strand/cut_locations_in_enzyme_notation.rb +135 -0
  200. data/lib/bio/util/restriction_enzyme/single_strand_complement.rb +23 -0
  201. data/lib/bio/util/restriction_enzyme/string_formatting.rb +111 -0
  202. data/lib/bio/util/sirna.rb +4 -22
  203. data/sample/color_scheme_na.rb +4 -12
  204. data/sample/enzymes.rb +78 -0
  205. data/sample/goslim.rb +5 -13
  206. data/sample/psortplot_html.rb +4 -12
  207. data/test/data/blast/2.2.15.blastp.m7 +876 -0
  208. data/test/data/embl/AB090716.embl.rel89 +63 -0
  209. data/test/data/fasta/example1.txt +75 -0
  210. data/test/data/fasta/example2.txt +21 -0
  211. data/test/data/iprscan/merged.raw +32 -0
  212. data/test/data/iprscan/merged.txt +74 -0
  213. data/test/data/soft/GDS100_partial.soft +92 -0
  214. data/test/data/soft/GSE3457_family_partial.soft +874 -0
  215. data/test/functional/bio/io/test_ensembl.rb +103 -0
  216. data/test/functional/bio/io/test_soapwsdl.rb +5 -17
  217. data/test/unit/bio/appl/bl2seq/test_report.rb +2 -2
  218. data/test/unit/bio/appl/blast/test_report.rb +3 -16
  219. data/test/unit/bio/appl/blast/test_xmlparser.rb +4 -16
  220. data/test/unit/bio/appl/genscan/test_report.rb +3 -16
  221. data/test/unit/bio/appl/hmmer/test_report.rb +3 -16
  222. data/test/unit/bio/appl/iprscan/test_report.rb +338 -0
  223. data/test/unit/bio/appl/mafft/test_report.rb +63 -0
  224. data/test/unit/bio/appl/sosui/test_report.rb +3 -16
  225. data/test/unit/bio/appl/targetp/test_report.rb +3 -16
  226. data/test/unit/bio/appl/test_blast.rb +3 -16
  227. data/test/unit/bio/appl/test_fasta.rb +4 -16
  228. data/test/unit/bio/appl/test_pts1.rb +140 -0
  229. data/test/unit/bio/appl/tmhmm/test_report.rb +3 -16
  230. data/test/unit/bio/data/test_aa.rb +4 -17
  231. data/test/unit/bio/data/test_codontable.rb +3 -16
  232. data/test/unit/bio/data/test_na.rb +3 -3
  233. data/test/unit/bio/db/embl/test_common.rb +3 -16
  234. data/test/unit/bio/db/embl/test_embl.rb +3 -16
  235. data/test/unit/bio/db/embl/test_embl_rel89.rb +219 -0
  236. data/test/unit/bio/db/embl/test_sptr.rb +1548 -41
  237. data/test/unit/bio/db/embl/test_uniprot.rb +3 -16
  238. data/test/unit/bio/db/kegg/test_genes.rb +3 -16
  239. data/test/unit/bio/db/pdb/test_pdb.rb +7 -24
  240. data/test/unit/bio/db/test_aaindex.rb +2 -2
  241. data/test/unit/bio/db/test_fasta.rb +3 -16
  242. data/test/unit/bio/db/test_gff.rb +3 -16
  243. data/test/unit/bio/db/test_lasergene.rb +95 -0
  244. data/test/unit/bio/db/test_newick.rb +56 -0
  245. data/test/unit/bio/db/test_nexus.rb +360 -0
  246. data/test/unit/bio/db/test_prosite.rb +5 -18
  247. data/test/unit/bio/db/test_rebase.rb +11 -25
  248. data/test/unit/bio/db/test_soft.rb +138 -0
  249. data/test/unit/bio/io/test_ddbjxml.rb +5 -17
  250. data/test/unit/bio/io/test_ensembl.rb +109 -0
  251. data/test/unit/bio/io/test_fastacmd.rb +3 -16
  252. data/test/unit/bio/io/test_flatfile.rb +237 -0
  253. data/test/unit/bio/io/test_soapwsdl.rb +4 -17
  254. data/test/unit/bio/sequence/test_aa.rb +3 -3
  255. data/test/unit/bio/sequence/test_common.rb +3 -16
  256. data/test/unit/bio/sequence/test_compat.rb +3 -16
  257. data/test/unit/bio/sequence/test_na.rb +29 -3
  258. data/test/unit/bio/shell/plugin/test_seq.rb +8 -8
  259. data/test/unit/bio/test_alignment.rb +16 -27
  260. data/test/unit/bio/test_command.rb +242 -25
  261. data/test/unit/bio/test_db.rb +3 -16
  262. data/test/unit/bio/test_feature.rb +4 -16
  263. data/test/unit/bio/test_location.rb +4 -16
  264. data/test/unit/bio/test_map.rb +230 -0
  265. data/test/unit/bio/test_pathway.rb +4 -16
  266. data/test/unit/bio/test_reference.rb +2 -2
  267. data/test/unit/bio/test_sequence.rb +7 -19
  268. data/test/unit/bio/test_shell.rb +3 -16
  269. data/test/unit/bio/test_tree.rb +593 -0
  270. data/test/unit/bio/util/restriction_enzyme/analysis/test_calculated_cuts.rb +299 -0
  271. data/test/unit/bio/util/restriction_enzyme/analysis/test_cut_ranges.rb +103 -0
  272. data/test/unit/bio/util/restriction_enzyme/analysis/test_sequence_range.rb +240 -0
  273. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_aligned_strands.rb +100 -0
  274. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_location_pair.rb +75 -0
  275. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_location_pair_in_enzyme_notation.rb +73 -0
  276. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_locations.rb +53 -0
  277. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_locations_in_enzyme_notation.rb +104 -0
  278. data/test/unit/bio/util/restriction_enzyme/single_strand/test_cut_locations_in_enzyme_notation.rb +83 -0
  279. data/test/unit/bio/util/restriction_enzyme/test_analysis.rb +246 -0
  280. data/test/unit/bio/util/restriction_enzyme/test_cut_symbol.rb +44 -0
  281. data/test/unit/bio/util/restriction_enzyme/test_double_stranded.rb +115 -0
  282. data/test/unit/bio/util/restriction_enzyme/test_single_strand.rb +147 -0
  283. data/test/unit/bio/util/restriction_enzyme/test_single_strand_complement.rb +147 -0
  284. data/test/unit/bio/util/restriction_enzyme/test_string_formatting.rb +60 -0
  285. data/test/unit/bio/util/test_color_scheme.rb +6 -18
  286. data/test/unit/bio/util/test_contingency_table.rb +6 -18
  287. data/test/unit/bio/util/test_restriction_enzyme.rb +42 -0
  288. data/test/unit/bio/util/test_sirna.rb +3 -16
  289. metadata +228 -169
  290. data/doc/BioRuby.rd.ja +0 -225
  291. data/doc/Design.rd.ja +0 -341
  292. data/doc/TODO.rd.ja +0 -138
  293. data/lib/bio/appl/fasta/format6.rb +0 -37
  294. data/lib/bio/db/kegg/cell.rb +0 -88
  295. data/lib/bio/db/kegg/ko.rb +0 -178
  296. data/lib/bio/shell/rails/Rakefile +0 -10
  297. data/lib/bio/shell/rails/app/controllers/application.rb +0 -4
  298. data/lib/bio/shell/rails/app/controllers/shell_controller.rb +0 -94
  299. data/lib/bio/shell/rails/app/helpers/application_helper.rb +0 -3
  300. data/lib/bio/shell/rails/app/models/shell_connection.rb +0 -30
  301. data/lib/bio/shell/rails/app/views/layouts/shell.rhtml +0 -37
  302. data/lib/bio/shell/rails/app/views/shell/history.rhtml +0 -5
  303. data/lib/bio/shell/rails/app/views/shell/index.rhtml +0 -2
  304. data/lib/bio/shell/rails/app/views/shell/show.rhtml +0 -13
  305. data/lib/bio/shell/rails/config/boot.rb +0 -19
  306. data/lib/bio/shell/rails/config/database.yml +0 -85
  307. data/lib/bio/shell/rails/config/environment.rb +0 -53
  308. data/lib/bio/shell/rails/config/environments/development.rb +0 -19
  309. data/lib/bio/shell/rails/config/environments/production.rb +0 -19
  310. data/lib/bio/shell/rails/config/environments/test.rb +0 -19
  311. data/lib/bio/shell/rails/config/routes.rb +0 -19
  312. data/lib/bio/shell/rails/doc/README_FOR_APP +0 -2
  313. data/lib/bio/shell/rails/public/404.html +0 -8
  314. data/lib/bio/shell/rails/public/500.html +0 -8
  315. data/lib/bio/shell/rails/public/dispatch.cgi +0 -10
  316. data/lib/bio/shell/rails/public/dispatch.fcgi +0 -24
  317. data/lib/bio/shell/rails/public/dispatch.rb +0 -10
  318. data/lib/bio/shell/rails/public/favicon.ico +0 -0
  319. data/lib/bio/shell/rails/public/images/rails.png +0 -0
  320. data/lib/bio/shell/rails/public/index.html +0 -277
  321. data/lib/bio/shell/rails/public/javascripts/controls.js +0 -750
  322. data/lib/bio/shell/rails/public/javascripts/dragdrop.js +0 -584
  323. data/lib/bio/shell/rails/public/javascripts/effects.js +0 -854
  324. data/lib/bio/shell/rails/public/javascripts/prototype.js +0 -1785
  325. data/lib/bio/shell/rails/public/robots.txt +0 -1
  326. data/lib/bio/shell/rails/public/stylesheets/main.css +0 -187
  327. data/lib/bio/shell/rails/script/about +0 -3
  328. data/lib/bio/shell/rails/script/breakpointer +0 -3
  329. data/lib/bio/shell/rails/script/console +0 -3
  330. data/lib/bio/shell/rails/script/destroy +0 -3
  331. data/lib/bio/shell/rails/script/generate +0 -3
  332. data/lib/bio/shell/rails/script/performance/benchmarker +0 -3
  333. data/lib/bio/shell/rails/script/performance/profiler +0 -3
  334. data/lib/bio/shell/rails/script/plugin +0 -3
  335. data/lib/bio/shell/rails/script/process/reaper +0 -3
  336. data/lib/bio/shell/rails/script/process/spawner +0 -3
  337. data/lib/bio/shell/rails/script/process/spinner +0 -3
  338. data/lib/bio/shell/rails/script/runner +0 -3
  339. data/lib/bio/shell/rails/script/server +0 -42
  340. data/lib/bio/shell/rails/test/test_helper.rb +0 -28
@@ -0,0 +1,24 @@
1
+ #
2
+ # bio/util/restriction_enzyme/range/cut_range.rb - Abstract base class for HorizontalCutRange and VerticalCutRange
3
+ #
4
+ # Author:: Trevor Wennblom <mailto:trevor@corevx.com>
5
+ # Copyright:: Copyright (c) 2005-2007 Midwinter Laboratories, LLC (http://midwinterlabs.com)
6
+ # License:: The Ruby License
7
+ #
8
+ # $Id: cut_range.rb,v 1.4 2007/07/16 19:28:48 k Exp $
9
+ #
10
+
11
+ require 'bio/util/restriction_enzyme'
12
+
13
+ module Bio
14
+ class RestrictionEnzyme
15
+ class Range
16
+
17
+ # Abstract base class for HorizontalCutRange and VerticalCutRange
18
+ #
19
+ class CutRange
20
+ end # CutRange
21
+
22
+ end # Range
23
+ end # RestrictionEnzyme
24
+ end # Bio
@@ -0,0 +1,47 @@
1
+ #
2
+ # bio/util/restriction_enzyme/range/cut_ranges.rb - Container for many CutRange objects or CutRange child objects.
3
+ #
4
+ # Author:: Trevor Wennblom <mailto:trevor@corevx.com>
5
+ # Copyright:: Copyright (c) 2005-2007 Midwinter Laboratories, LLC (http://midwinterlabs.com)
6
+ # License:: The Ruby License
7
+ #
8
+ # $Id: cut_ranges.rb,v 1.5 2007/07/16 19:28:48 k Exp $
9
+ #
10
+
11
+ require 'bio/util/restriction_enzyme'
12
+
13
+ module Bio
14
+ class RestrictionEnzyme
15
+ class Range
16
+
17
+ # Container for many CutRange objects or CutRange child objects. Inherits from array.
18
+ #
19
+ class CutRanges < Array
20
+ def min; self.collect{|a| a.min}.flatten.sort.first; end
21
+ def max; self.collect{|a| a.max}.flatten.sort.last; end
22
+ def include?(i); self.collect{|a| a.include?(i)}.include?(true); end
23
+
24
+ def min_vertical
25
+ vertical_min_max_helper( :min )
26
+ end
27
+
28
+ def max_vertical
29
+ vertical_min_max_helper( :max )
30
+ end
31
+
32
+ protected
33
+
34
+ def vertical_min_max_helper( sym_which )
35
+ tmp = []
36
+ self.each do |a|
37
+ next unless a.class == Bio::RestrictionEnzyme::Range::VerticalCutRange
38
+ tmp << a.send( sym_which )
39
+ end
40
+ z = (sym_which == :max) ? :last : :first
41
+ tmp.flatten.sort.send(z)
42
+ end
43
+
44
+ end # CutRanges
45
+ end # Range
46
+ end # RestrictionEnzyme
47
+ end # Bio
@@ -0,0 +1,67 @@
1
+ #
2
+ # bio/util/restriction_enzyme/range/horizontal_cut_range.rb -
3
+ #
4
+ # Author:: Trevor Wennblom <mailto:trevor@corevx.com>
5
+ # Copyright:: Copyright (c) 2005-2007 Midwinter Laboratories, LLC (http://midwinterlabs.com)
6
+ # License:: The Ruby License
7
+ #
8
+ # $Id: horizontal_cut_range.rb,v 1.5 2007/07/16 19:28:48 k Exp $
9
+ #
10
+
11
+ require 'bio/util/restriction_enzyme'
12
+
13
+ module Bio
14
+ class RestrictionEnzyme
15
+ class Range
16
+
17
+ class HorizontalCutRange < CutRange
18
+ attr_reader :p_cut_left, :p_cut_right
19
+ attr_reader :c_cut_left, :c_cut_right
20
+ attr_reader :min, :max
21
+ attr_reader :hcuts
22
+
23
+ def initialize( left, right=left )
24
+ raise "left > right" if left > right
25
+
26
+ # The 'range' here is actually off by one on the left
27
+ # side in relation to a normal CutRange, so using the normal
28
+ # variables from CutRange would result in bad behavior.
29
+ #
30
+ # See below - the first horizontal cut is the primary cut plus one.
31
+ #
32
+ # 1 2 3 4 5 6 7
33
+ # G A|T T A C A
34
+ # +-----+
35
+ # C T A A T|G T
36
+ # 1 2 3 4 5 6 7
37
+ #
38
+ # Primary cut = 2
39
+ # Complement cut = 5
40
+ # Horizontal cuts = 3, 4, 5
41
+
42
+ @p_cut_left = nil
43
+ @p_cut_right = nil
44
+ @c_cut_left = nil
45
+ @c_cut_right = nil
46
+ @min = left # NOTE this used to be 'nil', make sure all tests work
47
+ @max = right # NOTE this used to be 'nil', make sure all tests work
48
+ @range = (@min..@max) unless @min == nil or @max == nil # NOTE this used to be 'nil', make sure all tests work
49
+
50
+
51
+ @hcuts = (left..right)
52
+ end
53
+
54
+ # Check if a location falls within the minimum or maximum values of this
55
+ # range.
56
+ #
57
+ # ---
58
+ # *Arguments*
59
+ # * +i+: Location to check if it is included in the range
60
+ # *Returns*:: +true+ _or_ +false+
61
+ def include?(i)
62
+ @range.include?(i)
63
+ end
64
+ end # HorizontalCutRange
65
+ end # Range
66
+ end # RestrictionEnzyme
67
+ end # Bio
@@ -0,0 +1,257 @@
1
+ #
2
+ # bio/util/restriction_enzyme/range/sequence_range.rb - A defined range over a nucleotide sequence
3
+ #
4
+ # Author:: Trevor Wennblom <mailto:trevor@corevx.com>
5
+ # Copyright:: Copyright (c) 2005-2007 Midwinter Laboratories, LLC (http://midwinterlabs.com)
6
+ # License:: The Ruby License
7
+ #
8
+ # $Id: sequence_range.rb,v 1.9 2007/07/16 19:28:48 k Exp $
9
+ #
10
+
11
+ require 'bio/util/restriction_enzyme'
12
+
13
+ module Bio
14
+ class RestrictionEnzyme
15
+ class Range
16
+
17
+ autoload :CutRange, 'bio/util/restriction_enzyme/range/cut_range'
18
+ autoload :CutRanges, 'bio/util/restriction_enzyme/range/cut_ranges'
19
+ autoload :HorizontalCutRange, 'bio/util/restriction_enzyme/range/horizontal_cut_range'
20
+ autoload :VerticalCutRange, 'bio/util/restriction_enzyme/range/vertical_cut_range'
21
+
22
+ # A defined range over a nucleotide sequence.
23
+ #
24
+ # This class accomadates having cuts defined on a sequence and returning the
25
+ # fragments made by those cuts.
26
+ class SequenceRange
27
+
28
+ autoload :Fragment, 'bio/util/restriction_enzyme/range/sequence_range/fragment'
29
+ autoload :Fragments, 'bio/util/restriction_enzyme/range/sequence_range/fragments'
30
+ autoload :CalculatedCuts, 'bio/util/restriction_enzyme/range/sequence_range/calculated_cuts'
31
+
32
+ # Left-most index of primary strand
33
+ attr_reader :p_left
34
+
35
+ # Right-most index of primary strand
36
+ attr_reader :p_right
37
+
38
+ # Left-most index of complementary strand
39
+ attr_reader :c_left
40
+
41
+ # Right-most index of complementary strand
42
+ attr_reader :c_right
43
+
44
+ # Left-most index of DNA sequence
45
+ attr_reader :left
46
+
47
+ # Right-most index of DNA sequence
48
+ attr_reader :right
49
+
50
+ # Size of DNA sequence
51
+ attr_reader :size
52
+
53
+ # CutRanges in this SequenceRange
54
+ attr_reader :cut_ranges
55
+
56
+ def initialize( p_left = nil, p_right = nil, c_left = nil, c_right = nil )
57
+ raise ArgumentError if p_left == nil and c_left == nil
58
+ raise ArgumentError if p_right == nil and c_right == nil
59
+ (raise ArgumentError unless p_left <= p_right) unless p_left == nil or p_right == nil
60
+ (raise ArgumentError unless c_left <= c_right) unless c_left == nil or c_right == nil
61
+
62
+ @p_left, @p_right, @c_left, @c_right = p_left, p_right, c_left, c_right
63
+ @left = [p_left, c_left].compact.sort.first
64
+ @right = [p_right, c_right].compact.sort.last
65
+ @size = (@right - @left) + 1 unless @left == nil or @right == nil
66
+ @cut_ranges = CutRanges.new
67
+ @__fragments_current = false
68
+ end
69
+
70
+
71
+ # If the first object is HorizontalCutRange or VerticalCutRange, that is
72
+ # added to the SequenceRange. Otherwise this method
73
+ # builds a VerticalCutRange object and adds it to the SequenceRange.
74
+ #
75
+ # Note:
76
+ # Cut occurs immediately after the index supplied.
77
+ # For example, a cut at '0' would mean a cut occurs between bases 0 and 1.
78
+ #
79
+ # ---
80
+ # *Arguments*
81
+ # * +p_cut_left+: (_optional_) Left-most cut on the primary strand *or* a CutRange object. +nil+ to skip
82
+ # * +p_cut_right+: (_optional_) Right-most cut on the primary strand. +nil+ to skip
83
+ # * +c_cut_left+: (_optional_) Left-most cut on the complementary strand. +nil+ to skip
84
+ # * +c_cut_right+: (_optional_) Right-most cut on the complementary strand. +nil+ to skip
85
+ # *Returns*:: nothing
86
+ def add_cut_range( p_cut_left=nil, p_cut_right=nil, c_cut_left=nil, c_cut_right=nil )
87
+ @__fragments_current = false
88
+ if p_cut_left.kind_of? CutRange # shortcut
89
+ @cut_ranges << p_cut_left
90
+ else
91
+ [p_cut_left, p_cut_right, c_cut_left, c_cut_right].each { |n| (raise IndexError unless n >= @left and n <= @right) unless n == nil }
92
+ @cut_ranges << VerticalCutRange.new( p_cut_left, p_cut_right, c_cut_left, c_cut_right )
93
+ end
94
+ end
95
+
96
+ # Add a series of CutRange objects (HorizontalCutRange or VerticalCutRange).
97
+ #
98
+ # ---
99
+ # *Arguments*
100
+ # * +cut_ranges+: A series of CutRange objects
101
+ # *Returns*:: nothing
102
+ def add_cut_ranges(*cut_ranges)
103
+ cut_ranges.flatten.each do |cut_range|
104
+ raise TypeError, "Not of type CutRange" unless cut_range.kind_of? CutRange
105
+ self.add_cut_range( cut_range )
106
+ end
107
+ end
108
+
109
+ # Builds a HorizontalCutRange object and adds it to the SequenceRange.
110
+ #
111
+ # ---
112
+ # *Arguments*
113
+ # * +left+: Left-most cut
114
+ # * +right+: (_optional_) Right side - by default this equals the left side, default is recommended.
115
+ # *Returns*:: nothing
116
+ def add_horizontal_cut_range( left, right=left )
117
+ @__fragments_current = false
118
+ @cut_ranges << HorizontalCutRange.new( left, right )
119
+ end
120
+
121
+ # A Bio::RestrictionEnzyme::Range::SequenceRange::Bin holds an +Array+ of
122
+ # indexes for the primary and complement strands (+p+ and +c+ accessors).
123
+ #
124
+ # Example hash with Bin values:
125
+ # {0=>#<struct Bio::RestrictionEnzyme::Range::SequenceRange::Bin c=[0, 1], p=[0]>,
126
+ # 2=>#<struct Bio::RestrictionEnzyme::Range::SequenceRange::Bin c=[], p=[1, 2]>,
127
+ # 3=>#<struct Bio::RestrictionEnzyme::Range::SequenceRange::Bin c=[2, 3], p=[]>,
128
+ # 4=>#<struct Bio::RestrictionEnzyme::Range::SequenceRange::Bin c=[4, 5], p=[3, 4, 5]>}
129
+ #
130
+ # Note that the bin cannot be easily stored as a range since there may be
131
+ # nucleotides excised in the middle of a range.
132
+ #
133
+ # TODO: Perhaps store the bins as one-or-many ranges since missing
134
+ # nucleotides due to enzyme cutting is a special case.
135
+ Bin = Struct.new(:c, :p)
136
+
137
+ # Calculates the fragments over this sequence range as defined after using
138
+ # the methods add_cut_range, add_cut_ranges, and/or add_horizontal_cut_range
139
+ #
140
+ # Example return value:
141
+ # [#<Bio::RestrictionEnzyme::Range::SequenceRange::Fragment:0x277bdc
142
+ # @complement_bin=[0, 1],
143
+ # @primary_bin=[0]>,
144
+ # #<Bio::RestrictionEnzyme::Range::SequenceRange::Fragment:0x277bc8
145
+ # @complement_bin=[],
146
+ # @primary_bin=[1, 2]>,
147
+ # #<Bio::RestrictionEnzyme::Range::SequenceRange::Fragment:0x277bb4
148
+ # @complement_bin=[2, 3],
149
+ # @primary_bin=[]>,
150
+ # #<Bio::RestrictionEnzyme::Range::SequenceRange::Fragment:0x277ba0
151
+ # @complement_bin=[4, 5],
152
+ # @primary_bin=[3, 4, 5]>]
153
+ #
154
+ # ---
155
+ # *Arguments*
156
+ # * _none_
157
+ # *Returns*:: Bio::RestrictionEnzyme::Range::SequenceRange::Fragments
158
+ def fragments
159
+ return @__fragments if @__fragments_current == true
160
+ @__fragments_current = true
161
+
162
+ num_txt = '0123456789'
163
+ num_txt_repeat = (num_txt * ( @size / num_txt.size.to_f ).ceil)[0..@size-1]
164
+ fragments = Fragments.new(num_txt_repeat, num_txt_repeat)
165
+
166
+ cc = Bio::RestrictionEnzyme::Range::SequenceRange::CalculatedCuts.new(@size)
167
+ cc.add_cuts_from_cut_ranges(@cut_ranges)
168
+ cc.remove_incomplete_cuts
169
+
170
+ create_bins(cc).sort.each { |k, bin| fragments << Fragment.new( bin.p, bin.c ) }
171
+ @__fragments = fragments
172
+ return fragments
173
+ end
174
+
175
+ #########
176
+ protected
177
+ #########
178
+
179
+ # Example:
180
+ # cc = Bio::RestrictionEnzyme::Range::SequenceRange::CalculatedCuts.new(@size)
181
+ # cc.add_cuts_from_cut_ranges(@cut_ranges)
182
+ # cc.remove_incomplete_cuts
183
+ # bins = create_bins(cc)
184
+ #
185
+ # Example return value:
186
+ # {0=>#<struct Bio::RestrictionEnzyme::Range::SequenceRange::Bin c=[0, 1], p=[0]>,
187
+ # 2=>#<struct Bio::RestrictionEnzyme::Range::SequenceRange::Bin c=[], p=[1, 2]>,
188
+ # 3=>#<struct Bio::RestrictionEnzyme::Range::SequenceRange::Bin c=[2, 3], p=[]>,
189
+ # 4=>#<struct Bio::RestrictionEnzyme::Range::SequenceRange::Bin c=[4, 5], p=[3, 4, 5]>}
190
+ #
191
+ # ---
192
+ # *Arguments*
193
+ # * +cc+: Bio::RestrictionEnzyme::Range::SequenceRange::CalculatedCuts
194
+ # *Returns*:: +Hash+ Keys are unique, values are Bio::RestrictionEnzyme::Range::SequenceRange::Bin objects filled with indexes of the sequence locations they represent.
195
+ def create_bins(cc)
196
+ p_cut = cc.vc_primary
197
+ c_cut = cc.vc_complement
198
+ h_cut = cc.hc_between_strands
199
+
200
+ if @circular
201
+ # NOTE
202
+ # if it's circular we should start at the beginning of a cut for orientation
203
+ # scan for it, hack off the first set of hcuts and move them to the back
204
+
205
+ unique_id = 0
206
+ else
207
+ p_cut.unshift(-1) unless p_cut.include?(-1)
208
+ c_cut.unshift(-1) unless c_cut.include?(-1)
209
+ unique_id = -1
210
+ end
211
+
212
+ p_bin_id = c_bin_id = unique_id
213
+ bins = {}
214
+ setup_new_bin(bins, unique_id)
215
+
216
+ -1.upto(@size-1) do |idx| # NOTE - circular, for the future - should '-1' be replace with 'unique_id'?
217
+
218
+ # if bin_ids are out of sync but the strands are attached
219
+ if (p_bin_id != c_bin_id) and !h_cut.include?(idx)
220
+ min_id, max_id = [p_bin_id, c_bin_id].sort
221
+ bins.delete(max_id)
222
+ p_bin_id = c_bin_id = min_id
223
+ end
224
+
225
+ bins[ p_bin_id ].p << idx
226
+ bins[ c_bin_id ].c << idx
227
+
228
+ if p_cut.include? idx
229
+ p_bin_id = (unique_id += 1)
230
+ setup_new_bin(bins, p_bin_id)
231
+ end
232
+
233
+ if c_cut.include? idx # repetition
234
+ c_bin_id = (unique_id += 1) # repetition
235
+ setup_new_bin(bins, c_bin_id) # repetition
236
+ end # repetition
237
+
238
+ end
239
+
240
+ # Bin "-1" is an easy way to indicate the start of a strand just in case
241
+ # there is a horizontal cut at position 0
242
+ bins.delete(-1) unless @circular
243
+ bins
244
+ end
245
+
246
+ # Modifies bins in place by creating a new element with key bin_id and
247
+ # initializing the bin.
248
+ def setup_new_bin(bins, bin_id)
249
+ bins[ bin_id ] = Bin.new
250
+ bins[ bin_id ].p = []
251
+ bins[ bin_id ].c = []
252
+ end
253
+
254
+ end # SequenceRange
255
+ end # Range
256
+ end # RestrictionEnzyme
257
+ end # Bio
@@ -0,0 +1,242 @@
1
+ #
2
+ # bio/util/restriction_enzyme/range/sequence_range/calculated_cuts.rb -
3
+ #
4
+ # Author:: Trevor Wennblom <mailto:trevor@corevx.com>
5
+ # Copyright:: Copyright (c) 2005-2007 Midwinter Laboratories, LLC (http://midwinterlabs.com)
6
+ # License:: The Ruby License
7
+ #
8
+ # $Id: calculated_cuts.rb,v 1.7 2007/07/16 19:28:48 k Exp $
9
+ #
10
+
11
+ require 'bio/util/restriction_enzyme'
12
+
13
+ module Bio
14
+ class RestrictionEnzyme
15
+ class Range
16
+ class SequenceRange
17
+
18
+ # cc = CalculatedCuts.new(@size)
19
+ # cc.add_cuts_from_cut_ranges(@cut_ranges)
20
+ # cc.remove_incomplete_cuts
21
+ #
22
+ # 1 2 3 4 5 6 7
23
+ # G A|T T A C A
24
+ # +-----+
25
+ # C T A A T|G T
26
+ # 1 2 3 4 5 6 7
27
+ #
28
+ # Primary cut = 2
29
+ # Complement cut = 5
30
+ # Horizontal cuts = 3, 4, 5
31
+ #
32
+ class CalculatedCuts
33
+ include CutSymbol
34
+ include StringFormatting
35
+
36
+ # +Array+ of vertical cuts on the primary strand in 0-based index notation
37
+ attr_reader :vc_primary
38
+
39
+ # +Array+ of vertical cuts on the complementary strand in 0-based index notation
40
+ attr_reader :vc_complement
41
+
42
+ # +Array+ of horizontal cuts between strands in 0-based index notation
43
+ attr_reader :hc_between_strands
44
+
45
+ # Set to +true+ if the fragment CalculatedCuts is working on is circular
46
+ attr_accessor :circular
47
+
48
+ # An +Array+ with the primary strand with vertical cuts, the horizontal cuts, and the complementary strand with vertical cuts.
49
+ attr_reader :strands_for_display
50
+
51
+ # If +false+ the strands_for_display method needs to be called to update the contents
52
+ # of @strands_for_display. Becomes out of date whenever add_cuts_from_cut_ranges is called.
53
+ attr_reader :strands_for_display_current
54
+
55
+ # Size of the sequence being digested.
56
+ attr_reader :size
57
+
58
+ def initialize(size=nil, circular=false)
59
+ @size = size
60
+ @circular = circular
61
+ @vc_primary = []
62
+ @vc_complement = []
63
+ @hc_between_strands = []
64
+ end
65
+
66
+ # Accepts an +Array+ of CutRange type objects and applies them to
67
+ # @vc_complement, @vc_primary, and @hc_between_strands.
68
+ #
69
+ # ---
70
+ # *Arguments*
71
+ # * +cut_ranges+: An +Array+ of HorizontalCutRange or VerticalCutRange objects
72
+ # *Returns*:: nothing
73
+ def add_cuts_from_cut_ranges(cut_ranges)
74
+ @strands_for_display_current = false
75
+
76
+ cut_ranges.each do |cut_range|
77
+ @vc_primary += [cut_range.p_cut_left, cut_range.p_cut_right]
78
+ @vc_complement += [cut_range.c_cut_left, cut_range.c_cut_right]
79
+
80
+ # Add horizontal cut ranges. This may happen from cuts made inbetween a
81
+ # VerticalCutRange or may be specifically defined by a HorizontalCutRange.
82
+ if cut_range.class == VerticalCutRange
83
+ ( cut_range.min + 1 ).upto( cut_range.max ){|i| @hc_between_strands << i} if cut_range.min < cut_range.max
84
+ elsif cut_range.class == HorizontalCutRange
85
+ ( cut_range.hcuts.first ).upto( cut_range.hcuts.last ){|i| @hc_between_strands << i}
86
+ end
87
+ end
88
+ clean_all
89
+ #return
90
+ end
91
+
92
+ # There may be incomplete cuts made, this method removes the cuts that don't
93
+ # create sub-sequences for easier processing.
94
+ #
95
+ # For example, stray horizontal cuts that do not end with a left
96
+ # and right separation:
97
+ #
98
+ # G A T T A C A
99
+ # +-- ---
100
+ # C T|A A T G T
101
+ #
102
+ # Or stray vertical cuts:
103
+ #
104
+ # G A T T A C A
105
+ # +-- +
106
+ # C T|A A T|G T
107
+ #
108
+ # However note that for non-circular sequences this would be a successful
109
+ # cut which would result in a floating 'GT' sub-sequence:
110
+ #
111
+ # G A T T A C A
112
+ # +---
113
+ # C T A A T|G T
114
+ #
115
+ # Blunt cuts are also complete cuts.
116
+ # ---
117
+ # *Arguments*
118
+ # * +size+: (_optional_) Size of the sequence being digested. Defined here or during initalization of CalculatedCuts.
119
+ # *Returns*:: nothing
120
+ def remove_incomplete_cuts(size=nil)
121
+ @strands_for_display_current = false
122
+ @size = size if size
123
+ raise IndexError, "Size of the strand must be provided here or during initalization." if !@size.kind_of?(Fixnum) and not @circular
124
+
125
+ vcuts = (@vc_primary + @vc_complement).uniq.sort
126
+ hcuts = @hc_between_strands
127
+ last_index = @size - 1
128
+ good_hcuts = []
129
+ potential_hcuts = []
130
+
131
+ if @circular
132
+ # NOTE
133
+ # if it's circular we should start at the beginning of a cut for orientation,
134
+ # scan for it, hack off the first set of hcuts and move them to the back
135
+ else
136
+ vcuts.unshift(-1) unless vcuts.include?(-1)
137
+ vcuts.push(last_index) unless vcuts.include?(last_index)
138
+ end
139
+
140
+ hcuts.each do |hcut|
141
+ raise IndexError if hcut < -1 or hcut > last_index
142
+ # skipped a nucleotide
143
+ potential_hcuts.clear if !potential_hcuts.empty? and (hcut - potential_hcuts.last).abs > 1
144
+
145
+ if potential_hcuts.empty?
146
+ if vcuts.include?( hcut ) and vcuts.include?( hcut - 1 )
147
+ good_hcuts += [hcut]
148
+ elsif vcuts.include?( hcut - 1 )
149
+ potential_hcuts << hcut
150
+ end
151
+ else
152
+ if vcuts.include?( hcut )
153
+ good_hcuts += potential_hcuts + [hcut]
154
+ potential_hcuts.clear
155
+ else
156
+ potential_hcuts << hcut
157
+ end
158
+ end
159
+ end
160
+
161
+ check_vc = lambda do |vertical_cuts, opposing_vcuts|
162
+ # opposing_vcuts is here only to check for blunt cuts, so there shouldn't
163
+ # be any out-of-order problems with this
164
+ good_vc = []
165
+ vertical_cuts.each { |vc| good_vc << vc if good_hcuts.include?( vc ) or good_hcuts.include?( vc + 1 ) or opposing_vcuts.include?( vc ) }
166
+ good_vc
167
+ end
168
+
169
+ @vc_primary = check_vc.call(@vc_primary, @vc_complement)
170
+ @vc_complement = check_vc.call(@vc_complement, @vc_primary)
171
+ @hc_between_strands = good_hcuts
172
+
173
+ clean_all
174
+ end
175
+
176
+ # Sets @strands_for_display_current to +true+ and populates @strands_for_display.
177
+ #
178
+ # ---
179
+ # *Arguments*
180
+ # * +str1+: (_optional_) For displaying a primary strand. If +nil+ a numbered sequence will be used in place.
181
+ # * +str2+: (_optional_) For displaying a complementary strand. If +nil+ a numbered sequence will be used in place.
182
+ # * +vcp+: (_optional_) An array of vertical cut locations on the primary strand. If +nil+ the contents of @vc_primary is used.
183
+ # * +vcc+: (_optional_) An array of vertical cut locations on the complementary strand. If +nil+ the contents of @vc_complementary is used.
184
+ # * +hc+: (_optional_) An array of horizontal cut locations between strands. If +nil+ the contents of @hc_between_strands is used.
185
+ # *Returns*:: +Array+ An array with the primary strand with vertical cuts, the horizontal cuts, and the complementary strand with vertical cuts.
186
+ #
187
+ def strands_for_display(str1 = nil, str2 = nil, vcp=nil, vcc=nil, hc=nil)
188
+ return @strands_for_display if @strands_for_display_current
189
+ vcs = '|' # Vertical cut symbol
190
+ hcs = '-' # Horizontal cut symbol
191
+ vhcs = '+' # Intersection of vertical and horizontal cut symbol
192
+
193
+ num_txt_repeat = lambda { num_txt = '0123456789'; (num_txt * ( @size / num_txt.size.to_f ).ceil)[0..@size-1] }
194
+ (str1 == nil) ? a = num_txt_repeat.call : a = str1.dup
195
+ (str2 == nil) ? b = num_txt_repeat.call : b = str2.dup
196
+
197
+ vcp = @vc_primary if vcp==nil
198
+ vcc = @vc_complement if vcc==nil
199
+ hc = @hc_between_strands if hc==nil
200
+
201
+ vcuts = (vcp + vcc).uniq.sort
202
+
203
+ vcp.reverse.each { |c| a.insert(c+1, vcs) }
204
+ vcc.reverse.each { |c| b.insert(c+1, vcs) }
205
+
206
+ between = ' ' * @size
207
+ hc.each {|hcut| between[hcut,1] = hcs }
208
+
209
+ s_a = add_spacing(a, vcs)
210
+ s_b = add_spacing(b, vcs)
211
+ s_bet = add_spacing(between)
212
+
213
+ # NOTE watch this for circular
214
+ i = 0
215
+ 0.upto( s_a.size-1 ) do
216
+ if (s_a[i,1] == vcs) or (s_b[i,1] == vcs)
217
+ s_bet[i] = vhcs
218
+ elsif i != 0 and s_bet[i-1,1] == hcs and s_bet[i+1,1] == hcs
219
+ s_bet[i] = hcs
220
+ end
221
+ i+=1
222
+ end
223
+
224
+ @strands_for_display_current = true
225
+ @strands_for_display = [s_a, s_bet, s_b]
226
+ end
227
+
228
+ #########
229
+ protected
230
+ #########
231
+
232
+ # remove nil values, remove duplicate values, and
233
+ # sort @vc_primary, @vc_complement, and @hc_between_strands
234
+ def clean_all
235
+ [@vc_primary, @vc_complement, @hc_between_strands].collect { |a| a.delete(nil); a.uniq!; a.sort! }
236
+ end
237
+
238
+ end # CalculatedCuts
239
+ end # SequenceRange
240
+ end # Range
241
+ end # RestrictionEnzyme
242
+ end # Bio