bio 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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