@teselagen/sequence-utils 0.1.22 → 0.1.23

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 +2 -2
  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,474 @@
1
+ //tnr: half finished test.
2
+
3
+
4
+ import chai from "chai";
5
+ import chaiSubset from "chai-subset";
6
+
7
+ import getSequenceDataBetweenRange from "./getSequenceDataBetweenRange";
8
+
9
+ chai.should();
10
+ chai.use(chaiSubset);
11
+
12
+ describe("getSequenceDataBetweenRange", () => {
13
+ it("should handle range.overlapsSelf flag", () => {
14
+ const res = getSequenceDataBetweenRange(
15
+ {
16
+ circular: true,
17
+ // 0123456789012
18
+ // ffffffff gg
19
+ sequence: "tttggggaaaccc",
20
+ // ttg
21
+ parts: [
22
+ {
23
+ start: 1,
24
+ end: 3,
25
+ name: "iOverlapMyself",
26
+ overlapsSelf: true
27
+ }
28
+ ],
29
+ features: [
30
+ {
31
+ start: 0,
32
+ end: 7,
33
+ name: "happy"
34
+ },
35
+ {
36
+ start: 9,
37
+ end: 10,
38
+ name: "grumpy"
39
+ }
40
+ ]
41
+ },
42
+ {
43
+ start: 1,
44
+ end: 3,
45
+ overlapsSelf: true
46
+ }
47
+ );
48
+ res.parts[0].overlapsSelf.should.equal(false); //if the range perfectly overlaps the selfOverlapped annotation, the annotation should no longer be wrapping
49
+ res.should.containSubset({
50
+ sequence: "ttggggaaaccctttg",
51
+ parts: [
52
+ {
53
+ start: 0,
54
+ end: 15,
55
+ name: "iOverlapMyself"
56
+ }
57
+ ],
58
+ features: [
59
+ {
60
+ start: 0,
61
+ end: 6,
62
+ name: "happy"
63
+ },
64
+ {
65
+ start: 12,
66
+ end: 15,
67
+ name: "happy"
68
+ },
69
+ {
70
+ start: 8,
71
+ end: 9,
72
+ name: "grumpy"
73
+ }
74
+ ]
75
+ });
76
+ });
77
+
78
+ it("should set circular to false if a sub range is selected of a circular sequence", () => {
79
+ const res = getSequenceDataBetweenRange(
80
+ {
81
+ circular: true,
82
+ sequence: "atgcatgc"
83
+ },
84
+ {
85
+ start: 1,
86
+ end: 5
87
+ }
88
+ );
89
+ res.should.containSubset({
90
+ circular: false
91
+ });
92
+ });
93
+ it("should maintain circularity if the full entire sequence is selected from a circular sequence", () => {
94
+ const res = getSequenceDataBetweenRange(
95
+ {
96
+ circular: true,
97
+ sequence: "atgcatgc"
98
+ },
99
+ {
100
+ start: 3,
101
+ end: 2
102
+ }
103
+ );
104
+ res.should.containSubset({
105
+ circular: true
106
+ });
107
+ });
108
+ it("should maintain circular=false if the full entire sequence is selected from a linear sequence", () => {
109
+ const res = getSequenceDataBetweenRange(
110
+ {
111
+ circular: false,
112
+ sequence: "atgcatgc"
113
+ },
114
+ {
115
+ start: 3,
116
+ end: 2
117
+ }
118
+ );
119
+ res.should.containSubset({
120
+ circular: false
121
+ });
122
+ });
123
+ it("should return an empty sequence if given an invalid range", () => {
124
+ const res = getSequenceDataBetweenRange(
125
+ {
126
+ isProtein: true,
127
+ sequence: "atgcatgc",
128
+ features: [
129
+ {
130
+ start: 0,
131
+ end: 7,
132
+ name: "happy"
133
+ }
134
+ ]
135
+ },
136
+ {
137
+ start: -1,
138
+ end: -1
139
+ }
140
+ );
141
+ res.should.containSubset({
142
+ sequence: "",
143
+ isProtein: true,
144
+ proteinSequence: "",
145
+ features: [],
146
+ parts: []
147
+ });
148
+ });
149
+ it("protein sequence non circular feature, non circular range", () => {
150
+ const res = getSequenceDataBetweenRange(
151
+ {
152
+ sequence: "atgcatgcatgc",
153
+ proteinSequence: "MHAC",
154
+ features: [
155
+ {
156
+ start: 0,
157
+ end: 7,
158
+ name: "happy"
159
+ }
160
+ ]
161
+ },
162
+ {
163
+ start: 3,
164
+ end: 8
165
+ }
166
+ );
167
+ res.should.containSubset({
168
+ sequence: "catgca",
169
+ proteinSequence: "HA",
170
+ features: [
171
+ {
172
+ start: 0,
173
+ end: 4,
174
+ name: "happy"
175
+ }
176
+ ]
177
+ });
178
+ });
179
+ it("non circular feature, non circular range", () => {
180
+ const res = getSequenceDataBetweenRange(
181
+ {
182
+ sequence: "atgcatgca",
183
+ features: [
184
+ {
185
+ start: 0,
186
+ end: 7,
187
+ name: "happy"
188
+ }
189
+ ]
190
+ },
191
+ {
192
+ start: 2,
193
+ end: 3
194
+ }
195
+ );
196
+ res.should.containSubset({
197
+ sequence: "gc",
198
+ features: [
199
+ {
200
+ start: 0,
201
+ end: 1,
202
+ name: "happy"
203
+ }
204
+ ]
205
+ });
206
+ });
207
+ it("feature with locations, non circular range", () => {
208
+ const res = getSequenceDataBetweenRange(
209
+ {
210
+ sequence: "atgcatgca",
211
+ features: [
212
+ {
213
+ start: 0,
214
+ end: 7,
215
+ locations: [
216
+ { start: 0, end: 1 },
217
+ { start: 2, end: 5 },
218
+ { start: 6, end: 7 }
219
+ ],
220
+ name: "happy"
221
+ }
222
+ ]
223
+ },
224
+ {
225
+ start: 2,
226
+ end: 3
227
+ }
228
+ );
229
+ res.should.containSubset({
230
+ sequence: "gc",
231
+ features: [
232
+ {
233
+ start: 0,
234
+ end: 1,
235
+ locations: [
236
+ {
237
+ start: 0,
238
+ end: 1
239
+ }
240
+ ],
241
+ name: "happy"
242
+ }
243
+ ]
244
+ });
245
+ });
246
+ it("feature with locations, non circular enclosing range", () => {
247
+ const res = getSequenceDataBetweenRange(
248
+ {
249
+ sequence: "gggatgcatgca",
250
+ // 012345678901
251
+ // ffffff
252
+ // ll ll
253
+ // ccccccccc
254
+ // 012345678
255
+ features: [
256
+ {
257
+ start: 5,
258
+ end: 10,
259
+ locations: [
260
+ { start: 5, end: 6 },
261
+ { start: 9, end: 10 }
262
+ ],
263
+ name: "happy"
264
+ }
265
+ ]
266
+ },
267
+ {
268
+ start: 3,
269
+ end: 11
270
+ }
271
+ );
272
+ res.should.containSubset({
273
+ sequence: "atgcatgca",
274
+ features: [
275
+ {
276
+ start: 2,
277
+ end: 7,
278
+ locations: [
279
+ { start: 2, end: 3 },
280
+ { start: 6, end: 7 }
281
+ ],
282
+ name: "happy"
283
+ }
284
+ ]
285
+ });
286
+ });
287
+ it.only("feature with locations, non circular, non-fully enclosing range - it should trim the start/end correctly to match the location", () => {
288
+ const res = getSequenceDataBetweenRange(
289
+ {
290
+ sequence: "gggatgcatgca",
291
+ // 012345678901
292
+ // ffffff
293
+ // ll ll
294
+ // sssss
295
+ // 01234
296
+ features: [
297
+ {
298
+ start: 5,
299
+ end: 10,
300
+ locations: [
301
+ { start: 5, end: 6 },
302
+ { start: 9, end: 10 }
303
+ ],
304
+ name: "happy"
305
+ }
306
+ ]
307
+ },
308
+ {
309
+ start: 7,
310
+ end: 11
311
+ }
312
+ );
313
+
314
+ res.should.containSubset({
315
+ sequence: "atgca",
316
+ features: [
317
+ {
318
+ start: 2,
319
+ end: 3,
320
+ name: "happy",
321
+ locations: undefined
322
+ }
323
+ ]
324
+ });
325
+ });
326
+ it("non circular feature, circular range", () => {
327
+ const res = getSequenceDataBetweenRange(
328
+ {
329
+ //ssss sss
330
+ //01234567
331
+ sequence: "atgcatgc",
332
+ features: [
333
+ {
334
+ start: 0,
335
+ end: 7,
336
+ name: "happy"
337
+ }
338
+ ],
339
+ parts: [
340
+ {
341
+ start: 0,
342
+ end: 7,
343
+ name: "happy"
344
+ }
345
+ ]
346
+ },
347
+ {
348
+ start: 5,
349
+ end: 3
350
+ }
351
+ );
352
+ res.should.containSubset({
353
+ sequence: "tgcatgc",
354
+ features: [
355
+ {
356
+ start: 0,
357
+ end: 2,
358
+ name: "happy"
359
+ },
360
+ {
361
+ start: 3,
362
+ end: 6,
363
+ name: "happy"
364
+ }
365
+ ],
366
+ parts: [
367
+ {
368
+ start: 0,
369
+ end: 2,
370
+ name: "happy"
371
+ },
372
+ {
373
+ start: 3,
374
+ end: 6,
375
+ name: "happy"
376
+ }
377
+ ]
378
+ });
379
+ });
380
+ it("non circular feature, circular range, with partial parts excluded", () => {
381
+ const res = getSequenceDataBetweenRange(
382
+ {
383
+ //ssss sss
384
+ //01234567
385
+ sequence: "atgcatgc",
386
+ features: [
387
+ {
388
+ start: 0,
389
+ end: 7,
390
+ name: "happy"
391
+ }
392
+ ],
393
+ parts: {
394
+ "2asf23": {
395
+ start: 0,
396
+ id: "2asf23",
397
+ end: 7,
398
+ name: "happy"
399
+ }
400
+ }
401
+ },
402
+ {
403
+ start: 5,
404
+ end: 3
405
+ },
406
+ {
407
+ excludePartial: {
408
+ parts: true
409
+ }
410
+ }
411
+ );
412
+ res.should.containSubset({
413
+ sequence: "tgcatgc",
414
+ features: [
415
+ {
416
+ start: 0,
417
+ end: 2,
418
+ name: "happy"
419
+ },
420
+ {
421
+ start: 3,
422
+ end: 6,
423
+ name: "happy"
424
+ }
425
+ ],
426
+ parts: []
427
+ });
428
+ });
429
+ it("non circular feature, circular range, with features excluded", () => {
430
+ const res = getSequenceDataBetweenRange(
431
+ {
432
+ //ssss sss
433
+ //01234567
434
+ sequence: "atgcatgc",
435
+ features: [
436
+ {
437
+ start: 0,
438
+ end: 7,
439
+ name: "happy"
440
+ }
441
+ ],
442
+ parts: [
443
+ {
444
+ start: 0,
445
+ end: 7,
446
+ name: "happy"
447
+ }
448
+ ]
449
+ },
450
+ {
451
+ start: 5,
452
+ end: 3
453
+ },
454
+ { exclude: { features: true } }
455
+ );
456
+ res.features.length.should.equal(0);
457
+ res.should.containSubset({
458
+ sequence: "tgcatgc",
459
+ features: [],
460
+ parts: [
461
+ {
462
+ start: 0,
463
+ end: 2,
464
+ name: "happy"
465
+ },
466
+ {
467
+ start: 3,
468
+ end: 6,
469
+ name: "happy"
470
+ }
471
+ ]
472
+ });
473
+ });
474
+ });
@@ -0,0 +1,125 @@
1
+ //UNDER CONSTRUCTION
2
+
3
+ import {get} from "lodash";
4
+
5
+ import {normalizePositionByRangeLength, getRangeLength} from "@teselagen/range-utils";
6
+
7
+ export default function getVirtualDigest({
8
+ cutsites,
9
+ sequenceLength,
10
+ isCircular,
11
+ computePartialDigest,
12
+ computePartialDigestDisabled,
13
+ computeDigestDisabled
14
+ }) {
15
+ let fragments = [];
16
+ const overlappingEnzymes = [];
17
+ const pairs = [];
18
+
19
+ const sortedCutsites = cutsites.sort((a, b) => {
20
+ return a.topSnipPosition - b.topSnipPosition;
21
+ });
22
+
23
+ sortedCutsites.forEach((cutsite1, index) => {
24
+ if (computePartialDigest && !computePartialDigestDisabled) {
25
+ sortedCutsites.forEach((cs, index2) => {
26
+ // if (index2 === index + 1 || index2 === 0) { //tnw: not sure if this is necessary or not. commenting out for now
27
+ // return;
28
+ // }
29
+ pairs.push([cutsite1, sortedCutsites[index2]]);
30
+ });
31
+ }
32
+ if (!computeDigestDisabled) {
33
+ pairs.push([
34
+ cutsite1,
35
+ sortedCutsites[index + 1]
36
+ ? sortedCutsites[index + 1]
37
+ : sortedCutsites[0]
38
+ ]);
39
+ }
40
+ });
41
+
42
+ pairs.forEach(([cut1, cut2]) => {
43
+ const start = normalizePositionByRangeLength(
44
+ cut1.topSnipPosition,
45
+ sequenceLength
46
+ );
47
+ const end = normalizePositionByRangeLength(
48
+ cut2.topSnipPosition - 1,
49
+ sequenceLength
50
+ );
51
+
52
+ if (!isCircular && start > end) {
53
+ //we have a fragment that spans the origin so we need to split it in 2 pieces
54
+ const frag1 = {
55
+ start: start,
56
+ end: sequenceLength - 1,
57
+ cut1,
58
+ cut2: {
59
+ type: "endOfSeq",
60
+ restrictionEnzyme: {
61
+ name: "End Of Seq"
62
+ }
63
+ }
64
+ };
65
+ const frag2 = {
66
+ start: 0,
67
+ end: end,
68
+ cut1: {
69
+ type: "startOfSeq",
70
+ restrictionEnzyme: {
71
+ name: "Start Of Seq"
72
+ }
73
+ },
74
+ cut2: cut2
75
+ };
76
+
77
+ fragments.push(addSizeIdName(frag1, sequenceLength));
78
+ fragments.push(addSizeIdName(frag2, sequenceLength));
79
+ } else {
80
+ const frag = {
81
+ cut1,
82
+ cut2,
83
+ start,
84
+ end
85
+ };
86
+ fragments.push(addSizeIdName(frag, sequenceLength));
87
+ }
88
+ });
89
+ fragments = fragments.filter(fragment => {
90
+ if (!fragment.size) {
91
+ overlappingEnzymes.push(fragment);
92
+ return false;
93
+ }
94
+ return true;
95
+ });
96
+ return {
97
+ computePartialDigestDisabled,
98
+ computeDigestDisabled,
99
+ fragments,
100
+ overlappingEnzymes
101
+ };
102
+ };
103
+
104
+ function addSizeIdName(frag, sequenceLength) {
105
+ const size = getRangeLength(
106
+ { start: frag.start, end: frag.end },
107
+ sequenceLength
108
+ );
109
+ const name = `${get(
110
+ frag,
111
+ "cut1.restrictionEnzyme.name",
112
+ "Untitled Cutsite"
113
+ )} -- ${get(
114
+ frag,
115
+ "cut2.restrictionEnzyme.name",
116
+ "Untitled Cutsite"
117
+ )} ${size} bps`;
118
+
119
+ return {
120
+ ...frag,
121
+ size,
122
+ name,
123
+ id: frag.start + "-" + frag.end + "-" + size + "-"
124
+ };
125
+ }
@@ -0,0 +1,134 @@
1
+ import chaiSubset from "chai-subset";
2
+ import chai from "chai";
3
+
4
+ //UNDER CONSTRUCTION
5
+ import getVirtualDigest from "./getVirtualDigest";
6
+
7
+ chai.should();
8
+ chai.use(chaiSubset);
9
+
10
+ describe("getVirtualDigest", () => {
11
+ // it('should be further developed', function() {
12
+
13
+ // })
14
+ it("should return the correct fragments given a set of cutsites and computePartialDigest=true", () => {
15
+ const { fragments } = getVirtualDigest({
16
+ cutsites: [{ topSnipPosition: 10 }, { topSnipPosition: 20 }],
17
+ sequenceLength: 100,
18
+ isCircular: true,
19
+ computePartialDigest: true
20
+ });
21
+ fragments.should.containSubset([
22
+ {
23
+ cut1: { topSnipPosition: 10 },
24
+ cut2: { topSnipPosition: 10 },
25
+ start: 10,
26
+ end: 9,
27
+ size: 100,
28
+ id: "10-9-100-"
29
+ },
30
+ {
31
+ cut1: { topSnipPosition: 10 },
32
+ cut2: { topSnipPosition: 20 },
33
+ start: 10,
34
+ end: 19,
35
+ size: 10,
36
+ id: "10-19-10-"
37
+ },
38
+ {
39
+ cut1: { topSnipPosition: 20 },
40
+ cut2: { topSnipPosition: 10 },
41
+ start: 20,
42
+ end: 9,
43
+ size: 90,
44
+ id: "20-9-90-"
45
+ },
46
+ {
47
+ cut1: { topSnipPosition: 20 },
48
+ cut2: { topSnipPosition: 20 },
49
+ start: 20,
50
+ end: 19,
51
+ size: 100,
52
+ id: "20-19-100-"
53
+ }
54
+ ]);
55
+ });
56
+ it("should return the correct fragments given a set of cutsites", () => {
57
+ const { fragments } = getVirtualDigest({
58
+ cutsites: [{ topSnipPosition: 10 }, { topSnipPosition: 20 }],
59
+ sequenceLength: 100,
60
+ isCircular: true,
61
+ computePartialDigest: false
62
+ });
63
+ fragments.should.containSubset([
64
+ {
65
+ cut1: { topSnipPosition: 10 },
66
+ cut2: { topSnipPosition: 20 },
67
+ start: 10,
68
+ end: 19,
69
+ size: 10,
70
+ id: "10-19-10-"
71
+ },
72
+ {
73
+ cut1: { topSnipPosition: 20 },
74
+ cut2: { topSnipPosition: 10 },
75
+ start: 20,
76
+ end: 9,
77
+ size: 90,
78
+ id: "20-9-90-"
79
+ }
80
+ ]);
81
+ });
82
+ it("should return the correct fragments given a set of cutsites and a linear sequence", () => {
83
+ const { fragments } = getVirtualDigest({
84
+ cutsites: [{ topSnipPosition: 10 }, { topSnipPosition: 20 }],
85
+ sequenceLength: 100,
86
+ isCircular: false,
87
+ computePartialDigest: false
88
+ });
89
+ fragments.should.containSubset([
90
+ {
91
+ cut1: {
92
+ topSnipPosition: 10
93
+ },
94
+ cut2: {
95
+ topSnipPosition: 20
96
+ },
97
+ start: 10,
98
+ end: 19,
99
+ size: 10,
100
+ id: "10-19-10-"
101
+ },
102
+ {
103
+ start: 20,
104
+ end: 99,
105
+ cut1: {
106
+ topSnipPosition: 20
107
+ },
108
+ cut2: {
109
+ restrictionEnzyme: {
110
+ name: "End Of Seq"
111
+ },
112
+ type: "endOfSeq"
113
+ },
114
+ size: 80,
115
+ id: "20-99-80-"
116
+ },
117
+ {
118
+ start: 0,
119
+ end: 9,
120
+ cut1: {
121
+ restrictionEnzyme: {
122
+ name: "Start Of Seq"
123
+ },
124
+ type: "startOfSeq"
125
+ },
126
+ cut2: {
127
+ topSnipPosition: 10
128
+ },
129
+ size: 10,
130
+ id: "0-9-10-"
131
+ }
132
+ ]);
133
+ });
134
+ });