biojs-io-clustal
Version:
Parses clustal files
71 lines (66 loc) • 1.88 kB
JavaScript
// Generated by CoffeeScript 1.8.0
var Clustal, GenericReader, st;
GenericReader = require("biojs-io-parser");
st = require("msa-seqtools");
module.exports = Clustal = {
parse: function(text) {
var blockstate, cSeq, k, keys, label, line, lines, match, obj, regex, seqCounter, seqs, sequence;
seqs = [];
if (Object.prototype.toString.call(text) === '[object Array]') {
lines = text;
} else {
lines = text.split("\n");
}
if (lines[0].slice(0, 6) === !"CLUSTAL") {
throw new Error("Invalid CLUSTAL Header");
}
k = 0;
blockstate = 1;
seqCounter = 0;
while (k < lines.length) {
k++;
line = lines[k];
if ((line == null) || line.length === 0) {
blockstate = 1;
continue;
}
if (line.trim().length === 0) {
blockstate = 1;
continue;
} else {
if (st.contains(line, "*")) {
continue;
}
if (blockstate === 1) {
seqCounter = 0;
blockstate = 0;
}
regex = /^(?:\s*)(\S+)(?:\s+)(\S+)(?:\s*)(\d*)(?:\s*|$)/g;
match = regex.exec(line);
if (match != null) {
label = match[1];
sequence = match[2];
if (seqCounter >= seqs.length) {
obj = st.getMeta(label);
label = obj.name;
cSeq = new st.model(sequence, label, seqCounter);
cSeq.ids = obj.ids || {};
cSeq.details = obj.details || {};
keys = Object.keys(cSeq.ids);
if (keys.length > 0) {
cSeq.id = cSeq.ids[keys[0]];
}
seqs.push(cSeq);
} else {
seqs[seqCounter].seq += sequence;
}
seqCounter++;
} else {
console.log("parse error", line);
}
}
}
return seqs;
}
};
GenericReader.mixin(Clustal);