diff --git a/README.md b/README.md index 526b4a9e..fa7360d3 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,14 @@ Please report issues in the web interface at the [scadnano web interface GitHub ## Installation +Short version: type this at the command line: + +```console +pip install scadnano +``` + +Read below for troubleshooting suggestions if that didn't work. + ### Getting Python The scadnano Python package requires Python version 3.7 or later (with a workaround available for version 3.6, but not for any lower version). @@ -73,6 +81,17 @@ Once Python is installed (and the dataclasses backport if you have Python versio pip install scadnano ``` + If it worked, you should be able to open a Python interpreter and import the scadnano module: + + ```console + Python 3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32 + Type "help", "copyright", "credits" or "license" for more information. + >>> import scadnano as sc + >>> print(sc.Domain(helix=1, forward=True, start=0, end=8)) + Domain(, helix=1, forward=True, start=0, end=8) + >>> + ``` + ### Troubleshooting If the above does not work for you, here are some things to try. @@ -193,7 +212,7 @@ def create_design(): helices = [sc.Helix(max_offset=48), sc.Helix(max_offset=48)] # whole design - design = sc.Design(helices=helices, strands=[], grid=sc.square) + design = sc.Design(helices=helices, grid=sc.square) # for absolute offsets, call method "to" # left staple diff --git a/examples/16_helix_origami_barrel_from_algoSST_paper.py b/examples/16_helix_origami_barrel_from_algoSST_paper.py index b7b69b12..06b3987d 100644 --- a/examples/16_helix_origami_barrel_from_algoSST_paper.py +++ b/examples/16_helix_origami_barrel_from_algoSST_paper.py @@ -107,12 +107,11 @@ def add_adapters(design: sc.Design) -> None: for bot_helix in range(2, 18, 2): top_helix = bot_helix - 1 if bot_helix != 2 else 17 dom_top = sc.Domain(helix=top_helix, forward=True, - start=left_outside_seed, end=left_inside_seed) + start=left_outside_seed, end=left_inside_seed) dom_bot = sc.Domain(helix=bot_helix, forward=False, - start=left_outside_seed, end=left_inside_seed) - idt = sc.IDTFields(name=f'adap-left-{top_helix}-{bot_helix}', - scale='25nm', purification='STD') - adapter = sc.Strand(domains=[dom_bot, dom_top], idt=idt) + start=left_outside_seed, end=left_inside_seed) + idt = sc.IDTFields(scale='25nm', purification='STD') + adapter = sc.Strand(domains=[dom_bot, dom_top], name=f'adap-left-{top_helix}-{bot_helix}', idt=idt) design.add_strand(adapter) # right adapters @@ -121,12 +120,11 @@ def add_adapters(design: sc.Design) -> None: for bot_helix in range(2, 18, 2): top_helix = bot_helix - 1 if bot_helix != 2 else 17 dom_top = sc.Domain(helix=top_helix, forward=True, - start=right_inside_seed, end=right_outside_seed) + start=right_inside_seed, end=right_outside_seed) dom_bot = sc.Domain(helix=bot_helix, forward=False, - start=right_inside_seed, end=right_outside_seed) - idt = sc.IDTFields(name=f'adap-right-{top_helix}-{bot_helix}', - scale='25nm', purification='STD') - adapter = sc.Strand(domains=[dom_top, dom_bot], idt=idt) + start=right_inside_seed, end=right_outside_seed) + idt = sc.IDTFields(scale='25nm', purification='STD') + adapter = sc.Strand(domains=[dom_top, dom_bot], name=f'adap-right-{top_helix}-{bot_helix}', idt=idt) design.add_strand(adapter) @@ -163,9 +161,9 @@ def add_tiles_and_assign_dna(design: sc.Design) -> None: start=left_left, end=left_right) ss_bot = sc.Domain(helix=bot_helix, forward=False, start=left_left, end=left_right) - idt = sc.IDTFields(name=f'tile-left-{top_helix}-{bot_helix}', - scale='25nm', purification='STD') - tile = sc.Strand(domains=[ss_bot, ss_top], color=sc.Color(0, 0, 0), idt=idt) + idt = sc.IDTFields(scale='25nm', purification='STD') + tile = sc.Strand(domains=[ss_bot, ss_top], name=f'tile-left-{top_helix}-{bot_helix}', + color=sc.Color(0, 0, 0), idt=idt) design.add_strand(tile) design.assign_dna(tile, seq) @@ -178,9 +176,9 @@ def add_tiles_and_assign_dna(design: sc.Design) -> None: start=right_left, end=right_right) ss_bot = sc.Domain(helix=bot_helix, forward=False, start=right_left, end=right_right) - idt = sc.IDTFields(name=f'tile-right-{top_helix}-{bot_helix}', - scale='25nm', purification='STD') - tile = sc.Strand(domains=[ss_bot, ss_top], color=sc.Color(0, 0, 0), idt=idt) + idt = sc.IDTFields(scale='25nm', purification='STD') + tile = sc.Strand(domains=[ss_bot, ss_top], name=f'tile-right-{top_helix}-{bot_helix}', + color=sc.Color(0, 0, 0), idt=idt) design.add_strand(tile) design.assign_dna(tile, seq) diff --git a/examples/16_helix_origami_rectangle_seed_tiles_grow_from_top.py b/examples/16_helix_origami_rectangle_seed_tiles_grow_from_top.py index 10eddf5b..3c133e62 100644 --- a/examples/16_helix_origami_rectangle_seed_tiles_grow_from_top.py +++ b/examples/16_helix_origami_rectangle_seed_tiles_grow_from_top.py @@ -73,9 +73,8 @@ def add_adapters(design: sc.Design) -> None: start=left_outside_seed, end=left_inside_seed) ss_bot = sc.Domain(helix=bot_helix, forward=False, start=left_outside_seed, end=left_inside_seed) - idt = sc.IDTFields(name=f'adap-left-{top_helix}-{bot_helix}', - scale='25nm', purification='STD') - adapter = sc.Strand(domains=[ss_bot, ss_top], idt=idt) + idt = sc.IDTFields(scale='25nm', purification='STD') + adapter = sc.Strand(domains=[ss_bot, ss_top], name=f'adap-left-{top_helix}-{bot_helix}', idt=idt) design.add_strand(adapter) # right adapters @@ -87,9 +86,8 @@ def add_adapters(design: sc.Design) -> None: start=right_inside_seed, end=right_outside_seed) ss_bot = sc.Domain(helix=bot_helix, forward=False, start=right_inside_seed, end=right_outside_seed) - idt = sc.IDTFields(name=f'adap-right-{top_helix}-{bot_helix}', - scale='25nm', purification='STD') - adapter = sc.Strand(domains=[ss_top, ss_bot], idt=idt) + idt = sc.IDTFields(scale='25nm', purification='STD') + adapter = sc.Strand(domains=[ss_top, ss_bot], name=f'adap-right-{top_helix}-{bot_helix}', idt=idt) design.add_strand(adapter) diff --git a/examples/1_staple_1_helix_origami_idt_duplicate_names.py b/examples/1_staple_1_helix_origami_idt_duplicate_names.py index fb593c79..73238c30 100644 --- a/examples/1_staple_1_helix_origami_idt_duplicate_names.py +++ b/examples/1_staple_1_helix_origami_idt_duplicate_names.py @@ -6,10 +6,10 @@ def create_design() -> sc.Design: ss3_r = sc.Domain(0, True, 8, 12) ss_l = sc.Domain(0, False, 0, 12) - s1_r = sc.Strand([ss1_r], idt=sc.IDTFields('s1_r')) - s2_r = sc.Strand([ss2_r], idt=sc.IDTFields('s1_r')) - s3_r = sc.Strand([ss3_r], idt=sc.IDTFields('s1_r')) - s_l = sc.Strand([ss_l], idt=sc.IDTFields('s_l')) + s1_r = sc.Strand([ss1_r], idt=sc.IDTFields(), name='s1_r') + s2_r = sc.Strand([ss2_r], idt=sc.IDTFields(), name='s1_r') + s3_r = sc.Strand([ss3_r], idt=sc.IDTFields(), name='s1_r') + s_l = sc.Strand([ss_l], idt=sc.IDTFields(), name='s_l') strands = [s1_r, s2_r, s3_r, s_l] diff --git a/examples/idt-plates-explicit.py b/examples/idt-plates-explicit.py index ac2a6a55..ff3b5831 100644 --- a/examples/idt-plates-explicit.py +++ b/examples/idt-plates-explicit.py @@ -18,9 +18,9 @@ def create_design() -> sc.Design: row = ROWS[row_idx] col = COLS[col_idx] well = f'{row}{col}' - idt = sc.IDTFields(name=f"staple{s}", plate=f'plate{plate}', well=well) + idt = sc.IDTFields(plate=f'plate{plate}', well=well) - strand = sc.Strand(domains=[ss_f, ss_r], idt=idt) + strand = sc.Strand(domains=[ss_f, ss_r], idt=idt, name=f'staple{s}') strands.append(strand) row_idx += 1 if row_idx == len(ROWS): diff --git a/examples/output_designs/16_helix_origami_barrel_from_algoSST_paper.sc b/examples/output_designs/16_helix_origami_barrel_from_algoSST_paper.sc index 4c6fc582..232b8c67 100644 --- a/examples/output_designs/16_helix_origami_barrel_from_algoSST_paper.sc +++ b/examples/output_designs/16_helix_origami_barrel_from_algoSST_paper.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ { @@ -2025,288 +2025,320 @@ ] }, { + "name": "adap-left-17-2", "color": "#f74308", "sequence": "GTAAAATACGTAATGCTTGTCAACAAAACAAATCCACCCTAAAGGGAGCCCC", - "idt": {"name": "adap-left-17-2", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 2, "forward": false, "start": 22, "end": 48}, {"helix": 17, "forward": true, "start": 22, "end": 48} ] }, { + "name": "adap-left-3-4", "color": "#57bb00", "sequence": "TGAGATGGTTTAATTTTTCCTCCTATCTCTAGACAACACTACGAAGGCACCA", - "idt": {"name": "adap-left-3-4", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 4, "forward": false, "start": 22, "end": 48}, {"helix": 3, "forward": true, "start": 22, "end": 48} ] }, { + "name": "adap-left-5-6", "color": "#888888", "sequence": "AAAACGAGAATGACCATACCAGATTCCTACTTCCTTCAACTTTAATCATTGT", - "idt": {"name": "adap-left-5-6", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 6, "forward": false, "start": 22, "end": 48}, {"helix": 5, "forward": true, "start": 22, "end": 48} ] }, { + "name": "adap-left-7-8", "color": "#32b86c", "sequence": "CATTTGGGGCGCGAGCTCTGATCTCTCGACTATTCTTAAATCAAAAATCAGG", - "idt": {"name": "adap-left-7-8", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 8, "forward": false, "start": 22, "end": 48}, {"helix": 7, "forward": true, "start": 22, "end": 48} ] }, { + "name": "adap-left-9-10", "color": "#333333", "sequence": "AAACAAGAGAATCGATTATCCTTAGCCCTATCCATTTGAAAAGGTGGCATCA", - "idt": {"name": "adap-left-9-10", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 10, "forward": false, "start": 22, "end": 48}, {"helix": 9, "forward": true, "start": 22, "end": 48} ] }, { + "name": "adap-left-11-12", "color": "#320096", "sequence": "GCTTTCCGGCACCGCTTTCCTGATACGATCATCACTGAACGGTAATCGTAAA", - "idt": {"name": "adap-left-11-12", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 12, "forward": false, "start": 22, "end": 48}, {"helix": 11, "forward": true, "start": 22, "end": 48} ] }, { + "name": "adap-left-13-14", "color": "#03b6a2", "sequence": "TCCAGTCGGGAAACCTATCGTCTCATTTTTAACGCATCTGGTGCCGGAAACC", - "idt": {"name": "adap-left-13-14", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 14, "forward": false, "start": 22, "end": 48}, {"helix": 13, "forward": true, "start": 22, "end": 48} ] }, { + "name": "adap-left-15-16", "color": "#7300de", "sequence": "AAGCACTAAATCGGAATTGACCAATTCTCTCTGAATGTCGTGCCAGCTGCAT", - "idt": {"name": "adap-left-15-16", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 16, "forward": false, "start": 22, "end": 48}, {"helix": 15, "forward": true, "start": 22, "end": 48} ] }, { + "name": "adap-right-17-2", "color": "#aaaa00", "sequence": "TAGTCTTTAATGCGCGATCTTTCCGTACCAAGAACTTCGTCTTTCCAGACGT", - "idt": {"name": "adap-right-17-2", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 17, "forward": true, "start": 464, "end": 490}, {"helix": 2, "forward": false, "start": 464, "end": 490} ] }, { + "name": "adap-right-3-4", "color": "#b8056c", "sequence": "ACGATCTAAAGTTTTGAACATCCCAATTATCCACGTAGTAAGCGTCATACAT", - "idt": {"name": "adap-right-3-4", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 3, "forward": true, "start": 464, "end": 490}, {"helix": 4, "forward": false, "start": 464, "end": 490} ] }, { + "name": "adap-right-5-6", "color": "#007200", "sequence": "CTGAATTTACCGTTCCACCTTTCGAAAACCTCGAATTAAAGGTGAATTATCA", - "idt": {"name": "adap-right-5-6", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 5, "forward": true, "start": 464, "end": 490}, {"helix": 6, "forward": false, "start": 464, "end": 490} ] }, { + "name": "adap-right-7-8", "color": "#cc0000", "sequence": "GACGGAAATTATTCATACACTGACAAATCTGCTCATATAAAAACAGGGAAGC", - "idt": {"name": "adap-right-7-8", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 7, "forward": true, "start": 464, "end": 490}, {"helix": 8, "forward": false, "start": 464, "end": 490} ] }, { + "name": "adap-right-9-10", "color": "#f7931e", "sequence": "TTACAGAGAGAATAACAAAGACACCTTCAAGTTCCATAGATAAGTCCTGAAC", - "idt": {"name": "adap-right-9-10", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 9, "forward": true, "start": 464, "end": 490}, {"helix": 10, "forward": false, "start": 464, "end": 490} ] }, { + "name": "adap-right-11-12", "color": "#f74308", "sequence": "GCCTGTTTATCAACAAACAGCCTAAAACCCATTCATATCATAGGTCTGAGAG", - "idt": {"name": "adap-right-11-12", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 11, "forward": true, "start": 464, "end": 490}, {"helix": 12, "forward": false, "start": 464, "end": 490} ] }, { + "name": "adap-right-13-14", "color": "#57bb00", "sequence": "TAGTGAATTTATCAAAATACGCATCTAACCTTCACATATAATCCTGATTGTT", - "idt": {"name": "adap-right-13-14", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 13, "forward": true, "start": 464, "end": 490}, {"helix": 14, "forward": false, "start": 464, "end": 490} ] }, { + "name": "adap-right-15-16", "color": "#888888", "sequence": "GATGGCAATTCATCAATATCATGCCATACCATGCTTAACTGATAGCCCTAAA", - "idt": {"name": "adap-right-15-16", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 15, "forward": true, "start": 464, "end": 490}, {"helix": 16, "forward": false, "start": 464, "end": 490} ] }, { + "name": "tile-left-2-3", "color": "#000000", "sequence": "TTGTCTAGAGTTTGGGATGTTAGTTCTTGGTATTGTTGACAA", - "idt": {"name": "tile-left-2-3", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 3, "forward": false, "start": 11, "end": 32}, {"helix": 2, "forward": true, "start": 11, "end": 32} ] }, { + "name": "tile-left-4-5", "color": "#000000", "sequence": "AAGGAAGTAGATTCGAAAGGTACGTGGATAAAATAGGAGGAA", - "idt": {"name": "tile-left-4-5", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 5, "forward": false, "start": 11, "end": 32}, {"helix": 4, "forward": true, "start": 11, "end": 32} ] }, { + "name": "tile-left-6-7", "color": "#000000", "sequence": "AGAATAGTCGTTTGTCAGTGTATTCGAGGTTAGAATCTGGTA", - "idt": {"name": "tile-left-6-7", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 7, "forward": false, "start": 11, "end": 32}, {"helix": 6, "forward": true, "start": 11, "end": 32} ] }, { + "name": "tile-left-8-9", "color": "#000000", "sequence": "AATGGATAGGTAGGTGTCTTTATGAGCAGATAAGAGATCAGA", - "idt": {"name": "tile-left-8-9", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 9, "forward": false, "start": 11, "end": 32}, {"helix": 8, "forward": true, "start": 11, "end": 32} ] }, { + "name": "tile-left-10-11", "color": "#000000", "sequence": "AGTGATGATCTTTTAGGCTGTTGGAACTTGATGCTAAGGATA", - "idt": {"name": "tile-left-10-11", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 11, "forward": false, "start": 11, "end": 32}, {"helix": 10, "forward": true, "start": 11, "end": 32} ] }, { + "name": "tile-left-12-13", "color": "#000000", "sequence": "TGCGTTAAAATAGATGCGTATATGAATGGGTAGTATCAGGAA", - "idt": {"name": "tile-left-12-13", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 13, "forward": false, "start": 11, "end": 32}, {"helix": 12, "forward": true, "start": 11, "end": 32} ] }, { + "name": "tile-left-14-15", "color": "#000000", "sequence": "ATTCAGAGAGTTGGCATGATATGTGAAGGTTTATGAGACGAT", - "idt": {"name": "tile-left-14-15", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 15, "forward": false, "start": 11, "end": 32}, {"helix": 14, "forward": true, "start": 11, "end": 32} ] }, { + "name": "tile-left-16-17", "color": "#000000", "sequence": "TGGATTTGTTTACGGAAAGATAAGCATGGTAAAATTGGTCAA", - "idt": {"name": "tile-left-16-17", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 17, "forward": false, "start": 11, "end": 32}, {"helix": 16, "forward": true, "start": 11, "end": 32} ] }, { + "name": "tile-right-2-3", "color": "#000000", "sequence": "TTGTCTAGAGTTTGGGATGTTAGTTCTTGGTATTGTTGACAA", - "idt": {"name": "tile-right-2-3", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 3, "forward": false, "start": 480, "end": 501}, {"helix": 2, "forward": true, "start": 480, "end": 501} ] }, { + "name": "tile-right-4-5", "color": "#000000", "sequence": "AAGGAAGTAGATTCGAAAGGTACGTGGATAAAATAGGAGGAA", - "idt": {"name": "tile-right-4-5", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 5, "forward": false, "start": 480, "end": 501}, {"helix": 4, "forward": true, "start": 480, "end": 501} ] }, { + "name": "tile-right-6-7", "color": "#000000", "sequence": "AGAATAGTCGTTTGTCAGTGTATTCGAGGTTAGAATCTGGTA", - "idt": {"name": "tile-right-6-7", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 7, "forward": false, "start": 480, "end": 501}, {"helix": 6, "forward": true, "start": 480, "end": 501} ] }, { + "name": "tile-right-8-9", "color": "#000000", "sequence": "AATGGATAGGTAGGTGTCTTTATGAGCAGATAAGAGATCAGA", - "idt": {"name": "tile-right-8-9", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 9, "forward": false, "start": 480, "end": 501}, {"helix": 8, "forward": true, "start": 480, "end": 501} ] }, { + "name": "tile-right-10-11", "color": "#000000", "sequence": "AGTGATGATCTTTTAGGCTGTTGGAACTTGATGCTAAGGATA", - "idt": {"name": "tile-right-10-11", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 11, "forward": false, "start": 480, "end": 501}, {"helix": 10, "forward": true, "start": 480, "end": 501} ] }, { + "name": "tile-right-12-13", "color": "#000000", "sequence": "TGCGTTAAAATAGATGCGTATATGAATGGGTAGTATCAGGAA", - "idt": {"name": "tile-right-12-13", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 13, "forward": false, "start": 480, "end": 501}, {"helix": 12, "forward": true, "start": 480, "end": 501} ] }, { + "name": "tile-right-14-15", "color": "#000000", "sequence": "ATTCAGAGAGTTGGCATGATATGTGAAGGTTTATGAGACGAT", - "idt": {"name": "tile-right-14-15", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 15, "forward": false, "start": 480, "end": 501}, {"helix": 14, "forward": true, "start": 480, "end": 501} ] }, { + "name": "tile-right-16-17", "color": "#000000", "sequence": "TGGATTTGTTTACGGAAAGATAAGCATGGTAAAATTGGTCAA", - "idt": {"name": "tile-right-16-17", "scale": "25nm", "purification": "STD"}, + "idt": {"scale": "25nm", "purification": "STD"}, "domains": [ {"helix": 17, "forward": false, "start": 480, "end": 501}, {"helix": 16, "forward": true, "start": 480, "end": 501} diff --git a/examples/output_designs/16_helix_origami_rectangle.sc b/examples/output_designs/16_helix_origami_rectangle.sc index 4d115496..f9dcf060 100644 --- a/examples/output_designs/16_helix_origami_rectangle.sc +++ b/examples/output_designs/16_helix_origami_rectangle.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 448, "grid_position": [0, 0]}, diff --git a/examples/output_designs/16_helix_origami_rectangle_idt.sc b/examples/output_designs/16_helix_origami_rectangle_idt.sc index 4d115496..f9dcf060 100644 --- a/examples/output_designs/16_helix_origami_rectangle_idt.sc +++ b/examples/output_designs/16_helix_origami_rectangle_idt.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 448, "grid_position": [0, 0]}, diff --git a/examples/output_designs/16_helix_origami_rectangle_no_seq.sc b/examples/output_designs/16_helix_origami_rectangle_no_seq.sc index 1331ec98..0b0b38c2 100644 --- a/examples/output_designs/16_helix_origami_rectangle_no_seq.sc +++ b/examples/output_designs/16_helix_origami_rectangle_no_seq.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 448, "grid_position": [0, 0]}, diff --git a/examples/output_designs/16_helix_origami_rectangle_no_seq_no_twist.sc b/examples/output_designs/16_helix_origami_rectangle_no_seq_no_twist.sc index f94a163e..e789e275 100644 --- a/examples/output_designs/16_helix_origami_rectangle_no_seq_no_twist.sc +++ b/examples/output_designs/16_helix_origami_rectangle_no_seq_no_twist.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 448, "grid_position": [0, 0]}, diff --git a/examples/output_designs/16_helix_origami_rectangle_no_twist.sc b/examples/output_designs/16_helix_origami_rectangle_no_twist.sc index f4d57974..7ab8cc69 100644 --- a/examples/output_designs/16_helix_origami_rectangle_no_twist.sc +++ b/examples/output_designs/16_helix_origami_rectangle_no_twist.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 448, "grid_position": [0, 0]}, diff --git a/examples/output_designs/16_helix_origami_rectangle_seed_tiles_grow_from_top.sc b/examples/output_designs/16_helix_origami_rectangle_seed_tiles_grow_from_top.sc index a3e95b1c..7332ea29 100644 --- a/examples/output_designs/16_helix_origami_rectangle_seed_tiles_grow_from_top.sc +++ b/examples/output_designs/16_helix_origami_rectangle_seed_tiles_grow_from_top.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ { diff --git a/examples/output_designs/16_helix_origami_rectangle_shifted_seam_no_seq.sc b/examples/output_designs/16_helix_origami_rectangle_shifted_seam_no_seq.sc index eb71ba4f..52a5f779 100644 --- a/examples/output_designs/16_helix_origami_rectangle_shifted_seam_no_seq.sc +++ b/examples/output_designs/16_helix_origami_rectangle_shifted_seam_no_seq.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 448, "grid_position": [0, 0]}, diff --git a/examples/output_designs/1_staple_1_helix_origami.sc b/examples/output_designs/1_staple_1_helix_origami.sc index e72fc137..697e11e5 100644 --- a/examples/output_designs/1_staple_1_helix_origami.sc +++ b/examples/output_designs/1_staple_1_helix_origami.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ { diff --git a/examples/output_designs/1_staple_1_helix_origami_mismatches.sc b/examples/output_designs/1_staple_1_helix_origami_mismatches.sc index 2ddf93a0..93c3afc9 100644 --- a/examples/output_designs/1_staple_1_helix_origami_mismatches.sc +++ b/examples/output_designs/1_staple_1_helix_origami_mismatches.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]} diff --git a/examples/output_designs/1_staple_1_helix_origami_position_nondefault.sc b/examples/output_designs/1_staple_1_helix_origami_position_nondefault.sc index 009a6cc9..b2367567 100644 --- a/examples/output_designs/1_staple_1_helix_origami_position_nondefault.sc +++ b/examples/output_designs/1_staple_1_helix_origami_position_nondefault.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "none", "helices": [ { diff --git a/examples/output_designs/1_staple_1_helix_origami_roll.sc b/examples/output_designs/1_staple_1_helix_origami_roll.sc index e9282783..29cacbbc 100644 --- a/examples/output_designs/1_staple_1_helix_origami_roll.sc +++ b/examples/output_designs/1_staple_1_helix_origami_roll.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0], "roll": 90} diff --git a/examples/output_designs/2_helix_2_strands_multiple_substrands_no_seq.sc b/examples/output_designs/2_helix_2_strands_multiple_substrands_no_seq.sc index cb716c99..5da118a5 100644 --- a/examples/output_designs/2_helix_2_strands_multiple_substrands_no_seq.sc +++ b/examples/output_designs/2_helix_2_strands_multiple_substrands_no_seq.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, diff --git a/examples/output_designs/2_staple_2_helix_modifications.sc b/examples/output_designs/2_staple_2_helix_modifications.sc index 4338fe02..9225c95b 100644 --- a/examples/output_designs/2_staple_2_helix_modifications.sc +++ b/examples/output_designs/2_staple_2_helix_modifications.sc @@ -1,11 +1,17 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, {"grid_position": [0, 1]} ], "modifications_in_design": { + "/iCy3/": { + "display_text": "Cy3", + "idt_text": "/iCy3/", + "display_connector": false, + "location": "internal" + }, "/iBiodT/": { "display_text": "B", "idt_text": "/iBiodT/", @@ -19,35 +25,29 @@ "display_connector": false, "location": "internal" }, - "/5Biosg/": { + "/3Bio/": { "display_text": "B", - "idt_text": "/5Biosg/", + "idt_text": "/3Bio/", "display_connector": false, - "location": "5'" + "location": "3'" }, - "/iCy3/": { + "/3Cy3Sp/": { "display_text": "Cy3", - "idt_text": "/iCy3/", + "idt_text": "/3Cy3Sp/", "display_connector": false, - "location": "internal" + "location": "3'" }, - "/3Bio/": { + "/5Biosg/": { "display_text": "B", - "idt_text": "/3Bio/", + "idt_text": "/5Biosg/", "display_connector": false, - "location": "3'" + "location": "5'" }, "/5Cy5/": { "display_text": "Cy5", "idt_text": "/5Cy5/", "display_connector": false, "location": "5'" - }, - "/3Cy3Sp/": { - "display_text": "Cy3", - "idt_text": "/3Cy3Sp/", - "display_connector": false, - "location": "3'" } }, "strands": [ diff --git a/examples/output_designs/2_staple_2_helix_origami_6bases_wide.sc b/examples/output_designs/2_staple_2_helix_origami_6bases_wide.sc index c91c1461..27496e40 100644 --- a/examples/output_designs/2_staple_2_helix_origami_6bases_wide.sc +++ b/examples/output_designs/2_staple_2_helix_origami_6bases_wide.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, diff --git a/examples/output_designs/2_staple_2_helix_origami_deletions.sc b/examples/output_designs/2_staple_2_helix_origami_deletions.sc index f8e05795..358dff3e 100644 --- a/examples/output_designs/2_staple_2_helix_origami_deletions.sc +++ b/examples/output_designs/2_staple_2_helix_origami_deletions.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, diff --git a/examples/output_designs/2_staple_2_helix_origami_deletions_insertions.sc b/examples/output_designs/2_staple_2_helix_origami_deletions_insertions.sc index 004eabe2..b2d6ed74 100644 --- a/examples/output_designs/2_staple_2_helix_origami_deletions_insertions.sc +++ b/examples/output_designs/2_staple_2_helix_origami_deletions_insertions.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 48, "grid_position": [0, 0]}, diff --git a/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_labels.sc b/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_labels.sc index b6d3917f..9af6a190 100644 --- a/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_labels.sc +++ b/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_labels.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 48, "grid_position": [0, 0]}, diff --git a/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_mods.sc b/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_mods.sc index d3210207..2930c9c0 100644 --- a/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_mods.sc +++ b/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_mods.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 48, "grid_position": [0, 0]}, diff --git a/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_mods_chained_methods.sc b/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_mods_chained_methods.sc index a075cc4e..970f10c0 100644 --- a/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_mods_chained_methods.sc +++ b/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_mods_chained_methods.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 48, "grid_position": [0, 0]}, diff --git a/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_new_geometry.sc b/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_new_geometry.sc index 95dab801..a1b970ba 100644 --- a/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_new_geometry.sc +++ b/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_new_geometry.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "geometry": { "rise_per_base_pair": 0.2, diff --git a/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_no_seq.sc b/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_no_seq.sc index 03ce57e0..38af3535 100644 --- a/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_no_seq.sc +++ b/examples/output_designs/2_staple_2_helix_origami_deletions_insertions_no_seq.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, diff --git a/examples/output_designs/3_helix_deletions_insertions.sc b/examples/output_designs/3_helix_deletions_insertions.sc index 0a6ca864..94069ff7 100644 --- a/examples/output_designs/3_helix_deletions_insertions.sc +++ b/examples/output_designs/3_helix_deletions_insertions.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, diff --git a/examples/output_designs/4_helix_grid_none.sc b/examples/output_designs/4_helix_grid_none.sc index 8e07ad3e..fd83e5d4 100644 --- a/examples/output_designs/4_helix_grid_none.sc +++ b/examples/output_designs/4_helix_grid_none.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "none", "helices": [ {"position": {"x": 0, "y": 0, "z": 2.5}}, diff --git a/examples/output_designs/4_helix_grid_none_min_offset_position_x_nondefault.sc b/examples/output_designs/4_helix_grid_none_min_offset_position_x_nondefault.sc index 4c2db09c..087feda7 100644 --- a/examples/output_designs/4_helix_grid_none_min_offset_position_x_nondefault.sc +++ b/examples/output_designs/4_helix_grid_none_min_offset_position_x_nondefault.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "none", "helices": [ {"position": {"x": 0, "y": 0, "z": 0}, "major_tick_distance": 4}, diff --git a/examples/output_designs/4_helix_min_offsets_nonzero.sc b/examples/output_designs/4_helix_min_offsets_nonzero.sc index 599c5f66..a03fa763 100644 --- a/examples/output_designs/4_helix_min_offsets_nonzero.sc +++ b/examples/output_designs/4_helix_min_offsets_nonzero.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 30, "grid_position": [0, 0]}, diff --git a/examples/output_designs/56_helix_origami_rectangle.sc b/examples/output_designs/56_helix_origami_rectangle.sc index 72d1fe52..21630ec2 100644 --- a/examples/output_designs/56_helix_origami_rectangle.sc +++ b/examples/output_designs/56_helix_origami_rectangle.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 160, "grid_position": [0, 0]}, diff --git a/examples/output_designs/64_helix_origami_rectangle.sc b/examples/output_designs/64_helix_origami_rectangle.sc index 02899102..d742135e 100644 --- a/examples/output_designs/64_helix_origami_rectangle.sc +++ b/examples/output_designs/64_helix_origami_rectangle.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 128, "grid_position": [0, 0]}, diff --git a/examples/output_designs/6_helix_6_col_origami_rectangle.sc b/examples/output_designs/6_helix_6_col_origami_rectangle.sc index cdb491e3..fef11c24 100644 --- a/examples/output_designs/6_helix_6_col_origami_rectangle.sc +++ b/examples/output_designs/6_helix_6_col_origami_rectangle.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, diff --git a/examples/output_designs/6_helix_bundle_honeycomb.sc b/examples/output_designs/6_helix_bundle_honeycomb.sc index d18c9266..d68c5a8f 100644 --- a/examples/output_designs/6_helix_bundle_honeycomb.sc +++ b/examples/output_designs/6_helix_bundle_honeycomb.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "honeycomb", "helices": [ {"max_offset": 1295, "grid_position": [1, 1]}, diff --git a/examples/output_designs/6_helix_origami_rectangle.sc b/examples/output_designs/6_helix_origami_rectangle.sc index 526b11bb..b490d285 100644 --- a/examples/output_designs/6_helix_origami_rectangle.sc +++ b/examples/output_designs/6_helix_origami_rectangle.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 192, "grid_position": [0, 0]}, diff --git a/examples/output_designs/6_helix_origami_rectangle_helices_out_of_order.sc b/examples/output_designs/6_helix_origami_rectangle_helices_out_of_order.sc index a9eaec61..960730ae 100644 --- a/examples/output_designs/6_helix_origami_rectangle_helices_out_of_order.sc +++ b/examples/output_designs/6_helix_origami_rectangle_helices_out_of_order.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 192, "grid_position": [0, 0]}, diff --git a/examples/output_designs/circular.sc b/examples/output_designs/circular.sc index 3ed75b0b..d5fae32a 100644 --- a/examples/output_designs/circular.sc +++ b/examples/output_designs/circular.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, diff --git a/examples/output_designs/empty.sc b/examples/output_designs/empty.sc index d987c530..b5828bf2 100644 --- a/examples/output_designs/empty.sc +++ b/examples/output_designs/empty.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [], "strands": [] diff --git a/examples/output_designs/hairpin.sc b/examples/output_designs/hairpin.sc index 93525b4f..f52dde0e 100644 --- a/examples/output_designs/hairpin.sc +++ b/examples/output_designs/hairpin.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]} diff --git a/examples/output_designs/helices_out_of_order_nonconsecutive.sc b/examples/output_designs/helices_out_of_order_nonconsecutive.sc index d5f42dac..a6eaacbd 100644 --- a/examples/output_designs/helices_out_of_order_nonconsecutive.sc +++ b/examples/output_designs/helices_out_of_order_nonconsecutive.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "none", "helices": [ {"max_offset": 20, "position": {"x": 0, "y": 0.0, "z": 0}, "idx": 2}, diff --git a/examples/output_designs/helix_groups.sc b/examples/output_designs/helix_groups.sc index 7b0cf920..976e9bd7 100644 --- a/examples/output_designs/helix_groups.sc +++ b/examples/output_designs/helix_groups.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "groups": { "north": { "position": {"x": 0, "y": -10, "z": 0}, diff --git a/examples/output_designs/hex_lattice_10x10.sc b/examples/output_designs/hex_lattice_10x10.sc index 654de0be..75460903 100644 --- a/examples/output_designs/hex_lattice_10x10.sc +++ b/examples/output_designs/hex_lattice_10x10.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "hex", "helices": [ {"max_offset": 16, "grid_position": [0, 0]}, diff --git a/examples/output_designs/hex_lattice_10x10_with_negative.sc b/examples/output_designs/hex_lattice_10x10_with_negative.sc index 27d2105e..4218b437 100644 --- a/examples/output_designs/hex_lattice_10x10_with_negative.sc +++ b/examples/output_designs/hex_lattice_10x10_with_negative.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "hex", "helices": [ {"max_offset": 16, "grid_position": [-4, -4]}, diff --git a/examples/output_designs/honeycomb_lattice_10x10.sc b/examples/output_designs/honeycomb_lattice_10x10.sc index 252d104a..acabf5a0 100644 --- a/examples/output_designs/honeycomb_lattice_10x10.sc +++ b/examples/output_designs/honeycomb_lattice_10x10.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "honeycomb", "helices": [ {"max_offset": 16, "grid_position": [0, 0]}, diff --git a/examples/output_designs/honeycomb_lattice_10x10_with_negative.sc b/examples/output_designs/honeycomb_lattice_10x10_with_negative.sc index 8862989e..469f160d 100644 --- a/examples/output_designs/honeycomb_lattice_10x10_with_negative.sc +++ b/examples/output_designs/honeycomb_lattice_10x10_with_negative.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "honeycomb", "helices": [ {"max_offset": 16, "grid_position": [-4, -4]}, diff --git a/examples/output_designs/idt-plates-explicit.sc b/examples/output_designs/idt-plates-explicit.sc index cfe0fa1a..24c754a5 100644 --- a/examples/output_designs/idt-plates-explicit.sc +++ b/examples/output_designs/idt-plates-explicit.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, @@ -7,1872 +7,2080 @@ ], "strands": [ { + "name": "staple1", "color": "#f74308", "sequence": "TATTATAGTCTTACCCTGAC", - "idt": {"name": "staple1", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A1"}, "domains": [ {"helix": 0, "forward": true, "start": 0, "end": 10}, {"helix": 1, "forward": false, "start": 0, "end": 10} ] }, { + "name": "staple2", "color": "#57bb00", "sequence": "AGAAGCAAAGAATCAGGTCT", - "idt": {"name": "staple2", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B1"}, "domains": [ {"helix": 0, "forward": true, "start": 10, "end": 20}, {"helix": 1, "forward": false, "start": 10, "end": 20} ] }, { + "name": "staple3", "color": "#888888", "sequence": "CGGATTGCATATAAATCAAA", - "idt": {"name": "staple3", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C1"}, "domains": [ {"helix": 0, "forward": true, "start": 20, "end": 30}, {"helix": 1, "forward": false, "start": 20, "end": 30} ] }, { + "name": "staple4", "color": "#32b86c", "sequence": "CAAAAAGATTGAGAATGACC", - "idt": {"name": "staple4", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D1"}, "domains": [ {"helix": 0, "forward": true, "start": 30, "end": 40}, {"helix": 1, "forward": false, "start": 30, "end": 40} ] }, { + "name": "staple5", "color": "#333333", "sequence": "AAGAGGAAGCTTCAGAAAAC", - "idt": {"name": "staple5", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E1"}, "domains": [ {"helix": 0, "forward": true, "start": 40, "end": 50}, {"helix": 1, "forward": false, "start": 40, "end": 50} ] }, { + "name": "staple6", "color": "#320096", "sequence": "CCGAAAGACTCTTTAAACAG", - "idt": {"name": "staple6", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F1"}, "domains": [ {"helix": 0, "forward": true, "start": 50, "end": 60}, {"helix": 1, "forward": false, "start": 50, "end": 60} ] }, { + "name": "staple7", "color": "#03b6a2", "sequence": "TCAAATATCGCCCTCAAATG", - "idt": {"name": "staple7", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G1"}, "domains": [ {"helix": 0, "forward": true, "start": 60, "end": 70}, {"helix": 1, "forward": false, "start": 60, "end": 70} ] }, { + "name": "staple8", "color": "#7300de", "sequence": "CGTTTTAATTCATTGAATCC", - "idt": {"name": "staple8", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H1"}, "domains": [ {"helix": 0, "forward": true, "start": 70, "end": 80}, {"helix": 1, "forward": false, "start": 70, "end": 80} ] }, { + "name": "staple9", "color": "#aaaa00", "sequence": "CGAGCTTCAACATAAATATT", - "idt": {"name": "staple9", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A2"}, "domains": [ {"helix": 0, "forward": true, "start": 80, "end": 90}, {"helix": 1, "forward": false, "start": 80, "end": 90} ] }, { + "name": "staple10", "color": "#b8056c", "sequence": "AGCGAACCAGGCGGAATCGT", - "idt": {"name": "staple10", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B2"}, "domains": [ {"helix": 0, "forward": true, "start": 90, "end": 100}, {"helix": 1, "forward": false, "start": 90, "end": 100} ] }, { + "name": "staple11", "color": "#007200", "sequence": "ACCGGAAGCAGTCCAATACT", - "idt": {"name": "staple11", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C2"}, "domains": [ {"helix": 0, "forward": true, "start": 100, "end": 110}, {"helix": 1, "forward": false, "start": 100, "end": 110} ] }, { + "name": "staple12", "color": "#cc0000", "sequence": "AACTCCAACAACTGGATAGC", - "idt": {"name": "staple12", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D2"}, "domains": [ {"helix": 0, "forward": true, "start": 110, "end": 120}, {"helix": 1, "forward": false, "start": 110, "end": 120} ] }, { + "name": "staple13", "color": "#f7931e", "sequence": "GGTCAGGATTAAATGTTTAG", - "idt": {"name": "staple13", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E2"}, "domains": [ {"helix": 0, "forward": true, "start": 120, "end": 130}, {"helix": 1, "forward": false, "start": 120, "end": 130} ] }, { + "name": "staple14", "color": "#f74308", "sequence": "AGAGAGTACCGGTAATAGTA", - "idt": {"name": "staple14", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F2"}, "domains": [ {"helix": 0, "forward": true, "start": 130, "end": 140}, {"helix": 1, "forward": false, "start": 130, "end": 140} ] }, { + "name": "staple15", "color": "#57bb00", "sequence": "TTTAATTGCTTGCCAGAGGG", - "idt": {"name": "staple15", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G2"}, "domains": [ {"helix": 0, "forward": true, "start": 140, "end": 150}, {"helix": 1, "forward": false, "start": 140, "end": 150} ] }, { + "name": "staple16", "color": "#888888", "sequence": "CCTTTTGATAAAAGAAGTTT", - "idt": {"name": "staple16", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H2"}, "domains": [ {"helix": 0, "forward": true, "start": 150, "end": 160}, {"helix": 1, "forward": false, "start": 150, "end": 160} ] }, { + "name": "staple17", "color": "#32b86c", "sequence": "AGAGGTCATTGGCTTTTGCA", - "idt": {"name": "staple17", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A3"}, "domains": [ {"helix": 0, "forward": true, "start": 160, "end": 170}, {"helix": 1, "forward": false, "start": 160, "end": 170} ] }, { + "name": "staple18", "color": "#333333", "sequence": "TTTGCGGATGAATAGCGAGA", - "idt": {"name": "staple18", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B3"}, "domains": [ {"helix": 0, "forward": true, "start": 170, "end": 180}, {"helix": 1, "forward": false, "start": 170, "end": 180} ] }, { + "name": "staple19", "color": "#320096", "sequence": "GCTTAGAGCTTAAAAACCAA", - "idt": {"name": "staple19", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C3"}, "domains": [ {"helix": 0, "forward": true, "start": 180, "end": 190}, {"helix": 1, "forward": false, "start": 180, "end": 190} ] }, { + "name": "staple20", "color": "#03b6a2", "sequence": "TAATTGCTGACAGACGACGA", - "idt": {"name": "staple20", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D3"}, "domains": [ {"helix": 0, "forward": true, "start": 190, "end": 200}, {"helix": 1, "forward": false, "start": 190, "end": 200} ] }, { + "name": "staple21", "color": "#7300de", "sequence": "ATATAATGCTCCTCGTTTAC", - "idt": {"name": "staple21", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E3"}, "domains": [ {"helix": 0, "forward": true, "start": 200, "end": 210}, {"helix": 1, "forward": false, "start": 200, "end": 210} ] }, { + "name": "staple22", "color": "#aaaa00", "sequence": "GTAGCTCAACCTATCATAAC", - "idt": {"name": "staple22", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F3"}, "domains": [ {"helix": 0, "forward": true, "start": 210, "end": 220}, {"helix": 1, "forward": false, "start": 210, "end": 220} ] }, { + "name": "staple23", "color": "#b8056c", "sequence": "ATGTTTTAAAAAGAGCAACA", - "idt": {"name": "staple23", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G3"}, "domains": [ {"helix": 0, "forward": true, "start": 220, "end": 230}, {"helix": 1, "forward": false, "start": 220, "end": 230} ] }, { + "name": "staple24", "color": "#007200", "sequence": "TATGCAACTAGAGGCATAGT", - "idt": {"name": "staple24", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H3"}, "domains": [ {"helix": 0, "forward": true, "start": 230, "end": 240}, {"helix": 1, "forward": false, "start": 230, "end": 240} ] }, { + "name": "staple25", "color": "#cc0000", "sequence": "AAGTACGGTGAAGGAATTAC", - "idt": {"name": "staple25", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A4"}, "domains": [ {"helix": 0, "forward": true, "start": 240, "end": 250}, {"helix": 1, "forward": false, "start": 240, "end": 250} ] }, { + "name": "staple26", "color": "#f7931e", "sequence": "TCTGGAAGTTATAACGCCAA", - "idt": {"name": "staple26", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B4"}, "domains": [ {"helix": 0, "forward": true, "start": 250, "end": 260}, {"helix": 1, "forward": false, "start": 250, "end": 260} ] }, { + "name": "staple27", "color": "#f74308", "sequence": "TCATTCCATAATGCAGATAC", - "idt": {"name": "staple27", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C4"}, "domains": [ {"helix": 0, "forward": true, "start": 260, "end": 270}, {"helix": 1, "forward": false, "start": 260, "end": 270} ] }, { + "name": "staple28", "color": "#57bb00", "sequence": "TAACAGTTGACATTCAACTA", - "idt": {"name": "staple28", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D4"}, "domains": [ {"helix": 0, "forward": true, "start": 270, "end": 280}, {"helix": 1, "forward": false, "start": 270, "end": 280} ] }, { + "name": "staple29", "color": "#888888", "sequence": "TTCCCAATTCAGGAATACCA", - "idt": {"name": "staple29", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E4"}, "domains": [ {"helix": 0, "forward": true, "start": 280, "end": 290}, {"helix": 1, "forward": false, "start": 280, "end": 290} ] }, { + "name": "staple30", "color": "#32b86c", "sequence": "TGCGAACGAGGTTGAGATTT", - "idt": {"name": "staple30", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F4"}, "domains": [ {"helix": 0, "forward": true, "start": 290, "end": 300}, {"helix": 1, "forward": false, "start": 290, "end": 300} ] }, { + "name": "staple31", "color": "#333333", "sequence": "TAGATTTAGTAGATTCATCA", - "idt": {"name": "staple31", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G4"}, "domains": [ {"helix": 0, "forward": true, "start": 300, "end": 310}, {"helix": 1, "forward": false, "start": 300, "end": 310} ] }, { + "name": "staple32", "color": "#320096", "sequence": "TTGACCATTAACAGGTAGAA", - "idt": {"name": "staple32", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H4"}, "domains": [ {"helix": 0, "forward": true, "start": 310, "end": 320}, {"helix": 1, "forward": false, "start": 310, "end": 320} ] }, { + "name": "staple33", "color": "#03b6a2", "sequence": "GATACATTTCCAACATTATT", - "idt": {"name": "staple33", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A5"}, "domains": [ {"helix": 0, "forward": true, "start": 320, "end": 330}, {"helix": 1, "forward": false, "start": 320, "end": 330} ] }, { + "name": "staple34", "color": "#7300de", "sequence": "GCAAATGGTCACTAACGGAA", - "idt": {"name": "staple34", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B5"}, "domains": [ {"helix": 0, "forward": true, "start": 330, "end": 340}, {"helix": 1, "forward": false, "start": 330, "end": 340} ] }, { + "name": "staple35", "color": "#aaaa00", "sequence": "AATAACCTGTAATAAAACGA", - "idt": {"name": "staple35", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C5"}, "domains": [ {"helix": 0, "forward": true, "start": 340, "end": 350}, {"helix": 1, "forward": false, "start": 340, "end": 350} ] }, { + "name": "staple36", "color": "#b8056c", "sequence": "TTAGCTATATAATCTACGTT", - "idt": {"name": "staple36", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D5"}, "domains": [ {"helix": 0, "forward": true, "start": 350, "end": 360}, {"helix": 1, "forward": false, "start": 350, "end": 360} ] }, { + "name": "staple37", "color": "#007200", "sequence": "TTTCATTTGGTGGGAAGAAA", - "idt": {"name": "staple37", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E5"}, "domains": [ {"helix": 0, "forward": true, "start": 360, "end": 370}, {"helix": 1, "forward": false, "start": 360, "end": 370} ] }, { + "name": "staple38", "color": "#cc0000", "sequence": "GGCGCGAGCTGTCAGGACGT", - "idt": {"name": "staple38", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F5"}, "domains": [ {"helix": 0, "forward": true, "start": 370, "end": 380}, {"helix": 1, "forward": false, "start": 370, "end": 380} ] }, { + "name": "staple39", "color": "#f7931e", "sequence": "GAAAAGGTGGCATTATACCA", - "idt": {"name": "staple39", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G5"}, "domains": [ {"helix": 0, "forward": true, "start": 380, "end": 390}, {"helix": 1, "forward": false, "start": 380, "end": 390} ] }, { + "name": "staple40", "color": "#f74308", "sequence": "CATCAATTCTAGAACTGGCT", - "idt": {"name": "staple40", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H5"}, "domains": [ {"helix": 0, "forward": true, "start": 390, "end": 400}, {"helix": 1, "forward": false, "start": 390, "end": 400} ] }, { + "name": "staple41", "color": "#57bb00", "sequence": "ACTAATAGTATGCGATTTTA", - "idt": {"name": "staple41", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A6"}, "domains": [ {"helix": 0, "forward": true, "start": 400, "end": 410}, {"helix": 1, "forward": false, "start": 400, "end": 410} ] }, { + "name": "staple42", "color": "#888888", "sequence": "GTAGCATTAAAATTACCTTA", - "idt": {"name": "staple42", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B6"}, "domains": [ {"helix": 0, "forward": true, "start": 410, "end": 420}, {"helix": 1, "forward": false, "start": 410, "end": 420} ] }, { + "name": "staple43", "color": "#32b86c", "sequence": "CATCCAATAAAATCATTGTG", - "idt": {"name": "staple43", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C6"}, "domains": [ {"helix": 0, "forward": true, "start": 420, "end": 430}, {"helix": 1, "forward": false, "start": 420, "end": 430} ] }, { + "name": "staple44", "color": "#333333", "sequence": "ATCATACAGGTTTCAACTTT", - "idt": {"name": "staple44", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D6"}, "domains": [ {"helix": 0, "forward": true, "start": 430, "end": 440}, {"helix": 1, "forward": false, "start": 430, "end": 440} ] }, { + "name": "staple45", "color": "#320096", "sequence": "CAAGGCAAAGGATGGTTTAA", - "idt": {"name": "staple45", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E6"}, "domains": [ {"helix": 0, "forward": true, "start": 440, "end": 450}, {"helix": 1, "forward": false, "start": 440, "end": 450} ] }, { + "name": "staple46", "color": "#03b6a2", "sequence": "AATTAGCAAATTGGGCTTGA", - "idt": {"name": "staple46", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F6"}, "domains": [ {"helix": 0, "forward": true, "start": 450, "end": 460}, {"helix": 1, "forward": false, "start": 450, "end": 460} ] }, { + "name": "staple47", "color": "#7300de", "sequence": "ATTAAGCAATGAGTAGTAAA", - "idt": {"name": "staple47", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G6"}, "domains": [ {"helix": 0, "forward": true, "start": 460, "end": 470}, {"helix": 1, "forward": false, "start": 460, "end": 470} ] }, { + "name": "staple48", "color": "#aaaa00", "sequence": "AAAGCCTCAGACACCAGAAC", - "idt": {"name": "staple48", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H6"}, "domains": [ {"helix": 0, "forward": true, "start": 470, "end": 480}, {"helix": 1, "forward": false, "start": 470, "end": 480} ] }, { + "name": "staple49", "color": "#b8056c", "sequence": "AGCATAAAGCCTGACGAGAA", - "idt": {"name": "staple49", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A7"}, "domains": [ {"helix": 0, "forward": true, "start": 480, "end": 490}, {"helix": 1, "forward": false, "start": 480, "end": 490} ] }, { + "name": "staple50", "color": "#007200", "sequence": "TAAATCGGTTAAGGCTTGCC", - "idt": {"name": "staple50", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B7"}, "domains": [ {"helix": 0, "forward": true, "start": 490, "end": 500}, {"helix": 1, "forward": false, "start": 490, "end": 500} ] }, { + "name": "staple51", "color": "#cc0000", "sequence": "GTACCAAAAATTCAGTGAAT", - "idt": {"name": "staple51", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C7"}, "domains": [ {"helix": 0, "forward": true, "start": 500, "end": 510}, {"helix": 1, "forward": false, "start": 500, "end": 510} ] }, { + "name": "staple52", "color": "#f7931e", "sequence": "CATTATGACCAAGCTGCTCA", - "idt": {"name": "staple52", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D7"}, "domains": [ {"helix": 0, "forward": true, "start": 510, "end": 520}, {"helix": 1, "forward": false, "start": 510, "end": 520} ] }, { + "name": "staple53", "color": "#f74308", "sequence": "CTGTAATACTCAACGTAACA", - "idt": {"name": "staple53", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E7"}, "domains": [ {"helix": 0, "forward": true, "start": 520, "end": 530}, {"helix": 1, "forward": false, "start": 520, "end": 530} ] }, { + "name": "staple54", "color": "#57bb00", "sequence": "TTTGCGGGAGTTACCCAAAT", - "idt": {"name": "staple54", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F7"}, "domains": [ {"helix": 0, "forward": true, "start": 530, "end": 540}, {"helix": 1, "forward": false, "start": 530, "end": 540} ] }, { + "name": "staple55", "color": "#888888", "sequence": "AAGCCTTTATCGGATATTCA", - "idt": {"name": "staple55", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G7"}, "domains": [ {"helix": 0, "forward": true, "start": 540, "end": 550}, {"helix": 1, "forward": false, "start": 540, "end": 550} ] }, { + "name": "staple56", "color": "#32b86c", "sequence": "TTCAACGCAATGACAAGAAC", - "idt": {"name": "staple56", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H7"}, "domains": [ {"helix": 0, "forward": true, "start": 550, "end": 560}, {"helix": 1, "forward": false, "start": 550, "end": 560} ] }, { + "name": "staple57", "color": "#333333", "sequence": "GGATAAAAATAGAGTAATCT", - "idt": {"name": "staple57", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A8"}, "domains": [ {"helix": 0, "forward": true, "start": 560, "end": 570}, {"helix": 1, "forward": false, "start": 560, "end": 570} ] }, { + "name": "staple58", "color": "#320096", "sequence": "TTTTAGAACCACCTTCATCA", - "idt": {"name": "staple58", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B8"}, "domains": [ {"helix": 0, "forward": true, "start": 570, "end": 580}, {"helix": 1, "forward": false, "start": 570, "end": 580} ] }, { + "name": "staple59", "color": "#03b6a2", "sequence": "CTCATATATTAGGCTGGCTG", - "idt": {"name": "staple59", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C8"}, "domains": [ {"helix": 0, "forward": true, "start": 580, "end": 590}, {"helix": 1, "forward": false, "start": 580, "end": 590} ] }, { + "name": "staple60", "color": "#7300de", "sequence": "TTAAATGCAACCAGGCGCAT", - "idt": {"name": "staple60", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D8"}, "domains": [ {"helix": 0, "forward": true, "start": 590, "end": 600}, {"helix": 1, "forward": false, "start": 590, "end": 600} ] }, { + "name": "staple61", "color": "#aaaa00", "sequence": "TGCCTGAGTAGGTGTACAGA", - "idt": {"name": "staple61", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E8"}, "domains": [ {"helix": 0, "forward": true, "start": 600, "end": 610}, {"helix": 1, "forward": false, "start": 600, "end": 610} ] }, { + "name": "staple62", "color": "#b8056c", "sequence": "ATGTGTAGGTACAGATGAAC", - "idt": {"name": "staple62", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F8"}, "domains": [ {"helix": 0, "forward": true, "start": 610, "end": 620}, {"helix": 1, "forward": false, "start": 610, "end": 620} ] }, { + "name": "staple63", "color": "#007200", "sequence": "AAAGATTCAATTGAAAGAGG", - "idt": {"name": "staple63", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G8"}, "domains": [ {"helix": 0, "forward": true, "start": 620, "end": 630}, {"helix": 1, "forward": false, "start": 620, "end": 630} ] }, { + "name": "staple64", "color": "#cc0000", "sequence": "AAGGGTGAGACTGACCAACT", - "idt": {"name": "staple64", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H8"}, "domains": [ {"helix": 0, "forward": true, "start": 630, "end": 640}, {"helix": 1, "forward": false, "start": 630, "end": 640} ] }, { + "name": "staple65", "color": "#f7931e", "sequence": "AAGGCCGGAGGGGAACCGAA", - "idt": {"name": "staple65", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A9"}, "domains": [ {"helix": 0, "forward": true, "start": 640, "end": 650}, {"helix": 1, "forward": false, "start": 640, "end": 650} ] }, { + "name": "staple66", "color": "#f74308", "sequence": "ACAGTCAAATTCAATCATAA", - "idt": {"name": "staple66", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B9"}, "domains": [ {"helix": 0, "forward": true, "start": 650, "end": 660}, {"helix": 1, "forward": false, "start": 650, "end": 660} ] }, { + "name": "staple67", "color": "#57bb00", "sequence": "CACCATCAATGCGCAGACGG", - "idt": {"name": "staple67", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C9"}, "domains": [ {"helix": 0, "forward": true, "start": 660, "end": 670}, {"helix": 1, "forward": false, "start": 660, "end": 670} ] }, { + "name": "staple68", "color": "#888888", "sequence": "ATGATATTCACCGGAACGAG", - "idt": {"name": "staple68", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D9"}, "domains": [ {"helix": 0, "forward": true, "start": 670, "end": 680}, {"helix": 1, "forward": false, "start": 670, "end": 680} ] }, { + "name": "staple69", "color": "#32b86c", "sequence": "ACCGTTCTAGTGTTACTTAG", - "idt": {"name": "staple69", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E9"}, "domains": [ {"helix": 0, "forward": true, "start": 680, "end": 690}, {"helix": 1, "forward": false, "start": 680, "end": 690} ] }, { + "name": "staple70", "color": "#333333", "sequence": "CTGATAAATTACCTGCTCCA", - "idt": {"name": "staple70", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F9"}, "domains": [ {"helix": 0, "forward": true, "start": 690, "end": 700}, {"helix": 1, "forward": false, "start": 690, "end": 700} ] }, { + "name": "staple71", "color": "#320096", "sequence": "AATGCCGGAGGAAATCCGCG", - "idt": {"name": "staple71", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G9"}, "domains": [ {"helix": 0, "forward": true, "start": 700, "end": 710}, {"helix": 1, "forward": false, "start": 700, "end": 710} ] }, { + "name": "staple72", "color": "#03b6a2", "sequence": "AGGGTAGCTAAAATTGTGTC", - "idt": {"name": "staple72", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H9"}, "domains": [ {"helix": 0, "forward": true, "start": 710, "end": 720}, {"helix": 1, "forward": false, "start": 710, "end": 720} ] }, { + "name": "staple73", "color": "#7300de", "sequence": "TTTTTGAGAGATCGCCTGAT", - "idt": {"name": "staple73", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A10"}, "domains": [ {"helix": 0, "forward": true, "start": 720, "end": 730}, {"helix": 1, "forward": false, "start": 720, "end": 730} ] }, { + "name": "staple74", "color": "#aaaa00", "sequence": "ATCTACAAAGGATTTGTATC", - "idt": {"name": "staple74", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B10"}, "domains": [ {"helix": 0, "forward": true, "start": 730, "end": 740}, {"helix": 1, "forward": false, "start": 730, "end": 740} ] }, { + "name": "staple75", "color": "#b8056c", "sequence": "GCTATCAGGTGTACAACGGA", - "idt": {"name": "staple75", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C10"}, "domains": [ {"helix": 0, "forward": true, "start": 740, "end": 750}, {"helix": 1, "forward": false, "start": 740, "end": 750} ] }, { + "name": "staple76", "color": "#007200", "sequence": "CATTGCCTGAGCGAAACAAA", - "idt": {"name": "staple76", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D10"}, "domains": [ {"helix": 0, "forward": true, "start": 750, "end": 760}, {"helix": 1, "forward": false, "start": 750, "end": 760} ] }, { + "name": "staple77", "color": "#cc0000", "sequence": "GAGTCTGGAGTATACCAAGC", - "idt": {"name": "staple77", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E10"}, "domains": [ {"helix": 0, "forward": true, "start": 760, "end": 770}, {"helix": 1, "forward": false, "start": 760, "end": 770} ] }, { + "name": "staple78", "color": "#f7931e", "sequence": "CAAACAAGAGCCCCAGCGAT", - "idt": {"name": "staple78", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F10"}, "domains": [ {"helix": 0, "forward": true, "start": 770, "end": 780}, {"helix": 1, "forward": false, "start": 770, "end": 780} ] }, { + "name": "staple79", "color": "#f74308", "sequence": "AATCGATGAACATCTTTGAC", - "idt": {"name": "staple79", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G10"}, "domains": [ {"helix": 0, "forward": true, "start": 780, "end": 790}, {"helix": 1, "forward": false, "start": 780, "end": 790} ] }, { + "name": "staple80", "color": "#57bb00", "sequence": "CGGTAATCGTCTAAAACACT", - "idt": {"name": "staple80", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H10"}, "domains": [ {"helix": 0, "forward": true, "start": 790, "end": 800}, {"helix": 1, "forward": false, "start": 790, "end": 800} ] }, { + "name": "staple81", "color": "#888888", "sequence": "AAAACTAGCAAAAGAATACA", - "idt": {"name": "staple81", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A11"}, "domains": [ {"helix": 0, "forward": true, "start": 800, "end": 810}, {"helix": 1, "forward": false, "start": 800, "end": 810} ] }, { + "name": "staple82", "color": "#32b86c", "sequence": "TGTCAATCATGAAAGAGGCA", - "idt": {"name": "staple82", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B11"}, "domains": [ {"helix": 0, "forward": true, "start": 810, "end": 820}, {"helix": 1, "forward": false, "start": 810, "end": 820} ] }, { + "name": "staple83", "color": "#333333", "sequence": "ATGTACCCCGAACCTAAAAC", - "idt": {"name": "staple83", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C11"}, "domains": [ {"helix": 0, "forward": true, "start": 820, "end": 830}, {"helix": 1, "forward": false, "start": 820, "end": 830} ] }, { + "name": "staple84", "color": "#320096", "sequence": "GTTGATAATCCGAAGGCACC", - "idt": {"name": "staple84", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D11"}, "domains": [ {"helix": 0, "forward": true, "start": 830, "end": 840}, {"helix": 1, "forward": false, "start": 830, "end": 840} ] }, { + "name": "staple85", "color": "#03b6a2", "sequence": "AGAAAAGCCCAATGCCACTA", - "idt": {"name": "staple85", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E11"}, "domains": [ {"helix": 0, "forward": true, "start": 840, "end": 850}, {"helix": 1, "forward": false, "start": 840, "end": 850} ] }, { + "name": "staple86", "color": "#7300de", "sequence": "CAAAAACAGGTAAAATACGT", - "idt": {"name": "staple86", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F11"}, "domains": [ {"helix": 0, "forward": true, "start": 850, "end": 860}, {"helix": 1, "forward": false, "start": 850, "end": 860} ] }, { + "name": "staple87", "color": "#aaaa00", "sequence": "AAGATTGTATATTAAACGGG", - "idt": {"name": "staple87", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G11"}, "domains": [ {"helix": 0, "forward": true, "start": 860, "end": 870}, {"helix": 1, "forward": false, "start": 860, "end": 870} ] }, { + "name": "staple88", "color": "#b8056c", "sequence": "AAGCAAATATGGAAGTTTCC", - "idt": {"name": "staple88", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H11"}, "domains": [ {"helix": 0, "forward": true, "start": 870, "end": 880}, {"helix": 1, "forward": false, "start": 870, "end": 880} ] }, { + "name": "staple89", "color": "#007200", "sequence": "TTAAATTGTATTTTTCATGA", - "idt": {"name": "staple89", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A12"}, "domains": [ {"helix": 0, "forward": true, "start": 880, "end": 890}, {"helix": 1, "forward": false, "start": 880, "end": 890} ] }, { + "name": "staple90", "color": "#cc0000", "sequence": "AACGTTAATAGACTAAAGAC", - "idt": {"name": "staple90", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B12"}, "domains": [ {"helix": 0, "forward": true, "start": 890, "end": 900}, {"helix": 1, "forward": false, "start": 890, "end": 900} ] }, { + "name": "staple91", "color": "#f7931e", "sequence": "TTTTGTTAAAAGGCTTTGAG", - "idt": {"name": "staple91", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C12"}, "domains": [ {"helix": 0, "forward": true, "start": 900, "end": 910}, {"helix": 1, "forward": false, "start": 900, "end": 910} ] }, { + "name": "staple92", "color": "#f74308", "sequence": "ATTCGCATTAACGGCTACAG", - "idt": {"name": "staple92", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D12"}, "domains": [ {"helix": 0, "forward": true, "start": 910, "end": 920}, {"helix": 1, "forward": false, "start": 910, "end": 920} ] }, { + "name": "staple93", "color": "#57bb00", "sequence": "AATTTTTGTTGAGGGTAGCA", - "idt": {"name": "staple93", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E12"}, "domains": [ {"helix": 0, "forward": true, "start": 920, "end": 930}, {"helix": 1, "forward": false, "start": 920, "end": 930} ] }, { + "name": "staple94", "color": "#888888", "sequence": "AAATCAGCTCGCATCGGAAC", - "idt": {"name": "staple94", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F12"}, "domains": [ {"helix": 0, "forward": true, "start": 930, "end": 940}, {"helix": 1, "forward": false, "start": 930, "end": 940} ] }, { + "name": "staple95", "color": "#32b86c", "sequence": "ATTTTTTAACGCGAAAGACA", - "idt": {"name": "staple95", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G12"}, "domains": [ {"helix": 0, "forward": true, "start": 940, "end": 950}, {"helix": 1, "forward": false, "start": 940, "end": 950} ] }, { + "name": "staple96", "color": "#333333", "sequence": "CAATAGGAACACCCTCAGCA", - "idt": {"name": "staple96", "scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H12"}, "domains": [ {"helix": 0, "forward": true, "start": 950, "end": 960}, {"helix": 1, "forward": false, "start": 950, "end": 960} ] }, { + "name": "staple97", "color": "#320096", "sequence": "GCCATCAAAACGGGATCGTC", - "idt": {"name": "staple97", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A1"}, "domains": [ {"helix": 0, "forward": true, "start": 960, "end": 970}, {"helix": 1, "forward": false, "start": 960, "end": 970} ] }, { + "name": "staple98", "color": "#03b6a2", "sequence": "ATAATTCGCGGCCGCTTTTG", - "idt": {"name": "staple98", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B1"}, "domains": [ {"helix": 0, "forward": true, "start": 970, "end": 980}, {"helix": 1, "forward": false, "start": 970, "end": 980} ] }, { + "name": "staple99", "color": "#7300de", "sequence": "TCTGGCCTTCGGAGTTAAAG", - "idt": {"name": "staple99", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C1"}, "domains": [ {"helix": 0, "forward": true, "start": 980, "end": 990}, {"helix": 1, "forward": false, "start": 980, "end": 990} ] }, { + "name": "staple100", "color": "#aaaa00", "sequence": "CTGTAGCCAGAGGCTTGCAG", - "idt": {"name": "staple100", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D1"}, "domains": [ {"helix": 0, "forward": true, "start": 990, "end": 1000}, {"helix": 1, "forward": false, "start": 990, "end": 1000} ] }, { + "name": "staple101", "color": "#b8056c", "sequence": "CTTTCATCAATCGGTCGCTG", - "idt": {"name": "staple101", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E1"}, "domains": [ {"helix": 0, "forward": true, "start": 1000, "end": 1010}, {"helix": 1, "forward": false, "start": 1000, "end": 1010} ] }, { + "name": "staple102", "color": "#007200", "sequence": "CATTAAATGTACCGATATAT", - "idt": {"name": "staple102", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F1"}, "domains": [ {"helix": 0, "forward": true, "start": 1010, "end": 1020}, {"helix": 1, "forward": false, "start": 1010, "end": 1020} ] }, { + "name": "staple103", "color": "#cc0000", "sequence": "GAGCGAGTAACCCACGCATA", - "idt": {"name": "staple103", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G1"}, "domains": [ {"helix": 0, "forward": true, "start": 1020, "end": 1030}, {"helix": 1, "forward": false, "start": 1020, "end": 1030} ] }, { + "name": "staple104", "color": "#f7931e", "sequence": "CAACCCGTCGACAACCATCG", - "idt": {"name": "staple104", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H1"}, "domains": [ {"helix": 0, "forward": true, "start": 1030, "end": 1040}, {"helix": 1, "forward": false, "start": 1030, "end": 1040} ] }, { + "name": "staple105", "color": "#f74308", "sequence": "GATTCTCCGTGACAATGACA", - "idt": {"name": "staple105", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A2"}, "domains": [ {"helix": 0, "forward": true, "start": 1040, "end": 1050}, {"helix": 1, "forward": false, "start": 1040, "end": 1050} ] }, { + "name": "staple106", "color": "#57bb00", "sequence": "GGGAACAAACTAGTTGCGCC", - "idt": {"name": "staple106", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B2"}, "domains": [ {"helix": 0, "forward": true, "start": 1050, "end": 1060}, {"helix": 1, "forward": false, "start": 1050, "end": 1060} ] }, { + "name": "staple107", "color": "#888888", "sequence": "GGCGGATTGATTGATACCGA", - "idt": {"name": "staple107", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C2"}, "domains": [ {"helix": 0, "forward": true, "start": 1060, "end": 1070}, {"helix": 1, "forward": false, "start": 1060, "end": 1070} ] }, { + "name": "staple108", "color": "#32b86c", "sequence": "CCGTAATGGGCTTAAACAGC", - "idt": {"name": "staple108", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D2"}, "domains": [ {"helix": 0, "forward": true, "start": 1070, "end": 1080}, {"helix": 1, "forward": false, "start": 1070, "end": 1080} ] }, { + "name": "staple109", "color": "#333333", "sequence": "ATAGGTCACGAGGTGAATTT", - "idt": {"name": "staple109", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E2"}, "domains": [ {"helix": 0, "forward": true, "start": 1080, "end": 1090}, {"helix": 1, "forward": false, "start": 1080, "end": 1090} ] }, { + "name": "staple110", "color": "#320096", "sequence": "TTGGTGTAGACTTGCTTTCG", - "idt": {"name": "staple110", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F2"}, "domains": [ {"helix": 0, "forward": true, "start": 1090, "end": 1100}, {"helix": 1, "forward": false, "start": 1090, "end": 1100} ] }, { + "name": "staple111", "color": "#03b6a2", "sequence": "TGGGCGCATCGGTTTATCAG", - "idt": {"name": "staple111", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G2"}, "domains": [ {"helix": 0, "forward": true, "start": 1100, "end": 1110}, {"helix": 1, "forward": false, "start": 1100, "end": 1110} ] }, { + "name": "staple112", "color": "#7300de", "sequence": "GTAACCGTGCTAATTGTATC", - "idt": {"name": "staple112", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H2"}, "domains": [ {"helix": 0, "forward": true, "start": 1110, "end": 1120}, {"helix": 1, "forward": false, "start": 1110, "end": 1120} ] }, { + "name": "staple113", "color": "#aaaa00", "sequence": "ATCTGCCAGTAAGGAGCCTT", - "idt": {"name": "staple113", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A3"}, "domains": [ {"helix": 0, "forward": true, "start": 1120, "end": 1130}, {"helix": 1, "forward": false, "start": 1120, "end": 1130} ] }, { + "name": "staple114", "color": "#b8056c", "sequence": "TTGAGGGGACAAGGCTCCAA", - "idt": {"name": "staple114", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B3"}, "domains": [ {"helix": 0, "forward": true, "start": 1130, "end": 1140}, {"helix": 1, "forward": false, "start": 1130, "end": 1140} ] }, { + "name": "staple115", "color": "#007200", "sequence": "GACGACAGTACTCCAAAAAA", - "idt": {"name": "staple115", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C3"}, "domains": [ {"helix": 0, "forward": true, "start": 1140, "end": 1150}, {"helix": 1, "forward": false, "start": 1140, "end": 1150} ] }, { + "name": "staple116", "color": "#cc0000", "sequence": "TCGGCCTCAGCGTTGAAAAT", - "idt": {"name": "staple116", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D3"}, "domains": [ {"helix": 0, "forward": true, "start": 1150, "end": 1160}, {"helix": 1, "forward": false, "start": 1150, "end": 1160} ] }, { + "name": "staple117", "color": "#f7931e", "sequence": "GAAGATCGCAAATTTTTTCA", - "idt": {"name": "staple117", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E3"}, "domains": [ {"helix": 0, "forward": true, "start": 1160, "end": 1170}, {"helix": 1, "forward": false, "start": 1160, "end": 1170} ] }, { + "name": "staple118", "color": "#f74308", "sequence": "CTCCAGCCAGTGCGAATAAT", - "idt": {"name": "staple118", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F3"}, "domains": [ {"helix": 0, "forward": true, "start": 1170, "end": 1180}, {"helix": 1, "forward": false, "start": 1170, "end": 1180} ] }, { + "name": "staple119", "color": "#57bb00", "sequence": "CTTTCCGGCACTAAAGGAAT", - "idt": {"name": "staple119", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G3"}, "domains": [ {"helix": 0, "forward": true, "start": 1180, "end": 1190}, {"helix": 1, "forward": false, "start": 1180, "end": 1190} ] }, { + "name": "staple120", "color": "#888888", "sequence": "CCGCTTCTGGAAAGGAACAA", - "idt": {"name": "staple120", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H3"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H3"}, "domains": [ {"helix": 0, "forward": true, "start": 1190, "end": 1200}, {"helix": 1, "forward": false, "start": 1190, "end": 1200} ] }, { + "name": "staple121", "color": "#32b86c", "sequence": "TGCCGGAAACGTGAGAATAG", - "idt": {"name": "staple121", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A4"}, "domains": [ {"helix": 0, "forward": true, "start": 1200, "end": 1210}, {"helix": 1, "forward": false, "start": 1200, "end": 1210} ] }, { + "name": "staple122", "color": "#333333", "sequence": "CAGGCAAAGCTTTCAGCGGA", - "idt": {"name": "staple122", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B4"}, "domains": [ {"helix": 0, "forward": true, "start": 1210, "end": 1220}, {"helix": 1, "forward": false, "start": 1210, "end": 1220} ] }, { + "name": "staple123", "color": "#320096", "sequence": "GCCATTCGCCCTTTCAACAG", - "idt": {"name": "staple123", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C4"}, "domains": [ {"helix": 0, "forward": true, "start": 1220, "end": 1230}, {"helix": 1, "forward": false, "start": 1220, "end": 1230} ] }, { + "name": "staple124", "color": "#03b6a2", "sequence": "ATTCAGGCTGTGCTAAACAA", - "idt": {"name": "staple124", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D4"}, "domains": [ {"helix": 0, "forward": true, "start": 1230, "end": 1240}, {"helix": 1, "forward": false, "start": 1230, "end": 1240} ] }, { + "name": "staple125", "color": "#7300de", "sequence": "CGCAACTGTTTATGGGATTT", - "idt": {"name": "staple125", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E4"}, "domains": [ {"helix": 0, "forward": true, "start": 1240, "end": 1250}, {"helix": 1, "forward": false, "start": 1240, "end": 1250} ] }, { + "name": "staple126", "color": "#aaaa00", "sequence": "GGGAAGGGCGGAATTTTCTG", - "idt": {"name": "staple126", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F4"}, "domains": [ {"helix": 0, "forward": true, "start": 1250, "end": 1260}, {"helix": 1, "forward": false, "start": 1250, "end": 1260} ] }, { + "name": "staple127", "color": "#b8056c", "sequence": "ATCGGTGCGGGTTAGTAAAT", - "idt": {"name": "staple127", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G4"}, "domains": [ {"helix": 0, "forward": true, "start": 1260, "end": 1270}, {"helix": 1, "forward": false, "start": 1260, "end": 1270} ] }, { + "name": "staple128", "color": "#007200", "sequence": "GCCTCTTCGCCTTTCCAGAC", - "idt": {"name": "staple128", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H4"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H4"}, "domains": [ {"helix": 0, "forward": true, "start": 1270, "end": 1280}, {"helix": 1, "forward": false, "start": 1270, "end": 1280} ] }, { + "name": "staple129", "color": "#cc0000", "sequence": "TATTACGCCAGTTTTGTCGT", - "idt": {"name": "staple129", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A5"}, "domains": [ {"helix": 0, "forward": true, "start": 1280, "end": 1290}, {"helix": 1, "forward": false, "start": 1280, "end": 1290} ] }, { + "name": "staple130", "color": "#f7931e", "sequence": "GCTGGCGAAAACGATCTAAA", - "idt": {"name": "staple130", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B5"}, "domains": [ {"helix": 0, "forward": true, "start": 1290, "end": 1300}, {"helix": 1, "forward": false, "start": 1290, "end": 1300} ] }, { + "name": "staple131", "color": "#f74308", "sequence": "GGGGGATGTGAGTTAGCGTA", - "idt": {"name": "staple131", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C5"}, "domains": [ {"helix": 0, "forward": true, "start": 1300, "end": 1310}, {"helix": 1, "forward": false, "start": 1300, "end": 1310} ] }, { + "name": "staple132", "color": "#57bb00", "sequence": "CTGCAAGGCGCAGCCCTCAT", - "idt": {"name": "staple132", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D5"}, "domains": [ {"helix": 0, "forward": true, "start": 1310, "end": 1320}, {"helix": 1, "forward": false, "start": 1310, "end": 1320} ] }, { + "name": "staple133", "color": "#888888", "sequence": "ATTAAGTTGGATTCCACAGA", - "idt": {"name": "staple133", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E5"}, "domains": [ {"helix": 0, "forward": true, "start": 1320, "end": 1330}, {"helix": 1, "forward": false, "start": 1320, "end": 1330} ] }, { + "name": "staple134", "color": "#32b86c", "sequence": "GTAACGCCAGCGCCTGTAGC", - "idt": {"name": "staple134", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F5"}, "domains": [ {"helix": 0, "forward": true, "start": 1330, "end": 1340}, {"helix": 1, "forward": false, "start": 1330, "end": 1340} ] }, { + "name": "staple135", "color": "#333333", "sequence": "GGTTTTCCCACAAACTACAA", - "idt": {"name": "staple135", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G5"}, "domains": [ {"helix": 0, "forward": true, "start": 1340, "end": 1350}, {"helix": 1, "forward": false, "start": 1340, "end": 1350} ] }, { + "name": "staple136", "color": "#320096", "sequence": "GTCACGACGTGTCACCAGTA", - "idt": {"name": "staple136", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H5"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H5"}, "domains": [ {"helix": 0, "forward": true, "start": 1350, "end": 1360}, {"helix": 1, "forward": false, "start": 1350, "end": 1360} ] }, { + "name": "staple137", "color": "#03b6a2", "sequence": "TGTAAAACGAACTGAGTTTC", - "idt": {"name": "staple137", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A6"}, "domains": [ {"helix": 0, "forward": true, "start": 1360, "end": 1370}, {"helix": 1, "forward": false, "start": 1360, "end": 1370} ] }, { + "name": "staple138", "color": "#7300de", "sequence": "CGGCCAGTGCGTACCGTAAC", - "idt": {"name": "staple138", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B6"}, "domains": [ {"helix": 0, "forward": true, "start": 1370, "end": 1380}, {"helix": 1, "forward": false, "start": 1370, "end": 1380} ] }, { + "name": "staple139", "color": "#aaaa00", "sequence": "CAAGCTTGCAAGGAACCCAT", - "idt": {"name": "staple139", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C6"}, "domains": [ {"helix": 0, "forward": true, "start": 1380, "end": 1390}, {"helix": 1, "forward": false, "start": 1380, "end": 1390} ] }, { + "name": "staple140", "color": "#b8056c", "sequence": "TGCCTGCAGGCAAGCCCAAT", - "idt": {"name": "staple140", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D6"}, "domains": [ {"helix": 0, "forward": true, "start": 1390, "end": 1400}, {"helix": 1, "forward": false, "start": 1390, "end": 1400} ] }, { + "name": "staple141", "color": "#007200", "sequence": "TCGACTCTAGTCAGGGATAG", - "idt": {"name": "staple141", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E6"}, "domains": [ {"helix": 0, "forward": true, "start": 1400, "end": 1410}, {"helix": 1, "forward": false, "start": 1400, "end": 1410} ] }, { + "name": "staple142", "color": "#cc0000", "sequence": "AGGATCCCCGACCCTCATTT", - "idt": {"name": "staple142", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F6"}, "domains": [ {"helix": 0, "forward": true, "start": 1410, "end": 1420}, {"helix": 1, "forward": false, "start": 1410, "end": 1420} ] }, { + "name": "staple143", "color": "#f7931e", "sequence": "GGTACCGAGCCAGAGCCACC", - "idt": {"name": "staple143", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G6"}, "domains": [ {"helix": 0, "forward": true, "start": 1420, "end": 1430}, {"helix": 1, "forward": false, "start": 1420, "end": 1430} ] }, { + "name": "staple144", "color": "#f74308", "sequence": "TCGAATTCGTCCGCCACCCT", - "idt": {"name": "staple144", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H6"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H6"}, "domains": [ {"helix": 0, "forward": true, "start": 1430, "end": 1440}, {"helix": 1, "forward": false, "start": 1430, "end": 1440} ] }, { + "name": "staple145", "color": "#57bb00", "sequence": "AATCATGGTCACCCTCAGAA", - "idt": {"name": "staple145", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A7"}, "domains": [ {"helix": 0, "forward": true, "start": 1440, "end": 1450}, {"helix": 1, "forward": false, "start": 1440, "end": 1450} ] }, { + "name": "staple146", "color": "#888888", "sequence": "ATAGCTGTTTCAGAACCGCC", - "idt": {"name": "staple146", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B7"}, "domains": [ {"helix": 0, "forward": true, "start": 1450, "end": 1460}, {"helix": 1, "forward": false, "start": 1450, "end": 1460} ] }, { + "name": "staple147", "color": "#32b86c", "sequence": "CCTGTGTGAACCGCCACCCT", - "idt": {"name": "staple147", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C7"}, "domains": [ {"helix": 0, "forward": true, "start": 1460, "end": 1470}, {"helix": 1, "forward": false, "start": 1460, "end": 1470} ] }, { + "name": "staple148", "color": "#333333", "sequence": "ATTGTTATCCAGGTTTAGTA", - "idt": {"name": "staple148", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D7"}, "domains": [ {"helix": 0, "forward": true, "start": 1470, "end": 1480}, {"helix": 1, "forward": false, "start": 1470, "end": 1480} ] }, { + "name": "staple149", "color": "#320096", "sequence": "GCTCACAATTCGTACTCAGG", - "idt": {"name": "staple149", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E7"}, "domains": [ {"helix": 0, "forward": true, "start": 1480, "end": 1490}, {"helix": 1, "forward": false, "start": 1480, "end": 1490} ] }, { + "name": "staple150", "color": "#03b6a2", "sequence": "CCACACAACAGGTGTATCAC", - "idt": {"name": "staple150", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F7"}, "domains": [ {"helix": 0, "forward": true, "start": 1490, "end": 1500}, {"helix": 1, "forward": false, "start": 1490, "end": 1500} ] }, { + "name": "staple151", "color": "#7300de", "sequence": "TACGAGCCGGGCCCGGAATA", - "idt": {"name": "staple151", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G7"}, "domains": [ {"helix": 0, "forward": true, "start": 1500, "end": 1510}, {"helix": 1, "forward": false, "start": 1500, "end": 1510} ] }, { + "name": "staple152", "color": "#aaaa00", "sequence": "AAGCATAAAGTATAAGTATA", - "idt": {"name": "staple152", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H7"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H7"}, "domains": [ {"helix": 0, "forward": true, "start": 1510, "end": 1520}, {"helix": 1, "forward": false, "start": 1510, "end": 1520} ] }, { + "name": "staple153", "color": "#b8056c", "sequence": "TGTAAAGCCTAGAGGGTTGA", - "idt": {"name": "staple153", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A8"}, "domains": [ {"helix": 0, "forward": true, "start": 1520, "end": 1530}, {"helix": 1, "forward": false, "start": 1520, "end": 1530} ] }, { + "name": "staple154", "color": "#007200", "sequence": "GGGGTGCCTAAGTGCCGTCG", - "idt": {"name": "staple154", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B8"}, "domains": [ {"helix": 0, "forward": true, "start": 1530, "end": 1540}, {"helix": 1, "forward": false, "start": 1530, "end": 1540} ] }, { + "name": "staple155", "color": "#cc0000", "sequence": "ATGAGTGAGCCAGGCGGATA", - "idt": {"name": "staple155", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C8"}, "domains": [ {"helix": 0, "forward": true, "start": 1540, "end": 1550}, {"helix": 1, "forward": false, "start": 1540, "end": 1550} ] }, { + "name": "staple156", "color": "#f7931e", "sequence": "TAACTCACATTGCTCAGTAC", - "idt": {"name": "staple156", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D8"}, "domains": [ {"helix": 0, "forward": true, "start": 1550, "end": 1560}, {"helix": 1, "forward": false, "start": 1550, "end": 1560} ] }, { + "name": "staple157", "color": "#f74308", "sequence": "TAATTGCGTTAGCGGGGTTT", - "idt": {"name": "staple157", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E8"}, "domains": [ {"helix": 0, "forward": true, "start": 1560, "end": 1570}, {"helix": 1, "forward": false, "start": 1560, "end": 1570} ] }, { + "name": "staple158", "color": "#57bb00", "sequence": "GCGCTCACTGGATTAGGATT", - "idt": {"name": "staple158", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F8"}, "domains": [ {"helix": 0, "forward": true, "start": 1570, "end": 1580}, {"helix": 1, "forward": false, "start": 1570, "end": 1580} ] }, { + "name": "staple159", "color": "#888888", "sequence": "CCCGCTTTCCTCAAGAGAAG", - "idt": {"name": "staple159", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G8"}, "domains": [ {"helix": 0, "forward": true, "start": 1580, "end": 1590}, {"helix": 1, "forward": false, "start": 1580, "end": 1590} ] }, { + "name": "staple160", "color": "#32b86c", "sequence": "AGTCGGGAAACTGAGACTCC", - "idt": {"name": "staple160", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H8"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H8"}, "domains": [ {"helix": 0, "forward": true, "start": 1590, "end": 1600}, {"helix": 1, "forward": false, "start": 1590, "end": 1600} ] }, { + "name": "staple161", "color": "#333333", "sequence": "CCTGTCGTGCTATTAAGAGG", - "idt": {"name": "staple161", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A9"}, "domains": [ {"helix": 0, "forward": true, "start": 1600, "end": 1610}, {"helix": 1, "forward": false, "start": 1600, "end": 1610} ] }, { + "name": "staple162", "color": "#320096", "sequence": "CAGCTGCATTAACATGAAAG", - "idt": {"name": "staple162", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B9"}, "domains": [ {"helix": 0, "forward": true, "start": 1610, "end": 1620}, {"helix": 1, "forward": false, "start": 1610, "end": 1620} ] }, { + "name": "staple163", "color": "#03b6a2", "sequence": "AATGAATCGGATTATTCTGA", - "idt": {"name": "staple163", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C9"}, "domains": [ {"helix": 0, "forward": true, "start": 1620, "end": 1630}, {"helix": 1, "forward": false, "start": 1620, "end": 1630} ] }, { + "name": "staple164", "color": "#7300de", "sequence": "CCAACGCGCGTTCGGAACCT", - "idt": {"name": "staple164", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D9"}, "domains": [ {"helix": 0, "forward": true, "start": 1630, "end": 1640}, {"helix": 1, "forward": false, "start": 1630, "end": 1640} ] }, { + "name": "staple165", "color": "#aaaa00", "sequence": "GGGAGAGGCGCCCTGCCTAT", - "idt": {"name": "staple165", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E9"}, "domains": [ {"helix": 0, "forward": true, "start": 1640, "end": 1650}, {"helix": 1, "forward": false, "start": 1640, "end": 1650} ] }, { + "name": "staple166", "color": "#b8056c", "sequence": "GTTTGCGTATAGTTAATGCC", - "idt": {"name": "staple166", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F9"}, "domains": [ {"helix": 0, "forward": true, "start": 1650, "end": 1660}, {"helix": 1, "forward": false, "start": 1650, "end": 1660} ] }, { + "name": "staple167", "color": "#007200", "sequence": "TGGGCGCCAGCCGTATAAAC", - "idt": {"name": "staple167", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G9"}, "domains": [ {"helix": 0, "forward": true, "start": 1660, "end": 1670}, {"helix": 1, "forward": false, "start": 1660, "end": 1670} ] }, { + "name": "staple168", "color": "#cc0000", "sequence": "GGTGGTTTTTGTAACAGTGC", - "idt": {"name": "staple168", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H9"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H9"}, "domains": [ {"helix": 0, "forward": true, "start": 1670, "end": 1680}, {"helix": 1, "forward": false, "start": 1670, "end": 1680} ] }, { + "name": "staple169", "color": "#f7931e", "sequence": "CTTTTCACCAAGTGCCTTGA", - "idt": {"name": "staple169", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A10"}, "domains": [ {"helix": 0, "forward": true, "start": 1680, "end": 1690}, {"helix": 1, "forward": false, "start": 1680, "end": 1690} ] }, { + "name": "staple170", "color": "#f74308", "sequence": "GTGAGACGGGTAACGGGGTC", - "idt": {"name": "staple170", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B10"}, "domains": [ {"helix": 0, "forward": true, "start": 1690, "end": 1700}, {"helix": 1, "forward": false, "start": 1690, "end": 1700} ] }, { + "name": "staple171", "color": "#57bb00", "sequence": "CAACAGCTGATAATAAGTTT", - "idt": {"name": "staple171", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C10"}, "domains": [ {"helix": 0, "forward": true, "start": 1700, "end": 1710}, {"helix": 1, "forward": false, "start": 1700, "end": 1710} ] }, { + "name": "staple172", "color": "#888888", "sequence": "TTGCCCTTCAAGTGTACTGG", - "idt": {"name": "staple172", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D10"}, "domains": [ {"helix": 0, "forward": true, "start": 1710, "end": 1720}, {"helix": 1, "forward": false, "start": 1710, "end": 1720} ] }, { + "name": "staple173", "color": "#32b86c", "sequence": "CCGCCTGGCCATGATACAGG", - "idt": {"name": "staple173", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E10"}, "domains": [ {"helix": 0, "forward": true, "start": 1720, "end": 1730}, {"helix": 1, "forward": false, "start": 1720, "end": 1730} ] }, { + "name": "staple174", "color": "#333333", "sequence": "CTGAGAGAGTATGGCTTTTG", - "idt": {"name": "staple174", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F10"}, "domains": [ {"helix": 0, "forward": true, "start": 1730, "end": 1740}, {"helix": 1, "forward": false, "start": 1730, "end": 1740} ] }, { + "name": "staple175", "color": "#320096", "sequence": "TGCAGCAAGCAGCGTCATAC", - "idt": {"name": "staple175", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G10"}, "domains": [ {"helix": 0, "forward": true, "start": 1740, "end": 1750}, {"helix": 1, "forward": false, "start": 1740, "end": 1750} ] }, { + "name": "staple176", "color": "#03b6a2", "sequence": "GGTCCACGCTCGTTCCAGTA", - "idt": {"name": "staple176", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H10"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H10"}, "domains": [ {"helix": 0, "forward": true, "start": 1750, "end": 1760}, {"helix": 1, "forward": false, "start": 1750, "end": 1760} ] }, { + "name": "staple177", "color": "#7300de", "sequence": "GGTTTGCCCCCTGAATTTAC", - "idt": {"name": "staple177", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A11"}, "domains": [ {"helix": 0, "forward": true, "start": 1760, "end": 1770}, {"helix": 1, "forward": false, "start": 1760, "end": 1770} ] }, { + "name": "staple178", "color": "#aaaa00", "sequence": "AGCAGGCGAAAGCGCAGTCT", - "idt": {"name": "staple178", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B11"}, "domains": [ {"helix": 0, "forward": true, "start": 1770, "end": 1780}, {"helix": 1, "forward": false, "start": 1770, "end": 1780} ] }, { + "name": "staple179", "color": "#b8056c", "sequence": "AATCCTGTTTCAGAATGGAA", - "idt": {"name": "staple179", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C11"}, "domains": [ {"helix": 0, "forward": true, "start": 1780, "end": 1790}, {"helix": 1, "forward": false, "start": 1780, "end": 1790} ] }, { + "name": "staple180", "color": "#007200", "sequence": "GATGGTGGTTTCATTAAAGC", - "idt": {"name": "staple180", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D11"}, "domains": [ {"helix": 0, "forward": true, "start": 1790, "end": 1800}, {"helix": 1, "forward": false, "start": 1790, "end": 1800} ] }, { + "name": "staple181", "color": "#cc0000", "sequence": "CCGAAATCGGAAATAAATCC", - "idt": {"name": "staple181", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E11"}, "domains": [ {"helix": 0, "forward": true, "start": 1800, "end": 1810}, {"helix": 1, "forward": false, "start": 1800, "end": 1810} ] }, { + "name": "staple182", "color": "#f7931e", "sequence": "CAAAATCCCTATTCACAAAC", - "idt": {"name": "staple182", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F11"}, "domains": [ {"helix": 0, "forward": true, "start": 1810, "end": 1820}, {"helix": 1, "forward": false, "start": 1810, "end": 1820} ] }, { + "name": "staple183", "color": "#f74308", "sequence": "TATAAATCAATGGCCTTGAT", - "idt": {"name": "staple183", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G11"}, "domains": [ {"helix": 0, "forward": true, "start": 1820, "end": 1830}, {"helix": 1, "forward": false, "start": 1820, "end": 1830} ] }, { + "name": "staple184", "color": "#57bb00", "sequence": "AAGAATAGCCGTCAGACGAT", - "idt": {"name": "staple184", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H11"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H11"}, "domains": [ {"helix": 0, "forward": true, "start": 1830, "end": 1840}, {"helix": 1, "forward": false, "start": 1830, "end": 1840} ] }, { + "name": "staple185", "color": "#888888", "sequence": "CGAGATAGGGGTTGAGGCAG", - "idt": {"name": "staple185", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A12"}, "domains": [ {"helix": 0, "forward": true, "start": 1840, "end": 1850}, {"helix": 1, "forward": false, "start": 1840, "end": 1850} ] }, { + "name": "staple186", "color": "#32b86c", "sequence": "TTGAGTGTTGTTGACAGGAG", - "idt": {"name": "staple186", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B12"}, "domains": [ {"helix": 0, "forward": true, "start": 1850, "end": 1860}, {"helix": 1, "forward": false, "start": 1850, "end": 1860} ] }, { + "name": "staple187", "color": "#333333", "sequence": "TTCCAGTTTGGCCGCCAGCA", - "idt": {"name": "staple187", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C12"}, "domains": [ {"helix": 0, "forward": true, "start": 1860, "end": 1870}, {"helix": 1, "forward": false, "start": 1860, "end": 1870} ] }, { + "name": "staple188", "color": "#320096", "sequence": "GAACAAGAGTCACCAGAGCC", - "idt": {"name": "staple188", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D12"}, "domains": [ {"helix": 0, "forward": true, "start": 1870, "end": 1880}, {"helix": 1, "forward": false, "start": 1870, "end": 1880} ] }, { + "name": "staple189", "color": "#03b6a2", "sequence": "CCACTATTAACCAGAACCAC", - "idt": {"name": "staple189", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E12"}, "domains": [ {"helix": 0, "forward": true, "start": 1880, "end": 1890}, {"helix": 1, "forward": false, "start": 1880, "end": 1890} ] }, { + "name": "staple190", "color": "#7300de", "sequence": "AGAACGTGGAAGAGCCGCCA", - "idt": {"name": "staple190", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F12"}, "domains": [ {"helix": 0, "forward": true, "start": 1890, "end": 1900}, {"helix": 1, "forward": false, "start": 1890, "end": 1900} ] }, { + "name": "staple191", "color": "#aaaa00", "sequence": "CTCCAACGTCCACCACCCTC", - "idt": {"name": "staple191", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G12"}, "domains": [ {"helix": 0, "forward": true, "start": 1900, "end": 1910}, {"helix": 1, "forward": false, "start": 1900, "end": 1910} ] }, { + "name": "staple192", "color": "#b8056c", "sequence": "AAAGGGCGAACCCTCAGAGC", - "idt": {"name": "staple192", "scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H12"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H12"}, "domains": [ {"helix": 0, "forward": true, "start": 1910, "end": 1920}, {"helix": 1, "forward": false, "start": 1910, "end": 1920} ] }, { + "name": "staple193", "color": "#007200", "sequence": "AAACCGTCTAAGAACCGCCA", - "idt": {"name": "staple193", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "A1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "A1"}, "domains": [ {"helix": 0, "forward": true, "start": 1920, "end": 1930}, {"helix": 1, "forward": false, "start": 1920, "end": 1930} ] }, { + "name": "staple194", "color": "#cc0000", "sequence": "TCAGGGCGATCGCCACCCTC", - "idt": {"name": "staple194", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "B1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "B1"}, "domains": [ {"helix": 0, "forward": true, "start": 1930, "end": 1940}, {"helix": 1, "forward": false, "start": 1930, "end": 1940} ] }, { + "name": "staple195", "color": "#f7931e", "sequence": "GGCCCACTACCCCTCAGAGC", - "idt": {"name": "staple195", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "C1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "C1"}, "domains": [ {"helix": 0, "forward": true, "start": 1940, "end": 1950}, {"helix": 1, "forward": false, "start": 1940, "end": 1950} ] }, { + "name": "staple196", "color": "#f74308", "sequence": "GTGAACCATCGGAACCGCCT", - "idt": {"name": "staple196", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "D1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "D1"}, "domains": [ {"helix": 0, "forward": true, "start": 1950, "end": 1960}, {"helix": 1, "forward": false, "start": 1950, "end": 1960} ] }, { + "name": "staple197", "color": "#57bb00", "sequence": "ACCCAAATCAAGCCACCACC", - "idt": {"name": "staple197", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "E1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "E1"}, "domains": [ {"helix": 0, "forward": true, "start": 1960, "end": 1970}, {"helix": 1, "forward": false, "start": 1960, "end": 1970} ] }, { + "name": "staple198", "color": "#888888", "sequence": "AGTTTTTTGGCCGGAACCAG", - "idt": {"name": "staple198", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "F1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "F1"}, "domains": [ {"helix": 0, "forward": true, "start": 1970, "end": 1980}, {"helix": 1, "forward": false, "start": 1970, "end": 1980} ] }, { + "name": "staple199", "color": "#32b86c", "sequence": "GGTCGAGGTGATCAAAATCA", - "idt": {"name": "staple199", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "G1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "G1"}, "domains": [ {"helix": 0, "forward": true, "start": 1980, "end": 1990}, {"helix": 1, "forward": false, "start": 1980, "end": 1990} ] }, { + "name": "staple200", "color": "#333333", "sequence": "CCGTAAAGCATCTTTTCATA", - "idt": {"name": "staple200", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "H1"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "H1"}, "domains": [ {"helix": 0, "forward": true, "start": 1990, "end": 2000}, {"helix": 1, "forward": false, "start": 1990, "end": 2000} ] }, { + "name": "staple201", "color": "#320096", "sequence": "CTAAATCGGAGCGTTTGCCA", - "idt": {"name": "staple201", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "A2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "A2"}, "domains": [ {"helix": 0, "forward": true, "start": 2000, "end": 2010}, {"helix": 1, "forward": false, "start": 2000, "end": 2010} ] }, { + "name": "staple202", "color": "#03b6a2", "sequence": "ACCCTAAAGGCCCCTTATTA", - "idt": {"name": "staple202", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "B2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "B2"}, "domains": [ {"helix": 0, "forward": true, "start": 2010, "end": 2020}, {"helix": 1, "forward": false, "start": 2010, "end": 2020} ] }, { + "name": "staple203", "color": "#7300de", "sequence": "GAGCCCCCGACGGTCATAGC", - "idt": {"name": "staple203", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "C2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "C2"}, "domains": [ {"helix": 0, "forward": true, "start": 2020, "end": 2030}, {"helix": 1, "forward": false, "start": 2020, "end": 2030} ] }, { + "name": "staple204", "color": "#aaaa00", "sequence": "TTTAGAGCTTTCGGCATTTT", - "idt": {"name": "staple204", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "D2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "D2"}, "domains": [ {"helix": 0, "forward": true, "start": 2030, "end": 2040}, {"helix": 1, "forward": false, "start": 2030, "end": 2040} ] }, { + "name": "staple205", "color": "#b8056c", "sequence": "GACGGGGAAACGCGTTTTCA", - "idt": {"name": "staple205", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "E2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "E2"}, "domains": [ {"helix": 0, "forward": true, "start": 2040, "end": 2050}, {"helix": 1, "forward": false, "start": 2040, "end": 2050} ] }, { + "name": "staple206", "color": "#007200", "sequence": "GCCGGCGAACCAGACTGTAG", - "idt": {"name": "staple206", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "F2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "F2"}, "domains": [ {"helix": 0, "forward": true, "start": 2050, "end": 2060}, {"helix": 1, "forward": false, "start": 2050, "end": 2060} ] }, { + "name": "staple207", "color": "#cc0000", "sequence": "GTGGCGAGAACCTTTAGCGT", - "idt": {"name": "staple207", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "G2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "G2"}, "domains": [ {"helix": 0, "forward": true, "start": 2060, "end": 2070}, {"helix": 1, "forward": false, "start": 2060, "end": 2070} ] }, { + "name": "staple208", "color": "#f7931e", "sequence": "AGGAAGGGAAATCAAGTTTG", - "idt": {"name": "staple208", "scale": "25nm", "purification": "STD", "plate": "plate3", "well": "H2"}, + "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "H2"}, "domains": [ {"helix": 0, "forward": true, "start": 2070, "end": 2080}, {"helix": 1, "forward": false, "start": 2070, "end": 2080} diff --git a/examples/output_designs/long_range_crossovers.sc b/examples/output_designs/long_range_crossovers.sc index 735b9de1..6dca13b1 100644 --- a/examples/output_designs/long_range_crossovers.sc +++ b/examples/output_designs/long_range_crossovers.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, diff --git a/examples/output_designs/loopouts_all_types.sc b/examples/output_designs/loopouts_all_types.sc index 9bba5e05..51dfce25 100644 --- a/examples/output_designs/loopouts_all_types.sc +++ b/examples/output_designs/loopouts_all_types.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 8, "grid_position": [0, 0]}, diff --git a/examples/output_designs/many_big_helices.sc b/examples/output_designs/many_big_helices.sc index 6c23f38c..5c80fda9 100644 --- a/examples/output_designs/many_big_helices.sc +++ b/examples/output_designs/many_big_helices.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 2000, "grid_position": [0, 0]}, diff --git a/examples/output_designs/many_helices_modifications.sc b/examples/output_designs/many_helices_modifications.sc index 55e75b78..2d10c37c 100644 --- a/examples/output_designs/many_helices_modifications.sc +++ b/examples/output_designs/many_helices_modifications.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, @@ -12,6 +12,12 @@ {"grid_position": [0, 7]} ], "modifications_in_design": { + "/3Cy3Sp/": { + "display_text": "Cy3", + "idt_text": "/3Cy3Sp/", + "display_connector": false, + "location": "3'" + }, "/iBiodT/": { "display_text": "B", "idt_text": "/iBiodT/", @@ -30,12 +36,6 @@ "idt_text": "/iCy3/", "display_connector": false, "location": "internal" - }, - "/3Cy3Sp/": { - "display_text": "Cy3", - "idt_text": "/3Cy3Sp/", - "display_connector": false, - "location": "3'" } }, "strands": [ diff --git a/examples/output_designs/names_domains_strands.sc b/examples/output_designs/names_domains_strands.sc index 9cffa5e6..950828e7 100644 --- a/examples/output_designs/names_domains_strands.sc +++ b/examples/output_designs/names_domains_strands.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]} diff --git a/examples/output_designs/proposal.sc b/examples/output_designs/proposal.sc index d70a7a1d..a20ea4eb 100644 --- a/examples/output_designs/proposal.sc +++ b/examples/output_designs/proposal.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "none", "helices": [ {"max_offset": 512, "position": {"x": 0, "y": 0, "z": 0}}, diff --git a/examples/output_designs/sst-motif-3_2.sc b/examples/output_designs/sst-motif-3_2.sc index 135250bd..fd9e2942 100644 --- a/examples/output_designs/sst-motif-3_2.sc +++ b/examples/output_designs/sst-motif-3_2.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 160, "grid_position": [0, 0], "major_tick_distance": 10}, diff --git a/examples/output_designs/sst-motif-4_1.sc b/examples/output_designs/sst-motif-4_1.sc index 3c24dda2..5b2da274 100644 --- a/examples/output_designs/sst-motif-4_1.sc +++ b/examples/output_designs/sst-motif-4_1.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 160, "grid_position": [0, 0], "major_tick_distance": 10}, diff --git a/examples/output_designs/very_large_origami.sc b/examples/output_designs/very_large_origami.sc index cb4a8ed6..1d601e2c 100644 --- a/examples/output_designs/very_large_origami.sc +++ b/examples/output_designs/very_large_origami.sc @@ -1,5 +1,5 @@ { - "version": "0.14.0", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 672, "grid_position": [0, 0]}, diff --git a/examples/tutorial-examples/24_helix_rectangle.py b/examples/tutorial-examples/24_helix_rectangle.py index b8c0b03b..ffeedebf 100644 --- a/examples/tutorial-examples/24_helix_rectangle.py +++ b/examples/tutorial-examples/24_helix_rectangle.py @@ -39,7 +39,7 @@ def add_scaffold_crossovers(design: sc.Design) -> None: for helix in range(0, 23, 2): # scaffold edges crossovers design.add_half_crossover(helix=helix, helix2=helix + 1, offset=0, forward=True) - design.add_half_crossover(helix=helix, helix2=helix + 1, offset=287, forward=True) + design.add_half_crossover(helix=helix, helix2=helix + 1, offset=287, forward=True) # offset inclusive def add_staple_precursors(design: sc.Design) -> None: diff --git a/scadnano/scadnano.py b/scadnano/scadnano.py index 68ca9248..b12d7e83 100644 --- a/scadnano/scadnano.py +++ b/scadnano/scadnano.py @@ -50,7 +50,7 @@ # commented out for now to support Py3.6, which does not support this feature # from __future__ import annotations -__version__ = "0.14.0" # version line; WARNING: do not remove or change this line or comment +__version__ = "0.15.0" # version line; WARNING: do not remove or change this line or comment import dataclasses from abc import abstractmethod, ABC, ABCMeta @@ -794,11 +794,13 @@ def m13(rotation: int = 5587, variant: M13Variant = M13Variant.p7249) -> str: mod_allowed_bases_key = 'allowed_bases' # IDT keys -idt_name_key = 'name' idt_scale_key = 'scale' idt_purification_key = 'purification' idt_plate_key = 'plate' idt_well_key = 'well' +# legacy; not written anymore as part of idt, but may be read from older versions of the JSON if +# the Strand has no name but the IDT field does have a name +idt_name_key = 'name' # end keys ################## @@ -1939,13 +1941,11 @@ def wc(seq: str) -> str: class IDTFields(_JSONSerializable): """Data required when ordering DNA strands from the synthesis company `IDT (Integrated DNA Technologies) `_. - This data is used when automatically generating files used to order DNA from IDT.""" + This data is used when automatically generating files used to order DNA from IDT. - name: str - """Name of the strand (first field in IDT bulk input: https://www.idtdna.com/site/order/oligoentry). - - Non-optional field. - """ + When exporting to IDT files via :py:meth:`Design.write_idt_plate_excel_file` + or :py:meth:`Design.write_idt_bulk_input_file`, the field :py:data:`Strand.name` is used for the + name if it exists, otherwise a reasonable default is chosen.""" scale: str = default_idt_scale """Synthesis scale at which to synthesize the strand (third field in IDT bulk input: @@ -1979,7 +1979,6 @@ class IDTFields(_JSONSerializable): """ def __post_init__(self) -> None: - _check_idt_string_not_none_or_empty(self.name, 'name') _check_idt_string_not_none_or_empty(self.scale, 'scale') _check_idt_string_not_none_or_empty(self.purification, 'purification') if self.plate is None and self.well is not None: @@ -2000,12 +1999,11 @@ def to_json_serializable(self, suppress_indent: bool = True, @staticmethod def from_json(json_map: Dict[str, Any]) -> 'IDTFields': - name = mandatory_field(IDTFields, json_map, idt_name_key) scale = mandatory_field(IDTFields, json_map, idt_scale_key) purification = mandatory_field(IDTFields, json_map, idt_purification_key) plate = json_map.get(idt_plate_key) well = json_map.get(idt_well_key) - return IDTFields(name=name, scale=scale, purification=purification, plate=plate, well=well) + return IDTFields(scale=scale, purification=purification, plate=plate, well=well) def _check_idt_string_not_none_or_empty(value: str, field_name: str) -> None: @@ -2028,7 +2026,17 @@ class StrandBuilder(Generic[StrandLabel, DomainLabel]): :any:`StrandBuilder` should generally not be created directly. Although it is convenient to use chained method calls, it is also sometimes useful to assign the - :any:`StrandBuilder` object into a variable and then call the methods on that variable. + :any:`StrandBuilder` object into a variable and then call the methods on that variable. For example, + this code is equivalent to the above line: + + .. code-block:: Python + + strand_builder = design.strand(0, 0) + strand_builder.to(10) + strand_builder.cross(1) + strand_builder.to(5) + strand_builder.with_modification_5p(mod.biotin_5p) + strand_builder.as_scaffold() """ # remove quotes when Py3.6 support dropped @@ -2232,16 +2240,14 @@ def as_scaffold(self) -> 'StrandBuilder[StrandLabel, DomainLabel]': self._strand.set_scaffold(True) return self - def with_idt(self, name: str, scale: str = default_idt_scale, + def with_idt(self, scale: str = default_idt_scale, purification: str = default_idt_purification, plate: Optional[str] = None, well: Optional[str] = None) \ -> 'StrandBuilder[StrandLabel, DomainLabel]': """ Gives :any:`IDTFields` value to :any:`Strand` being built. - Only a name is required; other field have reasonable default values. + Only a name is required; other fields are given reasonable default values. - :param name: - name of strand; required field :param scale: see :py:data:`IDTFields.scale` :param purification: @@ -2254,7 +2260,7 @@ def with_idt(self, name: str, scale: str = default_idt_scale, """ if self._strand is None: raise ValueError('no Strand created yet; make at least one domain first') - self._strand.idt = IDTFields(name=name, scale=scale, purification=purification, + self._strand.idt = IDTFields(scale=scale, purification=purification, plate=plate, well=well) return self @@ -2633,9 +2639,6 @@ def from_json(json_map: dict) -> 'Strand': # remove quotes when Py3.6 support d dna_sequence = optional_field(None, json_map, dna_sequence_key, *legacy_dna_sequence_keys) - idt_dict = json_map.get(idt_key) - idt = None if idt_dict is None else IDTFields.from_json(idt_dict) - color_str = json_map.get(color_key, default_scaffold_color if is_scaffold else default_strand_color) if isinstance(color_str, int): @@ -2645,9 +2648,17 @@ def decimal_int_to_hex(d: int) -> str: color_str = decimal_int_to_hex(color_str) color = Color(hex_string=color_str) - name = json_map.get(strand_name_key) label = json_map.get(strand_label_key) + name = json_map.get(strand_name_key) + + idt_dict: Optional[dict] = json_map.get(idt_key) + idt = None if idt_dict is None else IDTFields.from_json(idt_dict) + # legacy: + # if no name is specified, but there's a name field in idt, then use that as the Strand's name + if name is None and idt_dict is not None and idt_name_key in idt_dict: + name = idt_dict[idt_name_key] + return Strand( domains=domains, dna_sequence=dna_sequence, @@ -2785,17 +2796,11 @@ def idt_export_name(self, unique_names: bool = False) -> str: Has no effect if :py:data:`Strand.idt` or :py:data:`Strand.name` are defined; if those are used, they must be explicitly set to be unique. :return: - If :py:data:`Strand.idt` is not None, return :py:data:`Strand.idt.name`, - otherwise, if :py:data:`Strand.name` is not None, return :py:data:`Strand.name`, + If :py:data:`Strand.name` is not None, return :py:data:`Strand.name`, otherwise return the result of :py:meth:`Strand.default_export_name` with parameter `unique_names`. """ - if self.idt is not None: - return self.idt.name - elif self.name is not None: - return self.name - else: - return self.default_export_name(unique_names) + return self.name if self.name is not None else self.default_export_name(unique_names) def default_export_name(self, unique_names: bool = False) -> str: """ @@ -5092,14 +5097,22 @@ def to_idt_bulk_input_format(self, only_strands_with_idt=only_strands_with_idt, export_scaffold=export_scaffold, export_non_modified_strand_version=export_non_modified_strand_version) - + print('hello') idt_lines: List[str] = [] for strand in strands_to_export: - if strand.idt is None: - raise ValueError(f'cannot export strand {strand} to IDT because it has no IDT field') + if strand.idt is None and only_strands_with_idt: + raise AssertionError(f'cannot export strand {strand} to IDT because it has no IDT field; ' + f'since only_strands_with_idt is True, ' + f'this strand should have been filtered out by _idt_strands_to_export') + if strand.idt is not None: + scale = strand.idt.scale + purification = strand.idt.scale + else: + scale = default_idt_scale + purification = default_idt_purification idt_lines.append(delimiter.join( [strand.idt_export_name(), strand.idt_dna_sequence(), - strand.idt.scale, strand.idt.purification] + scale, purification] )) idt_string = '\n'.join(idt_lines) @@ -5147,9 +5160,7 @@ def _check_strands_with_same_name_agree_on_other_idt_fields(strand: Strand, exis # This is allowed in case one wants to draw multiple copies of the same strand # in scadnano without having to worry about setting their idt fields differently. # But then we need to check that they agree on everything being exported. - if existing_strand.idt is not None: - assert existing_strand.idt.name == name - elif existing_strand.name is not None: + if existing_strand.name is not None: assert existing_strand.name == name domain = strand.first_domain() existing_domain = existing_strand.first_domain() @@ -5171,7 +5182,7 @@ def _check_strands_with_same_name_agree_on_other_idt_fields(strand: Strand, exis and existing_strand.idt is not None: if strand.idt.scale != existing_strand.idt.scale: raise IllegalDesignError( - f'two strands with same IDT name {name} but different IDT scales:\n' + f'two strands with same name {name} but different IDT scales:\n' f' strand 1: helix {domain.helix}, 5\' end at offset {domain.offset_5p()}, ' f'scale: {strand.idt.scale}\n' f' strand 2: helix {existing_domain.helix}, 5\' end at offset ' @@ -5179,7 +5190,7 @@ def _check_strands_with_same_name_agree_on_other_idt_fields(strand: Strand, exis f'scale: {existing_strand.idt.scale}\n') elif strand.idt.purification != existing_strand.idt.purification: raise IllegalDesignError( - f'two strands with same IDT name {name} but different purifications:\n' + f'two strands with same name {name} but different purifications:\n' f' strand 1: helix {domain.helix}, 5\' end at offset {domain.offset_5p()}, ' f'purification: {strand.idt.purification}\n' f' strand 2: helix {existing_domain.helix}, 5\' end at offset ' @@ -5226,7 +5237,8 @@ def write_idt_bulk_input_file(self, *, directory: str = '.', filename: str = Non if two different :any:`Strand`'s have the same name but different sequences, IDT scales, or IDT purifications. :param only_strands_with_idt: - If False (the default), all non-scaffold sequences are output + If False (the default), all non-scaffold sequences are output, with reasonable default values + chosen if the field :py:data:`Strand.idt` is missing. (though scaffold is included if `export_scaffold` is True). If True, then strands lacking the field :any:`Strand.idt` will not be exported. :param export_scaffold: @@ -5284,7 +5296,8 @@ def write_idt_plate_excel_file(self, *, directory: str = '.', filename: str = No if two different :any:`Strand`'s have the same name but different sequences, IDT scales, or IDT purifications. :param only_strands_with_idt: - If False (the default), all non-scaffold sequences are output + If False (the default), all non-scaffold sequences are output, with reasonable default values + chosen if the field :py:data:`Strand.idt` is missing. (though scaffold is included if `export_scaffold` is True). If True, then strands lacking the field :any:`Strand.idt` will not be exported. If False, then `use_default_plates` must be True. @@ -5323,7 +5336,8 @@ def write_idt_plate_excel_file(self, *, directory: str = '.', filename: str = No 'cannot both be False') self._write_plates_assuming_explicit_plates_in_each_strand(directory, filename, strands_to_export) else: - self._write_plates_default(directory=directory, filename=filename, strands_to_export=strands_to_export, + self._write_plates_default(directory=directory, filename=filename, + strands_to_export=strands_to_export, plate_type=plate_type, warn_using_default_plates=warn_using_default_plates) @@ -5351,7 +5365,7 @@ def _write_plates_assuming_explicit_plates_in_each_strand(self, directory: str, if strand.idt is None: raise ValueError(f'cannot export strand {strand} to IDT because it has no idt field') worksheet.write(row + 1, 0, strand.idt.well) - worksheet.write(row + 1, 1, strand.idt.name) + worksheet.write(row + 1, 1, strand.idt_export_name()) worksheet.write(row + 1, 2, strand.idt_dna_sequence()) workbook.save(filename_plate) diff --git a/tests/scadnano_tests.py b/tests/scadnano_tests.py index c4ac0053..c172458b 100644 --- a/tests/scadnano_tests.py +++ b/tests/scadnano_tests.py @@ -1,9 +1,11 @@ import os -# import sys +import sys # sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) import unittest +import unittest.mock as mock import re import json +import io from typing import Iterable, Union, Dict, Any import scadnano as sc @@ -663,33 +665,33 @@ def setUp(self) -> None: self.design_6h: sc.Design = sc.Design(helices=helices, strands=[], grid=sc.square) d = self.design_6h - d.strand(1, 0).move(16).cross(0).move(-16).with_idt('A') - d.strand(3, 0).move(16).cross(2).move(-16).with_idt('B') - d.strand(5, 0).move(16).cross(4).move(-16).with_idt('C') + d.strand(1, 0).move(16).cross(0).move(-16).with_name('A') + d.strand(3, 0).move(16).cross(2).move(-16).with_name('B') + d.strand(5, 0).move(16).cross(4).move(-16).with_name('C') - d.strand(0, 40).move(-24).cross(1).move(8).with_idt('D') + d.strand(0, 40).move(-24).cross(1).move(8).with_name('D') - d.strand(1, 24).move(8).cross(2).move(-16).cross(3).move(8).with_idt('E') - d.strand(3, 24).move(8).cross(4).move(-16).cross(5).move(8).with_idt('F') + d.strand(1, 24).move(8).cross(2).move(-16).cross(3).move(8).with_name('E') + d.strand(3, 24).move(8).cross(4).move(-16).cross(5).move(8).with_name('F') - d.strand(0, 72).move(-32).with_idt('G') + d.strand(0, 72).move(-32).with_name('G') - d.strand(2, 40).move(-8).cross(1).move(24).with_idt('H') - d.strand(1, 56).move(8).cross(2).move(-24).with_idt('I') + d.strand(2, 40).move(-8).cross(1).move(24).with_name('H') + d.strand(1, 56).move(8).cross(2).move(-24).with_name('I') - d.strand(4, 40).move(-8).cross(3).move(24).with_idt('J') - d.strand(3, 56).move(8).cross(4).move(-24).with_idt('K') + d.strand(4, 40).move(-8).cross(3).move(24).with_name('J') + d.strand(3, 56).move(8).cross(4).move(-24).with_name('K') - d.strand(5, 24).move(32).with_idt('L') + d.strand(5, 24).move(32).with_name('L') - d.strand(2, 72).move(-8).cross(1).move(16).cross(0).move(-8).with_idt('M') - d.strand(4, 72).move(-8).cross(3).move(16).cross(2).move(-8).with_idt('N') + d.strand(2, 72).move(-8).cross(1).move(16).cross(0).move(-8).with_name('M') + d.strand(4, 72).move(-8).cross(3).move(16).cross(2).move(-8).with_name('N') - d.strand(5, 56).move(24).cross(4).move(-8).with_idt('O') + d.strand(5, 56).move(24).cross(4).move(-8).with_name('O') - d.strand(0, 96).move(-16).cross(1).move(16).with_idt('P') - d.strand(2, 96).move(-16).cross(3).move(16).with_idt('Q') - d.strand(4, 96).move(-16).cross(5).move(16).with_idt('R') + d.strand(0, 96).move(-16).cross(1).move(16).with_name('P') + d.strand(2, 96).move(-16).cross(3).move(16).with_name('Q') + d.strand(4, 96).move(-16).cross(5).move(16).with_name('R') for strand in d.strands: d.assign_dna(strand, 'A' * 32, assign_complement=False) @@ -754,9 +756,9 @@ def test_to_idt_bulk_input_format__duplicate_names_same_sequence(self) -> None: ss2_r = sc.Domain(0, True, 4, 8) ss_l = sc.Domain(0, False, 0, 4) - s1_r = sc.Strand([ss1_r], idt=sc.IDTFields('s1_r')) - s2_r = sc.Strand([ss2_r], idt=sc.IDTFields('s1_r')) - s_l = sc.Strand([ss_l], idt=sc.IDTFields('s_l')) + s1_r = sc.Strand([ss1_r], idt=sc.IDTFields(), name='s1_r') + s2_r = sc.Strand([ss2_r], idt=sc.IDTFields(), name='s1_r') + s_l = sc.Strand([ss_l], idt=sc.IDTFields(), name='s_l') strands = [s1_r, s2_r, s_l] @@ -773,9 +775,9 @@ def test_to_idt_bulk_input_format__duplicate_names_different_sequences(self) -> ss2_r = sc.Domain(0, True, 4, 8) ss_l = sc.Domain(0, False, 0, 4) - s1_r = sc.Strand([ss1_r], idt=sc.IDTFields('s1_r')) - s2_r = sc.Strand([ss2_r], idt=sc.IDTFields('s1_r')) - s_l = sc.Strand([ss_l], idt=sc.IDTFields('s_l')) + s1_r = sc.Strand([ss1_r], idt=sc.IDTFields(), name='s1_r') + s2_r = sc.Strand([ss2_r], idt=sc.IDTFields(), name='s1_r') + s_l = sc.Strand([ss_l], idt=sc.IDTFields(), name='s_l') strands = [s1_r, s2_r, s_l] @@ -792,9 +794,9 @@ def test_to_idt_bulk_input_format__duplicate_names_different_scales(self) -> Non ss2_r = sc.Domain(0, True, 4, 8) ss_l = sc.Domain(0, False, 0, 4) - s1_r = sc.Strand([ss1_r], idt=sc.IDTFields('s1_r', scale='25nm')) - s2_r = sc.Strand([ss2_r], idt=sc.IDTFields('s1_r', scale='100nm')) - s_l = sc.Strand([ss_l], idt=sc.IDTFields('s_l')) + s1_r = sc.Strand([ss1_r], idt=sc.IDTFields(scale='25nm'), name='s1_r') + s2_r = sc.Strand([ss2_r], idt=sc.IDTFields(scale='100nm'), name='s1_r') + s_l = sc.Strand([ss_l], idt=sc.IDTFields(), name='s_l') strands = [s1_r, s2_r, s_l] @@ -806,14 +808,16 @@ def test_to_idt_bulk_input_format__duplicate_names_different_scales(self) -> Non with self.assertRaises(sc.IllegalDesignError): design.to_idt_bulk_input_format() + # https://stackoverflow.com/a/46307456/5339430 + # @mock.patch('sys.stdout', new_callable=io.StringIO) def test_to_idt_bulk_input_format__duplicate_names_different_purifications(self) -> None: ss1_r = sc.Domain(0, True, 0, 4) ss2_r = sc.Domain(0, True, 4, 8) ss_l = sc.Domain(0, False, 0, 4) - s1_r = sc.Strand([ss1_r], idt=sc.IDTFields('s1_r', purification='STD')) - s2_r = sc.Strand([ss2_r], idt=sc.IDTFields('s1_r', purification='HPLC')) - s_l = sc.Strand([ss_l], idt=sc.IDTFields('s_l')) + s1_r = sc.Strand([ss1_r], idt=sc.IDTFields(purification='STD'), name='s1_r') + s2_r = sc.Strand([ss2_r], idt=sc.IDTFields(purification='HPLC'), name='s1_r') + s_l = sc.Strand([ss_l], idt=sc.IDTFields(), name='s_l') strands = [s1_r, s2_r, s_l] @@ -823,7 +827,11 @@ def test_to_idt_bulk_input_format__duplicate_names_different_purifications(self) design.assign_dna(s2_r, 'AACT') with self.assertRaises(sc.IllegalDesignError): - design.to_idt_bulk_input_format() + design.to_idt_bulk_input_format(warn_duplicate_name=True) + # printed = mock_print.getvalue() + # self.assertIn('two strands with same IDT name', printed) + # self.assertIn('s1_r', printed) + class TestExportCadnanoV2(unittest.TestCase): @@ -3100,6 +3108,69 @@ def test_strand_names_can_be_nonunique(self) -> None: class TestJSON(unittest.TestCase): + def test_legacy_idt_name_import__no_strand_name(self) -> None: + # tests proper importing of old format when name was a subfield of idt; + # ensures if that exists and no Strand.name field exists, the idt.name is used as Strand.name + json_str = ''' + { + "version": "0.14.0", + "grid": "square", + "helices": [ + {"grid_position": [0, 0]}, + {"grid_position": [0, 1]} + ], + "strands": [ + { + "color": "#f74308", + "sequence": "TATTATAGTCTTACCCTGAC", + "idt": {"name": "staple1", "scale": "100nm", "purification": "HPLC", "plate": "plate1", "well": "A1"}, + "domains": [ + {"helix": 0, "forward": true, "start": 0, "end": 10}, + {"helix": 1, "forward": false, "start": 0, "end": 10} + ] + } + ] + } + ''' + design = sc.Design.from_scadnano_json_str(json_str) + self.assertEqual(1, len(design.strands)) + strand = design.strands[0] + self.assertEqual('staple1', strand.name) + self.assertEqual('100nm', strand.idt.scale) + self.assertEqual('HPLC', strand.idt.purification) + self.assertEqual('plate1', strand.idt.plate) + self.assertEqual('A1', strand.idt.well) + + def test_legacy_idt_name_import__strand_name_exists(self) -> None: + # tests proper importing of old format when name was a subfield of idt; + # ensures if both exist, we use Strand.name + json_str = ''' + { + "version": "0.14.0", + "grid": "square", + "helices": [ + {"grid_position": [0, 0]}, + {"grid_position": [0, 1]} + ], + "strands": [ + { + "name": "staple1 strand level", + "color": "#f74308", + "sequence": "TATTATAGTCTTACCCTGAC", + "idt": {"name": "staple1", "scale": "100nm", "purification": "HPLC", "plate": "plate1", "well": "A1"}, + "domains": [ + {"helix": 0, "forward": true, "start": 0, "end": 10}, + {"helix": 1, "forward": false, "start": 0, "end": 10} + ] + } + ] + } + ''' + design = sc.Design.from_scadnano_json_str(json_str) + self.assertEqual(1, len(design.strands)) + strand = design.strands[0] + self.assertEqual('staple1 strand level', strand.name) + def test_Helix_major_tick_start_default_min_offset(self) -> None: helices = [ sc.Helix(min_offset=10, max_offset=100), @@ -3222,18 +3293,15 @@ def test_strand_labels(self) -> None: def test_strand_idt(self) -> None: helices = [sc.Helix(max_offset=100), sc.Helix(max_offset=100)] - strand0_expected = sc.Strand([sc.Domain(0, True, 0, 10)], idt=sc.IDTFields(name='strand1', - scale='25nm', - purification='HPLC', - plate='plate1', - well='A2')) + idt = sc.IDTFields(scale='25nm', purification='HPLC', plate='plate1', well='A2') + strand0_expected = sc.Strand([sc.Domain(0, True, 0, 10)], name='strand1', idt=idt) strands = [strand0_expected] design = sc.Design(helices=helices, strands=strands, grid=sc.square) json_str = design.to_json() design_from_json = sc.Design.from_scadnano_json_str(json_str) strand0 = design_from_json.strands[0] self.assertEqual(strand0_expected.idt, strand0.idt) - self.assertEqual('strand1', strand0.idt.name) + self.assertEqual('strand1', strand0.idt_export_name()) self.assertEqual('25nm', strand0.idt.scale) self.assertEqual('HPLC', strand0.idt.purification) self.assertEqual('plate1', strand0.idt.plate) diff --git a/tests_inputs/cadnano_v2_export/test_16_helix_origami_rectangle_no_twist.sc b/tests_inputs/cadnano_v2_export/test_16_helix_origami_rectangle_no_twist.sc index d0c650b9..7ab8cc69 100644 --- a/tests_inputs/cadnano_v2_export/test_16_helix_origami_rectangle_no_twist.sc +++ b/tests_inputs/cadnano_v2_export/test_16_helix_origami_rectangle_no_twist.sc @@ -1,5 +1,5 @@ { - "version": "0.13.4", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 448, "grid_position": [0, 0]}, diff --git a/tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_deletions_insertions.sc b/tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_deletions_insertions.sc index 544932e6..e78d004e 100644 --- a/tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_deletions_insertions.sc +++ b/tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_deletions_insertions.sc @@ -1,5 +1,5 @@ { - "version": "0.13.4", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, diff --git a/tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple.sc b/tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple.sc index a4981b33..8e58839e 100644 --- a/tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple.sc +++ b/tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple.sc @@ -1,5 +1,5 @@ { - "version": "0.13.4", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, diff --git a/tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple_2.sc b/tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple_2.sc index fdafae7e..6b4fe31f 100644 --- a/tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple_2.sc +++ b/tests_inputs/cadnano_v2_export/test_2_stape_2_helix_origami_extremely_simple_2.sc @@ -1,5 +1,5 @@ { - "version": "0.13.4", + "version": "0.15.0", "grid": "square", "helices": [ {"grid_position": [0, 0]}, diff --git a/tests_inputs/cadnano_v2_export/test_6_helix_origami_rectangle.sc b/tests_inputs/cadnano_v2_export/test_6_helix_origami_rectangle.sc index 40aa4f93..b490d285 100644 --- a/tests_inputs/cadnano_v2_export/test_6_helix_origami_rectangle.sc +++ b/tests_inputs/cadnano_v2_export/test_6_helix_origami_rectangle.sc @@ -1,5 +1,5 @@ { - "version": "0.13.4", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 192, "grid_position": [0, 0]}, diff --git a/tests_inputs/cadnano_v2_export/test_circular_strand.sc b/tests_inputs/cadnano_v2_export/test_circular_strand.sc index bd03744b..312f87f6 100644 --- a/tests_inputs/cadnano_v2_export/test_circular_strand.sc +++ b/tests_inputs/cadnano_v2_export/test_circular_strand.sc @@ -1,5 +1,5 @@ { - "version": "0.13.4", + "version": "0.15.0", "grid": "square", "helices": [ {"max_offset": 24, "grid_position": [0, 0]}, diff --git a/tests_inputs/cadnano_v2_export/test_export_design_with_helix_group.sc b/tests_inputs/cadnano_v2_export/test_export_design_with_helix_group.sc index 9fdb0efb..441767a9 100644 --- a/tests_inputs/cadnano_v2_export/test_export_design_with_helix_group.sc +++ b/tests_inputs/cadnano_v2_export/test_export_design_with_helix_group.sc @@ -1,5 +1,5 @@ { - "version": "0.13.4", + "version": "0.15.0", "groups": { "east": { "position": {"x": 10, "y": 0, "z": 0}, diff --git a/tests_inputs/cadnano_v2_export/test_export_design_with_helix_group_not_same_grid.sc b/tests_inputs/cadnano_v2_export/test_export_design_with_helix_group_not_same_grid.sc index e4ba52da..63f9fc19 100644 --- a/tests_inputs/cadnano_v2_export/test_export_design_with_helix_group_not_same_grid.sc +++ b/tests_inputs/cadnano_v2_export/test_export_design_with_helix_group_not_same_grid.sc @@ -1,5 +1,5 @@ { - "version": "0.13.4", + "version": "0.15.0", "groups": { "east": { "position": {"x": 10, "y": 0, "z": 0}, diff --git a/tutorial/images/complete_design_no_DNA.png b/tutorial/images/complete_design_no_DNA.png index 0839077a..927750f9 100644 Binary files a/tutorial/images/complete_design_no_DNA.png and b/tutorial/images/complete_design_no_DNA.png differ diff --git a/tutorial/images/complete_design_with_DNA.png b/tutorial/images/complete_design_with_DNA.png index 13a9b84a..1ece303b 100644 Binary files a/tutorial/images/complete_design_with_DNA.png and b/tutorial/images/complete_design_with_DNA.png differ diff --git a/tutorial/images/design_no_deletions_no_DNA.png b/tutorial/images/design_no_deletions_no_DNA.png index 7d472eaa..2b75fd31 100644 Binary files a/tutorial/images/design_no_deletions_no_DNA.png and b/tutorial/images/design_no_deletions_no_DNA.png differ diff --git a/tutorial/images/design_with_helices_no_strands.png b/tutorial/images/design_with_helices_no_strands.png index 6c5afc8b..c87ae3b3 100644 Binary files a/tutorial/images/design_with_helices_no_strands.png and b/tutorial/images/design_with_helices_no_strands.png differ diff --git a/tutorial/images/excel_file.png b/tutorial/images/excel_file.png new file mode 100644 index 00000000..e016ef8d Binary files /dev/null and b/tutorial/images/excel_file.png differ diff --git a/tutorial/images/scaffold_complete.png b/tutorial/images/scaffold_complete.png index fe65beae..9032ba3d 100644 Binary files a/tutorial/images/scaffold_complete.png and b/tutorial/images/scaffold_complete.png differ diff --git a/tutorial/images/scaffold_precursor_strands.png b/tutorial/images/scaffold_precursor_strands.png index 254ca904..ac73c375 100644 Binary files a/tutorial/images/scaffold_precursor_strands.png and b/tutorial/images/scaffold_precursor_strands.png differ diff --git a/tutorial/images/scaffold_precursor_with_nicks.png b/tutorial/images/scaffold_precursor_with_nicks.png deleted file mode 100644 index 1007ff63..00000000 Binary files a/tutorial/images/scaffold_precursor_with_nicks.png and /dev/null differ diff --git a/tutorial/images/staple_precursors.png b/tutorial/images/staple_precursors.png index 4844a239..070e1693 100644 Binary files a/tutorial/images/staple_precursors.png and b/tutorial/images/staple_precursors.png differ diff --git a/tutorial/images/staple_precursors_with_crossovers.png b/tutorial/images/staple_precursors_with_crossovers.png new file mode 100644 index 00000000..6778520b Binary files /dev/null and b/tutorial/images/staple_precursors_with_crossovers.png differ diff --git a/tutorial/tutorial.md b/tutorial/tutorial.md index a2fd9c97..c05d6da6 100644 --- a/tutorial/tutorial.md +++ b/tutorial/tutorial.md @@ -7,7 +7,34 @@ See the [web interface tutorial](https://github.com/UC-Davis-molecular-computing +## Prerequisite knowledge +This tutorial assumes a basic knowledge of Python. Python is a very readable programming language, so if you know how to program, but not in Python, then you should be able to follow along. But if you are confused by some syntax, it might help to read the [Python tutorial](https://docs.python.org/3/tutorial/). + +Before going further in this tutorial, please read through the help for the web interface, specifically the description of [terminology](https://github.com/UC-Davis-molecular-computing/scadnano#terminology). We will use the terms described there in the rest of this tutorial. + +It will also be helpful to have available the [API documentation](https://scadnano-python-package.readthedocs.io). In this tutorial, we won't explain the full details of every function and method we use. If you wonder how it works, consult the API documentation. + +If you do know Python but haven't used the (somewhat recently developed) [type hints](https://docs.python.org/3/library/typing.html), then some of the syntax of function declarations may look strange. They are declaring argument (input) and return (output) types, for instance + +```python +def f(x, n): + return len(x) / n +``` + +can be annotated as follows to declare that it takes a string and an integer as input and returns a floating-point number: + +```python +def f(x: str, n: int) -> float: + return len(x) / n +``` + +Functions with no return type return `None`: + +```python +def g(x: int) -> None: + print(x*2) +``` @@ -23,7 +50,7 @@ The design will look like this when we are done: ![](images/complete_design_no_DNA.png) -The completed design is available as a [`.sc` file](https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano/master/web/examples/24_helix_origami_rectangle_twist_corrected.sc) readable by scadnano. Download it and save it somewhere on your local file system. +The completed design is available as a [`.sc` file](https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/master/examples/tutorial-examples/24_helix_rectangle.sc) readable by scadnano. Download it and save it somewhere on your local file system. To view it, first open scadnano in your browser: https://scadnano.org. @@ -31,55 +58,61 @@ Currently only [Chrome](https://www.google.com/chrome/) or [Firefox](https://www.mozilla.org/en-US/firefox/) are supported. -Select File→Open. Choose the file you downloaded. Alternatively, you can drag the file from your computer's file browser onto the open scadnano page in your web browser. The design should look similar to the first screenshot in the tutorial. +To open the file in scadnano, drag the file from your computer's file browser onto the open scadnano page in your web browser. +Alternatively, select File→Open, and choose the file you downloaded. +The design should look similar to the first screenshot in the tutorial. -## Terminology and API - -Before going further in this tutorial, please read through the help for the web interface, specifically the description of [terminology](https://github.com/UC-Davis-molecular-computing/scadnano#terminology). We will use the terms described there in the rest of this tutorial. - -It will also be helpful to have available the [API documentation](https://scadnano-python-package.readthedocs.io). In this tutorial, we won't explain the full details of every function and method we use. If you wonder how it works, consult the API documentation. - ## Create empty design Now we will see how to create the design using the Python scripting package. -We first note that the optional package [origami_rectangle](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/blob/master/scadnano/origami_rectangle.py) can be used to create DNA origami rectangles, but for the purpose of this tutorial, we will see how to do it just using the scadnano Python package in [scadnano.py](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/blob/master/scadnano/scadnano.py). +We first note that the module [origami_rectangle](../scadnano/origami_rectangle.py), included as part of the scadnano Python package, can be used to create DNA origami rectangles. However, for the purpose of this tutorial, we will see how to do it just using the scadnano Python module in [scadnano.py](../scadnano/scadnano.py). -Create an empty text file named `24_helix_rectangle_twist_corrected.py`, and paste the following text into it: +Create an empty text file named `24_helix_rectangle.py`, and paste the following text into it: ```python import scadnano as sc -def create_design(): - design = sc.Design(helices=[], strands=[], grid=sc.square) - return design -if __name__ == '__main__': +def main() -> None: design = create_design() design.write_scadnano_file() + + +def create_design() -> sc.Design: + design = sc.Design() + return design + + +if __name__ == '__main__': + main() ``` -Run this file from the command line by opening a terminal window, changing directory to the location of the file `24_helix_rectangle_twist_corrected.py`, and typing +The line `design = create_design()` creates an empty design with no helices and no strands, using no grid. +The line `design.write_scadnano_file()` writes the design to a `.sc` file with the same name (other than the file extension) of the currently running script. + +Run this file from the command line by opening a terminal window, changing directory to the location of the file `24_helix_rectangle.py`, and typing ```console -python 24_helix_rectangle_twist_corrected.py +python 24_helix_rectangle.py ``` Depending on your installation, you may have to type `python3` instead of `python`: ```console -python3 24_helix_rectangle_twist_corrected.py +python3 24_helix_rectangle.py ``` -In the same directory, a file named `24_helix_origami_rectangle_twist_corrected.sc` should appear. Open it in a text editor. The contents of the file should be something similar to this: +In the same directory, a file named `24_helix_rectangle.sc` should appear. Open it in a text editor. The contents of the file should be something similar to this: ```json { - "version": "0.10.0", + "version": "0.14.0", + "grid": "none", "helices": [], "strands": [] } @@ -90,75 +123,79 @@ This is a file format called [JSON format](https://en.wikipedia.org/wiki/JSON). - - - ## Add helices -As you can see, the simple script we wrote generates a design with no helices and no strands. It is not necessary to specify helices specifically in the `Design` constructor; if they are omitted, then constructor infers which helices are present by inspecting the `Domain`'s of the `strands` parameter. But we will specify them explicitly in order to see how to customize their properties. +As you can see, the simple script we wrote generates a design with no helices, no strands, using no grid. Now we see how to add helices in the square grid. -We want 24 helices. We need to ensure each helix has enough offsets for all the bases we will need. We will use a standard [M13mp18](https://www.ncbi.nlm.nih.gov/nuccore/X02513.1) scaffold strand, of length 7249. We won't use all of it, but we'll use most of it. Notice that 7249 / 24 ≈ 302, so length 304 per helix is sufficient. +We want 24 helices, stacked vertically on the square grid. We can give each helix an explicit [`grid_position`](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.Helix.grid_position) coordinate, but it turns out that if we just give a list of helices using the square grid with no `grid_position`'s set, they will be automatically stacked vertically. We need to ensure each helix has enough offsets for all the bases we will need, using the `max_offset` parameter in the `Helix` constructor. We will use a standard [M13mp18](https://www.ncbi.nlm.nih.gov/nuccore/X02513.1) scaffold strand, of length 7249. We won't use all of it, but we'll use most of it. It turns out that 288 offsets will be enough for us to use close to 7000 of the bases of the scaffold. Change the Python file as follows. We marked the changed lines in `create_design()` with `###`: ```python import scadnano as sc + +def main() -> None: + design = create_design() + design.write_scadnano_file() + + def create_design(): - helices = [sc.Helix(max_offset=304) for _ in range(24)] ### - design = sc.Design(helices=helices, strands=[], grid=sc.square) ### + helices = [sc.Helix(max_offset=288) for _ in range(24)] ### + design = sc.Design(helices=helices, grid=sc.square) ### return design + if __name__ == '__main__': - design = create_design() - design.write_scadnano_file() + main() ``` -To save space, below we will omit the `import scadnano as sc` statement and `if __name__ == '__main__'` block at the bottom, and we will write only the `create_design()` function, as well as any other functions it calls as we write them: +To save space, below we will omit the `import scadnano as sc` statement, the `main()` function definition, and `if __name__ == '__main__'` block at the bottom, none of which will change for most of the tutorial, and we will write only the `create_design()` function, as well as any other functions it calls, as we write them: ```python def create_design(): - helices = [sc.Helix(max_offset=304) for _ in range(24)] - design = sc.Design(helices=helices, strands=[], grid=sc.square) + helices = [sc.Helix(max_offset=288) for _ in range(24)] ### + design = sc.Design(helices=helices, grid=sc.square) ### return design ``` -Execute this script and inspect the output `24_helix_rectangle_twist_corrected.sc` file: +Execute this script and inspect the output `24_helix_rectangle.sc` file: ```json { - "version": "0.5.0", + "version": "0.14.0", + "grid": "square", "helices": [ - {"max_offset": 304, "grid_position": [0, 0]}, - {"max_offset": 304, "grid_position": [0, 1]}, - {"max_offset": 304, "grid_position": [0, 2]}, - {"max_offset": 304, "grid_position": [0, 3]}, - {"max_offset": 304, "grid_position": [0, 4]}, - {"max_offset": 304, "grid_position": [0, 5]}, - {"max_offset": 304, "grid_position": [0, 6]}, - {"max_offset": 304, "grid_position": [0, 7]}, - {"max_offset": 304, "grid_position": [0, 8]}, - {"max_offset": 304, "grid_position": [0, 9]}, - {"max_offset": 304, "grid_position": [0, 10]}, - {"max_offset": 304, "grid_position": [0, 11]}, - {"max_offset": 304, "grid_position": [0, 12]}, - {"max_offset": 304, "grid_position": [0, 13]}, - {"max_offset": 304, "grid_position": [0, 14]}, - {"max_offset": 304, "grid_position": [0, 15]}, - {"max_offset": 304, "grid_position": [0, 16]}, - {"max_offset": 304, "grid_position": [0, 17]}, - {"max_offset": 304, "grid_position": [0, 18]}, - {"max_offset": 304, "grid_position": [0, 19]}, - {"max_offset": 304, "grid_position": [0, 20]}, - {"max_offset": 304, "grid_position": [0, 21]}, - {"max_offset": 304, "grid_position": [0, 22]}, - {"max_offset": 304, "grid_position": [0, 23]} + {"max_offset": 288, "grid_position": [0, 0]}, + {"max_offset": 288, "grid_position": [0, 1]}, + {"max_offset": 288, "grid_position": [0, 2]}, + {"max_offset": 288, "grid_position": [0, 3]}, + {"max_offset": 288, "grid_position": [0, 4]}, + {"max_offset": 288, "grid_position": [0, 5]}, + {"max_offset": 288, "grid_position": [0, 6]}, + {"max_offset": 288, "grid_position": [0, 7]}, + {"max_offset": 288, "grid_position": [0, 8]}, + {"max_offset": 288, "grid_position": [0, 9]}, + {"max_offset": 288, "grid_position": [0, 10]}, + {"max_offset": 288, "grid_position": [0, 11]}, + {"max_offset": 288, "grid_position": [0, 12]}, + {"max_offset": 288, "grid_position": [0, 13]}, + {"max_offset": 288, "grid_position": [0, 14]}, + {"max_offset": 288, "grid_position": [0, 15]}, + {"max_offset": 288, "grid_position": [0, 16]}, + {"max_offset": 288, "grid_position": [0, 17]}, + {"max_offset": 288, "grid_position": [0, 18]}, + {"max_offset": 288, "grid_position": [0, 19]}, + {"max_offset": 288, "grid_position": [0, 20]}, + {"max_offset": 288, "grid_position": [0, 21]}, + {"max_offset": 288, "grid_position": [0, 22]}, + {"max_offset": 288, "grid_position": [0, 23]} ], "strands": [] } ``` -At this point, and periodically throughout the tutorial, reload the file `24_helix_rectangle_twist_corrected.sc` in the scadnano web interface, to verify that it resembles the design you expect. (Recall that this can be done either by clicking File→Open or by dragging the file to the web browser opened to the scadnano site.) Unfortunately, since it is a browser-based application, there's no way to have it automatically reload whenever your local `24_helix_rectangle_twist_corrected.sc` file changes, for the same reason you wouldn't want arbitrary websites to start reading files on your computer without you explicitly uploading them. +At this point, and periodically throughout the tutorial, reload the file `24_helix_rectangle.sc` in the scadnano web interface, to verify that it resembles the design you expect. (Recall that this can be done either by clicking File→Open or by dragging the file to the web browser opened to the scadnano site.) Unfortunately, since it is a browser-based application, there's no way to have it automatically reload whenever your local `24_helix_rectangle.sc` file changes (for the same reason you wouldn't want arbitrary websites to start reading files on your computer without you explicitly uploading them). At this point, the design should look like this: @@ -181,50 +218,62 @@ However, it can be difficult to see how to write a single loop, or even a small We do this by creating a "precursor" design, which is not the final design, and then editing it by adding nicks and crossovers, which is done by calling methods on the `Design` object. -The scaffold is a good starting point. It is one long strand, but we won't specify it as such. Instead, we will specify it by drawing one strand on each helix, spanning the full length, and then modifying these strands with nicks and crossovers, eventually joining them into one long strand. +The scaffold is a good starting point. It is one long strand, but we won't specify it as such. Instead, we will specify it by drawing one strand on each helix, spanning the full length, and then modifying these strands with crossovers, eventually joining them into one long strand. -Each `Strand` is specified primarily by a list of `Domain`'s, and each `Domain` is specified primarily by 4 fields: -integer `helix` (actually, *index* of a helix), -boolean `forward` (direction of the `Domain`, i.e., is its 3' end at a higher or lower offset than its 5' end?), -integer `start` and `end` offsets. +We can use the function [Design.strand](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.Design.strand) to draw strands. It takes two integer arguments: a helix and an offset, and uses "chained method calls" to give a short syntax for specifying strands. In this case, depending on the helix, we either want the strand (in order from 5' end to 3' end) to start at offset 0 and move forward (right) 288, or start at offset 288 and move in reverse by 288 (i.e., move by -288). The bottommost helix, 23, is an exception, where we want the "nick" to be, so we actually want to draw two strands, with a break between them at the halfway point 144: ```python -def create_design(): - design = precursor_scaffolds() ### +def create_design() -> sc.Design: + helices = [sc.Helix(max_offset=288) for _ in range(24)] + design = sc.Design(helices=helices, grid=sc.square) + + add_scaffold_precursors(design) ### + return design -def precursor_scaffolds() -> sc.Design: - helices = [sc.Helix(max_offset=304) for _ in range(24)] - scaffolds = [sc.Strand([sc.Domain(helix=helix, forward=(helix % 2 == 0), start=8, end=296)]) - for helix in range(24)] - return sc.Design(helices=helices, strands=scaffolds, grid=sc.square) + +def add_scaffold_precursors(design: sc.Design) -> None: + for helix in range(0, 23, 2): # scaffold goes forward on even helices + design.strand(helix, 0).move(288).as_scaffold() + for helix in range(1, 23, 2): # scaffold goes reverse on odd helices + design.strand(helix, 288).move(-288).as_scaffold() + design.strand(23, 288).move(-144).as_scaffold() # bottom part of scaffold has a "nick" + design.strand(23, 144).move(-144).as_scaffold() # ``` -Execute the script. The file `24_helix_origami_rectangle_twist_corrected.sc` is getting large now, so we won't show the whole thing, but the `strands` field should be non-empty now and start something like this: +We drew the scaffold precursor on helix 23 as two strands, each half the length (144) of those on other helices (288). +But we could alternately think of it as one strand of length 288 that has had a "nick" created in the middle, so we could have created it similarly to the other helices and then called the method [Design.add_nick](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.Design.add_nick). This is how we will create the staples later, which have many more nicks on each helix than the scaffold. + +The chained method calls in this case don't show how to create a strand with crossovers; see the [example on the README page](https://github.com/UC-Davis-molecular-computing/scadnano-python-package#abbreviated-syntax-with-chained-methods) for a more representative example of creating a complete strand spanning several helices with chained method calls. + +Execute the script. The file `24_helix_rectangle.sc` is getting large now, so we won't show the whole thing, but the `strands` field should be non-empty now and start something like this: ```json "strands": [ - { - "color": "#f74308", - "domains": [ - {"helix": 0, "forward": true, "start": 8, "end": 296} - ] - }, - { - "color": "#57bb00", - "domains": [ - {"helix": 1, "forward": false, "start": 8, "end": 296} - ] - }, - { - "color": "#888888", - "domains": [ - {"helix": 2, "forward": true, "start": 8, "end": 296} - ] - }, - { - "color": "#32b86c", + { + "color": "#0066cc", + "domains": [ + {"helix": 0, "forward": true, "start": 0, "end": 288} + ], + "is_scaffold": true + }, + { + "color": "#0066cc", + "domains": [ + {"helix": 2, "forward": true, "start": 0, "end": 288} + ], + "is_scaffold": true + }, + { + "color": "#0066cc", + "domains": [ + {"helix": 4, "forward": true, "start": 0, "end": 288} + ], + "is_scaffold": true + }, + { + "color": "#0066cc", ... ``` @@ -239,43 +288,28 @@ The design should look like this: - ## Aside: offsets are inclusive on the left and exclusive on the right -It is worth noting that the `start` and `end` offsets follow the standard programming convention of being inclusive for `start` and exclusive for `end`. In other words, for each of these strands, which all have `start`=8 and `end`=296, the set of offsets that each occupies is {8, 9, 10, ..., 294, 295}. This can be confusing, but it often makes code easier to think about. For example, setting the `end` of one strand to be equal to the `start` of another means that they are adjacent (i.e., appear to be one strand with a "nick" at the shared offset). - - - - - - +Note that each domain has a `start` (left) and `end` (right) offset. These follow the standard programming convention of being inclusive for `start` and exclusive for `end`. In other words, for each of these strands, which all have `start`=0 and `end`=288, the set of offsets that each occupies is {0, 1, 2, ..., 286, 287}. This can be confusing, but it often makes code easier to think about. For example, setting the `end` of one strand to be equal to the `start` of another means that they are adjacent (i.e., appear to be one strand with a "nick" at the shared offset). If you find the two scaffold precursor strands on helix 23 in the file `24_helix_rectangle.sc`, you can see this: - - -## Add nicks to scaffold - -Currently, neither the [Python scripting library](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/issues/14) nor the [web interface](https://github.com/UC-Davis-molecular-computing/scadnano/issues/5) for scadnano supports circular strands. However, if we add crossovers prematurely, we could mistakenly introduce a circular strand in an intermediate design, which would cause the script to raise an error. So generally it is best to add all the nicks we require first, to separate the strands as much as possible. - -For the scaffold, we want nicks all along the "seam" (the offsets near the middle, other than the topmost helix). Since we are done writing the function `precursor_scaffolds()`, we will omit its definition from the code below: - -```python -def create_design(): - design = precursor_scaffolds() - - add_scaffold_nicks(design) ### - - return design - -def add_scaffold_nicks(design: sc.Design): - for helix in range(1, 24): - design.add_nick(helix=helix, offset=152, forward=helix % 2 == 0) +```json + { + "color": "#0066cc", + "domains": [ + {"helix": 23, "forward": false, "start": 144, "end": 288} + ], + "is_scaffold": true + }, + { + "color": "#0066cc", + "domains": [ + {"helix": 23, "forward": false, "start": 0, "end": 144} + ], + "is_scaffold": true + } ``` -Now the design should look like this: - -![](images/scaffold_precursor_with_nicks.png) - @@ -290,36 +324,32 @@ This contrasts a so-called *half crossover*, depicted here: ![a half crossover](images/half_crossover.png) -We add full crossovers at the seam and half crossovers at the left and right edges of the helices. Note that the offset specified for a full crossover is that of the half crossover on the right side. +We add full crossovers at the seam and half crossovers at the left and right edges of the helices. +Note that the offset specified for a full crossover is that of the half crossover on the right side. +Note also that when specifying the offset of a half crossover, it is inclusive, even if it occurs on the `end` offset of a domain, e.g., the half crossover at offset 287 (inclusive) joins two domains whose `end` offsets are 288 (exclusive). -Also, at this point the scaffold is a single strand, so we can call `set_scaffold()` to set it as the scaffold. ```python -def create_design(): - design = precursor_scaffolds() - add_scaffold_nicks(design) +def create_design() -> sc.Design: + helices = [sc.Helix(max_offset=288) for _ in range(24)] + design = sc.Design(helices=helices, grid=sc.square) + add_scaffold_precursors(design) add_scaffold_crossovers(design) ### - design.strands[0].set_scaffold() ### return design -def add_scaffold_crossovers(design: sc.Design): - crossovers = [] - - # scaffold interior: full crossovers - for helix in range(1, 23, 2): - crossovers.append(sc.Crossover(helix=helix, helix2=helix + 1, offset=152, forward=False)) - - # scaffold edges: half crossovers - for helix in range(0, 23, 2): - crossovers.append(sc.Crossover(helix=helix, helix2=helix + 1, offset=8, forward=True, half=True)) - crossovers.append(sc.Crossover(helix=helix, helix2=helix + 1, offset=295, forward=True, half=True)) +def add_scaffold_crossovers(design: sc.Design) -> None: + for helix in range(1, 23, 2): # scaffold interior crossovers + design.add_full_crossover(helix=helix, helix2=helix + 1, offset=144, forward=False) - design.add_crossovers(crossovers) + for helix in range(0, 23, 2): # scaffold edges crossovers + design.add_half_crossover(helix=helix, helix2=helix + 1, offset=0, forward=True) + design.add_half_crossover(helix=helix, helix2=helix + 1, offset=287, forward=True) # offset inclusive ``` -There is a method `Design.add_crossover`, but we use the batch method `Design.add_crossovers`. This allows us to build up a list of `Crossover`'s first before adding them, which helps to avoid creating circular `Strand`'s in the intermediate stages. + +If you inspect carefully, you'll see that we are adding some crossovers (the "interior" crossovers) at offsets where nicks, i.e., 5'/3' ends of strands, do not exist already; the nicks are automatically created when calling `add_full_crossover`. This only works for `add_full_crossover`; the method `add_half_crossover` can only be given offsets corresponding to 5'/3' ends of strands. Now the design should look like this: @@ -332,23 +362,33 @@ Now the design should look like this: ## Add staple precursors -We added the scaffold precursor strands by giving them in the constructor for `Design`, but now the `Design` is created, so we cannot call the constructor again. +We used chained method calls to create scaffold precursor strands. +It is also possible, though typically more verbose, to explicitly create `Domain` objects, to be passed into the `Strand` constructor. +For the staple precursor strands we do this to show how it works. + +Each `Strand` is specified primarily by a list of `Domain`'s, and each `Domain` is specified primarily by 4 fields: +integer `helix` (actually, *index* of a helix), +Boolean `forward` (direction of the `Domain`, i.e., is its 3' end at a higher or lower offset than its 5' end?), +integer `start` and `end` offsets. + + To add staples, we use the method `design.add_strand`. In general, modifying an existing design should always be done through methods rather than modifying the fields directly, although it is safe to access the fields read-only. ```python -def create_design(): - design = precursor_scaffolds() - add_scaffold_nicks(design) +def create_design() -> sc.Design: + helices = [sc.Helix(max_offset=288) for _ in range(24)] + design = sc.Design(helices=helices, grid=sc.square) + + add_scaffold_precursors(design) add_scaffold_crossovers(design) - design.strands[0].set_scaffold() - add_precursor_staples(design) ### + add_staple_precursors(design) ### return design -def add_precursor_staples(design: sc.Design): - staples = [sc.Strand([sc.Domain(helix=helix, forward=helix % 2 == 1, start=8, end=296)]) +def add_staple_precursors(design: sc.Design) -> None: + staples = [sc.Strand([sc.Domain(helix=helix, forward=helix % 2 == 1, start=0, end=288)]) for helix in range(24)] for staple in staples: design.add_strand(staple) @@ -362,62 +402,77 @@ The design should now look like this: -## Add nicks to staples -The nicks are spacedly regularly between staples: + + + + + +## Add crossovers to staples + +The staple crossovers are spaced fairly regularly between any two pairs of adjacent helices, the only complications being +1) the leftmost crossover is at offset 16 or 32 depending on the parity of the two helix indices, and +2) We omit staple crossovers at the seam. ```python -def create_design(): - design = precursor_scaffolds() - add_scaffold_nicks(design) +def create_design() -> sc.Design: + helices = [sc.Helix(max_offset=288) for _ in range(24)] + design = sc.Design(helices=helices, grid=sc.square) + + add_scaffold_precursors(design) add_scaffold_crossovers(design) - design.strands[0].set_scaffold() - add_precursor_staples(design) - add_staple_nicks(design) ### + add_staple_precursors(design) + add_staple_crossovers(design) ### return design - -def add_staple_nicks(design: sc.Design): - for helix in range(24): - start_offset = 32 if helix % 2 == 0 else 48 - for offset in range(start_offset, 280, 32): - design.add_nick(helix, offset, forward=helix % 2 == 1) +def add_staple_crossovers(design: sc.Design) -> None: + for helix in range(23): + start_offset = 16 if helix % 2 == 0 else 32 + for offset in range(start_offset, 288, 32): + if offset != 144: # skip crossover near seam + design.add_full_crossover(helix=helix, helix2=helix + 1, offset=offset, + forward=helix % 2 == 1) ``` + The design should now look like this: -![](images/staple_precursors_with_nicks.png) +![](images/staple_precursors_with_crossovers.png) + -## Add crossovers to staples -Since staples are now less connected than the scaffold was at this stage, we don't need to be as careful to avoid creating a circular strand, so we can add crossovers one at a time using repeated calls to the method `add_full_crossover`. + + +## Add nicks to staples + +The nicks are spacedly regularly between staples: ```python -def create_design(): - design = precursor_scaffolds() - add_scaffold_nicks(design) +def create_design() -> sc.Design: + helices = [sc.Helix(max_offset=288) for _ in range(24)] + design = sc.Design(helices=helices, grid=sc.square) + + add_scaffold_precursors(design) add_scaffold_crossovers(design) - design.strands[0].set_scaffold() - add_precursor_staples(design) - add_staple_nicks(design) - add_staple_crossovers(design) ### + add_staple_precursors(design) + add_staple_crossovers(design) + add_staple_nicks(design) ### return design -def add_staple_crossovers(design: sc.Design): - for helix in range(23): + +def add_staple_nicks(design: sc.Design) -> None: + for helix in range(24): start_offset = 24 if helix % 2 == 0 else 40 - for offset in range(start_offset, 296, 32): - if offset != 152: # skip crossover near seam - design.add_full_crossover(helix=helix, helix2=helix+1, offset=offset, forward=helix%2==1) + for offset in range(start_offset, 272, 32): + design.add_nick(helix, offset, forward=helix % 2 == 1) ``` -If you inspect carefully, you'll see that we are adding crossovers at offsets where nicks, i.e., 5'/3' ends of strands, do not exist already; the nicks are automatically created when calling `add_full_crossover`. This only works for `add_full_crossover`; the method `add_half_crossover` can only be given offsets corresponding to 5'/3' ends of strands. The design is now mostly complete: @@ -426,28 +481,32 @@ The design is now mostly complete: + + ## Add deletions for twist correction To achieve "twist correction" (See [this paper](https://www.nature.com/articles/nchem.1070) for an explanation of twist correction in 2D DNA origami), we add deletions every 3rd "column" of staples: ```python -def create_design(): - design = precursor_scaffolds() - add_scaffold_nicks(design) +def create_design() -> sc.Design: + helices = [sc.Helix(max_offset=288) for _ in range(24)] + design = sc.Design(helices=helices, grid=sc.square) + + add_scaffold_precursors(design) add_scaffold_crossovers(design) - design.strands[0].set_scaffold() - add_precursor_staples(design) - add_staple_nicks(design) + + add_staple_precursors(design) add_staple_crossovers(design) + add_staple_nicks(design) - add_deletions(design) ### + add_twist_correction_deletions(design) ### return design -def add_deletions(design: sc.Design): +def add_twist_correction_deletions(design: sc.Design) -> None: for helix in range(24): - for offset in range(27, 294, 48): + for offset in range(19, 286, 48): design.add_deletion(helix, offset) ``` @@ -462,25 +521,27 @@ The design now looks like it did at the top: Finally, we complete the design by assigning a DNA sequence to the scaffold, which will assign the complementary sequence to the appropriate staples. This is, in a sense, the primary function of [cadnano](https://cadnano.org/) and scadnano: to translate a desired abstract strand design, together with knowledge of a concrete DNA sequence for the scaffold, into the appropriate sequences for the staples to enable them to bind to the scaffold where we want. -If you have a particular strand and sequence you would like to assign, you can call `design.assign_dna(strand, sequence)`. However, in the common case that your design has one scaffold, and you want to assign the sequence of [M13mp18](https://www.ncbi.nlm.nih.gov/nuccore/X02513.1) to it, there is a convenience method: +If you have a particular strand and sequence you would like to assign, you can call [`Design.assign_dna`](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.Design.assign_dna). However, in the common case that your design has exactly one scaffold, and you want to assign the sequence of [M13mp18](https://www.ncbi.nlm.nih.gov/nuccore/X02513.1) to it, there is a convenience method [Design.assign_m13_to_scaffold](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.Design.assign_m13_to_scaffold): ```python -def create_design(): - design = precursor_scaffolds() - add_scaffold_nicks(design) +def create_design() -> sc.Design: + helices = [sc.Helix(max_offset=288) for _ in range(24)] + design = sc.Design(helices=helices, grid=sc.square) + + add_scaffold_precursors(design) add_scaffold_crossovers(design) - design.strands[0].set_scaffold() - add_precursor_staples(design) - add_staple_nicks(design) + + add_staple_precursors(design) add_staple_crossovers(design) - add_deletions(design) + add_staple_nicks(design) + add_twist_correction_deletions(design) design.assign_m13_to_scaffold() ### return design ``` -If we load this design and check "show DNA" in the menu, we can see the full DNA sequence assigned: +If we load this design and check the menu item View→Show DNA, we can see the full DNA sequence assigned: ![](images/complete_design_with_DNA.png) @@ -499,35 +560,25 @@ for strand in design.strands: Or you could use Python's I/O library to write them to a file in a format of your choosing. -scadnano provides utility methods `write_idt_bulk_input_file` (for ordering in test tubes) and `write_idt_plate_excel_file` (for ordering in 96- or 384-well plates) for exporting to file formats recognized by the DNA synthesis company IDT ([Integrated DNA Technologies](https://www.idtdna.com/pages)). To use either method, each strand must have a field called `idt` set specifying the information that IDT expects, but we can call `strand.set_default_idt(use_default_idt=True)` to choose a reasonable default: - -```python -def create_design(): - design = precursor_scaffolds() - add_scaffold_nicks(design) - add_scaffold_crossovers(design) - design.strands[0].set_scaffold() - add_precursor_staples(design) - add_staple_nicks(design) - add_staple_crossovers(design) - add_deletions(design) - design.assign_m13_to_scaffold() +scadnano provides utility methods +[`Design.write_idt_bulk_input_file`](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.Design.write_idt_plate_excel_file) (for ordering in test tubes) and [`Design.write_idt_plate_excel_file`](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.Design.write_idt_bulk_input_file) (for ordering in 96- or 384-well plates) for exporting to file formats recognized by the DNA synthesis company IDT ([Integrated DNA Technologies](https://www.idtdna.com/pages)). - export_idt_plate_file(design) ### +Since this doesn't change the design, we put the code to export the IDT plate file outside of the `create_design()` function, in our `main()` function: - return design +```python +def main() -> None: + design = create_design() + design.write_scadnano_file() + design.write_idt_plate_excel_file() ### +``` +This will write a Microsoft Excel file named `24_helix_rectangle.xls` readable by the web interface of IDT for used when ordering strands in 96-well plates: https://www.idtdna.com/site/order/plate/index/dna/1800 -def export_idt_plate_file(design: sc.Design): - for strand in design.strands: - if strand != design.scaffold: - strand.set_default_idt(use_default_idt=True) - design.write_idt_plate_excel_file(use_default_plates=True) -``` +The Excel file should look similar to this: -This will write an Excel file named `24_helix_origami_rectangle_twist_corrected.xls` readable by the web interface of IDT for used when ordering strands in 96-well plates: https://www.idtdna.com/site/order/plate/index/dna/1800 +![](images/excel_file.png) -There are many options to customize how the strands are exported and what information goes into the `idt` field (e.g., purification, synthesis scale); see the [API documentation](https://scadnano-python-package.readthedocs.io/#scadnano.scadnano.Design.write_idt_plate_excel_file). +To customize further (e.g., purification, synthesis scale), one can write to the field `Strand.idt`, of type [IDTFields](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.IDTFields). @@ -539,85 +590,76 @@ The complete script is here: import scadnano as sc -def create_design(): - design = precursor_scaffolds() - add_scaffold_nicks(design) +def main() -> None: + design = create_design() + design.write_scadnano_file() + design.write_idt_plate_excel_file() + + +def create_design() -> sc.Design: + helices = [sc.Helix(max_offset=288) for _ in range(24)] + design = sc.Design(helices=helices, grid=sc.square) + + add_scaffold_precursors(design) add_scaffold_crossovers(design) - design.strands[0].set_scaffold() - add_precursor_staples(design) - add_staple_nicks(design) - add_staple_crossovers(design) - add_deletions(design) - design.assign_m13_to_scaffold() - export_idt_plate_file(design) - return design + add_staple_precursors(design) + add_staple_crossovers(design) + add_staple_nicks(design) -def export_idt_plate_file(design: sc.Design): - for strand in design.strands: - if strand != design.scaffold: - strand.set_default_idt(use_default_idt=True) - design.write_idt_plate_excel_file(use_default_plates=True) + add_twist_correction_deletions(design) + design.assign_m13_to_scaffold() + return design -def add_deletions(design: sc.Design): - for helix in range(24): - for offset in range(27, 294, 48): - design.add_deletion(helix, offset) +def add_scaffold_precursors(design: sc.Design) -> None: + for helix in range(0, 23, 2): # scaffold goes forward on even helices + design.strand(helix, 0).move(288).as_scaffold() + for helix in range(1, 23, 2): # scaffold goes reverse on odd helices + design.strand(helix, 288).move(-288).as_scaffold() + design.strand(23, 288).move(-144).as_scaffold() # bottom part of scaffold has a "nick" + design.strand(23, 144).move(-144).as_scaffold() # -def add_staple_crossovers(design: sc.Design): - for helix in range(23): - start_offset = 24 if helix % 2 == 0 else 40 - for offset in range(start_offset, 296, 32): - if offset != 152: # skip crossover near seam - design.add_full_crossover(helix=helix, helix2=helix + 1, offset=offset, - forward=helix % 2 == 1) +def add_scaffold_crossovers(design: sc.Design) -> None: + for helix in range(1, 23, 2): # scaffold interior crossovers + design.add_full_crossover(helix=helix, helix2=helix + 1, offset=144, forward=False) -def add_staple_nicks(design: sc.Design): - for helix in range(24): - start_offset = 32 if helix % 2 == 0 else 48 - for offset in range(start_offset, 280, 32): - design.add_nick(helix, offset, forward=helix % 2 == 1) + for helix in range(0, 23, 2): # scaffold edges crossovers + design.add_half_crossover(helix=helix, helix2=helix + 1, offset=0, forward=True) + design.add_half_crossover(helix=helix, helix2=helix + 1, offset=287, forward=True) -def add_precursor_staples(design: sc.Design): - staples = [sc.Strand([sc.Domain(helix=helix, forward=helix % 2 == 1, start=8, end=296)]) +def add_staple_precursors(design: sc.Design) -> None: + staples = [sc.Strand([sc.Domain(helix=helix, forward=helix % 2 == 1, start=0, end=288)]) # noqa for helix in range(24)] for staple in staples: design.add_strand(staple) -def precursor_scaffolds() -> sc.Design: - helices = [sc.Helix(max_offset=304) for _ in range(24)] - scaffolds = [sc.Strand([sc.Domain(helix=helix, forward=helix % 2 == 0, start=8, end=296)]) - for helix in range(24)] - return sc.Design(helices=helices, strands=scaffolds, grid=sc.square) - - -def add_scaffold_nicks(design: sc.Design): - for helix in range(1, 24): - design.add_nick(helix=helix, offset=152, forward=helix % 2 == 0) - +def add_staple_crossovers(design: sc.Design) -> None: + for helix in range(23): + start_offset = 16 if helix % 2 == 0 else 32 + for offset in range(start_offset, 288, 32): + if offset != 144: # skip crossover near seam + design.add_full_crossover(helix=helix, helix2=helix + 1, offset=offset, + forward=helix % 2 == 1) -def add_scaffold_crossovers(design: sc.Design): - crossovers = [] - # scaffold interior - for helix in range(1, 23, 2): - crossovers.append(sc.Crossover(helix=helix, helix2=helix + 1, offset=152, forward=False)) +def add_staple_nicks(design: sc.Design) -> None: + for helix in range(24): + start_offset = 24 if helix % 2 == 0 else 40 + for offset in range(start_offset, 272, 32): + design.add_nick(helix, offset, forward=helix % 2 == 1) - # scaffold edges - for helix in range(0, 23, 2): - crossovers.append(sc.Crossover(helix=helix, helix2=helix + 1, offset=8, forward=True, half=True)) - crossovers.append( - sc.Crossover(helix=helix, helix2=helix + 1, offset=295, forward=True, half=True)) - design.add_crossovers(crossovers) +def add_twist_correction_deletions(design: sc.Design) -> None: + for helix in range(24): + for offset in range(19, 286, 48): + design.add_deletion(helix, offset) if __name__ == '__main__': - design = create_design() - design.write_scadnano_file() + main() ```