Bioinformatics/Sequence mutation: Difference between revisions
Content added Content deleted
Line 1,301: | Line 1,301: | ||
=={{header|JavaScript}}== |
=={{header|JavaScript}}== |
||
<lang javascript>// Basic set-up |
<lang javascript>// Basic set-up |
||
const numBases = 250 |
|||
const numMutations = 30 |
|||
const bases = ['A', 'C', 'G', 'T']; |
|||
// Utility functions |
|||
const copy = arr => [...arr]; |
|||
const randTo = max => (Math.random() * max) | 0; |
|||
⚫ | |||
const |
const at = randTo(arr.length); |
||
⚫ | |||
} |
|||
const getVars = (seq, bases) => { |
|||
const [newBase, _] = randSelect(bases); |
|||
const [extBase, randPos] = randSelect(seq); |
|||
return [newBase, extBase, randPos]; |
|||
} |
|||
const leftPadN = n => v => { |
|||
const arr = [...('' + v)]; |
|||
const short = n - arr.length; |
|||
return short ? [...(Array(short).fill(' ')), ...arr].join('') : arr.join(''); |
|||
} |
|||
const filterCount = arr => s => arr.filter(e => e === s).length; |
|||
// Pretty Print functions |
|||
const prettyPrint = seq => { |
|||
let idx = 0; |
|||
const pad = leftPadN(4); |
|||
const print = (v, s) => console.log(`${pad(v)}:\t${s}`) |
|||
const rem = seq.reduce((p,c) => { |
|||
const s = p + c; |
|||
if (s.length === 50) { |
|||
print(idx, s); |
|||
idx = idx + 50; |
|||
return ''; |
|||
} |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
} |
} |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
} |
} |
||
} |
|||
const printBases = seq => { |
|||
const filterSeq = filterCount(seq); |
|||
const pad = leftPadN(4); |
|||
const print = (v, n) => console.log(`${pad(v)}:\t${n}`) |
|||
let tot = 0; |
|||
bases.forEach(e => { |
|||
const cnt = filterSeq(e); |
|||
print(e, cnt); |
|||
tot = tot + cnt; |
|||
}) |
|||
print('Σ', tot); |
|||
} |
|||
⚫ | |||
⚫ | |||
const swap = ([hist, seq]) => { |
|||
const arr = copy(seq); |
|||
const [newBase, extBase, randPos] = getVars(arr, bases); |
|||
arr.splice(randPos, 1, newBase); |
|||
⚫ | |||
} |
|||
⚫ | |||
const del = ([hist, seq]) => { |
|||
⚫ | |||
const |
const arr = copy(seq); |
||
const [newBase, extBase, randPos] = getVars(arr, bases); |
|||
const arr = copy(seq); |
|||
arr.splice(randPos, 1); |
|||
⚫ | |||
⚫ | |||
} |
|||
⚫ | |||
⚫ | |||
⚫ | |||
const insert = ([hist, seq]) => { |
|||
const arr = copy(seq); |
|||
const [newBase, extBase, randPos] = getVars(arr, bases); |
|||
⚫ | |||
⚫ | |||
return [[...hist, `Inserted ${newBase} at ${randPos}`], arr]; |
|||
} |
|||
return [[...hist, opp], arr]; |
|||
} |
|||
const operations = [swap, del, insert]; |
|||
const arr = copy(seq); |
|||
const [randPos, _, newBase] = select(arr); |
|||
const opp = `Inserted ${newBase} at ${randPos}`; |
|||
arr.splice(randPos, 0, newBase); |
|||
return [[...hist, opp], arr]; |
|||
} |
|||
// Create the starting sequence |
|||
const seq = Array(numBases).fill(undefined).map( |
|||
() => randSelect(bases)[0]); |
|||
// Create a set of mutations |
|||
⚫ | |||
const operations = [swap, del, insert]; |
|||
() => randSelect(operations)[0]); |
|||
const randomMutation = () => operations[randMutate()]; |
|||
⚫ | |||
// Mutate the sequence |
|||
const [hist, mut] = mutations.reduce((p,c,i) => c(p), [[], seq]); |
|||
console.log('ORIGINAL SEQUENCE:') |
|||
prettyPrint(seq); |
|||
console.log('\nBASE COUNTS:') |
|||
printBases(seq); |
|||
console.log('\nMUTATION LOG:') |
|||
hist.forEach((e,i) => console.log(`${i}:\t${e}`)); |
|||
console.log('\nMUTATED SEQUENCE:') |
|||
prettyPrint(mut); |
|||
console.log('\nMUTATED BASE COUNTS:') |
|||
printBases(mut); |
|||
</lang> |
</lang> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |