Skip to content

Releases: UC-Davis-molecular-computing/scadnano-python-package

v0.17.3

29 Mar 13:36
93978f2
Compare
Choose a tag to compare

Release notes

allow other table formats besides Markdown in Design.plate_maps

In a jupyter notebook cell, put this code:

import scadnano as sc

helices = [sc.Helix(max_offset=100)]
design = sc.Design(helices=helices, strands=[], grid=sc.square)
design.draw_strand(0, 0).move(10).with_name('strand 0').with_idt(plate='plate 1', well='A1')
design.draw_strand(0, 10).move(10).with_name('strand 1').with_idt(plate='plate 1', well='A2')
design.draw_strand(0, 20).move(10).with_name('strand 2').with_idt(plate='plate 1', well='B2')
design.draw_strand(0, 30).move(10).with_name('strand 3').with_idt(plate='plate 1', well='B3')
design.draw_strand(0, 40).move(10).with_name('strand 4').with_idt(plate='plate 1', well='D7')

from IPython.display import display, Markdown
def dm(o):
    display(Markdown(o))

plate_map = design.plate_maps()[0]
dm(plate_map.to_table(tablefmt='html', vertical_borders=True))

It should render

The returned HTML uses inline styles to ensure there are vertical borders between columns of the table. The vertical borders make it easier to see which column a well is in. This is useful when rendering in a Jupyter notebook, since the inline styles will be preserved when saving the Jupyter notebook using the nbconvert tool: https://nbconvert.readthedocs.io/en/latest/

Any format supported by the tabular package is supported as tablefmt for the method PlateMap.to_table(). See API for more details: https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.PlateMap.to_table

allow Design.plate_maps parameter well_marker to be function of well position

This code (note that strands do not require a name if using well_marker)

import scadnano as sc

helices = [sc.Helix(max_offset=100)]
design = sc.Design(helices=helices, strands=[], grid=sc.square)
design.draw_strand(0, 0).move(10).with_idt(plate='plate 1', well='A1')
design.draw_strand(0, 10).move(10).with_idt(plate='plate 1', well='A2')
design.draw_strand(0, 20).move(10).with_idt(plate='plate 1', well='B2')
design.draw_strand(0, 30).move(10).with_idt(plate='plate 1', well='B3')
design.draw_strand(0, 40).move(10).with_idt(plate='plate 1', well='D7')

plate_map = design.plate_maps()[0]
print(plate_map.to_table(well_marker=lambda x:x))

prints


### plate "plate 1"
|     | 1   | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9   | 10   | 11   | 12   |
|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:-----|:-----|:-----|
| A   | A1  | A2  |     |     |     |     |     |     |     |      |      |      |
| B   |     | B2  | B3  |     |     |     |     |     |     |      |      |      |
| C   |     |     |     |     |     |     |     |     |     |      |      |      |
| D   |     |     |     |     |     |     | D7  |     |     |      |      |      |
| E   |     |     |     |     |     |     |     |     |     |      |      |      |
| F   |     |     |     |     |     |     |     |     |     |      |      |      |
| G   |     |     |     |     |     |     |     |     |     |      |      |      |
| H   |     |     |     |     |     |     |     |     |     |      |      |      |

Commits

  • 1efd9ad: Closes #149; store DNA sequence in domains and loopouts, not in strand (#223) (Benjamin Lee) #223
  • 9e1a287: corrected docstring for Design.draw_strand (David Doty) #226
  • 243562d: Update scadnano.py (David Doty) #226
  • 7ed1610: Update tutorial.md (David Doty) #226
  • f9e10b6: Update tutorial.md (David Doty) #226
  • 45bf3ed: Update tutorial.md (David Doty) #226
  • 48f6b54: Update tutorial.md (David Doty) #226
  • 6610ef3: Update tutorial.md (David Doty) #226
  • d6aa2ba: Update tutorial.md (David Doty) #226
  • 0addd6d: Update tutorial.md (David Doty) #226
  • 9ab30af: Update tutorial.md (David Doty) #226
  • b09632f: Update scadnano.py (David Doty) #226
  • 3fd2a86: Update scadnano.py (David Doty) #226
  • e9ab4bc: Update scadnano.py (David Doty) #226
  • 7d9764b: added documentation about idt_dna_sequence in docstring for Strand.dna_sequence property. (David Doty) #225
  • 1150ea0: closes #224: allow other table formats besides Markdown in Design.plate_maps and closes #222: allow Design.plate_maps parameter well_marker to be function of well position (David Doty) #225
  • 9ec66bb: added tabulate as dependency to tests (David Doty) #225
  • 08bbf35: Update scadnano.py (David Doty) #226
  • 2fb3d35: bumped version (David Doty) #226

