@teselagen/sequence-utils 0.3.7 → 0.3.9
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.
- package/README.md +89 -0
- package/bioData.d.ts +1 -339
- package/filterSequenceString.d.ts +26 -1
- package/index.d.ts +7 -8
- package/index.js +329 -413
- package/index.mjs +329 -413
- package/index.umd.js +329 -413
- package/package.json +1 -2
- package/src/addGapsToSeqReads.js +2 -2
- package/src/adjustAnnotationsToInsert.js +3 -3
- package/src/adjustBpsToReplaceOrInsert.js +3 -3
- package/src/adjustBpsToReplaceOrInsert.test.js +0 -1
- package/src/aminoAcidToDnaRna.test.js +1 -1
- package/src/annotateSingleSeq.js +1 -1
- package/src/annotateSingleSeq.test.js +1 -4
- package/src/autoAnnotate.js +5 -2
- package/src/autoAnnotate.test.js +6 -30
- package/src/bioData.js +1 -366
- package/src/calculateNebTa.js +1 -1
- package/src/calculateNebTm.js +1 -1
- package/src/calculatePercentGC.js +2 -2
- package/src/calculateTm.js +19 -102
- package/src/computeDigestFragments.js +7 -4
- package/src/computeDigestFragments.test.js +1 -1
- package/src/condensePairwiseAlignmentDifferences.js +1 -1
- package/src/convertAACaretPositionOrRangeToDna.js +1 -1
- package/src/convertDnaCaretPositionOrRangeToAA.js +1 -1
- package/src/cutSequenceByRestrictionEnzyme.js +3 -3
- package/src/cutSequenceByRestrictionEnzyme.test.js +0 -1
- package/src/degenerateDnaToAminoAcidMap.js +1 -1
- package/src/degenerateRnaToAminoAcidMap.js +1 -1
- package/src/deleteSequenceDataAtRange.js +1 -1
- package/src/deleteSequenceDataAtRange.test.js +23 -9
- package/src/diffUtils.js +4 -4
- package/src/diffUtils.test.js +2 -2
- package/src/doesEnzymeChopOutsideOfRecognitionSite.js +1 -1
- package/src/doesEnzymeChopOutsideOfRecognitionSite.test.js +0 -2
- package/src/featureTypesAndColors.js +5 -5
- package/src/featureTypesAndColors.test.js +1 -1
- package/src/filterSequenceString.js +111 -16
- package/src/filterSequenceString.test.js +62 -3
- package/src/findNearestRangeOfSequenceOverlapToPosition.js +1 -1
- package/src/findOrfsInPlasmid.js +1 -1
- package/src/findSequenceMatches.js +9 -10
- package/src/generateAnnotations.js +1 -1
- package/src/generateSequenceData.js +1 -1
- package/src/generateSequenceData.test.js +1 -1
- package/src/getAllInsertionsInSeqReads.js +1 -1
- package/src/getAminoAcidDataForEachBaseOfDna.js +2 -2
- package/src/getAminoAcidDataForEachBaseOfDna.test.js +0 -2
- package/src/getAminoAcidFromSequenceTriplet.js +1 -1
- package/src/getAminoAcidStringFromSequenceString.js +1 -1
- package/src/getCodonRangeForAASliver.js +1 -1
- package/src/getComplementAminoAcidStringFromSequenceString.js +2 -5
- package/src/getComplementSequenceAndAnnotations.js +1 -2
- package/src/getComplementSequenceString.js +5 -3
- package/src/getComplementSequenceString.test.js +6 -6
- package/src/getCutsiteType.js +1 -1
- package/src/getCutsitesFromSequence.js +1 -1
- package/src/getDegenerateDnaStringFromAAString.js +1 -1
- package/src/getDegenerateRnaStringFromAAString.js +1 -1
- package/src/getDigestFragmentsForCutsites.js +5 -2
- package/src/getDigestFragmentsForRestrictionEnzymes.js +2 -2
- package/src/getInsertBetweenVals.js +2 -2
- package/src/getLeftAndRightOfSequenceInRangeGivenPosition.js +2 -2
- package/src/getLeftAndRightOfSequenceInRangeGivenPosition.test.js +0 -2
- package/src/getMassOfAaString.js +4 -1
- package/src/getMassofAaString.test.js +9 -8
- package/src/getOrfsFromSequence.js +1 -2
- package/src/getOrfsFromSequence.test.js +1 -3
- package/src/getOverlapBetweenTwoSequences.js +3 -3
- package/src/getOverlapBetweenTwoSequences.test.js +1 -1
- package/src/getPossiblePartsFromSequenceAndEnzymes.js +2 -2
- package/src/getReverseAminoAcidStringFromSequenceString.js +1 -1
- package/src/getReverseComplementAminoAcidStringFromSequenceString.js +9 -6
- package/src/getReverseComplementAnnotation.js +1 -1
- package/src/getReverseComplementSequenceAndAnnotations.js +2 -3
- package/src/getReverseComplementSequenceString.js +1 -2
- package/src/getReverseSequenceString.js +1 -1
- package/src/getSequenceDataBetweenRange.js +7 -4
- package/src/getSequenceDataBetweenRange.test.js +0 -1
- package/src/getVirtualDigest.js +6 -3
- package/src/guessIfSequenceIsDnaAndNotProtein.js +2 -2
- package/src/index.js +79 -80
- package/src/index.test.js +5 -4
- package/src/insertGapsIntoRefSeq.js +1 -1
- package/src/insertSequenceDataAtPosition.test.js +4 -2
- package/src/insertSequenceDataAtPositionOrRange.js +5 -5
- package/src/insertSequenceDataAtPositionOrRange.test.js +3 -17
- package/src/isEnzymeType2S.js +1 -1
- package/src/mapAnnotationsToRows.js +3 -3
- package/src/mapAnnotationsToRows.test.js +1 -3
- package/src/prepareCircularViewData.js +5 -5
- package/src/prepareCircularViewData.test.js +1 -1
- package/src/prepareRowData.js +1 -2
- package/src/prepareRowData.test.js +1 -3
- package/src/prepareRowData_output1.json +381 -381
- package/src/proteinAlphabet.js +31 -26
- package/src/rotateBpsToPosition.js +7 -11
- package/src/rotateBpsToPosition.test.js +6 -6
- package/src/rotateSequenceDataToPosition.js +4 -4
- package/src/shiftAnnotationsByLen.js +2 -2
- package/src/tidyUpAnnotation.js +8 -7
- package/src/tidyUpSequenceData.js +15 -18
- package/filterAminoAcidSequenceString.d.ts +0 -1
- package/filterAminoAcidSequenceString.test.d.ts +0 -1
- package/src/filterAminoAcidSequenceString.js +0 -13
- package/src/filterAminoAcidSequenceString.test.js +0 -22
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
//tnr: half finished test.
|
|
2
2
|
|
|
3
|
-
|
|
4
3
|
import chai from "chai";
|
|
5
4
|
|
|
6
|
-
import {getRangeLength} from "@teselagen/range-utils";
|
|
7
|
-
import {cloneDeep} from "lodash";
|
|
5
|
+
import { getRangeLength } from "@teselagen/range-utils";
|
|
6
|
+
import { cloneDeep } from "lodash";
|
|
8
7
|
import chaiSubset from "chai-subset";
|
|
9
8
|
|
|
10
9
|
import deleteSequenceDataAtRange from "./deleteSequenceDataAtRange";
|
|
@@ -18,7 +17,10 @@ describe("deleteSequenceDataAtRange", () => {
|
|
|
18
17
|
sequence: "atagatag"
|
|
19
18
|
};
|
|
20
19
|
const range = { start: 0, end: 7 };
|
|
21
|
-
const postDeleteSeqData = deleteSequenceDataAtRange(
|
|
20
|
+
const postDeleteSeqData = deleteSequenceDataAtRange(
|
|
21
|
+
existingSequence,
|
|
22
|
+
range
|
|
23
|
+
);
|
|
22
24
|
postDeleteSeqData.sequence.length.should.equal(
|
|
23
25
|
existingSequence.sequence.length - getRangeLength(range)
|
|
24
26
|
);
|
|
@@ -28,7 +30,10 @@ describe("deleteSequenceDataAtRange", () => {
|
|
|
28
30
|
sequence: "atagatag"
|
|
29
31
|
};
|
|
30
32
|
const range = { start: 4, end: 3 };
|
|
31
|
-
const postDeleteSeqData = deleteSequenceDataAtRange(
|
|
33
|
+
const postDeleteSeqData = deleteSequenceDataAtRange(
|
|
34
|
+
existingSequence,
|
|
35
|
+
range
|
|
36
|
+
);
|
|
32
37
|
postDeleteSeqData.sequence.length.should.equal(
|
|
33
38
|
existingSequence.sequence.length -
|
|
34
39
|
getRangeLength(range, existingSequence.sequence.length)
|
|
@@ -39,7 +44,10 @@ describe("deleteSequenceDataAtRange", () => {
|
|
|
39
44
|
sequence: "atagatag"
|
|
40
45
|
};
|
|
41
46
|
const range = { start: 3, end: 5 };
|
|
42
|
-
const postDeleteSeqData = deleteSequenceDataAtRange(
|
|
47
|
+
const postDeleteSeqData = deleteSequenceDataAtRange(
|
|
48
|
+
existingSequence,
|
|
49
|
+
range
|
|
50
|
+
);
|
|
43
51
|
postDeleteSeqData.sequence.length.should.equal(
|
|
44
52
|
existingSequence.sequence.length - getRangeLength(range)
|
|
45
53
|
);
|
|
@@ -48,7 +56,7 @@ describe("deleteSequenceDataAtRange", () => {
|
|
|
48
56
|
const existingSequence = {
|
|
49
57
|
sequence: "atagatag",
|
|
50
58
|
features: {
|
|
51
|
-
|
|
59
|
+
1: {
|
|
52
60
|
start: 7,
|
|
53
61
|
end: 7
|
|
54
62
|
}
|
|
@@ -56,7 +64,10 @@ describe("deleteSequenceDataAtRange", () => {
|
|
|
56
64
|
};
|
|
57
65
|
const clonedExistingSeq = cloneDeep(existingSequence);
|
|
58
66
|
const range = { start: 3, end: 5 };
|
|
59
|
-
const postDeleteSeqData = deleteSequenceDataAtRange(
|
|
67
|
+
const postDeleteSeqData = deleteSequenceDataAtRange(
|
|
68
|
+
existingSequence,
|
|
69
|
+
range
|
|
70
|
+
);
|
|
60
71
|
existingSequence.should.deep.equal(clonedExistingSeq);
|
|
61
72
|
postDeleteSeqData.sequence.length.should.equal(
|
|
62
73
|
existingSequence.sequence.length - getRangeLength(range)
|
|
@@ -78,7 +89,10 @@ describe("deleteSequenceDataAtRange", () => {
|
|
|
78
89
|
]
|
|
79
90
|
};
|
|
80
91
|
const range = { start: -1, end: -1 };
|
|
81
|
-
const postDeleteSeqData = deleteSequenceDataAtRange(
|
|
92
|
+
const postDeleteSeqData = deleteSequenceDataAtRange(
|
|
93
|
+
existingSequence,
|
|
94
|
+
range
|
|
95
|
+
);
|
|
82
96
|
postDeleteSeqData.should.containSubset({
|
|
83
97
|
sequence: "atgagagaga",
|
|
84
98
|
features: [
|
package/src/diffUtils.js
CHANGED
|
@@ -13,7 +13,7 @@ const getDiffFromSeqs = (oldData, newData, { ignoreKeys = [] } = {}) => {
|
|
|
13
13
|
noTranslationData: true
|
|
14
14
|
});
|
|
15
15
|
|
|
16
|
-
[oldData, newData].forEach(
|
|
16
|
+
[oldData, newData].forEach(d => {
|
|
17
17
|
[
|
|
18
18
|
"cutsites",
|
|
19
19
|
"orfs",
|
|
@@ -23,7 +23,7 @@ const getDiffFromSeqs = (oldData, newData, { ignoreKeys = [] } = {}) => {
|
|
|
23
23
|
"description",
|
|
24
24
|
"materiallyAvailable",
|
|
25
25
|
...ignoreKeys
|
|
26
|
-
].forEach(
|
|
26
|
+
].forEach(prop => {
|
|
27
27
|
delete d[prop];
|
|
28
28
|
});
|
|
29
29
|
if (d.translations) {
|
|
@@ -43,7 +43,7 @@ const getDiffFromSeqs = (oldData, newData, { ignoreKeys = [] } = {}) => {
|
|
|
43
43
|
return diff(oldData, newData);
|
|
44
44
|
};
|
|
45
45
|
const patchSeqWithDiff = (oldData, diff, { ignoreKeys = [] } = {}) => {
|
|
46
|
-
ignoreKeys.forEach(
|
|
46
|
+
ignoreKeys.forEach(k => {
|
|
47
47
|
delete diff[k];
|
|
48
48
|
});
|
|
49
49
|
return patch(
|
|
@@ -51,7 +51,7 @@ const patchSeqWithDiff = (oldData, diff, { ignoreKeys = [] } = {}) => {
|
|
|
51
51
|
diff
|
|
52
52
|
);
|
|
53
53
|
};
|
|
54
|
-
const reverseSeqDiff =
|
|
54
|
+
const reverseSeqDiff = diff => {
|
|
55
55
|
return reverse(diff);
|
|
56
56
|
};
|
|
57
57
|
|
package/src/diffUtils.test.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import chai from "chai";
|
|
2
2
|
import assert from "assert";
|
|
3
|
-
import {map} from "lodash";
|
|
3
|
+
import { map } from "lodash";
|
|
4
4
|
import tidyUpSequenceData from "./tidyUpSequenceData";
|
|
5
|
-
import {getDiffFromSeqs, patchSeqWithDiff, reverseSeqDiff} from "./diffUtils";
|
|
5
|
+
import { getDiffFromSeqs, patchSeqWithDiff, reverseSeqDiff } from "./diffUtils";
|
|
6
6
|
import chaiSubset from "chai-subset";
|
|
7
7
|
|
|
8
8
|
chai.should();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {get, keyBy, filter} from "lodash";
|
|
1
|
+
import { get, keyBy, filter } from "lodash";
|
|
2
2
|
|
|
3
3
|
const genbankFeatureTypes = [
|
|
4
4
|
{ name: "-10_signal", color: "#4ECDC4" },
|
|
@@ -137,7 +137,7 @@ const getFeatureTypes = ({ includeHidden } = {}) =>
|
|
|
137
137
|
f => f.name
|
|
138
138
|
);
|
|
139
139
|
|
|
140
|
-
export {genbankFeatureTypes};
|
|
140
|
+
export { genbankFeatureTypes };
|
|
141
141
|
|
|
142
142
|
export function getGenbankFeatureToColorMap() {
|
|
143
143
|
const toRet = {};
|
|
@@ -147,6 +147,6 @@ export function getGenbankFeatureToColorMap() {
|
|
|
147
147
|
return toRet;
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
-
export {getFeatureToColorMap};
|
|
151
|
-
export {getFeatureTypes};
|
|
152
|
-
export {getMergedFeatureMap};
|
|
150
|
+
export { getFeatureToColorMap };
|
|
151
|
+
export { getFeatureTypes };
|
|
152
|
+
export { getMergedFeatureMap };
|
|
@@ -1,22 +1,117 @@
|
|
|
1
|
-
|
|
1
|
+
import {
|
|
2
|
+
ambiguous_dna_letters,
|
|
3
|
+
ambiguous_rna_letters,
|
|
4
|
+
protein_letters_withUandX
|
|
5
|
+
} from "./bioData";
|
|
2
6
|
|
|
3
|
-
//
|
|
4
7
|
export default function filterSequenceString(
|
|
5
8
|
sequenceString,
|
|
6
|
-
|
|
7
|
-
|
|
9
|
+
{
|
|
10
|
+
additionalValidChars = "",
|
|
11
|
+
isOligo,
|
|
12
|
+
name,
|
|
13
|
+
isProtein,
|
|
14
|
+
isRna,
|
|
15
|
+
isMixedRnaAndDna,
|
|
16
|
+
includeStopCodon
|
|
17
|
+
} = {}
|
|
8
18
|
) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
const acceptedChars = getAcceptedChars({
|
|
20
|
+
isOligo,
|
|
21
|
+
isProtein,
|
|
22
|
+
isRna,
|
|
23
|
+
isMixedRnaAndDna,
|
|
24
|
+
includeStopCodon
|
|
25
|
+
});
|
|
26
|
+
const replaceChars = getReplaceChars({
|
|
27
|
+
isOligo,
|
|
28
|
+
isProtein,
|
|
29
|
+
isRna,
|
|
30
|
+
isMixedRnaAndDna
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
let sanitizedVal = "";
|
|
34
|
+
const invalidChars = [];
|
|
35
|
+
const chars = `${acceptedChars}${additionalValidChars.split("").join("\\")}`;
|
|
36
|
+
const warnings = [];
|
|
37
|
+
const replaceCount = {};
|
|
38
|
+
sequenceString.split("").forEach(letter => {
|
|
39
|
+
const lowerLetter = letter.toLowerCase();
|
|
40
|
+
if (replaceChars && replaceChars[lowerLetter]) {
|
|
41
|
+
if (!replaceCount[lowerLetter]) {
|
|
42
|
+
replaceCount[lowerLetter] = 0;
|
|
43
|
+
}
|
|
44
|
+
replaceCount[lowerLetter]++;
|
|
45
|
+
const isUpper = lowerLetter !== letter;
|
|
46
|
+
sanitizedVal += isUpper
|
|
47
|
+
? replaceChars[lowerLetter].toUpperCase()
|
|
48
|
+
: replaceChars[lowerLetter];
|
|
49
|
+
} else if (chars.includes(lowerLetter)) {
|
|
50
|
+
sanitizedVal += letter;
|
|
51
|
+
} else {
|
|
52
|
+
invalidChars.push(letter);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
//add replace count warnings
|
|
56
|
+
Object.keys(replaceCount).forEach(letter => {
|
|
57
|
+
warnings.push(
|
|
58
|
+
`Replaced "${letter}" with "${replaceChars[letter]}"${
|
|
59
|
+
replaceCount[letter] > 1 ? ` ${replaceCount[letter]} times` : ""
|
|
60
|
+
}`
|
|
61
|
+
);
|
|
62
|
+
});
|
|
63
|
+
if (sequenceString.length !== sanitizedVal.length) {
|
|
64
|
+
warnings.push(
|
|
65
|
+
`${
|
|
66
|
+
name ? `Sequence ${name}: ` : ""
|
|
67
|
+
}Invalid character(s) detected and removed: ${invalidChars
|
|
68
|
+
.slice(0, 100)
|
|
69
|
+
.join(", ")} `
|
|
18
70
|
);
|
|
19
|
-
} else {
|
|
20
|
-
return sequenceString;
|
|
21
71
|
}
|
|
22
|
-
|
|
72
|
+
if (typeof window !== "undefined" && window.toastr && warnings.length) {
|
|
73
|
+
warnings.forEach(warning => {
|
|
74
|
+
window.toastr.warning(warning);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return [sanitizedVal, warnings];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function getAcceptedChars({
|
|
82
|
+
isOligo,
|
|
83
|
+
isProtein,
|
|
84
|
+
isRna,
|
|
85
|
+
isMixedRnaAndDna,
|
|
86
|
+
includeStopCodon
|
|
87
|
+
} = {}) {
|
|
88
|
+
return isProtein
|
|
89
|
+
? `${protein_letters_withUandX.toLowerCase()}${
|
|
90
|
+
includeStopCodon ? "*." : ""
|
|
91
|
+
}}`
|
|
92
|
+
: isOligo
|
|
93
|
+
? ambiguous_rna_letters.toLowerCase() + "t"
|
|
94
|
+
: isRna
|
|
95
|
+
? ambiguous_rna_letters.toLowerCase() + "t"
|
|
96
|
+
: isMixedRnaAndDna
|
|
97
|
+
? ambiguous_rna_letters.toLowerCase() + ambiguous_dna_letters.toLowerCase()
|
|
98
|
+
: //just plain old dna
|
|
99
|
+
ambiguous_rna_letters.toLowerCase() + ambiguous_dna_letters.toLowerCase();
|
|
100
|
+
}
|
|
101
|
+
export function getReplaceChars({
|
|
102
|
+
isOligo,
|
|
103
|
+
isProtein,
|
|
104
|
+
isRna,
|
|
105
|
+
isMixedRnaAndDna
|
|
106
|
+
} = {}) {
|
|
107
|
+
return isProtein
|
|
108
|
+
? {}
|
|
109
|
+
: isOligo
|
|
110
|
+
? {}
|
|
111
|
+
: isRna
|
|
112
|
+
? { t: "u" }
|
|
113
|
+
: isMixedRnaAndDna
|
|
114
|
+
? {}
|
|
115
|
+
: //just plain old dna
|
|
116
|
+
{};
|
|
117
|
+
}
|
|
@@ -1,13 +1,72 @@
|
|
|
1
1
|
import filterSequenceString from "./filterSequenceString";
|
|
2
|
+
import { expect } from "vitest";
|
|
2
3
|
|
|
3
4
|
describe("filterSequenceString", () => {
|
|
5
|
+
it("should not filter u's and should convert t's to u's from isOligo=true seqs", () => {
|
|
6
|
+
const [str, warnings] = filterSequenceString("tatuuag--a", {
|
|
7
|
+
isOligo: true
|
|
8
|
+
});
|
|
9
|
+
expect(str).toBe("tatuuaga");
|
|
10
|
+
// expect(warnings[0]).toBe('Replaced "t" with "u" 2 times');
|
|
11
|
+
expect(warnings[0]).toBe(
|
|
12
|
+
"Invalid character(s) detected and removed: -, - "
|
|
13
|
+
);
|
|
14
|
+
});
|
|
15
|
+
it("should not convert u's to t's for isDna (default isDna=true) seqs", () => {
|
|
16
|
+
const [str, warnings] = filterSequenceString("tatuuag--a", {});
|
|
17
|
+
// expect(warnings[0]).toBe('Replaced "u" with "t" 2 times');
|
|
18
|
+
expect(warnings[0]).toBe(
|
|
19
|
+
"Invalid character(s) detected and removed: -, - "
|
|
20
|
+
);
|
|
21
|
+
expect(str).toBe("tatuuaga");
|
|
22
|
+
});
|
|
4
23
|
it("should filter out unwanted chars", () => {
|
|
5
|
-
|
|
24
|
+
const [str, warnings] = filterSequenceString("tatag--a");
|
|
25
|
+
expect(warnings[0]).toBe(
|
|
26
|
+
"Invalid character(s) detected and removed: -, - "
|
|
27
|
+
);
|
|
28
|
+
expect(str).toBe("tataga");
|
|
6
29
|
});
|
|
7
30
|
it("should handle additional chars option", () => {
|
|
8
|
-
|
|
31
|
+
const [str, warnings] = filterSequenceString("tatag--a", {
|
|
32
|
+
additionalValidChars: "-"
|
|
33
|
+
});
|
|
34
|
+
expect(warnings.length).toBe(0);
|
|
35
|
+
expect(str).toBe("tatag--a");
|
|
9
36
|
});
|
|
10
37
|
it("should handle additional chars option", () => {
|
|
11
|
-
|
|
38
|
+
const [str, warnings] = filterSequenceString("tatag--a", {
|
|
39
|
+
additionalValidChars: "f-q"
|
|
40
|
+
});
|
|
41
|
+
expect(warnings.length).toBe(0);
|
|
42
|
+
expect(str).toBe("tatag--a");
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("when isProtein: true, should filter only valid amino acids by default", () => {
|
|
46
|
+
const [str, warnings] = filterSequenceString(
|
|
47
|
+
'bbb342"""xtgalmfwkqespvicyhrnd,,../',
|
|
48
|
+
{
|
|
49
|
+
isProtein: true
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
expect(warnings[0]).toBe(
|
|
53
|
+
'Invalid character(s) detected and removed: b, b, b, 3, 4, 2, ", ", ", ,, ,, ., ., / '
|
|
54
|
+
);
|
|
55
|
+
expect(str).toBe("xtgalmfwkqespvicyhrnd");
|
|
56
|
+
});
|
|
57
|
+
it("when isProtein: true, should handle upper case letters", () => {
|
|
58
|
+
const [str, warnings] = filterSequenceString("xtgalmfWKQEspvicyhrnd", {
|
|
59
|
+
isProtein: true
|
|
60
|
+
});
|
|
61
|
+
expect(warnings.length).toBe(0);
|
|
62
|
+
expect(str).toBe("xtgalmfWKQEspvicyhrnd");
|
|
63
|
+
});
|
|
64
|
+
it("when isProtein: true, should handle the option to includeStopCodon by allowing periods", () => {
|
|
65
|
+
const [str] = filterSequenceString('bbb342"""xtgalmfwkqespvicyhrnd,,../', {
|
|
66
|
+
isProtein: true,
|
|
67
|
+
includeStopCodon: true
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
expect(str).toBe("xtgalmfwkqespvicyhrnd..");
|
|
12
71
|
});
|
|
13
72
|
});
|
package/src/findOrfsInPlasmid.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
modulateRangeBySequenceLength,
|
|
3
|
+
flipContainedRange
|
|
4
|
+
} from "@teselagen/range-utils";
|
|
5
|
+
import { reduce, uniqBy } from "lodash";
|
|
3
6
|
import escapeStringRegexp from "escape-string-regexp";
|
|
4
7
|
import getAminoAcidStringFromSequenceString from "./getAminoAcidStringFromSequenceString";
|
|
5
|
-
import {ambiguous_dna_values, extended_protein_values} from "./bioData";
|
|
8
|
+
import { ambiguous_dna_values, extended_protein_values } from "./bioData";
|
|
6
9
|
import getReverseComplementSequenceString from "./getReverseComplementSequenceString";
|
|
7
10
|
|
|
8
11
|
export default function findSequenceMatches(
|
|
@@ -34,15 +37,11 @@ export default function findSequenceMatches(
|
|
|
34
37
|
matches = [...matches, ...flippedReverseMatches];
|
|
35
38
|
}
|
|
36
39
|
return matches;
|
|
37
|
-
}
|
|
40
|
+
}
|
|
38
41
|
|
|
39
42
|
function findSequenceMatchesTopStrand(sequence, searchString, options = {}) {
|
|
40
|
-
const {
|
|
41
|
-
|
|
42
|
-
isAmbiguous,
|
|
43
|
-
isProteinSequence,
|
|
44
|
-
isProteinSearch
|
|
45
|
-
} = options;
|
|
43
|
+
const { isCircular, isAmbiguous, isProteinSequence, isProteinSearch } =
|
|
44
|
+
options;
|
|
46
45
|
let searchStringToUse = escapeStringRegexp(searchString);
|
|
47
46
|
if (isAmbiguous) {
|
|
48
47
|
if (isProteinSearch || isProteinSequence) {
|
|
@@ -52,7 +52,7 @@ export default function getAllInsertionsInSeqReads(seqReads) {
|
|
|
52
52
|
}
|
|
53
53
|
// sortedInsertions is an array of objects [{bpPos: bp pos of insertion, number: # of insertions}, {bpPos, number}, ...]
|
|
54
54
|
return sortedInsertions;
|
|
55
|
-
}
|
|
55
|
+
}
|
|
56
56
|
|
|
57
57
|
// function getAllInsertionsInSeqReads(seqReads) {
|
|
58
58
|
// let allInsertionBpPosInSeqReads = [];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {translateRange, getSequenceWithinRange} from "@teselagen/range-utils";
|
|
1
|
+
import { translateRange, getSequenceWithinRange } from "@teselagen/range-utils";
|
|
2
2
|
import revComp from "./getReverseComplementSequenceString";
|
|
3
3
|
import getAA from "./getAminoAcidFromSequenceTriplet";
|
|
4
4
|
|
|
@@ -160,4 +160,4 @@ export default function getAminoAcidDataForEachBaseOfDna(
|
|
|
160
160
|
throw new Error("something went wrong!");
|
|
161
161
|
}
|
|
162
162
|
return aminoAcidDataForEachBaseOfDNA;
|
|
163
|
-
}
|
|
163
|
+
}
|
|
@@ -4,8 +4,5 @@ export default function getComplementAminoAcidStringFromSequenceString(
|
|
|
4
4
|
sequenceString
|
|
5
5
|
) {
|
|
6
6
|
const aaString = getAminoAcidStringFromSequenceString(sequenceString, true);
|
|
7
|
-
return aaString
|
|
8
|
-
|
|
9
|
-
.reverse()
|
|
10
|
-
.join("");
|
|
11
|
-
};
|
|
7
|
+
return aaString.split("").reverse().join("");
|
|
8
|
+
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import getComplementSequenceString from "./getComplementSequenceString";
|
|
2
2
|
import tidyUpSequenceData from "./tidyUpSequenceData";
|
|
3
3
|
|
|
4
|
-
|
|
5
4
|
import getSequenceDataBetweenRange from "./getSequenceDataBetweenRange";
|
|
6
5
|
|
|
7
6
|
// ac.throw([ac.string,ac.bool],arguments);
|
|
@@ -17,4 +16,4 @@ export default function getComplementSequenceAndAnnotations(
|
|
|
17
16
|
sequence: getComplementSequenceString(seqObj.sequence, seqObj.isRna)
|
|
18
17
|
});
|
|
19
18
|
return tidyUpSequenceData(newSeqObj, options);
|
|
20
|
-
}
|
|
19
|
+
}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import DNAComplementMap from "./DNAComplementMap";
|
|
2
2
|
import { merge } from "lodash";
|
|
3
3
|
|
|
4
|
-
|
|
5
4
|
// ac.throw([ac.string,ac.bool],arguments);
|
|
6
5
|
export default function getComplementSequenceString(sequence, isRna) {
|
|
7
6
|
// ac.throw([ac.string],arguments);
|
|
8
7
|
let complementSeqString = "";
|
|
9
|
-
const complementMap = merge(
|
|
8
|
+
const complementMap = merge(
|
|
9
|
+
DNAComplementMap,
|
|
10
|
+
isRna ? { a: "u", A: "U" } : { a: "t", A: "T" }
|
|
11
|
+
);
|
|
10
12
|
for (let i = 0; i < sequence.length; i++) {
|
|
11
13
|
let complementChar = complementMap[sequence[i]];
|
|
12
14
|
if (!complementChar) {
|
|
@@ -16,4 +18,4 @@ export default function getComplementSequenceString(sequence, isRna) {
|
|
|
16
18
|
complementSeqString += complementChar;
|
|
17
19
|
}
|
|
18
20
|
return complementSeqString;
|
|
19
|
-
}
|
|
21
|
+
}
|
|
@@ -2,12 +2,12 @@ import getComplementSequenceString from "./getComplementSequenceString";
|
|
|
2
2
|
|
|
3
3
|
import assert from "assert";
|
|
4
4
|
|
|
5
|
-
describe(
|
|
6
|
-
it(
|
|
7
|
-
assert.equal(
|
|
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
8
|
});
|
|
9
9
|
|
|
10
|
-
it(
|
|
11
|
-
assert.equal(
|
|
10
|
+
it("complement base should be shown correctly for DNA sequence", () => {
|
|
11
|
+
assert.equal("TTA", getComplementSequenceString("AAT"));
|
|
12
12
|
});
|
|
13
|
-
});
|
|
13
|
+
});
|
package/src/getCutsiteType.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
normalizePositionByRangeLength,
|
|
3
|
+
getRangeLength
|
|
4
|
+
} from "@teselagen/range-utils";
|
|
2
5
|
|
|
3
6
|
export default function getDigestFragmentsForCutsites(
|
|
4
7
|
sequenceLength,
|
|
@@ -102,4 +105,4 @@ export default function getDigestFragmentsForCutsites(
|
|
|
102
105
|
return true;
|
|
103
106
|
});
|
|
104
107
|
return fragments;
|
|
105
|
-
}
|
|
108
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import getDigestFragmentsForCutsites from "./getDigestFragmentsForCutsites";
|
|
2
2
|
import cutSequenceByRestrictionEnzyme from "./cutSequenceByRestrictionEnzyme";
|
|
3
|
-
import {flatMap} from "lodash";
|
|
3
|
+
import { flatMap } from "lodash";
|
|
4
4
|
|
|
5
5
|
export default function getDigestFragmentsForRestrictionEnzymes(
|
|
6
6
|
sequence,
|
|
@@ -24,4 +24,4 @@ export default function getDigestFragmentsForRestrictionEnzymes(
|
|
|
24
24
|
cutsites,
|
|
25
25
|
opts
|
|
26
26
|
);
|
|
27
|
-
}
|
|
27
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {normalizePositionByRangeLength1Based} from "@teselagen/range-utils";
|
|
1
|
+
import { normalizePositionByRangeLength1Based } from "@teselagen/range-utils";
|
|
2
2
|
|
|
3
3
|
export default function getInsertBetweenVals(
|
|
4
4
|
caretPosition,
|
|
@@ -25,4 +25,4 @@ export default function getInsertBetweenVals(
|
|
|
25
25
|
} else {
|
|
26
26
|
return [sequenceLength, 1];
|
|
27
27
|
}
|
|
28
|
-
}
|
|
28
|
+
}
|