Skip to content

Instantly share code, notes, and snippets.

@adamloo85
Created July 31, 2014 21:16
Show Gist options
  • Save adamloo85/20bce855a3d9cc98e73f to your computer and use it in GitHub Desktop.
Save adamloo85/20bce855a3d9cc98e73f to your computer and use it in GitHub Desktop.

Revisions

  1. adamloo85 created this gist Jul 31, 2014.
    59 changes: 59 additions & 0 deletions DNA_search.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,59 @@
    # Author: Adam Loo
    # Date: 7/31/2014
    # A short script that takes a DNA strand, does a pattern search and returns
    # the indexes of all matches.

    STRAND = "aggcgtatgcgatcctgaccatgcaaaactccagcgtaaatacctagccatggcgacacaaggcgcaaga" +
    "caggagatgacggcgtttagatcggcgaaatattaaagcaaacgacgatgacttcttcgggaaattagttccctactcgt" +
    "gtactccaattagccataacactgttcgtcaagatatagggggtcacccatgaatgtcctctaaccagaccatttcgtta" +
    "cacgaacgtatctgatgacttcttcgggaaattagttccctactcgtgtactccaattagccataacactgttcgtcaag" +
    "atatagggggtcacccatgaatgtcctctaaccagaccatttcgttacacgaacgtatcttcggggcgtatgcgatcctg" +
    "accatgcaaaactccagcgtaaatacctagccatggcgacacaaggcgcaagacaggagatgacggcgtttagatcggcg" +
    "aaatattaaagcaaacgacgatgacttcttcgggaaattagttccctactcgtgtactccaattagccataacactgttc" +
    "gtcaagatatagggggtcacccatgaatgtcctctaaccagaccatttcgttacacgaacgtatctgatgacttcttcgg" +
    "gaaattagttccctactcgtgtactccaattagccataacactgttcgtcaagatatagggggtcacccatgaatgtcct" +
    "ctaaccagaccatttcgttacacgaacgtatcttcggggcgtatgcgatgaaattagttccctactcgtgtactccaatt" +
    "agccataacactgttcgtcaagatatagggggtcacccatgaatgtcctctaaccagaccatttcgttacacgaacgtat" +
    "ctgatgacttcttcgggaaattagttccctactcgtgtactccaattagccataacactgttcgtcaagatatagggggt" +
    "cacccatgaatgtcctctaaccagaccatttcgttacacgaacgtatcttcggggcgtat"

    PATTERN = "ctccag"

    def reverse_strand(strand, out = '')
    reverse = strand.reverse
    # DNA opposites
    key = {
    a: 't',
    t: 'a',
    c: 'g',
    g: 'c'
    }
    reverse.length.times do |i|
    out += key[reverse[i].to_sym]
    end

    return out
    end

    def search_strand(strand, pattern)
    out = {
    pattern: pattern,
    matches: []
    }

    strand.length.times do |i|
    new_pattern = strand[i...i+pattern.length]
    if new_pattern == pattern
    out[:matches] << {start: i, finish: i+pattern.length}
    end
    end

    return out
    end

    puts "Direct: #{search_strand(STRAND, PATTERN)}"
    puts "Reverse: #{search_strand(reverse_strand(STRAND), PATTERN)}"

    # =>
    # Direct: {:pattern=>"ctccag", :matches=>[{:start=>28, :finish=>34}, {:start=>401, :finish=>407}]}
    # Reverse: {:pattern=>"ctccag", :matches=>[]}