@teselagen/sequence-utils 0.1.22 → 0.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/index.js +12030 -26126
  2. package/index.mjs +12119 -26124
  3. package/index.umd.js +24056 -38154
  4. package/package.json +4 -3
  5. package/src/DNAComplementMap.js +32 -0
  6. package/src/addGapsToSeqReads.js +417 -0
  7. package/src/addGapsToSeqReads.test.js +358 -0
  8. package/src/adjustAnnotationsToInsert.js +19 -0
  9. package/src/adjustBpsToReplaceOrInsert.js +50 -0
  10. package/src/adjustBpsToReplaceOrInsert.test.js +59 -0
  11. package/src/aliasedEnzymesByName.js +7363 -0
  12. package/src/aminoAcidToDegenerateDnaMap.js +32 -0
  13. package/src/aminoAcidToDegenerateRnaMap.js +32 -0
  14. package/src/aminoAcidToDnaRna.test.js +27 -0
  15. package/src/annotateSingleSeq.js +29 -0
  16. package/src/annotateSingleSeq.test.js +64 -0
  17. package/src/annotationTypes.js +23 -0
  18. package/src/autoAnnotate.js +242 -0
  19. package/src/autoAnnotate.test.js +1039 -0
  20. package/src/bioData.js +431 -0
  21. package/src/calculateNebTa.js +34 -0
  22. package/src/calculateNebTa.test.js +57 -0
  23. package/src/calculateNebTm.js +127 -0
  24. package/src/calculateNebTm.test.js +32 -0
  25. package/src/calculatePercentGC.js +3 -0
  26. package/src/calculatePercentGC.test.js +14 -0
  27. package/src/calculateTm.js +297 -0
  28. package/src/calculateTm.test.js +7 -0
  29. package/src/computeDigestFragments.js +179 -0
  30. package/src/computeDigestFragments.test.js +73 -0
  31. package/src/condensePairwiseAlignmentDifferences.js +85 -0
  32. package/src/condensePairwiseAlignmentDifferences.test.js +66 -0
  33. package/src/convertAACaretPositionOrRangeToDna.js +24 -0
  34. package/src/convertAACaretPositionOrRangeToDna.test.js +34 -0
  35. package/src/convertDnaCaretPositionOrRangeToAA.js +24 -0
  36. package/src/convertDnaCaretPositionOrRangeToAA.test.js +37 -0
  37. package/src/cutSequenceByRestrictionEnzyme.js +301 -0
  38. package/src/cutSequenceByRestrictionEnzyme.test.js +296 -0
  39. package/src/defaultEnzymesByName.js +278 -0
  40. package/src/degenerateDnaToAminoAcidMap.js +5 -0
  41. package/src/degenerateRnaToAminoAcidMap.js +5 -0
  42. package/src/deleteSequenceDataAtRange.js +5 -0
  43. package/src/deleteSequenceDataAtRange.test.js +146 -0
  44. package/src/diffUtils.js +64 -0
  45. package/src/diffUtils.test.js +74 -0
  46. package/src/doesEnzymeChopOutsideOfRecognitionSite.js +10 -0
  47. package/src/doesEnzymeChopOutsideOfRecognitionSite.test.js +41 -0
  48. package/src/featureTypesAndColors.js +152 -0
  49. package/src/featureTypesAndColors.test.js +52 -0
  50. package/src/filterAminoAcidSequenceString.js +13 -0
  51. package/src/filterAminoAcidSequenceString.test.js +22 -0
  52. package/src/filterSequenceString.js +22 -0
  53. package/src/filterSequenceString.test.js +13 -0
  54. package/src/findNearestRangeOfSequenceOverlapToPosition.js +39 -0
  55. package/src/findNearestRangeOfSequenceOverlapToPosition.test.js +31 -0
  56. package/src/findOrfsInPlasmid.js +26 -0
  57. package/src/findSequenceMatches.js +133 -0
  58. package/src/findSequenceMatches.test.js +286 -0
  59. package/src/generateAnnotations.js +34 -0
  60. package/src/generateSequenceData.js +206 -0
  61. package/src/generateSequenceData.test.js +22 -0
  62. package/src/getAllInsertionsInSeqReads.js +83 -0
  63. package/src/getAllInsertionsInSeqReads.test.js +26 -0
  64. package/src/getAminoAcidDataForEachBaseOfDna.js +163 -0
  65. package/src/getAminoAcidDataForEachBaseOfDna.test.js +424 -0
  66. package/src/getAminoAcidFromSequenceTriplet.js +22 -0
  67. package/src/getAminoAcidStringFromSequenceString.js +18 -0
  68. package/src/getAminoAcidStringFromSequenceString.test.js +18 -0
  69. package/src/getCodonRangeForAASliver.js +63 -0
  70. package/src/getComplementAminoAcidStringFromSequenceString.js +11 -0
  71. package/src/getComplementSequenceAndAnnotations.js +20 -0
  72. package/src/getComplementSequenceString.js +19 -0
  73. package/src/getComplementSequenceString.test.js +13 -0
  74. package/src/getCutsiteType.js +10 -0
  75. package/src/getCutsitesFromSequence.js +17 -0
  76. package/src/getDegenerateDnaStringFromAAString.js +8 -0
  77. package/src/getDegenerateRnaStringFromAAString.js +8 -0
  78. package/src/getDigestFragmentsForCutsites.js +105 -0
  79. package/src/getDigestFragmentsForRestrictionEnzymes.js +27 -0
  80. package/src/getDigestFragmentsForRestrictionEnzymes.test.js +228 -0
  81. package/src/getInsertBetweenVals.js +28 -0
  82. package/src/getInsertBetweenVals.test.js +33 -0
  83. package/src/getLeftAndRightOfSequenceInRangeGivenPosition.js +39 -0
  84. package/src/getLeftAndRightOfSequenceInRangeGivenPosition.test.js +80 -0
  85. package/src/getMassOfAaString.js +24 -0
  86. package/src/getMassofAaString.test.js +18 -0
  87. package/src/getOrfsFromSequence.js +124 -0
  88. package/src/getOrfsFromSequence.test.js +210 -0
  89. package/src/getOverlapBetweenTwoSequences.js +30 -0
  90. package/src/getOverlapBetweenTwoSequences.test.js +23 -0
  91. package/src/getPossiblePartsFromSequenceAndEnzymes.js +121 -0
  92. package/src/getPossiblePartsFromSequenceAndEnzymes.test.js +208 -0
  93. package/src/getReverseAminoAcidStringFromSequenceString.js +20 -0
  94. package/src/getReverseAminoAcidStringFromSequenceString.test.js +11 -0
  95. package/src/getReverseComplementAminoAcidStringFromSequenceString.js +7 -0
  96. package/src/getReverseComplementAnnotation.js +23 -0
  97. package/src/getReverseComplementAnnotation.test.js +44 -0
  98. package/src/getReverseComplementSequenceAndAnnotations.js +38 -0
  99. package/src/getReverseComplementSequenceAndAnnotations.test.js +105 -0
  100. package/src/getReverseComplementSequenceString.js +17 -0
  101. package/src/getReverseComplementSequenceString.test.js +11 -0
  102. package/src/getReverseSequenceString.js +12 -0
  103. package/src/getReverseSequenceString.test.js +9 -0
  104. package/src/getSequenceDataBetweenRange.js +131 -0
  105. package/src/getSequenceDataBetweenRange.test.js +474 -0
  106. package/src/getVirtualDigest.js +125 -0
  107. package/src/getVirtualDigest.test.js +134 -0
  108. package/src/guessIfSequenceIsDnaAndNotProtein.js +33 -0
  109. package/src/guessIfSequenceIsDnaAndNotProtein.test.js +34 -0
  110. package/src/index.js +106 -0
  111. package/src/index.test.js +38 -0
  112. package/src/insertGapsIntoRefSeq.js +38 -0
  113. package/src/insertGapsIntoRefSeq.test.js +20 -0
  114. package/src/insertSequenceDataAtPosition.js +2 -0
  115. package/src/insertSequenceDataAtPosition.test.js +75 -0
  116. package/src/insertSequenceDataAtPositionOrRange.js +249 -0
  117. package/src/insertSequenceDataAtPositionOrRange.test.js +547 -0
  118. package/src/isEnzymeType2S.js +3 -0
  119. package/src/mapAnnotationsToRows.js +174 -0
  120. package/src/mapAnnotationsToRows.test.js +425 -0
  121. package/src/prepareCircularViewData.js +17 -0
  122. package/src/prepareCircularViewData.test.js +196 -0
  123. package/src/prepareRowData.js +41 -0
  124. package/src/prepareRowData.test.js +36 -0
  125. package/src/prepareRowData_output1.json +391 -0
  126. package/src/proteinAlphabet.js +257 -0
  127. package/src/rotateBpsToPosition.js +13 -0
  128. package/src/rotateBpsToPosition.test.js +6 -0
  129. package/src/rotateSequenceDataToPosition.js +48 -0
  130. package/src/rotateSequenceDataToPosition.test.js +71 -0
  131. package/src/shiftAnnotationsByLen.js +17 -0
  132. package/src/threeLetterSequenceStringToAminoAcidMap.js +106 -0
  133. package/src/tidyUpAnnotation.js +182 -0
  134. package/src/tidyUpSequenceData.js +169 -0
  135. package/src/tidyUpSequenceData.test.js +332 -0
