From d9cd90611cd146cf6ef5e2d67ee1669f6e5fe2ea Mon Sep 17 00:00:00 2001 From: David Doty Date: Sat, 21 Sep 2024 16:11:13 -0600 Subject: [PATCH 1/3] closes #306: allow per-helix-group geometry --- examples/1_staple_1_helix_origami_roll.py | 2 - .../2_staple_2_helix_helixgroup_geometry.py | 24 +++++++++ .../2_staple_2_helix_helixgroup_geometry.sc | 46 ++++++++++++++++++ scadnano/scadnano.py | 32 +++++++++--- tests/scadnano_tests.py | 7 ++- tests/test_excel_export_384.xlsx | Bin 0 -> 24526 bytes tests/test_excel_export_96.xls | Bin 11599 -> 0 bytes tests/test_excel_export_96.xlsx | Bin 0 -> 11194 bytes 8 files changed, 100 insertions(+), 11 deletions(-) create mode 100644 examples/2_staple_2_helix_helixgroup_geometry.py create mode 100644 examples/output_designs/2_staple_2_helix_helixgroup_geometry.sc create mode 100644 tests/test_excel_export_384.xlsx delete mode 100644 tests/test_excel_export_96.xls create mode 100644 tests/test_excel_export_96.xlsx diff --git a/examples/1_staple_1_helix_origami_roll.py b/examples/1_staple_1_helix_origami_roll.py index ff3f7417..e8a8e591 100644 --- a/examples/1_staple_1_helix_origami_roll.py +++ b/examples/1_staple_1_helix_origami_roll.py @@ -1,5 +1,3 @@ -import math - import scadnano as sc def create_design() -> sc.Design: diff --git a/examples/2_staple_2_helix_helixgroup_geometry.py b/examples/2_staple_2_helix_helixgroup_geometry.py new file mode 100644 index 00000000..b89166f9 --- /dev/null +++ b/examples/2_staple_2_helix_helixgroup_geometry.py @@ -0,0 +1,24 @@ +import scadnano as sc + + +def create_design() -> sc.Design: + group0 = sc.HelixGroup(grid=sc.square) + group1 = sc.HelixGroup(grid=sc.square, geometry=sc.Geometry(bases_per_turn=18), + position=sc.Position3D(0, 3, 0)) + groups = {"group 0": group0, "group 1": group1} + helices = [sc.Helix(idx=idx, max_offset=40, group=group) for idx, group in + [(0, "group 0"), (1, "group 1")]] + design = sc.Design(helices=helices, groups=groups, strands=[]) + design.draw_strand(0, 0).move(40) + design.draw_strand(0, 40).move(-40) + design.draw_strand(1, 0).move(40) + design.draw_strand(1, 40).move(-40) + + return design + + +if __name__ == '__main__': + d = create_design() + d.write_scadnano_file(directory='output_designs') + d.from_scadnano_file('output_designs/2_staple_2_helix_helixgroup_geometry.sc') + print(f'design: {d.to_json()}') diff --git a/examples/output_designs/2_staple_2_helix_helixgroup_geometry.sc b/examples/output_designs/2_staple_2_helix_helixgroup_geometry.sc new file mode 100644 index 00000000..6625a192 --- /dev/null +++ b/examples/output_designs/2_staple_2_helix_helixgroup_geometry.sc @@ -0,0 +1,46 @@ +{ + "version": "0.19.4", + "groups": { + "group 0": { + "position": {"x": 0, "y": 0, "z": 0}, + "grid": "square" + }, + "group 1": { + "position": {"x": 0, "y": 3, "z": 0}, + "grid": "square", + "geometry": { + "bases_per_turn": 18 + } + } + }, + "helices": [ + {"group": "group 0", "grid_position": [0, 0]}, + {"group": "group 1", "grid_position": [0, 0]} + ], + "strands": [ + { + "color": "#f74308", + "domains": [ + {"helix": 0, "forward": true, "start": 0, "end": 40} + ] + }, + { + "color": "#57bb00", + "domains": [ + {"helix": 0, "forward": false, "start": 0, "end": 40} + ] + }, + { + "color": "#888888", + "domains": [ + {"helix": 1, "forward": true, "start": 0, "end": 40} + ] + }, + { + "color": "#32b86c", + "domains": [ + {"helix": 1, "forward": false, "start": 0, "end": 40} + ] + } + ] +} \ No newline at end of file diff --git a/scadnano/scadnano.py b/scadnano/scadnano.py index 548ee8a3..e1edc81f 100644 --- a/scadnano/scadnano.py +++ b/scadnano/scadnano.py @@ -54,7 +54,7 @@ # needed to use forward annotations: https://docs.python.org/3/whatsnew/3.7.html#whatsnew37-pep563 from __future__ import annotations -__version__ = "0.19.4" # version line; WARNING: do not remove or change this line or comment +__version__ = "0.19.5" # version line; WARNING: do not remove or change this line or comment import collections import dataclasses @@ -1315,6 +1315,14 @@ class HelixGroup(_JSONSerializable): grid: Grid = Grid.none """:any:`Grid` of this :any:`HelixGroup` used to interpret the field :data:`Helix.grid_position`.""" + geometry: Optional[Geometry] = None + """ + Optional custom :any:`Geometry` to specify for this :any:`HelixGroup`. If specified then + it is assumed to override the field :data:`Design.geometry`. This will affect, for instance, + where nucleotides and phosphate groups are placed when exporting to oxDNA or oxView via + :meth:`Design.to_oxview_format` or :meth:`Design.to_oxdna_format`. + """ + def has_default_position_and_orientation(self): # we don't bother checking grid or helices_view_order because those are written to top-level # fields of Design if the group is otherwise default @@ -1341,6 +1349,9 @@ def to_json_serializable(self, suppress_indent: bool = True, **kwargs: Any) -> D if self.helices_view_order != default_helices_view_order: dct[helices_view_order_key] = NoIndent(self.helices_view_order) + if self.geometry is not None: + dct[geometry_key] = self.geometry.to_json_serializable(suppress_indent) + return dct def _assign_default_helices_view_order(self, helices_in_group: Dict[int, 'Helix']) -> None: @@ -1372,12 +1383,19 @@ def from_json(json_map: dict, **kwargs: Any) -> HelixGroup: roll = json_map.get(roll_key, default_roll) yaw = json_map.get(yaw_key, default_yaw) - return HelixGroup(position=position, - pitch=pitch, - yaw=yaw, - roll=roll, - helices_view_order=helices_view_order, - grid=grid) + geometry = None + if geometry_key in json_map: + geometry = Geometry.from_json(json_map[geometry_key]) + + return HelixGroup( + position=position, + pitch=pitch, + yaw=yaw, + roll=roll, + helices_view_order=helices_view_order, + grid=grid, + geometry=geometry, + ) def helices_view_order_inverse(self, idx: int) -> int: """ diff --git a/tests/scadnano_tests.py b/tests/scadnano_tests.py index c3c48ebf..181edf8d 100644 --- a/tests/scadnano_tests.py +++ b/tests/scadnano_tests.py @@ -1282,7 +1282,7 @@ def test_write_idt_plate_excel_file(self) -> None: # add 10 strands in excess of 3 plates for plate_type in [sc.PlateType.wells96, sc.PlateType.wells384]: num_strands = 3 * plate_type.num_wells_per_plate() + 10 - filename = f'test_excel_export_{plate_type.num_wells_per_plate()}.xlsx' + filename = f'tests/test_excel_export_{plate_type.num_wells_per_plate()}.xlsx' max_offset = num_strands * strand_len helices = [sc.Helix(max_offset=max_offset) for _ in range(1)] design = sc.Design(helices=helices, strands=[], grid=sc.square) @@ -1307,7 +1307,10 @@ def test_write_idt_plate_excel_file(self) -> None: self.assertEqual(expected_wells + 1, sheet.max_row) - os.remove(filename) + try: + os.remove(filename) + except PermissionError as e: + print(f'could not remove file "{filename}" due to permission error') def test_export_dna_sequences_extension_5p(self) -> None: design = sc.Design(helices=[sc.Helix(max_offset=100)]) diff --git a/tests/test_excel_export_384.xlsx b/tests/test_excel_export_384.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d653144caa7e42b60d857546110e00c5f1eda57b GIT binary patch literal 24526 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 literal 0 HcmV?d00001 diff --git a/tests/test_excel_export_96.xls b/tests/test_excel_export_96.xls deleted file mode 100644 index bbdb3dd2b504ecac592004d6044dd6ccf15a6876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11599 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 NFi!!)oM(Vu{T~>Y&?W!? diff --git a/tests/test_excel_export_96.xlsx b/tests/test_excel_export_96.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..74accc6714fe45655ca529fb54acc8b9d11326dd GIT binary patch literal 11194 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 Date: Sat, 21 Sep 2024 16:19:22 -0600 Subject: [PATCH 2/3] removed xlwt from environment.yml --- environment.yml | 1 - tests/test_excel_export_384.xlsx | Bin 24526 -> 24526 bytes tests/test_excel_export_96.xlsx | Bin 11194 -> 11194 bytes 3 files changed, 1 deletion(-) diff --git a/environment.yml b/environment.yml index beb07965..dae5b567 100644 --- a/environment.yml +++ b/environment.yml @@ -4,7 +4,6 @@ channels: - defaults dependencies: - python=3.7 - - xlwt=1.3.0=py37_0 - pip - pip: - sphinx diff --git a/tests/test_excel_export_384.xlsx b/tests/test_excel_export_384.xlsx index d653144caa7e42b60d857546110e00c5f1eda57b..c1f3d0352ad1fb8159741fc742afafadbd5b82f9 100644 GIT binary patch delta 466 zcmX@NpYhy&MxFp~W)=|!1_lm>osAQD)(P%xG>tqK_0{)1P)wVNfkAMxV64c*`@Hog zp$9KKO+Bp6da&_Pv`1ca#O1apOYUyp-W%Qig8hSG`Tsxf$_siqFMSb=Pm(v7bhyO$ z*Ea7A!l4vVhQJi;cVbk~L%dhXrd$`MGm$AiPFTYEg54vL2_FsK{_S;0wgGX}@%5w$g zwoVAuegEV5n_q|DYrUy{UG`31I-VtzdH*}7T1MosFpZoUGe=o~je%i~Is=0+!{%3v z`fN-)8#haH+?N2+e-w6r>1~$(g+cu7z6aSsbX8~-6Of+#E&Mr%dq1L?5yVZ2`Uc|0 zL`Q(R+hS}uU_m|kSByDGiE*qwh$@M70a3fa)TB5t#|=XD#94x*j>m!2Pl~q&actw= JKvZkICjbMI%}f9Q delta 466 zcmX@NpYhy&MxFp~W)=|!1_lm>p5BQ(>jZmxO(W9g98l78Stgae z#B;?;@AN&U+;(-#%Gx5CZ!9|QAX#y;ab;$bO+9ZebNB%kWgokG@e6uKcK%W?d&gj{ z-u`A<$o=oB`)3tD=99U%ZT9rayN6nRtR!UWQ`KLJ6rRbm{?1~$(g+cu7z6aSsbX8~-6Of+#E&Mr%dq1L?5yVZ2`Uc|0 zL`Q(R+hS}uU_m|kSByDGiE*qwh$@M70a3fa)TB5t#|=XD#94x*j>m!2Pl~q&actw= JKvZkICjh!0#|;1g diff --git a/tests/test_excel_export_96.xlsx b/tests/test_excel_export_96.xlsx index 74accc6714fe45655ca529fb54acc8b9d11326dd..d506e23ff9a0d8cf5907a788977735941178a27e 100644 GIT binary patch delta 476 zcmdlLzAKz3z?+#xgn@y9gJEamM4ol^I~z?Sk41g;eGe4VW@2Cv1kx$_$pJtj>C{@lmu#UUbCewkJ#OZr|P;-Ts38 zgJJpqKkv#5dO0tB5sXigH<)y|#Q4`X?@KMB)&i`Y6V5R1^?N$y#j8Y;g zxFz#d&at45U(PeyS1K(*P)sSf*YuLhl`F@M@6BSBw@aR#c#UD(i;as}LL(W2KOZTO zy3Mw(LDEg4_Lts**p8jQ)XmBp=1xv7^3IZID_T*UcWYtO_vg#6@5y_(%Vn3b#a}PK zOPUY5V%7FveSP-ZM9qUoa}UaM1?IL+2-SW6L+SXNUx(joy{Ud(_D)_po+Xrd|2wBz zM&wZ1e2dYZjcI4&W@(N#b`ZUoe=(T$5WfxmrgOtc?+JmSBO&1Wg3_`tuP)1r{!3r%)klbc1u!c8U P)*zmywi}2l)b<1bUx3cy delta 476 zcmdlLzAKz3z?+#xgn@y9gQ2H)BG0<|o?g?)v~#o6-vh<8nHU%ZfpkiKazIgjL9u>v zeo?AkMQ+a7N$0Z;8}PKpr~a6yQFu5(?d;Oj<-Ba#Id9T(wwm_-PsmoO{cRaJ+h`m6 zjfL;$*@u>D>2|0us;mxi~VYl)7jK&lJ`(|85uM`BRc#pni$f zNoJ!?5P3aIHN?f!F788=?vD?Wza^K6CiIKRs;)RK6=Ckn^L%6e zL$(kek{_>5xPEB;?ic$Q zkV9$nEk=7brk>u-(j0BHdCVgk~WA1OZvaZjr>GlIAQ zYTrOy5A_Hzcaeq-2Q1JhKhrP=DUsK-2T=){E+A?dgn9#^jI_Xl6 Date: Sat, 21 Sep 2024 16:25:35 -0600 Subject: [PATCH 3/3] Update run_unit_tests.yml --- .github/workflows/run_unit_tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/run_unit_tests.yml b/.github/workflows/run_unit_tests.yml index 3e860978..8a4c0175 100644 --- a/.github/workflows/run_unit_tests.yml +++ b/.github/workflows/run_unit_tests.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [ 3.7, 3.8, 3.9, "3.10", "3.11" ] + python-version: [ 3.7, 3.8, 3.9, "3.10", "3.11", "3.12" ] steps: - uses: actions/checkout@v2 @@ -21,8 +21,8 @@ jobs: with: activate-conda: true - name: Install openpyxl,tabulate with conda - run: conda install openpyxl=3.0.10 tabulate=0.8.10 + run: conda install openpyxl=3.1 tabulate=0.9 - name: Install docutils with conda - run: conda install docutils=0.16 + run: conda install docutils=0.18 - name: Test with unittest run: python -m unittest -v tests/scadnano_tests.py