@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,196 @@
1
+ import {expect} from "chai";
2
+ import mapAnnotationsToRows from "./mapAnnotationsToRows.js";
3
+ describe("prepareCircularViewData", () => {
4
+ it("maps overlapping annotations to rows correctly", () => {
5
+ const annotation1 = {
6
+ start: 0,
7
+ end: 9,
8
+ id: "a"
9
+ };
10
+ const annotation2 = {
11
+ start: 0,
12
+ end: 9,
13
+ id: "b"
14
+ };
15
+ const annotations = [annotation1, annotation2];
16
+ const sequenceLength = 10;
17
+ const bpsPerRow = 5;
18
+ const annotationsToRowsMap = mapAnnotationsToRows(
19
+ annotations,
20
+ sequenceLength,
21
+ bpsPerRow
22
+ );
23
+ expect(annotationsToRowsMap).to.deep.equal({
24
+ 0: [
25
+ {
26
+ annotation: annotation1,
27
+ start: 0,
28
+ end: 4,
29
+ id: annotation1.id,
30
+ yOffset: 0,
31
+ enclosingRangeType: "beginningAndEnd"
32
+ },
33
+ {
34
+ start: 0,
35
+ end: 4,
36
+ id: annotation2.id,
37
+ yOffset: 1,
38
+ annotation: annotation2,
39
+ enclosingRangeType: "beginningAndEnd"
40
+ }
41
+ ],
42
+ 1: [
43
+ {
44
+ annotation: annotation1,
45
+ start: 5,
46
+ end: 9,
47
+ id: annotation1.id,
48
+ yOffset: 0,
49
+ enclosingRangeType: "beginningAndEnd"
50
+ },
51
+ {
52
+ start: 5,
53
+ end: 9,
54
+ id: annotation2.id,
55
+ yOffset: 1,
56
+ annotation: annotation2,
57
+ enclosingRangeType: "beginningAndEnd"
58
+ }
59
+ ]
60
+ });
61
+ });
62
+ it("correctly calculates y-offset for annotation split by origin", () => {
63
+ const annotation1 = {
64
+ start: 7,
65
+ end: 9,
66
+ id: "a"
67
+ };
68
+ const annotation2 = {
69
+ start: 5,
70
+ end: 3,
71
+ id: "b"
72
+ };
73
+ const annotations = [annotation1, annotation2];
74
+ const sequenceLength = 10;
75
+ const bpsPerRow = 10;
76
+ const annotationsToRowsMap = mapAnnotationsToRows(
77
+ annotations,
78
+ sequenceLength,
79
+ bpsPerRow
80
+ );
81
+ expect(annotationsToRowsMap).to.deep.equal({
82
+ 0: [
83
+ {
84
+ start: 7,
85
+ end: 9,
86
+ id: annotation1.id,
87
+ yOffset: 0,
88
+ annotation: annotation1,
89
+ enclosingRangeType: "beginningAndEnd"
90
+ },
91
+ {
92
+ annotation: annotation2,
93
+ start: 0,
94
+ end: 3,
95
+ id: annotation2.id,
96
+ yOffset: 1,
97
+ enclosingRangeType: "end"
98
+ },
99
+ {
100
+ annotation: annotation2,
101
+ start: 5,
102
+ end: 9,
103
+ id: annotation2.id,
104
+ yOffset: 1,
105
+ enclosingRangeType: "beginning"
106
+ }
107
+ ]
108
+ });
109
+ });
110
+ it("correctly calculates y-offset for annotation split by origin (different ordering of annotations)", () => {
111
+ const annotation1 = {
112
+ start: 5,
113
+ end: 3,
114
+ id: "a"
115
+ };
116
+ const annotation2 = {
117
+ start: 7,
118
+ end: 9,
119
+ id: "b"
120
+ };
121
+ const annotations = [annotation1, annotation2];
122
+ const sequenceLength = 10;
123
+ const bpsPerRow = 10;
124
+ const annotationsToRowsMap = mapAnnotationsToRows(
125
+ annotations,
126
+ sequenceLength,
127
+ bpsPerRow
128
+ );
129
+ expect(annotationsToRowsMap).to.deep.equal({
130
+ 0: [
131
+ {
132
+ annotation: annotation1,
133
+ start: 0,
134
+ end: 3,
135
+ id: annotation1.id,
136
+ yOffset: 0,
137
+ enclosingRangeType: "end"
138
+ },
139
+ {
140
+ annotation: annotation1,
141
+ start: 5,
142
+ end: 9,
143
+ id: annotation1.id,
144
+ yOffset: 0,
145
+ enclosingRangeType: "beginning"
146
+ },
147
+ {
148
+ start: 7,
149
+ end: 9,
150
+ id: annotation2.id,
151
+ yOffset: 1,
152
+ annotation: annotation2,
153
+ enclosingRangeType: "beginningAndEnd"
154
+ }
155
+ ]
156
+ });
157
+ });
158
+
159
+ it("maps single annotation to rows correctly", () => {
160
+ const annotation1 = {
161
+ start: 0,
162
+ end: 9,
163
+ id: "a"
164
+ };
165
+ const annotations = [annotation1];
166
+ const sequenceLength = 10;
167
+ const bpsPerRow = 5;
168
+ const annotationsToRowsMap = mapAnnotationsToRows(
169
+ annotations,
170
+ sequenceLength,
171
+ bpsPerRow
172
+ );
173
+ expect(annotationsToRowsMap).to.deep.equal({
174
+ 0: [
175
+ {
176
+ annotation: annotation1,
177
+ start: 0,
178
+ end: 4,
179
+ id: annotation1.id,
180
+ yOffset: 0,
181
+ enclosingRangeType: "beginningAndEnd"
182
+ }
183
+ ],
184
+ 1: [
185
+ {
186
+ annotation: annotation1,
187
+ start: 5,
188
+ end: 9,
189
+ id: annotation1.id,
190
+ yOffset: 0,
191
+ enclosingRangeType: "beginningAndEnd"
192
+ }
193
+ ]
194
+ });
195
+ });
196
+ });
@@ -0,0 +1,41 @@
1
+
2
+ // ac.throw([ac.posInt, ac.posInt, ac.bool], arguments);
3
+ import mapAnnotationsToRows from "./mapAnnotationsToRows";
4
+
5
+ import { annotationTypes } from "./annotationTypes";
6
+
7
+ export default function prepareRowData(sequenceData, bpsPerRow) {
8
+ // ac.throw([ac.sequenceData, ac.posInt], arguments);
9
+ const sequenceLength = sequenceData.sequence.length;
10
+ const totalRows = Math.ceil(sequenceLength / bpsPerRow) || 1; //this check makes sure there is always at least 1 row!
11
+ const rows = [];
12
+ const rowMap = {};
13
+ annotationTypes.forEach(type => {
14
+ rowMap[type] = mapAnnotationsToRows(
15
+ sequenceData[type],
16
+ sequenceLength,
17
+ bpsPerRow,
18
+ { splitForwardReverse: type === "primers" }
19
+ );
20
+ });
21
+
22
+ for (let rowNumber = 0; rowNumber < totalRows; rowNumber++) {
23
+ const row = {};
24
+ row.rowNumber = rowNumber;
25
+ row.start = rowNumber * bpsPerRow;
26
+ row.end =
27
+ (rowNumber + 1) * bpsPerRow - 1 < sequenceLength
28
+ ? (rowNumber + 1) * bpsPerRow - 1
29
+ : sequenceLength - 1;
30
+ if (row.end < 0) {
31
+ row.end = 0;
32
+ }
33
+ annotationTypes.forEach(type => {
34
+ row[type] = rowMap[type][rowNumber] || [];
35
+ });
36
+ row.sequence = sequenceData.sequence.slice(row.start, row.end + 1);
37
+
38
+ rows[rowNumber] = row;
39
+ }
40
+ return rows;
41
+ };
@@ -0,0 +1,36 @@
1
+
2
+
3
+ import {expect} from "chai";
4
+
5
+ import prepareRowData from "./prepareRowData";
6
+ import output1 from "./prepareRowData_output1.json";
7
+
8
+ describe("prepareRowData", () => {
9
+ it("maps overlapping annotations to rows correctly", () => {
10
+ const annotation1 = {
11
+ start: 0,
12
+ end: 9,
13
+ id: "a"
14
+ };
15
+ const annotation2 = {
16
+ start: 10,
17
+ end: 4,
18
+ id: "b"
19
+ };
20
+ const bpsPerRow = 5;
21
+ const sequenceData = {
22
+ sequence: "gagagagagagagaga",
23
+ features: [annotation1],
24
+ translations: [annotation1],
25
+ parts: { a: annotation1 },
26
+ cutsites: { b: annotation2 },
27
+ orfs: [annotation2],
28
+ primers: [annotation2, { id: "asdfa", start: 1, end: 3, forward: true }], //reverse primers shouldn't offset forward primers
29
+ warnings: [annotation2],
30
+ assemblyPieces: [annotation2],
31
+ lineageAnnotations: [annotation2]
32
+ };
33
+ const rowData = prepareRowData(sequenceData, bpsPerRow);
34
+ expect(rowData).to.deep.equal(output1);
35
+ });
36
+ });
@@ -0,0 +1,391 @@
1
+ [
2
+ {
3
+ "rowNumber": 0,
4
+ "start": 0,
5
+ "end": 4,
6
+ "features": [
7
+ {
8
+ "id": "a",
9
+ "annotation": {
10
+ "start": 0,
11
+ "end": 9,
12
+ "id": "a"
13
+ },
14
+ "start": 0,
15
+ "end": 4,
16
+ "yOffset": 0,
17
+ "enclosingRangeType": "beginningAndEnd"
18
+ }
19
+ ],
20
+ "warnings": [
21
+ {
22
+ "id": "b",
23
+ "annotation": {
24
+ "start": 10,
25
+ "end": 4,
26
+ "id": "b"
27
+ },
28
+ "start": 0,
29
+ "end": 4,
30
+ "yOffset": 0,
31
+ "enclosingRangeType": "end"
32
+ }
33
+ ],
34
+ "assemblyPieces": [
35
+ {
36
+ "id": "b",
37
+ "annotation": {
38
+ "start": 10,
39
+ "end": 4,
40
+ "id": "b"
41
+ },
42
+ "start": 0,
43
+ "end": 4,
44
+ "yOffset": 0,
45
+ "enclosingRangeType": "end"
46
+ }
47
+ ],
48
+ "lineageAnnotations": [
49
+ {
50
+ "id": "b",
51
+ "annotation": {
52
+ "start": 10,
53
+ "end": 4,
54
+ "id": "b"
55
+ },
56
+ "start": 0,
57
+ "end": 4,
58
+ "yOffset": 0,
59
+ "enclosingRangeType": "end"
60
+ }
61
+ ],
62
+ "parts": [
63
+ {
64
+ "id": "a",
65
+ "annotation": {
66
+ "start": 0,
67
+ "end": 9,
68
+ "id": "a"
69
+ },
70
+ "start": 0,
71
+ "end": 4,
72
+ "yOffset": 0,
73
+ "enclosingRangeType": "beginningAndEnd"
74
+ }
75
+ ],
76
+ "cutsites": [
77
+ {
78
+ "id": "b",
79
+ "annotation": {
80
+ "start": 10,
81
+ "end": 4,
82
+ "id": "b"
83
+ },
84
+ "start": 0,
85
+ "end": 4,
86
+ "yOffset": 0,
87
+ "enclosingRangeType": "end"
88
+ }
89
+ ],
90
+ "orfs": [
91
+ {
92
+ "id": "b",
93
+ "annotation": {
94
+ "start": 10,
95
+ "end": 4,
96
+ "id": "b"
97
+ },
98
+ "start": 0,
99
+ "end": 4,
100
+ "yOffset": 0,
101
+ "enclosingRangeType": "end"
102
+ }
103
+ ],
104
+ "translations": [
105
+ {
106
+ "id": "a",
107
+ "annotation": {
108
+ "start": 0,
109
+ "end": 9,
110
+ "id": "a"
111
+ },
112
+ "start": 0,
113
+ "end": 4,
114
+ "yOffset": 0,
115
+ "enclosingRangeType": "beginningAndEnd"
116
+ }
117
+ ],
118
+ "primers": [
119
+ {
120
+ "id": "b",
121
+ "annotation": {
122
+ "start": 10,
123
+ "end": 4,
124
+ "id": "b"
125
+ },
126
+ "start": 0,
127
+ "end": 4,
128
+ "yOffset": 0,
129
+ "enclosingRangeType": "end"
130
+ },
131
+ {
132
+ "id": "asdfa",
133
+ "annotation": {
134
+ "id": "asdfa",
135
+ "start": 1,
136
+ "end": 3,
137
+ "forward": true
138
+ },
139
+ "start": 1,
140
+ "end": 3,
141
+ "yOffset": 0,
142
+ "enclosingRangeType": "beginningAndEnd"
143
+ }
144
+ ],
145
+ "guides": [],
146
+ "sequence": "gagag"
147
+ },
148
+ {
149
+ "rowNumber": 1,
150
+ "start": 5,
151
+ "end": 9,
152
+ "features": [
153
+ {
154
+ "id": "a",
155
+ "annotation": {
156
+ "start": 0,
157
+ "end": 9,
158
+ "id": "a"
159
+ },
160
+ "start": 5,
161
+ "end": 9,
162
+ "yOffset": 0,
163
+ "enclosingRangeType": "beginningAndEnd"
164
+ }
165
+ ],
166
+ "warnings": [],
167
+ "assemblyPieces": [],
168
+ "lineageAnnotations": [],
169
+ "parts": [
170
+ {
171
+ "id": "a",
172
+ "annotation": {
173
+ "start": 0,
174
+ "end": 9,
175
+ "id": "a"
176
+ },
177
+ "start": 5,
178
+ "end": 9,
179
+ "yOffset": 0,
180
+ "enclosingRangeType": "beginningAndEnd"
181
+ }
182
+ ],
183
+ "cutsites": [],
184
+ "orfs": [],
185
+ "translations": [
186
+ {
187
+ "id": "a",
188
+ "annotation": {
189
+ "start": 0,
190
+ "end": 9,
191
+ "id": "a"
192
+ },
193
+ "start": 5,
194
+ "end": 9,
195
+ "yOffset": 0,
196
+ "enclosingRangeType": "beginningAndEnd"
197
+ }
198
+ ],
199
+ "primers": [],
200
+ "guides": [],
201
+ "sequence": "agaga"
202
+ },
203
+ {
204
+ "rowNumber": 2,
205
+ "start": 10,
206
+ "end": 14,
207
+ "features": [],
208
+ "warnings": [
209
+ {
210
+ "id": "b",
211
+ "annotation": {
212
+ "start": 10,
213
+ "end": 4,
214
+ "id": "b"
215
+ },
216
+ "start": 10,
217
+ "end": 14,
218
+ "yOffset": 0,
219
+ "enclosingRangeType": "beginning"
220
+ }
221
+ ],
222
+ "assemblyPieces": [
223
+ {
224
+ "id": "b",
225
+ "annotation": {
226
+ "start": 10,
227
+ "end": 4,
228
+ "id": "b"
229
+ },
230
+ "start": 10,
231
+ "end": 14,
232
+ "yOffset": 0,
233
+ "enclosingRangeType": "beginning"
234
+ }
235
+ ],
236
+ "lineageAnnotations": [
237
+ {
238
+ "id": "b",
239
+ "annotation": {
240
+ "start": 10,
241
+ "end": 4,
242
+ "id": "b"
243
+ },
244
+ "start": 10,
245
+ "end": 14,
246
+ "yOffset": 0,
247
+ "enclosingRangeType": "beginning"
248
+ }
249
+ ],
250
+ "parts": [],
251
+ "cutsites": [
252
+ {
253
+ "id": "b",
254
+ "annotation": {
255
+ "start": 10,
256
+ "end": 4,
257
+ "id": "b"
258
+ },
259
+ "start": 10,
260
+ "end": 14,
261
+ "yOffset": 0,
262
+ "enclosingRangeType": "beginning"
263
+ }
264
+ ],
265
+ "orfs": [
266
+ {
267
+ "id": "b",
268
+ "annotation": {
269
+ "start": 10,
270
+ "end": 4,
271
+ "id": "b"
272
+ },
273
+ "start": 10,
274
+ "end": 14,
275
+ "yOffset": 0,
276
+ "enclosingRangeType": "beginning"
277
+ }
278
+ ],
279
+ "translations": [],
280
+ "primers": [
281
+ {
282
+ "id": "b",
283
+ "annotation": {
284
+ "start": 10,
285
+ "end": 4,
286
+ "id": "b"
287
+ },
288
+ "start": 10,
289
+ "end": 14,
290
+ "yOffset": 0,
291
+ "enclosingRangeType": "beginning"
292
+ }
293
+ ],
294
+ "guides": [],
295
+ "sequence": "gagag"
296
+ },
297
+ {
298
+ "rowNumber": 3,
299
+ "start": 15,
300
+ "end": 15,
301
+ "features": [],
302
+ "warnings": [
303
+ {
304
+ "id": "b",
305
+ "annotation": {
306
+ "start": 10,
307
+ "end": 4,
308
+ "id": "b"
309
+ },
310
+ "start": 15,
311
+ "end": 15,
312
+ "yOffset": 0,
313
+ "enclosingRangeType": "beginning"
314
+ }
315
+ ],
316
+ "assemblyPieces": [
317
+ {
318
+ "id": "b",
319
+ "annotation": {
320
+ "start": 10,
321
+ "end": 4,
322
+ "id": "b"
323
+ },
324
+ "start": 15,
325
+ "end": 15,
326
+ "yOffset": 0,
327
+ "enclosingRangeType": "beginning"
328
+ }
329
+ ],
330
+ "lineageAnnotations": [
331
+ {
332
+ "id": "b",
333
+ "annotation": {
334
+ "start": 10,
335
+ "end": 4,
336
+ "id": "b"
337
+ },
338
+ "start": 15,
339
+ "end": 15,
340
+ "yOffset": 0,
341
+ "enclosingRangeType": "beginning"
342
+ }
343
+ ],
344
+ "parts": [],
345
+ "cutsites": [
346
+ {
347
+ "id": "b",
348
+ "annotation": {
349
+ "start": 10,
350
+ "end": 4,
351
+ "id": "b"
352
+ },
353
+ "start": 15,
354
+ "end": 15,
355
+ "yOffset": 0,
356
+ "enclosingRangeType": "beginning"
357
+ }
358
+ ],
359
+ "orfs": [
360
+ {
361
+ "id": "b",
362
+ "annotation": {
363
+ "start": 10,
364
+ "end": 4,
365
+ "id": "b"
366
+ },
367
+ "start": 15,
368
+ "end": 15,
369
+ "yOffset": 0,
370
+ "enclosingRangeType": "beginning"
371
+ }
372
+ ],
373
+ "translations": [],
374
+ "primers": [
375
+ {
376
+ "id": "b",
377
+ "annotation": {
378
+ "start": 10,
379
+ "end": 4,
380
+ "id": "b"
381
+ },
382
+ "start": 15,
383
+ "end": 15,
384
+ "yOffset": 0,
385
+ "enclosingRangeType": "beginning"
386
+ }
387
+ ],
388
+ "guides": [],
389
+ "sequence": "a"
390
+ }
391
+ ]