From adb1aa2b58d9811a47f6af5d3947b466d2c1a00d Mon Sep 17 00:00:00 2001 From: Manuel Lera-Ramirez Date: Tue, 8 Oct 2024 14:46:08 +0100 Subject: [PATCH 1/3] closes #270 --- src/pydna/design.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/pydna/design.py b/src/pydna/design.py index be7a5904..ef45127f 100755 --- a/src/pydna/design.py +++ b/src/pydna/design.py @@ -236,7 +236,7 @@ def design(target_tm, template): return prod -def assembly_fragments(f, overlap=35, maxlink=40): +def assembly_fragments(f, overlap=35, maxlink=40, circular=False): """This function return a list of :mod:`pydna.amplicon.Amplicon` objects where primers have been modified with tails so that the fragments can be fused in the order they appear in the list by for example Gibson assembly or homologous @@ -563,6 +563,9 @@ def assembly_fragments(f, overlap=35, maxlink=40): maxlink : int, optional Maximum length of spacer sequences that may be present in f. These will be included in tails for designed primers. + circular : bool, optional + If True, the assembly is circular. If False, the assembly is linear. + Returns ------- seqs : list of :mod:`pydna.amplicon.Amplicon` and other Dseqrecord like objects :mod:`pydna.amplicon.Amplicon` objects @@ -620,6 +623,15 @@ def assembly_fragments(f, overlap=35, maxlink=40): >>> """ + + # Recursive call for circular assemblies + if circular: + fragments = assembly_fragments(f + f[0:1], overlap=overlap, maxlink=maxlink, circular=False) + + if hasattr(fragments[0], "template"): + fragments[0] = _pcr((fragments[-1].forward_primer, fragments[0].reverse_primer), fragments[0].template) + return fragments[:-1] + # sanity check for arguments nf = [item for item in f if len(item) > maxlink] if not all(hasattr(i[0], "template") or hasattr(i[1], "template") for i in zip(nf, nf[1:])): @@ -742,11 +754,19 @@ def assembly_fragments(f, overlap=35, maxlink=40): def circular_assembly_fragments(f, overlap=35, maxlink=40): - fragments = assembly_fragments(f + f[0:1], overlap=overlap, maxlink=maxlink) + """ + Equivalent to `assembly_fragments` with `circular=True`. - if hasattr(fragments[0], "template"): - fragments[0] = _pcr((fragments[-1].forward_primer, fragments[0].reverse_primer), fragments[0].template) - return fragments[:-1] + Deprecated, kept for backward compatibility. Use `assembly_fragments` with `circular=True` instead. + """ + import warnings + + warnings.warn( + "The circular_assembly_fragments function is deprecated. Use assembly_fragments with circular=True instead.", + DeprecationWarning, + stacklevel=2, + ) + return assembly_fragments(f, overlap=overlap, maxlink=maxlink, circular=True) if __name__ == "__main__": From a7743e4fdd56675e263cd51b20d9aa8c9e205ace Mon Sep 17 00:00:00 2001 From: Manuel Lera-Ramirez Date: Tue, 8 Oct 2024 18:52:45 +0100 Subject: [PATCH 2/3] closes #269 by adding an example notebook + extra tests --- docs/notebooks/primer_design.ipynb | 441 +++++++++++++++++++++++++++++ tests/test_module_design.py | 36 ++- 2 files changed, 470 insertions(+), 7 deletions(-) create mode 100644 docs/notebooks/primer_design.ipynb diff --git a/docs/notebooks/primer_design.ipynb b/docs/notebooks/primer_design.ipynb new file mode 100644 index 00000000..b185d054 --- /dev/null +++ b/docs/notebooks/primer_design.ipynb @@ -0,0 +1,441 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Primer design in pydna\n", + "\n", + "You can use `pydna` for primer design in different contexts, let's start with some basic primer functionalities." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Checking the Tm of a primer\n", + "\n", + "Primer design in pydna is very flexible, and supports different methods. For typical use-cases, we recommend using `tm_default`, which uses the method `Bio.SeqUtils.MeltingTemp` from biopython, nearest neighbor thermodynamics values from [SantaLucia & Hicks (2004)](https://pubmed.ncbi.nlm.nih.gov/15139820/) and common values for nucleotide concentration, salt concentration, etc. You can of course change those settings. For a full dive check `src/pydna/tm.py`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "55.047602641480864\n", + "54.55481807340169\n" + ] + } + ], + "source": [ + "from pydna.tm import tm_default\n", + "\n", + "# The primers from the readme example\n", + "print(tm_default(\"ATGCAAACAGTAATGATGGA\"))\n", + "print(tm_default(\"ATTATCTTTTTCAGCAATAGAATCA\"))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using NEB Tm calculator\n", + "\n", + "If you are used to the NEB Tm calculator, and you want to use it programmatically, you can do so as well. The function takes three arguments:\n", + "\n", + "- `primer`: The primer sequence.\n", + "- `conc`: The primer concentration.\n", + "- `prodcode`: The product code, which you can find on [NEB's website](https://tmapi.neb.com/docs/productcodes).\n", + "\n", + "> **NOTE:** When you call the function, it will make a request to the NEB server. This makes it much slower than using the builtin methods. In addition, we cannot guarantee that the NEB server will always be available, nor that the calculations that they use will not change in the future, since the code is not available." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "59\n", + "57\n" + ] + } + ], + "source": [ + "from pydna.tm import tm_neb\n", + "\n", + "print(tm_neb(\"ATGCAAACAGTAATGATGGA\", 0.5, \"q5-0\"))\n", + "print(tm_neb(\"ATTATCTTTTTCAGCAATAGAATCA\", 0.5, \"q5-0\"))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Designing primers for PCR\n", + "\n", + "Let's use pydna to amplify a region from a DNA sequence. You can use the `primer_design` function to design primers for a given target Tm (`target_tm`) and indicate a minimum primer hybridization length in basepairs (`limit`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Forward primer Tm: 59.71997924024873\n", + "Forward primer sequence: ATGCAAACAGTAATGATGGATGAC\n", + "\n", + "Reverse primer Tm: 60.22377911083646\n", + "Reverse primer sequence: TTATTCAGCAATAGAATCAGTGCTTTG\n" + ] + } + ], + "source": [ + "from pydna.dseqrecord import Dseqrecord\n", + "from Bio.SeqFeature import SeqFeature, SimpleLocation\n", + "from pydna.design import primer_design\n", + "\n", + "dna = Dseqrecord(\"ggttcaATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAATAAcatttacatca\")\n", + "\n", + "# Let's add a feature representing the CDS\n", + "dna.features.append(SeqFeature(SimpleLocation(start=6, end=60), type=\"CDS\"))\n", + "\n", + "# To design the primer, we extract the template sequence we want to amplify, and use the `primer_design` method.\n", + "template = dna.features[0].location.extract(dna)\n", + "\n", + "# We get an amplicon object (a subclass of Dseqrecord), that also contains extra info\n", + "# of where the primers align etc.\n", + "amplicon = primer_design(template, target_tm=60.0, limit=15)\n", + "\n", + "# We extract the primers\n", + "fwd_primer, rvs_primer = amplicon.primers()\n", + "\n", + "# We print the Tms\n", + "print(\"Forward primer Tm:\", tm_default(fwd_primer.seq))\n", + "print(\"Forward primer sequence:\", fwd_primer.seq)\n", + "print()\n", + "print(\"Reverse primer Tm:\", tm_default(rvs_primer.seq))\n", + "print(\"Reverse primer sequence:\", rvs_primer.seq)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Special primers\n", + "\n", + "We saw an example where we simply want to amplify a region of DNA. But what if we want to design primers for a specific restriction enzyme, or for Gibson Assembly? That's also easy." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Restriction enzyme\n", + "\n", + "Simply append the sequence you want at the 5' end of the primers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ttGAATTCATGCAAACAGTAATGATGGATGAC\n", + "ttGAATTCTTATTCAGCAATAGAATCAGTGCTTTG\n" + ] + } + ], + "source": [ + "from Bio.Restriction import EcoRI\n", + "fwd_primer_EcoRI = 'ttGAATTC' + fwd_primer\n", + "# You can also do it like this!\n", + "rvs_primer_EcoRI = 'tt' + EcoRI.site + rvs_primer\n", + "\n", + "print(fwd_primer_EcoRI.seq)\n", + "print(rvs_primer_EcoRI.seq)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **Edge case:** Some recognition sites contain ambiguous bases, for instance `Bst4CI` cuts at site `ACNGT`, where `N` can be any nucleotide. In that case, you can use the dictionary provided by biopython (`from Bio.Data.IUPACData import ambiguous_dna_values`) to produce a concrete DNA sequence you can use in real life." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Gibson Assembly\n", + "\n", + "To design primers for Gibson Assembly, you can use the `assembly_fragments` function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Linear Gibson Assembly" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Primers for fragment 1:\n", + "ATGCAAACAGTAATGATGGATGAC\n", + "GAGTGATTATCTTTTTCAGCAATAGAATCAGTGC\n", + "\n", + "Primers for fragment 2:\n", + "ATAATCACTCTAATAATGAATCTAACTTTACTTGGAAA\n", + "ATGCTTTTCCACTTGTTCACG\n", + "\n", + "PCR product 1:\n", + "ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATCACTC\n", + "\n", + "PCR product 2:\n", + "ATAATCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAAGCAT\n", + "\n", + "Overlap\n", + "ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATCACTC\n", + " ATAATCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAAGCAT\n" + ] + } + ], + "source": [ + "from pydna.design import assembly_fragments\n", + "# Let's imagine we want to join these two sequences together linearly with Gibson Assembly\n", + "seq1 = Dseqrecord('ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAAT')\n", + "seq2 = Dseqrecord('CACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAAGCAT')\n", + "\n", + "# First, we design primers for each fragment, as before:\n", + "pre_amplicon1 = primer_design(seq1, target_tm=60.0, limit=15)\n", + "pre_amplicon2 = primer_design(seq2, target_tm=60.0, limit=15)\n", + "\n", + "# Then, we use the `assembly_fragments` function to design primers for Gibson Assembly\n", + "amplicon1, amplicon2 = assembly_fragments([pre_amplicon1, pre_amplicon2], overlap=10)\n", + "\n", + "# We print the primers:\n", + "fwd_1, rvs_1 = amplicon1.primers()\n", + "fwd_2, rvs_2 = amplicon2.primers()\n", + "\n", + "print('Primers for fragment 1:')\n", + "print(fwd_1.seq)\n", + "print(rvs_1.seq)\n", + "print()\n", + "print('Primers for fragment 2:')\n", + "print(fwd_2.seq)\n", + "print(rvs_2.seq)\n", + "print()\n", + "\n", + "# The amplicons contain the PCR products (note the overlap between the two fragments)\n", + "print('PCR product 1:')\n", + "print(amplicon1.seq)\n", + "print()\n", + "print('PCR product 2:')\n", + "print(amplicon2.seq)\n", + "print()\n", + "\n", + "print('Overlap')\n", + "print(amplicon1.seq)\n", + "print(' '*55,amplicon2.seq, sep='')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once you have the amplicons, you can use `Assembly` to join them together (see the `Gibson` notebook for more details)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "65bp_PCR_prod|10\n", + " \\/\n", + " /\\\n", + " 10|65bp_PCR_prod\n", + "\n", + "Dseqrecord(-120)\n", + "\u001b[48;5;11mATGCAAACAGTAATGATGGATGAC\u001b[0mATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAAGCAT\n", + "TACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTAGTGAGATTATTACTTAGATTGAAATGAACCTTTCGCAAAGCACTTGTTCACCTTTTCGTA\n" + ] + } + ], + "source": [ + "from pydna.assembly import Assembly\n", + "from pydna.common_sub_strings import terminal_overlap\n", + "\n", + "\n", + "assembly = Assembly([amplicon1, amplicon2], limit=10, algorithm=terminal_overlap)\n", + "product = assembly.assemble_linear()[0]\n", + "print(product.figure())\n", + "\n", + "print()\n", + "\n", + "print(Dseqrecord(product).figure())\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Circular Gibson Assembly" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Primers for fragment 1:\n", + "AGCATATGCAAACAGTAATGATGGATGAC\n", + "GAGTGATTATCTTTTTCAGCAATAGAATCAGTGC\n", + "\n", + "Primers for fragment 2:\n", + "ATAATCACTCTAATAATGAATCTAACTTTACTTGGAAA\n", + "TGCATATGCTTTTCCACTTGTTCACG\n", + "\n", + " -|70bp_PCR_prod|10\n", + "| \\/\n", + "| /\\\n", + "| 10|70bp_PCR_prod|10\n", + "| \\/\n", + "| /\\\n", + "| 10-\n", + "| |\n", + " ------------------------------------\n", + "\n", + "Dseqrecord(o120)\n", + "AGCAT\u001b[48;5;11mATGCAAACAGTAATGATGGATGAC\u001b[0mATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAA\n", + "TCGTATACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTAGTGAGATTATTACTTAGATTGAAATGAACCTTTCGCAAAGCACTTGTTCACCTTT\n" + ] + } + ], + "source": [ + "# We use the `assembly_fragments` function with `circular=True`\n", + "amplicon1, amplicon2 = assembly_fragments([pre_amplicon1, pre_amplicon2], overlap=10, circular=True)\n", + "\n", + "# We print the primers:\n", + "fwd_1, rvs_1 = amplicon1.primers()\n", + "fwd_2, rvs_2 = amplicon2.primers()\n", + "\n", + "print('Primers for fragment 1:')\n", + "print(fwd_1.seq)\n", + "print(rvs_1.seq)\n", + "print()\n", + "print('Primers for fragment 2:')\n", + "print(fwd_2.seq)\n", + "print(rvs_2.seq)\n", + "print()\n", + "\n", + "assembly = Assembly([amplicon1, amplicon2], limit=10, algorithm=terminal_overlap)\n", + "\n", + "# Here we use assemble_circular!\n", + "product = assembly.assemble_circular()[0]\n", + "print(product.figure())\n", + "\n", + "print()\n", + "\n", + "print(Dseqrecord(product).figure())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Adding spacers / linkers to Gibson Assembly primers\n", + "\n", + "In this case, you can pass a list of `Amplicons` and `Dseqrecords` to the `assembly_fragments` function. The `amplicons` will be used as the fragments to assemble, and the `dseqrecords` will be used as spacers between the fragments, as long as they are shorter than the argument `maxlink`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "GCATtttATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATaaaCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAA\n", + " ^^^ ^^^\n" + ] + } + ], + "source": [ + "# We create two spacers as dseqrecords\n", + "spacer1 = Dseqrecord('aaa')\n", + "spacer2 = Dseqrecord('ttt')\n", + "\n", + "amplicon1, amplicon2 = assembly_fragments([pre_amplicon1, spacer1, pre_amplicon2, spacer2], overlap=10, circular=True)\n", + "\n", + "assembly = Assembly([amplicon1, amplicon2], limit=10, algorithm=terminal_overlap)\n", + "\n", + "# Here we use assemble_circular!\n", + "product = assembly.assemble_circular()[0]\n", + "\n", + "# See the linkers that have been added\n", + "print()\n", + "print(Dseqrecord(product).seq)\n", + "print(4*' ', '^^^', 60*' ', '^^^', sep='')\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/test_module_design.py b/tests/test_module_design.py index 8c2fefc6..9c993fce 100755 --- a/tests/test_module_design.py +++ b/tests/test_module_design.py @@ -220,24 +220,24 @@ def test_primer_Design_with_linker(): """test_primer_design""" b = Dseqrecord("agctactgactattaggggttattctgatcatctgatctactatctgactgtactgatcta") - l = Dseqrecord("AAATTTCCCGGG") + linker = Dseqrecord("AAATTTCCCGGG") c = Dseqrecord("tctgatctactatctgactgtactgatctattgacactgtgatcattctagtgtattactc") - frags = assembly_fragments((primer_design(b), l, primer_design(c))) + frags = assembly_fragments((primer_design(b), linker, primer_design(c))) asm1 = Assembly(frags) - assert asm1.assemble_linear()[0].seguid(), (b + l + c).seguid() == "l95igKB8iKAKrvvqE9CYksyNx40" + assert asm1.assemble_linear()[0].seguid(), (b + linker + c).seguid() == "l95igKB8iKAKrvvqE9CYksyNx40" - frags = assembly_fragments((primer_design(b), l, primer_design(c), primer_design(b))) + frags = assembly_fragments((primer_design(b), linker, primer_design(c), primer_design(b))) b2 = pcr(frags[-1].forward_primer, frags[0].reverse_primer, b) asm2 = Assembly((b2, frags[1], frags[2])) - assert (b + l + c).looped().seguid() == asm2.assemble_circular()[0].seguid() + assert (b + linker + c).looped().seguid() == asm2.assemble_circular()[0].seguid() - assert (b + l + c).looped().seguid() == "cdseguid=LqQ1_uMp2AmEZ_L2I1_njIMkVDc" + assert (b + linker + c).looped().seguid() == "cdseguid=LqQ1_uMp2AmEZ_L2I1_njIMkVDc" def test_primer_Design_given_fw_primer(): @@ -275,7 +275,7 @@ def test_primer_Design_multiple_products(): from pydna import _PydnaWarning with pytest.warns(_PydnaWarning): - a = primer_design(b) + primer_design(b) def test_circular_assembly_fragments(): @@ -346,5 +346,27 @@ def tm_alt_upper(*args): assert amp_upper_with_estimate == amp_upper_no_estimate +def test_primer_design_correct_value(): + from pydna.tm import tm_default + + for original_target_tm in range(60, 65): + for frag in frags: + amp = primer_design(frag, target_tm=original_target_tm, limit=15) + fwd, rvs = amp.primers() + possible_fwd = [Primer(frag[0:i].seq) for i in range(15, 40)] + possible_rvs = [Primer(frag[-i:].reverse_complement().seq) for i in range(15, 40)] + + # Finds the closest forward primer + fwd_diff = [abs(tm_default(f.seq) - original_target_tm) for f in possible_fwd] + correct_fwd = possible_fwd[fwd_diff.index(min(fwd_diff))] + assert str(fwd.seq) == str(correct_fwd.seq) + + # Uses that primers Tm as the target Tm for the reverse primer + new_target_tm = tm_default(correct_fwd.seq) + rvs_diff = [abs(tm_default(f.seq) - new_target_tm) for f in possible_rvs] + correct_rvs = possible_rvs[rvs_diff.index(min(rvs_diff))] + assert str(rvs.seq) == str(correct_rvs.seq) + + if __name__ == "__main__": pytest.cmdline.main([__file__, "-v", "-s"]) From 0f15ccd9f72e03ad3ecfa39565098fc3c5762f45 Mon Sep 17 00:00:00 2001 From: Manuel Lera-Ramirez Date: Wed, 9 Oct 2024 13:53:52 +0100 Subject: [PATCH 3/3] closes #288, includes the graphics in docs notebook --- .../assembly_fragment_slide_circular.png | Bin 0 -> 33549 bytes docs/_static/assembly_fragment_slide_linear.png | Bin 0 -> 28976 bytes docs/notebooks/primer_design.ipynb | 15 ++++++++++++++- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 docs/_static/assembly_fragment_slide_circular.png create mode 100644 docs/_static/assembly_fragment_slide_linear.png diff --git a/docs/_static/assembly_fragment_slide_circular.png b/docs/_static/assembly_fragment_slide_circular.png new file mode 100644 index 0000000000000000000000000000000000000000..fca398b6fee0abdb6b72a8381fe850e594c7f207 GIT binary patch literal 33549 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

