├── .github └── workflows │ ├── check_pypi_packaging.yml │ ├── docs-check.yml │ ├── release.yml │ └── run_unit_tests.yml ├── .gitignore ├── CODEOWNERS ├── CONTRIBUTING.md ├── LICENSE.txt ├── MANIFEST ├── README.md ├── doc ├── .gitignore ├── Makefile ├── _static │ └── custom.css ├── compile.sh ├── conf.py ├── index.rst ├── make.bat └── up.sh ├── environment.yml ├── examples ├── .gitignore ├── 16_helix_origami_barrel_from_algoSST_paper.py ├── 16_helix_origami_rectangle.py ├── 16_helix_origami_rectangle_idt.py ├── 16_helix_origami_rectangle_no_seq.py ├── 16_helix_origami_rectangle_no_seq_no_twist.py ├── 16_helix_origami_rectangle_no_twist.py ├── 16_helix_origami_rectangle_seed_tiles_grow_from_top.py ├── 16_helix_origami_rectangle_shifted_seam_no_seq.py ├── 1_staple_1_helix_origami.py ├── 1_staple_1_helix_origami_idt_duplicate_names.py ├── 1_staple_1_helix_origami_mismatches.py ├── 1_staple_1_helix_origami_position_nondefault.py ├── 1_staple_1_helix_origami_roll.py ├── 2_helix_2_strands_multiple_substrands_no_seq.py ├── 2_staple_2_helix_helixgroup_geometry.py ├── 2_staple_2_helix_modifications.py ├── 2_staple_2_helix_origami_6bases_wide.py ├── 2_staple_2_helix_origami_deletions.py ├── 2_staple_2_helix_origami_deletions_insertions.py ├── 2_staple_2_helix_origami_deletions_insertions_labels.py ├── 2_staple_2_helix_origami_deletions_insertions_mods.py ├── 2_staple_2_helix_origami_deletions_insertions_mods_chained_methods.py ├── 2_staple_2_helix_origami_deletions_insertions_new_geometry.py ├── 2_staple_2_helix_origami_deletions_insertions_no_seq.py ├── 3_helix_deletions_insertions.py ├── 4_helix_grid_none.py ├── 4_helix_grid_none_min_offset_position_x_nondefault.py ├── 4_helix_min_offsets_nonzero.py ├── 56_helix_origami_rectangle.py ├── 64_helix_origami_rectangle.py ├── 6_helix_6_col_origami_rectangle.py ├── 6_helix_bundle_honeycomb.py ├── 6_helix_origami_rectangle.py ├── 6_helix_origami_rectangle_helices_out_of_order.py ├── M13_seq_from5588.txt ├── _16-helix-barrel-to-order.json ├── circular.py ├── consecutive_domains.py ├── domain_colors.py ├── draw_strand_move_negative.py ├── empty.py ├── extension_and_loopout_oxdna_export.py ├── extensions.py ├── hairpin.py ├── helices_out_of_order_nonconsecutive.py ├── helix_groups.py ├── hex_lattice_10x10.py ├── hex_lattice_10x10_with_negative.py ├── honeycomb_lattice_10x10.py ├── honeycomb_lattice_10x10_with_negative.py ├── idt-plates-explicit.py ├── idt │ ├── .gitignore │ ├── 16_helix_origami_barrel_from_algoSST_paper.idt │ ├── 16_helix_origami_rectangle.idt │ ├── 16_helix_origami_rectangle_384well.xls │ ├── 16_helix_origami_rectangle_96well.xls │ ├── 16_helix_origami_rectangle_idt.idt │ ├── 16_helix_origami_rectangle_seed_tiles_grow_from_top.idt │ ├── 16_helix_origami_rectangle_seed_tiles_grow_from_top.xls │ ├── 1_staple_1_helix_origami_idt_duplicate_names.idt │ ├── idt-plates-explicit.idt │ └── idt-plates-explicit.xlsx ├── long_range_crossovers.py ├── loopouts_all_types.py ├── many_big_helices.py ├── many_helices_modifications.py ├── names_domains_strands.py ├── output_designs │ ├── .gitignore │ ├── 16_helix_origami_barrel_from_algoSST_paper.sc │ ├── 16_helix_origami_rectangle.sc │ ├── 16_helix_origami_rectangle_idt.sc │ ├── 16_helix_origami_rectangle_no_seq.sc │ ├── 16_helix_origami_rectangle_no_seq_no_twist.sc │ ├── 16_helix_origami_rectangle_no_twist.sc │ ├── 16_helix_origami_rectangle_seed_tiles_grow_from_top.sc │ ├── 16_helix_origami_rectangle_shifted_seam_no_seq.sc │ ├── 1_staple_1_helix_origami.sc │ ├── 1_staple_1_helix_origami_mismatches.sc │ ├── 1_staple_1_helix_origami_position_nondefault.sc │ ├── 1_staple_1_helix_origami_roll.sc │ ├── 2_helix_2_strands_multiple_substrands_no_seq.sc │ ├── 2_staple_2_helix_helixgroup_geometry.sc │ ├── 2_staple_2_helix_modifications.sc │ ├── 2_staple_2_helix_origami_6bases_wide.sc │ ├── 2_staple_2_helix_origami_deletions.sc │ ├── 2_staple_2_helix_origami_deletions_insertions.sc │ ├── 2_staple_2_helix_origami_deletions_insertions_labels.sc │ ├── 2_staple_2_helix_origami_deletions_insertions_mods.sc │ ├── 2_staple_2_helix_origami_deletions_insertions_mods_chained_methods.sc │ ├── 2_staple_2_helix_origami_deletions_insertions_new_geometry.sc │ ├── 2_staple_2_helix_origami_deletions_insertions_no_seq.sc │ ├── 3_helix_deletions_insertions.sc │ ├── 4_helix_grid_none.sc │ ├── 4_helix_grid_none_min_offset_position_x_nondefault.sc │ ├── 4_helix_min_offsets_nonzero.sc │ ├── 56_helix_origami_rectangle.sc │ ├── 64_helix_origami_rectangle.sc │ ├── 6_helix_6_col_origami_rectangle.sc │ ├── 6_helix_bundle_honeycomb.sc │ ├── 6_helix_origami_rectangle.sc │ ├── 6_helix_origami_rectangle_helices_out_of_order.sc │ ├── _error_badly_formatted_file.sc │ ├── _error_empty_file.sc │ ├── _error_json_file_not_a_map.sc │ ├── circular.sc │ ├── consecutive_domains.sc │ ├── domain_colors.sc │ ├── draw_strand_move_negative.sc │ ├── empty.sc │ ├── extension_and_loopout_oxdna_export.sc │ ├── extensions.sc │ ├── hairpin.sc │ ├── helices_out_of_order_nonconsecutive.sc │ ├── helix_groups.sc │ ├── hex_lattice_10x10.sc │ ├── hex_lattice_10x10_with_negative.sc │ ├── honeycomb_lattice_10x10.sc │ ├── honeycomb_lattice_10x10_with_negative.sc │ ├── idt-plates-explicit.sc │ ├── long_range_crossovers.sc │ ├── loopouts_all_types.sc │ ├── many_big_helices.sc │ ├── many_helices_modifications.sc │ ├── names_domains_strands.sc │ ├── oxdna_export_with_pitch.sc │ ├── oxdna_export_with_pitch.zip │ ├── oxdna_export_with_pitch_0.sc │ ├── oxdna_export_with_pitch_45.sc │ ├── proposal.sc │ ├── relax_helix_rolls.sc │ ├── sst-motif-3_2.sc │ ├── sst-motif-4_1.sc │ ├── strand_builder_loop.sc │ └── very_large_origami.sc ├── oxdna │ ├── extension_and_loopout_oxdna_export.dat │ ├── extension_and_loopout_oxdna_export.top │ ├── extensions.dat │ ├── extensions.top │ ├── oxdna_export_with_pitch_0.dat │ ├── oxdna_export_with_pitch_0.top │ ├── oxdna_export_with_pitch_45.dat │ └── oxdna_export_with_pitch_45.top ├── oxdna_export_with_pitch.py ├── proposal.py ├── proposal │ ├── beth.idt │ ├── beth.sc │ ├── beth.xls │ ├── marry.idt │ ├── marry.sc │ ├── marry.xls │ ├── me-square-grid.sc │ ├── me.idt │ ├── me.sc │ ├── me.xls │ ├── will.idt │ ├── will.sc │ ├── will.xls │ ├── yes.idt │ ├── yes.sc │ ├── yes.xls │ ├── yim.idt │ ├── yim.sc │ ├── yim.xls │ ├── you.idt │ ├── you.sc │ └── you.xls ├── relax_helix_rolls.py ├── run_all_examples.py ├── sst-motif-3_2.py ├── sst-motif-4_1.py ├── strand_builder_loop.py ├── tutorial-examples │ ├── 24_helix_rectangle.py │ ├── 24_helix_rectangle.sc │ ├── 24_helix_rectangle.xls │ └── 24_helix_rectangle_manual.sc └── very_large_origami.py ├── fix-index.sh ├── images └── download_raw_screenshot.png ├── misc └── cadnano-format-specs │ ├── honeycomb_coordinates_cadnano.png │ ├── honeycomb_coordinates_cadnano.svg │ └── v2.txt ├── publish_to_pypi.txt ├── pull_request_template.md ├── readthedocs.yml ├── scadnano ├── .gitignore ├── __init__.py ├── modifications.py ├── origami_rectangle.py └── scadnano.py ├── setup.cfg ├── setup.py ├── tests ├── .gitignore ├── __init__.py ├── _jb_unittest_runner.sc ├── design_causes_crash.sc ├── overlapping_strands.py ├── scadnano_tests.py ├── test_excel_export_384.xlsx └── test_excel_export_96.xlsx ├── tests_inputs ├── .gitignore ├── cadnano_v2_export │ ├── test_16_helix_origami_rectangle_no_twist.sc │ ├── test_2_stape_2_helix_origami_deletions_insertions.sc │ ├── test_2_stape_2_helix_origami_extremely_simple.sc │ ├── test_2_stape_2_helix_origami_extremely_simple_2.sc │ ├── test_6_helix_bundle_honeycomb.sc │ ├── test_6_helix_origami_rectangle.sc │ ├── test_big_circular_staples.sc │ ├── test_big_circular_staples_hex.sc │ ├── test_circular_strand.sc │ ├── test_export_design_with_helix_group.sc │ ├── test_export_design_with_helix_group_not_same_grid.sc │ └── test_paranemic_crossover.sc └── cadnano_v2_import │ ├── test_2_stape_2_helix_origami_deletions_insertions.json │ ├── test_32_helix_rectangle.json │ ├── test_Nature09_monolith.json │ ├── test_Science09_prot120_98_v3.json │ ├── test_circular_auto_staple.json │ ├── test_circular_auto_staple_hex.json │ ├── test_crossover_to_same_helix.json │ ├── test_helices_order.json │ ├── test_helices_order2.json │ ├── test_huge_hex.json │ └── test_paranemic_crossover.json └── tutorial ├── images ├── complete_design_no_DNA.png ├── complete_design_with_DNA.png ├── design_no_deletions_no_DNA.png ├── design_with_helices_no_strands.png ├── excel_file.png ├── full_crossover.png ├── half_crossover.png ├── load_file_button.png ├── scaffold_complete.png ├── scaffold_precursor_strands.png ├── staple_precursors.png ├── staple_precursors_with_crossovers.png └── staple_precursors_with_nicks.png └── tutorial.md /.github/workflows/check_pypi_packaging.yml: -------------------------------------------------------------------------------- 1 | name: "Check PyPI Packaging" 2 | 3 | on: 4 | pull_request: 5 | 6 | jobs: 7 | check_pypi_packaging: 8 | runs-on: "ubuntu-latest" 9 | 10 | steps: 11 | - uses: actions/checkout@v2 12 | - name: Set up Python 13 | uses: actions/setup-python@v2 14 | with: 15 | python-version: '3.x' 16 | - name: Install dependencies 17 | run: | 18 | python -m pip install --upgrade pip 19 | pip install setuptools wheel 20 | - name: Build 21 | run: python setup.py sdist bdist_wheel 22 | -------------------------------------------------------------------------------- /.github/workflows/docs-check.yml: -------------------------------------------------------------------------------- 1 | name: "Docs Check" 2 | on: pull_request 3 | 4 | jobs: 5 | docs: 6 | runs-on: ubuntu-latest 7 | steps: 8 | - uses: actions/checkout@v2.3.4 9 | - name: Set up Python 10 | uses: actions/setup-python@v2 11 | with: 12 | python-version: '3.x' 13 | - name: Install Sphinx 14 | run: | 15 | python -m pip install --upgrade pip 16 | pip install sphinx sphinx_rtd_theme openpyxl 17 | - name: Move to docs folder and build 18 | run: | 19 | cd doc 20 | pwd 21 | sphinx-build -T -E -W -b html . _build 22 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: "release" 2 | 3 | on: 4 | push: 5 | branches: 6 | - "main" 7 | 8 | jobs: 9 | release: 10 | name: "Release" 11 | runs-on: "ubuntu-latest" 12 | permissions: 13 | # Required for trusted publishing to PyPI 14 | id-token: write 15 | contents: write 16 | 17 | steps: 18 | # ... 19 | - name: "Build & test" 20 | run: | 21 | echo "done!" 22 | - uses: "marvinpinto/action-automatic-releases@latest" 23 | with: 24 | repo_token: "${{ secrets.GITHUB_TOKEN }}" 25 | automatic_release_tag: "current" 26 | prerelease: false 27 | title: "Development Build [TODO: Replace label and number with version number]" 28 | files: | 29 | LICENSE.txt 30 | 31 | # Publish to PyPI using Trusted Publishers 32 | - uses: actions/checkout@v3 33 | - name: Set up Python 34 | uses: actions/setup-python@v4 35 | with: 36 | python-version: '3.x' 37 | - name: Install dependencies 38 | run: | 39 | python -m pip install --upgrade pip 40 | pip install build 41 | - name: Build package 42 | run: python -m build 43 | - name: Publish to PyPI 44 | uses: pypa/gh-action-pypi-publish@release/v1 -------------------------------------------------------------------------------- /.github/workflows/run_unit_tests.yml: -------------------------------------------------------------------------------- 1 | name: Run Unit Tests 2 | 3 | on: pull_request 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | strategy: 10 | matrix: 11 | python-version: [ "3.9", "3.10", "3.11", "3.12", "3.13" ] 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Set up Python ${{ matrix.python-version }} 16 | uses: actions/setup-python@v1 17 | with: 18 | python-version: ${{ matrix.python-version }} 19 | - name: Setup conda 20 | uses: s-weigand/setup-conda@v1 21 | with: 22 | activate-conda: true 23 | - name: Install openpyxl,tabulate with conda 24 | run: conda install openpyxl=3.1 tabulate=0.9 25 | - name: Install docutils with conda 26 | run: conda install docutils=0.18 27 | - name: Test with unittest 28 | run: python -m unittest -v tests/scadnano_tests.py 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.DS_Store 2 | *.pyc 3 | __pyache__/* 4 | /venv/ 5 | /.idea/ 6 | /other/ 7 | /__pycache__/ 8 | *.egg-info 9 | /scadnano.zip 10 | .pypirc 11 | tests/tests_outputs/ 12 | tests/tests_outputs/cadnano_v2_export/* 13 | tests/tests_outputs/cadnano_v2_export/test_16_helix_origami_rectangle_no_twist.dna 14 | tests/tests_outputs/cadnano_v2_export/test_16_helix_origami_rectangle_no_twist.json 15 | tests/tests_outputs/cadnano_v2_export/test_2_stape_2_helix_origami_deletions_insertions.dna 16 | tests/tests_outputs/cadnano_v2_export/test_2_stape_2_helix_origami_deletions_insertions.json 17 | tests/tests_outputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple.dna 18 | tests/tests_outputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple.json 19 | tests/tests_outputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple_2.dna 20 | tests/tests_outputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple_2.json 21 | tests/tests_outputs/cadnano_v2_export/test_6_helix_origami_rectangle.dna 22 | tests/tests_outputs/cadnano_v2_export/test_6_helix_origami_rectangle.json 23 | examples/run_all_examples.xls 24 | __pycache__/ 25 | tests_outputs/ 26 | .vscode/ 27 | dist/ 28 | .mypy_cache/ 29 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @dave-doty 2 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | Copyright (c) 2020 David Doty 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | The above copyright notice and this permission notice shall be included in all 10 | copies or substantial portions of the Software. 11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 12 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 13 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 14 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 15 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 16 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 17 | SOFTWARE. -------------------------------------------------------------------------------- /MANIFEST: -------------------------------------------------------------------------------- 1 | # file GENERATED by distutils, do NOT edit 2 | setup.cfg 3 | setup.py 4 | scadnano\__init__.py 5 | scadnano\modifications.py 6 | scadnano\origami_rectangle.py 7 | scadnano\scadnano.py 8 | -------------------------------------------------------------------------------- /doc/.gitignore: -------------------------------------------------------------------------------- 1 | /_build/ 2 | /_templates/ 3 | /ascii-scaffold-and-staples-two-bases-per-character.txt 4 | -------------------------------------------------------------------------------- /doc/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /doc/_static/custom.css: -------------------------------------------------------------------------------- 1 | /* Remove page margins and use full width */ 2 | div.document { 3 | width: 100% !important; 4 | margin: 0 !important; 5 | padding: 0 !important; 6 | } 7 | 8 | /* Fix for the whitespace at the top of the page */ 9 | body { 10 | margin: 0 !important; 11 | padding: 0 !important; 12 | } 13 | 14 | div.documentwrapper { 15 | margin: 0 !important; 16 | padding: 0 !important; 17 | } 18 | 19 | div.body { 20 | margin: 0 !important; 21 | padding: 20px !important; 22 | max-width: none !important; 23 | min-width: auto !important; 24 | } 25 | 26 | /* Configure sidebar to be fixed with its own scrollbar */ 27 | div.sphinxsidebar { 28 | max-height: 100vh; /* Use viewport height */ 29 | position: fixed; /* Make it stick when scrolling */ 30 | top: 0; /* Stick to top */ 31 | overflow-y: auto; /* Enable vertical scrolling */ 32 | width: 300px !important; /* Set sidebar width */ 33 | box-sizing: border-box; /* Include padding in width calculation */ 34 | padding: 20px 10px; /* Add padding */ 35 | margin: 0 !important; /* Remove margin */ 36 | } 37 | 38 | /* Make sure content properly adjusts to sidebar */ 39 | div.bodywrapper { 40 | margin-left: 300px !important; /* Should match sidebar width */ 41 | padding: 0 !important; 42 | } 43 | 44 | /* Add proper mobile responsiveness */ 45 | @media screen and (max-width: 768px) { 46 | div.sphinxsidebar { 47 | position: relative; 48 | width: 100% !important; 49 | max-height: none; 50 | } 51 | 52 | div.bodywrapper { 53 | margin-left: 0 !important; 54 | } 55 | } -------------------------------------------------------------------------------- /doc/compile.sh: -------------------------------------------------------------------------------- 1 | make html -------------------------------------------------------------------------------- /doc/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # http://www.sphinx-doc.org/en/master/config 6 | 7 | # -- Path setup -------------------------------------------------------------- 8 | 9 | # If extensions (or modules to document with autodoc) are in another directory, 10 | # add these directories to sys.path here. If the directory is relative to the 11 | # documentation root, use os.path.abspath to make it absolute, like shown here. 12 | # 13 | 14 | import sphinx.util.inspect as inspect 15 | import sphinx.ext.autodoc as auto 16 | import os 17 | import sys 18 | 19 | 20 | 21 | sys.path.insert(0, os.path.abspath('../scadnano')) 22 | # print(sys.path) 23 | 24 | # this is ugly, but appears to be standard practice: 25 | # https://stackoverflow.com/questions/17583443/what-is-the-correct-way-to-share-package-version-with-setup-py-and-the-package/17626524#17626524 26 | def extract_version(filename: str): 27 | with open(filename) as f: 28 | lines = f.readlines() 29 | version_comment = '# version line; WARNING: do not remove or change this line or comment' 30 | for line in lines: 31 | if version_comment in line: 32 | idx = line.index(version_comment) 33 | line_prefix = line[:idx] 34 | parts = line_prefix.split('=') 35 | stripped_parts = [part.strip() for part in parts] 36 | version_str = stripped_parts[-1].replace('"', '') 37 | return version_str 38 | raise AssertionError(f'could not find version in {filename}') 39 | 40 | __version__ = extract_version('../scadnano/scadnano.py') 41 | 42 | 43 | # Type "make html" at the command line to generate the documentation. 44 | 45 | 46 | # -- Project information ----------------------------------------------------- 47 | 48 | project = 'scadnano' 49 | copyright = '2019, David Doty' 50 | author = 'David Doty' 51 | 52 | # The full version, including alpha/beta/rc tags 53 | # release = '0.7.0' 54 | version = __version__ 55 | release = __version__ 56 | 57 | # -- General configuration --------------------------------------------------- 58 | 59 | # Add any Sphinx extension module names here, as strings. They can be 60 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 61 | # ones. 62 | extensions = [ 63 | 'sphinx.ext.autodoc', 64 | 'sphinx.ext.viewcode', 65 | # 'sphinx.ext.napoleon', 66 | ] 67 | 68 | # next line puts type of each function parameter next to description of parameter 69 | autodoc_typehints = "description" 70 | 71 | # Add any paths that contain templates here, relative to this directory. 72 | templates_path = ['_templates'] 73 | 74 | # List of patterns, relative to source directory, that match files and 75 | # directories to ignore when looking for source files. 76 | # This pattern also affects html_static_path and html_extra_path. 77 | exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] 78 | 79 | # -- Options for HTML output ------------------------------------------------- 80 | 81 | # The theme to use for HTML and HTML Help pages. See the documentation for 82 | # a list of builtin themes. 83 | 84 | # html_theme = "pyramid" 85 | # html_theme = "sphinx_rtd_theme" 86 | html_theme = 'alabaster' 87 | # html_theme = "classic" 88 | 89 | # Alabaster theme options 90 | html_theme_options = { 91 | 'page_width': '100%', # Use full width of browser 92 | 'body_max_width': 'none', # No maximum width constraint 93 | 'sidebar_width': '300px', # Set sidebar width to 300px (adjust as needed) 94 | 'fixed_sidebar': True # Make sidebar fixed with separate scrolling 95 | } 96 | 97 | 98 | # Add any paths that contain custom static files (such as style sheets) here, 99 | # relative to this directory. They are copied after the builtin static files, 100 | # so a file named "default.css" will overwrite the builtin "default.css". 101 | html_static_path = ['_static'] 102 | html_css_files = ['custom.css'] 103 | 104 | html_sidebars = { 105 | '**': [ 106 | 'globaltoc.html', # Global table of contents 107 | 'localtoc.html', # Local page table of contents 108 | 'searchbox.html', # Search box 109 | 'sourcelink.html' # Link to source 110 | ] 111 | } 112 | 113 | # use order in source rather than alphabetical order 114 | # autodoc_member_order = 'bysource' 115 | autodoc_member_order = 'alphabetical' 116 | 117 | # intersphinx_mapping = {'python': ('https://docs.python.org/3', None)} 118 | 119 | # removes constant values from documentation that are longer than 100 characters. 120 | # taken from 121 | # https://stackoverflow.com/questions/25145817/ellipsis-truncation-on-module-attribute-value-in-sphinx-generated-documentatio/25163963#25163963 122 | 123 | 124 | # from sphinx.ext.autodoc import DataDocumenter, ModuleLevelDocumenter, SUPPRESS 125 | # from sphinx.util.inspect import safe_repr 126 | 127 | length_limit = 50 128 | 129 | 130 | def add_directive_header(self, sig): 131 | auto.ModuleLevelDocumenter.add_directive_header(self, sig) 132 | if not self.options.annotation: 133 | try: 134 | # objrepr = inspect.safe_repr(self.object) 135 | objrepr = inspect.object_description(self.object) 136 | 137 | # PATCH: truncate the value if longer than length_limit characters 138 | if len(objrepr) > length_limit: 139 | objrepr = objrepr[:length_limit] + "..." 140 | 141 | except ValueError: 142 | pass 143 | else: 144 | self.add_line(u' :annotation: = ' + objrepr, '') 145 | elif self.options.annotation is auto.SUPPRESS: 146 | pass 147 | else: 148 | self.add_line(u' :annotation: %s' % self.options.annotation, 149 | '') 150 | 151 | 152 | auto.DataDocumenter.add_directive_header = add_directive_header 153 | 154 | 155 | # https://stackoverflow.com/questions/56336234/build-fail-sphinx-error-contents-rst-not-found 156 | master_doc = 'index' 157 | -------------------------------------------------------------------------------- /doc/index.rst: -------------------------------------------------------------------------------- 1 | .. scadnano documentation master file, created by 2 | sphinx-quickstart on Tue Jul 16 10:14:04 2019. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | scadnano documentation 7 | ==================================== 8 | 9 | .. toctree:: 10 | :maxdepth: 2 11 | :caption: Contents: 12 | 13 | scadnano 14 | ===================== 15 | .. automodule:: scadnano 16 | :members: 17 | 18 | origami_rectangle 19 | ===================== 20 | .. automodule:: origami_rectangle 21 | :members: 22 | 23 | Interoperability - cadnano v2 24 | ============================= 25 | 26 | Scadnano provides function to convert design to and from cadnano v2: 27 | 28 | * :py:meth:`scadnano.DNADesign.from_cadnano_v2` will create a scadnano DNADesign from a ``cadnanov2`` json file. 29 | * :py:meth:`scadnano.DNADesign.export_cadnano_v2` will produce a ``cadnanov2`` json file from a scadnano design. 30 | 31 | **Important** 32 | 33 | All ``cadnanov2`` designs can be imported to scadnano. However **not all scadnano designs can be imported 34 | to cadnanov2**, to be importable to ``cadnanov2`` a scadnano design need to comply with the following points: 35 | 36 | * The design cannot feature any :py:class:`Loopout` as it is not a concept that exists in ``cadnanov2``. 37 | * Following ``cadnanov2`` conventions, helices with **even** number must have their scaffold going **forward** and helices with **odd** number **backward**. 38 | 39 | Also note that maximum helices offsets can be altered in a ``scadnano`` to ``cadnanov2`` conversion as ``cadnanov2`` needs max offsets to be a multiple of 21 in the hex grid and 32 in the rectangular grid. 40 | The conversion algorithm will choose the lowest multiple of 21 or 32 which fits the entire design. 41 | 42 | The ``cadnanov2`` json format does not embed sequences hence they will be lost after conversion. 43 | 44 | Indices and tables 45 | ================== 46 | 47 | * :ref:`genindex` 48 | * :ref:`modindex` 49 | * :ref:`search` 50 | 51 | 52 | .. |br| raw:: html 53 | 54 |
55 | 56 | -------------------------------------------------------------------------------- /doc/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /doc/up.sh: -------------------------------------------------------------------------------- 1 | source ../../scadnano/define_root_dir.sh 2 | 3 | ROOT_DIR_ORIG="doty@set.cs.ucdavis.edu:public_html/scadnano" 4 | DOC_SUBDIR="docs/" 5 | DOC_DIR="$ROOT_DIR/$DOC_SUBDIR" 6 | DOC_DIR_ORIG="$ROOT_DIR_ORIG/$DOC_SUBDIR" 7 | 8 | echo Assuming root directory of website is $ROOT_DIR 9 | echo "uploading index.html to $DOC_DIR" 10 | 11 | # upload this first since it is the main document and is fast 12 | scp _build/html/index.html $DOC_DIR 13 | 14 | #echo "uploading index.html to $DOC_DIR_ORIG" 15 | #scp _build/html/index.html $DOC_DIR_ORIG 16 | 17 | echo "now uploading the rest to $DOC_DIR" 18 | 19 | # now upload everything else 20 | scp -r _build/html/* $DOC_DIR 21 | #scp -r _build/html/* $DOC_DIR_ORIG -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | # name: base 2 | name: scadnano-test 3 | channels: 4 | - defaults 5 | dependencies: 6 | - python=3.9 7 | - pip 8 | - pip: 9 | - sphinx 10 | - alabaster 11 | - openpyxl -------------------------------------------------------------------------------- /examples/.gitignore: -------------------------------------------------------------------------------- 1 | /venv/ 2 | /.idea/ 3 | /doc/ 4 | /other/ 5 | /__pycache__/ 6 | /tests/overlapping_strands.py 7 | /seed_sst.py 8 | /16_helix_origami_barrel_from_algoSST_paper-rotator.py 9 | /2_staple_2_helix_origami_deletions_lots_of_insertions.py 10 | /no_git/ 11 | -------------------------------------------------------------------------------- /examples/16_helix_origami_rectangle.py: -------------------------------------------------------------------------------- 1 | import origami_rectangle as rect 2 | import scadnano as sc 3 | 4 | 5 | def create_design() -> sc.Design: 6 | return rect.create(num_helices=16, num_cols=26) 7 | 8 | 9 | if __name__ == '__main__': 10 | design = create_design() 11 | design.write_scadnano_file(directory='output_designs') 12 | -------------------------------------------------------------------------------- /examples/16_helix_origami_rectangle_idt.py: -------------------------------------------------------------------------------- 1 | import origami_rectangle as rect 2 | import scadnano as sc 3 | 4 | 5 | def create_design() -> sc.Design: 6 | return rect.create(num_helices=16, num_cols=26) 7 | 8 | 9 | if __name__ == '__main__': 10 | design = create_design() 11 | design.write_scadnano_file(directory='output_designs') 12 | design.write_idt_bulk_input_file(directory='idt') 13 | design.write_idt_plate_excel_file(directory='idt', filename='16_helix_origami_rectangle_96well.xls', 14 | use_default_plates=True, plate_type=sc.PlateType.wells96) 15 | design.write_idt_plate_excel_file(directory='idt', filename='16_helix_origami_rectangle_384well.xls', 16 | use_default_plates=True, plate_type=sc.PlateType.wells384) 17 | -------------------------------------------------------------------------------- /examples/16_helix_origami_rectangle_no_seq.py: -------------------------------------------------------------------------------- 1 | import origami_rectangle as rect 2 | import scadnano as sc 3 | 4 | 5 | def create_design() -> sc.Design: 6 | return rect.create(num_helices=16, num_cols=26, assign_seq=False) 7 | 8 | 9 | if __name__ == '__main__': 10 | design = create_design() 11 | design.write_scadnano_file(directory='output_designs') 12 | -------------------------------------------------------------------------------- /examples/16_helix_origami_rectangle_no_seq_no_twist.py: -------------------------------------------------------------------------------- 1 | import origami_rectangle as rect 2 | import scadnano as sc 3 | 4 | 5 | def create_design() -> sc.Design: 6 | return rect.create(num_helices=16, num_cols=26, assign_seq=False, twist_correction_deletion_spacing=3, 7 | twist_correction_start_col=2) 8 | 9 | 10 | if __name__ == '__main__': 11 | design = create_design() 12 | design.write_scadnano_file(directory='output_designs') 13 | -------------------------------------------------------------------------------- /examples/16_helix_origami_rectangle_no_twist.py: -------------------------------------------------------------------------------- 1 | import origami_rectangle as rect 2 | import scadnano as sc 3 | 4 | 5 | def create_design() -> sc.Design: 6 | return rect.create(num_helices=16, num_cols=26, assign_seq=True, twist_correction_deletion_spacing=3) 7 | 8 | 9 | if __name__ == '__main__': 10 | design = create_design() 11 | design.write_scadnano_file(directory='output_designs') 12 | -------------------------------------------------------------------------------- /examples/16_helix_origami_rectangle_shifted_seam_no_seq.py: -------------------------------------------------------------------------------- 1 | import origami_rectangle as rect 2 | import scadnano as sc 3 | 4 | 5 | def create_design() -> sc.Design: 6 | return rect.create(num_helices=16, num_cols=26, assign_seq=False, seam_left_column=2) 7 | 8 | 9 | if __name__ == '__main__': 10 | design = create_design() 11 | design.write_scadnano_file(directory='output_designs') 12 | -------------------------------------------------------------------------------- /examples/1_staple_1_helix_origami.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | def create_design() -> sc.Design: 4 | length = 9 5 | helices = [sc.Helix(max_offset=length, major_ticks=[2, 5])] 6 | stap_ss = sc.Domain(0, True, 0, length) 7 | scaf_ss = sc.Domain(0, False, 0, length) 8 | stap = sc.Strand([stap_ss]) 9 | scaf = sc.Strand([scaf_ss], color=sc.default_scaffold_color) 10 | strands = [stap, scaf] 11 | design = sc.Design(helices=helices, strands=strands, grid=sc.square) 12 | design.assign_dna(scaf, 'AACT' * (length // 4)) 13 | 14 | return design 15 | 16 | if __name__ == '__main__': 17 | d = create_design() 18 | d.write_scadnano_file(directory='output_designs') 19 | -------------------------------------------------------------------------------- /examples/1_staple_1_helix_origami_idt_duplicate_names.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | ss1_r = sc.Domain(0, True, 0, 4) 6 | ss2_r = sc.Domain(0, True, 4, 8) 7 | ss3_r = sc.Domain(0, True, 8, 12) 8 | ss_l = sc.Domain(0, False, 0, 12) 9 | 10 | s1_r = sc.Strand([ss1_r], vendor_fields=sc.VendorFields(), name='s1_r') 11 | s2_r = sc.Strand([ss2_r], vendor_fields=sc.VendorFields(), name='s1_r') 12 | s3_r = sc.Strand([ss3_r], vendor_fields=sc.VendorFields(), name='s1_r') 13 | s_l = sc.Strand([ss_l], vendor_fields=sc.VendorFields(), name='s_l') 14 | 15 | strands = [s1_r, s2_r, s3_r, s_l] 16 | 17 | design = sc.Design(strands=strands, grid=sc.square) 18 | 19 | design.assign_dna(s_l, 'AGTT' * 3) 20 | 21 | return design 22 | 23 | 24 | if __name__ == '__main__': 25 | d = create_design() 26 | d.write_idt_bulk_input_file(directory='idt') 27 | -------------------------------------------------------------------------------- /examples/1_staple_1_helix_origami_mismatches.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | length = 10 6 | stap_ss = sc.Domain(0, True, 0, length) 7 | scaf_ss = sc.Domain(0, False, 0, length) 8 | stap = sc.Strand([stap_ss]) 9 | scaf = sc.Strand([scaf_ss], color=sc.default_scaffold_color) 10 | strands = [stap, scaf] 11 | design = sc.Design(strands=strands, grid=sc.square) 12 | insertion_length = 4 13 | design.add_insertion(helix=0, offset=2, length=insertion_length) 14 | design.add_insertion(helix=0, offset=8, length=insertion_length) 15 | scaf.set_dna_sequence('AG' + 'A' * (length + 2*insertion_length - 2)) 16 | stap.set_dna_sequence('ATTCTCTTGCTTTTTTCA') 17 | 18 | return design 19 | 20 | 21 | if __name__ == '__main__': 22 | d = create_design() 23 | d.write_scadnano_file(directory='output_designs') 24 | -------------------------------------------------------------------------------- /examples/1_staple_1_helix_origami_position_nondefault.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | length = 9 6 | pitch90_group = sc.HelixGroup(pitch=90) 7 | helices = [ 8 | sc.Helix(max_offset=length, major_ticks=[2, 5], position=sc.Position3D(x=1, y=2, z=3), group='pitch90')] 9 | stap_ss = sc.Domain(0, True, 0, length) 10 | scaf_ss = sc.Domain(0, False, 0, length) 11 | stap = sc.Strand([stap_ss]) 12 | scaf = sc.Strand([scaf_ss], color=sc.default_scaffold_color) 13 | strands = [stap, scaf] 14 | design = sc.Design(helices=helices, groups={ 15 | 'pitch90': pitch90_group}, strands=strands) 16 | design.assign_dna(scaf, 'AACT' * (length // 4)) 17 | 18 | return design 19 | 20 | 21 | if __name__ == '__main__': 22 | d = create_design() 23 | d.write_scadnano_file(directory='output_designs') 24 | -------------------------------------------------------------------------------- /examples/1_staple_1_helix_origami_roll.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | def create_design() -> sc.Design: 4 | length = 9 5 | helices = [sc.Helix(max_offset=length, roll=90)] 6 | stap_ss = sc.Domain(0, True, 0, length) 7 | scaf_ss = sc.Domain(0, False, 0, length) 8 | stap = sc.Strand([stap_ss]) 9 | scaf = sc.Strand([scaf_ss], color=sc.default_scaffold_color) 10 | strands = [stap, scaf] 11 | design = sc.Design(helices=helices, strands=strands, grid=sc.square) 12 | design.assign_dna(scaf, 'AACT' * (length // 4)) 13 | 14 | return design 15 | 16 | if __name__ == '__main__': 17 | d = create_design() 18 | d.write_scadnano_file(directory='output_designs') 19 | -------------------------------------------------------------------------------- /examples/2_helix_2_strands_multiple_substrands_no_seq.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | # If running in scadnano, define a function called main() that returns design. 5 | # It will be displayed in the browser by scadnano. 6 | def create_design() -> sc.Design: 7 | # multiple-domain 8 | ss0_1 = sc.Domain(helix=0, forward=False, start=0, end=4) 9 | ss1 = sc.Domain(helix=1, forward=True, start=0, end=8) 10 | ss0_2 = sc.Domain(helix=0, forward=False, start=4, end=8) 11 | strand_multi = sc.Strand(domains=[ss0_1, ss1, ss0_2]) 12 | 13 | # single domain 14 | ss0_single = sc.Domain(helix=0, forward=True, start=0, end=8) 15 | strand_single = sc.Strand(domains=[ss0_single]) 16 | 17 | # whole design 18 | design = sc.Design(strands=[strand_multi, strand_single], grid=sc.square) 19 | 20 | return design 21 | 22 | 23 | # If running from the command line, call main() manually and write design to scadnano file. 24 | if __name__ == '__main__': 25 | d = create_design() 26 | d.write_scadnano_file(directory='output_designs') 27 | -------------------------------------------------------------------------------- /examples/2_staple_2_helix_helixgroup_geometry.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | group0 = sc.HelixGroup(grid=sc.square) 6 | group1 = sc.HelixGroup(grid=sc.square, geometry=sc.Geometry(bases_per_turn=18), 7 | position=sc.Position3D(0, 3, 0)) 8 | groups = {"group 0": group0, "group 1": group1} 9 | helices = [sc.Helix(idx=idx, max_offset=40, group=group) for idx, group in 10 | [(0, "group 0"), (1, "group 1")]] 11 | design = sc.Design(helices=helices, groups=groups, strands=[]) 12 | design.draw_strand(0, 0).move(40) 13 | design.draw_strand(0, 40).move(-40) 14 | design.draw_strand(1, 0).move(40) 15 | design.draw_strand(1, 40).move(-40) 16 | 17 | return design 18 | 19 | 20 | if __name__ == '__main__': 21 | d = create_design() 22 | d.write_scadnano_file(directory='output_designs') 23 | d.from_scadnano_file('output_designs/2_staple_2_helix_helixgroup_geometry.sc') 24 | print(f'design: {d.to_json()}') 25 | -------------------------------------------------------------------------------- /examples/2_staple_2_helix_modifications.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | import modifications as mod 3 | import dataclasses 4 | 5 | def create_design() -> sc.Design: 6 | stap_left_ss1 = sc.Domain(1, True, 0, 16) 7 | stap_left_ss0 = sc.Domain(0, False, 0, 16) 8 | stap_right_ss0 = sc.Domain(0, False, 16, 32) 9 | stap_right_ss1 = sc.Domain(1, True, 16, 32) 10 | scaf_ss1_left = sc.Domain(1, False, 0, 16) 11 | scaf_ss0 = sc.Domain(0, True, 0, 32) 12 | scaf_ss1_right = sc.Domain(1, False, 16, 32) 13 | stap_left = sc.Strand([stap_left_ss1, stap_left_ss0]) 14 | stap_right = sc.Strand([stap_right_ss0, stap_right_ss1]) 15 | scaf = sc.Strand([scaf_ss1_left, scaf_ss0, scaf_ss1_right], color=sc.default_scaffold_color) 16 | strands = [scaf, stap_left, stap_right] 17 | design = sc.Design(strands=strands, grid=sc.square) 18 | design.add_deletion(helix=0, offset=11) 19 | design.add_deletion(helix=0, offset=12) 20 | design.add_deletion(helix=0, offset=24) 21 | design.add_deletion(helix=1, offset=12) 22 | design.add_deletion(helix=1, offset=24) 23 | design.add_insertion(helix=0, offset=29, length=1) 24 | design.add_insertion(helix=1, offset=2, length=1) 25 | design.assign_dna(scaf, 'AACT' * 16) 26 | 27 | # biotin_mod_5p = dataclasses.replace(mod.biotin_5p, font_size=30) 28 | # cy3_mod_3p = dataclasses.replace(mod.cy3_3p, font_size=30) 29 | 30 | stap_left.set_modification_5p(mod.biotin_5p) 31 | stap_left.set_modification_3p(mod.cy3_3p) 32 | stap_left.set_modification_internal(9, mod.cy3_int) 33 | stap_left.set_modification_internal(10, mod.biotin_int) 34 | stap_left.set_modification_internal(11, mod.cy3_int) 35 | stap_left.set_modification_internal(12, mod.cy5_int) 36 | stap_left.set_modification_internal(4, mod.cy3_int) 37 | stap_left.set_modification_internal(26, mod.cy5_int) 38 | 39 | stap_right.set_modification_5p(mod.cy5_5p) 40 | stap_right.set_modification_internal(5, mod.cy3_int) 41 | stap_right.set_modification_3p(mod.biotin_3p) 42 | 43 | scaf.set_modification_5p(mod.biotin_5p) 44 | scaf.set_modification_3p(mod.cy3_3p) 45 | scaf.set_modification_internal(5, mod.cy5_int) 46 | scaf.set_modification_internal(32, mod.cy3_int) 47 | 48 | return design 49 | 50 | 51 | if __name__ == '__main__': 52 | d = create_design() 53 | d.write_scadnano_file(directory='output_designs') 54 | -------------------------------------------------------------------------------- /examples/2_staple_2_helix_origami_6bases_wide.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | def create_design() -> sc.Design: 4 | width = 6 5 | width_h = width // 2 6 | stap_left_ss1 = sc.Domain(1, True, 0, width_h) 7 | stap_left_ss0 = sc.Domain(0, False, 0, width_h) 8 | stap_right_ss0 = sc.Domain(0, False, width_h, width) 9 | stap_right_ss1 = sc.Domain(1, True, width_h, width) 10 | scaf_ss1_left = sc.Domain(1, False, 0, width_h) 11 | scaf_ss0 = sc.Domain(0, True, 0, width) 12 | scaf_ss1_right = sc.Domain(1, False, width_h, width) 13 | stap_left = sc.Strand([stap_left_ss1, stap_left_ss0]) 14 | stap_right = sc.Strand([stap_right_ss0, stap_right_ss1]) 15 | scaf = sc.Strand([scaf_ss1_left, scaf_ss0, scaf_ss1_right], color=sc.default_scaffold_color) 16 | strands = [stap_left, stap_right, scaf] 17 | design = sc.Design(strands=strands, grid=sc.square) 18 | design.add_deletion(helix=0, offset=1) 19 | design.add_deletion(helix=0, offset=4) 20 | design.add_deletion(helix=1, offset=1) 21 | design.add_deletion(helix=1, offset=4) 22 | design.assign_dna(scaf, 'AACATCGT') 23 | 24 | return design 25 | 26 | 27 | if __name__ == '__main__': 28 | d = create_design() 29 | d.write_scadnano_file(directory='output_designs') 30 | -------------------------------------------------------------------------------- /examples/2_staple_2_helix_origami_deletions.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | stap_left_ss1 = sc.Domain(1, True, 0, 16) 6 | stap_left_ss0 = sc.Domain(0, False, 0, 16) 7 | stap_right_ss0 = sc.Domain(0, False, 16, 32) 8 | stap_right_ss1 = sc.Domain(1, True, 16, 32) 9 | scaf_ss1_left = sc.Domain(1, False, 0, 16) 10 | scaf_ss0 = sc.Domain(0, True, 0, 32) 11 | scaf_ss1_right = sc.Domain(1, False, 16, 32) 12 | stap_left = sc.Strand([stap_left_ss1, stap_left_ss0]) 13 | stap_right = sc.Strand([stap_right_ss0, stap_right_ss1]) 14 | scaf = sc.Strand([scaf_ss1_left, scaf_ss0, scaf_ss1_right], color=sc.default_scaffold_color) 15 | strands = [stap_left, stap_right, scaf] 16 | design = sc.Design(strands=strands, grid=sc.square) 17 | design.add_deletion(helix=0, offset=11) 18 | design.add_deletion(helix=0, offset=12) 19 | design.add_deletion(helix=0, offset=24) 20 | design.add_deletion(helix=1, offset=12) 21 | design.add_deletion(helix=1, offset=24) 22 | design.assign_dna(scaf, 'AACT' * 16) 23 | 24 | return design 25 | 26 | 27 | if __name__ == '__main__': 28 | d = create_design() 29 | d.write_scadnano_file(directory='output_designs') 30 | -------------------------------------------------------------------------------- /examples/2_staple_2_helix_origami_deletions_insertions.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | # helices 6 | helices = [sc.Helix(max_offset=48), sc.Helix(max_offset=48)] 7 | 8 | # left staple 9 | stap_left_ss1 = sc.Domain(helix=1, forward=True, start=8, end=24) 10 | stap_left_ss0 = sc.Domain(helix=0, forward=False, start=8, end=24) 11 | stap_left = sc.Strand(domains=[stap_left_ss1, stap_left_ss0]) 12 | 13 | # right staple 14 | stap_right_ss0 = sc.Domain(helix=0, forward=False, start=24, end=40) 15 | stap_right_ss1 = sc.Domain(helix=1, forward=True, start=24, end=40) 16 | stap_right = sc.Strand(domains=[stap_right_ss0, stap_right_ss1]) 17 | 18 | # scaffold 19 | scaf_ss1_left = sc.Domain(helix=1, forward=False, start=8, end=24) 20 | scaf_ss0 = sc.Domain(helix=0, forward=True, start=8, end=40) 21 | loopout = sc.Loopout(length=3) 22 | scaf_ss1_right = sc.Domain(helix=1, forward=False, start=24, end=40) 23 | scaf = sc.Strand(domains=[scaf_ss1_left, scaf_ss0, loopout, scaf_ss1_right], is_scaffold=True) 24 | 25 | # whole design 26 | design = sc.Design(helices=helices, strands=[scaf, stap_left, stap_right], grid=sc.square) 27 | 28 | # deletions and insertions added to design are added to both strands on a helix 29 | design.add_deletion(helix=1, offset=20) 30 | design.add_insertion(helix=0, offset=14, length=1) 31 | design.add_insertion(helix=0, offset=26, length=2) 32 | 33 | # also assigns complement to strands other than scaf bound to it 34 | design.assign_dna(scaf, 'AACGT' * 18) 35 | 36 | return design 37 | 38 | 39 | if __name__ == '__main__': 40 | d = create_design() 41 | d.write_scadnano_file(directory='output_designs') 42 | -------------------------------------------------------------------------------- /examples/2_staple_2_helix_origami_deletions_insertions_labels.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | # helices 6 | helices = [sc.Helix(max_offset=48), sc.Helix(max_offset=48)] 7 | 8 | # left staple 9 | stap_left_ss1 = sc.Domain(helix=1, forward=True, start=8, end=24) 10 | stap_left_ss0 = sc.Domain(helix=0, forward=False, start=8, end=24) 11 | stap_left = sc.Strand(domains=[stap_left_ss1, stap_left_ss0], 12 | label='left staple') 13 | 14 | # right staple 15 | stap_right_ss0 = sc.Domain(helix=0, forward=False, start=24, end=40) 16 | stap_right_ss1 = sc.Domain(helix=1, forward=True, start=24, end=40) 17 | stap_right = sc.Strand(domains=[stap_right_ss0, stap_right_ss1], 18 | label='right staple') 19 | 20 | # scaffold 21 | scaf_ss1_left = sc.Domain(helix=1, forward=False, start=8, end=24) 22 | scaf_ss0 = sc.Domain(helix=0, forward=True, start=8, end=40) 23 | loopout = sc.Loopout(length=3) 24 | scaf_ss1_right = sc.Domain(helix=1, forward=False, start=24, end=40) 25 | scaf = sc.Strand(domains=[scaf_ss1_left, scaf_ss0, loopout, scaf_ss1_right], is_scaffold=True, 26 | label='scaffold label') 27 | 28 | # whole design 29 | design = sc.Design(helices=helices, strands=[scaf, stap_left, stap_right], grid=sc.square) 30 | 31 | # deletions and insertions added to design are added to both strands on a helix 32 | design.add_deletion(helix=1, offset=20) 33 | design.add_insertion(helix=0, offset=14, length=1) 34 | design.add_insertion(helix=0, offset=26, length=2) 35 | 36 | # also assigns complement to strands other than scaf bound to it 37 | design.assign_dna(scaf, 'AACGT' * 18) 38 | 39 | return design 40 | 41 | 42 | if __name__ == '__main__': 43 | d = create_design() 44 | d.write_scadnano_file(directory='output_designs') 45 | -------------------------------------------------------------------------------- /examples/2_staple_2_helix_origami_deletions_insertions_mods.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | import modifications as mod 3 | 4 | 5 | def create_design() -> sc.Design: 6 | # helices 7 | helices = [sc.Helix(max_offset=48), sc.Helix(max_offset=48)] 8 | 9 | # left staple 10 | stap_left_ss1 = sc.Domain(helix=1, forward=True, start=8, end=24) 11 | stap_left_ss0 = sc.Domain(helix=0, forward=False, start=8, end=24) 12 | stap_left = sc.Strand(domains=[stap_left_ss1, stap_left_ss0]) 13 | 14 | # right staple 15 | stap_right_ss0 = sc.Domain(helix=0, forward=False, start=24, end=40) 16 | stap_right_ss1 = sc.Domain(helix=1, forward=True, start=24, end=40) 17 | stap_right = sc.Strand(domains=[stap_right_ss0, stap_right_ss1]) 18 | stap_right.set_modification_5p(mod.biotin_5p) 19 | 20 | # scaffold 21 | scaf_ss1_left = sc.Domain(helix=1, forward=False, start=8, end=24) 22 | scaf_ss0 = sc.Domain(helix=0, forward=True, start=8, end=40) 23 | loopout = sc.Loopout(length=3) 24 | scaf_ss1_right = sc.Domain(helix=1, forward=False, start=24, end=40) 25 | scaf = sc.Strand(domains=[scaf_ss1_left, scaf_ss0, loopout, scaf_ss1_right], is_scaffold=True) 26 | 27 | # whole design 28 | design = sc.Design(helices=helices, strands=[scaf, stap_left, stap_right], grid=sc.square) 29 | 30 | # deletions and insertions added to design are added to both strands on a helix 31 | design.add_deletion(helix=1, offset=20) 32 | design.add_insertion(helix=0, offset=14, length=1) 33 | design.add_insertion(helix=0, offset=26, length=2) 34 | 35 | # also assigns complement to strands other than scaf bound to it 36 | design.assign_dna(scaf, 'AACGT' * 18) 37 | 38 | return design 39 | 40 | 41 | if __name__ == '__main__': 42 | d = create_design() 43 | d.write_scadnano_file(directory='output_designs') 44 | -------------------------------------------------------------------------------- /examples/2_staple_2_helix_origami_deletions_insertions_mods_chained_methods.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | import modifications as mod 3 | 4 | 5 | def create_design() -> sc.Design: 6 | # helices 7 | helices = [sc.Helix(max_offset=48), sc.Helix(max_offset=48)] 8 | 9 | # whole design 10 | design = sc.Design(helices=helices, strands=[], grid=sc.square) 11 | 12 | design.draw_strand(1, 8).to(24).cross(0).to(8) # left staple 13 | design.draw_strand(0, 40).to(24).cross(1).to(40).with_modification_5p(mod.biotin_5p) # right staple 14 | design.draw_strand(1, 24).to(8).cross(0).to(40).loopout(1, 3).to(24).as_scaffold() 15 | 16 | # deletions and insertions added to design are added to both strands on a helix 17 | design.add_deletion(helix=1, offset=20) 18 | design.add_insertion(helix=0, offset=14, length=1) 19 | design.add_insertion(helix=0, offset=26, length=2) 20 | 21 | # also assigns complement to strands other than scaf bound to it 22 | design.assign_dna(design.scaffold, 'AACGT' * 18) 23 | 24 | return design 25 | 26 | 27 | if __name__ == '__main__': 28 | d = create_design() 29 | d.write_scadnano_file(directory='output_designs') 30 | -------------------------------------------------------------------------------- /examples/2_staple_2_helix_origami_deletions_insertions_new_geometry.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | # helices 6 | helices = [sc.Helix(max_offset=48), sc.Helix(max_offset=48)] 7 | 8 | # left staple 9 | stap_left_ss1 = sc.Domain(helix=1, forward=True, start=8, end=24) 10 | stap_left_ss0 = sc.Domain(helix=0, forward=False, start=8, end=24) 11 | stap_left = sc.Strand(domains=[stap_left_ss1, stap_left_ss0]) 12 | 13 | # right staple 14 | stap_right_ss0 = sc.Domain(helix=0, forward=False, start=24, end=40) 15 | stap_right_ss1 = sc.Domain(helix=1, forward=True, start=24, end=40) 16 | stap_right = sc.Strand(domains=[stap_right_ss0, stap_right_ss1]) 17 | 18 | # scaffold 19 | scaf_ss1_left = sc.Domain(helix=1, forward=False, start=8, end=24) 20 | scaf_ss0 = sc.Domain(helix=0, forward=True, start=8, end=40) 21 | loopout = sc.Loopout(length=3) 22 | scaf_ss1_right = sc.Domain(helix=1, forward=False, start=24, end=40) 23 | scaf = sc.Strand(domains=[scaf_ss1_left, scaf_ss0, loopout, scaf_ss1_right], is_scaffold=True) 24 | 25 | # geometry 26 | geometry = sc.Geometry(rise_per_base_pair=0.2, helix_radius=1.2, inter_helix_gap=1.0) 27 | 28 | # whole design 29 | design = sc.Design(helices=helices, strands=[scaf, stap_left, stap_right], grid=sc.square, 30 | geometry=geometry) 31 | 32 | # deletions and insertions added to design are added to both strands on a helix 33 | design.add_deletion(helix=1, offset=20) 34 | design.add_insertion(helix=0, offset=14, length=1) 35 | design.add_insertion(helix=0, offset=26, length=2) 36 | 37 | # also assigns complement to strands other than scaf bound to it 38 | design.assign_dna(scaf, 'AACGT' * 18) 39 | 40 | return design 41 | 42 | 43 | if __name__ == '__main__': 44 | d = create_design() 45 | d.write_scadnano_file(directory='output_designs') 46 | -------------------------------------------------------------------------------- /examples/2_staple_2_helix_origami_deletions_insertions_no_seq.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | # If running in scadnano, define a function called main() that returns design. 5 | # It will be displayed in the browser by scadnano. 6 | def create_design() -> sc.Design: 7 | # left staple 8 | stap_left_ss1 = sc.Domain(helix=1, forward=True, start=0, end=16) 9 | stap_left_ss0 = sc.Domain(helix=0, forward=False, start=0, end=16) 10 | stap_left = sc.Strand(domains=[stap_left_ss1, stap_left_ss0]) 11 | 12 | # right staple 13 | stap_right_ss0 = sc.Domain(helix=0, forward=False, start=16, end=32) 14 | stap_right_ss1 = sc.Domain(helix=1, forward=True, start=16, end=32) 15 | stap_right = sc.Strand(domains=[stap_right_ss0, stap_right_ss1]) 16 | 17 | # scaffold 18 | scaf_ss1_left = sc.Domain(helix=1, forward=False, start=0, end=16) 19 | scaf_ss0 = sc.Domain(helix=0, forward=True, start=0, end=32) 20 | loopout = sc.Loopout(length=3) 21 | scaf_ss1_right = sc.Domain(helix=1, forward=False, start=16, end=32) 22 | scaf = sc.Strand(domains=[scaf_ss1_left, scaf_ss0, loopout, scaf_ss1_right], is_scaffold=True) 23 | 24 | # whole design 25 | design = sc.Design(strands=[scaf, stap_left, stap_right], grid=sc.square) 26 | 27 | # deletions and insertions added to design so they can be added to both strands on a helix 28 | design.add_deletion(helix=0, offset=11) 29 | design.add_deletion(helix=0, offset=12) 30 | design.add_deletion(helix=0, offset=24) 31 | design.add_deletion(helix=1, offset=12) 32 | design.add_deletion(helix=1, offset=24) 33 | 34 | design.add_insertion(helix=0, offset=6, length=1) 35 | design.add_insertion(helix=0, offset=18, length=2) 36 | design.add_insertion(helix=1, offset=6, length=3) 37 | design.add_insertion(helix=1, offset=18, length=4) 38 | 39 | return design 40 | 41 | 42 | # If running from the command line, call main() manually and write design to .dna file. 43 | if __name__ == '__main__': 44 | d = create_design() 45 | d.write_scadnano_file(directory='output_designs') 46 | -------------------------------------------------------------------------------- /examples/3_helix_deletions_insertions.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | # If running in scadnano, define a function called main() that returns design. 5 | # It will be displayed in the browser by scadnano. 6 | def create_design() -> sc.Design: 7 | helices = [sc.Helix(max_offset=64), sc.Helix(max_offset=64), sc.Helix(max_offset=64)] 8 | 9 | # left staple 10 | stap_left_ss1 = sc.Domain(helix=1, forward=True, start=0, end=16) 11 | stap_left_ss0 = sc.Domain(helix=0, forward=False, start=0, end=16) 12 | stap_left = sc.Strand(domains=[stap_left_ss1, stap_left_ss0]) 13 | 14 | # right staple 15 | stap_right_ss0 = sc.Domain(helix=0, forward=False, start=16, end=32) 16 | stap_right_ss1 = sc.Domain(helix=1, forward=True, start=16, end=32) 17 | stap_right = sc.Strand(domains=[stap_right_ss0, stap_right_ss1]) 18 | 19 | # scaffold 20 | scaf_ss1_left = sc.Domain(helix=1, forward=False, start=0, end=16) 21 | scaf_ss0 = sc.Domain(helix=0, forward=True, start=0, end=32) 22 | loopout = sc.Loopout(length=3) 23 | scaf_ss1_right = sc.Domain(helix=1, forward=False, start=16, end=32) 24 | scaf = sc.Strand(domains=[scaf_ss1_left, scaf_ss0, loopout, scaf_ss1_right], is_scaffold=True) 25 | 26 | ss_extra1 = sc.Domain(helix=1, forward=True, start=32, end=48) 27 | ss_extra2 = sc.Domain(helix=1, forward=True, start=48, end=64) 28 | ss_extra3 = sc.Domain(helix=2, forward=False, start=32, end=48) 29 | ss_extra1b = sc.Domain(helix=1, forward=False, start=32, end=48) 30 | ss_extra2b = sc.Domain(helix=1, forward=False, start=48, end=64) 31 | ss_extra3b = sc.Domain(helix=2, forward=True, start=32, end=48) 32 | ss_extra4 = sc.Domain(helix=2, forward=True, start=16, end=32) 33 | ss_extra5 = sc.Domain(helix=2, forward=True, start=0, end=16) 34 | s_extra1 = sc.Strand(domains=[ss_extra1]) 35 | s_extra2 = sc.Strand(domains=[ss_extra2]) 36 | s_extra3 = sc.Strand(domains=[ss_extra3]) 37 | s_extra4 = sc.Strand(domains=[ss_extra4]) 38 | s_extra5 = sc.Strand(domains=[ss_extra5]) 39 | s_extra1b = sc.Strand(domains=[ss_extra1b]) 40 | s_extra2b = sc.Strand(domains=[ss_extra2b]) 41 | s_extra3b = sc.Strand(domains=[ss_extra3b]) 42 | 43 | # whole design 44 | design = sc.Design(helices=helices, 45 | strands=[scaf, stap_left, stap_right, s_extra1, s_extra2, s_extra3, s_extra4, 46 | s_extra1b, s_extra2b, s_extra3b, s_extra5], 47 | grid=sc.square) 48 | 49 | # deletions and insertions added to design so they can be added to both strands on a helix 50 | design.add_deletion(helix=0, offset=11) 51 | design.add_deletion(helix=0, offset=12) 52 | design.add_deletion(helix=0, offset=24) 53 | design.add_deletion(helix=1, offset=12) 54 | design.add_deletion(helix=1, offset=24) 55 | 56 | design.add_insertion(helix=0, offset=6, length=1) 57 | design.add_insertion(helix=0, offset=18, length=2) 58 | design.add_insertion(helix=1, offset=6, length=3) 59 | design.add_insertion(helix=1, offset=18, length=4) 60 | 61 | # DNA assigned to whole design so complement can be assigned to strands other than scaf 62 | design.assign_dna(scaf, 'AACT' * 18) 63 | design.assign_dna(s_extra1, 'AACT' * 4) 64 | design.assign_dna(s_extra2, 'GGTA' * 4) 65 | 66 | return design 67 | 68 | 69 | # If running from the command line, call main() manually and write design to .dna file. 70 | if __name__ == '__main__': 71 | d = create_design() 72 | d.write_scadnano_file(directory='output_designs') 73 | -------------------------------------------------------------------------------- /examples/4_helix_grid_none.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | length = 10 6 | helices = [ 7 | sc.Helix(max_offset=length, position=sc.Position3D(x=0, y=0, z=2.5), roll=0), 8 | sc.Helix(max_offset=length, position=sc.Position3D(x=3, y=3, z=0), roll=0), 9 | sc.Helix(max_offset=length, position=sc.Position3D(x=8, y=-3, z=0), roll=0), 10 | sc.Helix(max_offset=length, position=sc.Position3D(x=11, y=1, z=0), roll=0), 11 | ] 12 | stap_ss = sc.Domain(0, True, 0, length) 13 | scaf_ss = sc.Domain(0, False, 0, length) 14 | stap = sc.Strand([stap_ss]) 15 | scaf = sc.Strand([scaf_ss], color=sc.default_scaffold_color) 16 | strands = [stap, scaf] 17 | design = sc.Design(helices=helices, strands=strands, grid=sc.Grid.none) 18 | 19 | return design 20 | 21 | 22 | if __name__ == '__main__': 23 | d = create_design() 24 | d.write_scadnano_file(directory='output_designs') 25 | -------------------------------------------------------------------------------- /examples/4_helix_grid_none_min_offset_position_x_nondefault.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | length = 16 6 | helices = [ 7 | sc.Helix(major_tick_distance=4, max_offset=length, position=sc.Position3D(x=0, y=0, z=0), 8 | min_offset=0), 9 | sc.Helix(major_tick_distance=4, max_offset=length, position=sc.Position3D(x=3, y=3, z=0), 10 | min_offset=8), 11 | sc.Helix(major_tick_distance=4, max_offset=length, position=sc.Position3D(x=8, y=-3, z=2.5), 12 | min_offset=0), 13 | sc.Helix(major_tick_distance=4, max_offset=length, position=sc.Position3D(x=11, y=1, z=2.5), 14 | min_offset=8), 15 | ] 16 | design = sc.Design(helices=helices, strands=[ 17 | sc.Strand([sc.Domain(0, True, 0, length)]), 18 | sc.Strand([sc.Domain(1, True, 8, length)]), 19 | sc.Strand([sc.Domain(2, True, 0, length)]), 20 | sc.Strand([sc.Domain(3, True, 8, length)]), 21 | ], grid=sc.Grid.none) 22 | 23 | return design 24 | 25 | 26 | if __name__ == '__main__': 27 | d = create_design() 28 | d.write_scadnano_file(directory='output_designs') 29 | -------------------------------------------------------------------------------- /examples/4_helix_min_offsets_nonzero.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | length = 30 6 | helices = [ 7 | sc.Helix(min_offset=0, max_offset=length, grid_position=(0, 0)), 8 | sc.Helix(min_offset=1, max_offset=length, grid_position=(0, 1)), 9 | sc.Helix(min_offset=2, max_offset=length, grid_position=(0, 2)), 10 | sc.Helix(min_offset=3, max_offset=length, grid_position=(0, 3)), 11 | ] 12 | stap_ss = sc.Domain(0, True, 0, length - 1) 13 | scaf_ss = sc.Domain(0, False, 0, length - 1) 14 | stap = sc.Strand([stap_ss]) 15 | scaf = sc.Strand([scaf_ss], color=sc.default_scaffold_color) 16 | strands = [stap, scaf] 17 | design = sc.Design(helices=helices, strands=strands, grid=sc.Grid.square) 18 | 19 | return design 20 | 21 | 22 | if __name__ == '__main__': 23 | d = create_design() 24 | d.write_scadnano_file(directory='output_designs') 25 | -------------------------------------------------------------------------------- /examples/56_helix_origami_rectangle.py: -------------------------------------------------------------------------------- 1 | import origami_rectangle as rect 2 | import scadnano as sc 3 | 4 | 5 | def create_design() -> sc.Design: 6 | return rect.create(num_helices=56, num_cols=8, seam_left_column=4) 7 | 8 | 9 | if __name__ == '__main__': 10 | design = create_design() 11 | design.write_scadnano_file(directory='output_designs') 12 | -------------------------------------------------------------------------------- /examples/64_helix_origami_rectangle.py: -------------------------------------------------------------------------------- 1 | import origami_rectangle as rect 2 | import scadnano as sc 3 | 4 | 5 | def create_design() -> sc.Design: 6 | return rect.create(num_helices=64, num_cols=6) 7 | 8 | 9 | if __name__ == '__main__': 10 | design = create_design() 11 | design.write_scadnano_file(directory='output_designs') 12 | -------------------------------------------------------------------------------- /examples/6_helix_6_col_origami_rectangle.py: -------------------------------------------------------------------------------- 1 | import origami_rectangle as rect 2 | import scadnano as sc 3 | 4 | 5 | def create_design() -> sc.Design: 6 | design = rect.create(num_helices=6, num_cols=6, num_flanking_columns=0) 7 | return design 8 | 9 | 10 | if __name__ == '__main__': 11 | d = create_design() 12 | d.write_scadnano_file(directory='output_designs') 13 | -------------------------------------------------------------------------------- /examples/6_helix_bundle_honeycomb.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | m13_rotation = 6702 6 | m13_variant = sc.M13Variant.p7560 7 | # print(sc.m13(m13_rotation, m13_variant)) 8 | 9 | design = initial_design() 10 | add_nicks(design) 11 | add_crossovers(design) 12 | scaffold = next(s for s in design.strands if 13 | s.first_domain().helix == 5 and not s.first_domain().forward) 14 | scaffold.set_scaffold() 15 | design.assign_m13_to_scaffold(rotation=m13_rotation, variant=m13_variant) 16 | return design 17 | 18 | 19 | def initial_design() -> sc.Design: 20 | max_offset = 1295 21 | helices = [ 22 | # below uses cadnano honeycomb coordinates 23 | # https://github.com/UC-Davis-molecular-computing/scadnano-python-package/blob/master/misc/cadnano-format-specs/v2.txt 24 | sc.Helix(grid_position=(1, 1), max_offset=max_offset), 25 | sc.Helix(grid_position=(0, 1), max_offset=max_offset), 26 | sc.Helix(grid_position=(0, 2), max_offset=max_offset), 27 | sc.Helix(grid_position=(1, 2), max_offset=max_offset), 28 | sc.Helix(grid_position=(2, 2), max_offset=max_offset), 29 | sc.Helix(grid_position=(2, 1), max_offset=max_offset), 30 | ] 31 | scafs = [ 32 | sc.Strand([sc.Domain(helix=0, forward=True, start=16, end=1276)]), 33 | sc.Strand([sc.Domain(helix=1, forward=False, start=16, end=1276)]), 34 | sc.Strand([sc.Domain(helix=2, forward=True, start=12, end=1272)]), 35 | sc.Strand([sc.Domain(helix=3, forward=False, start=12, end=1272)]), 36 | sc.Strand([sc.Domain(helix=4, forward=True, start=19, end=1279)]), 37 | sc.Strand([sc.Domain(helix=5, forward=False, start=19, end=1279)]), 38 | ] 39 | staps = [ 40 | sc.Strand([sc.Domain(helix=0, forward=False, start=42, end=1246)]), 41 | sc.Strand([sc.Domain(helix=1, forward=True, start=42, end=1246)]), 42 | sc.Strand([sc.Domain(helix=2, forward=False, start=42, end=1246)]), 43 | sc.Strand([sc.Domain(helix=3, forward=True, start=42, end=1246)]), 44 | sc.Strand([sc.Domain(helix=4, forward=False, start=42, end=1246)]), 45 | sc.Strand([sc.Domain(helix=5, forward=True, start=42, end=1246)]), 46 | ] 47 | strands = scafs + staps 48 | return sc.Design(helices=helices, strands=strands, grid=sc.honeycomb) 49 | 50 | 51 | def add_nicks(design: sc.Design) -> None: 52 | design.add_nick(helix=5, offset=399, forward=False) # scaffold 53 | for offset in range(56, 1246, 42): 54 | design.add_nick(helix=0, offset=offset, forward=False) 55 | design.add_nick(helix=3, offset=offset, forward=True) 56 | for offset in range(70, 1246, 42): 57 | design.add_nick(helix=1, offset=offset, forward=True) 58 | design.add_nick(helix=4, offset=offset, forward=False) 59 | for offset in range(84, 1246, 42): 60 | design.add_nick(helix=2, offset=offset, forward=False) 61 | design.add_nick(helix=5, offset=offset, forward=True) 62 | 63 | 64 | def add_crossovers(design: sc.Design) -> None: 65 | # staples interior 66 | for offset in range(84, 1246, 42): 67 | design.add_full_crossover(helix=0, helix2=1, offset=offset, forward=False) 68 | design.add_full_crossover(helix=3, helix2=4, offset=offset, forward=True) 69 | for offset in range(56, 1246, 42): 70 | design.add_full_crossover(helix=1, helix2=2, offset=offset, forward=True) 71 | design.add_full_crossover(helix=4, helix2=5, offset=offset, forward=False) 72 | for offset in range(70, 1246, 42): 73 | design.add_full_crossover(helix=2, helix2=3, offset=offset, forward=False) 74 | design.add_full_crossover(helix=5, helix2=0, offset=offset, forward=True) 75 | for offset in range(49, 1245, 42): # extra crossovers 5 - 0 for some reason 76 | design.add_full_crossover(helix=5, helix2=0, offset=offset, forward=True) 77 | 78 | # staples edges 79 | design.add_half_crossover(helix=0, helix2=1, offset=42, forward=False) 80 | design.add_half_crossover(helix=3, helix2=4, offset=42, forward=True) 81 | design.add_half_crossover(helix=0, helix2=5, offset=1245, forward=False) 82 | design.add_half_crossover(helix=2, helix2=3, offset=1245, forward=False) 83 | 84 | # scaffold interior 85 | for offset in range(58, 1250, 42): 86 | design.add_full_crossover(helix=0, helix2=1, offset=offset, forward=True) 87 | for offset in range(30, 1250, 42): 88 | design.add_full_crossover(helix=1, helix2=2, offset=offset, forward=False) 89 | for offset in range(54, 1250, 42): 90 | design.add_full_crossover(helix=2, helix2=3, offset=offset, forward=True) 91 | for offset in range(26, 1250, 42): 92 | design.add_full_crossover(helix=3, helix2=4, offset=offset, forward=False) 93 | 94 | # scaffold edges 95 | design.add_half_crossover(helix=0, helix2=1, offset=16, forward=True) 96 | design.add_half_crossover(helix=2, helix2=3, offset=12, forward=True) 97 | design.add_half_crossover(helix=4, helix2=5, offset=19, forward=True) 98 | design.add_half_crossover(helix=0, helix2=1, offset=1275, forward=True) 99 | design.add_half_crossover(helix=2, helix2=3, offset=1271, forward=True) 100 | design.add_half_crossover(helix=4, helix2=5, offset=1278, forward=True) 101 | 102 | 103 | def main() -> None: 104 | design = create_design() 105 | design.write_scadnano_file(directory='output_designs') 106 | 107 | 108 | if __name__ == '__main__': 109 | main() 110 | -------------------------------------------------------------------------------- /examples/6_helix_origami_rectangle.py: -------------------------------------------------------------------------------- 1 | import origami_rectangle as rect 2 | import scadnano as sc 3 | 4 | 5 | def create_design() -> sc.Design: 6 | design = rect.create(num_helices=6, num_cols=10, nick_pattern=rect.staggered, twist_correction_deletion_spacing=3) 7 | return design 8 | 9 | 10 | if __name__ == '__main__': 11 | d = create_design() 12 | d.write_scadnano_file(directory='output_designs') 13 | -------------------------------------------------------------------------------- /examples/6_helix_origami_rectangle_helices_out_of_order.py: -------------------------------------------------------------------------------- 1 | import origami_rectangle as rect 2 | import scadnano as sc 3 | 4 | 5 | def create_design() -> sc.Design: 6 | design = rect.create(num_helices=6, num_cols=10, nick_pattern=rect.staggered, twist_correction_deletion_spacing=3) 7 | design.set_helices_view_order([5,4,3,2,1,0]) 8 | return design 9 | 10 | 11 | if __name__ == '__main__': 12 | d = create_design() 13 | d.write_scadnano_file(directory='output_designs') 14 | -------------------------------------------------------------------------------- /examples/circular.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | import dataclasses 3 | 4 | def create_design() -> sc.Design: 5 | helices = [sc.Helix(max_offset=24) for _ in range(2)] 6 | design = sc.Design(helices=helices, grid=sc.square) 7 | 8 | design.draw_strand(0, 0).move(8).cross(1).move(-8).as_circular() 9 | design.draw_strand(0, 8).move(8).loopout(1, 5).move(-8).as_circular() 10 | design.draw_strand(0, 16).move(8).cross(1).move(-8) 11 | 12 | return design 13 | 14 | 15 | if __name__ == '__main__': 16 | d = create_design() 17 | d.write_scadnano_file(directory='output_designs') 18 | -------------------------------------------------------------------------------- /examples/consecutive_domains.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | # shows how to make consecutive domains on a helix, separated by a crossover that appears horizontal 6 | # this is useful when doing single-stranded tile designs, for instance, or any other design 7 | # where we have consecutive domains on a single helix. 8 | # 9 | # 0 [------+^+------> 10 | # 11 | # 1 <------+^+------] 12 | design = sc.Design(helices=[sc.Helix(100), sc.Helix(100)], grid=sc.square) 13 | design.draw_strand(0, 0).move(8).move(8) 14 | design.draw_strand(1, 16).move(-8).move(-8) 15 | 16 | # XXX: the following code raises an exception because it tries to add a crossover where 17 | # there already is one. This can be surprising since it would work with the following 18 | # similar-looking design that has a single longer domain per strand 19 | # 20 | # 0 [------------> 21 | # 22 | # 1 <------------] 23 | # design.add_full_crossover(helix=0, helix2=1, offset=8, forward=True) 24 | 25 | return design 26 | 27 | 28 | if __name__ == '__main__': 29 | d = create_design() 30 | d.write_scadnano_file(directory='output_designs') 31 | -------------------------------------------------------------------------------- /examples/domain_colors.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | helices = [sc.Helix(max_offset=100) for _ in range(4)] 6 | design = sc.Design(helices=helices, grid=sc.square) 7 | 8 | red = sc.Color(255, 0, 0) 9 | dark_red = sc.Color(150, 0, 0) 10 | green = sc.Color(0, 255, 0) 11 | dark_green = sc.Color(0, 150, 0) 12 | blue = sc.Color(0, 0, 255) 13 | dark_blue = sc.Color(0, 0, 150) 14 | black = sc.Color(0, 0, 0) 15 | 16 | design.draw_strand(0, 0) \ 17 | .extension_5p(num_bases=5).with_domain_color(red) \ 18 | .move(8).with_domain_color(green) \ 19 | .loopout(1, 5).with_domain_color(dark_blue) \ 20 | .move(-8).with_domain_color(dark_red) \ 21 | .cross(2) \ 22 | .move(8).with_domain_color(dark_green) \ 23 | .cross(3) \ 24 | .move(-8) \ 25 | .extension_3p(num_bases=5).with_domain_color(black) \ 26 | .with_color(blue) 27 | 28 | return design 29 | 30 | if __name__ == '__main__': 31 | d = create_design() 32 | d.write_scadnano_file(directory='output_designs') 33 | -------------------------------------------------------------------------------- /examples/draw_strand_move_negative.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | import modifications as mod 3 | import dataclasses 4 | 5 | 6 | def create_design() -> sc.Design: 7 | ''' 8 | 0 1 2 9 | 012345678901234567890 10 | 0 <--+c+--] 11 | ''' 12 | helices = [sc.Helix(max_offset=20) for _ in range(1)] 13 | design = sc.Design(helices=helices, grid=sc.square) 14 | sb = design.draw_strand(0, 16) 15 | sb.move(-4) 16 | sb.cross(0, 11) 17 | sb.move(-4) 18 | 19 | for helix in design.helices.values(): 20 | helix.major_ticks = [0, 5, 10, 15, 20] 21 | 22 | design.relax_helix_rolls() 23 | 24 | return design 25 | 26 | 27 | if __name__ == '__main__': 28 | d = create_design() 29 | d.write_scadnano_file(directory='output_designs') 30 | -------------------------------------------------------------------------------- /examples/empty.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | def create_design() -> sc.Design: 4 | return sc.Design(strands=[], grid=sc.square) 5 | 6 | if __name__ == '__main__': 7 | design = create_design() 8 | design.write_scadnano_file(directory='output_designs') 9 | -------------------------------------------------------------------------------- /examples/extension_and_loopout_oxdna_export.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def main() -> None: 5 | d = create_design() 6 | d.write_scadnano_file(directory='output_designs') 7 | d.write_oxdna_files(directory='oxdna') 8 | 9 | 10 | def create_design() -> sc.Design: 11 | width = 21 12 | helices = [sc.Helix(max_offset=32) for _ in range(3)] 13 | helices[0].roll = 210 14 | helices[1].roll = 20 15 | helices[2].roll = 210 16 | design = sc.Design(helices=helices, grid=sc.square) 17 | 18 | design.draw_strand(0, 0).extension_5p(5) \ 19 | .move(width) \ 20 | .cross(1).move(-width) \ 21 | .loopout(2, 32) \ 22 | .move(width) \ 23 | .extension_3p(7) 24 | 25 | return design 26 | 27 | 28 | if __name__ == '__main__': 29 | main() 30 | -------------------------------------------------------------------------------- /examples/extensions.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def main() -> None: 5 | d = create_design() 6 | d.write_scadnano_file(directory='output_designs') 7 | d.write_oxdna_files(directory='oxdna') 8 | 9 | 10 | def create_design() -> sc.Design: 11 | width = 8 12 | helices = [sc.Helix(max_offset=32) for _ in range(3)] 13 | design = sc.Design(helices=helices, grid=sc.square) 14 | helices[2].roll = 30 15 | 16 | design.draw_strand(0, 0).extension_5p(5, display_length=2.5, display_angle=45) \ 17 | .with_domain_name("ext_5p 1") \ 18 | .move(width).with_domain_name('domain 1') \ 19 | .cross(1).move(-width) \ 20 | .loopout(2, 3).with_domain_name('loopout 1') \ 21 | .move(width) \ 22 | .extension_3p(7).with_domain_name("ext_3p 1") \ 23 | .with_name('strand1') \ 24 | .with_sequence('TATTT' + 'G' * width + 'C' * width + 'T' * 3 + 'G' * width + 'ATAAAAA') \ 25 | .with_modification_5p(sc.cy5_5p) \ 26 | .with_modification_3p(sc.cy3_3p) 27 | 28 | design.draw_strand(0, 24).extension_5p(5, display_length=3.5, display_angle=60) \ 29 | .with_domain_name("ext_5p 2") \ 30 | .move(-width).cross(1).move(width).loopout(2, 3).move(-width) \ 31 | .extension_3p(7).with_domain_name("ext_3p 2") \ 32 | .with_name('strand2') \ 33 | .with_sequence('ATAAA' + 'C' * width + 'G' * width + 'A' * 3 + 'C' * width + 'TATTTTT') \ 34 | 35 | return design 36 | 37 | 38 | if __name__ == '__main__': 39 | main() 40 | -------------------------------------------------------------------------------- /examples/hairpin.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | ss_f = sc.Domain(helix=0, forward=True, start=0, end=10) 6 | loop = sc.Loopout(length=5) 7 | ss_r = sc.Domain(helix=0, forward=False, start=0, end=10) 8 | hairpin = sc.Strand([ss_f, loop, ss_r]) 9 | design = sc.Design(strands=[hairpin], grid=sc.square) 10 | 11 | design.assign_dna(hairpin, 'AAAAACCCCCTGCAT') 12 | 13 | return design 14 | 15 | 16 | if __name__ == '__main__': 17 | d = create_design() 18 | d.write_scadnano_file(directory='output_designs') 19 | -------------------------------------------------------------------------------- /examples/helices_out_of_order_nonconsecutive.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | from scadnano import origami_rectangle as rect 3 | 4 | 5 | def create_design() -> sc.Design: 6 | helices = [ 7 | sc.Helix(idx=2, max_offset=20), 8 | sc.Helix(idx=3, max_offset=20), 9 | sc.Helix(idx=5, max_offset=20), 10 | sc.Helix(idx=7, max_offset=20), 11 | sc.Helix(idx=11, max_offset=20), 12 | ] 13 | design = sc.Design(helices=helices, strands=[]) 14 | # design.set_helices_view_order([5, 2, 11, 3, 7]) 15 | return design 16 | 17 | 18 | if __name__ == '__main__': 19 | d = create_design() 20 | d.write_scadnano_file(directory='output_designs') 21 | -------------------------------------------------------------------------------- /examples/helix_groups.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | include_rot = False 6 | include_rot = True 7 | n = 'north' 8 | e = 'east' 9 | s = 'south' 10 | w = 'west' 11 | helices = [ 12 | sc.Helix(max_offset=20, group=n, grid_position=(0, 0)), # 0 13 | sc.Helix(max_offset=21, group=n, grid_position=(1, 0)), # 1 14 | sc.Helix(max_offset=19, group=n, grid_position=(1, 1)), # 2 15 | sc.Helix(max_offset=18, group=n, grid_position=(0, 1)), # 3 16 | sc.Helix(max_offset=17, group=n, grid_position=(-1, 1)), # 4 17 | sc.Helix(max_offset=16, group=n, grid_position=(-1, 0)), # 5 18 | sc.Helix(max_offset=24, group=s), # 6 19 | sc.Helix(max_offset=25, group=s), # 7 20 | sc.Helix(max_offset=26, group=w, position=sc.Position3D(x=0, y=0, z=0)), # 8 21 | sc.Helix(max_offset=27, group=w, position=sc.Position3D(x=0, y=3, z=0)), # 9 22 | ] 23 | if include_rot: 24 | helices.extend([ 25 | sc.Helix(max_offset=26, group='r', grid_position=(0, 0)), # 10 26 | sc.Helix(max_offset=27, group='r', grid_position=(0, 1)), # 11 27 | ]) 28 | helices.extend([ 29 | sc.Helix(idx=13, max_offset=22, group=e), # 13 30 | sc.Helix(idx=15, max_offset=23, group=e), # 15 31 | ]) 32 | 33 | group_north = sc.HelixGroup(position=sc.Position3D(x=0, y=-10, z=0), grid=sc.honeycomb) 34 | group_south = sc.HelixGroup(position=sc.Position3D(x=0, y=10, z=0), helices_view_order=[7, 6], 35 | grid=sc.square) 36 | group_east = sc.HelixGroup(position=sc.Position3D(x=0, y=0, z=10), grid=sc.square) 37 | group_west = sc.HelixGroup(position=sc.Position3D(x=0, y=0, z=-10), grid=sc.Grid.none) 38 | groups = { 39 | n: group_north, 40 | e: group_east, 41 | s: group_south, 42 | w: group_west, 43 | } 44 | 45 | if include_rot: 46 | group_rot = sc.HelixGroup(position=sc.Position3D(x=00, y=10, z=10), pitch=45, grid=sc.square) 47 | groups['r'] = group_rot 48 | 49 | design = sc.Design(helices=helices, groups=groups, strands=[]) 50 | 51 | design.draw_strand(0, 0).to(8) \ 52 | .cross(1).to(0) \ 53 | .cross(2).to(8) \ 54 | .cross(3).to(0) \ 55 | .cross(4).to(8) \ 56 | .cross(5).to(0) 57 | 58 | design.draw_strand(4, 10).to(13) 59 | 60 | design.draw_strand(6, 0).to(8).cross(7).to(0) 61 | design.draw_strand(8, 0).to(8).cross(9).to(0) 62 | design.draw_strand(13, 0).to(8).cross(15).to(0) 63 | 64 | design.draw_strand(8, 8).to(11) 65 | design.draw_strand(13, 8).to(11) 66 | 67 | 68 | if include_rot: 69 | design.draw_strand(10, 0).to(8).cross(11).to(0) 70 | 71 | return design 72 | 73 | 74 | if __name__ == '__main__': 75 | d = create_design() 76 | d.write_scadnano_file(directory='output_designs') 77 | -------------------------------------------------------------------------------- /examples/hex_lattice_10x10.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | length = 16 6 | helices = [sc.Helix(max_offset=length, grid_position=(h, v)) for v in range(10) for h in range(10)] 7 | design = sc.Design(helices=helices, strands=[], grid=sc.hexagonal) 8 | 9 | return design 10 | 11 | 12 | if __name__ == '__main__': 13 | d = create_design() 14 | d.write_scadnano_file(directory='output_designs') 15 | -------------------------------------------------------------------------------- /examples/hex_lattice_10x10_with_negative.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | length = 16 6 | helices = [sc.Helix(max_offset=length, grid_position=(h, v)) 7 | for v in range(-4, 6) for h in range(-4, 6)] 8 | design = sc.Design(helices=helices, strands=[], grid=sc.hexagonal) 9 | 10 | return design 11 | 12 | 13 | if __name__ == '__main__': 14 | d = create_design() 15 | d.write_scadnano_file(directory='output_designs') 16 | -------------------------------------------------------------------------------- /examples/honeycomb_lattice_10x10.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | length = 16 6 | helices = [sc.Helix(max_offset=length, grid_position=(h, v)) for v in range(10) for h in range(10)] 7 | design = sc.Design(helices=helices, strands=[], grid=sc.honeycomb) 8 | 9 | return design 10 | 11 | 12 | if __name__ == '__main__': 13 | d = create_design() 14 | d.write_scadnano_file(directory='output_designs') 15 | -------------------------------------------------------------------------------- /examples/honeycomb_lattice_10x10_with_negative.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | length = 16 6 | helices = [sc.Helix(max_offset=length, grid_position=(h, v)) 7 | for v in range(-4, 6) for h in range(-4, 6)] 8 | design = sc.Design(helices=helices, strands=[], grid=sc.honeycomb) 9 | 10 | return design 11 | 12 | 13 | if __name__ == '__main__': 14 | d = create_design() 15 | d.write_scadnano_file(directory='output_designs') 16 | -------------------------------------------------------------------------------- /examples/idt-plates-explicit.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | ROWS = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] 4 | COLS = list(range(1, 13)) 5 | 6 | 7 | def create_design() -> sc.Design: 8 | num_strands = 208 9 | start = 0 10 | strands = [] 11 | plate = 1 12 | row_idx = 0 13 | col_idx = 0 14 | 15 | for s in range(1, num_strands + 1): 16 | ss_f = sc.Domain(helix=0, forward=True, start=start, end=start + 10) 17 | ss_r = sc.Domain(helix=1, forward=False, start=start, end=start + 10) 18 | 19 | row = ROWS[row_idx] 20 | col = COLS[col_idx] 21 | well = f'{row}{col}' 22 | idt = sc.VendorFields(plate=f'plate{plate}', well=well) 23 | 24 | strand = sc.Strand(domains=[ss_f, ss_r], vendor_fields=idt, name=f'staple{s}') 25 | strands.append(strand) 26 | row_idx += 1 27 | if row_idx == len(ROWS): 28 | row_idx = 0 29 | col_idx += 1 30 | if col_idx == len(COLS): 31 | col_idx = 0 32 | plate += 1 33 | start += 10 34 | 35 | scaffold = sc.Strand([sc.Domain(helix=0, forward=False, start=0, end=start), 36 | sc.Domain(helix=1, forward=True, start=0, end=start)], is_scaffold=True) 37 | strands.append(scaffold) 38 | design = sc.Design(strands=strands, grid=sc.square) 39 | design.assign_m13_to_scaffold() 40 | 41 | return design 42 | 43 | 44 | def main() -> None: 45 | design = create_design() 46 | design.write_scadnano_file(directory='output_designs') 47 | design.write_idt_bulk_input_file(directory='idt') 48 | design.write_idt_plate_excel_file(directory='idt', use_default_plates=False, only_strands_with_vendor_fields=True) 49 | 50 | 51 | if __name__ == '__main__': 52 | main() 53 | -------------------------------------------------------------------------------- /examples/idt/.gitignore: -------------------------------------------------------------------------------- 1 | /16_helix_origami_barrel_from_algoSST_paper-rotator.idt 2 | /16_helix_origami_barrel_from_algoSST_paper-rotator-guards.xls 3 | /16_helix_origami_barrel_from_algoSST_paper-rotator-tiles.xls 4 | -------------------------------------------------------------------------------- /examples/idt/16_helix_origami_rectangle.idt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/idt/16_helix_origami_rectangle.idt -------------------------------------------------------------------------------- /examples/idt/16_helix_origami_rectangle_384well.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/idt/16_helix_origami_rectangle_384well.xls -------------------------------------------------------------------------------- /examples/idt/16_helix_origami_rectangle_96well.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/idt/16_helix_origami_rectangle_96well.xls -------------------------------------------------------------------------------- /examples/idt/16_helix_origami_rectangle_seed_tiles_grow_from_top.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/idt/16_helix_origami_rectangle_seed_tiles_grow_from_top.xls -------------------------------------------------------------------------------- /examples/idt/1_staple_1_helix_origami_idt_duplicate_names.idt: -------------------------------------------------------------------------------- 1 | s1_r,AACT,25nm,STD 2 | s_l,AGTTAGTTAGTT,25nm,STD -------------------------------------------------------------------------------- /examples/idt/idt-plates-explicit.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/idt/idt-plates-explicit.xlsx -------------------------------------------------------------------------------- /examples/long_range_crossovers.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | num_helices = 16 6 | bases = 48 7 | helices = [sc.Helix() for _ in range(num_helices)] 8 | strands = [] 9 | for bot in range(num_helices // 2): 10 | top = num_helices - bot - 1 11 | helix_top = helices[bot] 12 | helix_bot = helices[top] 13 | 14 | stap_left_ss_top = sc.Domain(top, True, 0, bases // 3) 15 | stap_left_ss_bot = sc.Domain(bot, False, 0, bases // 3) 16 | stap_mid_ss_bot = sc.Domain(bot, False, bases // 3, bases * 2 // 3) 17 | stap_mid_ss_top = sc.Domain(top, True, bases // 3, bases * 2 // 3) 18 | stap_right_ss_top = sc.Domain(top, True, bases * 2 // 3, bases) 19 | stap_right_ss_bot = sc.Domain(bot, False, bases * 2 // 3, bases) 20 | stap_left = sc.Strand([stap_left_ss_bot, stap_left_ss_top]) 21 | stap_mid = sc.Strand([stap_mid_ss_top, stap_mid_ss_bot]) 22 | stap_right = sc.Strand([stap_right_ss_bot, stap_right_ss_top]) 23 | strands.append(stap_left) 24 | strands.append(stap_mid) 25 | strands.append(stap_right) 26 | 27 | design = sc.Design(helices=helices, strands=strands, grid=sc.square) 28 | 29 | return design 30 | 31 | 32 | if __name__ == '__main__': 33 | d = create_design() 34 | d.write_scadnano_file(directory='output_designs') 35 | -------------------------------------------------------------------------------- /examples/loopouts_all_types.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | ss_f0 = sc.Domain(helix=0, forward=True, start=0, end=8) 6 | hairpin0 = sc.Loopout(length=5) 7 | ss_r0 = sc.Domain(helix=0, forward=False, start=0, end=8) 8 | 9 | crossover_like_loopout = sc.Loopout(length=5) 10 | ss_f1 = sc.Domain(helix=1, forward=True, start=0, end=8) 11 | 12 | long_range_loopout = sc.Loopout(length=10) 13 | ss_r2 = sc.Domain(helix=2, forward=False, start=16, end=24) 14 | hairpin2 = sc.Loopout(length=20) 15 | ss_f2 = sc.Domain(helix=2, forward=True, start=16, end=32) 16 | hairpin2_2 = sc.Loopout(length=1) 17 | ss_r2_2 = sc.Domain(helix=2, forward=False, start=24, end=32) 18 | 19 | strand = sc.Strand( 20 | [ss_f0, hairpin0, ss_r0, crossover_like_loopout, ss_f1, long_range_loopout, ss_r2, hairpin2, ss_f2, 21 | hairpin2_2, ss_r2_2]) 22 | 23 | design = sc.Design(strands=[strand], grid=sc.square) 24 | t5 = 'TTTAC' 25 | t10 = 'TTTACTTACG' 26 | t20 = 'TTTTTTTTTTACGTTGCAGG' 27 | design.assign_dna(strand, 28 | f'ACGACGAC ' 29 | f'{t5} ' 30 | f'???????? ' 31 | f'{t5} ' 32 | f'GACGACGA ' 33 | f'{t10} ' 34 | f'CACGACGA ' 35 | f'{t20} ' 36 | f'???????? ' 37 | f'ACGACGAC ' 38 | f'T') 39 | 40 | return design 41 | 42 | 43 | if __name__ == '__main__': 44 | d = create_design() 45 | d.write_scadnano_file(directory='output_designs') 46 | -------------------------------------------------------------------------------- /examples/many_big_helices.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | helices = [] 6 | num_helices, max_bases = 30, 2000 7 | for _ in range(num_helices): 8 | helices.append(sc.Helix(max_bases)) 9 | design = sc.Design(helices=helices, strands=[], grid=sc.square) 10 | 11 | return design 12 | 13 | 14 | if __name__ == '__main__': 15 | d = create_design() 16 | d.write_scadnano_file(directory='output_designs') 17 | -------------------------------------------------------------------------------- /examples/many_helices_modifications.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | import modifications as mod 3 | import dataclasses 4 | 5 | def create_design() -> sc.Design: 6 | NUM_HELICES = 8 7 | WIDTH = 16 8 | doms = [sc.Domain(h, h%2==0, 0,WIDTH) for h in range(NUM_HELICES)] 9 | strand = sc.Strand(doms) 10 | design = sc.Design(strands=[strand], grid=sc.square) 11 | design.add_deletion(helix=0, offset=11) 12 | design.add_deletion(helix=0, offset=12) 13 | design.add_deletion(helix=1, offset=12) 14 | design.add_insertion(helix=1, offset=4, length=1) 15 | design.assign_dna(strand, 'T'*(NUM_HELICES*WIDTH)) 16 | 17 | strand.set_modification_5p(mod.biotin_5p) 18 | strand.set_modification_3p(mod.cy3_3p) 19 | for h in range(NUM_HELICES): 20 | strand.set_modification_internal(WIDTH*h + 5, mod.cy3_int) 21 | strand.set_modification_internal(WIDTH*h + 10, mod.biotin_int) 22 | 23 | return design 24 | 25 | 26 | if __name__ == '__main__': 27 | d = create_design() 28 | d.write_scadnano_file(directory='output_designs') 29 | -------------------------------------------------------------------------------- /examples/names_domains_strands.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | num_domains = 9 6 | helices = [sc.Helix(max_offset=(num_domains) * 8)] 7 | design: sc.Design = sc.Design(helices=helices, strands=[], grid=sc.square) 8 | design.draw_strand(0, (num_domains - 1) * 8) \ 9 | .move(-8).with_domain_name('domain 8*') \ 10 | .move(-8).with_domain_name('domain 7*') \ 11 | .move(-8).with_domain_name('domain 6*') \ 12 | .move(-8).with_domain_name('domain 5*') \ 13 | .move(-8).with_domain_name('domain 4*') \ 14 | .move(-8).with_domain_name('domain 3*') \ 15 | .move(-8).with_domain_name('domain 2*') \ 16 | .move(-8).with_domain_name('domain 1*') \ 17 | .with_name('bottom strand') 18 | 19 | # domain names match 20 | design.draw_strand(0, 0).move(8).with_domain_name('domain 1').with_name('top strand 1') 21 | 22 | # domains are aligns but names mismatch 23 | design.draw_strand(0, 8).move(8).with_domain_name('domain 50').with_name('top strand 2') 24 | 25 | # domain names match 26 | design.draw_strand(0, 16).move(8).with_domain_name('domain 3').with_name('top strand 3') 27 | 28 | # domain names are the same, not complementary 29 | design.draw_strand(0, 24).move(8).with_domain_name('domain 4*').with_name('top strand 4') 30 | 31 | # domain names match but domains are mis-aligned 32 | design.draw_strand(0, 32).move(9).with_domain_name('domain 5').with_name('top strand 5') 33 | 34 | # domain names match but domains are mis-aligned 35 | design.draw_strand(0, 48).move(7).with_domain_name('domain 7').with_name('top strand 7') 36 | 37 | # no overlap so no mismatch 38 | design.draw_strand(0, 64).move(8).with_domain_name('domain 9').with_name('top strand 9') 39 | 40 | return design 41 | 42 | 43 | if __name__ == '__main__': 44 | d = create_design() 45 | d.write_scadnano_file(directory='output_designs') 46 | -------------------------------------------------------------------------------- /examples/output_designs/.gitignore: -------------------------------------------------------------------------------- 1 | /overlapping_strands.sc 2 | /seed_sst.sc 3 | /16_helix_origami_barrel_from_algoSST_paper-rotator-bak.sc 4 | /16_helix_origami_barrel_from_algoSST_paper-rotator.sc 5 | /2_staple_2_helix_origami_deletions_lots_of_insertions.sc 6 | /1_staple_1_helix_origami_idt_duplicate_names.sc 7 | -------------------------------------------------------------------------------- /examples/output_designs/1_staple_1_helix_origami.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | { 6 | "grid_position": [0, 0], 7 | "major_ticks": [2, 5] 8 | } 9 | ], 10 | "strands": [ 11 | { 12 | "color": "#f74308", 13 | "sequence": "?AGTTAGTT", 14 | "domains": [ 15 | {"helix": 0, "forward": true, "start": 0, "end": 9} 16 | ] 17 | }, 18 | { 19 | "color": "#0066cc", 20 | "sequence": "AACTAACT?", 21 | "domains": [ 22 | {"helix": 0, "forward": false, "start": 0, "end": 9} 23 | ] 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /examples/output_designs/1_staple_1_helix_origami_mismatches.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]} 6 | ], 7 | "strands": [ 8 | { 9 | "color": "#f74308", 10 | "sequence": "ATTCTCTTGCTTTTTTCA", 11 | "domains": [ 12 | {"helix": 0, "forward": true, "start": 0, "end": 10, "insertions": [[2, 4], [8, 4]]} 13 | ] 14 | }, 15 | { 16 | "color": "#0066cc", 17 | "sequence": "AGAAAAAAAAAAAAAAAA", 18 | "domains": [ 19 | {"helix": 0, "forward": false, "start": 0, "end": 10, "insertions": [[2, 4], [8, 4]]} 20 | ] 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /examples/output_designs/1_staple_1_helix_origami_position_nondefault.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "groups": { 4 | "pitch90": { 5 | "position": {"x": 0, "y": 0, "z": 0}, 6 | "pitch": 90, 7 | "grid": "none" 8 | } 9 | }, 10 | "helices": [ 11 | { 12 | "group": "pitch90", 13 | "position": {"x": 1, "y": 2, "z": 3}, 14 | "major_ticks": [2, 5] 15 | } 16 | ], 17 | "strands": [ 18 | { 19 | "color": "#f74308", 20 | "sequence": "?AGTTAGTT", 21 | "domains": [ 22 | {"helix": 0, "forward": true, "start": 0, "end": 9} 23 | ] 24 | }, 25 | { 26 | "color": "#0066cc", 27 | "sequence": "AACTAACT?", 28 | "domains": [ 29 | {"helix": 0, "forward": false, "start": 0, "end": 9} 30 | ] 31 | } 32 | ] 33 | } -------------------------------------------------------------------------------- /examples/output_designs/1_staple_1_helix_origami_roll.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0], "roll": 90} 6 | ], 7 | "strands": [ 8 | { 9 | "color": "#f74308", 10 | "sequence": "?AGTTAGTT", 11 | "domains": [ 12 | {"helix": 0, "forward": true, "start": 0, "end": 9} 13 | ] 14 | }, 15 | { 16 | "color": "#0066cc", 17 | "sequence": "AACTAACT?", 18 | "domains": [ 19 | {"helix": 0, "forward": false, "start": 0, "end": 9} 20 | ] 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /examples/output_designs/2_helix_2_strands_multiple_substrands_no_seq.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]}, 6 | {"grid_position": [0, 1]} 7 | ], 8 | "strands": [ 9 | { 10 | "color": "#f74308", 11 | "domains": [ 12 | {"helix": 0, "forward": false, "start": 0, "end": 4}, 13 | {"helix": 1, "forward": true, "start": 0, "end": 8}, 14 | {"helix": 0, "forward": false, "start": 4, "end": 8} 15 | ] 16 | }, 17 | { 18 | "color": "#57bb00", 19 | "domains": [ 20 | {"helix": 0, "forward": true, "start": 0, "end": 8} 21 | ] 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /examples/output_designs/2_staple_2_helix_helixgroup_geometry.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.5", 3 | "groups": { 4 | "group 0": { 5 | "position": {"x": 0, "y": 0, "z": 0}, 6 | "grid": "square" 7 | }, 8 | "group 1": { 9 | "position": {"x": 0, "y": 3, "z": 0}, 10 | "grid": "square", 11 | "geometry": { 12 | "bases_per_turn": 18 13 | } 14 | } 15 | }, 16 | "helices": [ 17 | {"group": "group 0", "grid_position": [0, 0]}, 18 | {"group": "group 1", "grid_position": [0, 0]} 19 | ], 20 | "strands": [ 21 | { 22 | "color": "#f74308", 23 | "domains": [ 24 | {"helix": 0, "forward": true, "start": 0, "end": 40} 25 | ] 26 | }, 27 | { 28 | "color": "#57bb00", 29 | "domains": [ 30 | {"helix": 0, "forward": false, "start": 0, "end": 40} 31 | ] 32 | }, 33 | { 34 | "color": "#888888", 35 | "domains": [ 36 | {"helix": 1, "forward": true, "start": 0, "end": 40} 37 | ] 38 | }, 39 | { 40 | "color": "#32b86c", 41 | "domains": [ 42 | {"helix": 1, "forward": false, "start": 0, "end": 40} 43 | ] 44 | } 45 | ] 46 | } -------------------------------------------------------------------------------- /examples/output_designs/2_staple_2_helix_modifications.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]}, 6 | {"grid_position": [0, 1]} 7 | ], 8 | "modifications_in_design": { 9 | "/5Biosg/": { 10 | "display_text": "B", 11 | "vendor_code": "/5Biosg/", 12 | "display_connector": false, 13 | "location": "5'" 14 | }, 15 | "/3Bio/": { 16 | "display_text": "B", 17 | "vendor_code": "/3Bio/", 18 | "display_connector": false, 19 | "location": "3'" 20 | }, 21 | "/iBiodT/": { 22 | "display_text": "B", 23 | "vendor_code": "/iBiodT/", 24 | "display_connector": false, 25 | "location": "internal", 26 | "allowed_bases": ["T"] 27 | }, 28 | "/iCy3/": { 29 | "display_text": "Cy3", 30 | "vendor_code": "/iCy3/", 31 | "display_connector": false, 32 | "location": "internal" 33 | }, 34 | "/iCy5/": { 35 | "display_text": "Cy5", 36 | "vendor_code": "/iCy5/", 37 | "display_connector": false, 38 | "location": "internal" 39 | }, 40 | "/3Cy3Sp/": { 41 | "display_text": "Cy3", 42 | "vendor_code": "/3Cy3Sp/", 43 | "display_connector": false, 44 | "location": "3'" 45 | }, 46 | "/5Cy5/": { 47 | "display_text": "Cy5", 48 | "vendor_code": "/5Cy5/", 49 | "display_connector": false, 50 | "location": "5'" 51 | } 52 | }, 53 | "strands": [ 54 | { 55 | "color": "#0066cc", 56 | "sequence": "AACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTA", 57 | "domains": [ 58 | {"helix": 1, "forward": false, "start": 0, "end": 16, "deletions": [12], "insertions": [[2, 1]]}, 59 | {"helix": 0, "forward": true, "start": 0, "end": 32, "deletions": [11, 12, 24], "insertions": [[29, 1]]}, 60 | {"helix": 1, "forward": false, "start": 16, "end": 32, "deletions": [24]} 61 | ], 62 | "5prime_modification": "/5Biosg/", 63 | "3prime_modification": "/3Cy3Sp/", 64 | "internal_modifications": {"5": "/iCy5/", "32": "/iCy3/"} 65 | }, 66 | { 67 | "color": "#f74308", 68 | "sequence": "AGTTAGTTAGTTAGTTTTAGTTAGTTAGTT", 69 | "domains": [ 70 | {"helix": 1, "forward": true, "start": 0, "end": 16, "deletions": [12], "insertions": [[2, 1]]}, 71 | {"helix": 0, "forward": false, "start": 0, "end": 16, "deletions": [11, 12]} 72 | ], 73 | "5prime_modification": "/5Biosg/", 74 | "3prime_modification": "/3Cy3Sp/", 75 | "internal_modifications": {"9": "/iCy3/", "10": "/iBiodT/", "11": "/iCy3/", "12": "/iCy5/", "4": "/iCy3/", "26": "/iCy5/"} 76 | }, 77 | { 78 | "color": "#57bb00", 79 | "sequence": "TTAGTTAGTTAGTTAGTAGTTAGTTAGTTAG", 80 | "domains": [ 81 | {"helix": 0, "forward": false, "start": 16, "end": 32, "deletions": [24], "insertions": [[29, 1]]}, 82 | {"helix": 1, "forward": true, "start": 16, "end": 32, "deletions": [24]} 83 | ], 84 | "5prime_modification": "/5Cy5/", 85 | "3prime_modification": "/3Bio/", 86 | "internal_modifications": {"5": "/iCy3/"} 87 | } 88 | ] 89 | } -------------------------------------------------------------------------------- /examples/output_designs/2_staple_2_helix_origami_6bases_wide.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]}, 6 | {"grid_position": [0, 1]} 7 | ], 8 | "strands": [ 9 | { 10 | "color": "#f74308", 11 | "sequence": "TTTG", 12 | "domains": [ 13 | {"helix": 1, "forward": true, "start": 0, "end": 3, "deletions": [1]}, 14 | {"helix": 0, "forward": false, "start": 0, "end": 3, "deletions": [1]} 15 | ] 16 | }, 17 | { 18 | "color": "#57bb00", 19 | "sequence": "GAAC", 20 | "domains": [ 21 | {"helix": 0, "forward": false, "start": 3, "end": 6, "deletions": [4]}, 22 | {"helix": 1, "forward": true, "start": 3, "end": 6, "deletions": [4]} 23 | ] 24 | }, 25 | { 26 | "color": "#0066cc", 27 | "sequence": "AACATCGT", 28 | "domains": [ 29 | {"helix": 1, "forward": false, "start": 0, "end": 3, "deletions": [1]}, 30 | {"helix": 0, "forward": true, "start": 0, "end": 6, "deletions": [1, 4]}, 31 | {"helix": 1, "forward": false, "start": 3, "end": 6, "deletions": [4]} 32 | ] 33 | } 34 | ] 35 | } -------------------------------------------------------------------------------- /examples/output_designs/2_staple_2_helix_origami_deletions.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]}, 6 | {"grid_position": [0, 1]} 7 | ], 8 | "strands": [ 9 | { 10 | "color": "#f74308", 11 | "sequence": "GTTAGTTAGTTAGTTTAGTTAGTTAGTTA", 12 | "domains": [ 13 | {"helix": 1, "forward": true, "start": 0, "end": 16, "deletions": [12]}, 14 | {"helix": 0, "forward": false, "start": 0, "end": 16, "deletions": [11, 12]} 15 | ] 16 | }, 17 | { 18 | "color": "#57bb00", 19 | "sequence": "AGTTAGTTAGTTAGTGTTAGTTAGTTAGTT", 20 | "domains": [ 21 | {"helix": 0, "forward": false, "start": 16, "end": 32, "deletions": [24]}, 22 | {"helix": 1, "forward": true, "start": 16, "end": 32, "deletions": [24]} 23 | ] 24 | }, 25 | { 26 | "color": "#0066cc", 27 | "sequence": "AACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAAC", 28 | "domains": [ 29 | {"helix": 1, "forward": false, "start": 0, "end": 16, "deletions": [12]}, 30 | {"helix": 0, "forward": true, "start": 0, "end": 32, "deletions": [11, 12, 24]}, 31 | {"helix": 1, "forward": false, "start": 16, "end": 32, "deletions": [24]} 32 | ] 33 | } 34 | ] 35 | } -------------------------------------------------------------------------------- /examples/output_designs/2_staple_2_helix_origami_deletions_insertions.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 48, "grid_position": [0, 0]}, 6 | {"max_offset": 48, "grid_position": [0, 1]} 7 | ], 8 | "strands": [ 9 | { 10 | "color": "#0066cc", 11 | "sequence": "AACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACG", 12 | "domains": [ 13 | {"helix": 1, "forward": false, "start": 8, "end": 24, "deletions": [20]}, 14 | {"helix": 0, "forward": true, "start": 8, "end": 40, "insertions": [[14, 1], [26, 2]]}, 15 | {"loopout": 3}, 16 | {"helix": 1, "forward": false, "start": 24, "end": 40} 17 | ], 18 | "is_scaffold": true 19 | }, 20 | { 21 | "color": "#f74308", 22 | "sequence": "ACGTTACGTTACGTTTTACGTTACGTTACGTT", 23 | "domains": [ 24 | {"helix": 1, "forward": true, "start": 8, "end": 24, "deletions": [20]}, 25 | {"helix": 0, "forward": false, "start": 8, "end": 24, "insertions": [[14, 1]]} 26 | ] 27 | }, 28 | { 29 | "color": "#57bb00", 30 | "sequence": "ACGTTACGTTACGTTACGCGTTACGTTACGTTAC", 31 | "domains": [ 32 | {"helix": 0, "forward": false, "start": 24, "end": 40, "insertions": [[26, 2]]}, 33 | {"helix": 1, "forward": true, "start": 24, "end": 40} 34 | ] 35 | } 36 | ] 37 | } -------------------------------------------------------------------------------- /examples/output_designs/2_staple_2_helix_origami_deletions_insertions_labels.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 48, "grid_position": [0, 0]}, 6 | {"max_offset": 48, "grid_position": [0, 1]} 7 | ], 8 | "strands": [ 9 | { 10 | "color": "#0066cc", 11 | "sequence": "AACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACG", 12 | "domains": [ 13 | {"helix": 1, "forward": false, "start": 8, "end": 24, "deletions": [20]}, 14 | {"helix": 0, "forward": true, "start": 8, "end": 40, "insertions": [[14, 1], [26, 2]]}, 15 | {"loopout": 3}, 16 | {"helix": 1, "forward": false, "start": 24, "end": 40} 17 | ], 18 | "is_scaffold": true, 19 | "label": "scaffold label" 20 | }, 21 | { 22 | "color": "#f74308", 23 | "sequence": "ACGTTACGTTACGTTTTACGTTACGTTACGTT", 24 | "domains": [ 25 | {"helix": 1, "forward": true, "start": 8, "end": 24, "deletions": [20]}, 26 | {"helix": 0, "forward": false, "start": 8, "end": 24, "insertions": [[14, 1]]} 27 | ], 28 | "label": "left staple" 29 | }, 30 | { 31 | "color": "#57bb00", 32 | "sequence": "ACGTTACGTTACGTTACGCGTTACGTTACGTTAC", 33 | "domains": [ 34 | {"helix": 0, "forward": false, "start": 24, "end": 40, "insertions": [[26, 2]]}, 35 | {"helix": 1, "forward": true, "start": 24, "end": 40} 36 | ], 37 | "label": "right staple" 38 | } 39 | ] 40 | } -------------------------------------------------------------------------------- /examples/output_designs/2_staple_2_helix_origami_deletions_insertions_mods.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 48, "grid_position": [0, 0]}, 6 | {"max_offset": 48, "grid_position": [0, 1]} 7 | ], 8 | "modifications_in_design": { 9 | "/5Biosg/": { 10 | "display_text": "B", 11 | "vendor_code": "/5Biosg/", 12 | "display_connector": false, 13 | "location": "5'" 14 | } 15 | }, 16 | "strands": [ 17 | { 18 | "color": "#0066cc", 19 | "sequence": "AACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACG", 20 | "domains": [ 21 | {"helix": 1, "forward": false, "start": 8, "end": 24, "deletions": [20]}, 22 | {"helix": 0, "forward": true, "start": 8, "end": 40, "insertions": [[14, 1], [26, 2]]}, 23 | {"loopout": 3}, 24 | {"helix": 1, "forward": false, "start": 24, "end": 40} 25 | ], 26 | "is_scaffold": true 27 | }, 28 | { 29 | "color": "#f74308", 30 | "sequence": "ACGTTACGTTACGTTTTACGTTACGTTACGTT", 31 | "domains": [ 32 | {"helix": 1, "forward": true, "start": 8, "end": 24, "deletions": [20]}, 33 | {"helix": 0, "forward": false, "start": 8, "end": 24, "insertions": [[14, 1]]} 34 | ] 35 | }, 36 | { 37 | "color": "#57bb00", 38 | "sequence": "ACGTTACGTTACGTTACGCGTTACGTTACGTTAC", 39 | "domains": [ 40 | {"helix": 0, "forward": false, "start": 24, "end": 40, "insertions": [[26, 2]]}, 41 | {"helix": 1, "forward": true, "start": 24, "end": 40} 42 | ], 43 | "5prime_modification": "/5Biosg/" 44 | } 45 | ] 46 | } -------------------------------------------------------------------------------- /examples/output_designs/2_staple_2_helix_origami_deletions_insertions_mods_chained_methods.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 48, "grid_position": [0, 0]}, 6 | {"max_offset": 48, "grid_position": [0, 1]} 7 | ], 8 | "modifications_in_design": { 9 | "/5Biosg/": { 10 | "display_text": "B", 11 | "vendor_code": "/5Biosg/", 12 | "display_connector": false, 13 | "location": "5'" 14 | } 15 | }, 16 | "strands": [ 17 | { 18 | "color": "#f74308", 19 | "sequence": "ACGTTACGTTACGTTTTACGTTACGTTACGTT", 20 | "domains": [ 21 | {"helix": 1, "forward": true, "start": 8, "end": 24, "deletions": [20]}, 22 | {"helix": 0, "forward": false, "start": 8, "end": 24, "insertions": [[14, 1]]} 23 | ] 24 | }, 25 | { 26 | "color": "#57bb00", 27 | "sequence": "ACGTTACGTTACGTTACGCGTTACGTTACGTTAC", 28 | "domains": [ 29 | {"helix": 0, "forward": false, "start": 24, "end": 40, "insertions": [[26, 2]]}, 30 | {"helix": 1, "forward": true, "start": 24, "end": 40} 31 | ], 32 | "5prime_modification": "/5Biosg/" 33 | }, 34 | { 35 | "color": "#0066cc", 36 | "sequence": "AACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACG", 37 | "domains": [ 38 | {"helix": 1, "forward": false, "start": 8, "end": 24, "deletions": [20]}, 39 | {"helix": 0, "forward": true, "start": 8, "end": 40, "insertions": [[14, 1], [26, 2]]}, 40 | {"loopout": 3}, 41 | {"helix": 1, "forward": false, "start": 24, "end": 40} 42 | ], 43 | "is_scaffold": true 44 | } 45 | ] 46 | } -------------------------------------------------------------------------------- /examples/output_designs/2_staple_2_helix_origami_deletions_insertions_new_geometry.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "geometry": { 5 | "rise_per_base_pair": 0.2, 6 | "helix_radius": 1.2 7 | }, 8 | "helices": [ 9 | {"max_offset": 48, "grid_position": [0, 0]}, 10 | {"max_offset": 48, "grid_position": [0, 1]} 11 | ], 12 | "strands": [ 13 | { 14 | "color": "#0066cc", 15 | "sequence": "AACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACG", 16 | "domains": [ 17 | {"helix": 1, "forward": false, "start": 8, "end": 24, "deletions": [20]}, 18 | {"helix": 0, "forward": true, "start": 8, "end": 40, "insertions": [[14, 1], [26, 2]]}, 19 | {"loopout": 3}, 20 | {"helix": 1, "forward": false, "start": 24, "end": 40} 21 | ], 22 | "is_scaffold": true 23 | }, 24 | { 25 | "color": "#f74308", 26 | "sequence": "ACGTTACGTTACGTTTTACGTTACGTTACGTT", 27 | "domains": [ 28 | {"helix": 1, "forward": true, "start": 8, "end": 24, "deletions": [20]}, 29 | {"helix": 0, "forward": false, "start": 8, "end": 24, "insertions": [[14, 1]]} 30 | ] 31 | }, 32 | { 33 | "color": "#57bb00", 34 | "sequence": "ACGTTACGTTACGTTACGCGTTACGTTACGTTAC", 35 | "domains": [ 36 | {"helix": 0, "forward": false, "start": 24, "end": 40, "insertions": [[26, 2]]}, 37 | {"helix": 1, "forward": true, "start": 24, "end": 40} 38 | ] 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /examples/output_designs/2_staple_2_helix_origami_deletions_insertions_no_seq.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]}, 6 | {"grid_position": [0, 1]} 7 | ], 8 | "strands": [ 9 | { 10 | "color": "#0066cc", 11 | "domains": [ 12 | {"helix": 1, "forward": false, "start": 0, "end": 16, "deletions": [12], "insertions": [[6, 3]]}, 13 | {"helix": 0, "forward": true, "start": 0, "end": 32, "deletions": [11, 12, 24], "insertions": [[6, 1], [18, 2]]}, 14 | {"loopout": 3}, 15 | {"helix": 1, "forward": false, "start": 16, "end": 32, "deletions": [24], "insertions": [[18, 4]]} 16 | ], 17 | "is_scaffold": true 18 | }, 19 | { 20 | "color": "#f74308", 21 | "domains": [ 22 | {"helix": 1, "forward": true, "start": 0, "end": 16, "deletions": [12], "insertions": [[6, 3]]}, 23 | {"helix": 0, "forward": false, "start": 0, "end": 16, "deletions": [11, 12], "insertions": [[6, 1]]} 24 | ] 25 | }, 26 | { 27 | "color": "#57bb00", 28 | "domains": [ 29 | {"helix": 0, "forward": false, "start": 16, "end": 32, "deletions": [24], "insertions": [[18, 2]]}, 30 | {"helix": 1, "forward": true, "start": 16, "end": 32, "deletions": [24], "insertions": [[18, 4]]} 31 | ] 32 | } 33 | ] 34 | } -------------------------------------------------------------------------------- /examples/output_designs/3_helix_deletions_insertions.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]}, 6 | {"grid_position": [0, 1]}, 7 | {"grid_position": [0, 2]} 8 | ], 9 | "strands": [ 10 | { 11 | "color": "#0066cc", 12 | "sequence": "AACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACTAACT", 13 | "domains": [ 14 | {"helix": 1, "forward": false, "start": 0, "end": 16, "deletions": [12], "insertions": [[6, 3]]}, 15 | {"helix": 0, "forward": true, "start": 0, "end": 32, "deletions": [11, 12, 24], "insertions": [[6, 1], [18, 2]]}, 16 | {"loopout": 3}, 17 | {"helix": 1, "forward": false, "start": 16, "end": 32, "deletions": [24], "insertions": [[18, 4]]} 18 | ], 19 | "is_scaffold": true 20 | }, 21 | { 22 | "color": "#f74308", 23 | "sequence": "TTAGTTAGTTAGTTAGTTTAGTTAGTTAGTTAG", 24 | "domains": [ 25 | {"helix": 1, "forward": true, "start": 0, "end": 16, "deletions": [12], "insertions": [[6, 3]]}, 26 | {"helix": 0, "forward": false, "start": 0, "end": 16, "deletions": [11, 12], "insertions": [[6, 1]]} 27 | ] 28 | }, 29 | { 30 | "color": "#57bb00", 31 | "sequence": "TTAGTTAGTTAGTTAGTAGTTAGTTAGTTAGTTAGT", 32 | "domains": [ 33 | {"helix": 0, "forward": false, "start": 16, "end": 32, "deletions": [24], "insertions": [[18, 2]]}, 34 | {"helix": 1, "forward": true, "start": 16, "end": 32, "deletions": [24], "insertions": [[18, 4]]} 35 | ] 36 | }, 37 | { 38 | "color": "#888888", 39 | "sequence": "AACTAACTAACTAACT", 40 | "domains": [ 41 | {"helix": 1, "forward": true, "start": 32, "end": 48} 42 | ] 43 | }, 44 | { 45 | "color": "#32b86c", 46 | "sequence": "GGTAGGTAGGTAGGTA", 47 | "domains": [ 48 | {"helix": 1, "forward": true, "start": 48, "end": 64} 49 | ] 50 | }, 51 | { 52 | "color": "#333333", 53 | "domains": [ 54 | {"helix": 2, "forward": false, "start": 32, "end": 48} 55 | ] 56 | }, 57 | { 58 | "color": "#320096", 59 | "domains": [ 60 | {"helix": 2, "forward": true, "start": 16, "end": 32} 61 | ] 62 | }, 63 | { 64 | "color": "#03b6a2", 65 | "sequence": "AGTTAGTTAGTTAGTT", 66 | "domains": [ 67 | {"helix": 1, "forward": false, "start": 32, "end": 48} 68 | ] 69 | }, 70 | { 71 | "color": "#7300de", 72 | "sequence": "TACCTACCTACCTACC", 73 | "domains": [ 74 | {"helix": 1, "forward": false, "start": 48, "end": 64} 75 | ] 76 | }, 77 | { 78 | "color": "#aaaa00", 79 | "domains": [ 80 | {"helix": 2, "forward": true, "start": 32, "end": 48} 81 | ] 82 | }, 83 | { 84 | "color": "#b8056c", 85 | "domains": [ 86 | {"helix": 2, "forward": true, "start": 0, "end": 16} 87 | ] 88 | } 89 | ] 90 | } -------------------------------------------------------------------------------- /examples/output_designs/4_helix_grid_none.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "none", 4 | "helices": [ 5 | {"position": {"x": 0, "y": 0, "z": 2.5}}, 6 | {"position": {"x": 3, "y": 3, "z": 0}}, 7 | {"position": {"x": 8, "y": -3, "z": 0}}, 8 | {"position": {"x": 11, "y": 1, "z": 0}} 9 | ], 10 | "strands": [ 11 | { 12 | "color": "#f74308", 13 | "domains": [ 14 | {"helix": 0, "forward": true, "start": 0, "end": 10} 15 | ] 16 | }, 17 | { 18 | "color": "#0066cc", 19 | "domains": [ 20 | {"helix": 0, "forward": false, "start": 0, "end": 10} 21 | ] 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /examples/output_designs/4_helix_grid_none_min_offset_position_x_nondefault.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "none", 4 | "helices": [ 5 | {"position": {"x": 0, "y": 0, "z": 0}, "major_tick_distance": 4}, 6 | {"min_offset": 8, "position": {"x": 3, "y": 3, "z": 0}, "major_tick_distance": 4}, 7 | {"position": {"x": 8, "y": -3, "z": 2.5}, "major_tick_distance": 4}, 8 | {"min_offset": 8, "position": {"x": 11, "y": 1, "z": 2.5}, "major_tick_distance": 4} 9 | ], 10 | "strands": [ 11 | { 12 | "color": "#f74308", 13 | "domains": [ 14 | {"helix": 0, "forward": true, "start": 0, "end": 16} 15 | ] 16 | }, 17 | { 18 | "color": "#57bb00", 19 | "domains": [ 20 | {"helix": 1, "forward": true, "start": 8, "end": 16} 21 | ] 22 | }, 23 | { 24 | "color": "#888888", 25 | "domains": [ 26 | {"helix": 2, "forward": true, "start": 0, "end": 16} 27 | ] 28 | }, 29 | { 30 | "color": "#32b86c", 31 | "domains": [ 32 | {"helix": 3, "forward": true, "start": 8, "end": 16} 33 | ] 34 | } 35 | ] 36 | } -------------------------------------------------------------------------------- /examples/output_designs/4_helix_min_offsets_nonzero.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 30, "grid_position": [0, 0]}, 6 | {"min_offset": 1, "max_offset": 30, "grid_position": [0, 1]}, 7 | {"min_offset": 2, "max_offset": 30, "grid_position": [0, 2]}, 8 | {"min_offset": 3, "max_offset": 30, "grid_position": [0, 3]} 9 | ], 10 | "strands": [ 11 | { 12 | "color": "#f74308", 13 | "domains": [ 14 | {"helix": 0, "forward": true, "start": 0, "end": 29} 15 | ] 16 | }, 17 | { 18 | "color": "#0066cc", 19 | "domains": [ 20 | {"helix": 0, "forward": false, "start": 0, "end": 29} 21 | ] 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /examples/output_designs/_error_badly_formatted_file.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.1", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_bases": 25, "grid_position": [0, 0]}, 6 | {"max_bases": 25, "grid_position": [0, 1]} 7 | ], 8 | "strands": [ 9 | { 10 | "color": {"r": 247, "g": 147, "b": 30}, 11 | "substrands": [ 12 | {"forward": false, "start": 0, "end": 5}, 13 | {"helix": 0, "forward": true, "start": 0, "end": 15}, 14 | {"helix": 0, "forward": false, "start": 5, "end": 15} 15 | ] 16 | }, 17 | { 18 | "color": {"r": 87, "g": 187, "b": 0}, 19 | "substrands": [ 20 | {"helix": 0, "forward": true, "start": 10, "end": 20}, 21 | {"helix": 0, "forward": false, "start": 10, "end": 20} 22 | ] 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /examples/output_designs/_error_empty_file.sc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/output_designs/_error_empty_file.sc -------------------------------------------------------------------------------- /examples/output_designs/_error_json_file_not_a_map.sc: -------------------------------------------------------------------------------- 1 | [1,2,3] -------------------------------------------------------------------------------- /examples/output_designs/circular.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]}, 6 | {"grid_position": [0, 1]} 7 | ], 8 | "strands": [ 9 | { 10 | "circular": true, 11 | "color": "#f74308", 12 | "domains": [ 13 | {"helix": 0, "forward": true, "start": 0, "end": 8}, 14 | {"helix": 1, "forward": false, "start": 0, "end": 8} 15 | ] 16 | }, 17 | { 18 | "circular": true, 19 | "color": "#57bb00", 20 | "domains": [ 21 | {"helix": 0, "forward": true, "start": 8, "end": 16}, 22 | {"loopout": 5}, 23 | {"helix": 1, "forward": false, "start": 8, "end": 16} 24 | ] 25 | }, 26 | { 27 | "color": "#888888", 28 | "domains": [ 29 | {"helix": 0, "forward": true, "start": 16, "end": 24}, 30 | {"helix": 1, "forward": false, "start": 16, "end": 24} 31 | ] 32 | } 33 | ] 34 | } -------------------------------------------------------------------------------- /examples/output_designs/consecutive_domains.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 100, "grid_position": [0, 0]}, 6 | {"max_offset": 100, "grid_position": [0, 1]} 7 | ], 8 | "strands": [ 9 | { 10 | "color": "#f74308", 11 | "domains": [ 12 | {"helix": 0, "forward": true, "start": 0, "end": 8}, 13 | {"helix": 0, "forward": true, "start": 8, "end": 16} 14 | ] 15 | }, 16 | { 17 | "color": "#57bb00", 18 | "domains": [ 19 | {"helix": 1, "forward": false, "start": 8, "end": 16}, 20 | {"helix": 1, "forward": false, "start": 0, "end": 8} 21 | ] 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /examples/output_designs/domain_colors.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 100, "grid_position": [0, 0]}, 6 | {"max_offset": 100, "grid_position": [0, 1]}, 7 | {"max_offset": 100, "grid_position": [0, 2]}, 8 | {"max_offset": 100, "grid_position": [0, 3]} 9 | ], 10 | "strands": [ 11 | { 12 | "color": "#0000ff", 13 | "domains": [ 14 | {"extension_num_bases": 5, "color": "#ff0000"}, 15 | {"helix": 0, "forward": true, "start": 0, "end": 8, "color": "#00ff00"}, 16 | {"loopout": 5, "color": "#000096"}, 17 | {"helix": 1, "forward": false, "start": 0, "end": 8, "color": "#960000"}, 18 | {"helix": 2, "forward": true, "start": 0, "end": 8, "color": "#009600"}, 19 | {"helix": 3, "forward": false, "start": 0, "end": 8}, 20 | {"extension_num_bases": 5, "color": "#000000"} 21 | ] 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /examples/output_designs/draw_strand_move_negative.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | { 6 | "max_offset": 20, 7 | "grid_position": [0, 0], 8 | "major_ticks": [0, 5, 10, 15, 20] 9 | } 10 | ], 11 | "strands": [ 12 | { 13 | "color": "#f74308", 14 | "domains": [ 15 | {"helix": 0, "forward": false, "start": 12, "end": 16}, 16 | {"helix": 0, "forward": false, "start": 7, "end": 11} 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /examples/output_designs/empty.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [], 5 | "strands": [] 6 | } -------------------------------------------------------------------------------- /examples/output_designs/extension_and_loopout_oxdna_export.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 32, "grid_position": [0, 0], "roll": 210}, 6 | {"max_offset": 32, "grid_position": [0, 1], "roll": 20}, 7 | {"max_offset": 32, "grid_position": [0, 2], "roll": 210} 8 | ], 9 | "strands": [ 10 | { 11 | "color": "#f74308", 12 | "domains": [ 13 | {"extension_num_bases": 5}, 14 | {"helix": 0, "forward": true, "start": 0, "end": 21}, 15 | {"helix": 1, "forward": false, "start": 0, "end": 21}, 16 | {"loopout": 32}, 17 | {"helix": 2, "forward": true, "start": 0, "end": 21}, 18 | {"extension_num_bases": 7} 19 | ] 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /examples/output_designs/extensions.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 32, "grid_position": [0, 0]}, 6 | {"max_offset": 32, "grid_position": [0, 1]}, 7 | {"max_offset": 32, "grid_position": [0, 2], "roll": 30} 8 | ], 9 | "modifications_in_design": { 10 | "/3Cy3Sp/": { 11 | "display_text": "Cy3", 12 | "vendor_code": "/3Cy3Sp/", 13 | "display_connector": false, 14 | "location": "3'" 15 | }, 16 | "/5Cy5/": { 17 | "display_text": "Cy5", 18 | "vendor_code": "/5Cy5/", 19 | "display_connector": false, 20 | "location": "5'" 21 | } 22 | }, 23 | "strands": [ 24 | { 25 | "name": "strand1", 26 | "color": "#f74308", 27 | "sequence": "TATTTGGGGGGGGCCCCCCCCTTTGGGGGGGGATAAAAA", 28 | "domains": [ 29 | {"extension_num_bases": 5, "display_length": 2.5, "display_angle": 45, "name": "ext_5p 1"}, 30 | {"name": "domain 1", "helix": 0, "forward": true, "start": 0, "end": 8}, 31 | {"helix": 1, "forward": false, "start": 0, "end": 8}, 32 | {"loopout": 3, "name": "loopout 1"}, 33 | {"helix": 2, "forward": true, "start": 0, "end": 8}, 34 | {"extension_num_bases": 7, "name": "ext_3p 1"} 35 | ], 36 | "5prime_modification": "/5Cy5/", 37 | "3prime_modification": "/3Cy3Sp/" 38 | }, 39 | { 40 | "name": "strand2", 41 | "color": "#57bb00", 42 | "sequence": "ATAAACCCCCCCCGGGGGGGGAAACCCCCCCCTATTTTT", 43 | "domains": [ 44 | {"extension_num_bases": 5, "display_length": 3.5, "display_angle": 60, "name": "ext_5p 2"}, 45 | {"helix": 0, "forward": false, "start": 16, "end": 24}, 46 | {"helix": 1, "forward": true, "start": 16, "end": 24}, 47 | {"loopout": 3}, 48 | {"helix": 2, "forward": false, "start": 16, "end": 24}, 49 | {"extension_num_bases": 7, "name": "ext_3p 2"} 50 | ] 51 | } 52 | ] 53 | } -------------------------------------------------------------------------------- /examples/output_designs/hairpin.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]} 6 | ], 7 | "strands": [ 8 | { 9 | "color": "#f74308", 10 | "sequence": "AAAAACCCCCTGCATGGGGGTTTTT", 11 | "domains": [ 12 | {"helix": 0, "forward": true, "start": 0, "end": 10}, 13 | {"loopout": 5}, 14 | {"helix": 0, "forward": false, "start": 0, "end": 10} 15 | ] 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /examples/output_designs/helices_out_of_order_nonconsecutive.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "none", 4 | "helices": [ 5 | {"max_offset": 20, "position": {"x": 0, "y": 0.0, "z": 0}, "idx": 2}, 6 | {"max_offset": 20, "position": {"x": 0, "y": 3.0, "z": 0}, "idx": 3}, 7 | {"max_offset": 20, "position": {"x": 0, "y": 6.0, "z": 0}, "idx": 5}, 8 | {"max_offset": 20, "position": {"x": 0, "y": 9.0, "z": 0}, "idx": 7}, 9 | {"max_offset": 20, "position": {"x": 0, "y": 12.0, "z": 0}, "idx": 11} 10 | ], 11 | "strands": [] 12 | } -------------------------------------------------------------------------------- /examples/output_designs/helix_groups.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "groups": { 4 | "north": { 5 | "position": {"x": 0, "y": -10, "z": 0}, 6 | "grid": "honeycomb" 7 | }, 8 | "east": { 9 | "position": {"x": 0, "y": 0, "z": 10}, 10 | "grid": "square" 11 | }, 12 | "south": { 13 | "position": {"x": 0, "y": 10, "z": 0}, 14 | "grid": "square", 15 | "helices_view_order": [7, 6] 16 | }, 17 | "west": { 18 | "position": {"x": 0, "y": 0, "z": -10}, 19 | "grid": "none" 20 | }, 21 | "r": { 22 | "position": {"x": 0, "y": 10, "z": 10}, 23 | "pitch": 45, 24 | "grid": "square" 25 | } 26 | }, 27 | "helices": [ 28 | {"group": "north", "max_offset": 20, "grid_position": [0, 0], "idx": 0}, 29 | {"group": "north", "max_offset": 21, "grid_position": [1, 0], "idx": 1}, 30 | {"group": "north", "max_offset": 19, "grid_position": [1, 1], "idx": 2}, 31 | {"group": "north", "max_offset": 18, "grid_position": [0, 1], "idx": 3}, 32 | {"group": "north", "max_offset": 17, "grid_position": [-1, 1], "idx": 4}, 33 | {"group": "north", "max_offset": 16, "grid_position": [-1, 0], "idx": 5}, 34 | {"group": "south", "max_offset": 24, "grid_position": [0, 1], "idx": 6}, 35 | {"group": "south", "max_offset": 25, "grid_position": [0, 0], "idx": 7}, 36 | {"group": "west", "max_offset": 26, "position": {"x": 0, "y": 0, "z": 0}, "idx": 8}, 37 | {"group": "west", "max_offset": 27, "position": {"x": 0, "y": 3, "z": 0}, "idx": 9}, 38 | {"group": "r", "max_offset": 26, "grid_position": [0, 0], "idx": 10}, 39 | {"group": "r", "max_offset": 27, "grid_position": [0, 1], "idx": 11}, 40 | {"group": "east", "max_offset": 22, "grid_position": [0, 0], "idx": 13}, 41 | {"group": "east", "max_offset": 23, "grid_position": [0, 1], "idx": 15} 42 | ], 43 | "strands": [ 44 | { 45 | "color": "#f74308", 46 | "domains": [ 47 | {"helix": 0, "forward": true, "start": 0, "end": 8}, 48 | {"helix": 1, "forward": false, "start": 0, "end": 8}, 49 | {"helix": 2, "forward": true, "start": 0, "end": 8}, 50 | {"helix": 3, "forward": false, "start": 0, "end": 8}, 51 | {"helix": 4, "forward": true, "start": 0, "end": 8}, 52 | {"helix": 5, "forward": false, "start": 0, "end": 8} 53 | ] 54 | }, 55 | { 56 | "color": "#57bb00", 57 | "domains": [ 58 | {"helix": 4, "forward": true, "start": 10, "end": 13} 59 | ] 60 | }, 61 | { 62 | "color": "#888888", 63 | "domains": [ 64 | {"helix": 6, "forward": true, "start": 0, "end": 8}, 65 | {"helix": 7, "forward": false, "start": 0, "end": 8} 66 | ] 67 | }, 68 | { 69 | "color": "#32b86c", 70 | "domains": [ 71 | {"helix": 8, "forward": true, "start": 0, "end": 8}, 72 | {"helix": 9, "forward": false, "start": 0, "end": 8} 73 | ] 74 | }, 75 | { 76 | "color": "#333333", 77 | "domains": [ 78 | {"helix": 13, "forward": true, "start": 0, "end": 8}, 79 | {"helix": 15, "forward": false, "start": 0, "end": 8} 80 | ] 81 | }, 82 | { 83 | "color": "#320096", 84 | "domains": [ 85 | {"helix": 8, "forward": true, "start": 8, "end": 11} 86 | ] 87 | }, 88 | { 89 | "color": "#03b6a2", 90 | "domains": [ 91 | {"helix": 13, "forward": true, "start": 8, "end": 11} 92 | ] 93 | }, 94 | { 95 | "color": "#7300de", 96 | "domains": [ 97 | {"helix": 10, "forward": true, "start": 0, "end": 8}, 98 | {"helix": 11, "forward": false, "start": 0, "end": 8} 99 | ] 100 | } 101 | ] 102 | } -------------------------------------------------------------------------------- /examples/output_designs/hex_lattice_10x10.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "hex", 4 | "helices": [ 5 | {"max_offset": 16, "grid_position": [0, 0]}, 6 | {"max_offset": 16, "grid_position": [1, 0]}, 7 | {"max_offset": 16, "grid_position": [2, 0]}, 8 | {"max_offset": 16, "grid_position": [3, 0]}, 9 | {"max_offset": 16, "grid_position": [4, 0]}, 10 | {"max_offset": 16, "grid_position": [5, 0]}, 11 | {"max_offset": 16, "grid_position": [6, 0]}, 12 | {"max_offset": 16, "grid_position": [7, 0]}, 13 | {"max_offset": 16, "grid_position": [8, 0]}, 14 | {"max_offset": 16, "grid_position": [9, 0]}, 15 | {"max_offset": 16, "grid_position": [0, 1]}, 16 | {"max_offset": 16, "grid_position": [1, 1]}, 17 | {"max_offset": 16, "grid_position": [2, 1]}, 18 | {"max_offset": 16, "grid_position": [3, 1]}, 19 | {"max_offset": 16, "grid_position": [4, 1]}, 20 | {"max_offset": 16, "grid_position": [5, 1]}, 21 | {"max_offset": 16, "grid_position": [6, 1]}, 22 | {"max_offset": 16, "grid_position": [7, 1]}, 23 | {"max_offset": 16, "grid_position": [8, 1]}, 24 | {"max_offset": 16, "grid_position": [9, 1]}, 25 | {"max_offset": 16, "grid_position": [0, 2]}, 26 | {"max_offset": 16, "grid_position": [1, 2]}, 27 | {"max_offset": 16, "grid_position": [2, 2]}, 28 | {"max_offset": 16, "grid_position": [3, 2]}, 29 | {"max_offset": 16, "grid_position": [4, 2]}, 30 | {"max_offset": 16, "grid_position": [5, 2]}, 31 | {"max_offset": 16, "grid_position": [6, 2]}, 32 | {"max_offset": 16, "grid_position": [7, 2]}, 33 | {"max_offset": 16, "grid_position": [8, 2]}, 34 | {"max_offset": 16, "grid_position": [9, 2]}, 35 | {"max_offset": 16, "grid_position": [0, 3]}, 36 | {"max_offset": 16, "grid_position": [1, 3]}, 37 | {"max_offset": 16, "grid_position": [2, 3]}, 38 | {"max_offset": 16, "grid_position": [3, 3]}, 39 | {"max_offset": 16, "grid_position": [4, 3]}, 40 | {"max_offset": 16, "grid_position": [5, 3]}, 41 | {"max_offset": 16, "grid_position": [6, 3]}, 42 | {"max_offset": 16, "grid_position": [7, 3]}, 43 | {"max_offset": 16, "grid_position": [8, 3]}, 44 | {"max_offset": 16, "grid_position": [9, 3]}, 45 | {"max_offset": 16, "grid_position": [0, 4]}, 46 | {"max_offset": 16, "grid_position": [1, 4]}, 47 | {"max_offset": 16, "grid_position": [2, 4]}, 48 | {"max_offset": 16, "grid_position": [3, 4]}, 49 | {"max_offset": 16, "grid_position": [4, 4]}, 50 | {"max_offset": 16, "grid_position": [5, 4]}, 51 | {"max_offset": 16, "grid_position": [6, 4]}, 52 | {"max_offset": 16, "grid_position": [7, 4]}, 53 | {"max_offset": 16, "grid_position": [8, 4]}, 54 | {"max_offset": 16, "grid_position": [9, 4]}, 55 | {"max_offset": 16, "grid_position": [0, 5]}, 56 | {"max_offset": 16, "grid_position": [1, 5]}, 57 | {"max_offset": 16, "grid_position": [2, 5]}, 58 | {"max_offset": 16, "grid_position": [3, 5]}, 59 | {"max_offset": 16, "grid_position": [4, 5]}, 60 | {"max_offset": 16, "grid_position": [5, 5]}, 61 | {"max_offset": 16, "grid_position": [6, 5]}, 62 | {"max_offset": 16, "grid_position": [7, 5]}, 63 | {"max_offset": 16, "grid_position": [8, 5]}, 64 | {"max_offset": 16, "grid_position": [9, 5]}, 65 | {"max_offset": 16, "grid_position": [0, 6]}, 66 | {"max_offset": 16, "grid_position": [1, 6]}, 67 | {"max_offset": 16, "grid_position": [2, 6]}, 68 | {"max_offset": 16, "grid_position": [3, 6]}, 69 | {"max_offset": 16, "grid_position": [4, 6]}, 70 | {"max_offset": 16, "grid_position": [5, 6]}, 71 | {"max_offset": 16, "grid_position": [6, 6]}, 72 | {"max_offset": 16, "grid_position": [7, 6]}, 73 | {"max_offset": 16, "grid_position": [8, 6]}, 74 | {"max_offset": 16, "grid_position": [9, 6]}, 75 | {"max_offset": 16, "grid_position": [0, 7]}, 76 | {"max_offset": 16, "grid_position": [1, 7]}, 77 | {"max_offset": 16, "grid_position": [2, 7]}, 78 | {"max_offset": 16, "grid_position": [3, 7]}, 79 | {"max_offset": 16, "grid_position": [4, 7]}, 80 | {"max_offset": 16, "grid_position": [5, 7]}, 81 | {"max_offset": 16, "grid_position": [6, 7]}, 82 | {"max_offset": 16, "grid_position": [7, 7]}, 83 | {"max_offset": 16, "grid_position": [8, 7]}, 84 | {"max_offset": 16, "grid_position": [9, 7]}, 85 | {"max_offset": 16, "grid_position": [0, 8]}, 86 | {"max_offset": 16, "grid_position": [1, 8]}, 87 | {"max_offset": 16, "grid_position": [2, 8]}, 88 | {"max_offset": 16, "grid_position": [3, 8]}, 89 | {"max_offset": 16, "grid_position": [4, 8]}, 90 | {"max_offset": 16, "grid_position": [5, 8]}, 91 | {"max_offset": 16, "grid_position": [6, 8]}, 92 | {"max_offset": 16, "grid_position": [7, 8]}, 93 | {"max_offset": 16, "grid_position": [8, 8]}, 94 | {"max_offset": 16, "grid_position": [9, 8]}, 95 | {"max_offset": 16, "grid_position": [0, 9]}, 96 | {"max_offset": 16, "grid_position": [1, 9]}, 97 | {"max_offset": 16, "grid_position": [2, 9]}, 98 | {"max_offset": 16, "grid_position": [3, 9]}, 99 | {"max_offset": 16, "grid_position": [4, 9]}, 100 | {"max_offset": 16, "grid_position": [5, 9]}, 101 | {"max_offset": 16, "grid_position": [6, 9]}, 102 | {"max_offset": 16, "grid_position": [7, 9]}, 103 | {"max_offset": 16, "grid_position": [8, 9]}, 104 | {"max_offset": 16, "grid_position": [9, 9]} 105 | ], 106 | "strands": [] 107 | } -------------------------------------------------------------------------------- /examples/output_designs/hex_lattice_10x10_with_negative.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "hex", 4 | "helices": [ 5 | {"max_offset": 16, "grid_position": [-4, -4]}, 6 | {"max_offset": 16, "grid_position": [-3, -4]}, 7 | {"max_offset": 16, "grid_position": [-2, -4]}, 8 | {"max_offset": 16, "grid_position": [-1, -4]}, 9 | {"max_offset": 16, "grid_position": [0, -4]}, 10 | {"max_offset": 16, "grid_position": [1, -4]}, 11 | {"max_offset": 16, "grid_position": [2, -4]}, 12 | {"max_offset": 16, "grid_position": [3, -4]}, 13 | {"max_offset": 16, "grid_position": [4, -4]}, 14 | {"max_offset": 16, "grid_position": [5, -4]}, 15 | {"max_offset": 16, "grid_position": [-4, -3]}, 16 | {"max_offset": 16, "grid_position": [-3, -3]}, 17 | {"max_offset": 16, "grid_position": [-2, -3]}, 18 | {"max_offset": 16, "grid_position": [-1, -3]}, 19 | {"max_offset": 16, "grid_position": [0, -3]}, 20 | {"max_offset": 16, "grid_position": [1, -3]}, 21 | {"max_offset": 16, "grid_position": [2, -3]}, 22 | {"max_offset": 16, "grid_position": [3, -3]}, 23 | {"max_offset": 16, "grid_position": [4, -3]}, 24 | {"max_offset": 16, "grid_position": [5, -3]}, 25 | {"max_offset": 16, "grid_position": [-4, -2]}, 26 | {"max_offset": 16, "grid_position": [-3, -2]}, 27 | {"max_offset": 16, "grid_position": [-2, -2]}, 28 | {"max_offset": 16, "grid_position": [-1, -2]}, 29 | {"max_offset": 16, "grid_position": [0, -2]}, 30 | {"max_offset": 16, "grid_position": [1, -2]}, 31 | {"max_offset": 16, "grid_position": [2, -2]}, 32 | {"max_offset": 16, "grid_position": [3, -2]}, 33 | {"max_offset": 16, "grid_position": [4, -2]}, 34 | {"max_offset": 16, "grid_position": [5, -2]}, 35 | {"max_offset": 16, "grid_position": [-4, -1]}, 36 | {"max_offset": 16, "grid_position": [-3, -1]}, 37 | {"max_offset": 16, "grid_position": [-2, -1]}, 38 | {"max_offset": 16, "grid_position": [-1, -1]}, 39 | {"max_offset": 16, "grid_position": [0, -1]}, 40 | {"max_offset": 16, "grid_position": [1, -1]}, 41 | {"max_offset": 16, "grid_position": [2, -1]}, 42 | {"max_offset": 16, "grid_position": [3, -1]}, 43 | {"max_offset": 16, "grid_position": [4, -1]}, 44 | {"max_offset": 16, "grid_position": [5, -1]}, 45 | {"max_offset": 16, "grid_position": [-4, 0]}, 46 | {"max_offset": 16, "grid_position": [-3, 0]}, 47 | {"max_offset": 16, "grid_position": [-2, 0]}, 48 | {"max_offset": 16, "grid_position": [-1, 0]}, 49 | {"max_offset": 16, "grid_position": [0, 0]}, 50 | {"max_offset": 16, "grid_position": [1, 0]}, 51 | {"max_offset": 16, "grid_position": [2, 0]}, 52 | {"max_offset": 16, "grid_position": [3, 0]}, 53 | {"max_offset": 16, "grid_position": [4, 0]}, 54 | {"max_offset": 16, "grid_position": [5, 0]}, 55 | {"max_offset": 16, "grid_position": [-4, 1]}, 56 | {"max_offset": 16, "grid_position": [-3, 1]}, 57 | {"max_offset": 16, "grid_position": [-2, 1]}, 58 | {"max_offset": 16, "grid_position": [-1, 1]}, 59 | {"max_offset": 16, "grid_position": [0, 1]}, 60 | {"max_offset": 16, "grid_position": [1, 1]}, 61 | {"max_offset": 16, "grid_position": [2, 1]}, 62 | {"max_offset": 16, "grid_position": [3, 1]}, 63 | {"max_offset": 16, "grid_position": [4, 1]}, 64 | {"max_offset": 16, "grid_position": [5, 1]}, 65 | {"max_offset": 16, "grid_position": [-4, 2]}, 66 | {"max_offset": 16, "grid_position": [-3, 2]}, 67 | {"max_offset": 16, "grid_position": [-2, 2]}, 68 | {"max_offset": 16, "grid_position": [-1, 2]}, 69 | {"max_offset": 16, "grid_position": [0, 2]}, 70 | {"max_offset": 16, "grid_position": [1, 2]}, 71 | {"max_offset": 16, "grid_position": [2, 2]}, 72 | {"max_offset": 16, "grid_position": [3, 2]}, 73 | {"max_offset": 16, "grid_position": [4, 2]}, 74 | {"max_offset": 16, "grid_position": [5, 2]}, 75 | {"max_offset": 16, "grid_position": [-4, 3]}, 76 | {"max_offset": 16, "grid_position": [-3, 3]}, 77 | {"max_offset": 16, "grid_position": [-2, 3]}, 78 | {"max_offset": 16, "grid_position": [-1, 3]}, 79 | {"max_offset": 16, "grid_position": [0, 3]}, 80 | {"max_offset": 16, "grid_position": [1, 3]}, 81 | {"max_offset": 16, "grid_position": [2, 3]}, 82 | {"max_offset": 16, "grid_position": [3, 3]}, 83 | {"max_offset": 16, "grid_position": [4, 3]}, 84 | {"max_offset": 16, "grid_position": [5, 3]}, 85 | {"max_offset": 16, "grid_position": [-4, 4]}, 86 | {"max_offset": 16, "grid_position": [-3, 4]}, 87 | {"max_offset": 16, "grid_position": [-2, 4]}, 88 | {"max_offset": 16, "grid_position": [-1, 4]}, 89 | {"max_offset": 16, "grid_position": [0, 4]}, 90 | {"max_offset": 16, "grid_position": [1, 4]}, 91 | {"max_offset": 16, "grid_position": [2, 4]}, 92 | {"max_offset": 16, "grid_position": [3, 4]}, 93 | {"max_offset": 16, "grid_position": [4, 4]}, 94 | {"max_offset": 16, "grid_position": [5, 4]}, 95 | {"max_offset": 16, "grid_position": [-4, 5]}, 96 | {"max_offset": 16, "grid_position": [-3, 5]}, 97 | {"max_offset": 16, "grid_position": [-2, 5]}, 98 | {"max_offset": 16, "grid_position": [-1, 5]}, 99 | {"max_offset": 16, "grid_position": [0, 5]}, 100 | {"max_offset": 16, "grid_position": [1, 5]}, 101 | {"max_offset": 16, "grid_position": [2, 5]}, 102 | {"max_offset": 16, "grid_position": [3, 5]}, 103 | {"max_offset": 16, "grid_position": [4, 5]}, 104 | {"max_offset": 16, "grid_position": [5, 5]} 105 | ], 106 | "strands": [] 107 | } -------------------------------------------------------------------------------- /examples/output_designs/honeycomb_lattice_10x10.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "honeycomb", 4 | "helices": [ 5 | {"max_offset": 16, "grid_position": [0, 0]}, 6 | {"max_offset": 16, "grid_position": [1, 0]}, 7 | {"max_offset": 16, "grid_position": [2, 0]}, 8 | {"max_offset": 16, "grid_position": [3, 0]}, 9 | {"max_offset": 16, "grid_position": [4, 0]}, 10 | {"max_offset": 16, "grid_position": [5, 0]}, 11 | {"max_offset": 16, "grid_position": [6, 0]}, 12 | {"max_offset": 16, "grid_position": [7, 0]}, 13 | {"max_offset": 16, "grid_position": [8, 0]}, 14 | {"max_offset": 16, "grid_position": [9, 0]}, 15 | {"max_offset": 16, "grid_position": [0, 1]}, 16 | {"max_offset": 16, "grid_position": [1, 1]}, 17 | {"max_offset": 16, "grid_position": [2, 1]}, 18 | {"max_offset": 16, "grid_position": [3, 1]}, 19 | {"max_offset": 16, "grid_position": [4, 1]}, 20 | {"max_offset": 16, "grid_position": [5, 1]}, 21 | {"max_offset": 16, "grid_position": [6, 1]}, 22 | {"max_offset": 16, "grid_position": [7, 1]}, 23 | {"max_offset": 16, "grid_position": [8, 1]}, 24 | {"max_offset": 16, "grid_position": [9, 1]}, 25 | {"max_offset": 16, "grid_position": [0, 2]}, 26 | {"max_offset": 16, "grid_position": [1, 2]}, 27 | {"max_offset": 16, "grid_position": [2, 2]}, 28 | {"max_offset": 16, "grid_position": [3, 2]}, 29 | {"max_offset": 16, "grid_position": [4, 2]}, 30 | {"max_offset": 16, "grid_position": [5, 2]}, 31 | {"max_offset": 16, "grid_position": [6, 2]}, 32 | {"max_offset": 16, "grid_position": [7, 2]}, 33 | {"max_offset": 16, "grid_position": [8, 2]}, 34 | {"max_offset": 16, "grid_position": [9, 2]}, 35 | {"max_offset": 16, "grid_position": [0, 3]}, 36 | {"max_offset": 16, "grid_position": [1, 3]}, 37 | {"max_offset": 16, "grid_position": [2, 3]}, 38 | {"max_offset": 16, "grid_position": [3, 3]}, 39 | {"max_offset": 16, "grid_position": [4, 3]}, 40 | {"max_offset": 16, "grid_position": [5, 3]}, 41 | {"max_offset": 16, "grid_position": [6, 3]}, 42 | {"max_offset": 16, "grid_position": [7, 3]}, 43 | {"max_offset": 16, "grid_position": [8, 3]}, 44 | {"max_offset": 16, "grid_position": [9, 3]}, 45 | {"max_offset": 16, "grid_position": [0, 4]}, 46 | {"max_offset": 16, "grid_position": [1, 4]}, 47 | {"max_offset": 16, "grid_position": [2, 4]}, 48 | {"max_offset": 16, "grid_position": [3, 4]}, 49 | {"max_offset": 16, "grid_position": [4, 4]}, 50 | {"max_offset": 16, "grid_position": [5, 4]}, 51 | {"max_offset": 16, "grid_position": [6, 4]}, 52 | {"max_offset": 16, "grid_position": [7, 4]}, 53 | {"max_offset": 16, "grid_position": [8, 4]}, 54 | {"max_offset": 16, "grid_position": [9, 4]}, 55 | {"max_offset": 16, "grid_position": [0, 5]}, 56 | {"max_offset": 16, "grid_position": [1, 5]}, 57 | {"max_offset": 16, "grid_position": [2, 5]}, 58 | {"max_offset": 16, "grid_position": [3, 5]}, 59 | {"max_offset": 16, "grid_position": [4, 5]}, 60 | {"max_offset": 16, "grid_position": [5, 5]}, 61 | {"max_offset": 16, "grid_position": [6, 5]}, 62 | {"max_offset": 16, "grid_position": [7, 5]}, 63 | {"max_offset": 16, "grid_position": [8, 5]}, 64 | {"max_offset": 16, "grid_position": [9, 5]}, 65 | {"max_offset": 16, "grid_position": [0, 6]}, 66 | {"max_offset": 16, "grid_position": [1, 6]}, 67 | {"max_offset": 16, "grid_position": [2, 6]}, 68 | {"max_offset": 16, "grid_position": [3, 6]}, 69 | {"max_offset": 16, "grid_position": [4, 6]}, 70 | {"max_offset": 16, "grid_position": [5, 6]}, 71 | {"max_offset": 16, "grid_position": [6, 6]}, 72 | {"max_offset": 16, "grid_position": [7, 6]}, 73 | {"max_offset": 16, "grid_position": [8, 6]}, 74 | {"max_offset": 16, "grid_position": [9, 6]}, 75 | {"max_offset": 16, "grid_position": [0, 7]}, 76 | {"max_offset": 16, "grid_position": [1, 7]}, 77 | {"max_offset": 16, "grid_position": [2, 7]}, 78 | {"max_offset": 16, "grid_position": [3, 7]}, 79 | {"max_offset": 16, "grid_position": [4, 7]}, 80 | {"max_offset": 16, "grid_position": [5, 7]}, 81 | {"max_offset": 16, "grid_position": [6, 7]}, 82 | {"max_offset": 16, "grid_position": [7, 7]}, 83 | {"max_offset": 16, "grid_position": [8, 7]}, 84 | {"max_offset": 16, "grid_position": [9, 7]}, 85 | {"max_offset": 16, "grid_position": [0, 8]}, 86 | {"max_offset": 16, "grid_position": [1, 8]}, 87 | {"max_offset": 16, "grid_position": [2, 8]}, 88 | {"max_offset": 16, "grid_position": [3, 8]}, 89 | {"max_offset": 16, "grid_position": [4, 8]}, 90 | {"max_offset": 16, "grid_position": [5, 8]}, 91 | {"max_offset": 16, "grid_position": [6, 8]}, 92 | {"max_offset": 16, "grid_position": [7, 8]}, 93 | {"max_offset": 16, "grid_position": [8, 8]}, 94 | {"max_offset": 16, "grid_position": [9, 8]}, 95 | {"max_offset": 16, "grid_position": [0, 9]}, 96 | {"max_offset": 16, "grid_position": [1, 9]}, 97 | {"max_offset": 16, "grid_position": [2, 9]}, 98 | {"max_offset": 16, "grid_position": [3, 9]}, 99 | {"max_offset": 16, "grid_position": [4, 9]}, 100 | {"max_offset": 16, "grid_position": [5, 9]}, 101 | {"max_offset": 16, "grid_position": [6, 9]}, 102 | {"max_offset": 16, "grid_position": [7, 9]}, 103 | {"max_offset": 16, "grid_position": [8, 9]}, 104 | {"max_offset": 16, "grid_position": [9, 9]} 105 | ], 106 | "strands": [] 107 | } -------------------------------------------------------------------------------- /examples/output_designs/honeycomb_lattice_10x10_with_negative.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "honeycomb", 4 | "helices": [ 5 | {"max_offset": 16, "grid_position": [-4, -4]}, 6 | {"max_offset": 16, "grid_position": [-3, -4]}, 7 | {"max_offset": 16, "grid_position": [-2, -4]}, 8 | {"max_offset": 16, "grid_position": [-1, -4]}, 9 | {"max_offset": 16, "grid_position": [0, -4]}, 10 | {"max_offset": 16, "grid_position": [1, -4]}, 11 | {"max_offset": 16, "grid_position": [2, -4]}, 12 | {"max_offset": 16, "grid_position": [3, -4]}, 13 | {"max_offset": 16, "grid_position": [4, -4]}, 14 | {"max_offset": 16, "grid_position": [5, -4]}, 15 | {"max_offset": 16, "grid_position": [-4, -3]}, 16 | {"max_offset": 16, "grid_position": [-3, -3]}, 17 | {"max_offset": 16, "grid_position": [-2, -3]}, 18 | {"max_offset": 16, "grid_position": [-1, -3]}, 19 | {"max_offset": 16, "grid_position": [0, -3]}, 20 | {"max_offset": 16, "grid_position": [1, -3]}, 21 | {"max_offset": 16, "grid_position": [2, -3]}, 22 | {"max_offset": 16, "grid_position": [3, -3]}, 23 | {"max_offset": 16, "grid_position": [4, -3]}, 24 | {"max_offset": 16, "grid_position": [5, -3]}, 25 | {"max_offset": 16, "grid_position": [-4, -2]}, 26 | {"max_offset": 16, "grid_position": [-3, -2]}, 27 | {"max_offset": 16, "grid_position": [-2, -2]}, 28 | {"max_offset": 16, "grid_position": [-1, -2]}, 29 | {"max_offset": 16, "grid_position": [0, -2]}, 30 | {"max_offset": 16, "grid_position": [1, -2]}, 31 | {"max_offset": 16, "grid_position": [2, -2]}, 32 | {"max_offset": 16, "grid_position": [3, -2]}, 33 | {"max_offset": 16, "grid_position": [4, -2]}, 34 | {"max_offset": 16, "grid_position": [5, -2]}, 35 | {"max_offset": 16, "grid_position": [-4, -1]}, 36 | {"max_offset": 16, "grid_position": [-3, -1]}, 37 | {"max_offset": 16, "grid_position": [-2, -1]}, 38 | {"max_offset": 16, "grid_position": [-1, -1]}, 39 | {"max_offset": 16, "grid_position": [0, -1]}, 40 | {"max_offset": 16, "grid_position": [1, -1]}, 41 | {"max_offset": 16, "grid_position": [2, -1]}, 42 | {"max_offset": 16, "grid_position": [3, -1]}, 43 | {"max_offset": 16, "grid_position": [4, -1]}, 44 | {"max_offset": 16, "grid_position": [5, -1]}, 45 | {"max_offset": 16, "grid_position": [-4, 0]}, 46 | {"max_offset": 16, "grid_position": [-3, 0]}, 47 | {"max_offset": 16, "grid_position": [-2, 0]}, 48 | {"max_offset": 16, "grid_position": [-1, 0]}, 49 | {"max_offset": 16, "grid_position": [0, 0]}, 50 | {"max_offset": 16, "grid_position": [1, 0]}, 51 | {"max_offset": 16, "grid_position": [2, 0]}, 52 | {"max_offset": 16, "grid_position": [3, 0]}, 53 | {"max_offset": 16, "grid_position": [4, 0]}, 54 | {"max_offset": 16, "grid_position": [5, 0]}, 55 | {"max_offset": 16, "grid_position": [-4, 1]}, 56 | {"max_offset": 16, "grid_position": [-3, 1]}, 57 | {"max_offset": 16, "grid_position": [-2, 1]}, 58 | {"max_offset": 16, "grid_position": [-1, 1]}, 59 | {"max_offset": 16, "grid_position": [0, 1]}, 60 | {"max_offset": 16, "grid_position": [1, 1]}, 61 | {"max_offset": 16, "grid_position": [2, 1]}, 62 | {"max_offset": 16, "grid_position": [3, 1]}, 63 | {"max_offset": 16, "grid_position": [4, 1]}, 64 | {"max_offset": 16, "grid_position": [5, 1]}, 65 | {"max_offset": 16, "grid_position": [-4, 2]}, 66 | {"max_offset": 16, "grid_position": [-3, 2]}, 67 | {"max_offset": 16, "grid_position": [-2, 2]}, 68 | {"max_offset": 16, "grid_position": [-1, 2]}, 69 | {"max_offset": 16, "grid_position": [0, 2]}, 70 | {"max_offset": 16, "grid_position": [1, 2]}, 71 | {"max_offset": 16, "grid_position": [2, 2]}, 72 | {"max_offset": 16, "grid_position": [3, 2]}, 73 | {"max_offset": 16, "grid_position": [4, 2]}, 74 | {"max_offset": 16, "grid_position": [5, 2]}, 75 | {"max_offset": 16, "grid_position": [-4, 3]}, 76 | {"max_offset": 16, "grid_position": [-3, 3]}, 77 | {"max_offset": 16, "grid_position": [-2, 3]}, 78 | {"max_offset": 16, "grid_position": [-1, 3]}, 79 | {"max_offset": 16, "grid_position": [0, 3]}, 80 | {"max_offset": 16, "grid_position": [1, 3]}, 81 | {"max_offset": 16, "grid_position": [2, 3]}, 82 | {"max_offset": 16, "grid_position": [3, 3]}, 83 | {"max_offset": 16, "grid_position": [4, 3]}, 84 | {"max_offset": 16, "grid_position": [5, 3]}, 85 | {"max_offset": 16, "grid_position": [-4, 4]}, 86 | {"max_offset": 16, "grid_position": [-3, 4]}, 87 | {"max_offset": 16, "grid_position": [-2, 4]}, 88 | {"max_offset": 16, "grid_position": [-1, 4]}, 89 | {"max_offset": 16, "grid_position": [0, 4]}, 90 | {"max_offset": 16, "grid_position": [1, 4]}, 91 | {"max_offset": 16, "grid_position": [2, 4]}, 92 | {"max_offset": 16, "grid_position": [3, 4]}, 93 | {"max_offset": 16, "grid_position": [4, 4]}, 94 | {"max_offset": 16, "grid_position": [5, 4]}, 95 | {"max_offset": 16, "grid_position": [-4, 5]}, 96 | {"max_offset": 16, "grid_position": [-3, 5]}, 97 | {"max_offset": 16, "grid_position": [-2, 5]}, 98 | {"max_offset": 16, "grid_position": [-1, 5]}, 99 | {"max_offset": 16, "grid_position": [0, 5]}, 100 | {"max_offset": 16, "grid_position": [1, 5]}, 101 | {"max_offset": 16, "grid_position": [2, 5]}, 102 | {"max_offset": 16, "grid_position": [3, 5]}, 103 | {"max_offset": 16, "grid_position": [4, 5]}, 104 | {"max_offset": 16, "grid_position": [5, 5]} 105 | ], 106 | "strands": [] 107 | } -------------------------------------------------------------------------------- /examples/output_designs/long_range_crossovers.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]}, 6 | {"grid_position": [0, 1]}, 7 | {"grid_position": [0, 2]}, 8 | {"grid_position": [0, 3]}, 9 | {"grid_position": [0, 4]}, 10 | {"grid_position": [0, 5]}, 11 | {"grid_position": [0, 6]}, 12 | {"grid_position": [0, 7]}, 13 | {"grid_position": [0, 8]}, 14 | {"grid_position": [0, 9]}, 15 | {"grid_position": [0, 10]}, 16 | {"grid_position": [0, 11]}, 17 | {"grid_position": [0, 12]}, 18 | {"grid_position": [0, 13]}, 19 | {"grid_position": [0, 14]}, 20 | {"grid_position": [0, 15]} 21 | ], 22 | "strands": [ 23 | { 24 | "color": "#f74308", 25 | "domains": [ 26 | {"helix": 0, "forward": false, "start": 0, "end": 16}, 27 | {"helix": 15, "forward": true, "start": 0, "end": 16} 28 | ] 29 | }, 30 | { 31 | "color": "#57bb00", 32 | "domains": [ 33 | {"helix": 15, "forward": true, "start": 16, "end": 32}, 34 | {"helix": 0, "forward": false, "start": 16, "end": 32} 35 | ] 36 | }, 37 | { 38 | "color": "#888888", 39 | "domains": [ 40 | {"helix": 0, "forward": false, "start": 32, "end": 48}, 41 | {"helix": 15, "forward": true, "start": 32, "end": 48} 42 | ] 43 | }, 44 | { 45 | "color": "#32b86c", 46 | "domains": [ 47 | {"helix": 1, "forward": false, "start": 0, "end": 16}, 48 | {"helix": 14, "forward": true, "start": 0, "end": 16} 49 | ] 50 | }, 51 | { 52 | "color": "#333333", 53 | "domains": [ 54 | {"helix": 14, "forward": true, "start": 16, "end": 32}, 55 | {"helix": 1, "forward": false, "start": 16, "end": 32} 56 | ] 57 | }, 58 | { 59 | "color": "#320096", 60 | "domains": [ 61 | {"helix": 1, "forward": false, "start": 32, "end": 48}, 62 | {"helix": 14, "forward": true, "start": 32, "end": 48} 63 | ] 64 | }, 65 | { 66 | "color": "#03b6a2", 67 | "domains": [ 68 | {"helix": 2, "forward": false, "start": 0, "end": 16}, 69 | {"helix": 13, "forward": true, "start": 0, "end": 16} 70 | ] 71 | }, 72 | { 73 | "color": "#7300de", 74 | "domains": [ 75 | {"helix": 13, "forward": true, "start": 16, "end": 32}, 76 | {"helix": 2, "forward": false, "start": 16, "end": 32} 77 | ] 78 | }, 79 | { 80 | "color": "#aaaa00", 81 | "domains": [ 82 | {"helix": 2, "forward": false, "start": 32, "end": 48}, 83 | {"helix": 13, "forward": true, "start": 32, "end": 48} 84 | ] 85 | }, 86 | { 87 | "color": "#b8056c", 88 | "domains": [ 89 | {"helix": 3, "forward": false, "start": 0, "end": 16}, 90 | {"helix": 12, "forward": true, "start": 0, "end": 16} 91 | ] 92 | }, 93 | { 94 | "color": "#007200", 95 | "domains": [ 96 | {"helix": 12, "forward": true, "start": 16, "end": 32}, 97 | {"helix": 3, "forward": false, "start": 16, "end": 32} 98 | ] 99 | }, 100 | { 101 | "color": "#cc0000", 102 | "domains": [ 103 | {"helix": 3, "forward": false, "start": 32, "end": 48}, 104 | {"helix": 12, "forward": true, "start": 32, "end": 48} 105 | ] 106 | }, 107 | { 108 | "color": "#f7931e", 109 | "domains": [ 110 | {"helix": 4, "forward": false, "start": 0, "end": 16}, 111 | {"helix": 11, "forward": true, "start": 0, "end": 16} 112 | ] 113 | }, 114 | { 115 | "color": "#f74308", 116 | "domains": [ 117 | {"helix": 11, "forward": true, "start": 16, "end": 32}, 118 | {"helix": 4, "forward": false, "start": 16, "end": 32} 119 | ] 120 | }, 121 | { 122 | "color": "#57bb00", 123 | "domains": [ 124 | {"helix": 4, "forward": false, "start": 32, "end": 48}, 125 | {"helix": 11, "forward": true, "start": 32, "end": 48} 126 | ] 127 | }, 128 | { 129 | "color": "#888888", 130 | "domains": [ 131 | {"helix": 5, "forward": false, "start": 0, "end": 16}, 132 | {"helix": 10, "forward": true, "start": 0, "end": 16} 133 | ] 134 | }, 135 | { 136 | "color": "#32b86c", 137 | "domains": [ 138 | {"helix": 10, "forward": true, "start": 16, "end": 32}, 139 | {"helix": 5, "forward": false, "start": 16, "end": 32} 140 | ] 141 | }, 142 | { 143 | "color": "#333333", 144 | "domains": [ 145 | {"helix": 5, "forward": false, "start": 32, "end": 48}, 146 | {"helix": 10, "forward": true, "start": 32, "end": 48} 147 | ] 148 | }, 149 | { 150 | "color": "#320096", 151 | "domains": [ 152 | {"helix": 6, "forward": false, "start": 0, "end": 16}, 153 | {"helix": 9, "forward": true, "start": 0, "end": 16} 154 | ] 155 | }, 156 | { 157 | "color": "#03b6a2", 158 | "domains": [ 159 | {"helix": 9, "forward": true, "start": 16, "end": 32}, 160 | {"helix": 6, "forward": false, "start": 16, "end": 32} 161 | ] 162 | }, 163 | { 164 | "color": "#7300de", 165 | "domains": [ 166 | {"helix": 6, "forward": false, "start": 32, "end": 48}, 167 | {"helix": 9, "forward": true, "start": 32, "end": 48} 168 | ] 169 | }, 170 | { 171 | "color": "#aaaa00", 172 | "domains": [ 173 | {"helix": 7, "forward": false, "start": 0, "end": 16}, 174 | {"helix": 8, "forward": true, "start": 0, "end": 16} 175 | ] 176 | }, 177 | { 178 | "color": "#b8056c", 179 | "domains": [ 180 | {"helix": 8, "forward": true, "start": 16, "end": 32}, 181 | {"helix": 7, "forward": false, "start": 16, "end": 32} 182 | ] 183 | }, 184 | { 185 | "color": "#007200", 186 | "domains": [ 187 | {"helix": 7, "forward": false, "start": 32, "end": 48}, 188 | {"helix": 8, "forward": true, "start": 32, "end": 48} 189 | ] 190 | } 191 | ] 192 | } -------------------------------------------------------------------------------- /examples/output_designs/loopouts_all_types.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 8, "grid_position": [0, 0]}, 6 | {"max_offset": 8, "grid_position": [0, 1]}, 7 | {"grid_position": [0, 2]} 8 | ], 9 | "strands": [ 10 | { 11 | "color": "#f74308", 12 | "sequence": "ACGACGACTTTACGTCGTCGTTTTACGACGACGATTTACTTACGCACGACGATTTTTTTTTTACGTTGCAGGTCGTCGTGACGACGACTGTCGTCGT", 13 | "domains": [ 14 | {"helix": 0, "forward": true, "start": 0, "end": 8}, 15 | {"loopout": 5}, 16 | {"helix": 0, "forward": false, "start": 0, "end": 8}, 17 | {"loopout": 5}, 18 | {"helix": 1, "forward": true, "start": 0, "end": 8}, 19 | {"loopout": 10}, 20 | {"helix": 2, "forward": false, "start": 16, "end": 24}, 21 | {"loopout": 20}, 22 | {"helix": 2, "forward": true, "start": 16, "end": 32}, 23 | {"loopout": 1}, 24 | {"helix": 2, "forward": false, "start": 24, "end": 32} 25 | ] 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /examples/output_designs/many_big_helices.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 2000, "grid_position": [0, 0]}, 6 | {"max_offset": 2000, "grid_position": [0, 1]}, 7 | {"max_offset": 2000, "grid_position": [0, 2]}, 8 | {"max_offset": 2000, "grid_position": [0, 3]}, 9 | {"max_offset": 2000, "grid_position": [0, 4]}, 10 | {"max_offset": 2000, "grid_position": [0, 5]}, 11 | {"max_offset": 2000, "grid_position": [0, 6]}, 12 | {"max_offset": 2000, "grid_position": [0, 7]}, 13 | {"max_offset": 2000, "grid_position": [0, 8]}, 14 | {"max_offset": 2000, "grid_position": [0, 9]}, 15 | {"max_offset": 2000, "grid_position": [0, 10]}, 16 | {"max_offset": 2000, "grid_position": [0, 11]}, 17 | {"max_offset": 2000, "grid_position": [0, 12]}, 18 | {"max_offset": 2000, "grid_position": [0, 13]}, 19 | {"max_offset": 2000, "grid_position": [0, 14]}, 20 | {"max_offset": 2000, "grid_position": [0, 15]}, 21 | {"max_offset": 2000, "grid_position": [0, 16]}, 22 | {"max_offset": 2000, "grid_position": [0, 17]}, 23 | {"max_offset": 2000, "grid_position": [0, 18]}, 24 | {"max_offset": 2000, "grid_position": [0, 19]}, 25 | {"max_offset": 2000, "grid_position": [0, 20]}, 26 | {"max_offset": 2000, "grid_position": [0, 21]}, 27 | {"max_offset": 2000, "grid_position": [0, 22]}, 28 | {"max_offset": 2000, "grid_position": [0, 23]}, 29 | {"max_offset": 2000, "grid_position": [0, 24]}, 30 | {"max_offset": 2000, "grid_position": [0, 25]}, 31 | {"max_offset": 2000, "grid_position": [0, 26]}, 32 | {"max_offset": 2000, "grid_position": [0, 27]}, 33 | {"max_offset": 2000, "grid_position": [0, 28]}, 34 | {"max_offset": 2000, "grid_position": [0, 29]} 35 | ], 36 | "strands": [] 37 | } -------------------------------------------------------------------------------- /examples/output_designs/many_helices_modifications.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]}, 6 | {"grid_position": [0, 1]}, 7 | {"grid_position": [0, 2]}, 8 | {"grid_position": [0, 3]}, 9 | {"grid_position": [0, 4]}, 10 | {"grid_position": [0, 5]}, 11 | {"grid_position": [0, 6]}, 12 | {"grid_position": [0, 7]} 13 | ], 14 | "modifications_in_design": { 15 | "/5Biosg/": { 16 | "display_text": "B", 17 | "vendor_code": "/5Biosg/", 18 | "display_connector": false, 19 | "location": "5'" 20 | }, 21 | "/iBiodT/": { 22 | "display_text": "B", 23 | "vendor_code": "/iBiodT/", 24 | "display_connector": false, 25 | "location": "internal", 26 | "allowed_bases": ["T"] 27 | }, 28 | "/3Cy3Sp/": { 29 | "display_text": "Cy3", 30 | "vendor_code": "/3Cy3Sp/", 31 | "display_connector": false, 32 | "location": "3'" 33 | }, 34 | "/iCy3/": { 35 | "display_text": "Cy3", 36 | "vendor_code": "/iCy3/", 37 | "display_connector": false, 38 | "location": "internal" 39 | } 40 | }, 41 | "strands": [ 42 | { 43 | "color": "#f74308", 44 | "sequence": "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT", 45 | "domains": [ 46 | {"helix": 0, "forward": true, "start": 0, "end": 16, "deletions": [11, 12]}, 47 | {"helix": 1, "forward": false, "start": 0, "end": 16, "deletions": [12], "insertions": [[4, 1]]}, 48 | {"helix": 2, "forward": true, "start": 0, "end": 16}, 49 | {"helix": 3, "forward": false, "start": 0, "end": 16}, 50 | {"helix": 4, "forward": true, "start": 0, "end": 16}, 51 | {"helix": 5, "forward": false, "start": 0, "end": 16}, 52 | {"helix": 6, "forward": true, "start": 0, "end": 16}, 53 | {"helix": 7, "forward": false, "start": 0, "end": 16} 54 | ], 55 | "5prime_modification": "/5Biosg/", 56 | "3prime_modification": "/3Cy3Sp/", 57 | "internal_modifications": {"5": "/iCy3/", "10": "/iBiodT/", "21": "/iCy3/", "26": "/iBiodT/", "37": "/iCy3/", "42": "/iBiodT/", "53": "/iCy3/", "58": "/iBiodT/", "69": "/iCy3/", "74": "/iBiodT/", "85": "/iCy3/", "90": "/iBiodT/", "101": "/iCy3/", "106": "/iBiodT/", "117": "/iCy3/", "122": "/iBiodT/"} 58 | } 59 | ] 60 | } -------------------------------------------------------------------------------- /examples/output_designs/names_domains_strands.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]} 6 | ], 7 | "strands": [ 8 | { 9 | "name": "bottom strand", 10 | "color": "#f74308", 11 | "domains": [ 12 | {"name": "domain 8*", "helix": 0, "forward": false, "start": 56, "end": 64}, 13 | {"name": "domain 7*", "helix": 0, "forward": false, "start": 48, "end": 56}, 14 | {"name": "domain 6*", "helix": 0, "forward": false, "start": 40, "end": 48}, 15 | {"name": "domain 5*", "helix": 0, "forward": false, "start": 32, "end": 40}, 16 | {"name": "domain 4*", "helix": 0, "forward": false, "start": 24, "end": 32}, 17 | {"name": "domain 3*", "helix": 0, "forward": false, "start": 16, "end": 24}, 18 | {"name": "domain 2*", "helix": 0, "forward": false, "start": 8, "end": 16}, 19 | {"name": "domain 1*", "helix": 0, "forward": false, "start": 0, "end": 8} 20 | ] 21 | }, 22 | { 23 | "name": "top strand 1", 24 | "color": "#57bb00", 25 | "domains": [ 26 | {"name": "domain 1", "helix": 0, "forward": true, "start": 0, "end": 8} 27 | ] 28 | }, 29 | { 30 | "name": "top strand 2", 31 | "color": "#888888", 32 | "domains": [ 33 | {"name": "domain 50", "helix": 0, "forward": true, "start": 8, "end": 16} 34 | ] 35 | }, 36 | { 37 | "name": "top strand 3", 38 | "color": "#32b86c", 39 | "domains": [ 40 | {"name": "domain 3", "helix": 0, "forward": true, "start": 16, "end": 24} 41 | ] 42 | }, 43 | { 44 | "name": "top strand 4", 45 | "color": "#333333", 46 | "domains": [ 47 | {"name": "domain 4*", "helix": 0, "forward": true, "start": 24, "end": 32} 48 | ] 49 | }, 50 | { 51 | "name": "top strand 5", 52 | "color": "#320096", 53 | "domains": [ 54 | {"name": "domain 5", "helix": 0, "forward": true, "start": 32, "end": 41} 55 | ] 56 | }, 57 | { 58 | "name": "top strand 7", 59 | "color": "#03b6a2", 60 | "domains": [ 61 | {"name": "domain 7", "helix": 0, "forward": true, "start": 48, "end": 55} 62 | ] 63 | }, 64 | { 65 | "name": "top strand 9", 66 | "color": "#7300de", 67 | "domains": [ 68 | {"name": "domain 9", "helix": 0, "forward": true, "start": 64, "end": 72} 69 | ] 70 | } 71 | ] 72 | } -------------------------------------------------------------------------------- /examples/output_designs/oxdna_export_with_pitch.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 100, "grid_position": [0, 0]}, 6 | {"max_offset": 100, "grid_position": [0, 1]} 7 | ], 8 | "strands": [ 9 | { 10 | "color": "#f74308", 11 | "domains": [ 12 | {"helix": 0, "forward": true, "start": 0, "end": 21} 13 | ] 14 | }, 15 | { 16 | "color": "#57bb00", 17 | "domains": [ 18 | {"helix": 1, "forward": true, "start": 0, "end": 21} 19 | ] 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /examples/output_designs/oxdna_export_with_pitch.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/output_designs/oxdna_export_with_pitch.zip -------------------------------------------------------------------------------- /examples/output_designs/oxdna_export_with_pitch_0.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.17.8", 3 | "grid": "square", 4 | "helices": [ 5 | {"max_offset": 100, "grid_position": [0, 0]}, 6 | {"max_offset": 100, "grid_position": [0, 1]} 7 | ], 8 | "strands": [ 9 | { 10 | "color": "#f74308", 11 | "domains": [ 12 | {"helix": 0, "forward": true, "start": 0, "end": 21} 13 | ] 14 | }, 15 | { 16 | "color": "#57bb00", 17 | "domains": [ 18 | {"helix": 1, "forward": true, "start": 0, "end": 21} 19 | ] 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /examples/output_designs/oxdna_export_with_pitch_45.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.17.8", 3 | "groups": { 4 | "default_group": { 5 | "position": {"x": 0, "y": 0, "z": 0}, 6 | "pitch": 45, 7 | "grid": "square" 8 | } 9 | }, 10 | "helices": [ 11 | {"max_offset": 100, "grid_position": [0, 0]}, 12 | {"max_offset": 100, "grid_position": [0, 1]} 13 | ], 14 | "strands": [ 15 | { 16 | "color": "#f74308", 17 | "domains": [ 18 | {"helix": 0, "forward": true, "start": 0, "end": 21} 19 | ] 20 | }, 21 | { 22 | "color": "#57bb00", 23 | "domains": [ 24 | {"helix": 1, "forward": true, "start": 0, "end": 21} 25 | ] 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /examples/output_designs/relax_helix_rolls.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | { 6 | "grid_position": [0, 0], 7 | "roll": 120.0, 8 | "major_ticks": [0, 5, 11] 9 | }, 10 | { 11 | "grid_position": [0, 1], 12 | "roll": 150.0, 13 | "major_ticks": [0, 5, 11] 14 | } 15 | ], 16 | "strands": [ 17 | { 18 | "color": "#f74308", 19 | "domains": [ 20 | {"helix": 0, "forward": true, "start": 0, "end": 5}, 21 | {"helix": 1, "forward": false, "start": 0, "end": 5} 22 | ] 23 | }, 24 | { 25 | "color": "#57bb00", 26 | "domains": [ 27 | {"helix": 0, "forward": true, "start": 5, "end": 11}, 28 | {"helix": 1, "forward": false, "start": 5, "end": 11} 29 | ] 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /examples/output_designs/strand_builder_loop.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.19.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]}, 6 | {"grid_position": [0, 1]}, 7 | {"grid_position": [0, 2]}, 8 | {"grid_position": [0, 3]}, 9 | {"grid_position": [0, 4]}, 10 | {"grid_position": [0, 5]}, 11 | {"grid_position": [0, 6]}, 12 | {"grid_position": [0, 7]}, 13 | {"grid_position": [0, 8]}, 14 | {"grid_position": [0, 9]}, 15 | {"grid_position": [0, 10]}, 16 | {"grid_position": [0, 11]}, 17 | {"grid_position": [0, 12]}, 18 | {"grid_position": [0, 13]}, 19 | {"grid_position": [0, 14]}, 20 | {"grid_position": [0, 15]}, 21 | {"grid_position": [0, 16]}, 22 | {"grid_position": [0, 17]}, 23 | {"grid_position": [0, 18]}, 24 | {"grid_position": [0, 19]}, 25 | {"grid_position": [0, 20]}, 26 | {"grid_position": [0, 21]}, 27 | {"grid_position": [0, 22]}, 28 | {"grid_position": [0, 23]}, 29 | {"grid_position": [0, 24]}, 30 | {"grid_position": [0, 25]}, 31 | {"grid_position": [0, 26]}, 32 | {"grid_position": [0, 27]}, 33 | {"grid_position": [0, 28]}, 34 | {"grid_position": [0, 29]}, 35 | {"grid_position": [0, 30]}, 36 | {"grid_position": [0, 31]} 37 | ], 38 | "strands": [ 39 | { 40 | "color": "#0066cc", 41 | "domains": [ 42 | {"helix": 0, "forward": true, "start": 0, "end": 200}, 43 | {"helix": 1, "forward": false, "start": 0, "end": 200}, 44 | {"helix": 2, "forward": true, "start": 0, "end": 200}, 45 | {"helix": 3, "forward": false, "start": 0, "end": 200}, 46 | {"helix": 4, "forward": true, "start": 0, "end": 200}, 47 | {"helix": 5, "forward": false, "start": 0, "end": 200}, 48 | {"helix": 6, "forward": true, "start": 0, "end": 200}, 49 | {"helix": 7, "forward": false, "start": 0, "end": 200}, 50 | {"helix": 8, "forward": true, "start": 0, "end": 200}, 51 | {"helix": 9, "forward": false, "start": 0, "end": 200}, 52 | {"helix": 10, "forward": true, "start": 0, "end": 200}, 53 | {"helix": 11, "forward": false, "start": 0, "end": 200}, 54 | {"helix": 12, "forward": true, "start": 0, "end": 200}, 55 | {"helix": 13, "forward": false, "start": 0, "end": 200}, 56 | {"helix": 14, "forward": true, "start": 0, "end": 200}, 57 | {"helix": 15, "forward": false, "start": 0, "end": 200}, 58 | {"helix": 16, "forward": true, "start": 0, "end": 200}, 59 | {"helix": 17, "forward": false, "start": 0, "end": 200}, 60 | {"helix": 18, "forward": true, "start": 0, "end": 200}, 61 | {"helix": 19, "forward": false, "start": 0, "end": 200}, 62 | {"helix": 20, "forward": true, "start": 0, "end": 200}, 63 | {"helix": 21, "forward": false, "start": 0, "end": 200}, 64 | {"helix": 22, "forward": true, "start": 0, "end": 200}, 65 | {"helix": 23, "forward": false, "start": 0, "end": 200}, 66 | {"helix": 24, "forward": true, "start": 0, "end": 200}, 67 | {"helix": 25, "forward": false, "start": 0, "end": 200}, 68 | {"helix": 26, "forward": true, "start": 0, "end": 200}, 69 | {"helix": 27, "forward": false, "start": 0, "end": 200}, 70 | {"helix": 28, "forward": true, "start": 0, "end": 200}, 71 | {"helix": 29, "forward": false, "start": 0, "end": 200}, 72 | {"helix": 30, "forward": true, "start": 0, "end": 200}, 73 | {"helix": 31, "forward": false, "start": 0, "end": 200} 74 | ], 75 | "is_scaffold": true 76 | } 77 | ] 78 | } -------------------------------------------------------------------------------- /examples/oxdna/extension_and_loopout_oxdna_export.top: -------------------------------------------------------------------------------- 1 | 107 1 2 | 1 T 1 -1 3 | 1 T 2 0 4 | 1 T 3 1 5 | 1 T 4 2 6 | 1 T 5 3 7 | 1 T 6 4 8 | 1 T 7 5 9 | 1 T 8 6 10 | 1 T 9 7 11 | 1 T 10 8 12 | 1 T 11 9 13 | 1 T 12 10 14 | 1 T 13 11 15 | 1 T 14 12 16 | 1 T 15 13 17 | 1 T 16 14 18 | 1 T 17 15 19 | 1 T 18 16 20 | 1 T 19 17 21 | 1 T 20 18 22 | 1 T 21 19 23 | 1 T 22 20 24 | 1 T 23 21 25 | 1 T 24 22 26 | 1 T 25 23 27 | 1 T 26 24 28 | 1 T 27 25 29 | 1 T 28 26 30 | 1 T 29 27 31 | 1 T 30 28 32 | 1 T 31 29 33 | 1 T 32 30 34 | 1 T 33 31 35 | 1 T 34 32 36 | 1 T 35 33 37 | 1 T 36 34 38 | 1 T 37 35 39 | 1 T 38 36 40 | 1 T 39 37 41 | 1 T 40 38 42 | 1 T 41 39 43 | 1 T 42 40 44 | 1 T 43 41 45 | 1 T 44 42 46 | 1 T 45 43 47 | 1 T 46 44 48 | 1 T 47 45 49 | 1 T 48 46 50 | 1 T 49 47 51 | 1 T 50 48 52 | 1 T 51 49 53 | 1 T 52 50 54 | 1 T 53 51 55 | 1 T 54 52 56 | 1 T 55 53 57 | 1 T 56 54 58 | 1 T 57 55 59 | 1 T 58 56 60 | 1 T 59 57 61 | 1 T 60 58 62 | 1 T 61 59 63 | 1 T 62 60 64 | 1 T 63 61 65 | 1 T 64 62 66 | 1 T 65 63 67 | 1 T 66 64 68 | 1 T 67 65 69 | 1 T 68 66 70 | 1 T 69 67 71 | 1 T 70 68 72 | 1 T 71 69 73 | 1 T 72 70 74 | 1 T 73 71 75 | 1 T 74 72 76 | 1 T 75 73 77 | 1 T 76 74 78 | 1 T 77 75 79 | 1 T 78 76 80 | 1 T 79 77 81 | 1 T 80 78 82 | 1 T 81 79 83 | 1 T 82 80 84 | 1 T 83 81 85 | 1 T 84 82 86 | 1 T 85 83 87 | 1 T 86 84 88 | 1 T 87 85 89 | 1 T 88 86 90 | 1 T 89 87 91 | 1 T 90 88 92 | 1 T 91 89 93 | 1 T 92 90 94 | 1 T 93 91 95 | 1 T 94 92 96 | 1 T 95 93 97 | 1 T 96 94 98 | 1 T 97 95 99 | 1 T 98 96 100 | 1 T 99 97 101 | 1 T 100 98 102 | 1 T 101 99 103 | 1 T 102 100 104 | 1 T 103 101 105 | 1 T 104 102 106 | 1 T 105 103 107 | 1 T 106 104 108 | 1 T -1 105 109 | -------------------------------------------------------------------------------- /examples/oxdna/extensions.top: -------------------------------------------------------------------------------- 1 | 78 2 2 | 1 T 1 -1 3 | 1 A 2 0 4 | 1 T 3 1 5 | 1 T 4 2 6 | 1 T 5 3 7 | 1 G 6 4 8 | 1 G 7 5 9 | 1 G 8 6 10 | 1 G 9 7 11 | 1 G 10 8 12 | 1 G 11 9 13 | 1 G 12 10 14 | 1 G 13 11 15 | 1 C 14 12 16 | 1 C 15 13 17 | 1 C 16 14 18 | 1 C 17 15 19 | 1 C 18 16 20 | 1 C 19 17 21 | 1 C 20 18 22 | 1 C 21 19 23 | 1 T 22 20 24 | 1 T 23 21 25 | 1 T 24 22 26 | 1 G 25 23 27 | 1 G 26 24 28 | 1 G 27 25 29 | 1 G 28 26 30 | 1 G 29 27 31 | 1 G 30 28 32 | 1 G 31 29 33 | 1 G 32 30 34 | 1 A 33 31 35 | 1 T 34 32 36 | 1 A 35 33 37 | 1 A 36 34 38 | 1 A 37 35 39 | 1 A 38 36 40 | 1 A -1 37 41 | 2 A 40 -1 42 | 2 T 41 39 43 | 2 A 42 40 44 | 2 A 43 41 45 | 2 A 44 42 46 | 2 C 45 43 47 | 2 C 46 44 48 | 2 C 47 45 49 | 2 C 48 46 50 | 2 C 49 47 51 | 2 C 50 48 52 | 2 C 51 49 53 | 2 C 52 50 54 | 2 G 53 51 55 | 2 G 54 52 56 | 2 G 55 53 57 | 2 G 56 54 58 | 2 G 57 55 59 | 2 G 58 56 60 | 2 G 59 57 61 | 2 G 60 58 62 | 2 A 61 59 63 | 2 A 62 60 64 | 2 A 63 61 65 | 2 C 64 62 66 | 2 C 65 63 67 | 2 C 66 64 68 | 2 C 67 65 69 | 2 C 68 66 70 | 2 C 69 67 71 | 2 C 70 68 72 | 2 C 71 69 73 | 2 T 72 70 74 | 2 A 73 71 75 | 2 T 74 72 76 | 2 T 75 73 77 | 2 T 76 74 78 | 2 T 77 75 79 | 2 T -1 76 80 | -------------------------------------------------------------------------------- /examples/oxdna/oxdna_export_with_pitch_0.dat: -------------------------------------------------------------------------------- 1 | t = 0 2 | b = 19.19288565390937 19.19288565390937 19.19288565390937 3 | E = 0 0 0 4 | -0.20521208599540122 -0.563815572471545 0.0 0.3420201433256687 0.9396926207859084 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 5 | 0.14805443861417622 -0.5814463717374467 0.3897628551303123 -0.2467573976902937 0.969077286229078 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 6 | 0.4498687217806405 -0.39701150255811557 0.7795257102606246 -0.7497812029677342 0.6616858375968593 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 7 | 0.5953435239601033 -0.07460622278849112 1.1692885653909368 -0.9922392066001721 0.1243437046474852 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 8 | 0.5339230852868811 0.2737263944118978 1.5590514205212491 -0.8898718088114685 -0.456210657353163 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 9 | 0.2869523871727911 0.5269329440221371 1.9488142756515616 -0.47825397862131847 -0.8782215733702284 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 10 | -0.059740707957489946 0.5970184652192408 2.3385771307818737 0.09956784659581658 -0.9950307753654014 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 11 | -0.3856725658119234 0.459626665871387 2.728339985912186 0.642787609686539 -0.7660444431189783 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 12 | -0.5775745481700072 0.16250428088580296 3.1181028410424982 0.962624246950012 -0.27084046814300494 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 13 | -0.568756407700279 -0.19109199015101058 3.5078656961728107 0.9479273461671318 0.3184866502516843 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 14 | -0.36228264619528666 -0.47827950433375327 3.8976285513031232 0.6038044103254778 0.7971325072229222 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 15 | -0.02990753139641875 -0.5992541527313534 4.287391406433435 0.04984588566069792 0.9987569212189223 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 16 | 0.31286112202769867 -0.5119745289792934 4.677154261563747 -0.5214352033794978 0.8532908816321557 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 17 | 0.5469035113870039 -0.24677226187836673 5.06691711669406 -0.9115058523116732 0.41128710313061123 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 18 | 0.590884651807325 0.10418890660015769 5.456679971824372 -0.9848077530122084 -0.17364817766692947 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 19 | 0.429520109555832 0.41894209085164286 5.846442826954685 -0.71586684925972 -0.6982368180860714 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 20 | 0.11888768591963841 0.5881034927091263 6.2362056820849965 -0.19814614319939736 -0.9801724878485439 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 21 | -0.23306087776481726 0.5528857271222444 6.625968537215309 0.38843479627469546 -0.9214762118704074 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 22 | -0.5040155538904627 0.32552775831945585 7.0157313923456215 0.8400259231507712 -0.5425462638657598 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 23 | -0.5998135092004897 -0.014958415042842765 7.405494247475934 0.9996891820008162 0.024930691738071276 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 24 | -0.48716280342951424 -0.3502462033408734 7.7952571026062465 0.8119380057158571 0.5837436722347891 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 25 | -0.20521208599540122 2.95813793774212 0.0 0.3420201433256687 0.9396926207859084 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 26 | 0.14805443861417622 2.9405071384762183 0.3897628551303123 -0.2467573976902937 0.969077286229078 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 27 | 0.4498687217806405 3.1249420076555494 0.7795257102606246 -0.7497812029677342 0.6616858375968593 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 28 | 0.5953435239601033 3.447347287425174 1.1692885653909368 -0.9922392066001721 0.1243437046474852 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 29 | 0.5339230852868811 3.7956799046255627 1.5590514205212491 -0.8898718088114685 -0.456210657353163 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 30 | 0.2869523871727911 4.048886454235802 1.9488142756515616 -0.47825397862131847 -0.8782215733702284 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 31 | -0.059740707957489946 4.118971975432906 2.3385771307818737 0.09956784659581658 -0.9950307753654014 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 32 | -0.3856725658119234 3.981580176085052 2.728339985912186 0.642787609686539 -0.7660444431189783 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 33 | -0.5775745481700072 3.684457791099468 3.1181028410424982 0.962624246950012 -0.27084046814300494 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 34 | -0.568756407700279 3.3308615200626543 3.5078656961728107 0.9479273461671318 0.3184866502516843 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 35 | -0.36228264619528666 3.043674005879912 3.8976285513031232 0.6038044103254778 0.7971325072229222 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 36 | -0.02990753139641875 2.9226993574823115 4.287391406433435 0.04984588566069792 0.9987569212189223 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 37 | 0.31286112202769867 3.0099789812343714 4.677154261563747 -0.5214352033794978 0.8532908816321557 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 38 | 0.5469035113870039 3.2751812483352984 5.06691711669406 -0.9115058523116732 0.41128710313061123 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 39 | 0.590884651807325 3.6261424168138228 5.456679971824372 -0.9848077530122084 -0.17364817766692947 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 40 | 0.429520109555832 3.940895601065308 5.846442826954685 -0.71586684925972 -0.6982368180860714 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 41 | 0.11888768591963841 4.110057002922791 6.2362056820849965 -0.19814614319939736 -0.9801724878485439 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 42 | -0.23306087776481726 4.074839237335909 6.625968537215309 0.38843479627469546 -0.9214762118704074 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 43 | -0.5040155538904627 3.847481268533121 7.0157313923456215 0.8400259231507712 -0.5425462638657598 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 44 | -0.5998135092004897 3.506995095170822 7.405494247475934 0.9996891820008162 0.024930691738071276 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 45 | -0.48716280342951424 3.1717073068727917 7.7952571026062465 0.8119380057158571 0.5837436722347891 -0.0 -0.0 -0.0 -1.0 0 0 0 0 0 0 46 | -------------------------------------------------------------------------------- /examples/oxdna/oxdna_export_with_pitch_0.top: -------------------------------------------------------------------------------- 1 | 42 2 2 | 1 T 1 -1 3 | 1 T 2 0 4 | 1 T 3 1 5 | 1 T 4 2 6 | 1 T 5 3 7 | 1 T 6 4 8 | 1 T 7 5 9 | 1 T 8 6 10 | 1 T 9 7 11 | 1 T 10 8 12 | 1 T 11 9 13 | 1 T 12 10 14 | 1 T 13 11 15 | 1 T 14 12 16 | 1 T 15 13 17 | 1 T 16 14 18 | 1 T 17 15 19 | 1 T 18 16 20 | 1 T 19 17 21 | 1 T 20 18 22 | 1 T -1 19 23 | 2 T 22 -1 24 | 2 T 23 21 25 | 2 T 24 22 26 | 2 T 25 23 27 | 2 T 26 24 28 | 2 T 27 25 29 | 2 T 28 26 30 | 2 T 29 27 31 | 2 T 30 28 32 | 2 T 31 29 33 | 2 T 32 30 34 | 2 T 33 31 35 | 2 T 34 32 36 | 2 T 35 33 37 | 2 T 36 34 38 | 2 T 37 35 39 | 2 T 38 36 40 | 2 T 39 37 41 | 2 T 40 38 42 | 2 T 41 39 43 | 2 T -1 40 44 | -------------------------------------------------------------------------------- /examples/oxdna/oxdna_export_with_pitch_45.top: -------------------------------------------------------------------------------- 1 | 42 2 2 | 1 T 1 -1 3 | 1 T 2 0 4 | 1 T 3 1 5 | 1 T 4 2 6 | 1 T 5 3 7 | 1 T 6 4 8 | 1 T 7 5 9 | 1 T 8 6 10 | 1 T 9 7 11 | 1 T 10 8 12 | 1 T 11 9 13 | 1 T 12 10 14 | 1 T 13 11 15 | 1 T 14 12 16 | 1 T 15 13 17 | 1 T 16 14 18 | 1 T 17 15 19 | 1 T 18 16 20 | 1 T 19 17 21 | 1 T 20 18 22 | 1 T -1 19 23 | 2 T 22 -1 24 | 2 T 23 21 25 | 2 T 24 22 26 | 2 T 25 23 27 | 2 T 26 24 28 | 2 T 27 25 29 | 2 T 28 26 30 | 2 T 29 27 31 | 2 T 30 28 32 | 2 T 31 29 33 | 2 T 32 30 34 | 2 T 33 31 35 | 2 T 34 32 36 | 2 T 35 33 37 | 2 T 36 34 38 | 2 T 37 35 39 | 2 T 38 36 40 | 2 T 39 37 41 | 2 T 40 38 42 | 2 T 41 39 43 | 2 T -1 40 44 | -------------------------------------------------------------------------------- /examples/oxdna_export_with_pitch.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design(pitch: float = 0) -> sc.Design: 5 | helices = [sc.Helix(max_offset=100) for _ in range(2)] 6 | design = sc.Design(helices=helices, grid=sc.square) 7 | 8 | design.groups[sc.default_group_name].pitch = pitch 9 | 10 | design.draw_strand(0, 0).to(21) 11 | design.draw_strand(1, 0).to(21) 12 | 13 | return design 14 | 15 | 16 | if __name__ == '__main__': 17 | for pitch in [0, 45]: 18 | d = create_design(pitch) 19 | d.write_scadnano_file(filename=f'oxdna_export_with_pitch_{pitch}.sc', directory='output_designs') 20 | d.write_oxdna_files(filename_no_extension=f'oxdna_export_with_pitch_{pitch}', directory='oxdna') 21 | -------------------------------------------------------------------------------- /examples/proposal/beth.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/proposal/beth.xls -------------------------------------------------------------------------------- /examples/proposal/marry.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/proposal/marry.xls -------------------------------------------------------------------------------- /examples/proposal/me.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/proposal/me.xls -------------------------------------------------------------------------------- /examples/proposal/will.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/proposal/will.xls -------------------------------------------------------------------------------- /examples/proposal/yes.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/proposal/yes.xls -------------------------------------------------------------------------------- /examples/proposal/yim.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/proposal/yim.xls -------------------------------------------------------------------------------- /examples/proposal/you.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/proposal/you.xls -------------------------------------------------------------------------------- /examples/relax_helix_rolls.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | import modifications as mod 3 | import dataclasses 4 | 5 | 6 | def create_design() -> sc.Design: 7 | # ''' 8 | # 0123456789012345678901234567890123456789 9 | # 0 [---+[--------+[----------+ 10 | # | | | 11 | # 1 [---+<--------+<----------+ 12 | # 13 | # angle (fraction of 360) 14 | # 5/10.5 15 | # (15-10.5)/10.5 = 4.5/10.5 16 | # (27-21)/10.5 = 6/10.5 17 | # ''' 18 | # design2h = sc.Design(helices=[sc.Helix(max_offset=50) for _ in range(2)], grid=sc.square) 19 | # # helix 0 forward 20 | # design2h.draw_strand(0, 0).move(5).cross(1).move(-5) 21 | # design2h.draw_strand(0, 5).move(10).cross(1).move(-10) 22 | # design2h.draw_strand(0, 15).move(12).cross(1).move(-12) 23 | # 24 | # for helix in design2h.helices.values(): 25 | # helix.major_ticks = [0, 5, 15, 27] 26 | # 27 | # design2h.relax_helix_rolls() 28 | 29 | ''' 30 | 0 1 2 3 4 5 6 31 | 012345678901234567890123456789012345678901234567890123456789 32 | 0 [---+[--------+[----------+[------+[--------+[--------+ 33 | | | | | | | 34 | 1 [---+<--------+<----------+ | | | 35 | | | | 36 | 2 <------+<--------+<--------+ 37 | 38 | angle (fraction of 360) 39 | 5/10.5 40 | (15-10.5)/10.5 = 4.5/10.5 41 | (27-21)/10.5 = 6/10.5 42 | ''' 43 | helices = [sc.Helix(max_offset=60) for _ in range(3)] 44 | helices[2].grid_position = (1, 0) 45 | design3h = sc.Design(helices=helices, grid=sc.square) 46 | 47 | # helix 0 forward 48 | design3h.draw_strand(0, 0).move(5).cross(1).move(-5) 49 | design3h.draw_strand(0, 5).move(10).cross(1).move(-10) 50 | design3h.draw_strand(0, 15).move(12).cross(1).move(-12) 51 | design3h.draw_strand(0, 27).move(7).cross(2).move(-7) 52 | design3h.draw_strand(0, 34).move(10).cross(2).move(-10) 53 | design3h.draw_strand(0, 44).move(10).cross(2).move(-10) 54 | 55 | for helix in design3h.helices.values(): 56 | helix.major_ticks = [0, 5, 15, 27, 34, 44, 54] 57 | 58 | design3h.relax_helix_rolls() 59 | 60 | # return design3h 61 | 62 | helices = [sc.Helix(max_offset=60) for _ in range(3)] 63 | helices[2].grid_position = (1, 0) 64 | design3h2 = sc.Design(helices=helices, grid=sc.square) 65 | design3h2.draw_strand(0, 0).move(5).cross(1).move(-5) 66 | design3h2.draw_strand(0, 5).move(8).cross(2).move(-8) 67 | 68 | for helix in design3h2.helices.values(): 69 | helix.major_ticks = [0, 5, 13] 70 | 71 | design3h2.relax_helix_rolls() 72 | 73 | # return design3h2 74 | 75 | helices = [sc.Helix(max_offset=11) for _ in range(2)] 76 | design2 = sc.Design(helices=helices, grid=sc.square) 77 | design2.draw_strand(0, 0).move(5).cross(1).move(-5) 78 | design2.draw_strand(0, 5).move(6).cross(1).move(-6) 79 | 80 | for helix in design2.helices.values(): 81 | helix.major_ticks = [0, 5, 11] 82 | 83 | design2.relax_helix_rolls() 84 | # design2.relax_helix_rolls() 85 | 86 | return design2 87 | 88 | 89 | if __name__ == '__main__': 90 | d = create_design() 91 | d.write_scadnano_file(directory='output_designs') 92 | -------------------------------------------------------------------------------- /examples/run_all_examples.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import subprocess 4 | import importlib 5 | import scadnano as sc 6 | 7 | 8 | def main() -> None: 9 | """ 10 | Looks for .py files in the current directory. If they have a function called create_design(), 11 | it calls that to produce a design and write its output to directory output_designs 12 | using method Design.write_scadnano_file(); otherwise it runs the Python file as a 13 | command-line application using the subprocess module. 14 | """ 15 | for filename in os.listdir("."): 16 | if filename.endswith(".py") and not sys.argv[0].endswith(filename): 17 | print(f"running {filename}") 18 | run(filename) 19 | 20 | 21 | def run(filename: str) -> None: 22 | if not filename.endswith('.py'): 23 | print(f" filename {filename} does not end with '.py'; skipping") 24 | return 25 | modulename = filename[:-3] 26 | print(f' importing module {modulename}') 27 | module = importlib.import_module(modulename) 28 | if hasattr(module, "create_design"): 29 | print(f" found create_design function in module {modulename}; running it and writing its output") 30 | design: sc.Design = module.create_design() 31 | design.write_scadnano_file(directory='output_designs', 32 | filename=modulename + f'.{sc.default_scadnano_file_extension}') 33 | else: 34 | print(f" found no main function in module {modulename}; running as subprocess instead") 35 | try: 36 | retcode = subprocess.call(f"python {filename}", shell=True) 37 | if retcode < 0: 38 | print("Child was terminated by signal", -retcode, file=sys.stderr) 39 | except OSError as e: 40 | print("Execution failed:", e, file=sys.stderr) 41 | 42 | 43 | if __name__ == "__main__": 44 | main() 45 | -------------------------------------------------------------------------------- /examples/sst-motif-3_2.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | blue = sc.Color(r=0, g=0, b=255) 6 | black = sc.Color(r=0, g=0, b=0) 7 | red = sc.Color(r=255, g=0, b=0) 8 | green = sc.Color(r=0, g=150, b=0) 9 | cols = 8 10 | rows = 8 11 | helices = [sc.Helix(major_tick_distance=10) for _ in range(rows+1)] 12 | strands = [] 13 | for col in range(cols): 14 | for row in range(rows): 15 | helix = row 16 | forward = row % 2 == 0 17 | if forward: 18 | offset = col * 20 19 | ss1 = sc.Domain(helix, forward, offset, offset + 20) 20 | ss2 = sc.Domain(helix + 1, forward, offset + 20, offset + 40) 21 | else: 22 | offset = col * 20 23 | ss2 = sc.Domain(helix, forward, offset + 10, offset + 30) 24 | ss1 = sc.Domain(helix + 1, forward, offset + 30, offset + 50) 25 | if forward: 26 | color = blue if col % 2 == 0 else black 27 | else: 28 | color = red if col % 2 == 0 else green 29 | strand = sc.Strand([ss1, ss2], color=color) 30 | strands.append(strand) 31 | 32 | design = sc.Design(helices=helices, strands=strands, grid=sc.square) 33 | 34 | return design 35 | 36 | 37 | if __name__ == '__main__': 38 | d = create_design() 39 | d.write_scadnano_file(directory='output_designs') 40 | -------------------------------------------------------------------------------- /examples/sst-motif-4_1.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def create_design() -> sc.Design: 5 | blue = sc.Color(r=0, g=0, b=255) 6 | black = sc.Color(r=0, g=0, b=0) 7 | red = sc.Color(r=255, g=0, b=0) 8 | green = sc.Color(r=0, g=150, b=0) 9 | cols = 8 10 | rows = 8 11 | helices = [sc.Helix(major_tick_distance=10) for _ in range(rows+1)] 12 | strands = [] 13 | for col in range(cols): 14 | for row in range(rows): 15 | helix = row 16 | forward = row % 2 == 0 17 | if forward: 18 | offset = col * 20 19 | ss1 = sc.Domain(helix, forward, offset, offset + 20) 20 | ss2 = sc.Domain(helix + 1, forward, offset + 20, offset + 40) 21 | else: 22 | offset = col * 20 23 | ss1 = sc.Domain(helix, forward, offset + 30, offset + 50) 24 | ss2 = sc.Domain(helix + 1, forward, offset + 10, offset + 30) 25 | if forward: 26 | color = blue if col % 2 == 0 else black 27 | else: 28 | color = red if col % 2 == 0 else green 29 | strand = sc.Strand([ss1, ss2], color=color) 30 | strands.append(strand) 31 | 32 | design = sc.Design(helices=helices, strands=strands, grid=sc.square) 33 | 34 | return design 35 | 36 | 37 | if __name__ == '__main__': 38 | d = create_design() 39 | d.write_scadnano_file(directory='output_designs') 40 | -------------------------------------------------------------------------------- /examples/strand_builder_loop.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | def create_design() -> sc.Design: 4 | num_helices = 32 5 | helices = [sc.Helix(max_offset=200) for _ in range(num_helices)] 6 | design = sc.Design(helices=helices, grid=sc.square) 7 | strand_builder = design.draw_strand(0, 0) 8 | for helix in range(num_helices): 9 | # move forward if on an even helix, otherwise move in reverse 10 | move_distance = 200 if helix % 2 == 0 else -200 11 | strand_builder.move(move_distance) 12 | if helix < 31: # crossover to next helix, unless it's the last helix 13 | strand_builder.cross(helix + 1) 14 | strand_builder.as_scaffold() 15 | return design 16 | 17 | 18 | if __name__ == '__main__': 19 | design = create_design() 20 | design.write_scadnano_file(directory='output_designs') -------------------------------------------------------------------------------- /examples/tutorial-examples/24_helix_rectangle.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | 4 | def main() -> None: 5 | design = create_design() 6 | design.write_scadnano_file() 7 | design.write_idt_plate_excel_file() 8 | 9 | 10 | def create_design() -> sc.Design: 11 | helices = [sc.Helix(max_offset=288) for _ in range(24)] 12 | design = sc.Design(helices=helices, grid=sc.square) 13 | 14 | add_scaffold_precursors(design) 15 | add_scaffold_crossovers(design) 16 | 17 | add_staple_precursors(design) 18 | add_staple_crossovers(design) 19 | add_staple_nicks(design) 20 | 21 | add_twist_correction_deletions(design) 22 | design.assign_m13_to_scaffold() 23 | 24 | return design 25 | 26 | 27 | def add_scaffold_precursors(design: sc.Design) -> None: 28 | for helix in range(0, 23, 2): # scaffold goes forward on even helices 29 | design.draw_strand(helix, 0).move(288).as_scaffold() 30 | for helix in range(1, 23, 2): # scaffold goes reverse on odd helices 31 | design.draw_strand(helix, 288).move(-288).as_scaffold() 32 | design.draw_strand(23, 288).move(-144).as_scaffold() # bottom part of scaffold has a "nick" 33 | design.draw_strand(23, 144).move(-144).as_scaffold() # 34 | 35 | 36 | def add_scaffold_crossovers(design: sc.Design) -> None: 37 | for helix in range(1, 23, 2): # scaffold interior crossovers 38 | design.add_full_crossover(helix=helix, helix2=helix + 1, offset=144, forward=False) 39 | 40 | for helix in range(0, 23, 2): # scaffold edges crossovers 41 | design.add_half_crossover(helix=helix, helix2=helix + 1, offset=0, forward=True) 42 | design.add_half_crossover(helix=helix, helix2=helix + 1, offset=287, forward=True) # offset inclusive 43 | 44 | 45 | def add_staple_precursors(design: sc.Design) -> None: 46 | staples = [sc.Strand([sc.Domain(helix=helix, forward=helix % 2 == 1, start=0, end=288)]) # noqa 47 | for helix in range(24)] 48 | for staple in staples: 49 | design.add_strand(staple) 50 | 51 | 52 | def add_staple_crossovers(design: sc.Design) -> None: 53 | for helix in range(23): 54 | start_offset = 16 if helix % 2 == 0 else 32 55 | for offset in range(start_offset, 288, 32): 56 | if offset != 144: # skip crossover near seam 57 | design.add_full_crossover(helix=helix, helix2=helix + 1, offset=offset, 58 | forward=helix % 2 == 1) 59 | 60 | 61 | def add_staple_nicks(design: sc.Design) -> None: 62 | for helix in range(24): 63 | start_offset = 24 if helix % 2 == 0 else 40 64 | for offset in range(start_offset, 272, 32): 65 | design.add_nick(helix, offset, forward=helix % 2 == 1) 66 | 67 | 68 | def add_twist_correction_deletions(design: sc.Design) -> None: 69 | for helix in range(24): 70 | for offset in range(19, 286, 48): 71 | design.add_deletion(helix, offset) 72 | 73 | 74 | if __name__ == '__main__': 75 | main() 76 | -------------------------------------------------------------------------------- /examples/tutorial-examples/24_helix_rectangle.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/examples/tutorial-examples/24_helix_rectangle.xls -------------------------------------------------------------------------------- /examples/very_large_origami.py: -------------------------------------------------------------------------------- 1 | import origami_rectangle as rect 2 | import scadnano as sc 3 | 4 | 5 | def create_design() -> sc.Design: 6 | # this is a very large origami (taking ~25,000 bases). It is useful for testing the performance of 7 | # rendering code, since at the time it was created, it is very janky to update, particularly for 8 | # things that edit strands such as adding a strand or adding a nick in a strand 9 | design = rect.create(num_helices=40, num_cols=40) 10 | return design 11 | 12 | 13 | if __name__ == '__main__': 14 | d = create_design() 15 | d.write_scadnano_file(directory='output_designs') 16 | -------------------------------------------------------------------------------- /fix-index.sh: -------------------------------------------------------------------------------- 1 | # GitHub Desktop sometimes cannot write the .git/index file. 2 | # Copying it, deleting the original, and moving the copy back fixes it. 3 | cp .git/index .git/index-copy 4 | rm .git/index 5 | mv .git/index-copy .git/index 6 | # go to sleep for 2 seconds to let Dropbox sync, which seems to help 7 | sleep 3 8 | -------------------------------------------------------------------------------- /images/download_raw_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/images/download_raw_screenshot.png -------------------------------------------------------------------------------- /misc/cadnano-format-specs/honeycomb_coordinates_cadnano.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/misc/cadnano-format-specs/honeycomb_coordinates_cadnano.png -------------------------------------------------------------------------------- /publish_to_pypi.txt: -------------------------------------------------------------------------------- 1 | rem https://medium.com/@joel.barmettler/how-to-upload-your-python-package-to-pypi-65edc5fe9c56 2 | 3 | rem !!!change current version number in scadnano.py!!! 4 | python setup.py sdist 5 | rem twine upload dist/* 6 | twine upload dist/scadnano-x.x.x.tar.gz 7 | -------------------------------------------------------------------------------- /pull_request_template.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Description 4 | 5 | 6 | ## Related Issue 7 | 8 | 9 | 10 | 11 | ## Motivation and Context 12 | 13 | 14 | 15 | ## How Has This Been Tested? 16 | 17 | 18 | 19 | 20 | ## Screenshots (if appropriate): 21 | -------------------------------------------------------------------------------- /readthedocs.yml: -------------------------------------------------------------------------------- 1 | # .readthedocs.yml 2 | # Read the Docs configuration file 3 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details 4 | 5 | version: 2 6 | 7 | sphinx: 8 | configuration: doc/conf.py 9 | builder: html 10 | fail_on_warning: true 11 | 12 | formats: all 13 | 14 | build: 15 | os: "ubuntu-22.04" 16 | tools: 17 | python: "miniconda3-4.7" 18 | 19 | conda: 20 | environment: environment.yml -------------------------------------------------------------------------------- /scadnano/.gitignore: -------------------------------------------------------------------------------- 1 | /__pycache__/ 2 | /scadnano.zip 3 | 4 | *.egg-info/ 5 | -------------------------------------------------------------------------------- /scadnano/__init__.py: -------------------------------------------------------------------------------- 1 | from scadnano.scadnano import * 2 | from scadnano.modifications import * 3 | from scadnano.origami_rectangle import * -------------------------------------------------------------------------------- /scadnano/modifications.py: -------------------------------------------------------------------------------- 1 | from scadnano import Modification5Prime, Modification3Prime, ModificationInternal 2 | 3 | biotin_5p = Modification5Prime(display_text='B', vendor_code='/5Biosg/') 4 | biotin_3p = Modification3Prime(display_text='B', vendor_code='/3Bio/') 5 | biotin_int = ModificationInternal(display_text='B', vendor_code='/iBiodT/', allowed_bases=frozenset('T')) 6 | 7 | cy3_5p = Modification5Prime(display_text='Cy3', vendor_code='/5Cy3/') 8 | cy3_3p = Modification3Prime(display_text='Cy3', vendor_code='/3Cy3Sp/') 9 | cy3_int = ModificationInternal(display_text='Cy3', vendor_code='/iCy3/') 10 | 11 | cy5_5p = Modification5Prime(display_text='Cy5', vendor_code='/5Cy5/') 12 | cy5_3p = Modification3Prime(display_text='Cy5', vendor_code='/3Cy5Sp/') 13 | cy5_int = ModificationInternal(display_text='Cy5', vendor_code='/iCy5/') 14 | 15 | fam_5p = Modification5Prime(display_text='F', vendor_code='/56-FAM/') 16 | fam_3p = Modification3Prime(display_text='F', vendor_code='/36-FAM/') 17 | 18 | rox_5p = Modification5Prime(display_text='R', vendor_code='/56-ROXN/') 19 | rox_3p = Modification3Prime(display_text='R', vendor_code='/3Rox_N/') 20 | 21 | fluorescein_5p = Modification5Prime(display_text='F', vendor_code='/5FluorT/') 22 | fluorescein_3p = Modification3Prime(display_text='F', vendor_code='/3FluorT/') 23 | fluorescein_int = ModificationInternal(display_text='F', vendor_code='/iFluorT/') 24 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | description_file = README.md -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # from distutils.core import setup 4 | 5 | # got some ideas from here: https://medium.com/@joel.barmettler/how-to-upload-your-python-package-to-pypi-65edc5fe9c56 6 | # 7 | # But apparently setuptools is the replacement for distutils, and distutils was causing problems such as 8 | # not including the README.md file and not formatting it as Markdown on PyPI 9 | # https://setuptools.readthedocs.io/en/latest/setuptools.html 10 | 11 | from setuptools import setup 12 | 13 | 14 | # import scadnano.scadnano_version as sv 15 | 16 | 17 | def extract_version(filename: str): 18 | with open(filename) as f: 19 | lines = f.readlines() 20 | version_comment = '# version line; WARNING: do not remove or change this line or comment' 21 | for line in lines: 22 | if version_comment in line: 23 | idx = line.index(version_comment) 24 | line_prefix = line[:idx] 25 | parts = line_prefix.split('=') 26 | stripped_parts = [part.strip() for part in parts] 27 | version_str = stripped_parts[-1].replace('"', '') 28 | return version_str 29 | raise AssertionError(f'could not find version in {filename}') 30 | 31 | 32 | __version__ = extract_version('scadnano/scadnano.py') 33 | 34 | # read the contents of your README file 35 | from os import path 36 | 37 | this_directory = path.abspath(path.dirname(__file__)) 38 | with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f: 39 | long_description = f.read() 40 | 41 | setup(name='scadnano', 42 | packages=['scadnano'], 43 | version=__version__, 44 | # version='0.8.0', 45 | download_url=f'https://github.com/UC-Davis-molecular-computing/scadnano-python-package/archive/v{__version__}.zip', 46 | # download_url=f'https://github.com/UC-Davis-molecular-computing/scadnano-python-package/archive/v0.7.0.zip', 47 | license='MIT', 48 | description="Python scripting library for generating designs readable by scadnano.", 49 | author="David Doty", 50 | author_email="doty@ucdavis.edu", 51 | url="https://github.com/UC-Davis-molecular-computing/scadnano-python-package", 52 | long_description=long_description, 53 | long_description_content_type='text/markdown; variant=GFM', 54 | python_requires='>=3.7', 55 | install_requires=[ 56 | 'openpyxl', 57 | 'tabulate', 58 | ], 59 | tests_require=[ 60 | 'openpyxl', 61 | ], 62 | ) 63 | -------------------------------------------------------------------------------- /tests/.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/* 2 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | from scadnano.scadnano import * 2 | -------------------------------------------------------------------------------- /tests/_jb_unittest_runner.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.16.0", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [0, 0]}, 6 | {"grid_position": [0, 1]} 7 | ], 8 | "strands": [ 9 | { 10 | "color": "#f74308", 11 | "domains": [ 12 | {"helix": 0, "forward": true, "start": 0, "end": 7}, 13 | {"helix": 1, "forward": false, "start": 0, "end": 7} 14 | ] 15 | }, 16 | { 17 | "color": "#57bb00", 18 | "domains": [ 19 | {"helix": 0, "forward": false, "start": 0, "end": 7}, 20 | {"helix": 1, "forward": true, "start": 0, "end": 7} 21 | ] 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /tests/overlapping_strands.py: -------------------------------------------------------------------------------- 1 | import scadnano as sc 2 | 3 | """ 4 | { 5 | "color": {"r": 247, "g": 147, "b": 30}, 6 | "dna_sequence": "CCACCAGCAGTACCGAACGAAAGCCCTAATTAACACCGCCTG", 7 | "substrands": [ 8 | {"helix_idx": 2, "right": false, "start": 289, "end": 299}, 9 | {"helix_idx": 3, "right": true, "start": 289, "end": 310}, 10 | {"helix_idx": 2, "right": false, "start": 299, "end": 310} 11 | ] 12 | }, 13 | 14 | { 15 | "color": {"r": 247, "g": 147, "b": 30}, 16 | "dna_sequence": "???????CCCTAAAACATCGC???????CATTAAAAATACCG", 17 | "substrands": [ 18 | {"helix_idx": 3, "right": true, "start": 305, "end": 326}, 19 | {"helix_idx": 2, "right": false, "start": 305, "end": 326} 20 | ] 21 | }, 22 | """ 23 | 24 | """ 25 | helices = [sc.Helix(0, 330), sc.Helix(1, 330), sc.Helix(2, 330), sc.Helix(3, 330)] 26 | 27 | s1_left_ss0 = sc.Substrand(2, sc.left, 289, 299) 28 | s1_ss1 = sc.Substrand(3, sc.right, 289, 310) 29 | s1_right_ss0 = sc.Substrand(2, sc.left, 299, 310) 30 | s1 = sc.Strand([s1_left_ss0, s1_ss1, s1_right_ss0]) 31 | 32 | s2_ss1 = sc.Substrand(3, sc.right, 305, 326) 33 | s2_ss0 = sc.Substrand(2, sc.left, 305, 326) 34 | s2 = sc.Strand([s2_ss1, s2_ss0]) 35 | 36 | strands = [s1, s2] 37 | design = sc.Design(helices=helices, strands=strands, grid=sc.square) 38 | 39 | return design 40 | """ 41 | 42 | def main(): 43 | helices = [sc.Helix(0, 25), sc.Helix(1, 25)] 44 | 45 | s1_left_ss0 = sc.Domain(0, sc.reverse, 0, 5) 46 | s1_ss1 = sc.Domain(0, sc.forward, 0, 15) 47 | s1_right_ss0 = sc.Domain(0, sc.reverse, 5, 15) 48 | s1 = sc.Strand([s1_left_ss0, s1_ss1, s1_right_ss0]) 49 | 50 | s2_ss1 = sc.Domain(0, sc.forward, 10, 20) 51 | s2_ss0 = sc.Domain(0, sc.reverse, 10, 20) 52 | s2 = sc.Strand([s2_ss1, s2_ss0]) 53 | 54 | strands = [s1, s2] 55 | design = sc.Design(helices=helices, strands=strands, grid=sc.square) 56 | 57 | return design 58 | 59 | if __name__ == '__main__': 60 | design = main() 61 | design.write_scadnano_file(directory='output_designs') 62 | -------------------------------------------------------------------------------- /tests/test_excel_export_384.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tests/test_excel_export_384.xlsx -------------------------------------------------------------------------------- /tests/test_excel_export_96.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tests/test_excel_export_96.xlsx -------------------------------------------------------------------------------- /tests_inputs/.gitignore: -------------------------------------------------------------------------------- 1 | cadnano_v2_export/ 2 | !cadnano_v2_export/test_paranemic_crossover.sc -------------------------------------------------------------------------------- /tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_deletions_insertions.sc: -------------------------------------------------------------------------------- 1 | { 2 | 3 | "version": "0.16.3", 4 | 5 | "grid": "square", 6 | "helices": [ 7 | {"grid_position": [0, 0]}, 8 | {"grid_position": [0, 1]} 9 | ], 10 | "strands": [ 11 | { 12 | "color": "#0066cc", 13 | "sequence": "AACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACGTAACG", 14 | "domains": [ 15 | {"helix": 1, "forward": false, "start": 0, "end": 16, "deletions": [12], "insertions": [[6, 3]]}, 16 | {"helix": 0, "forward": true, "start": 0, "end": 32, "deletions": [11, 12, 24], "insertions": [[6, 1], [18, 2]]}, 17 | {"helix": 1, "forward": false, "start": 16, "end": 32, "deletions": [24], "insertions": [[18, 4]]} 18 | ], 19 | "is_scaffold": true 20 | }, 21 | { 22 | "color": "#f74308", 23 | "sequence": "GTTACGTTACGTTACGTTGTTACGTTACGTTAC", 24 | "domains": [ 25 | {"helix": 1, "forward": true, "start": 0, "end": 16, "deletions": [12], "insertions": [[6, 3]]}, 26 | {"helix": 0, "forward": false, "start": 0, "end": 16, "deletions": [11, 12], "insertions": [[6, 1]]} 27 | ] 28 | }, 29 | { 30 | "color": "#57bb00", 31 | "sequence": "ACGTTACGTTACGTTACCGTTACGTTACGTTACGTT", 32 | "domains": [ 33 | {"helix": 0, "forward": false, "start": 16, "end": 32, "deletions": [24], "insertions": [[18, 2]]}, 34 | {"helix": 1, "forward": true, "start": 16, "end": 32, "deletions": [24], "insertions": [[18, 4]]} 35 | ] 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple.sc: -------------------------------------------------------------------------------- 1 | { 2 | 3 | "version": "0.16.3", 4 | 5 | "grid": "square", 6 | "helices": [ 7 | {"grid_position": [0, 0]}, 8 | {"grid_position": [0, 1]} 9 | ], 10 | "strands": [ 11 | { 12 | "color": "#0066cc", 13 | "domains": [ 14 | {"helix": 0, "forward": true, "start": 0, "end": 32} 15 | ], 16 | "is_scaffold": true 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple_2.sc: -------------------------------------------------------------------------------- 1 | { 2 | 3 | "version": "0.16.3", 4 | 5 | "grid": "square", 6 | "helices": [ 7 | {"grid_position": [0, 0]}, 8 | {"grid_position": [0, 1]} 9 | ], 10 | "strands": [ 11 | { 12 | "color": "#0066cc", 13 | "domains": [ 14 | {"helix": 0, "forward": true, "start": 0, "end": 32}, 15 | {"helix": 1, "forward": false, "start": 0, "end": 32} 16 | ], 17 | "is_scaffold": true 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /tests_inputs/cadnano_v2_export/test_circular_strand.sc: -------------------------------------------------------------------------------- 1 | { 2 | 3 | "version": "0.16.3", 4 | 5 | "grid": "square", 6 | "helices": [ 7 | {"max_offset": 24, "grid_position": [0, 0]}, 8 | {"max_offset": 24, "grid_position": [0, 1]} 9 | ], 10 | "strands": [ 11 | { 12 | "circular": true, 13 | "color": "#f74308", 14 | "domains": [ 15 | {"helix": 1, "forward": true, "start": 0, "end": 8}, 16 | {"helix": 0, "forward": false, "start": 0, "end": 8} 17 | ] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /tests_inputs/cadnano_v2_export/test_export_design_with_helix_group.sc: -------------------------------------------------------------------------------- 1 | { 2 | 3 | "version": "0.16.3", 4 | 5 | "groups": { 6 | "east": { 7 | "position": {"x": 10, "y": 0, "z": 0}, 8 | "grid": "square" 9 | }, 10 | "south": { 11 | "position": {"x": 0, "y": 10, "z": 0}, 12 | "grid": "square" 13 | } 14 | }, 15 | "helices": [ 16 | {"group": "south", "max_offset": 24, "grid_position": [0, 0]}, 17 | {"group": "south", "max_offset": 25, "grid_position": [0, 1]}, 18 | {"group": "east", "max_offset": 22, "grid_position": [0, 0]}, 19 | {"group": "east", "max_offset": 23, "grid_position": [0, 1]} 20 | ], 21 | "strands": [] 22 | } -------------------------------------------------------------------------------- /tests_inputs/cadnano_v2_export/test_export_design_with_helix_group_not_same_grid.sc: -------------------------------------------------------------------------------- 1 | { 2 | 3 | "version": "0.16.3", 4 | 5 | "groups": { 6 | "east": { 7 | "position": {"x": 10, "y": 0, "z": 0}, 8 | "grid": "honeycomb" 9 | }, 10 | "south": { 11 | "position": {"x": 0, "y": 10, "z": 0}, 12 | "grid": "square" 13 | } 14 | }, 15 | "helices": [ 16 | {"group": "south", "max_offset": 24, "grid_position": [0, 0]}, 17 | {"group": "south", "max_offset": 25, "grid_position": [0, 1]}, 18 | {"group": "east", "max_offset": 22, "grid_position": [0, 0]}, 19 | {"group": "east", "max_offset": 23, "grid_position": [0, 1]} 20 | ], 21 | "strands": [] 22 | } -------------------------------------------------------------------------------- /tests_inputs/cadnano_v2_export/test_paranemic_crossover.sc: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.16.3", 3 | "grid": "square", 4 | "helices": [ 5 | {"grid_position": [19, 14], "idx": 1, "max_offset": 64}, 6 | {"grid_position": [19, 15], "idx": 0, "max_offset": 64}, 7 | {"grid_position": [19, 16], "idx": 3, "max_offset": 64}, 8 | {"grid_position": [19, 17], "idx": 2, "max_offset": 64} 9 | ], 10 | "strands": [ 11 | { 12 | "color": "#007200", 13 | "domains": [ 14 | {"helix": 1, "forward": true, "start": 8, "end": 24}, 15 | {"helix": 3, "forward": true, "start": 8, "end": 24} 16 | ] 17 | }, 18 | { 19 | "color": "#0066cc", 20 | "is_scaffold": true, 21 | "domains": [ 22 | {"helix": 0, "forward": true, "start": 24, "end": 50}, 23 | {"helix": 2, "forward": true, "start": 24, "end": 50} 24 | ] 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /tests_inputs/cadnano_v2_import/test_2_stape_2_helix_origami_deletions_insertions.json: -------------------------------------------------------------------------------- 1 | {"name":"test_2_stape_2_helix_origami_deletions_insertions.json","vstrands":[{"row":0,"col":0,"num":0,"scaf":[[1,0,0,1],[0,0,0,2],[0,1,0,3],[0,2,0,4],[0,3,0,5],[0,4,0,6],[0,5,0,7],[0,6,0,8],[0,7,0,9],[0,8,0,10],[0,9,0,11],[0,10,0,12],[0,11,0,13],[0,12,0,14],[0,13,0,15],[0,14,0,16],[0,15,0,17],[0,16,0,18],[0,17,0,19],[0,18,0,20],[0,19,0,21],[0,20,0,22],[0,21,0,23],[0,22,0,24],[0,23,0,25],[0,24,0,26],[0,25,0,27],[0,26,0,28],[0,27,0,29],[0,28,0,30],[0,29,0,31],[0,30,1,31]],"stap":[[0,1,-1,-1],[0,2,0,0],[0,3,0,1],[0,4,0,2],[0,5,0,3],[0,6,0,4],[0,7,0,5],[0,8,0,6],[0,9,0,7],[0,10,0,8],[0,11,0,9],[0,12,0,10],[0,13,0,11],[0,14,0,12],[0,15,0,13],[1,15,0,14],[0,17,1,16],[0,18,0,16],[0,19,0,17],[0,20,0,18],[0,21,0,19],[0,22,0,20],[0,23,0,21],[0,24,0,22],[0,25,0,23],[0,26,0,24],[0,27,0,25],[0,28,0,26],[0,29,0,27],[0,30,0,28],[0,31,0,29],[-1,-1,0,30]],"loop":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0],"skip":[0,0,0,0,0,0,0,0,0,0,0,-1,-1,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0],"scafLoop":[],"stapLoop":[],"stap_colors":[[31,5749504]]},{"row":1,"col":0,"num":1,"scaf":[[1,1,0,0],[1,2,1,0],[1,3,1,1],[1,4,1,2],[1,5,1,3],[1,6,1,4],[1,7,1,5],[1,8,1,6],[1,9,1,7],[1,10,1,8],[1,11,1,9],[1,12,1,10],[1,13,1,11],[1,14,1,12],[1,15,1,13],[-1,-1,1,14],[1,17,-1,-1],[1,18,1,16],[1,19,1,17],[1,20,1,18],[1,21,1,19],[1,22,1,20],[1,23,1,21],[1,24,1,22],[1,25,1,23],[1,26,1,24],[1,27,1,25],[1,28,1,26],[1,29,1,27],[1,30,1,28],[1,31,1,29],[0,31,1,30]],"stap":[[-1,-1,1,1],[1,0,1,2],[1,1,1,3],[1,2,1,4],[1,3,1,5],[1,4,1,6],[1,5,1,7],[1,6,1,8],[1,7,1,9],[1,8,1,10],[1,9,1,11],[1,10,1,12],[1,11,1,13],[1,12,1,14],[1,13,1,15],[1,14,0,15],[0,16,1,17],[1,16,1,18],[1,17,1,19],[1,18,1,20],[1,19,1,21],[1,20,1,22],[1,21,1,23],[1,22,1,24],[1,23,1,25],[1,24,1,26],[1,25,1,27],[1,26,1,28],[1,27,1,29],[1,28,1,30],[1,29,1,31],[1,30,-1,-1]],"loop":[0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0],"skip":[0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0],"scafLoop":[],"stapLoop":[],"stap_colors":[[0,16204552]]}]} -------------------------------------------------------------------------------- /tests_inputs/cadnano_v2_import/test_crossover_to_same_helix.json: -------------------------------------------------------------------------------- 1 | {"name":"crossover-to-same-helix.json","vstrands":[{"row":21,"col":17,"num":0,"scaf":[[-1,-1,0,1],[0,0,0,2],[0,1,0,3],[0,2,0,4],[0,3,0,5],[0,4,0,6],[0,5,0,7],[0,6,0,16],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[0,7,0,17],[0,16,0,18],[0,17,0,19],[0,18,0,20],[0,19,0,21],[0,20,0,22],[0,21,0,23],[0,22,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1]],"stap":[[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1]],"loop":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"skip":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"scafLoop":[],"stapLoop":[],"stap_colors":[]}]} -------------------------------------------------------------------------------- /tutorial/images/complete_design_no_DNA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/complete_design_no_DNA.png -------------------------------------------------------------------------------- /tutorial/images/complete_design_with_DNA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/complete_design_with_DNA.png -------------------------------------------------------------------------------- /tutorial/images/design_no_deletions_no_DNA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/design_no_deletions_no_DNA.png -------------------------------------------------------------------------------- /tutorial/images/design_with_helices_no_strands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/design_with_helices_no_strands.png -------------------------------------------------------------------------------- /tutorial/images/excel_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/excel_file.png -------------------------------------------------------------------------------- /tutorial/images/full_crossover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/full_crossover.png -------------------------------------------------------------------------------- /tutorial/images/half_crossover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/half_crossover.png -------------------------------------------------------------------------------- /tutorial/images/load_file_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/load_file_button.png -------------------------------------------------------------------------------- /tutorial/images/scaffold_complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/scaffold_complete.png -------------------------------------------------------------------------------- /tutorial/images/scaffold_precursor_strands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/scaffold_precursor_strands.png -------------------------------------------------------------------------------- /tutorial/images/staple_precursors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/staple_precursors.png -------------------------------------------------------------------------------- /tutorial/images/staple_precursors_with_crossovers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/staple_precursors_with_crossovers.png -------------------------------------------------------------------------------- /tutorial/images/staple_precursors_with_nicks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/ecdb1880734373a2dec82435367040416618d004/tutorial/images/staple_precursors_with_nicks.png --------------------------------------------------------------------------------