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 numBases = 250
const numMutations = 30
const numMutations = 30
const bases = ['A', 'C', 'G', 'T'];
const bases = ['A', 'C', 'G', 'T'];


// Utility functions
// Utility functions
const copy = arr => [...arr];
const copy = arr => [...arr];


const randTo = max => () => (Math.random() * max) | 0;
const randTo = max => (Math.random() * max) | 0;


const randSelect = arr => {
const randBasePos = randTo(bases.length);
const at = randTo(arr.length);
return [arr[at], at];
}


const randBase = () => bases[randBasePos()];
const getVars = (seq, bases) => {
const [newBase, _] = randSelect(bases);
const [extBase, randPos] = randSelect(seq);
return [newBase, extBase, randPos];
}


const leftPadN = n => v => {
const leftPadN = n => v => {
const arr = [...('' + v)];
const arr = [...('' + v)];
const short = n - arr.length;
const short = n - arr.length;
return short ? [...(Array(short).fill(' ')), ...arr].join('') : arr.join('');
return short ? [...(Array(short).fill(' ')), ...arr].join('') : arr.join('');
}
}


const filterCount = arr => s => arr.filter(e => e === s).length;
const filterCount = arr => s => arr.filter(e => e === s).length;


// Pretty Print functions
// Pretty Print functions
const prettyPrint = seq => {
const prettyPrint = seq => {
let idx = 0;
let idx = 0;
const pad = leftPadN(4);
const pad = leftPadN(4);
const print = (v, s) => console.log(`${pad(v)}:\t${s}`)
const print = (v, s) => console.log(`${pad(v)}:\t${s}`)
const rem = seq.reduce((p,c) => {
const rem = seq.reduce((p,c) => {
const s = p + c;
const s = p + c;
if (s.length === 50) {
if (s.length === 50) {
print(idx, s);
print(idx, s);
idx = idx + 50;
idx = idx + 50;
return '';
return '';
}
return s;
}, '');
if (rem !== '') {
print(idx, rem);
}
}
return s;
}, '');
if (rem !== '') {
print(idx, rem);
}
}
}


const printBases = seq => {
const printBases = seq => {
const filterSeq = filterCount(seq);
const filterSeq = filterCount(seq);
const pad = leftPadN(4);
const pad = leftPadN(4);
const print = (v, n) => console.log(`${pad(v)}:\t${n}`)
const print = (v, n) => console.log(`${pad(v)}:\t${n}`)
let tot = 0;
let tot = 0;
bases.forEach(e => {
bases.forEach(e => {
const cnt = filterSeq(e);
const cnt = filterSeq(e);
print(e, cnt);
print(e, cnt);
tot = tot + cnt;
tot = tot + cnt;
})
})
print('Σ', tot);
print('Σ', tot);
}
}


// Mutations definitions
const select = seq => {
const randPos = randTo(seq.length)();
const swap = ([hist, seq]) => {
const extBase = seq[randPos];
const arr = copy(seq);
const newBase = randBase();
const [newBase, extBase, randPos] = getVars(arr, bases);
return [randPos, extBase, newBase];
arr.splice(randPos, 1, newBase);
return [[...hist, `Swapped ${extBase} for ${newBase} at ${randPos}`], arr];
}
};


const del = ([hist, seq]) => {
// Mutations definitions
const swap = ([hist, seq]) => {
const arr = copy(seq);
const [newBase, extBase, randPos] = getVars(arr, bases);
const arr = copy(seq);
const [randPos, extBase, newBase] = select(arr);
arr.splice(randPos, 1);
return [[...hist, `Deleted ${extBase} at ${randPos}`], arr];
arr.splice(randPos, 1, newBase);
}
const opp = `Swapped ${extBase} for ${newBase} at ${randPos}`;
return [[...hist, opp], arr];
};


const del = ([hist, seq]) => {
const insert = ([hist, seq]) => {
const arr = copy(seq);
const arr = copy(seq);
const [randPos, extBase, _] = select(arr);
const [newBase, extBase, randPos] = getVars(arr, bases);
arr.splice(randPos, 0, newBase);
const opp = `Deleted ${extBase} at ${randPos}`;
arr.splice(randPos, 1);
return [[...hist, `Inserted ${newBase} at ${randPos}`], arr];
}
return [[...hist, opp], arr];
}


const insert = ([hist, seq]) => {
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
// Create the starting sequence
const seq = Array(numBases).fill(undefined).map(randBase);
const seq = Array(numBases).fill(undefined).map(
() => randSelect(bases)[0]);


// Create a set of mutations
// Create a set of mutations
const mutations = Array(numMutations).fill(undefined).map(
const operations = [swap, del, insert];
const randMutate = randTo(operations.length);
() => randSelect(operations)[0]);
const randomMutation = () => operations[randMutate()];
const mutations = Array(numMutations).fill(undefined).map(randomMutation);


// Mutate the sequence
// Mutate the sequence
const [hist, mut] = mutations.reduce((p,c,i) => c(p), [[], seq]);
const [hist, mut] = mutations.reduce((p,c,i) => c(p), [[], seq]);


console.log('ORIGINAL SEQUENCE:')
console.log('ORIGINAL SEQUENCE:')
prettyPrint(seq);
prettyPrint(seq);


console.log('\nBASE COUNTS:')
console.log('\nBASE COUNTS:')
printBases(seq);
printBases(seq);


console.log('\nMUTATION LOG:')
console.log('\nMUTATION LOG:')
hist.forEach((e,i) => console.log(`${i}:\t${e}`));
hist.forEach((e,i) => console.log(`${i}:\t${e}`));


console.log('\nMUTATED SEQUENCE:')
console.log('\nMUTATED SEQUENCE:')
prettyPrint(mut);
prettyPrint(mut);


console.log('\nMUTATED BASE COUNTS:')
console.log('\nMUTATED BASE COUNTS:')
printBases(mut);
printBases(mut);
</lang>
</lang>

{{out}}
{{out}}
<pre>
<pre>