@teselagen/ove 0.7.28 → 0.7.30-beta.1

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 (301) hide show
  1. package/CreateAnnotationsPage.d.ts +4 -3
  2. package/README.md +1 -1
  3. package/fileUtils.d.ts +12 -0
  4. package/html2canvas.esm--JN4fLQL.js +7891 -0
  5. package/html2canvas.esm-B7d7VJmQ.cjs +7891 -0
  6. package/index.cjs.js +1305 -1121
  7. package/index.es.js +1305 -1121
  8. package/index.umd.js +189161 -0
  9. package/ove.css +17 -4
  10. package/package.json +5 -9
  11. package/redux/findTool.d.ts +1 -0
  12. package/selectors/searchLayersSelector.d.ts +1 -1
  13. package/src/AutoAnnotate.js +1 -1
  14. package/src/CreateAnnotationsPage.js +1 -2
  15. package/src/Editor/style.css +8 -3
  16. package/src/FindBar/index.js +32 -1
  17. package/src/RowItem/SelectionLayer/index.js +42 -4
  18. package/src/RowItem/SelectionLayer/style.css +8 -0
  19. package/src/fileUtils.js +103 -0
  20. package/src/helperComponents/PropertiesDialog/TranslationProperties.js +1 -1
  21. package/src/redux/findTool.js +9 -0
  22. package/src/selectors/searchLayersSelector.js +40 -2
  23. package/style.css +12098 -1
  24. package/AASliver.js +0 -187
  25. package/AddLaddersDialog.js +0 -82
  26. package/AdditionalCutsiteInfoDialog.js +0 -599
  27. package/AlignmentVisibilityTool.js +0 -105
  28. package/AnnotationContainerHolder.js +0 -20
  29. package/AnnotationPositioner.js +0 -27
  30. package/AutoAnnotate.js +0 -501
  31. package/AutoAnnotateBpMatchingDialog.js +0 -208
  32. package/Axis.js +0 -151
  33. package/AxisNumbers.js +0 -35
  34. package/Browser.js +0 -106
  35. package/Caret.js +0 -63
  36. package/Chromatogram.js +0 -293
  37. package/CircularDnaSequence.js +0 -73
  38. package/CircularZoomMinimap.js +0 -16
  39. package/ColorPicker.js +0 -30
  40. package/CommandHotkeyHandler.js +0 -44
  41. package/CreateAnnotationsPage.js +0 -98
  42. package/Cutsite.js +0 -18
  43. package/CutsiteProperties.js +0 -176
  44. package/CutsiteSelectionLayers.js +0 -47
  45. package/Cutsites.js +0 -271
  46. package/DeletionLayer.js +0 -28
  47. package/DropHandler.css +0 -21
  48. package/DropHandler.js +0 -64
  49. package/EditCaretPosition.js +0 -234
  50. package/EditTrackNameDialog.js +0 -30
  51. package/Feature.js +0 -83
  52. package/FeatureProperties.js +0 -6
  53. package/FillWindow.js +0 -47
  54. package/GenbankView.js +0 -74
  55. package/GeneralProperties.js +0 -117
  56. package/GenericAnnotationProperties.js +0 -406
  57. package/GlobalDialog.js +0 -73
  58. package/GlobalDialogUtils.js +0 -110
  59. package/GoToDialog.js +0 -25
  60. package/HorizontalPanelDragHandle.js +0 -35
  61. package/Keyboard.js +0 -85
  62. package/Labels.js +0 -327
  63. package/Ladder.css +0 -20
  64. package/Ladder.js +0 -303
  65. package/MeltingTemp.js +0 -85
  66. package/Menlo.ttf +0 -0
  67. package/Minimap.js +0 -515
  68. package/Mismatches.js +0 -134
  69. package/Monaco.ttf +0 -0
  70. package/MultipleSeqsDetectedOnImportDialog.js +0 -74
  71. package/Orf.js +0 -109
  72. package/OrfProperties.js +0 -117
  73. package/Orfs.js +0 -35
  74. package/PCRTool.js +0 -179
  75. package/PairwiseAlignmentView.js +0 -68
  76. package/Part.js +0 -34
  77. package/PartProperties.js +0 -9
  78. package/PassThrough.js +0 -3
  79. package/PerformantSelectionLayer.js +0 -32
  80. package/PinchHelper.js +0 -24
  81. package/PointedAnnotation.js +0 -347
  82. package/PositionAnnotationOnCircle.js +0 -26
  83. package/Primer.js +0 -41
  84. package/PrimerProperties.js +0 -19
  85. package/ReflexContainer.js +0 -802
  86. package/ReflexElement.js +0 -160
  87. package/ReflexEvents.js +0 -77
  88. package/ReflexSplitter.js +0 -205
  89. package/RenameSequenceDialog.js +0 -7
  90. package/RotateCircularViewSlider.js +0 -93
  91. package/SelectDialog.js +0 -150
  92. package/SequenceName.js +0 -15
  93. package/SimpleCircularOrLinearView.js +0 -381
  94. package/SimpleOligoPreview.js +0 -39
  95. package/SingleEnzymeCutsiteInfo.js +0 -139
  96. package/ToolbarItem.js +0 -192
  97. package/Translation.js +0 -198
  98. package/TranslationProperties.js +0 -149
  99. package/UncontrolledSliderWithPlusMinusBtns.css +0 -5
  100. package/UncontrolledSliderWithPlusMinusBtns.js +0 -134
  101. package/VeTopRightContainer.js +0 -12
  102. package/ZoomCircularViewSlider.js +0 -62
  103. package/ZoomLinearView.js +0 -47
  104. package/addAlignment.js +0 -6
  105. package/addMetaToActionCreators.js +0 -12
  106. package/addWrappedAddons.js +0 -20
  107. package/alignmentTool.js +0 -503
  108. package/alignments.js +0 -379
  109. package/annotationLabelVisibility.js +0 -2
  110. package/annotationSearchSelector.js +0 -24
  111. package/annotationTypes.js +0 -35
  112. package/annotationVisibility.js +0 -196
  113. package/annotationsToSupport.js +0 -104
  114. package/arrayToObjWithIds.js +0 -17
  115. package/arrayUtils.js +0 -19
  116. package/array_move.js +0 -10
  117. package/calculateTickMarkPositionsForGivenRange.js +0 -47
  118. package/caretPosition.js +0 -27
  119. package/cdsFeaturesSelector.js +0 -9
  120. package/charWidth.js +0 -22
  121. package/circular.js +0 -19
  122. package/circularSelector.js +0 -4
  123. package/clickAndDragUtils.js +0 -576
  124. package/coerceInitialValue.js +0 -7
  125. package/combineReducersDontIgnoreKeys.js +0 -12
  126. package/commandUtils.js +0 -20
  127. package/constants.js +0 -2
  128. package/copyOptions.js +0 -34
  129. package/createFragmentLines.js +0 -120
  130. package/createMergedDefaultStateReducer.js +0 -30
  131. package/createMetaAction.js +0 -12
  132. package/createSequenceInputPopup.js +0 -290
  133. package/createSequenceInputPopupStyle.css +0 -87
  134. package/createSimpleDialog.js +0 -89
  135. package/createYourOwnEnzyme.js +0 -39
  136. package/cutsiteLabelColorSelector.js +0 -6
  137. package/cutsiteTool.js +0 -88
  138. package/cutsitesByRangeSelector.js +0 -5
  139. package/cutsitesSelector.js +0 -61
  140. package/darkmode.css +0 -98
  141. package/defaultConfig.js +0 -150
  142. package/deletionLayers.js +0 -36
  143. package/description.js +0 -21
  144. package/digestTool.js +0 -34
  145. package/dnaToColor.js +0 -17
  146. package/downloadTool.js +0 -39
  147. package/draggableClassnames.js +0 -5
  148. package/drawAnnotations.js +0 -440
  149. package/drawDirectedPiePiece.js +0 -142
  150. package/editTool.js +0 -49
  151. package/editorSelector.js +0 -2
  152. package/editorUtils.js +0 -205
  153. package/estimateRowHeight.js +0 -184
  154. package/featureLengthsToHide.js +0 -27
  155. package/featureTool.js +0 -34
  156. package/features.js +0 -19
  157. package/featuresSelector.js +0 -8
  158. package/filteredCutsitesSelector.js +0 -136
  159. package/filteredFeaturesSelector.js +0 -32
  160. package/filteredPartsSelector.js +0 -57
  161. package/filteredPrimersSelector.js +0 -27
  162. package/filteredRestrictionEnzymesSelector.js +0 -1
  163. package/find.png +0 -0
  164. package/findTool.js +0 -79
  165. package/findToolConstants.js +0 -1
  166. package/frameTranslations.js +0 -52
  167. package/fullscreen.png +0 -0
  168. package/getAdditionalEnzymesSelector.js +0 -46
  169. package/getAngleForPositionMidpoint.js +0 -3
  170. package/getAnnotationClassnames.js +0 -12
  171. package/getAnnotationNameAndStartStopString.js +0 -61
  172. package/getBpsPerRow.js +0 -19
  173. package/getCutsiteLabelHeights.js +0 -56
  174. package/getGapMap.js +0 -12
  175. package/getGaps.js +0 -27
  176. package/getInternalLabel.js +0 -40
  177. package/getOveHotkeyDefs.js +0 -12
  178. package/getPairwiseOverviewLinearViewOptions.js +0 -38
  179. package/getRangeAnglesSpecial.js +0 -12
  180. package/getStructuredBases.js +0 -97
  181. package/getTrackFromEvent.js +0 -25
  182. package/getVisibleStartEnd.js +0 -7
  183. package/getXStartAndWidthFromNonCircularRange.js +0 -12
  184. package/getXStartAndWidthOfRangeWrtRow.js +0 -27
  185. package/getXStartAndWidthOfRowAnnotation.js +0 -19
  186. package/getYOffset.js +0 -15
  187. package/hoveredAnnotation.js +0 -24
  188. package/importTool.js +0 -27
  189. package/index.js +0 -71
  190. package/inlineFindTool.js +0 -38
  191. package/isElementInViewport.js +0 -29
  192. package/isEnzymeFilterAndSelector.js +0 -1
  193. package/isTargetWithinEl.js +0 -6
  194. package/labelLineIntensity.js +0 -25
  195. package/labelSize.js +0 -23
  196. package/ladderDefaults.js +0 -25
  197. package/lastSavedId.js +0 -20
  198. package/lineageLines.js +0 -11
  199. package/linear.png +0 -0
  200. package/makeStore.js +0 -34
  201. package/massageTickSpacing.js +0 -19
  202. package/materiallyAvailable.js +0 -19
  203. package/middleware.js +0 -112
  204. package/minimumOrfSize.js +0 -24
  205. package/minimumOrfSizeSelector.js +0 -2
  206. package/modalActions.js +0 -3
  207. package/moveCaret.js +0 -58
  208. package/name.js +0 -19
  209. package/normalizeAngle.js +0 -3
  210. package/normalizeAngleRange.js +0 -9
  211. package/oligoTool.js +0 -30
  212. package/onlyUpdateForKeysDeep.js +0 -31
  213. package/orfFrameToColorMap.js +0 -10
  214. package/orfTool.js +0 -136
  215. package/orfsSelector.js +0 -15
  216. package/panelsShown.js +0 -294
  217. package/partLengthsToHide.js +0 -23
  218. package/partOverhangs.js +0 -6
  219. package/partTagSearch.js +0 -69
  220. package/partTool.js +0 -45
  221. package/parts.js +0 -19
  222. package/partsSelector.js +0 -8
  223. package/pie.png +0 -0
  224. package/polarToSpecialCartesian.js +0 -7
  225. package/positionCutsites.js +0 -6
  226. package/prepareRowData.js +0 -64
  227. package/primerBases.js +0 -221
  228. package/primerLengthsToHide.js +0 -27
  229. package/primers.js +0 -19
  230. package/primersSelector.js +0 -8
  231. package/print.png +0 -0
  232. package/printTool.js +0 -31
  233. package/propertiesTool.js +0 -40
  234. package/proteinUtils.js +0 -3
  235. package/pureNoFunc.js +0 -18
  236. package/readOnly.js +0 -25
  237. package/redoTool.js +0 -30
  238. package/reflex-styles.css +0 -128
  239. package/reflex-styles.css.map +0 -9
  240. package/relaxLabelAngles.js +0 -157
  241. package/relaxLabels_DEPRECATED.js +0 -105
  242. package/replacementLayers.js +0 -36
  243. package/restrictionEnzymes.js +0 -52
  244. package/restrictionEnzymesSelector.js +0 -34
  245. package/rowviewContants.js +0 -3
  246. package/ruler.css +0 -89
  247. package/save.png +0 -0
  248. package/saveTool.js +0 -44
  249. package/searchLayersSelector.js +0 -71
  250. package/selectedAnnotations.js +0 -89
  251. package/selectedAnnotationsSelector.js +0 -1
  252. package/selectedCutsitesSelector.js +0 -21
  253. package/selectedPartTags.js +0 -21
  254. package/selectionLayer.js +0 -25
  255. package/sequence.js +0 -12
  256. package/sequenceDataHistory.js +0 -43
  257. package/sequenceDataSelector.js +0 -2
  258. package/sequenceLengthSelector.js +0 -5
  259. package/sequenceSelector.js +0 -4
  260. package/sharedActionCreators.js +0 -0
  261. package/shouldFlipText.js +0 -4
  262. package/shouldRerender.js +0 -27
  263. package/showFileDialog.js +0 -25
  264. package/showGCContent.js +0 -23
  265. package/show_cut_sites.png +0 -0
  266. package/show_features.png +0 -0
  267. package/show_orfs.png +0 -0
  268. package/show_primers.png +0 -0
  269. package/simpleDialog.css +0 -13
  270. package/specialCutsiteFilterOptions.js +0 -22
  271. package/tagsToBoldSelector.js +0 -2
  272. package/toggle_views.svg +0 -1
  273. package/toolBar.js +0 -23
  274. package/translationSearchMatchesSelector.js +0 -14
  275. package/translations.js +0 -20
  276. package/translationsRawSelector.js +0 -8
  277. package/translationsSelector.js +0 -137
  278. package/typeField.js +0 -24
  279. package/undoTool.js +0 -30
  280. package/updateEditor.js +0 -200
  281. package/updateLabelsForInViewFeatures.js +0 -55
  282. package/updateLabelsForInViewFeaturesCircView.js +0 -41
  283. package/updateTrackHelper.js +0 -58
  284. package/uppercaseSequenceMapFont.js +0 -25
  285. package/upsertDeleteActionGenerator.js +0 -31
  286. package/useAAColorType.js +0 -8
  287. package/useAdditionalOrfStartCodons.js +0 -24
  288. package/useAnnotationLimits.js +0 -42
  289. package/useChromatogramPrefs.js +0 -31
  290. package/useFormValue.js +0 -7
  291. package/useLadders.js +0 -6
  292. package/useMeltingTemp.js +0 -7
  293. package/useTmType.js +0 -10
  294. package/userDefinedHandlersAndOpts.js +0 -61
  295. package/utils.js +0 -37
  296. package/versionHistory.js +0 -26
  297. package/versionHistoryTool.js +0 -21
  298. package/viewSubmenu.js +0 -479
  299. package/visibilityTool.js +0 -39
  300. package/withHover.js +0 -113
  301. package/withRestrictionEnzymes.js +0 -15
