Skip to content
This repository has been archived by the owner on Jan 22, 2024. It is now read-only.

alignment demo and fixes #442

Merged
merged 4 commits into from
Jan 12, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
170 changes: 118 additions & 52 deletions demo/src/AlignmentDemo.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,28 @@ import {
} from "../../src/withEditorProps/index";
import { caretPositionUpdate } from "../../src/redux/caretPosition";
import renderToggle from "./utils/renderToggle";
import jbeiPairwiseAlignmnent232018 from "./exampleData/jbeiPairwiseAlignmnent_23_2018.json";
import { BPSelect } from "teselagen-react-components";

// import { upsertPart } from "../../src/redux/sequenceData";
// import { MenuItem } from "@blueprintjs/core";

// Use the line below because using the full 30 sequences murders Redux dev tools.
alignmentRunData.alignmentTracks = alignmentRunData.alignmentTracks.slice(0, 5);
alignmentRunData.alignmentTracks = alignmentRunData.alignmentTracks.slice(0, 20);
let alignmentDataToUse = alignmentRunData
// let alignmentDataToUse = jbeiPairwiseAlignmnent232018
const defaultState = {
showOptions: true
showOptions: true,
alignmentDataToUse: alignmentRunData,
forceHeightMode: false,
isFullyZoomedOut: false,
setMinimapLaneHeight: false,
setMinimapLaneSpacing: false,
setAlignmentName: false,
noClickDragHandlers: false,
hasTemplate: false,
noVisibilityOptions: false,
setTickSpacing: false
};

