UNPKG

siafun

Version:
64 lines (63 loc) 2.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const _ = require("lodash"); const arrayutils_1 = require("arrayutils"); const similarity_1 = require("./similarity"); var TRACES; (function (TRACES) { TRACES[TRACES["NONE"] = 0] = "NONE"; TRACES[TRACES["DIAGONAL"] = 1] = "DIAGONAL"; TRACES[TRACES["UP"] = 2] = "UP"; TRACES[TRACES["LEFT"] = 3] = "LEFT"; })(TRACES = exports.TRACES || (exports.TRACES = {})); exports.GAP_SCORE = -5; class SmithWaterman { //if similarity threshold is null, equality is enforced constructor(similarityTreshold = null) { this.similarityTreshold = similarityTreshold; this.matchScore = 3; this.mismatchScore = -2; this.gapScore = exports.GAP_SCORE; } run(seq1, seq2, ignoredPoints = new Set()) { ignoredPoints = _.clone(ignoredPoints); //ignore diagonal if sequences equal if (_.isEqual(seq1, seq2)) { seq1.map((_e, i) => ignoredPoints.add(i + "," + i)); } return this.internalRun(seq1, seq2, ignoredPoints); } internalRun(seq1, seq2, ignoredPoints) { let scoreMatrix = seq1.map(s => seq2.map(t => 0)); let traceMatrix = seq1.map(s => seq2.map(t => 0)); seq1.forEach((s1, i) => { seq2.forEach((s2, j) => { let d_last = i > 0 && j > 0 ? scoreMatrix[i - 1][j - 1] : 0; let u_last = i > 0 ? scoreMatrix[i - 1][j] : 0; let l_last = j > 0 ? scoreMatrix[i][j - 1] : 0; //here we don't give scores for self alignment!! hence i != j let notIgnored = !ignoredPoints.has(i + "," + j); let d_new = d_last + (notIgnored && this.isSimilar(s1, s2) ? this.matchScore : this.mismatchScore); let u_new = u_last + this.gapScore; let l_new = l_last + this.gapScore; //ORDER NEEDS TO CORRESPOND TO TRACES ENUM ABOVE!!!! let options = [0, d_new, u_new, l_new]; scoreMatrix[i][j] = _.max(options); let trace = arrayutils_1.indexOfMax(options); traceMatrix[i][j] = trace; }); }); //console.log(JSON.stringify(scoreMatrix)) return { scoreMatrix: scoreMatrix, traceMatrix: traceMatrix }; } //negative similarityTreshold interpreted as min intersection ratio isSimilar(v1, v2) { return (this.similarityTreshold > 0 && similarity_1.getCosineSimilarity(v1, v2) >= this.similarityTreshold) || (this.similarityTreshold < 0 && this.intersect(v1, v2) >= -1 * this.similarityTreshold) || _.isEqual(v1, v2); } intersect(v1, v2) { return _.intersection(v1, v2).length / v1.length; } } exports.SmithWaterman = SmithWaterman;