v0.17.2

06 Mar 17:43
27e4bde
Compare
Choose a tag to compare

Release notes

Change modification connector length

This mainly affects how modifications are viewed in the web interface.

You can now change the length of the modification connector. The connector is drawn like a hydrocarbon chain with a default of 4 links:

image

The base class Modification now has a connector_length field: https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.Modification.connector_length. Setting it will modify the displayed connector length in the web interface.

This is especially helpful to display modifications close to each other on a helix without their text overlapping:

image

Plate maps

You can now print a plate map of all or some of the strands in the design that have Strand.idt.plate and Strand.idt.well specified.

For example, the following code:

import scadnano as sc

helices = [sc.Helix(max_offset=100)]
design = sc.Design(helices=helices, strands=[], grid=sc.square)
design.draw_strand(0, 0).move(10).with_name('strand 0').with_idt(plate='plate 1', well='A1')
design.draw_strand(0, 10).move(10).with_name('strand 1').with_idt(plate='plate 1', well='A2')
design.draw_strand(0, 20).move(10).with_name('strand 2').with_idt(plate='plate 1', well='B2')
design.draw_strand(0, 30).move(10).with_name('strand 3').with_idt(plate='plate 1', well='B3')
design.draw_strand(0, 40).move(10).with_name('strand 4').with_idt(plate='plate 1', well='D7')

# plate_maps = design.plate_maps_markdown(well_marker='X', strands=[design.strands[0], design.strands[3]])
plate_maps = design.plate_maps_markdown()
plate_map = plate_maps['plate 1']
print(plate_map)

prints the following Markdown representation of the plate:

## plate 1
|     | 1        | 2        | 3        | 4   | 5   | 6   | 7        | 8   | 9   | 10   | 11   | 12   |
|-----|----------|----------|----------|-----|-----|-----|----------|-----|-----|------|------|------|
| A   | strand 0 | strand 1 |          |     |     |     |          |     |     |      |      |      |
| B   |          | strand 2 | strand 3 |     |     |     |          |     |     |      |      |      |
| C   |          |          |          |     |     |     |          |     |     |      |      |      |
| D   |          |          |          |     |     |     | strand 4 |     |     |      |      |      |
| E   |          |          |          |     |     |     |          |     |     |      |      |      |
| F   |          |          |          |     |     |     |          |     |     |      |      |      |
| G   |          |          |          |     |     |     |          |     |     |      |      |      |
| H   |          |          |          |     |     |     |          |     |     |      |      |      |

One can specify only a subset of strands, and use a different entry than the strand's name:

plate_maps = design.plate_maps_markdown(well_marker='X', strands=[design.strands[0], design.strands[3]])

which prints

## plate 1
|     | 1   | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9   | 10   | 11   | 12   |
|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|------|------|------|
| A   | X   |     |     |     |     |     |     |     |     |      |      |      |
| B   |     |     | X   |     |     |     |     |     |     |      |      |      |
| C   |     |     |     |     |     |     |     |     |     |      |      |      |
| D   |     |     |     |     |     |     |     |     |     |      |      |      |
| E   |     |     |     |     |     |     |     |     |     |      |      |      |
| F   |     |     |     |     |     |     |     |     |     |      |      |      |
| G   |     |     |     |     |     |     |     |     |     |      |      |      |
| H   |     |     |     |     |     |     |     |     |     |      |      |      |

method Design.strand changed to Design.draw_strand

The method Design.strand is not well-named. It has been changed to Design.draw_strand. The method Design.strand still exists for now but is deprecated. It prints a warning that it is deprecated and then simply calls Design.draw_strand.