package/alignmentTool.js DELETED
@@ -1,503 +0,0 @@
1
- import React from "react";
2
- import { Icon, Button, Intent, Classes, Callout } from "@blueprintjs/core";
3
- import {
4
- FileUploadField,
5
- TextareaField,
6
- EditableTextField,
7
- CheckboxField,
8
- wrapDialog
9
- } from "@teselagen/ui";
10
- import { reduxForm, FieldArray } from "redux-form";
11
- import { anyToJson } from "@teselagen/bio-parsers";
12
- import { flatMap } from "lodash-es";
13
- import uniqid from "shortid";
14
- import { cloneDeep } from "lodash-es";
15
- import classNames from "classnames";
16
-
17
- import ToolbarItem from "./ToolbarItem";
18
- import { connectToEditor } from "../withEditorProps";
19
- import withEditorProps from "../withEditorProps";
20
- import { showDialog } from "../GlobalDialogUtils";
21
- import { compose } from "recompose";
22
- import { array_move } from "./array_move";
23
-
24
- export default connectToEditor(({ readOnly, toolBar = {} }) => {
25
- return {
26
- readOnly: readOnly,
27
- isOpen: toolBar.openItem === "alignmentTool"
28
- };
29
- })(({ toolbarItemProps, isOpen }) => {
30
- return (
31
- <ToolbarItem
32
- {...{
33
- Icon: <Icon data-test="alignmentTool" icon="align-left" />,
34
- // toggled: alignmentTool.isOpen,
35
- renderIconAbove: isOpen,
36
- // onIconClick: toggleFindTool,
37
- Dropdown: ConnectedAlignmentToolDropdown,
38
- onIconClick: "toggleDropdown",
39
- noDropdownIcon: true,
40
- tooltip: isOpen ? "Hide Alignment Tool" : "Align to This Sequence",
41
- ...toolbarItemProps
42
- }}
43
- />
44
- );
45
- });
46
-
47
- class AlignmentToolDropdown extends React.Component {
48
- render() {
49
- const {
50
- savedAlignments = [],
51
- hasSavedAlignments,
52
- toggleDropdown,
53
- sequenceData
54
- } = this.props;
55
- return (
56
- <div>
57
- <Button
58
- intent={Intent.PRIMARY}
59
- onClick={() => {
60
- toggleDropdown();
61
- showDialog({
62
- dialogType: "AlignmentToolDialog",
63
- props: {
64
- createNewAlignment: this.props.createNewAlignment,
65
- upsertAlignmentRun: this.props.upsertAlignmentRun,
66
- initialValues: {
67
- addedSequences: [{ ...sequenceData, isTemplate: true }]
68
- }
69
- }
70
- });
71
- }}
72
- >
73
- Create New Alignment
74
- </Button>
75
- <br></br>
76
- <br></br>
77
- <Callout intent="warning">
78
- Note: This tool requires an alignment server to be hooked up for it to
79
- work properly. It will NOT work in the OVE demo page.
80
- </Callout>
81
- <div className="vespacer" />
82
- {hasSavedAlignments && (
83
- <div>
84
- <h6>Saved Alignments:</h6>
85
- {!savedAlignments.length && (
86
- <div style={{ fontStyle: "italic" }}> No Alignments</div>
87
- )}
88
- {savedAlignments.map((savedAlignment, i) => {
89
- return <div key={i}>Saved Alignment {i}</div>;
90
- })}
91
- </div>
92
- )}
93
- </div>
94
- );
95
- }
96
- }
97
- const ConnectedAlignmentToolDropdown = withEditorProps(AlignmentToolDropdown);
98
-
99
- class AlignmentTool extends React.Component {
100
- state = {
101
- templateSeqIndex: 0
102
- };
103
- sendSelectedDataToBackendForAlignment = async values => {
104
- const {
105
- addedSequences,
106
- isPairwiseAlignment,
107
- isAlignToRefSeq,
108
- isAutotrimmedSeq
109
- } = values;
110
- const {
111
- hideModal,
112
- /* onAlignmentSuccess, */ createNewAlignment,
113
- // createNewMismatchesList,
114
- upsertAlignmentRun
115
- } = this.props;
116
- const { templateSeqIndex } = this.state;
117
- const addedSequencesToUse = array_move(addedSequences, templateSeqIndex, 0);
118
-
119
- let addedSequencesToUseTrimmed;
120
- if (isAutotrimmedSeq) {
121
- addedSequencesToUseTrimmed = cloneDeep(addedSequencesToUse);
122
- // trimming any sequences with chromatogram data
123
- for (let i = 0; i < addedSequencesToUseTrimmed.length; i++) {
124
- if ("chromatogramData" in addedSequencesToUseTrimmed[i]) {
125
- // if (addedSequencesToUseTrimmed[i].chromatogramData.qualNums) {
126
- if ("qualNums" in addedSequencesToUseTrimmed[i].chromatogramData) {
127
- // returning bp pos for { suggestedTrimStart, suggestedTrimEnd }
128
- const { suggestedTrimStart, suggestedTrimEnd } = mottTrim(
129
- addedSequencesToUseTrimmed[i].chromatogramData.qualNums
130
- );
131
- addedSequencesToUseTrimmed[i].sequence = addedSequencesToUseTrimmed[
132
- i
133
- ].sequence.slice(suggestedTrimStart, suggestedTrimEnd + 1);
134
- const elementsToTrim = ["baseCalls", "basePos", "qualNums"];
135
- // eslint-disable-next-line no-unused-vars
136
- for (const element in addedSequencesToUseTrimmed[i]
137
- .chromatogramData) {
138
- if (elementsToTrim.indexOf(element) !== -1) {
139
- addedSequencesToUseTrimmed[i].chromatogramData[element] =
140
- addedSequencesToUseTrimmed[i].chromatogramData[element].slice(
141
- suggestedTrimStart,
142
- suggestedTrimEnd + 1
143
- );
144
- }
145
- }
146
- }
147
- }
148
- }
149
- }
150
- let seqsToAlign;
151
- if (addedSequencesToUseTrimmed) {
152
- seqsToAlign = addedSequencesToUseTrimmed;
153
- } else {
154
- seqsToAlign = addedSequencesToUse;
155
- }
156
-
157
- hideModal();
158
- const alignmentId = uniqid();
159
- // const alignmentIdMismatches = uniqid();
160
- createNewAlignment({
161
- id: alignmentId,
162
- name: seqsToAlign[0].name + " Alignment"
163
- });
164
- //set the alignment to loading
165
- upsertAlignmentRun({
166
- id: alignmentId,
167
- loading: true
168
- });
169
- // createNewMismatchesList({
170
- // id: alignmentIdMismatches,
171
- // name: addedSequencesToUse[0].name + " Mismatches",
172
- // alignmentId: alignmentId
173
- // });
174
-
175
- // const j5server = process.env.REMOTE_J5 || "http://j5server.teselagen.com"
176
-
177
- window.toastr.success("Alignment submitted.");
178
- const replaceProtocol = url => {
179
- return url.replace("http://", window.location.protocol + "//");
180
- };
181
-
182
- const seqInfoToSend = seqsToAlign.map(({ sequence, name, id }) => {
183
- return {
184
- sequence,
185
- name,
186
- id
187
- };
188
- });
189
-
190
- const {
191
- alignedSequences: _alignedSequences,
192
- pairwiseAlignments,
193
- alignmentsToRefSeq
194
- } = await (
195
- await fetch({
196
- url: replaceProtocol("http://j5server.teselagen.com/alignment/run"),
197
- method: "post",
198
- body: JSON.stringify({
199
- //only send over the bear necessities :)
200
- sequencesToAlign: seqInfoToSend,
201
- isPairwiseAlignment,
202
- isAlignToRefSeq
203
- })
204
- })
205
- ).json();
206
-
207
- // alignmentsToRefSeq set to alignedSequences for now
208
- let alignedSequences = _alignedSequences;
209
- if (alignmentsToRefSeq) {
210
- alignedSequences = alignmentsToRefSeq;
211
- }
212
- if (!alignedSequences && !pairwiseAlignments)
213
- window.toastr.error("Error running sequence alignment!");
214
- //set the alignment to loading
215
- upsertAlignmentRun({
216
- id: alignmentId,
217
- pairwiseAlignments:
218
- pairwiseAlignments &&
219
- pairwiseAlignments.map((alignedSequences, topIndex) => {
220
- return alignedSequences.map((alignmentData, innerIndex) => {
221
- return {
222
- sequenceData: seqsToAlign[innerIndex > 0 ? topIndex + 1 : 0],
223
- alignmentData,
224
- chromatogramData: seqsToAlign[innerIndex].chromatogramData
225
- };
226
- });
227
- }),
228
- alignmentTracks:
229
- alignedSequences &&
230
- alignedSequences.map(alignmentData => {
231
- return {
232
- sequenceData:
233
- seqsToAlign[
234
- alignmentData.name.slice(0, alignmentData.name.indexOf("_"))
235
- ],
236
- alignmentData,
237
- chromatogramData:
238
- seqsToAlign[
239
- alignmentData.name.slice(0, alignmentData.name.indexOf("_"))
240
- ].chromatogramData
241
- };
242
- })
243
- // alignmentTracks:
244
- // alignedSequences &&
245
- // alignedSequences.map((alignmentData, i) => {
246
- // return {
247
- // sequenceData: addedSequencesToUse[i],
248
- // alignmentData,
249
- // chromatogramData: addedSequencesToUse[i].chromatogramData
250
- // };
251
- // })
252
- });
253
- };
254
-
255
- handleFileUpload = (files, onChange) => {
256
- const { array } = this.props;
257
- flatMap(files, async file => {
258
- const results = await anyToJson(file.originalFileObj, {
259
- fileName: file.name,
260
- acceptParts: true
261
- });
262
- return results.forEach(result => {
263
- if (result.success) {
264
- array.push("addedSequences", result.parsedSequence);
265
- } else {
266
- return window.toastr.warning("Error parsing file: ", file.name);
267
- }
268
- });
269
- });
270
- onChange([]);
271
- };
272
- renderAddSequence = ({ fields, templateSeqIndex }) => {
273
- const { handleSubmit } = this.props;
274
-
275
- const sequencesToAlign = fields.getAll() || [];
276
- return (
277
- <div>
278
- <h6>Or enter sequences in plain text format</h6>
279
- <div>
280
- <AddYourOwnSeqForm
281
- addSeq={newSeq => {
282
- fields.push(newSeq);
283
- }}
284
- />
285
- <h6 style={{ marginTop: 15 }}>Sequences To Align: </h6>
286
- {!fields.getAll() && <div>No sequences added yet.</div>}
287
- <div
288
- style={{ maxHeight: 180, overflowY: "auto" }}
289
- className="veAlignmentToolSelectedSequenceList"
290
- >
291
- {sequencesToAlign.map((addedSeq, index) => {
292
- return (
293
- <div
294
- onClick={() => {
295
- this.setState({
296
- templateSeqIndex: index
297
- });
298
- }}
299
- style={{
300
- borderBottom: "1px solid lightgrey",
301
- paddingBottom: 4,
302
- marginBottom: 4,
303
- width: "100%",
304
- justifyContent: "space-between",
305
- alignItems: "center",
306
- display: "flex"
307
- }}
308
- key={index}
309
- >
310
- <div>
311
- {addedSeq.name}{" "}
312
- <span style={{ fontSize: 10 }}>
313
- {" "}
314
- ({addedSeq.sequence.length} bps)
315
- </span>
316
- </div>
317
- {index === templateSeqIndex && (
318
- <div
319
- className={classNames(
320
- Classes.TAG,
321
- Classes.ROUND,
322
- Classes.INTENT_PRIMARY
323
- )}
324
- >
325
- template
326
- </div>
327
- )}
328
-
329
- <Button
330
- onClick={e => {
331
- e.stopPropagation();
332
- e.preventDefault();
333
- fields.remove(index);
334
- if (index === templateSeqIndex) {
335
- this.setState({ templateSeqIndex: 0 });
336
- }
337
- }}
338
- >
339
- Remove
340
- </Button>
341
- </div>
342
- );
343
- })}
344
- </div>
345
- <br />
346
- <CheckboxField
347
- name="isPairwiseAlignment"
348
- style={{ display: "flex", alignItems: "center" }}
349
- label={
350
- <div>
351
- Create Pairwise Alignment{" "}
352
- <span style={{ fontSize: 11 }}>
353
- Individually align each uploaded file against the template
354
- sequence (instead of creating a single Multiple Sequence
355
- Alignment)
356
- </span>
357
- </div>
358
- }
359
- />
360
- <CheckboxField
361
- name="isAlignToRefSeq"
362
- style={{ display: "flex", alignItems: "center" }}
363
- label={
364
- <div>
365
- Align Sequencing Reads to Reference Sequence{" "}
366
- <span style={{ fontSize: 11 }}>
367
- Align short sequencing reads to a long reference sequence
368
- </span>
369
- </div>
370
- }
371
- />
372
- <CheckboxField
373
- name="isAutotrimmedSeq"
374
- style={{ display: "flex", alignItems: "center" }}
375
- label={
376
- <div>
377
- Auto-Trim Sequences{" "}
378
- <span style={{ fontSize: 11 }}>
379
- Automatically trim low-quality ends of sequences based on
380
- quality scores
381
- </span>
382
- </div>
383
- }
384
- />
385
-
386
- <Button
387
- style={{ marginTop: 15, float: "right" }}
388
- intent={Intent.PRIMARY}
389
- disabled={sequencesToAlign.length < 2}
390
- onClick={handleSubmit(this.sendSelectedDataToBackendForAlignment)}
391
- >
392
- Create alignment
393
- </Button>
394
- </div>
395
- </div>
396
- );
397
- };
398
-
399
- render() {
400
- const { selectFromSequenceLibraryHook } = this.props;
401
- const { templateSeqIndex } = this.state;
402
- return (
403
- <div style={{ padding: 20 }} className="veAlignmentTool">
404
- <h6>Upload files you'd like to align (.ab1, .fasta, .gb) </h6>
405
- <FileUploadField
406
- name="alignmentToolSequenceUpload"
407
- style={{ maxWidth: 400 }}
408
- beforeUpload={this.handleFileUpload}
409
- />
410
- {selectFromSequenceLibraryHook && (
411
- <h6>Or Select from your sequence library </h6>
412
- )}
413
-
414
- <FieldArray
415
- name="addedSequences"
416
- templateSeqIndex={templateSeqIndex}
417
- component={this.renderAddSequence}
418
- />
419
- </div>
420
- );
421
- }
422
- }
423
-
424
- export const AlignmentToolDialog = compose(
425
- wrapDialog({ title: "Create New Alignment" }),
426
- reduxForm({
427
- form: "veAlignmentTool"
428
- })
429
- )(AlignmentTool);
430
-
431
- const AddYourOwnSeqForm = reduxForm({
432
- form: "AddYourOwnSeqForm",
433
- validate: ({ name, sequence }) => {
434
- const errors = {};
435
- if (!name) {
436
- errors.name = "Required";
437
- }
438
- if (!sequence) {
439
- errors.sequence = "Required";
440
- }
441
- return errors;
442
- }
443
- })(({ pristine, error, handleSubmit, reset, addSeq }) => {
444
- return (
445
- <form
446
- onSubmit={handleSubmit(vals => {
447
- reset();
448
- addSeq(vals);
449
- })}
450
- >
451
- <EditableTextField
452
- style={{ maxWidth: 200 }}
453
- placeholder="Untitled Sequence"
454
- name="name"
455
- />
456
- <TextareaField
457
- style={{ maxWidth: 400 }}
458
- placeholder="AGTTGAGC"
459
- name="sequence"
460
- />
461
- <Button disabled={pristine || error} type="submit">
462
- Add
463
- </Button>
464
- </form>
465
- );
466
- });
467
-
468
- function mottTrim(qualNums) {
469
- if (!qualNums) return;
470
- let startPos = 0;
471
- let endPos = 0;
472
- const totalScoreInfo = [];
473
- let score = 0;
474
- let totalScore = 0;
475
- const cutoff = 0.05;
476
- for (let i = 0; i < qualNums.length; i++) {
477
- // low-quality bases have high error probabilities, so may have a negative base score
478
- score = cutoff - Math.pow(10, qualNums[i] / -10);
479
- totalScore += score;
480
- totalScoreInfo.push(totalScore);
481
- // score = score + cutoff - Math.pow(10, qualNums[i] / -10);
482
- // if (totalScore < 0) {
483
- // tempStart = i;
484
- // }
485
- // if (i - tempStart > endPos - startPos) {
486
- // startPos = tempStart;
487
- // endPos = i;
488
- // }
489
- if (totalScore < 0) {
490
- totalScore = 0;
491
- }
492
- }
493
- const firstPositiveValue = totalScoreInfo.find(e => {
494
- return e > 0;
495
- });
496
- startPos = totalScoreInfo.indexOf(firstPositiveValue);
497
- const highestValue = Math.max(...totalScoreInfo);
498
- endPos = totalScoreInfo.lastIndexOf(highestValue);
499
- return {
500
- suggestedTrimStart: startPos,
501
- suggestedTrimEnd: endPos
502
- };
503
- }