const basicActions = { selectionLayerUpdate, caretPositionUpdate };
Expand All @@ -36,7 +50,7 @@ export default connect(
return {
...getCombinedActions(
times(
alignmentRunData.alignmentTracks.length,
alignmentDataToUse.alignmentTracks ? alignmentDataToUse.alignmentTracks.length : alignmentDataToUse.pairwiseAlignments.length,
i => "alignmentView" + i
),
basicActions,
Expand All @@ -55,36 +69,34 @@ export default connect(
});
}

componentDidUpdate() {
componentDidUpdate(prevProps, prevState) {
setParamsIfNecessary({ that: this, defaultState });
if (this.state.alignmentDataToUse !== prevState.alignmentDataToUse) {
addAlignment(store, { ...this.state.alignmentDataToUse });
}
}

componentDidMount() {
addAlignment(store, { ...alignmentRunData });
addAlignment(store, { ...this.state.alignmentDataToUse });

alignmentRunData.alignmentTracks.forEach((at, i) => {
// We need to do this or else the sequence data will be
// updated with some default sequence data when we select
// stuff.
updateEditor(store, "alignmentView" + i, {
readOnly: true,
sequenceData: at.alignmentData,
annotationVisibility: {
features: false,
translations: false,
parts: true,
orfs: false,
orfTranslations: false,
cdsFeatureTranslations: true,
axis: false,
cutsites: false,
primers: false,
reverseSequence: false,
lineageLines: false,
axisNumbers: false
}
if (this.state.alignmentDataToUse.alignmentTracks) {
this.state.alignmentDataToUse.alignmentTracks.forEach((at, i) => {
// We need to do this or else the sequence data will be
// updated with some default sequence data when we select
// stuff.
updateEditor(store, "alignmentView" + i, {
readOnly: true,
sequenceData: at.alignmentData,
});
});
});
} else {
this.state.alignmentDataToUse.pairwiseAlignments.forEach((at, i) => {
updateEditor(store, "alignmentView" + i, {
readOnly: true,
sequenceData: at.alignmentData,
});
});
}
}
render() {
return (
Expand All @@ -111,7 +123,7 @@ export default connect(
left: 0,
paddingTop: 10,
width: 250,
height: "100%",
// height: "100%",
minWidth: 250,
maxWidth: 250,
display: "flex",
Expand All @@ -120,46 +132,100 @@ export default connect(
borderRight: "1px solid lightgrey"
}}
>
<BPSelect
onChange={val => {
val === "msa" ? this.setState({alignmentDataToUse: alignmentRunData}) : this.setState({alignmentDataToUse: jbeiPairwiseAlignmnent232018})
}}
options={[
{ label: "Multiple Sequence Alignment", value: "msa" },
{ label: "Pairwise Alignment", value: "pairwise" }
]}
/>
<br/>
{renderToggle({
that: this,
type: "forceHeightMode",
label: "Force Height 500px",
description:
"You can force a height for the editor by passing height:500 (same for width) "
"You can force a height for the editor by passing height:500 (same for width)"
})}
{renderToggle({
that: this,
type: "setAlignmentName",
label: "Set Alignment Name",
description:
"You can give the alignment a name by setting alignmentName:'Ref Seq Name'"
})}
{renderToggle({
that: this,
type: "isFullyZoomedOut",
label: "View Zoomed-Out Alignment",
description:
"You can view the alignment zoomed-out by setting isFullyZoomedOut:true"
})}
{renderToggle({
that: this,
type: "setMinimapLaneHeight",
label: "Set Minimap Lane Height 13px",
description:
"You can set a height for the minimap lanes by passing minimapLaneHeight:13"
})}
{renderToggle({
that: this,
type: "setMinimapLaneSpacing",
label: "Set Minimap Lane Spacing 3px",
description:
"You can set a height for the space between minimap lanes by passing minimapLaneSpacing:3"
})}
{renderToggle({
that: this,
type: "noClickDragHandlers",
label: "Disable Click-Drag Highlighting",
description:
"You can disable click-drag highlighting by setting noClickDragHandlers:true"
})}
{renderToggle({
that: this,
type: "hasTemplate",
label: "Specify Alignment with Template",
description:
"You can specify that the first sequence in an alignment is a template sequence by setting hasTemplate:true"
})}
{renderToggle({
that: this,
type: "setTickSpacing",
label: "Set Tick Spacing 10 bps",
description:
"You can set spacing of tick marks on the axis by setting linearViewOptions:{tickSpacing:10}"
})}
{renderToggle({
that: this,
type: "noVisibilityOptions",
label: "Disable Visibility Options",
description:
"You can disable the visibility options menu by setting noVisibilityOptions:true"
})}
</div>
)}
</div>
<AlignmentView
style={{
// display: "flex",
// flexDirection: "column",
// flexGrow: 1,
...(this.state.showOptions && { paddingLeft: 250 })
}}
{...{
editorName: "MppViewer",
id: alignmentRunData.id,
minimapLaneHeight: 10,
id: this.state.alignmentDataToUse.id,
alignmentType: this.state.alignmentDataToUse.alignmentType,
height: this.state.forceHeightMode ? 500 : undefined,
minimapLaneSpacing: 2,
linearViewOptions: ({
index,
alignmentVisibilityToolOptions
}) => {
const toReturn = {
// tickSpacing: 10,
ignoreYWhenSelecting: true,
linearViewAnnotationVisibilityOverrides: {
...alignmentVisibilityToolOptions.alignmentAnnotationVisibility,
parts: true
}
};
if (index === alignmentRunData.alignmentTracks.length - 1) {
toReturn.linearViewAnnotationVisibilityOverrides.axis = true;
}

return toReturn;
isFullyZoomedOut: this.state.isFullyZoomedOut,
minimapLaneHeight: this.state.setMinimapLaneHeight ? 13 : undefined,
minimapLaneSpacing: this.state.setMinimapLaneSpacing ? 3 : undefined,
alignmentName: this.state.setAlignmentName ? 'Ref Seq Name' : undefined,
noClickDragHandlers: this.state.noClickDragHandlers,
hasTemplate: this.state.hasTemplate,
noVisibilityOptions: this.state.noVisibilityOptions,
linearViewOptions: {
tickSpacing: this.state.setTickSpacing ? 10 : undefined
}
}}
/>
Expand Down
6 changes: 3 additions & 3 deletions demo/src/StandaloneAlignmentDemo.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ import {generateSequenceData} from "ve-sequence-utils";

// import exampleSequenceData from './exampleData/simpleSequenceData';

const exampleAlignmentData = {alignmentTracks: times(100).map(() => {
const exampleAlignmentData = {alignmentTracks: times(10).map(() => {
return {
sequenceData: {
...generateSequenceData(100)
...generateSequenceData(10)
},
alignmentData: {
...generateSequenceData(100)
...generateSequenceData(10)
}
}
})}
Expand Down
27 changes: 25 additions & 2 deletions demo/src/exampleData/alignmentRunData.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
{
"id": "d598e5bd-81fb-42f6-bffe-637bce154680",
"alignmentType": "Multiple Sequence Alignment",
"alignmentTracks": [
{
"sequenceData": {
"id": "0bd61b29-d822-474f-86e1-877c476fb5dc",
"features": [{
"start": 5,
"end": 10,
"name": "7491",
"name": "misc_feature",
"type": "misc_feature",
"id": "5ac3f0a199aae6653c0e7d41",
"forward": true,
Expand All @@ -18,7 +19,7 @@
{
"start": 20,
"end": 35,
"name": "33665",
"name": "misc_feature",
"type": "misc_feature",
"id": "5ac3f0a199aae6653c0e7d42",
"forward": false,
Expand Down Expand Up @@ -48,6 +49,17 @@
"sequenceData": {
"id": "21e4b5e2-af95-4073-9d98-7318e56623c9",
"name": "F05207",
"features": [{
"start": 8,
"end": 25,
"name": "misc_feature",
"type": "misc_feature",
"id": "5ac3f0a199aae6653c0e7d41",
"forward": true,
"notes": {},
"strand": 1,
"color": "#006FEF"
}],
"sequence":
"ATGCATCACCATCATCACCACGGAAGCGGCAGTATGGCAGTTGACTCGCCAGATGAACGCCTCCAGCGTCGTATCGCCCAACTGTTCGCCGAAGATGAACAGGTGAAAGCCGCCCGTCCGTTAGAAGCGGTGAGTGCGGCAGTGAGTGCACCAGGTATGCGTCTGGCACAGATTGCGGCGACTGTGATGGCTGGCTATGCTGATCGTCCCGCAGCGGGTCAGCGGGCGTTTGAACTGAATACCGACGATGCGACGGGTCGTACCAGCCTGCGTTTACTGCCACGCTTTGAAACGATTACCTATCGTGAACTGTGGCAGCGTGTTGGCGAAGTGGCAGCGGCGTGGCATCACGACCCAGAAAACCCGCTGCGTGCTGGCGATTTCGTTGCCCTGCTGGGCTTTACCAGCATTGATTATGCCACCCTGGATTTGGCAGACATTCATCTGGGTGCGGTGACGGTGCCGTTACAGGCGAGTGCGGCAGTGAGCCAGTTGATTGCCATTCTGACCGAAACCAGCCCACGCCTGCTGGCGTCTACCCCAGAACATCTGGATGCGGCAGTGGAATGCCTGCTGGCGGGCACCACGCCAGAACGCCTGGTTGTGTTTGATTACCATCCAGAAGACGATGACCAGCGTGCGGCGTTTGAAAGTGCCCGCCGTCGCTTAGCGGATGCGGGTTCGCTGGTGATTGTGGAAACCCTGGATGCTGTTCGTGCCCGTGGTCGTGACCTGCCCGCTGCTCCGCTGTTTGTGCCAGATACCGATGACGACCCGCTGGCACTTCTGATTTACACCAGCGGCAGCACGGGCACCCCGAAAGGTGCGATGTATACCAACCGCCTGGCGGCAACGATGTGGCAGGGCAACAGTATGCTCCAGGGCAATAGCCAGCGTGTTGGCATCAACCTGAACTACATGCCGATGAGCCACAACGCGGGTCGTGTGAGCCTGTTTGGCGTGTTAGCCCGTGGCGGCACCGCCTATTTTGCCGCTAAATCCGATATGAGCACCCTGTTTGAAGACATCGGTCTGGTGCGTCCGACGGAGATTTTCTTTGTTCCTCGTGTTTGCGATATGGTGTTTCAGCGTTATCAGAGCGAACTGGACCGTCGTAGCGTGGCGGGTGCGGACCTGGATACCCTGGACCGTGAGGTGAAAGCGGATTTACGCCAGAACTACCTGGGCGGTCGTTTTCTGGTAGCGGTTGTGGGCAGTGCCCCGCTGGCGGCAGAAATGAAAACCTTTATGGAAAGCGTGCTGGACCTGCCGCTCCACGATGGCTATGGCAGCACCGAAGCGGGAGCCAGCGTTCTGCTGGATAACCAGATTCAGCGTCCGCCAGTGCTGGATTACAAACTGGTGGATGTGCCTGAACTGGGCTATTTTCGCACGGACCGTCCGCATCCTCGTGGCGAACTGTTGCTGAAAGCGGAAACCACGATTCCTGGCTATTACAAACGCCCAGAAGTGACGGCGGAAATCTTTGATGAAGATGGCTTCTACAAAACGGGCGACATTGTGGCGGAACTGGAACACGACCGCCTGGTGTATGTGGACCGTCGTAACAATGTCCTGAAACTGAGCCAGGGCGAGTTTGTCACCGTTGCCCATCTGGAAGCCGTGTTTGCCAGTAGCCCGCTGATTCGCCAGATTTTCATTTATGGTTCCAGCGAACGCAGTTATCTGCTGGCGGTGATTGTGCCGACTGACGATGCCCTGCGTGGTCGTGATACGGCGACCCTGAAAAGTGCCCTGGCGGAAAGCATTCAGCGTATTGCCAAAGATGCCAACCTCCAGCCGTATGAGATTCCTCGTGATTTCCTGATTGAAACGGAACCGTTTACCATTGCCAACGGTCTGCTGAGCGGCATTGCCAAACTGCTTCGCCCGAACCTGAAAGAACGCTATGGTGCCCAGTTGGAACAGATGTATACCGATTTAGCGACGGGTCAGGCGGATGAACTGCTGGCGTTACGCCGTGAAGCAGCCGACCTGCCAGTGCTGGAAACCGTGAGCCGTGCGGCGAAAGCGATGCTTGGTGTTGCGTCGGCGGATATGCGTCCAGATGCCCATTTCACCGACCTGGGTGGCGATAGCCTGTCTGCCCTGTCGTTTTCCAACCTGTTACACGAAATCTTTGGTGTGGAAGTGCCAGTGGGTGTTGTGGTGAGCCCAGCAAACGAACTGCGTGATTTAGCCAACTACATTGAAGCGGAACGCAACAGCGGTGCGAAACGCCCGACCTTTACCAGCGTTCACGGCGGTGGCAGCGAAATCCGTGCGGCAGACCTGACCCTGGATAAGTTTATTGATGCCCGCACCCTGGCAGCGGCAGACAGCATTCCGCACGCCCCAGTGCCAGCCCAGACCGTTCTGCTGACGGGTGCGAACGGTTATCTGGGTCGTTTTCTGTGCCTGGAATGGCTGGAACGCCTGGATAAAACGGGCGGCACCCTGATTTGTGTTGTCCGTGGCAGCGATGCTGCCGCAGCCCGTAAACGCCTGGATTCGGCGTTTGATAGCGGCGACCCAGGTCTGCTGGAACATTACCAGCAACTGGCGGCTCGCACCCTGGAAGTGCTGGCGGGTGATATCGGTGACCCGAACCTGGGTCTGGATGACGCCACCTGGCAGCGTCTGGCTGAAACCGTTGACCTGATTGTTCACCCCGCAGCACTGGTGAATCATGTGCTGCCTTACACCCAACTGTTTGGTCCGAATGTGGTTGGCACCGCCGAAATCGTGCGTCTGGCGATTACCGCTCGCCGCAAACCTGTCACCTATCTGAGCACCGTTGGCGTAGCGGACCAGGTGGACCCTGCCGAATACCAGGAAGATAGCGATGTGCGTGAAATGTCGGCGGTGCGTGTGGTGCGTGAAAGTTATGCGAACGGCTATGGCAATAGCAAATGGGCGGGTGAAGTGTTGCTGCGTGAAGCCCACGACCTGTGCGGTCTGCCAGTGGCGGTGTTTCGCAGCGATATGATTCTGGCACATAGCCGCTATGCGGGTCAACTGAATGTTCAGGATGTGTTTACCCGCCTGATTCTGAGCCTGGTGGCGACTGGCATTGCCCCGTATTCGTTTTATCGCACCGATGCGGATGGCAACCGTCAGCGTGCCCATTATGACGGTCTGCCAGCGGATTTTACCGCAGCGGCGATTACCGCCCTGGGCATTCAGGCGACGGAAGGCTTTCGCACCTATGATGTGCTGAATCCGTATGACGATGGTATTAGCCTGGATGAGTTTGTGGATTGGCTGGTGGAAAGCGGTCACCCGATTCAGCGTATTACCGATTACAGCGATTGGTTTCATCGCTTTGAAACGGCGATTCGTGCCCTGCCAGAGAAACAGCGTCAGGCGTCGGTGCTGCCGTTGCTGGATGCGTATCGCAACCCGTGCCCAGCGGTTCGTGGTGCGATTCTGCCAGCGAAAGAGTTTCAGGCAGCGGTTCAGACCGCCAAAATCGGTCCAGAACAGGACATTCCGCATCTGTCGGCACCGCTGATTGACAAATATGTGAGCGACCTGGAACTGTTACAACTGCTGTAA"
},
Expand All @@ -69,6 +81,17 @@
"sequenceData": {
"id": "75b4dbaf-1435-4862-9d76-b67bbf6e3cf3",
"name": "F05208",
"features": [{
"start": 2,
"end": 12,
"name": "misc_feature",
"type": "misc_feature",
"id": "5ac3f0a199aae6653c0e7d41",
"forward": true,
"notes": {},
"strand": 1,
"color": "#006FEF"
}],
"sequence":
"ATGCATCACCATCATCACCACGGAAGCGGCAGTATGGCAGTTGACTCGCCAGATGAACGCCTCCAGCGTCGTATCGCCCAACTGTTCGCCGAAGATGAACAGGTGAAAGCCGCCCGTCCGTTAGAAGCGGTGAGTGCGGCAGTGAGTGCACCAGGTATGCGTCTGGCACAGATTGCGGCGACTGTGATGGCTGGCTATGCTGATCGTCCCGCAGCGGGTCAGCGGGCGTTTGAACTGAATACCGACGATGCGACGGGTCGTACCAGCCTGCGTTTACTGCCACGCTTTGAAACGATTACCTATCGTGAACTGTGGCAGCGTGTTGGCGAAGTGGCAGCGGCGTGGCATCACGACCCAGAAAACCCGCTGCGTGCTGGCGATTTCGTTGCCCTGCTGGGCTTTACCAGCATTGATTATGCCACCCTGGATTTGGCAGACATTCATCTGGGTGCGGTGACGGTGCCGTTACAGGCGAGTGCGGCAGTGAGCCAGTTGATTGCCATTCTGACCGAAACCAGCCCACGCCTGCTGGCGTCTACCCCAGAACATCTGGATGCGGCAGTGGAATGCCTGCTGGCGGGCACCACGCCAGAACGCCTGGTTGTGTTTGATTACCATCCAGAAGACGATGACCAGCGTGCGGCGTTTGAAAGTGCCCGCCGTCGCTTAGCGGATGCGGGTTCGCTGGTGATTGTGGAAACCCTGGATGCTGTTCGTGCCCGTGGTCGTGACCTGCCCGCTGCTCCGCTGTTTGTGCCAGATACCGATGACGACCCGCTGGCACTTCTGATTTACACCAGCGGCAGCACGGGCACCCCGAAAGGTGCGATGTATACCAACCGCCTGGCGGCAACGATGTGGCAGGGCAACAGTATGCTCCAGGGCAATAGCCAGCGTGTTGGCATCAACCTGAACTACATGCCGATGAGCCACAATGCGGGTCGTGTGAGCCTGTTTGGCGTGTTAGCCCGTGGCGGCACCGCCTATTTTGCCGCTAAATCCGATATGAGCACCCTGTTTGAAGACATCGGTCTGGTGCGTCCGACGGAGATTTTCTTTGTTCCTCGTGTTTGCGATATGGTGTTTCAGCGTTATCAGAGCGAACTGGACCGTCGTAGCGTGGCGGGTGCGGACCTGGATACCCTGGACCGTGAGGTGAAAGCGGATTTACGCCAGAACTACCTGGGCGGTCGTTTTCTGGTAGCGGTTGTGGGCAGTGCCCCGCTGGCGGCAGAAATGAAAACCTTTATGGAAAGCGTGCTGGACCTGCCGCTCCACGATGGCTATGGCAGCACCGAAGCGGGAAGCAGCGTTCTGCTGGATAACCAGATTCAGCGTCCGCCAGTGCTGGATTACAAACTGGTGGATGTGCCTGAACTGGGCTATTTTCGCACGGACCGTCCGCATCCTCGTGGCGAACTGTTGCTGAAAGCGGAAACCACGATTCCTGGCTATTACAAACGCCCAGAAGTGACGGCGGAAATCTTTGATGAAGATGGCTTCTACAAAACGGGCGACATTGTGGCGGAACTGGAACACGACCGCCTGGTGTATGTGGACCGTCGTAACAATGTCCTGAAACTGAGCCAGGGCGAGTTTGTCACCGTTGCCCATCTGGAAGCCGTGTTTGCCAGTAGCCCGCTGATTCGCCAGATTTTCATTTATGGTTCCAGCGAACGCAGTTATCTGCTGGCGGTGATTGTGCCGACTGACGATGCCCTGCGTGGTCGTGATACGGCGACCCTGAAAAGTGCCCTGGCGGAAAGCATTCAGCGTATTGCCAAAGATGCCAACCTCCAGCCGTATGAGATTCCTCGTGATTTCCTGATTGAAACGGAACCGTTTACCATTGCCAACGGTCTGCTGAGCGGCATTGCCAAACTGCTTCGCCCGAACCTGAAAGAACGCTATGGTGCCCAGTTGGAACAGATGTATACCGATTTAGCGACGGGTCAGGCGGATGAACTGCTGGCGTTACGCCGTGAAGCAGCCGACCTGCCAGTGCTGGAAACCGTGAGCCGTGCGGCGAAAGCGATGCTTGGTGTTGCGTCGGCGGATATGCGTCCAGATGCCCATTTCACCGACCTGGGTGGCGATAGCCTGTCTGCCCTGTCGTTTTCCAACCTGTTACACGAAATCTTTGGTGTGGAAGTGCCAGTGGGTGTTGTGGTGAGCCCAGCAAACGAACTGCGTGATTTAGCCAACTACATTGAAGCGGAACGCAACAGCGGTGCGAAACGCCCGACCTTTACCAGCGTTCACGGCGGTGGCAGCGAAATCCGTGCGGCAGACCTGACCCTGGATAAGTTTATTGATGCCCGCACCCTGGCAGCGGCAGACAGCATTCCGCACGCCCCAGTGCCAGCCCAGACCGTTCTGCTGACGGGTGCGAACGGTTATCTGGGTCGTTTTCTGTGCCTGGAATGGCTGGAACGCCTGGATAAAACGGGCGGCACCCTGATTTGTGTTGTCCGTGGCAGCGATGCTGCCGCAGCCCGTAAACGCCTGGATTCGGCGTTTGATAGCGGCGACCCAGGTCTGCTGGAACATTACCAGCAACTGGCGGCTCGCACCCTGGAAGTGCTGGCGGGTGATATCGGTGACCCGAACCTGGGTCTGGATGACGCCACCTGGCAGCGTCTGGCTGAAACCGTTGACCTGATTGTTCACCCCGCAGCACTGGTGAATCATGTGCTGCCTTACACCCAACTGTTTGGTCCGAATGTGGTTGGCACCGCCGAAATCGTGCGTCTGGCGATTACCGCTCGCCGCAAACCTGTCACCTATCTGAGCACCGTTGGCGTAGCGGACCAGGTGGACCCTGCCGAATACCAGGAAGATAGCGATGTGCGTGAAATGTCGGCGGTGCGTGTGGTGCGTGAAAGTTATGCGAACGGCTATGGCAATAGCAAATGGGCGGGTGAAGTGTTGCTGCGTGAAGCCCACGACCTGTGCGGTCTGCCAGTGGCGGTGTTTCGCAGCGATATGATTCTGGCACATAGCCGCTATGCGGGTCAACTGAATGTTCAGGATGTGTTTACCCGCCTGATTCTGAGCCTGGTGGCGACTGGCATTGCCCCGTATTCGTTTTATCGCACCGATGCGGATGGCAACCGTCAGCGTGCCCATTATGACGGTCTGCCAGCGGATTTTACCGCAGCGGCGATTACCGCCCTGGGCATTCAGGCGACGGAAGGCTTTCGCACCTATGATGTGCTGAATCCGTATGACGATGGTATTAGCCTGGATGAGTTTGTGGATTGGCTGGTGGAAAGCGGTCACCCGATTCAGCGTATTACCGATTACAGCGATTGGTTTCATCGCTTTGAAACGGCGATTCGTGCCCTGCCAGAGAAACAGCGTCAGGCGTCGGTGCTGCCGTTGCTGGATGCGTATCGCAACCCGTGCCCAGCGGTTCGTGGTGCGATTCTGCCAGCGAAAGAGTTTCAGGCAGCGGTTCAGACCGCCAAAATCGGTCCAGAACAGGACATTCCGCATCTGTCGGCACCGCTGATTGACAAATATGTGAGCGACCTGGAACTGTTACAACTGCTGTAA"
},
Expand Down
Loading