@@ -0,0 +1,424 @@
1
+
2
+
3
+ import getAminoAcidDataForEachBaseOfDna from "./getAminoAcidDataForEachBaseOfDna.js";
4
+
5
+ import getAA from "./getAminoAcidFromSequenceTriplet";
6
+
7
+ import assert from "assert";
8
+
9
+ let aaData;
10
+ describe("getAminoAcidDataForEachBaseOfDna tranlates a", () => {
11
+ //: It gets correct amino acid mapping and position in codon for each basepair in sequence
12
+ it("1 amino acid long sequence", () => {
13
+ aaData = getAminoAcidDataForEachBaseOfDna("atg", true);
14
+ assert.deepEqual(aaData, [
15
+ {
16
+ aminoAcid: getAA("atg"),
17
+ positionInCodon: 0,
18
+ aminoAcidIndex: 0,
19
+ sequenceIndex: 0,
20
+ codonRange: {
21
+ start: 0,
22
+ end: 2
23
+ },
24
+ fullCodon: true
25
+ },
26
+ {
27
+ aminoAcid: getAA("atg"),
28
+ positionInCodon: 1,
29
+ aminoAcidIndex: 0,
30
+ sequenceIndex: 1,
31
+ codonRange: {
32
+ start: 0,
33
+ end: 2
34
+ },
35
+ fullCodon: true
36
+ },
37
+ {
38
+ aminoAcid: getAA("atg"),
39
+ positionInCodon: 2,
40
+ aminoAcidIndex: 0,
41
+ sequenceIndex: 2,
42
+ codonRange: {
43
+ start: 0,
44
+ end: 2
45
+ },
46
+ fullCodon: true
47
+ }
48
+ ]);
49
+ });
50
+ it("1 amino acid long sequence which is subrange of a larger sequence", () => {
51
+ aaData = getAminoAcidDataForEachBaseOfDna(
52
+ "atgtatgagagtagagatagagata",
53
+ true,
54
+ { start: 4, end: 6 }
55
+ );
56
+ assert.deepEqual(aaData, [
57
+ {
58
+ aminoAcid: getAA("atg"),
59
+ positionInCodon: 0,
60
+ aminoAcidIndex: 0,
61
+ sequenceIndex: 4,
62
+ codonRange: {
63
+ start: 4,
64
+ end: 6
65
+ },
66
+ fullCodon: true
67
+ },
68
+ {
69
+ aminoAcid: getAA("atg"),
70
+ positionInCodon: 1,
71
+ aminoAcidIndex: 0,
72
+ sequenceIndex: 5,
73
+ codonRange: {
74
+ start: 4,
75
+ end: 6
76
+ },
77
+ fullCodon: true
78
+ },
79
+ {
80
+ aminoAcid: getAA("atg"),
81
+ positionInCodon: 2,
82
+ aminoAcidIndex: 0,
83
+ sequenceIndex: 6,
84
+ codonRange: {
85
+ start: 4,
86
+ end: 6
87
+ },
88
+ fullCodon: true
89
+ }
90
+ ]);
91
+ });
92
+ it("1 amino acid long sequence which is origin spanning subrange of a larger sequence", () => {
93
+ // 012345678
94
+ aaData = getAminoAcidDataForEachBaseOfDna("atgatgatg", true, {
95
+ start: 6,
96
+ end: 2
97
+ });
98
+ assert.deepEqual(aaData, [
99
+ {
100
+ aminoAcid: getAA("atg"),
101
+ positionInCodon: 0,
102
+ aminoAcidIndex: 0,
103
+ sequenceIndex: 6,
104
+ codonRange: {
105
+ start: 6,
106
+ end: 8
107
+ },
108
+ fullCodon: true
109
+ },
110
+ {
111
+ aminoAcid: getAA("atg"),
112
+ positionInCodon: 1,
113
+ aminoAcidIndex: 0,
114
+ sequenceIndex: 7,
115
+ codonRange: {
116
+ start: 6,
117
+ end: 8
118
+ },
119
+ fullCodon: true
120
+ },
121
+ {
122
+ aminoAcid: getAA("atg"),
123
+ positionInCodon: 2,
124
+ aminoAcidIndex: 0,
125
+ sequenceIndex: 8,
126
+ codonRange: {
127
+ start: 6,
128
+ end: 8
129
+ },
130
+ fullCodon: true
131
+ },
132
+ {
133
+ aminoAcid: getAA("atg"),
134
+ positionInCodon: 0,
135
+ aminoAcidIndex: 1,
136
+ sequenceIndex: 0,
137
+ codonRange: {
138
+ start: 0,
139
+ end: 2
140
+ },
141
+ fullCodon: true
142
+ },
143
+ {
144
+ aminoAcid: getAA("atg"),
145
+ positionInCodon: 1,
146
+ aminoAcidIndex: 1,
147
+ sequenceIndex: 1,
148
+ codonRange: {
149
+ start: 0,
150
+ end: 2
151
+ },
152
+ fullCodon: true
153
+ },
154
+ {
155
+ aminoAcid: getAA("atg"),
156
+ positionInCodon: 2,
157
+ aminoAcidIndex: 1,
158
+ sequenceIndex: 2,
159
+ codonRange: {
160
+ start: 0,
161
+ end: 2
162
+ },
163
+ fullCodon: true
164
+ }
165
+ ]);
166
+ });
167
+ it("1 amino acid long sequence in reverse direction", () => {
168
+ aaData = getAminoAcidDataForEachBaseOfDna("atg", false);
169
+ assert.deepEqual(aaData, [
170
+ {
171
+ aminoAcid: getAA("cat"),
172
+ positionInCodon: 2,
173
+ aminoAcidIndex: 0,
174
+ fullCodon: true,
175
+ sequenceIndex: 0,
176
+ codonRange: {
177
+ start: 0,
178
+ end: 2
179
+ }
180
+ },
181
+ {
182
+ aminoAcid: getAA("cat"),
183
+ positionInCodon: 1,
184
+ aminoAcidIndex: 0,
185
+ fullCodon: true,
186
+ sequenceIndex: 1,
187
+ codonRange: {
188
+ start: 0,
189
+ end: 2
190
+ }
191
+ },
192
+ {
193
+ aminoAcid: getAA("cat"),
194
+ positionInCodon: 0,
195
+ aminoAcidIndex: 0,
196
+ fullCodon: true,
197
+ sequenceIndex: 2,
198
+ codonRange: {
199
+ start: 0,
200
+ end: 2
201
+ }
202
+ }
203
+ ]);
204
+ });
205
+ it("> 1 amino acid long sequence", () => {
206
+ aaData = getAminoAcidDataForEachBaseOfDna("atgtaat", true);
207
+ assert.deepEqual(aaData, [
208
+ {
209
+ aminoAcid: getAA("atg"),
210
+ positionInCodon: 0,
211
+ aminoAcidIndex: 0,
212
+ fullCodon: true,
213
+ sequenceIndex: 0,
214
+ codonRange: {
215
+ start: 0,
216
+ end: 2
217
+ }
218
+ },
219
+ {
220
+ aminoAcid: getAA("atg"),
221
+ positionInCodon: 1,
222
+ aminoAcidIndex: 0,
223
+ fullCodon: true,
224
+ sequenceIndex: 1,
225
+ codonRange: {
226
+ start: 0,
227
+ end: 2
228
+ }
229
+ },
230
+ {
231
+ aminoAcid: getAA("atg"),
232
+ positionInCodon: 2,
233
+ aminoAcidIndex: 0,
234
+ fullCodon: true,
235
+ sequenceIndex: 2,
236
+ codonRange: {
237
+ start: 0,
238
+ end: 2
239
+ }
240
+ },
241
+ {
242
+ aminoAcid: getAA("taa"),
243
+ positionInCodon: 0,
244
+ aminoAcidIndex: 1,
245
+ fullCodon: true,
246
+ sequenceIndex: 3,
247
+ codonRange: {
248
+ start: 3,
249
+ end: 5
250
+ }
251
+ },
252
+ {
253
+ aminoAcid: getAA("taa"),
254
+ positionInCodon: 1,
255
+ aminoAcidIndex: 1,
256
+ fullCodon: true,
257
+ sequenceIndex: 4,
258
+ codonRange: {
259
+ start: 3,
260
+ end: 5
261
+ }
262
+ },
263
+ {
264
+ aminoAcid: getAA("taa"),
265
+ positionInCodon: 2,
266
+ aminoAcidIndex: 1,
267
+ fullCodon: true,
268
+ sequenceIndex: 5,
269
+ codonRange: {
270
+ start: 3,
271
+ end: 5
272
+ }
273
+ },
274
+ {
275
+ aminoAcid: getAA("xxx"),
276
+ positionInCodon: 0,
277
+ aminoAcidIndex: 2,
278
+ fullCodon: false,
279
+ sequenceIndex: 6,
280
+ codonRange: {
281
+ start: 6,
282
+ end: 6
283
+ }
284
+ }
285
+ ]);
286
+ });
287
+ it("> 1 amino acid long sequence in reverse direction", () => {
288
+ aaData = getAminoAcidDataForEachBaseOfDna("atgtaat", false);
289
+
290
+ assert.deepEqual(aaData, [
291
+ {
292
+ aminoAcid: getAA("xxx"),
293
+ positionInCodon: 0,
294
+ aminoAcidIndex: 2,
295
+ sequenceIndex: 0,
296
+ codonRange: {
297
+ start: 0,
298
+ end: 0
299
+ },
300
+ fullCodon: false
301
+ },
302
+ {
303
+ aminoAcid: getAA("aca"),
304
+ positionInCodon: 2,
305
+ aminoAcidIndex: 1,
306
+ sequenceIndex: 1,
307
+ codonRange: {
308
+ start: 1,
309
+ end: 3
310
+ },
311
+ fullCodon: true
312
+ },
313
+ {
314
+ aminoAcid: getAA("aca"),
315
+ positionInCodon: 1,
316
+ aminoAcidIndex: 1,
317
+ sequenceIndex: 2,
318
+ codonRange: {
319
+ start: 1,
320
+ end: 3
321
+ },
322
+ fullCodon: true
323
+ },
324
+ {
325
+ aminoAcid: getAA("aca"),
326
+ positionInCodon: 0,
327
+ aminoAcidIndex: 1,
328
+ sequenceIndex: 3,
329
+ codonRange: {
330
+ start: 1,
331
+ end: 3
332
+ },
333
+ fullCodon: true
334
+ },
335
+ {
336
+ aminoAcid: getAA("att"),
337
+ positionInCodon: 2,
338
+ aminoAcidIndex: 0,
339
+ sequenceIndex: 4,
340
+ codonRange: {
341
+ start: 4,
342
+ end: 6
343
+ },
344
+ fullCodon: true
345
+ },
346
+ {
347
+ aminoAcid: getAA("att"),
348
+ positionInCodon: 1,
349
+ aminoAcidIndex: 0,
350
+ sequenceIndex: 5,
351
+ codonRange: {
352
+ start: 4,
353
+ end: 6
354
+ },
355
+ fullCodon: true
356
+ },
357
+ {
358
+ aminoAcid: getAA("att"),
359
+ positionInCodon: 0,
360
+ aminoAcidIndex: 0,
361
+ sequenceIndex: 6,
362
+ codonRange: {
363
+ start: 4,
364
+ end: 6
365
+ },
366
+ fullCodon: true
367
+ }
368
+ ]);
369
+ });
370
+ it("< 1 amino acid long sequence", () => {
371
+ aaData = getAminoAcidDataForEachBaseOfDna("at", true);
372
+ assert.deepEqual(aaData, [
373
+ {
374
+ aminoAcid: getAA("xxx"),
375
+ positionInCodon: 0,
376
+ aminoAcidIndex: 0,
377
+ sequenceIndex: 0,
378
+ fullCodon: false,
379
+ codonRange: {
380
+ start: 0,
381
+ end: 1
382
+ }
383
+ },
384
+ {
385
+ aminoAcid: getAA("xxx"),
386
+ positionInCodon: 1,
387
+ aminoAcidIndex: 0,
388
+ sequenceIndex: 1,
389
+ fullCodon: false,
390
+ codonRange: {
391
+ start: 0,
392
+ end: 1
393
+ }
394
+ }
395
+ ]);
396
+ });
397
+ it("< 1 amino acid long sequence in reverse direction", () => {
398
+ aaData = getAminoAcidDataForEachBaseOfDna("at", false);
399
+ assert.deepEqual(aaData, [
400
+ {
401
+ aminoAcid: getAA("xxx"),
402
+ positionInCodon: 1,
403
+ aminoAcidIndex: 0,
404
+ sequenceIndex: 0,
405
+ fullCodon: false,
406
+ codonRange: {
407
+ start: 0,
408
+ end: 1
409
+ }
410
+ },
411
+ {
412
+ aminoAcid: getAA("xxx"),
413
+ positionInCodon: 0,
414
+ aminoAcidIndex: 0,
415
+ sequenceIndex: 1,
416
+ fullCodon: false,
417
+ codonRange: {
418
+ start: 0,
419
+ end: 1
420
+ }
421
+ }
422
+ ]);
423
+ });
424
+ });
@@ -0,0 +1,22 @@
1
+ import threeLetterSequenceStringToAminoAcidMap from "./threeLetterSequenceStringToAminoAcidMap";
2
+ import proteinAlphabet from "./proteinAlphabet";
3
+ import degenerateDnaToAminoAcidMap from "./degenerateDnaToAminoAcidMap";
4
+
5
+ //tnrtodo: expand the threeLetterSequenceStringToAminoAcidMap mappings to include RNA characters.
6
+ //currently stop bps aren't all mapped!
7
+ export default function getAminoAcidFromSequenceTriplet(sequenceString) {
8
+ sequenceString = sequenceString.toLowerCase();
9
+ if (sequenceString.length !== 3) {
10
+ throw new Error("must pass a string of length 3");
11
+ }
12
+ const aa = threeLetterSequenceStringToAminoAcidMap[sequenceString];
13
+ if (aa) {
14
+ return aa;
15
+ }
16
+ const letter =
17
+ degenerateDnaToAminoAcidMap[
18
+ sequenceString.replace("x", "n") //replace x's with n's as those are equivalent dna chars
19
+ ] || "x";
20
+
21
+ return proteinAlphabet[letter.toUpperCase()];
22
+ };
@@ -0,0 +1,18 @@
1
+ import getAminoAcidDataForEachBaseOfDna from "./getAminoAcidDataForEachBaseOfDna";
2
+
3
+ export default function getAminoAcidStringFromSequenceString(sequenceString) {
4
+ const aminoAcidsPerBase = getAminoAcidDataForEachBaseOfDna(
5
+ sequenceString,
6
+ true
7
+ );
8
+ const aaArray = [];
9
+ let aaString = "";
10
+ aminoAcidsPerBase.forEach(aa => {
11
+ if (!aa.fullCodon) {
12
+ return;
13
+ }
14
+ aaArray[aa.aminoAcidIndex] = aa.aminoAcid.value;
15
+ });
16
+ aaString = aaArray.join("");
17
+ return aaString;
18
+ };
@@ -0,0 +1,18 @@
1
+ import getAminoAcidStringFromSequenceString from "./getAminoAcidStringFromSequenceString";
2
+ import assert from "assert";
3
+
4
+ describe("getAminoAcidStringFromSequenceString", () => {
5
+ it("computes a aa string from dna", () => {
6
+ assert.equal("M", getAminoAcidStringFromSequenceString("atg"));
7
+ assert.equal("MM", getAminoAcidStringFromSequenceString("atgatg"));
8
+ assert.equal("MXM", getAminoAcidStringFromSequenceString("atgxxxatg"));
9
+ assert.equal("M.M", getAminoAcidStringFromSequenceString("atg...atg"));
10
+ assert.equal("M*M", getAminoAcidStringFromSequenceString("atgtrratg"));
11
+ assert.equal("M*M", getAminoAcidStringFromSequenceString("atgtaaatg"));
12
+ assert.equal("MB", getAminoAcidStringFromSequenceString("atgray"));
13
+ assert.equal("MX", getAminoAcidStringFromSequenceString("atgrRr"));
14
+ assert.equal("MM", getAminoAcidStringFromSequenceString("atgatg"));
15
+ assert.equal("M--", getAminoAcidStringFromSequenceString("atg------"));
16
+ assert.equal("", getAminoAcidStringFromSequenceString("at"));
17
+ });
18
+ });
@@ -0,0 +1,63 @@
1
+ export default function getCodonRangeForAASliver(
2
+ aminoAcidPositionInSequence,
3
+ aminoAcidSliver,
4
+ AARepresentationOfTranslation,
5
+ relativeAAPositionInTranslation
6
+ ) {
7
+ const AASliverOneBefore =
8
+ AARepresentationOfTranslation[relativeAAPositionInTranslation - 1];
9
+ if (
10
+ AASliverOneBefore &&
11
+ AASliverOneBefore.aminoAcidIndex === aminoAcidSliver.aminoAcidIndex
12
+ ) {
13
+ const AASliverTwoBefore =
14
+ AARepresentationOfTranslation[relativeAAPositionInTranslation - 2];
15
+ if (
16
+ AASliverTwoBefore &&
17
+ AASliverTwoBefore.aminoAcidIndex === aminoAcidSliver.aminoAcidIndex
18
+ ) {
19
+ return {
20
+ start: aminoAcidPositionInSequence - 2,
21
+ end: aminoAcidPositionInSequence
22
+ };
23
+ } else {
24
+ if (aminoAcidSliver.fullCodon === true) {
25
+ return {
26
+ start: aminoAcidPositionInSequence - 1,
27
+ end: aminoAcidPositionInSequence + 1
28
+ };
29
+ } else {
30
+ return {
31
+ start: aminoAcidPositionInSequence - 1,
32
+ end: aminoAcidPositionInSequence
33
+ };
34
+ }
35
+ }
36
+ } else {
37
+ //no AASliver before with same index
38
+ if (aminoAcidSliver.fullCodon === true) {
39
+ //sliver is part of a full codon, so we know the codon will expand 2 more slivers ahead
40
+ return {
41
+ start: aminoAcidPositionInSequence,
42
+ end: aminoAcidPositionInSequence + 2
43
+ };
44
+ } else {
45
+ const AASliverOneAhead =
46
+ AARepresentationOfTranslation[relativeAAPositionInTranslation - 2];
47
+ if (
48
+ AASliverOneAhead &&
49
+ AASliverOneAhead.aminoAcidIndex === aminoAcidSliver.aminoAcidIndex
50
+ ) {
51
+ return {
52
+ start: aminoAcidPositionInSequence,
53
+ end: aminoAcidPositionInSequence + 1
54
+ };
55
+ } else {
56
+ return {
57
+ start: aminoAcidPositionInSequence,
58
+ end: aminoAcidPositionInSequence + 1
59
+ };
60
+ }
61
+ }
62
+ }
63
+ };
@@ -0,0 +1,11 @@
1
+ import getAminoAcidStringFromSequenceString from "./getAminoAcidStringFromSequenceString";
2
+
3
+ export default function getComplementAminoAcidStringFromSequenceString(
4
+ sequenceString
5
+ ) {
6
+ const aaString = getAminoAcidStringFromSequenceString(sequenceString, true);
7
+ return aaString
8
+ .split("")
9
+ .reverse()
10
+ .join("");
11
+ };
@@ -0,0 +1,20 @@
1
+ import getComplementSequenceString from "./getComplementSequenceString";
2
+ import tidyUpSequenceData from "./tidyUpSequenceData";
3
+
4
+
5
+ import getSequenceDataBetweenRange from "./getSequenceDataBetweenRange";
6
+
7
+ // ac.throw([ac.string,ac.bool],arguments);
8
+ export default function getComplementSequenceAndAnnotations(
9
+ pSeqObj,
10
+ options = {}
11
+ ) {
12
+ const seqObj = tidyUpSequenceData(
13
+ getSequenceDataBetweenRange(pSeqObj, options.range),
14
+ options
15
+ );
16
+ const newSeqObj = Object.assign({}, seqObj, {
17
+ sequence: getComplementSequenceString(seqObj.sequence, seqObj.isRna)
18
+ });
19
+ return tidyUpSequenceData(newSeqObj, options);
20
+ };
@@ -0,0 +1,19 @@
1
+ import DNAComplementMap from "./DNAComplementMap";
2
+ import { merge } from "lodash";
3
+
4
+
5
+ // ac.throw([ac.string,ac.bool],arguments);
6
+ export default function getComplementSequenceString(sequence, isRna) {
7
+ // ac.throw([ac.string],arguments);
8
+ let complementSeqString = "";
9
+ const complementMap = merge(DNAComplementMap, isRna ? { a: 'u', A: 'U'} : {a: 't', A: 'T'});
10
+ for (let i = 0; i < sequence.length; i++) {
11
+ let complementChar = complementMap[sequence[i]];
12
+ if (!complementChar) {
13
+ complementChar = sequence[i];
14
+ // throw new Error('trying to get the reverse compelement of an invalid base');
15
+ }
16
+ complementSeqString += complementChar;
17
+ }
18
+ return complementSeqString;
19
+ };
@@ -0,0 +1,13 @@
1
+ import getComplementSequenceString from "./getComplementSequenceString";
2
+
3
+ import assert from "assert";
4
+
5
+ describe('complement base should be shown correctly', () => {
6
+ it('complement base should be shown correctly for RNA sequence', () => {
7
+ assert.equal('UUA', getComplementSequenceString('AAU', true))
8
+ });
9
+
10
+ it('complement base should be shown correctly for DNA sequence', () => {
11
+ assert.equal('TTA', getComplementSequenceString('AAT'))
12
+ });
13
+ });
@@ -0,0 +1,10 @@
1
+ export default function getCutsiteType(restrictionEnzyme) {
2
+ const { topSnipOffset, bottomSnipOffset } = restrictionEnzyme;
3
+ if (topSnipOffset === bottomSnipOffset) {
4
+ return "blunt";
5
+ } else if (topSnipOffset < bottomSnipOffset) {
6
+ return "5' overhang";
7
+ } else {
8
+ return "3' overhang";
9
+ }
10
+ };
@@ -0,0 +1,17 @@
1
+ import cutSequenceByRestrictionEnzyme from "./cutSequenceByRestrictionEnzyme";
2
+
3
+ export default function getCutsitesFromSequence(
4
+ sequence,
5
+ circular,
6
+ restrictionEnzymes
7
+ ) {
8
+ const cutsitesByName = {};
9
+ for (let i = 0; i < restrictionEnzymes.length; i++) {
10
+ const re = restrictionEnzymes[i];
11
+ const cutsites = cutSequenceByRestrictionEnzyme(sequence, circular, re);
12
+ if (cutsites.length) {
13
+ cutsitesByName[re.name] = cutsites;
14
+ }
15
+ }
16
+ return cutsitesByName;
17
+ };
@@ -0,0 +1,8 @@
1
+ import aminoAcidToDegenerateDnaMap from "./aminoAcidToDegenerateDnaMap";
2
+
3
+ export default function getDegenerateDnaStringFromAAString(aaString) {
4
+ return aaString
5
+ .split("")
6
+ .map(char => aminoAcidToDegenerateDnaMap[char.toLowerCase()] || "nnn")
7
+ .join("");
8
+ };
@@ -0,0 +1,8 @@
1
+ import aminoAcidToDegenerateRnaMap from "./aminoAcidToDegenerateRnaMap";
2
+
3
+ export default function getDegenerateRnaStringFromAAString(aaString) {
4
+ return aaString
5
+ .split("")
6
+ .map(char => aminoAcidToDegenerateRnaMap[char.toLowerCase()] || "nnn")
7
+ .join("");
8
+ };