Bioinformatics/Sequence mutation: Difference between revisions

Content added Content deleted
(Added Wren)
Line 1,412: Line 1,412:
Total 502
Total 502
</pre>
</pre>

=={{header|Nim}}==
<lang Nim>import random
import strformat
import strutils

type
# Enumeration type for bases.
Base {.pure.} = enum A, C, G, T, Other = "other"

# Sequence of bases.
DnaSequence = seq[Base]

# Kind of mutation.
Mutation = enum mutSwap, mutDelete, mutInsert

#---------------------------------------------------------------------------------------------------

proc newDnaSeq(length: Natural): DnaSequence =
## Create a DNA sequence of given length.

result = newSeqOfCap[Base](length)
for _ in 1..length:
result.add(Base(rand(3)))

#---------------------------------------------------------------------------------------------------

proc mutate(dnaSeq: var DnaSequence) =
## Mutate a sequence (it is changed in place).

# Choose randomly the position of mutation.
let idx = rand(dnaSeq.high)

# Choose randomly the kind of mutation.
let mut = Mutation(rand(ord(Mutation.high)))

# Apply the mutation.
case mut

of mutSwap:
let newBase = Base(rand(ord(Base.Other) - 1))
echo fmt"Changing base at position {idx + 1} from {dnaSeq[idx]} to {newBase}"
dnaSeq[idx] = newBase

of mutDelete:
echo fmt"Deleting base {dnaSeq[idx]} at position {idx + 1}"
dnaSeq.delete(idx)

of mutInsert:
let newBase = Base(rand(ord(Base.Other) - 1))
echo fmt"Inserting base {newBase} at position {idx + 1}"
dnaSeq.insert(newBase, idx)

#---------------------------------------------------------------------------------------------------

proc display(dnaSeq: DnaSequence) =
## Display a DNA sequence using EMBL format.

var counts: array[Base, Natural] # Count of bases.
for base in dnaSeq:
inc counts[base]

# Display the SQ line.
var sqline = fmt"SQ {dnaSeq.len} BP; "
for (base, count) in counts.pairs:
sqline &= fmt"{count} {base}; "
echo sqline

# Display the sequence.
var idx = 0
var row = newStringOfCap(80)
var remaining = dnaSeq.len

while remaining > 0:
row.setLen(0)
row.add(" ")

# Add groups of 10 bases.
for group in 1..6:
let nextIdx = idx + min(10, remaining)
for i in idx..<nextIdx:
row.add($dnaSeq[i])
row.add(' ')
dec remaining, nextIdx - idx
idx = nextIdx
if remaining == 0:
break

# Append the number of the last base in the row.
row.add(spaces(72 - row.len))
row.add(fmt"{idx:>8}")
echo row

# Add termination.
echo "//"

#———————————————————————————————————————————————————————————————————————————————————————————————————

randomize()
var dnaSeq = newDnaSeq(200)
echo "Initial sequence"
echo "———————————————\n"
dnaSeq.display()

echo "\nMutations"
echo "—————————\n"
for _ in 1..10:
dnaSeq.mutate()

echo "\nMutated sequence"
echo "————————————————\n"
dnaSeq.display()</lang>

{{out}}
<pre>Initial sequence
———————————————

SQ 200 BP; 53 A; 52 C; 45 G; 50 T; 0 other;
ATGGATAGAA TGGCACCTCA GTGTCACATG TCCTAGGCAC ATTCTACGTA CTAGTTTCTG 60
GAGGTCGATA AATACAAGAT GGAATACTCT TATCAACCGC TAGCAATGAA ACTTAGATAG 120
CCACCCCTCG ATCGCGGTTC GCTATGCGGC ATCGTCAACT GCGTCAAAGC ACTACGTCGT 180
TTCGTGACTG CCAGTCGAGC 200
//

Mutations
—————————

Inserting base A at position 121
Changing base at position 101 from T to G
Deleting base A at position 115
Changing base at position 126 from C to G
Deleting base T at position 155
Deleting base G at position 198
Deleting base T at position 159
Changing base at position 144 from A to T
Inserting base C at position 34
Changing base at position 127 from G to G

Mutated sequence
————————————————

SQ 198 BP; 52 A; 52 C; 46 G; 48 T; 0 other;
ATGGATAGAA TGGCACCTCA GTGTCACATG TCCCTAGGCA CATTCTACGT ACTAGTTTCT 60
GGAGGTCGAT AAATACAAGA TGGAATACTC TTATCAACCG CGAGCAATGA AACTTGATAG 120
ACCACCGCTC GATCGCGGTT CGCTTTGCGG CATCGCAACG CGTCAAAGCA CTACGTCGTT 180
TCGTGACTGC CAGTCGAC 198
//</pre>


=={{header|Perl}}==
=={{header|Perl}}==