@teselagen/ove 0.0.14 → 0.0.16

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 (362) hide show
  1. package/index.umd.js +164825 -135871
  2. package/package.json +78 -9
  3. package/src/AlignmentTool/index.js +16 -0
  4. package/src/AlignmentView/AlignmentVisibilityTool.js +105 -0
  5. package/src/AlignmentView/EditTrackNameDialog.js +34 -0
  6. package/src/AlignmentView/HorizontalPanelDragHandle.js +35 -0
  7. package/src/AlignmentView/Minimap.js +520 -0
  8. package/src/AlignmentView/Mismatches.js +134 -0
  9. package/src/AlignmentView/PairwiseAlignmentView.js +68 -0
  10. package/src/AlignmentView/PerformantSelectionLayer.js +32 -0
  11. package/src/AlignmentView/coerceInitialValue.js +7 -0
  12. package/src/AlignmentView/getGapMap.js +12 -0
  13. package/src/AlignmentView/getGaps.js +27 -0
  14. package/src/AlignmentView/getPairwiseOverviewLinearViewOptions.js +38 -0
  15. package/src/AlignmentView/getTrackFromEvent.js +25 -0
  16. package/src/AlignmentView/index.js +2058 -0
  17. package/src/AlignmentView/isTargetWithinEl.js +6 -0
  18. package/src/AlignmentView/style.css +100 -0
  19. package/src/AlignmentView/updateTrackHelper.js +58 -0
  20. package/src/AutoAnnotate.js +500 -0
  21. package/src/AutoAnnotateBpMatchingDialog.js +208 -0
  22. package/src/CircularView/Axis.js +40 -0
  23. package/src/CircularView/AxisNumbers.js +35 -0
  24. package/src/CircularView/Caret.js +63 -0
  25. package/src/CircularView/CircularDnaSequence.js +73 -0
  26. package/src/CircularView/CircularZoomMinimap.js +16 -0
  27. package/src/CircularView/Cutsite.js +18 -0
  28. package/src/CircularView/Cutsites.js +113 -0
  29. package/src/CircularView/DeletionLayer.js +28 -0
  30. package/src/CircularView/Feature.js +83 -0
  31. package/src/CircularView/Labels/index.js +536 -0
  32. package/src/CircularView/Labels/relaxLabelAngles.js +157 -0
  33. package/src/CircularView/Labels/relaxLabels_DEPRECATED.js +105 -0
  34. package/src/CircularView/Labels/style.css +55 -0
  35. package/src/CircularView/Orf.js +25 -0
  36. package/src/CircularView/Part.js +34 -0
  37. package/src/CircularView/PositionAnnotationOnCircle.js +26 -0
  38. package/src/CircularView/Primer.js +41 -0
  39. package/src/CircularView/RotateCircularViewSlider.js +82 -0
  40. package/src/CircularView/SelectionLayer.js +132 -0
  41. package/src/CircularView/VeTopRightContainer.js +12 -0
  42. package/src/CircularView/ZoomCircularViewSlider.js +62 -0
  43. package/src/CircularView/drawAnnotations.js +433 -0
  44. package/src/CircularView/drawDirectedPiePiece.js +142 -0
  45. package/src/CircularView/getAngleForPositionMidpoint.js +3 -0
  46. package/src/CircularView/getInternalLabel.js +40 -0
  47. package/src/CircularView/getRangeAnglesSpecial.js +12 -0
  48. package/src/CircularView/getYOffset.js +15 -0
  49. package/src/CircularView/index.d.ts +20 -0
  50. package/src/CircularView/index.js +930 -0
  51. package/src/CircularView/normalizeAngle.js +3 -0
  52. package/src/CircularView/normalizeAngleRange.js +9 -0
  53. package/src/CircularView/positionCutsites.js +6 -0
  54. package/src/CircularView/shouldFlipText.js +4 -0
  55. package/src/CircularView/style.css +47 -0
  56. package/src/CircularView/utils/polarToSpecialCartesian.js +7 -0
  57. package/src/CreateAnnotationsPage.js +96 -0
  58. package/src/CreateCustomEnzyme/index.js +337 -0
  59. package/src/CreateCustomEnzyme/style.css +100 -0
  60. package/src/CutsiteFilter/AdditionalCutsiteInfoDialog.js +599 -0
  61. package/src/CutsiteFilter/index.js +408 -0
  62. package/src/CutsiteFilter/style.css +23 -0
  63. package/src/CutsiteFilter/withRestrictionEnzymes.js +15 -0
  64. package/src/DigestTool/AddLaddersDialog.js +82 -0
  65. package/src/DigestTool/DigestTool.js +223 -0
  66. package/src/DigestTool/Ladder.css +20 -0
  67. package/src/DigestTool/Ladder.js +303 -0
  68. package/src/DigestTool/createFragmentLines.js +120 -0
  69. package/src/DigestTool/ladderDefaults.js +26 -0
  70. package/src/DigestTool/ruler.css +89 -0
  71. package/src/Editor/CommandHotkeyHandler.js +44 -0
  72. package/src/Editor/DropHandler.css +21 -0
  73. package/src/Editor/DropHandler.js +64 -0
  74. package/src/Editor/FillWindow.js +46 -0
  75. package/src/Editor/darkmode.css +98 -0
  76. package/src/Editor/index.js +1005 -0
  77. package/src/Editor/style.css +235 -0
  78. package/src/Editor/userDefinedHandlersAndOpts.js +56 -0
  79. package/src/EnzymeViewer/index.js +81 -0
  80. package/src/EnzymeViewer/style.css +6 -0
  81. package/src/FindBar/index.js +411 -0
  82. package/src/FindBar/style.css +46 -0
  83. package/src/GlobalDialog.js +66 -0
  84. package/src/GlobalDialogUtils.js +85 -0
  85. package/src/LinearView/SequenceName.js +15 -0
  86. package/src/LinearView/ZoomLinearView.js +47 -0
  87. package/src/LinearView/index.js +374 -0
  88. package/src/LinearView/style.css +12 -0
  89. package/src/ManageEnzymes/index.js +326 -0
  90. package/src/ManageEnzymes/style.css +100 -0
  91. package/src/MenuBar/defaultConfig.js +149 -0
  92. package/src/MenuBar/index.js +98 -0
  93. package/src/MenuBar/viewSubmenu.js +479 -0
  94. package/src/PCRTool/PCRTool.js +173 -0
  95. package/src/Reflex/Browser.js +107 -0
  96. package/src/Reflex/ReflexContainer.js +802 -0
  97. package/src/Reflex/ReflexElement.js +160 -0
  98. package/src/Reflex/ReflexEvents.js +77 -0
  99. package/src/Reflex/ReflexSplitter.js +205 -0
  100. package/src/Reflex/index.js +5 -0
  101. package/src/Reflex/reflex-styles.css +128 -0
  102. package/src/Reflex/reflex-styles.css.map +9 -0
  103. package/src/RowItem/AnnotationContainerHolder.js +20 -0
  104. package/src/RowItem/AnnotationPositioner.js +27 -0
  105. package/src/RowItem/Axis.js +149 -0
  106. package/src/RowItem/Caret/index.js +64 -0
  107. package/src/RowItem/Caret/style.css +8 -0
  108. package/src/RowItem/Chromatograms/Chromatogram.js +289 -0
  109. package/src/RowItem/CutsiteSelectionLayers.js +47 -0
  110. package/src/RowItem/Cutsites.js +271 -0
  111. package/src/RowItem/DeletionLayers/index.js +113 -0
  112. package/src/RowItem/DeletionLayers/style.css +5 -0
  113. package/src/RowItem/Labels.js +327 -0
  114. package/src/RowItem/Orf.js +109 -0
  115. package/src/RowItem/Orfs.js +35 -0
  116. package/src/RowItem/ReplacementLayers/style.css +5 -0
  117. package/src/RowItem/SelectionLayer/index.js +184 -0
  118. package/src/RowItem/SelectionLayer/style.css +21 -0
  119. package/src/RowItem/Sequence.js +269 -0
  120. package/src/RowItem/StackedAnnotations/PointedAnnotation.js +347 -0
  121. package/src/RowItem/StackedAnnotations/getStructuredBases.js +97 -0
  122. package/src/RowItem/StackedAnnotations/index.js +182 -0
  123. package/src/RowItem/StackedAnnotations/primerBases.js +218 -0
  124. package/src/RowItem/StackedAnnotations/style.css +14 -0
  125. package/src/RowItem/Translations/AASliver.js +190 -0
  126. package/src/RowItem/Translations/Translation.js +162 -0
  127. package/src/RowItem/Translations/index.js +54 -0
  128. package/src/RowItem/Translations/style.css +3 -0
  129. package/src/RowItem/constants.js +3 -0
  130. package/src/RowItem/getCutsiteLabelHeights.js +56 -0
  131. package/src/RowItem/getXStartAndWidthFromNonCircularRange.js +12 -0
  132. package/src/RowItem/getXStartAndWidthOfRangeWrtRow.js +27 -0
  133. package/src/RowItem/getXStartAndWidthOfRowAnnotation.js +19 -0
  134. package/src/RowItem/index.js +647 -0
  135. package/src/RowItem/partOverhangs.js +6 -0
  136. package/src/RowItem/style.css +103 -0
  137. package/src/RowItem/utils.js +32 -0
  138. package/src/RowView/estimateRowHeight.js +184 -0
  139. package/src/RowView/index.d.ts +10 -0
  140. package/src/RowView/index.js +554 -0
  141. package/src/RowView/style.css +12 -0
  142. package/src/SimpleCircularOrLinearView.js +379 -0
  143. package/src/SimpleOligoPreview.js +39 -0
  144. package/src/StatusBar/MeltingTemp.js +81 -0
  145. package/src/StatusBar/index.js +275 -0
  146. package/src/StatusBar/style.css +38 -0
  147. package/src/ToolBar/ToolbarItem.js +194 -0
  148. package/src/ToolBar/alignmentTool.js +503 -0
  149. package/src/ToolBar/array_move.js +10 -0
  150. package/src/ToolBar/cutsiteTool.js +88 -0
  151. package/src/ToolBar/downloadTool.js +38 -0
  152. package/src/ToolBar/editTool.js +26 -0
  153. package/src/ToolBar/featureTool.js +34 -0
  154. package/src/ToolBar/findTool.js +2 -0
  155. package/src/ToolBar/importTool.js +27 -0
  156. package/src/ToolBar/index.js +231 -0
  157. package/src/ToolBar/inlineFindTool.js +38 -0
  158. package/src/ToolBar/oligoTool.js +30 -0
  159. package/src/ToolBar/orfTool.js +141 -0
  160. package/src/ToolBar/partTool.js +47 -0
  161. package/src/ToolBar/printTool.js +31 -0
  162. package/src/ToolBar/redoTool.js +30 -0
  163. package/src/ToolBar/saveTool.js +48 -0
  164. package/src/ToolBar/style.css +138 -0
  165. package/src/ToolBar/undoTool.js +30 -0
  166. package/src/ToolBar/veToolbarIcons/find.png +0 -0
  167. package/src/ToolBar/veToolbarIcons/fullscreen.png +0 -0
  168. package/src/ToolBar/veToolbarIcons/linear.png +0 -0
  169. package/src/ToolBar/veToolbarIcons/pie.png +0 -0
  170. package/src/ToolBar/veToolbarIcons/print.png +0 -0
  171. package/src/ToolBar/veToolbarIcons/save.png +0 -0
  172. package/src/ToolBar/veToolbarIcons/show_cut_sites.png +0 -0
  173. package/src/ToolBar/veToolbarIcons/show_features.png +0 -0
  174. package/src/ToolBar/veToolbarIcons/show_orfs.png +0 -0
  175. package/src/ToolBar/veToolbarIcons/show_primers.png +0 -0
  176. package/src/ToolBar/veToolbarIcons/toggle_views.svg +1 -0
  177. package/src/ToolBar/versionHistoryTool.js +20 -0
  178. package/src/ToolBar/visibilityTool.js +39 -0
  179. package/src/VersionHistoryView/index.js +215 -0
  180. package/src/addAlignment.js +6 -0
  181. package/src/commands/getOveHotkeyDefs.js +12 -0
  182. package/src/commands/index.js +1585 -0
  183. package/src/constants/constants.js +2 -0
  184. package/src/constants/dnaToColor.js +17 -0
  185. package/src/constants/draggableClassnames.js +5 -0
  186. package/src/constants/findToolConstants.js +1 -0
  187. package/src/constants/orfFrameToColorMap.js +10 -0
  188. package/src/constants/rowviewContants.js +3 -0
  189. package/src/constants/specialCutsiteFilterOptions.js +22 -0
  190. package/src/constants.js +1 -0
  191. package/src/createVectorEditor/index.js +138 -0
  192. package/src/createVectorEditor/makeStore.js +34 -0
  193. package/src/fileUtils.js +103 -0
  194. package/src/helperComponents/AddOrEditAnnotationDialog/index.js +711 -0
  195. package/src/helperComponents/AddOrEditAnnotationDialog/style.css +11 -0
  196. package/src/helperComponents/AddOrEditFeatureDialog/index.js +58 -0
  197. package/src/helperComponents/AddOrEditPartDialog/index.js +101 -0
  198. package/src/helperComponents/AddOrEditPrimerDialog/EditCaretPosition.js +234 -0
  199. package/src/helperComponents/AddOrEditPrimerDialog/index.js +329 -0
  200. package/src/helperComponents/AddOrEditPrimerDialog/style.css +41 -0
  201. package/src/helperComponents/EnzymesDialog/index.js +904 -0
  202. package/src/helperComponents/EnzymesDialog/style.css +21 -0
  203. package/src/helperComponents/GoToDialog.js +21 -0
  204. package/src/helperComponents/MergeFeaturesDialog/index.js +253 -0
  205. package/src/helperComponents/MergeFeaturesDialog/style.css +3 -0
  206. package/src/helperComponents/MultipleSeqsDetectedOnImportDialog.js +74 -0
  207. package/src/helperComponents/PinchHelper/PinchHelper.js +24 -0
  208. package/src/helperComponents/PrintDialog/index.js +396 -0
  209. package/src/helperComponents/PrintDialog/style.css +4 -0
  210. package/src/helperComponents/PropertiesDialog/ColorPicker.js +30 -0
  211. package/src/helperComponents/PropertiesDialog/CutsiteProperties.js +185 -0
  212. package/src/helperComponents/PropertiesDialog/FeatureProperties.js +6 -0
  213. package/src/helperComponents/PropertiesDialog/GenbankView.js +74 -0
  214. package/src/helperComponents/PropertiesDialog/GeneralProperties.js +140 -0
  215. package/src/helperComponents/PropertiesDialog/GenericAnnotationProperties.js +406 -0
  216. package/src/helperComponents/PropertiesDialog/OrfProperties.js +117 -0
  217. package/src/helperComponents/PropertiesDialog/PartProperties.js +9 -0
  218. package/src/helperComponents/PropertiesDialog/PrimerProperties.js +19 -0
  219. package/src/helperComponents/PropertiesDialog/SingleEnzymeCutsiteInfo.js +131 -0
  220. package/src/helperComponents/PropertiesDialog/TranslationProperties.js +149 -0
  221. package/src/helperComponents/PropertiesDialog/index.js +166 -0
  222. package/src/helperComponents/PropertiesDialog/style.css +68 -0
  223. package/src/helperComponents/PropertiesDialog/typeField.js +24 -0
  224. package/src/helperComponents/PropertiesDialog/utils.js +37 -0
  225. package/src/helperComponents/RemoveDuplicates/index.js +194 -0
  226. package/src/helperComponents/RenameSequenceDialog.js +7 -0
  227. package/src/helperComponents/SelectDialog.js +150 -0
  228. package/src/helperComponents/UncontrolledSliderWithPlusMinusBtns.css +5 -0
  229. package/src/helperComponents/UncontrolledSliderWithPlusMinusBtns.js +134 -0
  230. package/src/helperComponents/VeWarning/index.js +22 -0
  231. package/src/helperComponents/VeWarning/style.css +10 -0
  232. package/src/helperComponents/createSimpleDialog.js +89 -0
  233. package/src/helperComponents/partTagSearch.js +72 -0
  234. package/src/helperComponents/simpleDialog.css +13 -0
  235. package/src/helperComponents/withHover.js +90 -0
  236. package/src/index.js +60 -0
  237. package/src/redux/alignments.js +373 -0
  238. package/src/redux/annotationLabelVisibility.js +53 -0
  239. package/src/redux/annotationVisibility.js +196 -0
  240. package/src/redux/annotationsToSupport.js +104 -0
  241. package/src/redux/caretPosition.js +27 -0
  242. package/src/redux/charWidth.js +22 -0
  243. package/src/redux/copyOptions.js +34 -0
  244. package/src/redux/createYourOwnEnzyme.js +39 -0
  245. package/src/redux/deletionLayers.js +36 -0
  246. package/src/redux/digestTool.js +34 -0
  247. package/src/redux/featureLengthsToHide.js +27 -0
  248. package/src/redux/findTool.js +79 -0
  249. package/src/redux/frameTranslations.js +52 -0
  250. package/src/redux/hoveredAnnotation.js +24 -0
  251. package/src/redux/index.js +196 -0
  252. package/src/redux/labelLineIntensity.js +25 -0
  253. package/src/redux/labelSize.js +23 -0
  254. package/src/redux/lastSavedId.js +20 -0
  255. package/src/redux/middleware.js +112 -0
  256. package/src/redux/minimumOrfSize.js +24 -0
  257. package/src/redux/modalActions.js +3 -0
  258. package/src/redux/panelsShown.js +273 -0
  259. package/src/redux/partLengthsToHide.js +23 -0
  260. package/src/redux/primerLengthsToHide.js +27 -0
  261. package/src/redux/propertiesTool.js +40 -0
  262. package/src/redux/readOnly.js +28 -0
  263. package/src/redux/replacementLayers.js +36 -0
  264. package/src/redux/restrictionEnzymes.js +52 -0
  265. package/src/redux/selectedAnnotations.js +89 -0
  266. package/src/redux/selectedPartTags.js +21 -0
  267. package/src/redux/selectionLayer.js +46 -0
  268. package/src/redux/sequenceData/circular.js +19 -0
  269. package/src/redux/sequenceData/description.js +21 -0
  270. package/src/redux/sequenceData/features.js +19 -0
  271. package/src/redux/sequenceData/index.js +81 -0
  272. package/src/redux/sequenceData/lineageLines.js +11 -0
  273. package/src/redux/sequenceData/materiallyAvailable.js +19 -0
  274. package/src/redux/sequenceData/name.js +19 -0
  275. package/src/redux/sequenceData/parts.js +19 -0
  276. package/src/redux/sequenceData/primers.js +19 -0
  277. package/src/redux/sequenceData/sequence.js +12 -0
  278. package/src/redux/sequenceData/sharedActionCreators.js +0 -0
  279. package/src/redux/sequenceData/translations.js +20 -0
  280. package/src/redux/sequenceData/upsertDeleteActionGenerator.js +31 -0
  281. package/src/redux/sequenceDataHistory.js +43 -0
  282. package/src/redux/showGCContent.js +23 -0
  283. package/src/redux/toolBar.js +25 -0
  284. package/src/redux/uppercaseSequenceMapFont.js +25 -0
  285. package/src/redux/useAdditionalOrfStartCodons.js +24 -0
  286. package/src/redux/utils/addDashesForMatchStartAndEndForTracks/index.js +71 -0
  287. package/src/redux/utils/addMetaToActionCreators.js +12 -0
  288. package/src/redux/utils/createMergedDefaultStateReducer.js +30 -0
  289. package/src/redux/utils/createMetaAction.js +12 -0
  290. package/src/redux/versionHistory.js +27 -0
  291. package/src/selectors/annotationLabelVisibility.js +2 -0
  292. package/src/selectors/annotationSearchSelector.js +24 -0
  293. package/src/selectors/cdsFeaturesSelector.js +9 -0
  294. package/src/selectors/circularSelector.js +4 -0
  295. package/src/selectors/cutsiteLabelColorSelector.js +6 -0
  296. package/src/selectors/cutsitesByRangeSelector.js +5 -0
  297. package/src/selectors/cutsitesSelector.js +61 -0
  298. package/src/selectors/editorSelector.js +2 -0
  299. package/src/selectors/featuresSelector.js +8 -0
  300. package/src/selectors/filteredCutsitesSelector.js +137 -0
  301. package/src/selectors/filteredFeaturesSelector.js +32 -0
  302. package/src/selectors/filteredPartsSelector.js +57 -0
  303. package/src/selectors/filteredPrimersSelector.js +27 -0
  304. package/src/selectors/filteredRestrictionEnzymesSelector.js +1 -0
  305. package/src/selectors/getAdditionalEnzymesSelector.js +46 -0
  306. package/src/selectors/index.js +41 -0
  307. package/src/selectors/isEnzymeFilterAndSelector.js +1 -0
  308. package/src/selectors/minimumOrfSizeSelector.js +2 -0
  309. package/src/selectors/orfsSelector.js +15 -0
  310. package/src/selectors/partsSelector.js +8 -0
  311. package/src/selectors/primersSelector.js +8 -0
  312. package/src/selectors/restrictionEnzymesSelector.js +34 -0
  313. package/src/selectors/searchLayersSelector.js +71 -0
  314. package/src/selectors/selectedAnnotationsSelector.js +1 -0
  315. package/src/selectors/selectedCutsitesSelector.js +21 -0
  316. package/src/selectors/sequenceDataSelector.js +2 -0
  317. package/src/selectors/sequenceLengthSelector.js +5 -0
  318. package/src/selectors/sequenceSelector.js +4 -0
  319. package/src/selectors/tagsToBoldSelector.js +2 -0
  320. package/src/selectors/translationSearchMatchesSelector.js +14 -0
  321. package/src/selectors/translationsRawSelector.js +8 -0
  322. package/src/selectors/translationsSelector.js +137 -0
  323. package/src/style.css +82 -0
  324. package/src/updateEditor.js +198 -0
  325. package/src/utils/PassThrough.js +3 -0
  326. package/src/utils/addWrappedAddons.js +20 -0
  327. package/src/utils/annotationTypes.js +37 -0
  328. package/src/utils/arrayUtils.js +19 -0
  329. package/src/utils/calculateTickMarkPositionsForGivenRange.js +47 -0
  330. package/src/utils/cleanSequenceData_DEPRECATED/arrayToObjWithIds.js +17 -0
  331. package/src/utils/combineReducersDontIgnoreKeys.js +12 -0
  332. package/src/utils/commandUtils.js +18 -0
  333. package/src/utils/editorUtils.js +223 -0
  334. package/src/utils/getAnnotationClassnames.js +12 -0
  335. package/src/utils/getAnnotationNameAndStartStopString.js +61 -0
  336. package/src/utils/getVisibleStartEnd.js +7 -0
  337. package/src/utils/massageTickSpacing.js +19 -0
  338. package/src/utils/onlyUpdateForKeysDeep.js +31 -0
  339. package/src/utils/prepareRowData.js +64 -0
  340. package/src/utils/proteinUtils.js +3 -0
  341. package/src/utils/pureNoFunc.js +18 -0
  342. package/src/utils/selectionLayer.js +25 -0
  343. package/src/utils/shouldRerender.js +27 -0
  344. package/src/utils/showFileDialog.js +26 -0
  345. package/src/utils/updateLabelsForInViewFeatures.js +55 -0
  346. package/src/utils/updateLabelsForInViewFeaturesCircView.js +41 -0
  347. package/src/utils/useAAColorType.js +8 -0
  348. package/src/utils/useAnnotationLimits.js +42 -0
  349. package/src/utils/useChromatogramPrefs.js +31 -0
  350. package/src/utils/useLadders.js +6 -0
  351. package/src/utils/useMeltingTemp.js +7 -0
  352. package/src/utils/useTmType.js +10 -0
  353. package/src/withEditorInteractions/Keyboard.js +86 -0
  354. package/src/withEditorInteractions/clickAndDragUtils.js +576 -0
  355. package/src/withEditorInteractions/createSequenceInputPopup.js +296 -0
  356. package/src/withEditorInteractions/createSequenceInputPopupStyle.css +85 -0
  357. package/src/withEditorInteractions/getBpsPerRow.js +19 -0
  358. package/src/withEditorInteractions/index.js +1252 -0
  359. package/src/withEditorInteractions/isElementInViewport.js +29 -0
  360. package/src/withEditorInteractions/moveCaret.js +58 -0
  361. package/src/withEditorProps/index.js +1010 -0
  362. package/index.mjs +0 -193228