Commits

  • 5051e87: added some detail about unique IDs to Modification docstring (David Doty) #221
  • dde8d5c: Update scadnano.py (David Doty) #221
  • 020631d: fixes #212: change length of modification "connector" (David Doty) #213
  • ca2522d: added parameter warn_duplicate_strand_names to scadnano and oxdna export (David Doty) #221
  • 35d0e56: Update scadnano.py (David Doty) #221
  • 13d11f5: Solving the bug pointed by test_crossover_to_same_helix.json (Tristan Stérin) #214
  • cce904c: stap_loop -> stapLoop (Tristan Stérin) #215
  • 6fe6447: Update scadnano.py (David Doty) #221
  • 2c88d95: fixed bug in JSON serialization of IDT fields and made PlateCoordinate public (though still undocumented) (David Doty) #221
  • ddd841d: closes #210: generate plate map (David Doty) #216
  • ea9357a: added strands and well_markers parameters to plate_maps_markdown to enable a subset of strands to be put in the plate map, and to enable the table to contain another marker besides the strand name such as an X (David Doty) #216
  • 1a8aa53: updated docstrings for plate_maps_markdown (David Doty) #221
  • b330d3c: Bug is fixed (Tristan Stérin) #217
  • 6170f98: Bug is fixed (Tristan Stérin) #217
  • 9d9538d: closes #219: change Design.strand to Design.draw_strand (David Doty) #220
  • 11702b2: added back method Design.strand (David Doty) #220
  • 4f8c28c: removed several docstring references to deprecated method Design.strand (David Doty) #220

v0.16.3

03 Aug 17:12
d579a40
Compare
Choose a tag to compare

fixed bug in oxDNA export

We fixed a bug (#188) in oxDNA export that made the helix roll go the opposite rotational direction from where it should have been.

handling paranemic crossovers in cadnano export

The previous cadnano export did not correctly handle paranemic crossovers (#185): crossovers that join domains going in the same direction:

image

Commits

  • ce5163a: bumped version (David Doty) #191
  • c83501f: changed .conf to .dat file extension in oxDNA export (David Doty) #191
  • a5b3ad1: Update scadnano.py (David Doty) #191
  • 309a8c1: Update scadnano.py (David Doty) #191
  • 686abfc: fixed bug with file writing methods that allow use to specify optional filename with no extension (David Doty) #191
  • 337fd1b: Bug fix helix number was badly set in cadnano export (Tristan Stérin) #189
  • a474796: Adding cases in _cadnano_v2_place_crossover for paranemic crossovers (Tristan Stérin) #189
  • 865b947: Un-ignoring test file (Tristan Stérin) #189
  • 18aee03: Un-ignoring test file (Tristan Stérin) #189
  • e128a3a: Merge branch 'dev' into bug_paranemic_crossovers (Cosmo Stérin) #189
  • bf1a5e7: fixed sign error causing roll to be applied in the wrong direction (Daniel Hader) #190
  • 447c999: fixes #188 (Daniel Hader) #190

v0.16.2

30 Jul 23:59
ab4a541
Compare
Choose a tag to compare

Fixes bugs in oxDNA export that would cause exported files not to be simulatable on oxDNA (due to non-cubic bounding box) and that, even with a cubic bounding box, would cause stable structures to melt.

Commits

  • f01be0f: corrected bad forward vector in oxDNA export that caused DNA origami to melt upon relaxation in oxDNA (Daniel Hader) #183
  • 7bee4b1: updated oxDNA export to use cubic bounding box (taking all three sides to be max of computed bounding box) (David Doty) #187
  • a4af148: bumped version (David Doty) #187
  • cf18744: added Python 3.9 to list of versions unit tested on GitHub CI action (David Doty) #187

v0.16.1

18 Jul 17:46
a146ac6
Compare
Choose a tag to compare

New features:

export to oxDNA

See #139. There is now a method Design.write_oxdna_files() that can write files representing the scadnano Design readable by the tool oxDNA and the web app oxView.

oxView can be used to visualize the intended 3D structure of the design, with base positions inferred based on Helix (x,y,z) position and (pitch, yaw, roll) orientation angles. oxDNA can be used to simulate physical stress and motion to predict an expected 3D structure.

You can also call Design.to_oxdna_format() to get the two strings that are written to the two oxDNA files when calling Design.write_oxdna_files().

export to IDT plates rebalances strands among last two plates if the last plate has too few strands

See #177. Calling Design.write_idt_plate_excel_file() will now rebalance strands in the last two plates if necessary to ensure that each plate has the minimum required not to be charged extra by IDT. (24 strands for a 96-well plate, and 96 strands for a 384-well plate).

For instance if there are 202 strands, previously the three 96-well plates would have had 96, 96, 10 strands respectively. Now they will have 96, 82, 24, respectively, moving 14 strands from the second plate to the third to ensure all have at least 24 strands.

Commits

  • 312e761: Implemented oxdna export, but still need to add unit tests (Benjamin Lee) #179
  • 37d4795: fixed bug where headers of conf file where not written (untested) (David Doty) #179
  • a77e695: Bug fix and cleanup of oxdna conversion functions and very basic unit test case (Daniel Hader) #179
  • d59c22d: added note to top of README that relative links won't work on PyPI site (David Doty) #182
  • 72137fd: Added Oxdna unit tests and additional comments (Anelise Cho) #179
  • 4cb98a2: Fixed OxDNA export issue where insertions would throw error, finished OxDNA export loopout unit test (Anelise Cho) #179
  • 3d62c92: Update scadnano_tests.py (Anelise Cho) #179
  • 49a259e: fixed Sphinx docstring error due to *'s being interpreted as emphasis (David Doty) #179
  • e6a9c8d: updated variable names in oxDNA export code (David Doty) #182
  • 1937acd: removed some PEP and mypy warnings and bumped version (David Doty) #182
  • 52a2a5e: fix purification/scale typo in to_idt_bulk_input_format (Constantine Evans) #180
  • c9401f7: closes #177; export to IDT plates rebalances strands among last two plates if the last plate has too few strands (David Doty) #181
  • 92699a7: updated IDT Excel export API documentation to discuss rebalancing among last two plates to ensure minimum strand count (David Doty) #181
  • 1f0d2c5: Update CONTRIBUTING.md (David Doty) #182
  • 7f8f336: Update CONTRIBUTING.md (David Doty) #182
  • c6dcd00: Update CONTRIBUTING.md (David Doty) #182
  • 4c8b0e0: Update CONTRIBUTING.md (David Doty) #182
  • f996834: closes #139 (not this commit actually, but I want this to show up in the release notes) (David Doty) #182

v0.16.0

23 May 20:48
aa7a624
Compare
Choose a tag to compare

Breaking Changes

Helix.pitch and Helix.yaw have been removed

The fields Helix.pitch and Helix.yaw have been removed to ensure that all helices within a HelixGroup are parallel.

If you want to set pitch and yaw for a helix, put them into a HelixGroup with the desired pitch/yaw.

# old
helix = sc.Helix(pitch=90)


# new
pitch90_helix_group = sc.HelixGroup(pitch=90)
helix = sc.Helix(group='pitch90')

Note that the name of a HelixGroup, such as 'pitch90' above, is not stored in the HelixGroup itself, but is the key in the map Design.groups.

If you want to look up pitch and yaw of a helix, use design.pitch_of_helix or design.yaw_of_helix respectively:

pitch = design.pitch_of_helix(helix)
yaw = design.yaw_of_helix(helix)

which returns the pitch and yaw of helix's HelixGroup.

Helix.roll is still a valid field. Use design.roll_of_helix to compute the roll of the helix added to the roll specified in its HelixGroup:

roll = design.roll_of_helix(helix)

grid fields are of type Grid, not str or None

Library now checks that grid fields are of type Grid, not str or None. This will break existing code that was manually passing in strings for the grid parameter.

Commits

  • [a1ee18b]: bumped version to 0.15.2 (David Doty) #175
  • [60a07da]: remove debug print hello (Constantine Evans) #165
  • [e322fbe]: Fixes #163; Remove Helix.pitch and Helix.yaw (#166) (Benjamin Lee) #166
  • [bccc3ad]: added docstring to Strand.idt_dna_sequence and stub for to_oxdna_format (David Doty) #175
  • [860ae9a]: Encoder indent suppression: str.replace → re.sub (fixes #170) (Constantine Evans) #171
  • [93a8135]: add optional parameter suppress_indent to method Design.write_scadnano_file; closes #170 (David Doty) #175
  • [1f0a233]: Fix Sphinx warning on idt_dna_sequence (Benjamin Lee) #172
  • [8ca07f9]: fixed indenting on idt_dna_sequence docstring to suppress Sphinx warning (David Doty) #175
  • [da1eadd]: fixed write_scadnano_file and to_json docstrings (David Doty) #175
  • [418d4b5]: Merge branch 'dev' into dev-fix-sphinx-warning (David Doty) #172
  • [f0fbe53]: updated Sphinx to add view code option, and put type hints in parameter and return description (David Doty) #175
  • [cad6674]: fixed some docstrings and autoformatted code (David Doty) #175
  • [73bb35d]: fixed PEP warnings (David Doty) #175
  • [35b33aa]: fixes #168: ensure grid fields are of type Grid, not str or None (David Doty) #175
  • [7f1f591]: Update tutorial.md (David Doty) #175
  • [737570e]: Redirect workflow from master to main (Benjamin Lee) #175
  • [08ecf96]: Fixes #176; Rewrite doc test (Benjamin Lee) #178

v0.15.1

15 Jan 23:07
b6cd698
Compare
Choose a tag to compare

Not much new, mainly this release is to alter the documentation to clarify that scadnano is a separate project from cadnano.

Commits

  • [fb249d8]: bumped version to 0.15.1 (David Doty) #162
  • [6ce55c2]: added to README note clarifying difference between scadnano and cadnano, and table of contents (David Doty) #162
  • [cb09bfa]: added to API documentation note clarifying difference between scadnano and cadnano (David Doty) #162
  • [bed7b3c]: Update tutorial.md (David Doty) #162
  • [05e76b9]: updated API docs to link from assign_m13_to_scaffold method to M13Variant enumerated type (David Doty) #162

v0.15.0

14 Jan 19:57
e0cd9c8
Compare
Choose a tag to compare

BREAKING CHANGE: The field Strand.idt.name has been removed. Since each Strand now has a name field, that is used instead. So replace this:

# old
idt = IDTFields(name='staple1', plate='plate1', well='A1')
strand = Strand(domains=[domain], idt=idt)

with this:

# new
idt = sc.IDTFields(plate='plate1', well='A1')
strand = sc.Strand(domains=[domain], idt=idt, name='staple1')

and replace this:

# old
design.strand(0,0).move(8).with_idt(name='staple1', scale='25nm')

with this:

# new
design.strand(0,0).move(8).with_name('staple1').with_idt(scale='25nm')

Commits

  • [449f516]: updated docstrings (David Doty) #161
  • [658e9e4]: closes #154; re-make tutorial; The tutorial is now up-to-date with scadnano features as of Dec. 2020. (David Doty) #161
  • [30cbfcc]: Update tutorial.md (David Doty) #161
  • [6a3dea8]: Update tutorial.md (David Doty) #161
  • [4a122e9]: added note about offsets being inclusive for half crossovers (David Doty) #161
  • [1de2aa8]: Update tutorial.md (David Doty) #161
  • [2c2cb1e]: Update tutorial.md (David Doty) #161
  • [a5969f0]: Update tutorial.md (David Doty) #161
  • [7c03a5d]: Update tutorial.md (David Doty) #161
  • [1c09d6f]: Update tutorial.md (David Doty) #161
  • [c4ea9c0]: added note explaining type hints in tutorial (David Doty) #161
  • [77f3a05]: Update tutorial.md (David Doty) #161
  • [0fe9bf6]: added screenshot of Excel file to tutorial (David Doty) #161
  • [a563263]: Update tutorial.md (David Doty) #161
  • [3254605]: closes #159; remove IDT name field; now Strand.name is the official name of the strand; bumped minor version since this is a breaking change (David Doty) #160
  • [b096e5d]: updated installation instructions to indicate how to test if scadnano was installed successfully (David Doty) #161
  • [cfb2ffd]: Update README.md (David Doty) #161

v0.14.0

25 Dec 23:20
434ccc4
Compare
Choose a tag to compare

Exporting IDT files with default values for idt fields no longer requires first modifying the Strand.idt field

It is no longer necessary to modify the design to set the field Strand.idt in each Strand before calling the methods that export DNA sequences in IDT-formatted files. For staple strands with no idt field, a reasonable default for each value will be chosen.

So it is now possible to do this:

import scadnano as sc

design = sc.Design(helices=[sc.Helix(max_offset=100) for _ in range(2)], grid=sc.square)
design.strand(0, 0).move(8).cross(1).move(-8)
design.strand(0, 16).move(-8).cross(1).move(8)
design.assign_dna(strands[0], 'A'*16)
design.assign_dna(strands[1], 'C'*16)

# before the change, the next line would have skipped writing the two strands since they have no idt field set,
# now, reasonable defaults are used, without requiring the side-effect of writing the field Strand.idt
design.write_idt_plate_excel_file()

# to skip exporting strands that lack an idt field, specify the parameter only_strands_with_idt
# below, only the newly added strand with T's will be exported; the previous two will not
design.strand(0, 24).move(8).cross(1).move(-8).with_idt('only_strand_to_export')
design.assign_dna(strands[2], 'T'*16)
design.write_idt_plate_excel_file(only_strands_with_idt=True)

This implies several changes in the API

  • BREAKING CHANGE: Changed the export methods so that, by default (with no parameters specified), they behave differently. In particular, now by default they will export DNA sequences for all staple strands (i.e., non-scaffold), using the idt field of the Strand if it is present, and otherwise using reasonable defaults, the same defaults that previously were stored in the Strand by calling Strand.set_default_idt().

  • BREAKING CHANGE: Removed the following:

    • field Strand.use_default_idt
    • method Strand.set_default_idt()
    • method Design.set_default_idt()
    • parameter use_idt_defaults in function origami_rectangle.create()
      Now, if you want to set a Strand to have an idt field, it must be explicit, although the IDTFields constructor only requires a name parameter, so it's as easy as strand.idt = IDTFields('name_of_strand') if you are happy with the defaults for other idt fields such as idt.purification.
  • BREAKING CHANGE: Removed parameter warning_on_non_idt_strands from the IDT export methods on Design. Now, you can either ask those methods to skip exporting Strands lacking an idt field by setting the parameter only_strands_with_idt to True, or let all (non-scaffold) strands be exported by setting only_strands_with_idt to False (the default).

  • Added parameter export_scaffold to DNA sequence export methods to allow the scaffold(s) to be exported (False by default).

Crossover class and bulk Design.add_crossovers method removed

  • BREAKING CHANGE: (This one is unrelated to exporting IDT files; it is related to the circular strands implemented in v0.13.4.) Since circular strands make it easier to use the Design.add_half_crossover and Design.add_full_crossover methods, we have removed the method Design.add_crossovers and the type Crossover. Previously, that method helped avoid creating circular strands by allowing one to build up a list of Crossovers and add them in bulk, where adding them one at a time would have resulted in an intermediate circular strand, even if the final result had all linear strands. Now that circular strands are supported, this is no longer needed. The recommended method of adding many crossovers at once is simply to call Design.add_half_crossover and/or Design.add_full_crossover repeatedly, i.e., replace

    crossovers = [
        Crossover(helix=0, helix2=1, offset=16, forward=True, half=True),
        Crossover(helix=0, helix2=1, offset=24, forward=False, half=True),
        Crossover(helix=2, helix2=3, offset=32, forward=True),
        Crossover(helix=2, helix2=3, offset=40, forward=False),
    ]
    design.add_crossovers(crossovers)

    with this instead:

    design.add_half_crossover(helix=0, helix2=1, offset=16, forward=True)
    design.add_half_crossover(helix=0, helix2=1, offset=24, forward=False)
    design.add_full_crossover(helix=2, helix2=3, offset=32, forward=True)
    design.add_full_crossover(helix=2, helix2=3, offset=40, forward=False)

Commits

  • [d2e924c]: closes #111: write_idt_plate_excel_file uses reasonable defaults even when some strands have no IDT field set; bumped version (David Doty) #157
  • [b52a046]: updated examples to fully type annotate all functions and avoid name shadowing in if name=="main" blocks (David Doty) #157
  • [87a47d5]: fixed bug where scaffold property being lost when joining two strands (at least one of which was scaffold)by crossover; also reworked write_idt_plate_excel_file to work properly with default idt name if idt fields are not present in some strands (David Doty) #157
  • [b17a6a1]: minor documentation and identifier name updates (David Doty) #157
  • [c6620df]: cleaned up old links in package docstring (David Doty) #157
  • [e23f361]: re-ran examples after last commit (David Doty) #157
  • [0667935]: inlined creation of empty design in tutorial script (David Doty) #157
  • [424f478]: Update scadnano.py (David Doty) #157
  • [dd63418]: made Loopout generic type parameterized by DomainLabel (David Doty) #157
  • [7574058]: Update scadnano.py (David Doty) #157
  • [9e32cd4]: fixed documentation of Strand.rotate_domains (David Doty) #157
  • [3da17ec]: Merge branch 'dev' into write_idt_plate_excel_file-uses-reasonable-defaults (David Doty) #157

v0.13.4

24 Dec 17:39
bcbb349
Compare
Choose a tag to compare

Circular strands

Circular strands are now supported. (See #14.) In general, it is not recommended that a final design have circular strands. In particular, there are aspects of scadnano, such as naming conventions for strands and conventions for assigning DNA sequences, that assume the strand has a 5' and 3' end. Under the hood, the domains of a circular strand are still listed in some order, with the same constraint as before that a strand cannot begin or end with a loopout; see #2. In particular, this means a circular strand must have at least one crossover; it cannot be all loopouts linking the domains.

However, circular strands are convenient for the intermediate steps of a design, allowing one to add crossovers and join strands by ligation without worrying whether it will create a circular strand. But it is recommended, particularly before assigning DNA sequences, to linearize all circular strands (i.e., add a nick to break some domain into two, or remove a crossover somewhere). This includes even strands such as those representing M13 that are naturally circular. Otherwise the effect of assigning a DNA sequence is undefined. Operations that circularize and linearize strands with DNA sequences already assigned are similarly undefined and may change the DNA sequence in unexpected ways.

Strand DNA sequence export order

Previously, when exporting DNA sequences, they would be exported in whatever order the strands appear in the Design. Now, there are a few reasonable options to choose from. See #147.

Commits

  • [f524a56]: closes #147: allow row-major and column/major order of export of strands (David Doty) #156
  • [481d966]: updated unit tests (David Doty) #156
  • [76b4b64]: fixed documentation of hex coordinate system (David Doty) #156
  • [a1e7467]: fixed documentation of hex coordinate system (David Doty) #156
  • [9d1ac96]: fixed documentation of Loopout to say they are not allowed on ends of Strand, and added example of creating one with chained method calls. (David Doty) #156
  • [4b13ef2]: closes #14; add support for circular Strands (David Doty) #152
  • [893075f]: fixed docstring errors and bumped version (David Doty) #152
  • [7f5d3c9]: updated add_half_crossover and add_nick to handle circular strands (David Doty) #153
  • [84db6a8]: added ligate method to design and associated unit tests (David Doty) #156
  • [4a7dd1d]: added unit tests for nicking on circular strand with 3 domains and a loopout, nicking on all three domains (David Doty) #156
  • [8eda390]: Update scadnano_tests.py (David Doty) #156
  • [c58b832]: modified circular strand example script to have length 8 domains (David Doty) #156
  • [5b1d084]: bumped version to match web interface (David Doty) #156
  • [22d446e]: updated tutorial script (still not completely in line with #154, however, since issue #111 still need to be implemented) (David Doty) #156
  • [5f91962]: Modifications not needed in circular example (Cosmo) #155
  • [4ee5e28]: Importing circular strands from cadnano to scadnano is now functional. Two tests added: which come from cadnano Autostaple's output (Cosmo) #155
  • [6e27f5f]: Exporting designs with circular strands is working, un ignoring tests_inputs/cadnano_v2_export as some .sc files are not generated but directly read by the tests (Cosmo) #155
  • [675b542]: fixed mypy and PEP errors in cadnano import/export code (David Doty) #155