-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
115 lines (102 loc) · 2.47 KB
/
index.js
File metadata and controls
115 lines (102 loc) · 2.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/**
@class SequenceTransform
@module Sequence
@submodule SequenceCanvas
@static
**/
import SynbioData from 'gentle-utils/synbio_data';
import _ from 'underscore';
var iupacToBasesMap, toComplementsMap,
codonToAALongMap, codonToAAShortMap,
SequenceTransforms;
SequenceTransforms = SequenceTransforms || {};
toComplementsMap = {
'A': 'T',
'C': 'G',
'T': 'A',
'G': 'C',
'N': 'N',
'R': 'Y',
'Y': 'R',
'S': 'S',
'W': 'W',
'K': 'M',
'M': 'K',
'B': 'V',
'V': 'B',
'D': 'H'
};
/**
@method codonToAALong
@params {String} codon
@returns {String} long-form amino acid
**/
var codonToAALong = function(codon) {
if(codonToAALongMap === undefined) {
codonToAALongMap = [];
_.each(SynbioData.aa, (aa) => {
_.each(aa.codons, (codon) => {
codonToAALongMap[codon] = aa.long || ' ';
});
});
}
return codonToAALongMap[codon];
};
/**
@method codonToAAShort
@params {String} codon
@returns {String} short-form amino acid
**/
var codonToAAShort = function(codon) {
if(codonToAAShortMap === undefined) {
codonToAAShortMap = [];
_.each(SynbioData.aa, function(aa) {
_.each(aa.codons, function(codon) {
codonToAAShortMap[codon] = ' ' + (aa.short || ' ') + ' ';
});
});
}
return codonToAAShortMap[codon];
};
/**
@method toComplements
@params {String} sequence
@returns {String} sequence complement
**/
var toComplements = function(sequence) {
var map = toComplementsMap;
return _.map(sequence.split(''), (base) => map[base] || ' ').join('');
};
var toReverseComplements = function(sequence) {
var o = '';
for (var i = sequence.length - 1; i >= 0; i--)
o += toComplementsMap[sequence[i]];
return o;
};
var iupacToBases = _.memoize(function(sequence) {
var output = sequence;
iupacToBasesMap = iupacToBasesMap || _.invert(SynbioData.bases2iupac);
_.each(iupacToBasesMap, function(bases, iupac) {
output = output.replace(new RegExp(iupac, 'gi'), bases);
});
return output;
});
var isPalindromic = function(sequence) {
return sequence == toReverseComplements(sequence);
};
var areComplementary = function(sequence1, sequence2) {
// TODO: support partial complementary sequences
if(sequence1.length !== sequence2.length) return false;
return !_.find(sequence1, function(base1, i) {
return toComplementsMap[base1] !== sequence2[i];
});
};
export default {
codonToAALong,
codonToAAShort,
toComplements,
iupacToBases,
toReverseComplements,
isPalindromic,
areComplementary,
};