@@ -0,0 +1,218 @@
1
+ import React from "react";
2
+ import { map } from "lodash";
3
+ import { fudge2, realCharWidth } from "../constants";
4
+ import getYOffset from "../../CircularView/getYOffset";
5
+ import { getRangeLength } from "@teselagen/range-utils";
6
+ import { getStructuredBases } from "./getStructuredBases";
7
+
8
+ export function getBasesToShow({
9
+ hidePrimerBases,
10
+ annotation,
11
+ annotationRange,
12
+ charWidth,
13
+ bpsPerRow,
14
+ fullSequence,
15
+ iTree,
16
+ sequenceLength
17
+ }) {
18
+ if (hidePrimerBases) return {};
19
+ const basesToShow = {};
20
+ if (annotation && annotation.bases) {
21
+ const fudge = charWidth - realCharWidth;
22
+ const { forward, primerBindsOn } = annotation;
23
+
24
+ const { basesNoInsertsWithMetaData, inserts, aRange } = getStructuredBases({
25
+ ...annotation,
26
+ fullSequence,
27
+ annotationRange,
28
+ sequenceLength
29
+ });
30
+
31
+ const annLen = getRangeLength(annotation, sequenceLength);
32
+ const aRangeLen = getRangeLength(annotationRange, sequenceLength);
33
+ const startOffset = annotationRange.start % bpsPerRow;
34
+ const endOffset = bpsPerRow - (annotationRange.end % bpsPerRow);
35
+ basesToShow.insertPaths = "";
36
+ basesToShow.insertTicks = "";
37
+ basesToShow.flipAnnotation = !forward;
38
+ basesToShow.extraHeight = 0;
39
+ const insertText = [];
40
+ const level1Height = -10;
41
+ const level2Height = 11;
42
+ inserts.forEach((i, n) => {
43
+ //loop thru all inserts
44
+ const indexToUse = forward ? i.index : annLen - i.index - 1;
45
+ if (
46
+ aRange.start - (primerBindsOn === "5prime" ? 1 : 0) <= indexToUse &&
47
+ aRange.end + (primerBindsOn === "5prime" ? 1 : 0) >= indexToUse
48
+ ) {
49
+ //only draw if insert falls within the annotation range
50
+ let xStart = i.index - aRange.start - Math.ceil(0.5 * i.bases.length); //calculate initial xStart
51
+ let xEnd = i.index - aRange.start + Math.floor(0.5 * i.bases.length);
52
+ if (aRange.end + 3 < xEnd) {
53
+ xStart -= xEnd - aRange.end - 3;
54
+ xEnd -= xEnd - aRange.end - 3;
55
+ }
56
+ if (i.index === 0) {
57
+ //for the first chunk, try to make it hang off the end if possible
58
+ xStart -= xEnd - 1;
59
+ xEnd -= xEnd - 1;
60
+ }
61
+ const forwAnd3Prime = forward;
62
+
63
+ if (xStart < -(forwAnd3Prime ? startOffset : endOffset)) {
64
+ //if the xStart is going to fall off the row to the left, correct it by moving the xStart to the right
65
+ const offsetLeft =
66
+ -(forwAnd3Prime ? startOffset : endOffset) - xStart;
67
+ xStart += offsetLeft;
68
+ xEnd += offsetLeft;
69
+ } else if (
70
+ xEnd + (forwAnd3Prime ? startOffset : endOffset) >
71
+ bpsPerRow
72
+ ) {
73
+ //if the xStart is going to fall off the row to the right, correct it by moving the xStart to the left
74
+ const offsetLeft =
75
+ bpsPerRow - xEnd - (forwAnd3Prime ? startOffset : endOffset);
76
+ xStart += offsetLeft;
77
+ xEnd += offsetLeft;
78
+ }
79
+ // use an interval tree to determine the level the primer insert should be on to not overlap with other inserts
80
+ const yOffset = getYOffset(iTree, xStart, xEnd);
81
+ iTree.insert(xStart, xEnd, {
82
+ //tnr: pass an initial level in the case that the underlying primer ranges themselves are overlapping
83
+ ...annotationRange,
84
+ yOffset
85
+ });
86
+
87
+ basesToShow.extraHeight = Math.max(
88
+ basesToShow.extraHeight,
89
+ 15 + yOffset * 20
90
+ );
91
+ const insertStart =
92
+ (indexToUse - (forward ? aRange.start : aRange.end)) *
93
+ (!forward && primerBindsOn === "5prime" ? -1 : 1);
94
+ basesToShow.insertPaths += getInsertPath({
95
+ xStart,
96
+ xEnd,
97
+ charWidth,
98
+ level: yOffset,
99
+ insertStart
100
+ });
101
+
102
+ if (indexToUse !== aRange.end + 1 && indexToUse !== -1) {
103
+ basesToShow.insertTicks += getInsertTick({
104
+ charWidth,
105
+ height: level2Height,
106
+ insertStart
107
+ });
108
+ }
109
+ const textLength = charWidth * i.bases.length - fudge - fudge2;
110
+ insertText.push(
111
+ <text
112
+ style={{ pointerEvents: "none" }}
113
+ data-insert-bases={i.bases}
114
+ className="ve-monospace-font tg-primer-bases-insert"
115
+ textLength={textLength}
116
+ transform={
117
+ forward
118
+ ? ""
119
+ : `translate(${aRangeLen * charWidth},-5) scale(-1,-1) `
120
+ }
121
+ key={n}
122
+ x={
123
+ forward
124
+ ? (xStart - 1) * charWidth + fudge
125
+ : xStart * charWidth - fudge / 2
126
+ }
127
+ y={level1Height - yOffset * 20 - (forward ? 0 : 5)}
128
+ >
129
+ {i.bases.split("").map((b, i) => (
130
+ <tspan
131
+ key={i}
132
+ rotate={forward ? 0 : 180}
133
+ className="tg-no-match-seq"
134
+ textLength={textLength}
135
+ >
136
+ {b}
137
+ </tspan>
138
+ ))}
139
+ </text>
140
+ );
141
+ }
142
+ });
143
+
144
+ const textLength =
145
+ charWidth * basesNoInsertsWithMetaData.length - fudge - fudge2;
146
+ basesToShow.baseEl = (
147
+ <React.Fragment>
148
+ <text
149
+ {...{
150
+ textLength,
151
+ y: forward ? level2Height : -(basesToShow.extraHeight - 5),
152
+ x: forward ? fudge / 2 : fudge / 2 + 0.2 /* + diffLen * charWidth */
153
+ }}
154
+ style={{ pointerEvents: "none" }}
155
+ className="ve-monospace-font tg-primer-bases"
156
+ >
157
+ {map(
158
+ basesNoInsertsWithMetaData,
159
+ ({ b, isMatch, isAmbiguousMatch }, i) => {
160
+ return (
161
+ <tspan
162
+ key={i}
163
+ className={
164
+ b === "&"
165
+ ? "tg-no-show-seq"
166
+ : isMatch
167
+ ? ""
168
+ : isAmbiguousMatch
169
+ ? "tg-ambiguous-match-seq"
170
+ : "tg-no-match-seq"
171
+ }
172
+ textLength={textLength}
173
+ >
174
+ {b}
175
+ </tspan>
176
+ );
177
+ }
178
+ )}
179
+ </text>
180
+ {insertText}
181
+ </React.Fragment>
182
+ );
183
+ }
184
+ return basesToShow;
185
+ }
186
+
187
+ function getInsertTick({ insertStart, charWidth, height }) {
188
+ if (insertStart === 0) return "";
189
+ const insertLocation = insertStart * charWidth;
190
+
191
+ const jutUp = `
192
+ L ${insertLocation - 1},${height + 5}
193
+ L ${insertLocation - 1},${height - 4}
194
+ L ${insertLocation - 1},${height + 5}
195
+ `;
196
+ return jutUp;
197
+ }
198
+
199
+ function getInsertPath({ charWidth, xStart, xEnd, insertStart, level = 0 }) {
200
+ const insertLocation = insertStart * charWidth;
201
+ const insertHeight = 15;
202
+ const levelHeight = -5 - level * 20;
203
+ const leftX = (xStart - 1) * charWidth;
204
+ const rightX = (xEnd - 1) * charWidth;
205
+
206
+ const jutUp = `
207
+ L ${insertLocation - 6},${0}
208
+ L ${insertLocation - 6},${levelHeight}
209
+ L ${leftX},${levelHeight}
210
+ L ${leftX},${-insertHeight + levelHeight}
211
+
212
+ L ${rightX},${-insertHeight + levelHeight}
213
+ L ${rightX},${levelHeight}
214
+ L ${insertLocation + 4},${levelHeight}
215
+ L ${insertLocation + 4},${0}
216
+ `;
217
+ return jutUp;
218
+ }
@@ -0,0 +1,14 @@
1
+ .veAnnotationHovered .veRowViewFeature path {
2
+ stroke-width: 2 !important;
3
+ }
4
+
5
+ .veAnnotationHovered:not(text) path {
6
+ stroke-width: 2 !important;
7
+ }
8
+
9
+ .veRowViewAnnotationPosition {
10
+ z-index: 20;
11
+ }
12
+ .veLabelText {
13
+ user-select: none;
14
+ }
@@ -0,0 +1,190 @@
1
+ // import PropTypes from "prop-types";
2
+ import React from "react";
3
+ import pureNoFunc from "../../utils/pureNoFunc";
4
+
5
+ function AASliver(props) {
6
+ const {
7
+ forward,
8
+ aminoAcidIndex,
9
+ showAAColors = true,
10
+ onClick,
11
+ onContextMenu,
12
+ width,
13
+ height,
14
+ isFiller,
15
+ isTruncatedStart,
16
+ isTruncatedEnd,
17
+ relativeAAPositionInTranslation,
18
+ title,
19
+ color,
20
+ showAminoAcidNumbers,
21
+ letter
22
+ } = props;
23
+
24
+ if (letter === "-") {
25
+ return null;
26
+ }
27
+
28
+ const dirX1 = 1 / Math.sqrt(26);
29
+ const dirY1 = 5 * dirX1;
30
+
31
+ const dirX2 = 16 / Math.sqrt(2756);
32
+ const dirY2 = 50 / Math.sqrt(2756);
33
+
34
+ const roundedCorner = 15;
35
+ let path = "";
36
+ path = isFiller
37
+ ? "25,0 49,0 60,50 49,100 25,100 38,50 25,0"
38
+ : isTruncatedStart
39
+ ? // ? "0,0 50,0 60,50 50,100 00,100 16,50 0,0"
40
+ `M ${roundedCorner / 3}, 0
41
+ L ${50 - roundedCorner / 3}, 0
42
+ Q 50 0 ${50 + roundedCorner * dirX1} ${roundedCorner * dirY1}
43
+ L ${60 - roundedCorner * dirX1}, ${50 - roundedCorner * dirY1}
44
+ Q 60 50 ${60 - roundedCorner * dirX1} ${
45
+ 50 + roundedCorner * dirY1
46
+ }
47
+ L ${50 + roundedCorner * dirX1}, ${
48
+ 100 - roundedCorner * dirY1
49
+ }
50
+ Q 50 100 ${50 - roundedCorner} 100
51
+ L ${roundedCorner / 3}, 100
52
+ Q 0 100 ${roundedCorner * dirX2} ${
53
+ 100 - roundedCorner * dirY2
54
+ }
55
+ L ${16 - roundedCorner * dirX2}, ${50 + roundedCorner * dirY2}
56
+ Q 16 50 ${16 - roundedCorner * dirX2} ${
57
+ 50 - roundedCorner * dirY2
58
+ }
59
+ L ${roundedCorner * dirX2}, ${roundedCorner * dirY2}
60
+ Q 0 0 ${roundedCorner / 3} 0
61
+ z`
62
+ : isTruncatedEnd
63
+ ? // ? "24,0 74,0 84,50 74,100 24,100 40,50 24,0"
64
+ `M ${24 + roundedCorner / 3}, 0
65
+ L ${74 - roundedCorner / 3}, 0
66
+ Q 74 0 ${74 + roundedCorner * dirX1} ${roundedCorner * dirY1}
67
+ L ${84 - roundedCorner * dirX1}, ${50 - roundedCorner * dirY1}
68
+ Q 84 50 ${84 - roundedCorner * dirX1} ${
69
+ 50 + roundedCorner * dirY1
70
+ }
71
+ L ${74 + roundedCorner * dirX1}, ${
72
+ 100 - roundedCorner * dirY1
73
+ }
74
+ Q 74 100 ${74 - roundedCorner} 100
75
+ L ${24 + roundedCorner / 3}, 100
76
+ Q 24 100 ${24 + roundedCorner * dirX2} ${
77
+ 100 - roundedCorner * dirY2
78
+ }
79
+ L ${40 - roundedCorner * dirX2}, ${50 + roundedCorner * dirY2}
80
+ Q 40 50 ${40 - roundedCorner * dirX2}, ${
81
+ 50 - roundedCorner * dirY2
82
+ }
83
+ L ${24 + roundedCorner * dirX2}, ${roundedCorner * dirY2}
84
+ Q 24 0 ${24 + roundedCorner / 3} 0
85
+ z`
86
+ : `M ${roundedCorner / 3}, 0
87
+ L ${74 - roundedCorner / 3}, 0
88
+ Q 74 0 ${74 + roundedCorner * dirX1} ${roundedCorner * dirY1}
89
+ L ${84 - roundedCorner * dirX1}, ${50 - roundedCorner * dirY1}
90
+ Q 84 50 ${84 - roundedCorner * dirX1} ${
91
+ 50 + roundedCorner * dirY1
92
+ }
93
+ L ${74 + roundedCorner * dirX1}, ${
94
+ 100 - roundedCorner * dirY1
95
+ }
96
+ Q 74 100 ${74 - roundedCorner / 3} 100
97
+ L ${roundedCorner / 3}, 100
98
+ Q 0 100 ${roundedCorner * dirX2} ${
99
+ 100 - roundedCorner * dirY2
100
+ }
101
+ L ${16 - roundedCorner * dirX2}, ${50 + roundedCorner * dirY2}
102
+ Q 16 50 ${16 - roundedCorner * dirX2}, ${
103
+ 50 - roundedCorner * dirY2
104
+ }
105
+ L ${roundedCorner * dirX2}, ${roundedCorner * dirY2}
106
+ Q 0 0 ${roundedCorner / 3} 0
107
+ z`;
108
+ return (
109
+ <g
110
+ onClick={onClick}
111
+ onContextMenu={onContextMenu}
112
+ transform={
113
+ "scale(" +
114
+ (width / 100) * 1.25 +
115
+ ", " +
116
+ height / 100 +
117
+ ") translate(" +
118
+ ((forward ? -20 : -50) +
119
+ ((relativeAAPositionInTranslation - 1) * 100) / 1.25) +
120
+ ",0)"
121
+ }
122
+ >
123
+ <title>{title}</title>
124
+ {showAAColors &&
125
+ (isFiller ? (
126
+ <polyline
127
+ className={letter}
128
+ transform={
129
+ forward ? "scale(3,1)" : "translate(300,0) scale(-3,1) "
130
+ }
131
+ points={
132
+ isFiller
133
+ ? "25,0 49,0 60,50 49,100 25,100 38,50 25,0"
134
+ : isTruncatedStart
135
+ ? "0,0 50,0 60,50 50,100 00,100 16,50 0,0"
136
+ : isTruncatedEnd
137
+ ? "24,0 74,0 84,50 74,100 24,100 40,50 24,0"
138
+ : "0,0 74,0 85,50 74,100 0,100 16,50 0,0"
139
+ }
140
+ strokeWidth="5"
141
+ fill={color || "gray"}
142
+ />
143
+ ) : (
144
+ <path
145
+ className={letter}
146
+ transform={
147
+ forward ? "scale(3,1)" : "translate(300,0) scale(-3,1) "
148
+ }
149
+ d={path}
150
+ strokeWidth="5"
151
+ fill={color || "gray"}
152
+ />
153
+ ))}
154
+
155
+ {!isFiller && (
156
+ <text
157
+ fontSize={25}
158
+ stroke="black"
159
+ strokeWidth={2}
160
+ transform={`scale(${(3 / width) * 10},3) translate(${
161
+ ((forward ? 45 : 55) * width) / 10
162
+ },21)`}
163
+ x="0"
164
+ y="4"
165
+ style={{ textAnchor: "middle" }}
166
+ >
167
+ {letter}
168
+ </text>
169
+ )}
170
+
171
+ {showAminoAcidNumbers && (aminoAcidIndex + 1) % 5 === 0 && (
172
+ <text
173
+ fontSize={25}
174
+ stroke="black"
175
+ strokeWidth={2}
176
+ transform={`scale(${(3 / width) * 10},3) translate(${
177
+ ((forward ? 45 : 55) * width) / 10
178
+ },51)`}
179
+ x="0"
180
+ y="4"
181
+ style={{ textAnchor: "middle" }}
182
+ >
183
+ {aminoAcidIndex + 1}
184
+ </text>
185
+ )}
186
+ </g>
187
+ );
188
+ }
189
+
190
+ export default pureNoFunc(AASliver);
@@ -0,0 +1,162 @@
1
+ import React from "react";
2
+ import {
3
+ getSequenceWithinRange,
4
+ zeroSubrangeByContainerRange
5
+ } from "@teselagen/range-utils";
6
+ import AASliver from "./AASliver";
7
+ import pureNoFunc from "../../utils/pureNoFunc";
8
+ import { proteinAlphabet } from "@teselagen/sequence-utils";
9
+
10
+ class Translation extends React.Component {
11
+ state = {
12
+ hasMounted: false
13
+ };
14
+ componentDidMount() {
15
+ this.timeout = setTimeout(() => {
16
+ this.setState({
17
+ hasMounted: true
18
+ });
19
+ }, 5);
20
+ }
21
+ componentWillUnmount() {
22
+ !window.Cypress && clearTimeout(this.timeout);
23
+ }
24
+ render() {
25
+ const {
26
+ annotationRange,
27
+ height,
28
+ showAminoAcidNumbers,
29
+ charWidth,
30
+ aminoAcidNumbersHeight,
31
+ onClick,
32
+ onRightClick,
33
+ onDoubleClick,
34
+ sequenceLength,
35
+ getGaps,
36
+ colorType,
37
+ isProtein
38
+ } = this.props;
39
+ const { hasMounted } = this.state;
40
+ const { annotation } = annotationRange;
41
+ if (!hasMounted && !isProtein) {
42
+ return <g height={height} className="translationLayer" />;
43
+ }
44
+ //we have an amino acid representation of our entire annotation, but it is an array
45
+ //starting at 0, even if the annotation starts at some arbitrary point in the sequence
46
+ const { aminoAcids = [] } = annotation;
47
+ //so we "zero" our subRange by the annotation start
48
+ const subrangeStartRelativeToAnnotationStart = zeroSubrangeByContainerRange(
49
+ annotationRange,
50
+ annotation,
51
+ sequenceLength
52
+ );
53
+ //which allows us to then get the amino acids for the subRange
54
+ const aminoAcidsForSubrange = getSequenceWithinRange(
55
+ subrangeStartRelativeToAnnotationStart,
56
+ aminoAcids
57
+ );
58
+
59
+ //we then loop over all the amino acids in the sub range and draw them onto the row
60
+ const translationSVG = aminoAcidsForSubrange.map(function (
61
+ aminoAcidSliver,
62
+ index
63
+ ) {
64
+ const isEndFiller =
65
+ index === 0 &&
66
+ aminoAcidSliver.positionInCodon === (annotation.forward ? 2 : 0);
67
+ // const isStartFiller = false
68
+ let isTruncatedEnd = index === 0 && aminoAcidSliver.positionInCodon === 1;
69
+ let isTruncatedStart =
70
+ index === aminoAcidsForSubrange.length - 1 &&
71
+ aminoAcidSliver.positionInCodon === 1;
72
+ if (!annotation.forward) {
73
+ const holder = isTruncatedEnd;
74
+ isTruncatedEnd = isTruncatedStart;
75
+ isTruncatedStart = holder;
76
+ }
77
+ const isStartFiller =
78
+ index === aminoAcidsForSubrange.length - 1 &&
79
+ aminoAcidSliver.positionInCodon === (annotation.forward ? 0 : 2);
80
+
81
+ if (
82
+ aminoAcidSliver.positionInCodon !== 1 &&
83
+ !isStartFiller &&
84
+ !isEndFiller
85
+ ) {
86
+ return null;
87
+ }
88
+ const { gapsInside, gapsBefore } = getGaps(aminoAcidSliver.codonRange);
89
+ const gapsInsideFeatureStartToBp = getGaps({
90
+ start: annotationRange.start,
91
+ end: aminoAcidSliver.sequenceIndex
92
+ }).gapsInside;
93
+ // var relativeAAPositionInTranslation = annotationRange.start % bpsPerRow + index;
94
+ const relativeAAPositionInTranslation = index;
95
+ const aminoAcid = aminoAcidSliver.aminoAcid || {};
96
+ //get the codonIndices relative to
97
+ const alphVal = proteinAlphabet[aminoAcid.value];
98
+ let color;
99
+ if (alphVal) {
100
+ color =
101
+ colorType === "byHydrophobicity"
102
+ ? alphVal.color
103
+ : alphVal.colorByFamily;
104
+ } else {
105
+ color = aminoAcid.color;
106
+ }
107
+ return (
108
+ <AASliver
109
+ isFiller={isEndFiller || isStartFiller}
110
+ isTruncatedEnd={isTruncatedEnd}
111
+ isTruncatedStart={isTruncatedStart}
112
+ onClick={function (event) {
113
+ onClick({
114
+ annotation: aminoAcidSliver.codonRange,
115
+ codonRange: aminoAcidSliver.codonRange,
116
+ event,
117
+ gapsInside,
118
+ gapsBefore
119
+ });
120
+ }}
121
+ onContextMenu={function (event) {
122
+ onRightClick &&
123
+ onRightClick({
124
+ annotation,
125
+ codonRange: aminoAcidSliver.codonRange,
126
+ event,
127
+ gapsInside,
128
+ gapsBefore
129
+ });
130
+ }}
131
+ title={`${aminoAcid.name} -- Index: ${
132
+ aminoAcidSliver.aminoAcidIndex + 1
133
+ } -- Hydrophobicity: ${aminoAcid.hydrophobicity} -- Mass: ${
134
+ aminoAcid.mass
135
+ }`}
136
+ showAminoAcidNumbers={showAminoAcidNumbers}
137
+ aminoAcidIndex={aminoAcidSliver.aminoAcidIndex}
138
+ onDoubleClick={function (event) {
139
+ onDoubleClick({ annotation, event });
140
+ }}
141
+ getGaps={getGaps}
142
+ key={annotation.id + aminoAcidSliver.sequenceIndex}
143
+ forward={annotation.forward}
144
+ width={charWidth}
145
+ height={
146
+ showAminoAcidNumbers ? height - aminoAcidNumbersHeight : height
147
+ }
148
+ relativeAAPositionInTranslation={
149
+ relativeAAPositionInTranslation + gapsInsideFeatureStartToBp
150
+ }
151
+ letter={aminoAcid.value}
152
+ color={color}
153
+ positionInCodon={aminoAcidSliver.positionInCodon}
154
+ />
155
+ );
156
+ });
157
+
158
+ return <g className="translationLayer">{translationSVG}</g>;
159
+ }
160
+ }
161
+
162
+ export default pureNoFunc(Translation);
@@ -0,0 +1,54 @@
1
+ import React from "react";
2
+ import useAAColorType from "../../utils/useAAColorType";
3
+ import StackedAnnotations from "../StackedAnnotations";
4
+ import Translation from "./Translation";
5
+
6
+ function getExtraInnerCompProps(
7
+ annotationRange,
8
+ {
9
+ showAminoAcidNumbers,
10
+ getGaps,
11
+ isProtein,
12
+ colorType,
13
+ annotationHeight,
14
+ spaceBetweenAnnotations,
15
+ sequenceLength,
16
+ aminoAcidNumbersHeight
17
+ }
18
+ ) {
19
+ const anotationHeightNoSpace = annotationHeight - spaceBetweenAnnotations;
20
+
21
+ return {
22
+ showAminoAcidNumbers,
23
+ getGaps,
24
+ height: anotationHeightNoSpace,
25
+ aminoAcidNumbersHeight,
26
+ annotationRange,
27
+ isProtein,
28
+ colorType,
29
+ sequenceLength
30
+ };
31
+ }
32
+
33
+ function Translations(props) {
34
+ const [colorType] = useAAColorType();
35
+ return (
36
+ <StackedAnnotations
37
+ {...{
38
+ ...props,
39
+ annotationRanges: props.annotationRanges.filter(
40
+ (t) => !t.isJoinedLocation
41
+ ),
42
+ annotationHeight:
43
+ props.annotationHeight +
44
+ (props.showAminoAcidNumbers ? props.aminoAcidNumbersHeight : 0),
45
+ disregardLocations: true,
46
+ getExtraInnerCompProps,
47
+ InnerComp: Translation,
48
+ colorType
49
+ }}
50
+ />
51
+ );
52
+ }
53
+
54
+ export default Translations;
@@ -0,0 +1,3 @@
1
+ .veRowViewTranslations {
2
+ z-index: 20;
3
+ }
@@ -0,0 +1,3 @@
1
+ export const ANNOTATION_LABEL_FONT_WIDTH = 10;
2
+ export const realCharWidth = 8;
3
+ export const fudge2 = 3; //used to help the end of the sequence in the row view position correctly
@@ -0,0 +1,56 @@
1
+ //tnr: not actually used yet. I don't think it is necessary
2
+ // for the cutsite label heights to be perfect
3
+
4
+ import getXStartAndWidthOfRowAnnotation from "./getXStartAndWidthOfRowAnnotation";
5
+ import IntervalTree from "node-interval-tree";
6
+ import getYOffset from "../CircularView/getYOffset";
7
+ import forEach from "lodash/forEach";
8
+
9
+ export default function getCutsiteLabelHeights({
10
+ bpsPerRow,
11
+ charWidth,
12
+ annotationRanges,
13
+ annotationHeight,
14
+ spaceBetweenAnnotations,
15
+ textWidth
16
+ }) {
17
+ const rowLength = bpsPerRow * charWidth;
18
+ let counter = 0;
19
+ let maxAnnotationYOffset = 0;
20
+ const rowCenter = rowLength / 2;
21
+ const iTree = new IntervalTree(rowCenter);
22
+ forEach(annotationRanges, function(annotationRange) {
23
+ counter++;
24
+ if (counter > 50) return;
25
+ let annotation = annotationRange.annotation;
26
+ if (!annotation) {
27
+ annotation = annotationRange;
28
+ }
29
+ const labelLength = annotation.restrictionEnzyme.name.length * textWidth;
30
+ let { xStart } = getXStartAndWidthOfRowAnnotation(
31
+ annotationRange,
32
+ bpsPerRow,
33
+ charWidth
34
+ );
35
+ let xEnd = xStart + labelLength;
36
+
37
+ if (xEnd > rowLength) {
38
+ xStart = xStart - (xEnd - rowLength);
39
+ xEnd = rowLength;
40
+ }
41
+ const yOffset = getYOffset(iTree, xStart, xEnd);
42
+ iTree.insert(xStart, xEnd, {
43
+ ...annotationRange,
44
+ yOffset
45
+ });
46
+
47
+ if (yOffset > maxAnnotationYOffset) {
48
+ maxAnnotationYOffset = yOffset;
49
+ }
50
+ const height = yOffset * (annotationHeight + spaceBetweenAnnotations);
51
+ annotation.height = height;
52
+ });
53
+ const containerHeight =
54
+ (maxAnnotationYOffset + 1) * (annotationHeight + spaceBetweenAnnotations);
55
+ return containerHeight;
56
+ }