@teselagen/ove 0.7.28 → 0.7.29

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 (285) hide show
  1. package/index.cjs.js +1055 -996
  2. package/index.es.js +1055 -996
  3. package/index.umd.js +189036 -0
  4. package/ove.css +1 -1
  5. package/package.json +2 -6
  6. package/src/helperComponents/PropertiesDialog/TranslationProperties.js +1 -1
  7. package/AASliver.js +0 -187
  8. package/AddLaddersDialog.js +0 -82
  9. package/AdditionalCutsiteInfoDialog.js +0 -599
  10. package/AlignmentVisibilityTool.js +0 -105
  11. package/AnnotationContainerHolder.js +0 -20
  12. package/AnnotationPositioner.js +0 -27
  13. package/AutoAnnotate.js +0 -501
  14. package/AutoAnnotateBpMatchingDialog.js +0 -208
  15. package/Axis.js +0 -151
  16. package/AxisNumbers.js +0 -35
  17. package/Browser.js +0 -106
  18. package/Caret.js +0 -63
  19. package/Chromatogram.js +0 -293
  20. package/CircularDnaSequence.js +0 -73
  21. package/CircularZoomMinimap.js +0 -16
  22. package/ColorPicker.js +0 -30
  23. package/CommandHotkeyHandler.js +0 -44
  24. package/CreateAnnotationsPage.js +0 -98
  25. package/Cutsite.js +0 -18
  26. package/CutsiteProperties.js +0 -176
  27. package/CutsiteSelectionLayers.js +0 -47
  28. package/Cutsites.js +0 -271
  29. package/DeletionLayer.js +0 -28
  30. package/DropHandler.css +0 -21
  31. package/DropHandler.js +0 -64
  32. package/EditCaretPosition.js +0 -234
  33. package/EditTrackNameDialog.js +0 -30
  34. package/Feature.js +0 -83
  35. package/FeatureProperties.js +0 -6
  36. package/FillWindow.js +0 -47
  37. package/GenbankView.js +0 -74
  38. package/GeneralProperties.js +0 -117
  39. package/GenericAnnotationProperties.js +0 -406
  40. package/GlobalDialog.js +0 -73
  41. package/GlobalDialogUtils.js +0 -110
  42. package/GoToDialog.js +0 -25
  43. package/HorizontalPanelDragHandle.js +0 -35
  44. package/Keyboard.js +0 -85
  45. package/Labels.js +0 -327
  46. package/Ladder.css +0 -20
  47. package/Ladder.js +0 -303
  48. package/MeltingTemp.js +0 -85
  49. package/Menlo.ttf +0 -0
  50. package/Minimap.js +0 -515
  51. package/Mismatches.js +0 -134
  52. package/Monaco.ttf +0 -0
  53. package/MultipleSeqsDetectedOnImportDialog.js +0 -74
  54. package/Orf.js +0 -109
  55. package/OrfProperties.js +0 -117
  56. package/Orfs.js +0 -35
  57. package/PCRTool.js +0 -179
  58. package/PairwiseAlignmentView.js +0 -68
  59. package/Part.js +0 -34
  60. package/PartProperties.js +0 -9
  61. package/PassThrough.js +0 -3
  62. package/PerformantSelectionLayer.js +0 -32
  63. package/PinchHelper.js +0 -24
  64. package/PointedAnnotation.js +0 -347
  65. package/PositionAnnotationOnCircle.js +0 -26
  66. package/Primer.js +0 -41
  67. package/PrimerProperties.js +0 -19
  68. package/ReflexContainer.js +0 -802
  69. package/ReflexElement.js +0 -160
  70. package/ReflexEvents.js +0 -77
  71. package/ReflexSplitter.js +0 -205
  72. package/RenameSequenceDialog.js +0 -7
  73. package/RotateCircularViewSlider.js +0 -93
  74. package/SelectDialog.js +0 -150
  75. package/SequenceName.js +0 -15
  76. package/SimpleCircularOrLinearView.js +0 -381
  77. package/SimpleOligoPreview.js +0 -39
  78. package/SingleEnzymeCutsiteInfo.js +0 -139
  79. package/ToolbarItem.js +0 -192
  80. package/Translation.js +0 -198
  81. package/TranslationProperties.js +0 -149
  82. package/UncontrolledSliderWithPlusMinusBtns.css +0 -5
  83. package/UncontrolledSliderWithPlusMinusBtns.js +0 -134
  84. package/VeTopRightContainer.js +0 -12
  85. package/ZoomCircularViewSlider.js +0 -62
  86. package/ZoomLinearView.js +0 -47
  87. package/addAlignment.js +0 -6
  88. package/addMetaToActionCreators.js +0 -12
  89. package/addWrappedAddons.js +0 -20
  90. package/alignmentTool.js +0 -503
  91. package/alignments.js +0 -379
  92. package/annotationLabelVisibility.js +0 -2
  93. package/annotationSearchSelector.js +0 -24
  94. package/annotationTypes.js +0 -35
  95. package/annotationVisibility.js +0 -196
  96. package/annotationsToSupport.js +0 -104
  97. package/arrayToObjWithIds.js +0 -17
  98. package/arrayUtils.js +0 -19
  99. package/array_move.js +0 -10
  100. package/calculateTickMarkPositionsForGivenRange.js +0 -47
  101. package/caretPosition.js +0 -27
  102. package/cdsFeaturesSelector.js +0 -9
  103. package/charWidth.js +0 -22
  104. package/circular.js +0 -19
  105. package/circularSelector.js +0 -4
  106. package/clickAndDragUtils.js +0 -576
  107. package/coerceInitialValue.js +0 -7
  108. package/combineReducersDontIgnoreKeys.js +0 -12
  109. package/commandUtils.js +0 -20
  110. package/constants.js +0 -2
  111. package/copyOptions.js +0 -34
  112. package/createFragmentLines.js +0 -120
  113. package/createMergedDefaultStateReducer.js +0 -30
  114. package/createMetaAction.js +0 -12
  115. package/createSequenceInputPopup.js +0 -290
  116. package/createSequenceInputPopupStyle.css +0 -87
  117. package/createSimpleDialog.js +0 -89
  118. package/createYourOwnEnzyme.js +0 -39
  119. package/cutsiteLabelColorSelector.js +0 -6
  120. package/cutsiteTool.js +0 -88
  121. package/cutsitesByRangeSelector.js +0 -5
  122. package/cutsitesSelector.js +0 -61
  123. package/darkmode.css +0 -98
  124. package/defaultConfig.js +0 -150
  125. package/deletionLayers.js +0 -36
  126. package/description.js +0 -21
  127. package/digestTool.js +0 -34
  128. package/dnaToColor.js +0 -17
  129. package/downloadTool.js +0 -39
  130. package/draggableClassnames.js +0 -5
  131. package/drawAnnotations.js +0 -440
  132. package/drawDirectedPiePiece.js +0 -142
  133. package/editTool.js +0 -49
  134. package/editorSelector.js +0 -2
  135. package/editorUtils.js +0 -205
  136. package/estimateRowHeight.js +0 -184
  137. package/featureLengthsToHide.js +0 -27
  138. package/featureTool.js +0 -34
  139. package/features.js +0 -19
  140. package/featuresSelector.js +0 -8
  141. package/filteredCutsitesSelector.js +0 -136
  142. package/filteredFeaturesSelector.js +0 -32
  143. package/filteredPartsSelector.js +0 -57
  144. package/filteredPrimersSelector.js +0 -27
  145. package/filteredRestrictionEnzymesSelector.js +0 -1
  146. package/find.png +0 -0
  147. package/findTool.js +0 -79
  148. package/findToolConstants.js +0 -1
  149. package/frameTranslations.js +0 -52
  150. package/fullscreen.png +0 -0
  151. package/getAdditionalEnzymesSelector.js +0 -46
  152. package/getAngleForPositionMidpoint.js +0 -3
  153. package/getAnnotationClassnames.js +0 -12
  154. package/getAnnotationNameAndStartStopString.js +0 -61
  155. package/getBpsPerRow.js +0 -19
  156. package/getCutsiteLabelHeights.js +0 -56
  157. package/getGapMap.js +0 -12
  158. package/getGaps.js +0 -27
  159. package/getInternalLabel.js +0 -40
  160. package/getOveHotkeyDefs.js +0 -12
  161. package/getPairwiseOverviewLinearViewOptions.js +0 -38
  162. package/getRangeAnglesSpecial.js +0 -12
  163. package/getStructuredBases.js +0 -97
  164. package/getTrackFromEvent.js +0 -25
  165. package/getVisibleStartEnd.js +0 -7
  166. package/getXStartAndWidthFromNonCircularRange.js +0 -12
  167. package/getXStartAndWidthOfRangeWrtRow.js +0 -27
  168. package/getXStartAndWidthOfRowAnnotation.js +0 -19
  169. package/getYOffset.js +0 -15
  170. package/hoveredAnnotation.js +0 -24
  171. package/importTool.js +0 -27
  172. package/index.js +0 -71
  173. package/inlineFindTool.js +0 -38
  174. package/isElementInViewport.js +0 -29
  175. package/isEnzymeFilterAndSelector.js +0 -1
  176. package/isTargetWithinEl.js +0 -6
  177. package/labelLineIntensity.js +0 -25
  178. package/labelSize.js +0 -23
  179. package/ladderDefaults.js +0 -25
  180. package/lastSavedId.js +0 -20
  181. package/lineageLines.js +0 -11
  182. package/linear.png +0 -0
  183. package/makeStore.js +0 -34
  184. package/massageTickSpacing.js +0 -19
  185. package/materiallyAvailable.js +0 -19
  186. package/middleware.js +0 -112
  187. package/minimumOrfSize.js +0 -24
  188. package/minimumOrfSizeSelector.js +0 -2
  189. package/modalActions.js +0 -3
  190. package/moveCaret.js +0 -58
  191. package/name.js +0 -19
  192. package/normalizeAngle.js +0 -3
  193. package/normalizeAngleRange.js +0 -9
  194. package/oligoTool.js +0 -30
  195. package/onlyUpdateForKeysDeep.js +0 -31
  196. package/orfFrameToColorMap.js +0 -10
  197. package/orfTool.js +0 -136
  198. package/orfsSelector.js +0 -15
  199. package/panelsShown.js +0 -294
  200. package/partLengthsToHide.js +0 -23
  201. package/partOverhangs.js +0 -6
  202. package/partTagSearch.js +0 -69
  203. package/partTool.js +0 -45
  204. package/parts.js +0 -19
  205. package/partsSelector.js +0 -8
  206. package/pie.png +0 -0
  207. package/polarToSpecialCartesian.js +0 -7
  208. package/positionCutsites.js +0 -6
  209. package/prepareRowData.js +0 -64
  210. package/primerBases.js +0 -221
  211. package/primerLengthsToHide.js +0 -27
  212. package/primers.js +0 -19
  213. package/primersSelector.js +0 -8
  214. package/print.png +0 -0
  215. package/printTool.js +0 -31
  216. package/propertiesTool.js +0 -40
  217. package/proteinUtils.js +0 -3
  218. package/pureNoFunc.js +0 -18
  219. package/readOnly.js +0 -25
  220. package/redoTool.js +0 -30
  221. package/reflex-styles.css +0 -128
  222. package/reflex-styles.css.map +0 -9
  223. package/relaxLabelAngles.js +0 -157
  224. package/relaxLabels_DEPRECATED.js +0 -105
  225. package/replacementLayers.js +0 -36
  226. package/restrictionEnzymes.js +0 -52
  227. package/restrictionEnzymesSelector.js +0 -34
  228. package/rowviewContants.js +0 -3
  229. package/ruler.css +0 -89
  230. package/save.png +0 -0
  231. package/saveTool.js +0 -44
  232. package/searchLayersSelector.js +0 -71
  233. package/selectedAnnotations.js +0 -89
  234. package/selectedAnnotationsSelector.js +0 -1
  235. package/selectedCutsitesSelector.js +0 -21
  236. package/selectedPartTags.js +0 -21
  237. package/selectionLayer.js +0 -25
  238. package/sequence.js +0 -12
  239. package/sequenceDataHistory.js +0 -43
  240. package/sequenceDataSelector.js +0 -2
  241. package/sequenceLengthSelector.js +0 -5
  242. package/sequenceSelector.js +0 -4
  243. package/sharedActionCreators.js +0 -0
  244. package/shouldFlipText.js +0 -4
  245. package/shouldRerender.js +0 -27
  246. package/showFileDialog.js +0 -25
  247. package/showGCContent.js +0 -23
  248. package/show_cut_sites.png +0 -0
  249. package/show_features.png +0 -0
  250. package/show_orfs.png +0 -0
  251. package/show_primers.png +0 -0
  252. package/simpleDialog.css +0 -13
  253. package/specialCutsiteFilterOptions.js +0 -22
  254. package/style.css +0 -10
  255. package/tagsToBoldSelector.js +0 -2
  256. package/toggle_views.svg +0 -1
  257. package/toolBar.js +0 -23
  258. package/translationSearchMatchesSelector.js +0 -14
  259. package/translations.js +0 -20
  260. package/translationsRawSelector.js +0 -8
  261. package/translationsSelector.js +0 -137
  262. package/typeField.js +0 -24
  263. package/undoTool.js +0 -30
  264. package/updateEditor.js +0 -200
  265. package/updateLabelsForInViewFeatures.js +0 -55
  266. package/updateLabelsForInViewFeaturesCircView.js +0 -41
  267. package/updateTrackHelper.js +0 -58
  268. package/uppercaseSequenceMapFont.js +0 -25
  269. package/upsertDeleteActionGenerator.js +0 -31
  270. package/useAAColorType.js +0 -8
  271. package/useAdditionalOrfStartCodons.js +0 -24
  272. package/useAnnotationLimits.js +0 -42
  273. package/useChromatogramPrefs.js +0 -31
  274. package/useFormValue.js +0 -7
  275. package/useLadders.js +0 -6
  276. package/useMeltingTemp.js +0 -7
  277. package/useTmType.js +0 -10
  278. package/userDefinedHandlersAndOpts.js +0 -61
  279. package/utils.js +0 -37
  280. package/versionHistory.js +0 -26
  281. package/versionHistoryTool.js +0 -21
  282. package/viewSubmenu.js +0 -479
  283. package/visibilityTool.js +0 -39
  284. package/withHover.js +0 -113
  285. 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
- }