lX2pi#@TwQaX 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 IH6K3zABBju#Q*>R literal 0 HcmV?d00001 diff --git a/docs/_static/assembly_fragment_slide_linear.png b/docs/_static/assembly_fragment_slide_linear.png new file mode 100644 index 0000000000000000000000000000000000000000..a0091a083451f3e15c9eaa7a2ae11bf6bbd2f95b GIT binary patch literal 28976 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 literal 0 HcmV?d00001 diff --git a/docs/notebooks/primer_design.ipynb b/docs/notebooks/primer_design.ipynb index b185d054..859bb2af 100644 --- a/docs/notebooks/primer_design.ipynb +++ b/docs/notebooks/primer_design.ipynb @@ -415,6 +415,19 @@ "print(4*' ', '^^^', 60*' ', '^^^', sep='')\n", "\n" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Summary of assembly_fragments behaviour\n", + "\n", + "The behaviour is summarised in the following graphics for linear and circular assembly.\n", + "\n", + "![assembly_fragments behaviour](../_static/assembly_fragment_slide_linear.png)\n", + "![assembly_fragments behaviour](../_static/assembly_fragment_slide_circular.png)\n", + "\n" + ] } ], "metadata": { @@ -433,7 +446,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.5" + "version": "3.11.6" } }, "nbformat": 4,