Skip to content

Instantly share code, notes, and snippets.

@miguelraz
Last active August 19, 2018 15:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save miguelraz/7645239f97a5a19cc196bdd55ed6b4e8 to your computer and use it in GitHub Desktop.
Save miguelraz/7645239f97a5a19cc196bdd55ed6b4e8 to your computer and use it in GitHub Desktop.
# Create a 4 bit DNA/RNA sequence from a 2 bit DNA/RNA sequence, and vice-versa.
function BioSequence{DNAAlphabet{N}}(seq::BioSequence{DNAAlphabet{M}}) where {N<:Int,M<:Int}
@assert N == 4 && M == 2
newseq = BioSequence{DNAAlphabet{4}}(length(seq))
for (i, x) in enumerate(seq)
unsafe_setindex!(newseq, x, i)
end
return newseq
end
function BioSequence{DNAAlphabet{M}}(seq::BioSequence{DNAAlphabet{N}}) where {N<:Int, M<:Int}
@assert N == 4 && M == 2
newseq = BioSequence{DNAAlphabet{2}}(length(seq))
for (i, x) in enumerate(seq)
unsafe_setindex!(newseq, x, i)
end
return newseq
end
function BioSequence{RNAAlphabet{N}}(seq::BioSequence{RNAAlphabet{M}}) where {N<:Int, M<:Int}
@assert N == 4 && M == 2
newseq = BioSequence{RNAAlphabet{4}}(length(seq))
for (i, x) in enumerate(seq)
unsafe_setindex!(newseq, x, i)
end
return newseq
end
function BioSequence{RNAAlphabet{M}}(seq::BioSequence{RNAAlphabet{N}}) where {N<:Int, M<:Int}
@assert N == 4 && M == 2
newseq = BioSequence{RNAAlphabet{2}}(length(seq))
for (i, x) in enumerate(seq)
unsafe_setindex!(newseq, x, i)
end
return newseq
end
function BioSequence{DNAAlphabet{M}}(seq::BioSequence{RNAAlphabet{M}}) where M<:Int
@assert M == 2
newseq = BioSequence{DNAAlphabet{2}}(seq.data, seq.part, true)
seq.shared = true
return newseq
end
function BioSequence{RNAAlphabet{M}}(seq::BioSequence{DNAAlphabet{M}}) where M<:Int
@assert M == 2
newseq = BioSequence{RNAAlphabet{2}}(seq.data, seq.part, true)
seq.shared = true
return newseq
end
function BioSequence{DNAAlphabet{N}}(seq::BioSequence{RNAAlphabet{N}}) where N<:Int
@assert N == 4
newseq = BioSequence{DNAAlphabet{4}}(seq.data, seq.part, true)
seq.shared = true
return newseq
end
function BioSequence{RNAAlphabet{N}}(seq::BioSequence{DNAAlphabet{N}}) where N<:Int
@assert N == 4
newseq = BioSequence{RNAAlphabet{4}}(seq.data, seq.part, true)
seq.shared = true
return newseq
end
function Base.repeat(chunk::BioSequence{A}, n::Integer) where {A<:Alphabet}
seq = BioSequence{A}(length(chunk) * n)
offset = 1
for _ in 1:n
copyto!(seq, offset, chunk, 1)
offset += length(chunk)
end
return seq
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment