Skip to content

Instantly share code, notes, and snippets.

@Wanagram
Last active April 29, 2016 14:23
Show Gist options
  • Save Wanagram/0b2fc1de581870e9c573c5a203d3b293 to your computer and use it in GitHub Desktop.
Save Wanagram/0b2fc1de581870e9c573c5a203d3b293 to your computer and use it in GitHub Desktop.
//The two sequences to compare
var sequence1 = "ATGCGAATCGC"
var sequence2 = "ATCCTACCG"
//Creates multi-dimensional array dependent on sequence lengths
var arr = new Array(sequence2.length + 1)
for (i = 0; i < sequence2.length + 1; i++) {
arr[i] = new Array(sequence1.length + 1);
}
//Fills array with 0s
for (i = 0; i < arr.length; i++) {
var col = i;
for (j = 0; j < arr[col].length; j++) {
arr[col][j] = 0;
}
}
//Matrix Fill
for (i = 1; i < arr.length; i++) {
var col = i;
for (j = 1; j < sequence1.length + 1; j++) {
arr[col][j] = -10000
if (arr[col][j - 1] - 2 > arr[col][j]) {
arr[col][j] = arr[col][j - 1] - 2;
}
if (arr[col - 1][j] - 2 > arr[col][j]) {
arr[col][j] = arr[col - 1][j] - 2;
}
var match = 0;
if (sequence2[col - 1] == sequence1[j - 1]) {
match = 2;
} else {
match = -1;
}
if ((arr[col - 1][j - 1] + match) > arr[col][j]) {
arr[col][j] = (arr[col - 1][j - 1]) + match;
}
}
}
console.table(arr);
//Declares traceback array and pushObject function
var traceback = [];
var pushObj = function(value, direction, seq2, seq1, div) {
traceback.push({
pos: value,
dir: direction,
seq2: seq2,
seq1: seq1
})
}
//Traceback
Col = arr.length - 1;
Row = sequence1.length;
function tracefunc(traceCol, traceRow) {
if (traceCol > 0 && traceRow > 0) {
if (sequence2[traceCol - 1] == sequence1[traceRow - 1]) {
pushObj(arr[traceCol][traceRow], "diag", sequence2[traceCol - 1], sequence1[traceRow - 1]);
tracefunc(traceCol - 1, traceRow - 1);
} else if (arr[traceCol][traceRow] == ((arr[traceCol - 1][traceRow]) - 2)) {
pushObj(arr[traceCol][traceRow], "up", sequence2[traceCol - 1], "_");
tracefunc(traceCol - 1, traceRow);
} else if (arr[traceCol][traceRow] == ((arr[traceCol][traceRow - 1]) - 2)) {
pushObj(arr[traceCol][traceRow], "left", "_", sequence1[traceRow - 1]);
tracefunc(traceCol, traceRow - 1);
} else {
pushObj(arr[traceCol][traceRow], "diag", "m", "m")
tracefunc(traceCol - 1, traceRow - 1);
}
} else if (traceCol > 0) {
pushObj(arr[traceCol][traceRow], "up", sequence2[traceCol - 1], "_")
tracefunc(traceCol - 1, traceRow);
} else if (traceRow > 0) {
pushObj(arr[traceCol][traceRow], "left", "_", sequence1[traceRow - 1]);
tracefunc(traceCol, traceRow - 1);
}
}
tracefunc(Col, Row);
//Console.log results
var align1 = "";
var align2 = "";
for (i = 0; i < traceback.length; i++) {
align1 = traceback[i].seq1 + align1;
align2 = traceback[i].seq2 + align2;
}
console.log(align1)
console.log(align2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment