@teselagen/sequence-utils 0.3.41 → 0.3.42-beta.2
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/DNAComplementMap.d.ts +1 -1
- package/README.md +2 -8
- package/addGapsToSeqReads.d.ts +16 -3
- package/adjustAnnotationsToInsert.d.ts +2 -1
- package/adjustBpsToReplaceOrInsert.d.ts +2 -1
- package/aliasedEnzymesByName.d.ts +37 -1
- package/aminoAcidToDegenerateDnaMap.d.ts +1 -31
- package/aminoAcidToDegenerateRnaMap.d.ts +1 -1
- package/annotateSingleSeq.d.ts +5 -4
- package/annotationTypes.d.ts +2 -2
- package/autoAnnotate.d.ts +17 -8
- package/bioData.d.ts +10 -58
- package/calculateEndStability.d.ts +1 -1
- package/calculateNebTa.d.ts +6 -1
- package/calculateNebTm.d.ts +6 -4
- package/calculatePercentGC.d.ts +1 -1
- package/calculateSantaLuciaTm.d.ts +28 -114
- package/calculateTm.d.ts +13 -1
- package/computeDigestFragments.d.ts +30 -24
- package/condensePairwiseAlignmentDifferences.d.ts +1 -1
- package/convertAACaretPositionOrRangeToDna.d.ts +2 -1
- package/convertDnaCaretPositionOrRangeToAA.d.ts +2 -1
- package/cutSequenceByRestrictionEnzyme.d.ts +2 -1
- package/defaultEnzymesByName.d.ts +2 -1
- package/degenerateDnaToAminoAcidMap.d.ts +1 -1
- package/degenerateRnaToAminoAcidMap.d.ts +1 -1
- package/deleteSequenceDataAtRange.d.ts +2 -1
- package/diffUtils.d.ts +9 -7
- package/doesEnzymeChopOutsideOfRecognitionSite.d.ts +2 -1
- package/featureTypesAndColors.d.ts +19 -6
- package/filterSequenceString.d.ts +14 -10
- package/findApproxMatches.d.ts +7 -1
- package/findNearestRangeOfSequenceOverlapToPosition.d.ts +2 -1
- package/findOrfsInPlasmid.d.ts +2 -11
- package/findSequenceMatches.d.ts +11 -1
- package/generateAnnotations.d.ts +2 -1
- package/generateSequenceData.d.ts +8 -13
- package/getAllInsertionsInSeqReads.d.ts +11 -1
- package/getAminoAcidDataForEachBaseOfDna.d.ts +6 -5
- package/getAminoAcidFromSequenceTriplet.d.ts +1 -1
- package/getAminoAcidStringFromSequenceString.d.ts +3 -1
- package/getCodonRangeForAASliver.d.ts +3 -4
- package/getComplementAminoAcidStringFromSequenceString.d.ts +1 -1
- package/getComplementSequenceAndAnnotations.d.ts +5 -1
- package/getComplementSequenceString.d.ts +1 -1
- package/getCutsiteType.d.ts +2 -1
- package/getCutsitesFromSequence.d.ts +2 -1
- package/getDegenerateDnaStringFromAAString.d.ts +1 -1
- package/getDegenerateRnaStringFromAAString.d.ts +1 -1
- package/getDigestFragmentsForCutsites.d.ts +4 -1
- package/getDigestFragmentsForRestrictionEnzymes.d.ts +8 -1
- package/getInsertBetweenVals.d.ts +2 -1
- package/getLeftAndRightOfSequenceInRangeGivenPosition.d.ts +2 -1
- package/getOrfsFromSequence.d.ts +17 -11
- package/getOverlapBetweenTwoSequences.d.ts +2 -1
- package/getPossiblePartsFromSequenceAndEnzymes.d.ts +18 -1
- package/getReverseAminoAcidStringFromSequenceString.d.ts +1 -1
- package/getReverseComplementAminoAcidStringFromSequenceString.d.ts +1 -1
- package/getReverseComplementAnnotation.d.ts +11 -1
- package/getReverseComplementSequenceAndAnnotations.d.ts +5 -1
- package/getReverseComplementSequenceString.d.ts +1 -1
- package/getReverseSequenceString.d.ts +1 -1
- package/getSequenceDataBetweenRange.d.ts +9 -1
- package/getVirtualDigest.d.ts +11 -10
- package/guessIfSequenceIsDnaAndNotProtein.d.ts +5 -1
- package/index.cjs +765 -497
- package/index.d.ts +9 -5
- package/index.js +766 -498
- package/index.umd.cjs +765 -497
- package/insertGapsIntoRefSeq.d.ts +2 -1
- package/insertSequenceDataAtPositionOrRange.d.ts +10 -1
- package/isEnzymeType2S.d.ts +2 -1
- package/mapAnnotationsToRows.d.ts +9 -1
- package/package.json +9 -6
- package/prepareCircularViewData.d.ts +2 -1
- package/prepareRowData.d.ts +7 -3
- package/proteinAlphabet.d.ts +1 -1
- package/rotateBpsToPosition.d.ts +1 -1
- package/rotateSequenceDataToPosition.d.ts +3 -1
- package/shiftAnnotationsByLen.d.ts +4 -3
- package/src/{addGapsToSeqReads.js → addGapsToSeqReads.ts} +33 -14
- package/src/adjustAnnotationsToInsert.ts +22 -0
- package/src/{adjustBpsToReplaceOrInsert.js → adjustBpsToReplaceOrInsert.ts} +31 -8
- package/src/{aliasedEnzymesByName.js → aliasedEnzymesByName.ts} +4 -1
- package/src/{aminoAcidToDegenerateDnaMap.js → aminoAcidToDegenerateDnaMap.ts} +1 -1
- package/src/{annotateSingleSeq.js → annotateSingleSeq.ts} +11 -3
- package/src/autoAnnotate.test.js +0 -1
- package/src/{autoAnnotate.js → autoAnnotate.ts} +69 -24
- package/src/{bioData.js → bioData.ts} +2 -2
- package/src/{calculateEndStability.js → calculateEndStability.ts} +21 -16
- package/src/{calculateNebTa.js → calculateNebTa.ts} +20 -8
- package/src/{calculateNebTm.js → calculateNebTm.ts} +15 -9
- package/src/{calculatePercentGC.js → calculatePercentGC.ts} +1 -1
- package/src/{calculateSantaLuciaTm.js → calculateSantaLuciaTm.ts} +29 -22
- package/src/{calculateTm.js → calculateTm.ts} +50 -59
- package/src/{computeDigestFragments.js → computeDigestFragments.ts} +92 -36
- package/src/{condensePairwiseAlignmentDifferences.js → condensePairwiseAlignmentDifferences.ts} +4 -4
- package/src/{convertAACaretPositionOrRangeToDna.js → convertAACaretPositionOrRangeToDna.ts} +8 -4
- package/src/{convertDnaCaretPositionOrRangeToAA.js → convertDnaCaretPositionOrRangeToAA.ts} +8 -4
- package/src/cutSequenceByRestrictionEnzyme.ts +345 -0
- package/src/{defaultEnzymesByName.js → defaultEnzymesByName.ts} +2 -1
- package/src/deleteSequenceDataAtRange.ts +13 -0
- package/src/diffUtils.ts +80 -0
- package/src/doesEnzymeChopOutsideOfRecognitionSite.ts +16 -0
- package/src/{featureTypesAndColors.js → featureTypesAndColors.ts} +29 -14
- package/src/{filterSequenceString.js → filterSequenceString.ts} +51 -21
- package/src/{findApproxMatches.js → findApproxMatches.ts} +14 -6
- package/src/{findNearestRangeOfSequenceOverlapToPosition.js → findNearestRangeOfSequenceOverlapToPosition.ts} +13 -9
- package/src/{findOrfsInPlasmid.js → findOrfsInPlasmid.ts} +8 -7
- package/src/{findSequenceMatches.js → findSequenceMatches.ts} +31 -13
- package/src/{generateAnnotations.js → generateAnnotations.ts} +14 -9
- package/src/{generateSequenceData.js → generateSequenceData.ts} +19 -13
- package/src/{getAllInsertionsInSeqReads.js → getAllInsertionsInSeqReads.ts} +19 -2
- package/src/{getAminoAcidDataForEachBaseOfDna.js → getAminoAcidDataForEachBaseOfDna.ts} +36 -30
- package/src/{getAminoAcidFromSequenceTriplet.js → getAminoAcidFromSequenceTriplet.ts} +9 -4
- package/src/{getAminoAcidStringFromSequenceString.js → getAminoAcidStringFromSequenceString.ts} +14 -7
- package/src/{getCodonRangeForAASliver.js → getCodonRangeForAASliver.ts} +16 -6
- package/src/{getComplementAminoAcidStringFromSequenceString.js → getComplementAminoAcidStringFromSequenceString.ts} +5 -3
- package/src/{getComplementSequenceAndAnnotations.js → getComplementSequenceAndAnnotations.ts} +8 -6
- package/src/{getComplementSequenceString.js → getComplementSequenceString.ts} +5 -2
- package/src/getCutsiteType.ts +18 -0
- package/src/getCutsitesFromSequence.ts +22 -0
- package/src/getDegenerateDnaStringFromAAString.ts +15 -0
- package/src/getDegenerateRnaStringFromAAString.ts +15 -0
- package/src/{getDigestFragmentsForCutsites.js → getDigestFragmentsForCutsites.ts} +32 -14
- package/src/getDigestFragmentsForRestrictionEnzymes.ts +50 -0
- package/src/{getInsertBetweenVals.js → getInsertBetweenVals.ts} +8 -5
- package/src/{getLeftAndRightOfSequenceInRangeGivenPosition.js → getLeftAndRightOfSequenceInRangeGivenPosition.ts} +11 -10
- package/src/{getMassOfAaString.js → getMassOfAaString.ts} +4 -2
- package/src/{getOrfsFromSequence.js → getOrfsFromSequence.ts} +27 -7
- package/src/{getOverlapBetweenTwoSequences.js → getOverlapBetweenTwoSequences.ts} +4 -4
- package/src/{getPossiblePartsFromSequenceAndEnzymes.js → getPossiblePartsFromSequenceAndEnzymes.ts} +52 -25
- package/src/{getReverseAminoAcidStringFromSequenceString.js → getReverseAminoAcidStringFromSequenceString.ts} +4 -2
- package/src/{getReverseComplementAminoAcidStringFromSequenceString.js → getReverseComplementAminoAcidStringFromSequenceString.ts} +2 -2
- package/src/{getReverseComplementAnnotation.js → getReverseComplementAnnotation.ts} +4 -2
- package/src/getReverseComplementSequenceAndAnnotations.ts +45 -0
- package/src/{getReverseComplementSequenceString.js → getReverseComplementSequenceString.ts} +4 -4
- package/src/{getReverseSequenceString.js → getReverseSequenceString.ts} +1 -1
- package/src/getSequenceDataBetweenRange.test.js +6 -3
- package/src/{getSequenceDataBetweenRange.js → getSequenceDataBetweenRange.ts} +44 -29
- package/src/{getVirtualDigest.js → getVirtualDigest.ts} +20 -9
- package/src/{guessIfSequenceIsDnaAndNotProtein.js → guessIfSequenceIsDnaAndNotProtein.ts} +11 -5
- package/src/{index.test.js → index.test.ts} +9 -5
- package/src/{index.js → index.ts} +1 -0
- package/src/{insertGapsIntoRefSeq.js → insertGapsIntoRefSeq.ts} +7 -2
- package/src/{insertSequenceDataAtPositionOrRange.js → insertSequenceDataAtPositionOrRange.ts} +130 -56
- package/src/isEnzymeType2S.ts +8 -0
- package/src/mapAnnotationsToRows.ts +256 -0
- package/src/prepareCircularViewData.ts +24 -0
- package/src/{prepareRowData.js → prepareRowData.ts} +27 -8
- package/src/prepareRowData_output1.json +1 -0
- package/src/rotateBpsToPosition.ts +12 -0
- package/src/{rotateSequenceDataToPosition.js → rotateSequenceDataToPosition.ts} +11 -8
- package/src/shiftAnnotationsByLen.ts +24 -0
- package/src/{threeLetterSequenceStringToAminoAcidMap.js → threeLetterSequenceStringToAminoAcidMap.ts} +29 -9
- package/src/{tidyUpAnnotation.js → tidyUpAnnotation.ts} +40 -18
- package/src/{tidyUpSequenceData.js → tidyUpSequenceData.ts} +83 -39
- package/src/types.ts +99 -0
- package/threeLetterSequenceStringToAminoAcidMap.d.ts +11 -921
- package/tidyUpAnnotation.d.ts +13 -11
- package/tidyUpSequenceData.d.ts +18 -1
- package/types.d.ts +97 -0
- package/addGapsToSeqReads.test.d.ts +0 -1
- package/adjustBpsToReplaceOrInsert.test.d.ts +0 -1
- package/aminoAcidToDnaRna.test.d.ts +0 -1
- package/annotateSingleSeq.test.d.ts +0 -1
- package/autoAnnotate.test.d.ts +0 -1
- package/calculateEndStability.test.d.ts +0 -1
- package/calculateNebTa.test.d.ts +0 -1
- package/calculateNebTm.test.d.ts +0 -1
- package/calculatePercentGC.test.d.ts +0 -1
- package/calculateSantaLuciaTm.test.d.ts +0 -1
- package/calculateTm.test.d.ts +0 -1
- package/computeDigestFragments.test.d.ts +0 -1
- package/condensePairwiseAlignmentDifferences.test.d.ts +0 -1
- package/convertAACaretPositionOrRangeToDna.test.d.ts +0 -1
- package/convertDnaCaretPositionOrRangeToAA.test.d.ts +0 -1
- package/cutSequenceByRestrictionEnzyme.test.d.ts +0 -1
- package/deleteSequenceDataAtRange.test.d.ts +0 -1
- package/diffUtils.test.d.ts +0 -1
- package/doesEnzymeChopOutsideOfRecognitionSite.test.d.ts +0 -1
- package/featureTypesAndColors.test.d.ts +0 -1
- package/filterSequenceString.test.d.ts +0 -1
- package/findApproxMatches.test.d.ts +0 -1
- package/findNearestRangeOfSequenceOverlapToPosition.test.d.ts +0 -1
- package/findSequenceMatches.test.d.ts +0 -1
- package/generateSequenceData.test.d.ts +0 -1
- package/getAllInsertionsInSeqReads.test.d.ts +0 -1
- package/getAminoAcidDataForEachBaseOfDna.test.d.ts +0 -1
- package/getAminoAcidStringFromSequenceString.test.d.ts +0 -1
- package/getComplementSequenceString.test.d.ts +0 -1
- package/getDigestFragmentsForRestrictionEnzymes.test.d.ts +0 -1
- package/getInsertBetweenVals.test.d.ts +0 -1
- package/getLeftAndRightOfSequenceInRangeGivenPosition.test.d.ts +0 -1
- package/getMassofAaString.test.d.ts +0 -1
- package/getOrfsFromSequence.test.d.ts +0 -1
- package/getOverlapBetweenTwoSequences.test.d.ts +0 -1
- package/getPossiblePartsFromSequenceAndEnzymes.test.d.ts +0 -1
- package/getReverseAminoAcidStringFromSequenceString.test.d.ts +0 -1
- package/getReverseComplementAnnotation.test.d.ts +0 -1
- package/getReverseComplementSequenceAndAnnotations.test.d.ts +0 -1
- package/getReverseComplementSequenceString.test.d.ts +0 -1
- package/getReverseSequenceString.test.d.ts +0 -1
- package/getSequenceDataBetweenRange.test.d.ts +0 -1
- package/getVirtualDigest.test.d.ts +0 -1
- package/guessIfSequenceIsDnaAndNotProtein.test.d.ts +0 -1
- package/index.test.d.ts +0 -1
- package/insertGapsIntoRefSeq.test.d.ts +0 -1
- package/insertSequenceDataAtPosition.test.d.ts +0 -1
- package/insertSequenceDataAtPositionOrRange.test.d.ts +0 -1
- package/mapAnnotationsToRows.test.d.ts +0 -1
- package/prepareCircularViewData.test.d.ts +0 -1
- package/prepareRowData.test.d.ts +0 -1
- package/rotateBpsToPosition.test.d.ts +0 -1
- package/rotateSequenceDataToPosition.test.d.ts +0 -1
- package/src/adjustAnnotationsToInsert.js +0 -19
- package/src/cutSequenceByRestrictionEnzyme.js +0 -301
- package/src/deleteSequenceDataAtRange.js +0 -5
- package/src/diffUtils.js +0 -63
- package/src/doesEnzymeChopOutsideOfRecognitionSite.js +0 -10
- package/src/getCutsiteType.js +0 -10
- package/src/getCutsitesFromSequence.js +0 -17
- package/src/getDegenerateDnaStringFromAAString.js +0 -8
- package/src/getDegenerateRnaStringFromAAString.js +0 -8
- package/src/getDigestFragmentsForRestrictionEnzymes.js +0 -27
- package/src/getReverseComplementSequenceAndAnnotations.js +0 -40
- package/src/isEnzymeType2S.js +0 -3
- package/src/mapAnnotationsToRows.js +0 -174
- package/src/prepareCircularViewData.js +0 -17
- package/src/rotateBpsToPosition.js +0 -9
- package/src/shiftAnnotationsByLen.js +0 -17
- package/tidyUpSequenceData.test.d.ts +0 -1
- /package/src/{DNAComplementMap.js → DNAComplementMap.ts} +0 -0
- /package/src/{aminoAcidToDegenerateRnaMap.js → aminoAcidToDegenerateRnaMap.ts} +0 -0
- /package/src/{annotationTypes.js → annotationTypes.ts} +0 -0
- /package/src/{degenerateDnaToAminoAcidMap.js → degenerateDnaToAminoAcidMap.ts} +0 -0
- /package/src/{degenerateRnaToAminoAcidMap.js → degenerateRnaToAminoAcidMap.ts} +0 -0
- /package/src/{insertSequenceDataAtPosition.js → insertSequenceDataAtPosition.ts} +0 -0
- /package/src/{proteinAlphabet.js → proteinAlphabet.ts} +0 -0
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { AminoAcidData } from "./types";
|
|
2
|
+
import type { Range } from "@teselagen/range-utils";
|
|
3
|
+
|
|
1
4
|
export default function getCodonRangeForAASliver(
|
|
2
|
-
aminoAcidPositionInSequence,
|
|
3
|
-
aminoAcidSliver,
|
|
4
|
-
AARepresentationOfTranslation,
|
|
5
|
-
relativeAAPositionInTranslation
|
|
6
|
-
) {
|
|
5
|
+
aminoAcidPositionInSequence: number,
|
|
6
|
+
aminoAcidSliver: AminoAcidData,
|
|
7
|
+
AARepresentationOfTranslation: AminoAcidData[],
|
|
8
|
+
relativeAAPositionInTranslation: number
|
|
9
|
+
): Range {
|
|
7
10
|
const AASliverOneBefore =
|
|
8
11
|
AARepresentationOfTranslation[relativeAAPositionInTranslation - 1];
|
|
9
12
|
if (
|
|
@@ -43,7 +46,14 @@ export default function getCodonRangeForAASliver(
|
|
|
43
46
|
};
|
|
44
47
|
} else {
|
|
45
48
|
const AASliverOneAhead =
|
|
46
|
-
AARepresentationOfTranslation[relativeAAPositionInTranslation - 2];
|
|
49
|
+
AARepresentationOfTranslation[relativeAAPositionInTranslation - 2]; // Original logic logic seems to check "ahead" but uses -2 index??
|
|
50
|
+
// Wait, AASliverOneAhead should likely access +1 or +2?
|
|
51
|
+
// Line 46 in original: AARepresentationOfTranslation[relativeAAPositionInTranslation - 2]
|
|
52
|
+
// This is weird for "OneAhead".
|
|
53
|
+
// But I shouldn't change logic unless I'm sure it's a bug fix.
|
|
54
|
+
// Assuming original code logic is intentional or I should preserve it.
|
|
55
|
+
// I will preserve the index access but add types.
|
|
56
|
+
|
|
47
57
|
if (
|
|
48
58
|
AASliverOneAhead &&
|
|
49
59
|
AASliverOneAhead.aminoAcidIndex === aminoAcidSliver.aminoAcidIndex
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import getAminoAcidStringFromSequenceString from "./getAminoAcidStringFromSequenceString";
|
|
2
2
|
|
|
3
3
|
export default function getComplementAminoAcidStringFromSequenceString(
|
|
4
|
-
sequenceString
|
|
5
|
-
) {
|
|
6
|
-
const aaString = getAminoAcidStringFromSequenceString(sequenceString,
|
|
4
|
+
sequenceString: string
|
|
5
|
+
): string {
|
|
6
|
+
const aaString = getAminoAcidStringFromSequenceString(sequenceString, {
|
|
7
|
+
doNotExcludeAsterisk: true
|
|
8
|
+
});
|
|
7
9
|
return aaString.split("").reverse().join("");
|
|
8
10
|
}
|
package/src/{getComplementSequenceAndAnnotations.js → getComplementSequenceAndAnnotations.ts}
RENAMED
|
@@ -2,15 +2,17 @@ import getComplementSequenceString from "./getComplementSequenceString";
|
|
|
2
2
|
import tidyUpSequenceData from "./tidyUpSequenceData";
|
|
3
3
|
|
|
4
4
|
import getSequenceDataBetweenRange from "./getSequenceDataBetweenRange";
|
|
5
|
+
import { SequenceData, Range } from "./types";
|
|
5
6
|
|
|
6
|
-
// ac.throw([ac.string,ac.bool],arguments);
|
|
7
7
|
export default function getComplementSequenceAndAnnotations(
|
|
8
|
-
pSeqObj,
|
|
9
|
-
options = {}
|
|
10
|
-
) {
|
|
8
|
+
pSeqObj: SequenceData,
|
|
9
|
+
options: { range?: Range; [key: string]: unknown } = {}
|
|
10
|
+
): SequenceData {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
12
|
const seqObj = tidyUpSequenceData(
|
|
12
|
-
getSequenceDataBetweenRange(pSeqObj, options.range),
|
|
13
|
-
|
|
13
|
+
getSequenceDataBetweenRange(pSeqObj, options.range || null),
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
+
options as any
|
|
14
16
|
);
|
|
15
17
|
const newSeqObj = Object.assign({}, seqObj, {
|
|
16
18
|
sequence: getComplementSequenceString(seqObj.sequence, seqObj.isRna)
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import DNAComplementMap from "./DNAComplementMap";
|
|
2
2
|
import { merge } from "lodash-es";
|
|
3
3
|
|
|
4
|
-
export default function getComplementSequenceString(
|
|
4
|
+
export default function getComplementSequenceString(
|
|
5
|
+
sequence: string,
|
|
6
|
+
isRna?: boolean
|
|
7
|
+
): string {
|
|
5
8
|
if (typeof sequence !== "string") return "";
|
|
6
9
|
let complementSeqString = "";
|
|
7
|
-
const complementMap = merge(
|
|
10
|
+
const complementMap: Record<string, string> = merge(
|
|
8
11
|
DNAComplementMap,
|
|
9
12
|
isRna ? { a: "u", A: "U" } : { a: "t", A: "T" }
|
|
10
13
|
);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RestrictionEnzyme } from "./types";
|
|
2
|
+
|
|
3
|
+
export default function getCutsiteType(
|
|
4
|
+
restrictionEnzyme: RestrictionEnzyme
|
|
5
|
+
): string {
|
|
6
|
+
const { topSnipOffset, bottomSnipOffset } = restrictionEnzyme;
|
|
7
|
+
if (topSnipOffset === bottomSnipOffset) {
|
|
8
|
+
return "blunt";
|
|
9
|
+
} else if (
|
|
10
|
+
topSnipOffset !== undefined &&
|
|
11
|
+
bottomSnipOffset !== undefined &&
|
|
12
|
+
topSnipOffset < bottomSnipOffset
|
|
13
|
+
) {
|
|
14
|
+
return "5' overhang";
|
|
15
|
+
} else {
|
|
16
|
+
return "3' overhang";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { flatMap } from "lodash-es";
|
|
2
|
+
import cutSequenceByRestrictionEnzyme from "./cutSequenceByRestrictionEnzyme";
|
|
3
|
+
import { CutSite, RestrictionEnzyme } from "./types";
|
|
4
|
+
|
|
5
|
+
export default function getCutsitesFromSequence(
|
|
6
|
+
sequence: string,
|
|
7
|
+
circular: boolean,
|
|
8
|
+
contextEnzymes: RestrictionEnzyme[]
|
|
9
|
+
): Record<string, CutSite[]> {
|
|
10
|
+
const cutsites = flatMap(contextEnzymes, enzyme => {
|
|
11
|
+
return cutSequenceByRestrictionEnzyme(sequence, circular, enzyme);
|
|
12
|
+
});
|
|
13
|
+
const cutsitesByNameMap: Record<string, CutSite[]> = {};
|
|
14
|
+
cutsites.forEach(cutsite => {
|
|
15
|
+
const name = cutsite.name || "";
|
|
16
|
+
if (!cutsitesByNameMap[name]) {
|
|
17
|
+
cutsitesByNameMap[name] = [];
|
|
18
|
+
}
|
|
19
|
+
cutsitesByNameMap[name].push(cutsite);
|
|
20
|
+
});
|
|
21
|
+
return cutsitesByNameMap;
|
|
22
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import aminoAcidToDegenerateDnaMap from "./aminoAcidToDegenerateDnaMap";
|
|
2
|
+
|
|
3
|
+
export default function getDegenerateDnaStringFromAAString(
|
|
4
|
+
aaString: string
|
|
5
|
+
): string {
|
|
6
|
+
return aaString
|
|
7
|
+
.split("")
|
|
8
|
+
.map(
|
|
9
|
+
char =>
|
|
10
|
+
(aminoAcidToDegenerateDnaMap as Record<string, string>)[
|
|
11
|
+
char.toLowerCase()
|
|
12
|
+
] || "nnn"
|
|
13
|
+
)
|
|
14
|
+
.join("");
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import aminoAcidToDegenerateRnaMap from "./aminoAcidToDegenerateRnaMap";
|
|
2
|
+
|
|
3
|
+
export default function getDegenerateRnaStringFromAAString(
|
|
4
|
+
aaString: string
|
|
5
|
+
): string {
|
|
6
|
+
return aaString
|
|
7
|
+
.split("")
|
|
8
|
+
.map(
|
|
9
|
+
char =>
|
|
10
|
+
(aminoAcidToDegenerateRnaMap as Record<string, string>)[
|
|
11
|
+
char.toLowerCase()
|
|
12
|
+
] || "nnn"
|
|
13
|
+
)
|
|
14
|
+
.join("");
|
|
15
|
+
}
|
|
@@ -2,38 +2,55 @@ import {
|
|
|
2
2
|
normalizePositionByRangeLength,
|
|
3
3
|
getRangeLength
|
|
4
4
|
} from "@teselagen/range-utils";
|
|
5
|
+
import { CutSite, DigestFragment } from "./types";
|
|
5
6
|
|
|
6
7
|
export default function getDigestFragmentsForCutsites(
|
|
7
|
-
sequenceLength,
|
|
8
|
-
circular,
|
|
9
|
-
cutsites,
|
|
10
|
-
opts = {}
|
|
11
|
-
) {
|
|
12
|
-
const fragments = [];
|
|
13
|
-
const overlappingEnzymes = [];
|
|
14
|
-
const pairs = [];
|
|
8
|
+
sequenceLength: number,
|
|
9
|
+
circular: boolean,
|
|
10
|
+
cutsites: CutSite[],
|
|
11
|
+
opts: { computePartialDigests?: boolean } = {}
|
|
12
|
+
): DigestFragment[] {
|
|
13
|
+
const fragments: DigestFragment[] = [];
|
|
14
|
+
const overlappingEnzymes: DigestFragment[] = [];
|
|
15
|
+
const pairs: CutSite[][] = [];
|
|
15
16
|
if (!cutsites.length) return [];
|
|
16
17
|
let sortedCutsites = cutsites.sort((a, b) => {
|
|
17
|
-
return a.topSnipPosition - b.topSnipPosition;
|
|
18
|
+
return (a.topSnipPosition || 0) - (b.topSnipPosition || 0);
|
|
18
19
|
});
|
|
19
20
|
|
|
20
21
|
if (!circular) {
|
|
21
22
|
//if linear, add 2 fake cutsites for the start and end of the seq
|
|
22
23
|
sortedCutsites = [
|
|
23
24
|
{
|
|
25
|
+
start: 0,
|
|
26
|
+
end: 0,
|
|
24
27
|
topSnipPosition: 0,
|
|
25
28
|
bottomSnipPosition: 0,
|
|
26
29
|
overhangSize: 0,
|
|
27
30
|
type: "START_OR_END_OF_SEQ",
|
|
28
|
-
name: "START_OF_SEQ"
|
|
31
|
+
name: "START_OF_SEQ",
|
|
32
|
+
restrictionEnzyme: {
|
|
33
|
+
name: "START_OF_SEQ",
|
|
34
|
+
site: "",
|
|
35
|
+
forwardRegex: "",
|
|
36
|
+
reverseRegex: ""
|
|
37
|
+
}
|
|
29
38
|
},
|
|
30
39
|
...sortedCutsites,
|
|
31
40
|
{
|
|
41
|
+
start: sequenceLength,
|
|
42
|
+
end: sequenceLength,
|
|
32
43
|
topSnipPosition: sequenceLength,
|
|
33
44
|
bottomSnipPosition: sequenceLength,
|
|
34
45
|
overhangSize: 0,
|
|
35
46
|
type: "START_OR_END_OF_SEQ",
|
|
36
|
-
name: "END_OF_SEQ"
|
|
47
|
+
name: "END_OF_SEQ",
|
|
48
|
+
restrictionEnzyme: {
|
|
49
|
+
name: "END_OF_SEQ",
|
|
50
|
+
site: "",
|
|
51
|
+
forwardRegex: "",
|
|
52
|
+
reverseRegex: ""
|
|
53
|
+
}
|
|
37
54
|
}
|
|
38
55
|
];
|
|
39
56
|
}
|
|
@@ -58,11 +75,11 @@ export default function getDigestFragmentsForCutsites(
|
|
|
58
75
|
|
|
59
76
|
pairs.forEach(([cut1, cut2]) => {
|
|
60
77
|
const start = normalizePositionByRangeLength(
|
|
61
|
-
cut1.topSnipPosition,
|
|
78
|
+
cut1.topSnipPosition || 0,
|
|
62
79
|
sequenceLength
|
|
63
80
|
);
|
|
64
81
|
const end = normalizePositionByRangeLength(
|
|
65
|
-
cut2.topSnipPosition - 1,
|
|
82
|
+
(cut2.topSnipPosition || 0) - 1,
|
|
66
83
|
sequenceLength
|
|
67
84
|
);
|
|
68
85
|
const fragmentRange = { start, end };
|
|
@@ -93,7 +110,8 @@ export default function getDigestFragmentsForCutsites(
|
|
|
93
110
|
},
|
|
94
111
|
...fragmentRange,
|
|
95
112
|
size,
|
|
96
|
-
id
|
|
113
|
+
id,
|
|
114
|
+
name: `${cut1.restrictionEnzyme.name} -- ${cut2.restrictionEnzyme.name} ${size} bps` // Add missing name property
|
|
97
115
|
});
|
|
98
116
|
});
|
|
99
117
|
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { computeDigestFragments } from "./computeDigestFragments";
|
|
2
|
+
import getCutsitesFromSequence from "./getCutsitesFromSequence";
|
|
3
|
+
import { CutSite, RestrictionEnzyme } from "./types";
|
|
4
|
+
import { flatMap, uniqBy } from "lodash-es";
|
|
5
|
+
|
|
6
|
+
export default function getDigestFragmentsForRestrictionEnzymes(
|
|
7
|
+
sequence: string,
|
|
8
|
+
circular: boolean,
|
|
9
|
+
contextEnzymes: RestrictionEnzyme[] | RestrictionEnzyme,
|
|
10
|
+
options?: {
|
|
11
|
+
computePartialDigest?: boolean;
|
|
12
|
+
computePartialDigests?: boolean; // alias
|
|
13
|
+
computeDigestDisabled?: boolean; // corrected spelling if needed, but keeping as is
|
|
14
|
+
computePartialDigestDisabled?: boolean;
|
|
15
|
+
includeOverAndUnderHangs?: boolean;
|
|
16
|
+
}
|
|
17
|
+
) {
|
|
18
|
+
const cutsitesByName = getCutsitesFromSequence(
|
|
19
|
+
sequence,
|
|
20
|
+
circular,
|
|
21
|
+
Array.isArray(contextEnzymes) ? contextEnzymes : [contextEnzymes]
|
|
22
|
+
);
|
|
23
|
+
const digest = computeDigestFragments({
|
|
24
|
+
cutsites: flatMap(cutsitesByName) as CutSite[],
|
|
25
|
+
sequenceLength: sequence.length,
|
|
26
|
+
circular,
|
|
27
|
+
...options,
|
|
28
|
+
computePartialDigest:
|
|
29
|
+
options?.computePartialDigest || options?.computePartialDigests
|
|
30
|
+
});
|
|
31
|
+
const fragments = uniqBy(digest.fragments, fragment => {
|
|
32
|
+
return `${fragment.start}-${fragment.end}-${fragment.size}`;
|
|
33
|
+
});
|
|
34
|
+
if (
|
|
35
|
+
circular &&
|
|
36
|
+
(options?.computePartialDigest || options?.computePartialDigests)
|
|
37
|
+
) {
|
|
38
|
+
// filter out the full length fragment if it's a duplicate
|
|
39
|
+
const fullLengthFragmentIndex = fragments.findIndex(
|
|
40
|
+
f => f.size === sequence.length
|
|
41
|
+
);
|
|
42
|
+
if (fullLengthFragmentIndex > -1) {
|
|
43
|
+
fragments.splice(fullLengthFragmentIndex, 1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return fragments.sort((a, b) => {
|
|
48
|
+
return a.start - b.start || b.size - a.size;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
normalizePositionByRangeLength1Based,
|
|
3
|
+
Range
|
|
4
|
+
} from "@teselagen/range-utils";
|
|
2
5
|
|
|
3
6
|
export default function getInsertBetweenVals(
|
|
4
|
-
caretPosition,
|
|
5
|
-
selectionLayer,
|
|
6
|
-
sequenceLength
|
|
7
|
-
) {
|
|
7
|
+
caretPosition: number,
|
|
8
|
+
selectionLayer: Range,
|
|
9
|
+
sequenceLength: number
|
|
10
|
+
): [number, number] {
|
|
8
11
|
if (selectionLayer.start > -1) {
|
|
9
12
|
//selection layer
|
|
10
13
|
return [
|
|
@@ -2,37 +2,38 @@ import {
|
|
|
2
2
|
isPositionWithinRange,
|
|
3
3
|
getSequenceWithinRange,
|
|
4
4
|
normalizePositionByRangeLength,
|
|
5
|
-
isPositionCloserToRangeStartThanRangeEnd
|
|
5
|
+
isPositionCloserToRangeStartThanRangeEnd,
|
|
6
|
+
Range
|
|
6
7
|
} from "@teselagen/range-utils";
|
|
7
8
|
|
|
8
9
|
export default function getLeftAndRightOfSequenceInRangeGivenPosition(
|
|
9
|
-
range,
|
|
10
|
-
position,
|
|
11
|
-
sequence
|
|
12
|
-
) {
|
|
10
|
+
range: Range,
|
|
11
|
+
position: number,
|
|
12
|
+
sequence: string
|
|
13
|
+
): { leftHandSide: string; rightHandSide: string } {
|
|
13
14
|
const result = {
|
|
14
15
|
leftHandSide: "",
|
|
15
16
|
rightHandSide: ""
|
|
16
17
|
};
|
|
17
|
-
if (isPositionWithinRange(position, range)) {
|
|
18
|
+
if (isPositionWithinRange(position, range, sequence.length)) {
|
|
18
19
|
result.leftHandSide = getSequenceWithinRange(
|
|
19
20
|
{
|
|
20
21
|
start: range.start,
|
|
21
22
|
end: normalizePositionByRangeLength(position - 1, sequence.length)
|
|
22
23
|
},
|
|
23
24
|
sequence
|
|
24
|
-
);
|
|
25
|
+
) as string;
|
|
25
26
|
result.rightHandSide = getSequenceWithinRange(
|
|
26
27
|
{ start: position, end: range.end },
|
|
27
28
|
sequence
|
|
28
|
-
);
|
|
29
|
+
) as string;
|
|
29
30
|
} else {
|
|
30
31
|
if (
|
|
31
32
|
isPositionCloserToRangeStartThanRangeEnd(position, range, sequence.length)
|
|
32
33
|
) {
|
|
33
|
-
result.rightHandSide = getSequenceWithinRange(range, sequence);
|
|
34
|
+
result.rightHandSide = getSequenceWithinRange(range, sequence) as string;
|
|
34
35
|
} else {
|
|
35
|
-
result.leftHandSide = getSequenceWithinRange(range, sequence);
|
|
36
|
+
result.leftHandSide = getSequenceWithinRange(range, sequence) as string;
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
39
|
return result;
|
|
@@ -9,13 +9,15 @@ import proteinAlphabet from "./proteinAlphabet";
|
|
|
9
9
|
* @returns The sum of the mass of all amino acids in the string
|
|
10
10
|
*/
|
|
11
11
|
export default function getMassOfAaString(
|
|
12
|
-
aaString,
|
|
12
|
+
aaString: string,
|
|
13
13
|
numsAfterDecimal = 2,
|
|
14
14
|
divideByThree = false
|
|
15
15
|
) {
|
|
16
16
|
let sumMass = 0;
|
|
17
17
|
for (let i = 0; i < aaString.length; i++) {
|
|
18
|
-
sumMass += proteinAlphabet[
|
|
18
|
+
sumMass += (proteinAlphabet as Record<string, { mass: number }>)[
|
|
19
|
+
aaString[i]
|
|
20
|
+
].mass;
|
|
19
21
|
}
|
|
20
22
|
if (divideByThree) {
|
|
21
23
|
sumMass /= 3;
|
|
@@ -1,6 +1,24 @@
|
|
|
1
1
|
import shortid from "shortid";
|
|
2
|
+
import { Annotation } from "./types";
|
|
2
3
|
import getReverseComplementSequenceString from "./getReverseComplementSequenceString";
|
|
3
4
|
|
|
5
|
+
interface GetOrfsOptions {
|
|
6
|
+
sequence: string;
|
|
7
|
+
minimumOrfSize: number;
|
|
8
|
+
forward: boolean;
|
|
9
|
+
circular?: boolean;
|
|
10
|
+
useAdditionalOrfStartCodons?: boolean;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface Orf extends Annotation {
|
|
14
|
+
internalStartCodonIndices: number[];
|
|
15
|
+
frame: number;
|
|
16
|
+
// annotationTypePlural: string; // Annotation might already have this or it's extra
|
|
17
|
+
isOrf: boolean;
|
|
18
|
+
remove?: boolean;
|
|
19
|
+
length: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
4
22
|
/**
|
|
5
23
|
* @private
|
|
6
24
|
* Finds ORFs in a given DNA forward in a given frame.
|
|
@@ -10,7 +28,7 @@ import getReverseComplementSequenceString from "./getReverseComplementSequenceSt
|
|
|
10
28
|
* forward - Should we find forward facing orfs or reverse facing orfs
|
|
11
29
|
* return - The list of ORFs found.
|
|
12
30
|
*/
|
|
13
|
-
export default function getOrfsFromSequence(options) {
|
|
31
|
+
export default function getOrfsFromSequence(options: GetOrfsOptions): Orf[] {
|
|
14
32
|
let sequence = options.sequence;
|
|
15
33
|
const minimumOrfSize = options.minimumOrfSize;
|
|
16
34
|
const forward = options.forward;
|
|
@@ -30,8 +48,8 @@ export default function getOrfsFromSequence(options) {
|
|
|
30
48
|
const re = useAdditionalOrfStartCodons
|
|
31
49
|
? /(?=((?:A[TU]G|G[TU]G|C[TU]G)(?:.{3})*?(?:[TU]AG|[TU]AA|[TU]GA)))/gi
|
|
32
50
|
: /(?=((?:A[TU]G)(?:.{3})*?(?:[TU]AG|[TU]AA|[TU]GA)))/gi;
|
|
33
|
-
let m;
|
|
34
|
-
const orfRanges = [];
|
|
51
|
+
let m: RegExpExecArray | null;
|
|
52
|
+
const orfRanges: Orf[] = [];
|
|
35
53
|
//loop through orf hits!
|
|
36
54
|
/* eslint-disable no-cond-assign*/
|
|
37
55
|
|
|
@@ -59,16 +77,18 @@ export default function getOrfsFromSequence(options) {
|
|
|
59
77
|
internalStartCodonIndices: [],
|
|
60
78
|
frame: start % 3,
|
|
61
79
|
forward: forward,
|
|
62
|
-
annotationTypePlural: "orfs",
|
|
80
|
+
// annotationTypePlural: "orfs",
|
|
63
81
|
isOrf: true,
|
|
64
|
-
id: shortid()
|
|
65
|
-
|
|
82
|
+
id: shortid(),
|
|
83
|
+
type: "orf",
|
|
84
|
+
name: "ORF"
|
|
85
|
+
} as Orf);
|
|
66
86
|
}
|
|
67
87
|
}
|
|
68
88
|
}
|
|
69
89
|
// pair down the orfs to remove duplicates
|
|
70
90
|
// and deal with revComp orfs
|
|
71
|
-
const orfEnds = {};
|
|
91
|
+
const orfEnds: Record<number, number> = {};
|
|
72
92
|
orfRanges.forEach((orf, index) => {
|
|
73
93
|
const indexOfAlreadyExistingOrf = orfEnds[orf.end];
|
|
74
94
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { modulatePositionByRange } from "@teselagen/range-utils";
|
|
1
|
+
import { modulatePositionByRange, Range } from "@teselagen/range-utils";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* This function gets the overlapping of one sequence to another based on sequence equality.
|
|
@@ -9,9 +9,9 @@ import { modulatePositionByRange } from "@teselagen/range-utils";
|
|
|
9
9
|
* @return {object || null} null if no overlap exists or a range object with .start and .end properties
|
|
10
10
|
*/
|
|
11
11
|
export default function getOverlapBetweenTwoSequences(
|
|
12
|
-
sequenceToFind,
|
|
13
|
-
sequenceToSearchIn
|
|
14
|
-
) {
|
|
12
|
+
sequenceToFind: string,
|
|
13
|
+
sequenceToSearchIn: string
|
|
14
|
+
): Range | null {
|
|
15
15
|
sequenceToSearchIn = sequenceToSearchIn.toLowerCase();
|
|
16
16
|
sequenceToFind = sequenceToFind.toLowerCase();
|
|
17
17
|
const lengthenedSeqToSearch = sequenceToSearchIn + sequenceToSearchIn;
|
package/src/{getPossiblePartsFromSequenceAndEnzymes.js → getPossiblePartsFromSequenceAndEnzymes.ts}
RENAMED
|
@@ -1,12 +1,29 @@
|
|
|
1
1
|
import getComplementSequenceString from "./getComplementSequenceString";
|
|
2
2
|
import { normalizePositionByRangeLength } from "@teselagen/range-utils";
|
|
3
3
|
import cutSequenceByRestrictionEnzyme from "./cutSequenceByRestrictionEnzyme";
|
|
4
|
+
import { CutSite, RestrictionEnzyme, SequenceData } from "./types";
|
|
4
5
|
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
export interface PartBetweenEnzymes {
|
|
7
|
+
start: number;
|
|
8
|
+
start1Based: number;
|
|
9
|
+
end: number;
|
|
10
|
+
end1Based: number;
|
|
11
|
+
firstCut: CutSite;
|
|
12
|
+
firstCutOffset: number;
|
|
13
|
+
firstCutOverhang: string;
|
|
14
|
+
firstCutOverhangTop: string;
|
|
15
|
+
firstCutOverhangBottom: string;
|
|
16
|
+
secondCut: CutSite;
|
|
17
|
+
secondCutOffset: number;
|
|
18
|
+
secondCutOverhang: string;
|
|
19
|
+
secondCutOverhangTop: string;
|
|
20
|
+
secondCutOverhangBottom: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default function getPossiblePartsFromSequenceAndEnzymes(
|
|
24
|
+
seqData: SequenceData,
|
|
25
|
+
restrictionEnzymes: RestrictionEnzyme | RestrictionEnzyme[]
|
|
26
|
+
): PartBetweenEnzymes[] {
|
|
10
27
|
// ac.string,
|
|
11
28
|
// ac.bool,
|
|
12
29
|
// ac.shape({
|
|
@@ -18,18 +35,19 @@ export default function getPossiblePartsFromSequenceAndEnzyme(
|
|
|
18
35
|
// "bottomSnipOffset": ac.number
|
|
19
36
|
// })
|
|
20
37
|
// ], arguments);
|
|
21
|
-
|
|
38
|
+
const enzymes = Array.isArray(restrictionEnzymes)
|
|
22
39
|
? restrictionEnzymes
|
|
23
40
|
: [restrictionEnzymes];
|
|
41
|
+
|
|
24
42
|
const bps = seqData.sequence;
|
|
25
43
|
const seqLen = bps.length;
|
|
26
|
-
const circular = seqData.circular;
|
|
27
|
-
let cutsites = [];
|
|
28
|
-
|
|
44
|
+
const circular = seqData.circular || false;
|
|
45
|
+
let cutsites: CutSite[] = [];
|
|
46
|
+
enzymes.forEach(enzyme => {
|
|
29
47
|
const newCutsites = cutSequenceByRestrictionEnzyme(bps, circular, enzyme);
|
|
30
48
|
cutsites = cutsites.concat(newCutsites);
|
|
31
49
|
});
|
|
32
|
-
const parts = [];
|
|
50
|
+
const parts: PartBetweenEnzymes[] = [];
|
|
33
51
|
if (cutsites.length < 1) {
|
|
34
52
|
return parts;
|
|
35
53
|
} else if (cutsites.length === 1) {
|
|
@@ -69,16 +87,21 @@ export default function getPossiblePartsFromSequenceAndEnzyme(
|
|
|
69
87
|
}
|
|
70
88
|
}
|
|
71
89
|
|
|
72
|
-
function getPartBetweenEnzymesWithInclusiveOverhangs(
|
|
90
|
+
function getPartBetweenEnzymesWithInclusiveOverhangs(
|
|
91
|
+
cut1: CutSite,
|
|
92
|
+
cut2: CutSite,
|
|
93
|
+
seqLen: number
|
|
94
|
+
): PartBetweenEnzymes {
|
|
73
95
|
const firstCutOffset = getEnzymeRelativeOffset(cut1.restrictionEnzyme);
|
|
74
96
|
const secondCutOffset = getEnzymeRelativeOffset(cut2.restrictionEnzyme);
|
|
75
|
-
const start =
|
|
76
|
-
|
|
77
|
-
|
|
97
|
+
const start =
|
|
98
|
+
(cut1.topSnipBeforeBottom
|
|
99
|
+
? cut1.topSnipPosition
|
|
100
|
+
: cut1.bottomSnipPosition) || 0;
|
|
78
101
|
const end = normalizePositionByRangeLength(
|
|
79
102
|
(cut2.topSnipBeforeBottom
|
|
80
|
-
? cut2.bottomSnipPosition
|
|
81
|
-
: cut2.topSnipPosition) - 1,
|
|
103
|
+
? cut2.bottomSnipPosition || 0
|
|
104
|
+
: cut2.topSnipPosition || 0) - 1,
|
|
82
105
|
seqLen
|
|
83
106
|
);
|
|
84
107
|
return {
|
|
@@ -89,26 +112,30 @@ function getPartBetweenEnzymesWithInclusiveOverhangs(cut1, cut2, seqLen) {
|
|
|
89
112
|
firstCut: cut1,
|
|
90
113
|
//the offset is always counting with 0 being at the top snip position
|
|
91
114
|
firstCutOffset,
|
|
92
|
-
firstCutOverhang: cut1.overhangBps,
|
|
93
|
-
firstCutOverhangTop: firstCutOffset > 0 ? cut1.overhangBps : "",
|
|
115
|
+
firstCutOverhang: cut1.overhangBps || "",
|
|
116
|
+
firstCutOverhangTop: firstCutOffset > 0 ? cut1.overhangBps || "" : "",
|
|
94
117
|
firstCutOverhangBottom:
|
|
95
|
-
firstCutOffset < 0
|
|
118
|
+
firstCutOffset < 0
|
|
119
|
+
? getComplementSequenceString(cut1.overhangBps || "")
|
|
120
|
+
: "",
|
|
96
121
|
secondCut: cut2,
|
|
97
122
|
//the offset is always counting with 0 being at the top snip position
|
|
98
123
|
secondCutOffset,
|
|
99
|
-
secondCutOverhang: cut2.overhangBps,
|
|
100
|
-
secondCutOverhangTop: secondCutOffset < 0 ? cut2.overhangBps : "",
|
|
124
|
+
secondCutOverhang: cut2.overhangBps || "",
|
|
125
|
+
secondCutOverhangTop: secondCutOffset < 0 ? cut2.overhangBps || "" : "",
|
|
101
126
|
secondCutOverhangBottom:
|
|
102
|
-
secondCutOffset > 0
|
|
127
|
+
secondCutOffset > 0
|
|
128
|
+
? getComplementSequenceString(cut2.overhangBps || "")
|
|
129
|
+
: ""
|
|
103
130
|
};
|
|
104
131
|
}
|
|
105
132
|
|
|
106
|
-
function getEnzymeRelativeOffset(enzyme) {
|
|
133
|
+
function getEnzymeRelativeOffset(enzyme: RestrictionEnzyme): number {
|
|
107
134
|
//the offset is always counting with 0 being at the top snip position
|
|
108
|
-
return enzyme.bottomSnipOffset - enzyme.topSnipOffset;
|
|
135
|
+
return (enzyme.bottomSnipOffset || 0) - (enzyme.topSnipOffset || 0);
|
|
109
136
|
}
|
|
110
137
|
|
|
111
|
-
function pairwise(list) {
|
|
138
|
+
function pairwise<T>(list: T[]): T[][] {
|
|
112
139
|
if (list.length < 2) {
|
|
113
140
|
return [];
|
|
114
141
|
}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import getAminoAcidDataForEachBaseOfDna from "./getAminoAcidDataForEachBaseOfDna";
|
|
2
2
|
|
|
3
3
|
export default function getReverseAminoAcidStringFromSequenceString(
|
|
4
|
-
sequenceString
|
|
4
|
+
sequenceString: string
|
|
5
5
|
) {
|
|
6
6
|
const aminoAcidsPerBase = getAminoAcidDataForEachBaseOfDna(
|
|
7
7
|
sequenceString,
|
|
8
|
+
false,
|
|
9
|
+
null,
|
|
8
10
|
false
|
|
9
11
|
);
|
|
10
|
-
const aaArray = [];
|
|
12
|
+
const aaArray: string[] = [];
|
|
11
13
|
let aaString = "";
|
|
12
14
|
aminoAcidsPerBase.forEach(aa => {
|
|
13
15
|
if (!aa.fullCodon) {
|
|
@@ -2,8 +2,8 @@ import getAminoAcidStringFromSequenceString from "./getAminoAcidStringFromSequen
|
|
|
2
2
|
import getReverseComplementSequenceString from "./getReverseComplementSequenceString";
|
|
3
3
|
|
|
4
4
|
export default function getReverseComplementAminoAcidStringFromSequenceString(
|
|
5
|
-
sequenceString
|
|
6
|
-
) {
|
|
5
|
+
sequenceString: string
|
|
6
|
+
): string {
|
|
7
7
|
return getAminoAcidStringFromSequenceString(
|
|
8
8
|
getReverseComplementSequenceString(sequenceString)
|
|
9
9
|
);
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { Annotation } from "./types";
|
|
2
|
+
|
|
1
3
|
export default function getReverseComplementAnnotation(
|
|
2
|
-
annotation,
|
|
3
|
-
sequenceLength
|
|
4
|
+
annotation: Annotation,
|
|
5
|
+
sequenceLength: number
|
|
4
6
|
) {
|
|
5
7
|
//note this function assumes that the entire sequence (or subsequence) is being reverse complemented
|
|
6
8
|
//TNR: this is what is happening:
|