@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.
Files changed (239) hide show
  1. package/DNAComplementMap.d.ts +1 -1
  2. package/README.md +2 -8
  3. package/addGapsToSeqReads.d.ts +16 -3
  4. package/adjustAnnotationsToInsert.d.ts +2 -1
  5. package/adjustBpsToReplaceOrInsert.d.ts +2 -1
  6. package/aliasedEnzymesByName.d.ts +37 -1
  7. package/aminoAcidToDegenerateDnaMap.d.ts +1 -31
  8. package/aminoAcidToDegenerateRnaMap.d.ts +1 -1
  9. package/annotateSingleSeq.d.ts +5 -4
  10. package/annotationTypes.d.ts +2 -2
  11. package/autoAnnotate.d.ts +17 -8
  12. package/bioData.d.ts +10 -58
  13. package/calculateEndStability.d.ts +1 -1
  14. package/calculateNebTa.d.ts +6 -1
  15. package/calculateNebTm.d.ts +6 -4
  16. package/calculatePercentGC.d.ts +1 -1
  17. package/calculateSantaLuciaTm.d.ts +28 -114
  18. package/calculateTm.d.ts +13 -1
  19. package/computeDigestFragments.d.ts +30 -24
  20. package/condensePairwiseAlignmentDifferences.d.ts +1 -1
  21. package/convertAACaretPositionOrRangeToDna.d.ts +2 -1
  22. package/convertDnaCaretPositionOrRangeToAA.d.ts +2 -1
  23. package/cutSequenceByRestrictionEnzyme.d.ts +2 -1
  24. package/defaultEnzymesByName.d.ts +2 -1
  25. package/degenerateDnaToAminoAcidMap.d.ts +1 -1
  26. package/degenerateRnaToAminoAcidMap.d.ts +1 -1
  27. package/deleteSequenceDataAtRange.d.ts +2 -1
  28. package/diffUtils.d.ts +9 -7
  29. package/doesEnzymeChopOutsideOfRecognitionSite.d.ts +2 -1
  30. package/featureTypesAndColors.d.ts +19 -6
  31. package/filterSequenceString.d.ts +14 -10
  32. package/findApproxMatches.d.ts +7 -1
  33. package/findNearestRangeOfSequenceOverlapToPosition.d.ts +2 -1
  34. package/findOrfsInPlasmid.d.ts +2 -11
  35. package/findSequenceMatches.d.ts +11 -1
  36. package/generateAnnotations.d.ts +2 -1
  37. package/generateSequenceData.d.ts +8 -13
  38. package/getAllInsertionsInSeqReads.d.ts +11 -1
  39. package/getAminoAcidDataForEachBaseOfDna.d.ts +6 -5
  40. package/getAminoAcidFromSequenceTriplet.d.ts +1 -1
  41. package/getAminoAcidStringFromSequenceString.d.ts +3 -1
  42. package/getCodonRangeForAASliver.d.ts +3 -4
  43. package/getComplementAminoAcidStringFromSequenceString.d.ts +1 -1
  44. package/getComplementSequenceAndAnnotations.d.ts +5 -1
  45. package/getComplementSequenceString.d.ts +1 -1
  46. package/getCutsiteType.d.ts +2 -1
  47. package/getCutsitesFromSequence.d.ts +2 -1
  48. package/getDegenerateDnaStringFromAAString.d.ts +1 -1
  49. package/getDegenerateRnaStringFromAAString.d.ts +1 -1
  50. package/getDigestFragmentsForCutsites.d.ts +4 -1
  51. package/getDigestFragmentsForRestrictionEnzymes.d.ts +8 -1
  52. package/getInsertBetweenVals.d.ts +2 -1
  53. package/getLeftAndRightOfSequenceInRangeGivenPosition.d.ts +2 -1
  54. package/getOrfsFromSequence.d.ts +17 -11
  55. package/getOverlapBetweenTwoSequences.d.ts +2 -1
  56. package/getPossiblePartsFromSequenceAndEnzymes.d.ts +18 -1
  57. package/getReverseAminoAcidStringFromSequenceString.d.ts +1 -1
  58. package/getReverseComplementAminoAcidStringFromSequenceString.d.ts +1 -1
  59. package/getReverseComplementAnnotation.d.ts +11 -1
  60. package/getReverseComplementSequenceAndAnnotations.d.ts +5 -1
  61. package/getReverseComplementSequenceString.d.ts +1 -1
  62. package/getReverseSequenceString.d.ts +1 -1
  63. package/getSequenceDataBetweenRange.d.ts +9 -1
  64. package/getVirtualDigest.d.ts +11 -10
  65. package/guessIfSequenceIsDnaAndNotProtein.d.ts +5 -1
  66. package/index.cjs +765 -497
  67. package/index.d.ts +9 -5
  68. package/index.js +766 -498
  69. package/index.umd.cjs +765 -497
  70. package/insertGapsIntoRefSeq.d.ts +2 -1
  71. package/insertSequenceDataAtPositionOrRange.d.ts +10 -1
  72. package/isEnzymeType2S.d.ts +2 -1
  73. package/mapAnnotationsToRows.d.ts +9 -1
  74. package/package.json +9 -6
  75. package/prepareCircularViewData.d.ts +2 -1
  76. package/prepareRowData.d.ts +7 -3
  77. package/proteinAlphabet.d.ts +1 -1
  78. package/rotateBpsToPosition.d.ts +1 -1
  79. package/rotateSequenceDataToPosition.d.ts +3 -1
  80. package/shiftAnnotationsByLen.d.ts +4 -3
  81. package/src/{addGapsToSeqReads.js → addGapsToSeqReads.ts} +33 -14
  82. package/src/adjustAnnotationsToInsert.ts +22 -0
  83. package/src/{adjustBpsToReplaceOrInsert.js → adjustBpsToReplaceOrInsert.ts} +31 -8
  84. package/src/{aliasedEnzymesByName.js → aliasedEnzymesByName.ts} +4 -1
  85. package/src/{aminoAcidToDegenerateDnaMap.js → aminoAcidToDegenerateDnaMap.ts} +1 -1
  86. package/src/{annotateSingleSeq.js → annotateSingleSeq.ts} +11 -3
  87. package/src/autoAnnotate.test.js +0 -1
  88. package/src/{autoAnnotate.js → autoAnnotate.ts} +69 -24
  89. package/src/{bioData.js → bioData.ts} +2 -2
  90. package/src/{calculateEndStability.js → calculateEndStability.ts} +21 -16
  91. package/src/{calculateNebTa.js → calculateNebTa.ts} +20 -8
  92. package/src/{calculateNebTm.js → calculateNebTm.ts} +15 -9
  93. package/src/{calculatePercentGC.js → calculatePercentGC.ts} +1 -1
  94. package/src/{calculateSantaLuciaTm.js → calculateSantaLuciaTm.ts} +29 -22
  95. package/src/{calculateTm.js → calculateTm.ts} +50 -59
  96. package/src/{computeDigestFragments.js → computeDigestFragments.ts} +92 -36
  97. package/src/{condensePairwiseAlignmentDifferences.js → condensePairwiseAlignmentDifferences.ts} +4 -4
  98. package/src/{convertAACaretPositionOrRangeToDna.js → convertAACaretPositionOrRangeToDna.ts} +8 -4
  99. package/src/{convertDnaCaretPositionOrRangeToAA.js → convertDnaCaretPositionOrRangeToAA.ts} +8 -4
  100. package/src/cutSequenceByRestrictionEnzyme.ts +345 -0
  101. package/src/{defaultEnzymesByName.js → defaultEnzymesByName.ts} +2 -1
  102. package/src/deleteSequenceDataAtRange.ts +13 -0
  103. package/src/diffUtils.ts +80 -0
  104. package/src/doesEnzymeChopOutsideOfRecognitionSite.ts +16 -0
  105. package/src/{featureTypesAndColors.js → featureTypesAndColors.ts} +29 -14
  106. package/src/{filterSequenceString.js → filterSequenceString.ts} +51 -21
  107. package/src/{findApproxMatches.js → findApproxMatches.ts} +14 -6
  108. package/src/{findNearestRangeOfSequenceOverlapToPosition.js → findNearestRangeOfSequenceOverlapToPosition.ts} +13 -9
  109. package/src/{findOrfsInPlasmid.js → findOrfsInPlasmid.ts} +8 -7
  110. package/src/{findSequenceMatches.js → findSequenceMatches.ts} +31 -13
  111. package/src/{generateAnnotations.js → generateAnnotations.ts} +14 -9
  112. package/src/{generateSequenceData.js → generateSequenceData.ts} +19 -13
  113. package/src/{getAllInsertionsInSeqReads.js → getAllInsertionsInSeqReads.ts} +19 -2
  114. package/src/{getAminoAcidDataForEachBaseOfDna.js → getAminoAcidDataForEachBaseOfDna.ts} +36 -30
  115. package/src/{getAminoAcidFromSequenceTriplet.js → getAminoAcidFromSequenceTriplet.ts} +9 -4
  116. package/src/{getAminoAcidStringFromSequenceString.js → getAminoAcidStringFromSequenceString.ts} +14 -7
  117. package/src/{getCodonRangeForAASliver.js → getCodonRangeForAASliver.ts} +16 -6
  118. package/src/{getComplementAminoAcidStringFromSequenceString.js → getComplementAminoAcidStringFromSequenceString.ts} +5 -3
  119. package/src/{getComplementSequenceAndAnnotations.js → getComplementSequenceAndAnnotations.ts} +8 -6
  120. package/src/{getComplementSequenceString.js → getComplementSequenceString.ts} +5 -2
  121. package/src/getCutsiteType.ts +18 -0
  122. package/src/getCutsitesFromSequence.ts +22 -0
  123. package/src/getDegenerateDnaStringFromAAString.ts +15 -0
  124. package/src/getDegenerateRnaStringFromAAString.ts +15 -0
  125. package/src/{getDigestFragmentsForCutsites.js → getDigestFragmentsForCutsites.ts} +32 -14
  126. package/src/getDigestFragmentsForRestrictionEnzymes.ts +50 -0
  127. package/src/{getInsertBetweenVals.js → getInsertBetweenVals.ts} +8 -5
  128. package/src/{getLeftAndRightOfSequenceInRangeGivenPosition.js → getLeftAndRightOfSequenceInRangeGivenPosition.ts} +11 -10
  129. package/src/{getMassOfAaString.js → getMassOfAaString.ts} +4 -2
  130. package/src/{getOrfsFromSequence.js → getOrfsFromSequence.ts} +27 -7
  131. package/src/{getOverlapBetweenTwoSequences.js → getOverlapBetweenTwoSequences.ts} +4 -4
  132. package/src/{getPossiblePartsFromSequenceAndEnzymes.js → getPossiblePartsFromSequenceAndEnzymes.ts} +52 -25
  133. package/src/{getReverseAminoAcidStringFromSequenceString.js → getReverseAminoAcidStringFromSequenceString.ts} +4 -2
  134. package/src/{getReverseComplementAminoAcidStringFromSequenceString.js → getReverseComplementAminoAcidStringFromSequenceString.ts} +2 -2
  135. package/src/{getReverseComplementAnnotation.js → getReverseComplementAnnotation.ts} +4 -2
  136. package/src/getReverseComplementSequenceAndAnnotations.ts +45 -0
  137. package/src/{getReverseComplementSequenceString.js → getReverseComplementSequenceString.ts} +4 -4
  138. package/src/{getReverseSequenceString.js → getReverseSequenceString.ts} +1 -1
  139. package/src/getSequenceDataBetweenRange.test.js +6 -3
  140. package/src/{getSequenceDataBetweenRange.js → getSequenceDataBetweenRange.ts} +44 -29
  141. package/src/{getVirtualDigest.js → getVirtualDigest.ts} +20 -9
  142. package/src/{guessIfSequenceIsDnaAndNotProtein.js → guessIfSequenceIsDnaAndNotProtein.ts} +11 -5
  143. package/src/{index.test.js → index.test.ts} +9 -5
  144. package/src/{index.js → index.ts} +1 -0
  145. package/src/{insertGapsIntoRefSeq.js → insertGapsIntoRefSeq.ts} +7 -2
  146. package/src/{insertSequenceDataAtPositionOrRange.js → insertSequenceDataAtPositionOrRange.ts} +130 -56
  147. package/src/isEnzymeType2S.ts +8 -0
  148. package/src/mapAnnotationsToRows.ts +256 -0
  149. package/src/prepareCircularViewData.ts +24 -0
  150. package/src/{prepareRowData.js → prepareRowData.ts} +27 -8
  151. package/src/prepareRowData_output1.json +1 -0
  152. package/src/rotateBpsToPosition.ts +12 -0
  153. package/src/{rotateSequenceDataToPosition.js → rotateSequenceDataToPosition.ts} +11 -8
  154. package/src/shiftAnnotationsByLen.ts +24 -0
  155. package/src/{threeLetterSequenceStringToAminoAcidMap.js → threeLetterSequenceStringToAminoAcidMap.ts} +29 -9
  156. package/src/{tidyUpAnnotation.js → tidyUpAnnotation.ts} +40 -18
  157. package/src/{tidyUpSequenceData.js → tidyUpSequenceData.ts} +83 -39
  158. package/src/types.ts +99 -0
  159. package/threeLetterSequenceStringToAminoAcidMap.d.ts +11 -921
  160. package/tidyUpAnnotation.d.ts +13 -11
  161. package/tidyUpSequenceData.d.ts +18 -1
  162. package/types.d.ts +97 -0
  163. package/addGapsToSeqReads.test.d.ts +0 -1
  164. package/adjustBpsToReplaceOrInsert.test.d.ts +0 -1
  165. package/aminoAcidToDnaRna.test.d.ts +0 -1
  166. package/annotateSingleSeq.test.d.ts +0 -1
  167. package/autoAnnotate.test.d.ts +0 -1
  168. package/calculateEndStability.test.d.ts +0 -1
  169. package/calculateNebTa.test.d.ts +0 -1
  170. package/calculateNebTm.test.d.ts +0 -1
  171. package/calculatePercentGC.test.d.ts +0 -1
  172. package/calculateSantaLuciaTm.test.d.ts +0 -1
  173. package/calculateTm.test.d.ts +0 -1
  174. package/computeDigestFragments.test.d.ts +0 -1
  175. package/condensePairwiseAlignmentDifferences.test.d.ts +0 -1
  176. package/convertAACaretPositionOrRangeToDna.test.d.ts +0 -1
  177. package/convertDnaCaretPositionOrRangeToAA.test.d.ts +0 -1
  178. package/cutSequenceByRestrictionEnzyme.test.d.ts +0 -1
  179. package/deleteSequenceDataAtRange.test.d.ts +0 -1
  180. package/diffUtils.test.d.ts +0 -1
  181. package/doesEnzymeChopOutsideOfRecognitionSite.test.d.ts +0 -1
  182. package/featureTypesAndColors.test.d.ts +0 -1
  183. package/filterSequenceString.test.d.ts +0 -1
  184. package/findApproxMatches.test.d.ts +0 -1
  185. package/findNearestRangeOfSequenceOverlapToPosition.test.d.ts +0 -1
  186. package/findSequenceMatches.test.d.ts +0 -1
  187. package/generateSequenceData.test.d.ts +0 -1
  188. package/getAllInsertionsInSeqReads.test.d.ts +0 -1
  189. package/getAminoAcidDataForEachBaseOfDna.test.d.ts +0 -1
  190. package/getAminoAcidStringFromSequenceString.test.d.ts +0 -1
  191. package/getComplementSequenceString.test.d.ts +0 -1
  192. package/getDigestFragmentsForRestrictionEnzymes.test.d.ts +0 -1
  193. package/getInsertBetweenVals.test.d.ts +0 -1
  194. package/getLeftAndRightOfSequenceInRangeGivenPosition.test.d.ts +0 -1
  195. package/getMassofAaString.test.d.ts +0 -1
  196. package/getOrfsFromSequence.test.d.ts +0 -1
  197. package/getOverlapBetweenTwoSequences.test.d.ts +0 -1
  198. package/getPossiblePartsFromSequenceAndEnzymes.test.d.ts +0 -1
  199. package/getReverseAminoAcidStringFromSequenceString.test.d.ts +0 -1
  200. package/getReverseComplementAnnotation.test.d.ts +0 -1
  201. package/getReverseComplementSequenceAndAnnotations.test.d.ts +0 -1
  202. package/getReverseComplementSequenceString.test.d.ts +0 -1
  203. package/getReverseSequenceString.test.d.ts +0 -1
  204. package/getSequenceDataBetweenRange.test.d.ts +0 -1
  205. package/getVirtualDigest.test.d.ts +0 -1
  206. package/guessIfSequenceIsDnaAndNotProtein.test.d.ts +0 -1
  207. package/index.test.d.ts +0 -1
  208. package/insertGapsIntoRefSeq.test.d.ts +0 -1
  209. package/insertSequenceDataAtPosition.test.d.ts +0 -1
  210. package/insertSequenceDataAtPositionOrRange.test.d.ts +0 -1
  211. package/mapAnnotationsToRows.test.d.ts +0 -1
  212. package/prepareCircularViewData.test.d.ts +0 -1
  213. package/prepareRowData.test.d.ts +0 -1
  214. package/rotateBpsToPosition.test.d.ts +0 -1
  215. package/rotateSequenceDataToPosition.test.d.ts +0 -1
  216. package/src/adjustAnnotationsToInsert.js +0 -19
  217. package/src/cutSequenceByRestrictionEnzyme.js +0 -301
  218. package/src/deleteSequenceDataAtRange.js +0 -5
  219. package/src/diffUtils.js +0 -63
  220. package/src/doesEnzymeChopOutsideOfRecognitionSite.js +0 -10
  221. package/src/getCutsiteType.js +0 -10
  222. package/src/getCutsitesFromSequence.js +0 -17
  223. package/src/getDegenerateDnaStringFromAAString.js +0 -8
  224. package/src/getDegenerateRnaStringFromAAString.js +0 -8
  225. package/src/getDigestFragmentsForRestrictionEnzymes.js +0 -27
  226. package/src/getReverseComplementSequenceAndAnnotations.js +0 -40
  227. package/src/isEnzymeType2S.js +0 -3
  228. package/src/mapAnnotationsToRows.js +0 -174
  229. package/src/prepareCircularViewData.js +0 -17
  230. package/src/rotateBpsToPosition.js +0 -9
  231. package/src/shiftAnnotationsByLen.js +0 -17
  232. package/tidyUpSequenceData.test.d.ts +0 -1
  233. /package/src/{DNAComplementMap.js → DNAComplementMap.ts} +0 -0
  234. /package/src/{aminoAcidToDegenerateRnaMap.js → aminoAcidToDegenerateRnaMap.ts} +0 -0
  235. /package/src/{annotationTypes.js → annotationTypes.ts} +0 -0
  236. /package/src/{degenerateDnaToAminoAcidMap.js → degenerateDnaToAminoAcidMap.ts} +0 -0
  237. /package/src/{degenerateRnaToAminoAcidMap.js → degenerateRnaToAminoAcidMap.ts} +0 -0
  238. /package/src/{insertSequenceDataAtPosition.js → insertSequenceDataAtPosition.ts} +0 -0
  239. /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, true);
4
+ sequenceString: string
5
+ ): string {
6
+ const aaString = getAminoAcidStringFromSequenceString(sequenceString, {
7
+ doNotExcludeAsterisk: true
8
+ });
7
9
  return aaString.split("").reverse().join("");
8
10
  }
@@ -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
- options
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(sequence, isRna) {
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 { normalizePositionByRangeLength1Based } from "@teselagen/range-utils";
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[aaString[i]].mass;
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;
@@ -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 default function getPossiblePartsFromSequenceAndEnzyme(
6
- seqData,
7
- restrictionEnzymes
8
- ) {
9
- // ac.throw([
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
- restrictionEnzymes = restrictionEnzymes.length
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
- restrictionEnzymes.forEach(enzyme => {
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(cut1, cut2, seqLen) {
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 = cut1.topSnipBeforeBottom
76
- ? cut1.topSnipPosition
77
- : cut1.bottomSnipPosition;
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 ? getComplementSequenceString(cut1.overhangBps) : "",
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 ? getComplementSequenceString(cut2.overhangBps) : ""
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: