Releases: UC-Davis-molecular-computing/scadnano-python-package
v0.17.3
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: allowDesign.plate_maps
parameterwell_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
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:
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:
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
toDesign.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
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:
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
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
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
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
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
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
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 callingStrand.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 functionorigami_rectangle.create()
Now, if you want to set a Strand to have anidt
field, it must be explicit, although theIDTFields
constructor only requires aname
parameter, so it's as easy asstrand.idt = IDTFields('name_of_strand')
if you are happy with the defaults for otheridt
fields such asidt.purification
.
- field
-
BREAKING CHANGE: Removed parameter
warning_on_non_idt_strands
from the IDT export methods onDesign
. Now, you can either ask those methods to skip exporting Strands lacking anidt
field by setting the parameteronly_strands_with_idt
to True, or let all (non-scaffold) strands be exported by settingonly_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
andDesign.add_full_crossover
methods, we have removed the methodDesign.add_crossovers
and the typeCrossover
. 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 callDesign.add_half_crossover
and/orDesign.add_full_crossover
repeatedly, i.e., replacecrossovers = [ 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
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