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.
- data/bin/bioruby +14 -122
- data/bin/br_biofetch.rb +2 -2
- data/bin/br_bioflat.rb +2 -2
- data/bin/br_biogetseq.rb +2 -2
- data/bin/br_pmfetch.rb +3 -3
- data/doc/Changes-0.7.rd +77 -0
- data/doc/KEGG_API.rd +523 -232
- data/doc/KEGG_API.rd.ja +529 -207
- data/doc/Tutorial.rd +48 -11
- data/lib/bio.rb +59 -6
- data/lib/bio/alignment.rb +713 -103
- data/lib/bio/appl/bl2seq/report.rb +2 -18
- data/lib/bio/appl/blast.rb +108 -91
- data/lib/bio/appl/blast/format0.rb +33 -18
- data/lib/bio/appl/blast/format8.rb +6 -20
- data/lib/bio/appl/blast/report.rb +293 -429
- data/lib/bio/appl/blast/rexml.rb +8 -22
- data/lib/bio/appl/blast/wublast.rb +21 -12
- data/lib/bio/appl/blast/xmlparser.rb +180 -183
- data/lib/bio/appl/blat/report.rb +127 -30
- data/lib/bio/appl/clustalw.rb +87 -59
- data/lib/bio/appl/clustalw/report.rb +20 -22
- data/lib/bio/appl/emboss.rb +113 -20
- data/lib/bio/appl/fasta.rb +173 -198
- data/lib/bio/appl/fasta/format10.rb +244 -347
- data/lib/bio/appl/gcg/msf.rb +212 -0
- data/lib/bio/appl/gcg/seq.rb +195 -0
- data/lib/bio/appl/genscan/report.rb +5 -23
- data/lib/bio/appl/hmmer.rb +8 -45
- data/lib/bio/appl/hmmer/report.rb +2 -20
- data/lib/bio/appl/iprscan/report.rb +374 -0
- data/lib/bio/appl/mafft.rb +87 -50
- data/lib/bio/appl/mafft/report.rb +151 -44
- data/lib/bio/appl/muscle.rb +52 -0
- data/lib/bio/appl/phylip/alignment.rb +129 -0
- data/lib/bio/appl/phylip/distance_matrix.rb +96 -0
- data/lib/bio/appl/probcons.rb +41 -0
- data/lib/bio/appl/psort.rb +89 -96
- data/lib/bio/appl/psort/report.rb +6 -22
- data/lib/bio/appl/pts1.rb +263 -0
- data/lib/bio/appl/sim4.rb +26 -36
- data/lib/bio/appl/sim4/report.rb +2 -18
- data/lib/bio/appl/sosui/report.rb +5 -20
- data/lib/bio/appl/spidey/report.rb +2 -2
- data/lib/bio/appl/targetp/report.rb +4 -20
- data/lib/bio/appl/tcoffee.rb +55 -0
- data/lib/bio/appl/tmhmm/report.rb +4 -20
- data/lib/bio/command.rb +235 -64
- data/lib/bio/data/aa.rb +21 -26
- data/lib/bio/data/codontable.rb +2 -20
- data/lib/bio/data/na.rb +19 -4
- data/lib/bio/db.rb +27 -12
- data/lib/bio/db/aaindex.rb +2 -20
- data/lib/bio/db/embl/common.rb +4 -21
- data/lib/bio/db/embl/embl.rb +33 -85
- data/lib/bio/db/embl/sptr.rb +612 -302
- data/lib/bio/db/embl/swissprot.rb +10 -29
- data/lib/bio/db/embl/trembl.rb +10 -29
- data/lib/bio/db/embl/uniprot.rb +10 -29
- data/lib/bio/db/fantom.rb +15 -20
- data/lib/bio/db/fasta.rb +3 -3
- data/lib/bio/db/genbank/common.rb +37 -46
- data/lib/bio/db/genbank/ddbj.rb +6 -18
- data/lib/bio/db/genbank/genbank.rb +47 -186
- data/lib/bio/db/genbank/genpept.rb +4 -17
- data/lib/bio/db/genbank/refseq.rb +4 -17
- data/lib/bio/db/gff.rb +103 -35
- data/lib/bio/db/go.rb +4 -20
- data/lib/bio/db/kegg/brite.rb +26 -36
- data/lib/bio/db/kegg/compound.rb +81 -85
- data/lib/bio/db/kegg/drug.rb +98 -0
- data/lib/bio/db/kegg/enzyme.rb +133 -110
- data/lib/bio/db/kegg/expression.rb +2 -20
- data/lib/bio/db/kegg/genes.rb +208 -238
- data/lib/bio/db/kegg/genome.rb +164 -285
- data/lib/bio/db/kegg/glycan.rb +114 -157
- data/lib/bio/db/kegg/keggtab.rb +242 -303
- data/lib/bio/db/kegg/kgml.rb +117 -160
- data/lib/bio/db/kegg/orthology.rb +112 -0
- data/lib/bio/db/kegg/reaction.rb +54 -69
- data/lib/bio/db/kegg/taxonomy.rb +331 -0
- data/lib/bio/db/lasergene.rb +209 -0
- data/lib/bio/db/litdb.rb +3 -27
- data/lib/bio/db/medline.rb +228 -249
- data/lib/bio/db/nbrf.rb +3 -3
- data/lib/bio/db/newick.rb +510 -0
- data/lib/bio/db/nexus.rb +1854 -0
- data/lib/bio/db/pdb.rb +5 -17
- data/lib/bio/db/pdb/atom.rb +2 -18
- data/lib/bio/db/pdb/chain.rb +2 -18
- data/lib/bio/db/pdb/chemicalcomponent.rb +2 -18
- data/lib/bio/db/pdb/model.rb +2 -18
- data/lib/bio/db/pdb/pdb.rb +73 -34
- data/lib/bio/db/pdb/residue.rb +4 -20
- data/lib/bio/db/pdb/utils.rb +2 -18
- data/lib/bio/db/prosite.rb +403 -422
- data/lib/bio/db/rebase.rb +84 -40
- data/lib/bio/db/soft.rb +404 -0
- data/lib/bio/db/transfac.rb +5 -17
- data/lib/bio/feature.rb +106 -52
- data/lib/bio/io/das.rb +32 -42
- data/lib/bio/io/dbget.rb +2 -20
- data/lib/bio/io/ddbjxml.rb +77 -138
- data/lib/bio/io/ebisoap.rb +158 -0
- data/lib/bio/io/ensembl.rb +229 -0
- data/lib/bio/io/fastacmd.rb +89 -82
- data/lib/bio/io/fetch.rb +163 -96
- data/lib/bio/io/flatfile.rb +170 -73
- data/lib/bio/io/flatfile/bdb.rb +3 -16
- data/lib/bio/io/flatfile/index.rb +2 -2
- data/lib/bio/io/flatfile/indexer.rb +3 -2
- data/lib/bio/io/higet.rb +12 -31
- data/lib/bio/io/keggapi.rb +210 -269
- data/lib/bio/io/ncbisoap.rb +155 -0
- data/lib/bio/io/pubmed.rb +169 -147
- data/lib/bio/io/registry.rb +4 -20
- data/lib/bio/io/soapwsdl.rb +43 -38
- data/lib/bio/io/sql.rb +242 -305
- data/lib/bio/location.rb +407 -285
- data/lib/bio/map.rb +410 -0
- data/lib/bio/pathway.rb +558 -695
- data/lib/bio/reference.rb +272 -75
- data/lib/bio/sequence.rb +255 -13
- data/lib/bio/sequence/aa.rb +71 -10
- data/lib/bio/sequence/common.rb +187 -33
- data/lib/bio/sequence/compat.rb +59 -4
- data/lib/bio/sequence/format.rb +54 -7
- data/lib/bio/sequence/generic.rb +3 -3
- data/lib/bio/sequence/na.rb +328 -26
- data/lib/bio/shell.rb +11 -4
- data/lib/bio/shell/core.rb +221 -160
- data/lib/bio/shell/demo.rb +18 -15
- data/lib/bio/shell/interface.rb +14 -12
- data/lib/bio/shell/irb.rb +95 -0
- data/lib/bio/shell/object.rb +45 -26
- data/lib/bio/shell/plugin/blast.rb +42 -0
- data/lib/bio/shell/plugin/codon.rb +22 -14
- data/lib/bio/shell/plugin/das.rb +58 -0
- data/lib/bio/shell/plugin/emboss.rb +2 -2
- data/lib/bio/shell/plugin/entry.rb +22 -11
- data/lib/bio/shell/plugin/flatfile.rb +2 -2
- data/lib/bio/shell/plugin/keggapi.rb +13 -6
- data/lib/bio/shell/plugin/midi.rb +4 -4
- data/lib/bio/shell/plugin/obda.rb +2 -2
- data/lib/bio/shell/plugin/psort.rb +56 -0
- data/lib/bio/shell/plugin/seq.rb +35 -8
- data/lib/bio/shell/plugin/soap.rb +87 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/bioruby_generator.rb +29 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/_classes.rhtml +4 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/_log.rhtml +27 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/_methods.rhtml +11 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/_modules.rhtml +4 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/_variables.rhtml +7 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby-bg.gif +0 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby-console.png +0 -0
- data/lib/bio/shell/rails/{public/images/icon.png → vendor/plugins/generators/bioruby/templates/bioruby-gem.png} +0 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby-link.gif +0 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby.css +369 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby.rhtml +47 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby_controller.rb +144 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/bioruby_helper.rb +47 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/commands.rhtml +8 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/history.rhtml +10 -0
- data/lib/bio/shell/rails/vendor/plugins/generators/bioruby/templates/index.rhtml +22 -0
- data/lib/bio/shell/script.rb +25 -0
- data/lib/bio/shell/setup.rb +109 -0
- data/lib/bio/shell/web.rb +70 -58
- data/lib/bio/tree.rb +850 -0
- data/lib/bio/util/color_scheme.rb +84 -107
- data/lib/bio/util/color_scheme/buried.rb +5 -24
- data/lib/bio/util/color_scheme/helix.rb +5 -24
- data/lib/bio/util/color_scheme/hydropathy.rb +5 -24
- data/lib/bio/util/color_scheme/nucleotide.rb +5 -24
- data/lib/bio/util/color_scheme/strand.rb +5 -24
- data/lib/bio/util/color_scheme/taylor.rb +5 -24
- data/lib/bio/util/color_scheme/turn.rb +5 -24
- data/lib/bio/util/color_scheme/zappo.rb +5 -24
- data/lib/bio/util/contingency_table.rb +70 -43
- data/lib/bio/util/restriction_enzyme.rb +228 -0
- data/lib/bio/util/restriction_enzyme/analysis.rb +249 -0
- data/lib/bio/util/restriction_enzyme/analysis_basic.rb +217 -0
- data/lib/bio/util/restriction_enzyme/cut_symbol.rb +107 -0
- data/lib/bio/util/restriction_enzyme/double_stranded.rb +321 -0
- data/lib/bio/util/restriction_enzyme/double_stranded/aligned_strands.rb +130 -0
- data/lib/bio/util/restriction_enzyme/double_stranded/cut_location_pair.rb +103 -0
- data/lib/bio/util/restriction_enzyme/double_stranded/cut_location_pair_in_enzyme_notation.rb +38 -0
- data/lib/bio/util/restriction_enzyme/double_stranded/cut_locations.rb +76 -0
- data/lib/bio/util/restriction_enzyme/double_stranded/cut_locations_in_enzyme_notation.rb +107 -0
- data/lib/bio/util/restriction_enzyme/enzymes.yaml +7061 -0
- data/lib/bio/util/restriction_enzyme/range/cut_range.rb +24 -0
- data/lib/bio/util/restriction_enzyme/range/cut_ranges.rb +47 -0
- data/lib/bio/util/restriction_enzyme/range/horizontal_cut_range.rb +67 -0
- data/lib/bio/util/restriction_enzyme/range/sequence_range.rb +257 -0
- data/lib/bio/util/restriction_enzyme/range/sequence_range/calculated_cuts.rb +242 -0
- data/lib/bio/util/restriction_enzyme/range/sequence_range/fragment.rb +51 -0
- data/lib/bio/util/restriction_enzyme/range/sequence_range/fragments.rb +41 -0
- data/lib/bio/util/restriction_enzyme/range/vertical_cut_range.rb +77 -0
- data/lib/bio/util/restriction_enzyme/single_strand.rb +199 -0
- data/lib/bio/util/restriction_enzyme/single_strand/cut_locations_in_enzyme_notation.rb +135 -0
- data/lib/bio/util/restriction_enzyme/single_strand_complement.rb +23 -0
- data/lib/bio/util/restriction_enzyme/string_formatting.rb +111 -0
- data/lib/bio/util/sirna.rb +4 -22
- data/sample/color_scheme_na.rb +4 -12
- data/sample/enzymes.rb +78 -0
- data/sample/goslim.rb +5 -13
- data/sample/psortplot_html.rb +4 -12
- data/test/data/blast/2.2.15.blastp.m7 +876 -0
- data/test/data/embl/AB090716.embl.rel89 +63 -0
- data/test/data/fasta/example1.txt +75 -0
- data/test/data/fasta/example2.txt +21 -0
- data/test/data/iprscan/merged.raw +32 -0
- data/test/data/iprscan/merged.txt +74 -0
- data/test/data/soft/GDS100_partial.soft +92 -0
- data/test/data/soft/GSE3457_family_partial.soft +874 -0
- data/test/functional/bio/io/test_ensembl.rb +103 -0
- data/test/functional/bio/io/test_soapwsdl.rb +5 -17
- data/test/unit/bio/appl/bl2seq/test_report.rb +2 -2
- data/test/unit/bio/appl/blast/test_report.rb +3 -16
- data/test/unit/bio/appl/blast/test_xmlparser.rb +4 -16
- data/test/unit/bio/appl/genscan/test_report.rb +3 -16
- data/test/unit/bio/appl/hmmer/test_report.rb +3 -16
- data/test/unit/bio/appl/iprscan/test_report.rb +338 -0
- data/test/unit/bio/appl/mafft/test_report.rb +63 -0
- data/test/unit/bio/appl/sosui/test_report.rb +3 -16
- data/test/unit/bio/appl/targetp/test_report.rb +3 -16
- data/test/unit/bio/appl/test_blast.rb +3 -16
- data/test/unit/bio/appl/test_fasta.rb +4 -16
- data/test/unit/bio/appl/test_pts1.rb +140 -0
- data/test/unit/bio/appl/tmhmm/test_report.rb +3 -16
- data/test/unit/bio/data/test_aa.rb +4 -17
- data/test/unit/bio/data/test_codontable.rb +3 -16
- data/test/unit/bio/data/test_na.rb +3 -3
- data/test/unit/bio/db/embl/test_common.rb +3 -16
- data/test/unit/bio/db/embl/test_embl.rb +3 -16
- data/test/unit/bio/db/embl/test_embl_rel89.rb +219 -0
- data/test/unit/bio/db/embl/test_sptr.rb +1548 -41
- data/test/unit/bio/db/embl/test_uniprot.rb +3 -16
- data/test/unit/bio/db/kegg/test_genes.rb +3 -16
- data/test/unit/bio/db/pdb/test_pdb.rb +7 -24
- data/test/unit/bio/db/test_aaindex.rb +2 -2
- data/test/unit/bio/db/test_fasta.rb +3 -16
- data/test/unit/bio/db/test_gff.rb +3 -16
- data/test/unit/bio/db/test_lasergene.rb +95 -0
- data/test/unit/bio/db/test_newick.rb +56 -0
- data/test/unit/bio/db/test_nexus.rb +360 -0
- data/test/unit/bio/db/test_prosite.rb +5 -18
- data/test/unit/bio/db/test_rebase.rb +11 -25
- data/test/unit/bio/db/test_soft.rb +138 -0
- data/test/unit/bio/io/test_ddbjxml.rb +5 -17
- data/test/unit/bio/io/test_ensembl.rb +109 -0
- data/test/unit/bio/io/test_fastacmd.rb +3 -16
- data/test/unit/bio/io/test_flatfile.rb +237 -0
- data/test/unit/bio/io/test_soapwsdl.rb +4 -17
- data/test/unit/bio/sequence/test_aa.rb +3 -3
- data/test/unit/bio/sequence/test_common.rb +3 -16
- data/test/unit/bio/sequence/test_compat.rb +3 -16
- data/test/unit/bio/sequence/test_na.rb +29 -3
- data/test/unit/bio/shell/plugin/test_seq.rb +8 -8
- data/test/unit/bio/test_alignment.rb +16 -27
- data/test/unit/bio/test_command.rb +242 -25
- data/test/unit/bio/test_db.rb +3 -16
- data/test/unit/bio/test_feature.rb +4 -16
- data/test/unit/bio/test_location.rb +4 -16
- data/test/unit/bio/test_map.rb +230 -0
- data/test/unit/bio/test_pathway.rb +4 -16
- data/test/unit/bio/test_reference.rb +2 -2
- data/test/unit/bio/test_sequence.rb +7 -19
- data/test/unit/bio/test_shell.rb +3 -16
- data/test/unit/bio/test_tree.rb +593 -0
- data/test/unit/bio/util/restriction_enzyme/analysis/test_calculated_cuts.rb +299 -0
- data/test/unit/bio/util/restriction_enzyme/analysis/test_cut_ranges.rb +103 -0
- data/test/unit/bio/util/restriction_enzyme/analysis/test_sequence_range.rb +240 -0
- data/test/unit/bio/util/restriction_enzyme/double_stranded/test_aligned_strands.rb +100 -0
- data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_location_pair.rb +75 -0
- data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_location_pair_in_enzyme_notation.rb +73 -0
- data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_locations.rb +53 -0
- data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_locations_in_enzyme_notation.rb +104 -0
- data/test/unit/bio/util/restriction_enzyme/single_strand/test_cut_locations_in_enzyme_notation.rb +83 -0
- data/test/unit/bio/util/restriction_enzyme/test_analysis.rb +246 -0
- data/test/unit/bio/util/restriction_enzyme/test_cut_symbol.rb +44 -0
- data/test/unit/bio/util/restriction_enzyme/test_double_stranded.rb +115 -0
- data/test/unit/bio/util/restriction_enzyme/test_single_strand.rb +147 -0
- data/test/unit/bio/util/restriction_enzyme/test_single_strand_complement.rb +147 -0
- data/test/unit/bio/util/restriction_enzyme/test_string_formatting.rb +60 -0
- data/test/unit/bio/util/test_color_scheme.rb +6 -18
- data/test/unit/bio/util/test_contingency_table.rb +6 -18
- data/test/unit/bio/util/test_restriction_enzyme.rb +42 -0
- data/test/unit/bio/util/test_sirna.rb +3 -16
- metadata +228 -169
- data/doc/BioRuby.rd.ja +0 -225
- data/doc/Design.rd.ja +0 -341
- data/doc/TODO.rd.ja +0 -138
- data/lib/bio/appl/fasta/format6.rb +0 -37
- data/lib/bio/db/kegg/cell.rb +0 -88
- data/lib/bio/db/kegg/ko.rb +0 -178
- data/lib/bio/shell/rails/Rakefile +0 -10
- data/lib/bio/shell/rails/app/controllers/application.rb +0 -4
- data/lib/bio/shell/rails/app/controllers/shell_controller.rb +0 -94
- data/lib/bio/shell/rails/app/helpers/application_helper.rb +0 -3
- data/lib/bio/shell/rails/app/models/shell_connection.rb +0 -30
- data/lib/bio/shell/rails/app/views/layouts/shell.rhtml +0 -37
- data/lib/bio/shell/rails/app/views/shell/history.rhtml +0 -5
- data/lib/bio/shell/rails/app/views/shell/index.rhtml +0 -2
- data/lib/bio/shell/rails/app/views/shell/show.rhtml +0 -13
- data/lib/bio/shell/rails/config/boot.rb +0 -19
- data/lib/bio/shell/rails/config/database.yml +0 -85
- data/lib/bio/shell/rails/config/environment.rb +0 -53
- data/lib/bio/shell/rails/config/environments/development.rb +0 -19
- data/lib/bio/shell/rails/config/environments/production.rb +0 -19
- data/lib/bio/shell/rails/config/environments/test.rb +0 -19
- data/lib/bio/shell/rails/config/routes.rb +0 -19
- data/lib/bio/shell/rails/doc/README_FOR_APP +0 -2
- data/lib/bio/shell/rails/public/404.html +0 -8
- data/lib/bio/shell/rails/public/500.html +0 -8
- data/lib/bio/shell/rails/public/dispatch.cgi +0 -10
- data/lib/bio/shell/rails/public/dispatch.fcgi +0 -24
- data/lib/bio/shell/rails/public/dispatch.rb +0 -10
- data/lib/bio/shell/rails/public/favicon.ico +0 -0
- data/lib/bio/shell/rails/public/images/rails.png +0 -0
- data/lib/bio/shell/rails/public/index.html +0 -277
- data/lib/bio/shell/rails/public/javascripts/controls.js +0 -750
- data/lib/bio/shell/rails/public/javascripts/dragdrop.js +0 -584
- data/lib/bio/shell/rails/public/javascripts/effects.js +0 -854
- data/lib/bio/shell/rails/public/javascripts/prototype.js +0 -1785
- data/lib/bio/shell/rails/public/robots.txt +0 -1
- data/lib/bio/shell/rails/public/stylesheets/main.css +0 -187
- data/lib/bio/shell/rails/script/about +0 -3
- data/lib/bio/shell/rails/script/breakpointer +0 -3
- data/lib/bio/shell/rails/script/console +0 -3
- data/lib/bio/shell/rails/script/destroy +0 -3
- data/lib/bio/shell/rails/script/generate +0 -3
- data/lib/bio/shell/rails/script/performance/benchmarker +0 -3
- data/lib/bio/shell/rails/script/performance/profiler +0 -3
- data/lib/bio/shell/rails/script/plugin +0 -3
- data/lib/bio/shell/rails/script/process/reaper +0 -3
- data/lib/bio/shell/rails/script/process/spawner +0 -3
- data/lib/bio/shell/rails/script/process/spinner +0 -3
- data/lib/bio/shell/rails/script/runner +0 -3
- data/lib/bio/shell/rails/script/server +0 -42
- 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
|