From c38b2a2812808195ce7a153aaad2472c6f09224c Mon Sep 17 00:00:00 2001 From: manulera Date: Thu, 24 Oct 2024 07:53:14 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20BjornFJo?= =?UTF-8?q?hansson/pydna@0a9fe6e6f621f131b4e5cdd46d36e36a2f3ad7f9=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .buildinfo | 2 +- CHANGELOG.html | 5 +- README.html | 191 + _images/Example_Gibson_8_0.png | Bin 0 -> 6980 bytes _images/assembly_fragment_slide_circular.png | Bin 0 -> 33549 bytes _images/assembly_fragment_slide_linear.png | Bin 0 -> 28976 bytes _modules/index.html | 35 +- _modules/pydna.html | 57 +- _modules/pydna/_pretty.html | 156 + _modules/pydna/amplicon.html | 72 +- _modules/pydna/amplify.html | 35 +- _modules/pydna/assembly.html | 30 +- _modules/pydna/common_sub_strings.html | 35 +- _modules/pydna/contig.html | 57 +- _modules/pydna/crispr.html | 239 + _modules/pydna/design.html | 40 +- _modules/pydna/dseq.html | 227 +- _modules/pydna/dseqrecord.html | 207 +- _modules/pydna/editor.html | 42 +- _modules/pydna/fakeseq.html | 165 + _modules/pydna/fusionpcr.html | 194 + _modules/pydna/gateway.html | 270 + _modules/pydna/gel.html | 35 +- _modules/pydna/genbank.html | 35 +- _modules/pydna/genbankfile.html | 40 +- _modules/pydna/genbankfixer.html | 80 +- _modules/pydna/genbankrecord.html | 57 +- _modules/pydna/ligate.html | 176 + _modules/pydna/myprimers.html | 60 +- _modules/pydna/parsers.html | 45 +- _modules/pydna/primer.html | 37 +- _modules/pydna/readers.html | 35 +- _modules/pydna/seq.html | 353 ++ _modules/pydna/seqrecord.html | 187 +- _modules/pydna/sequence_picker.html | 171 + .../pydna/threading_timer_decorator_exit.html | 57 +- _modules/pydna/tm.html | 75 +- _modules/pydna/utils.html | 135 +- _sources/README.md.txt | 91 + _sources/example_gallery.md.txt | 4 +- _sources/getting_started.md.txt | 14 +- _sources/index.rst.txt | 219 +- _sources/installation.rst.txt | 4 +- _sources/markdown_notebooks/Dseq.md.txt | 2 +- .../markdown_notebooks/Example_Gibson.md.txt | 129 +- .../Example_Restriction.md.txt | 34 +- .../markdown_notebooks/primer_design.md.txt | 298 + _sources/modules/index.rst.txt | 47 + _sources/modules/pydna.rst.txt | 7 + _sources/modules/pydna__pretty.rst.txt | 7 + .../modules/pydna__thermodynamic_data.rst.txt | 7 + _sources/modules/pydna_all.rst.txt | 7 + _sources/modules/pydna_amplicon.rst.txt | 7 + _sources/modules/pydna_amplify.rst.txt | 7 + _sources/modules/pydna_assembly.rst.txt | 7 + _sources/modules/pydna_codon.rst.txt | 7 + .../modules/pydna_common_sub_strings.rst.txt | 7 + _sources/modules/pydna_conftest.rst.txt | 7 + _sources/modules/pydna_contig.rst.txt | 7 + _sources/modules/pydna_crispr.rst.txt | 7 + _sources/modules/pydna_design.rst.txt | 7 + _sources/modules/pydna_download.rst.txt | 7 + _sources/modules/pydna_dseq.rst.txt | 7 + _sources/modules/pydna_dseqrecord.rst.txt | 7 + _sources/modules/pydna_editor.rst.txt | 7 + _sources/modules/pydna_fakeseq.rst.txt | 7 + _sources/modules/pydna_fusionpcr.rst.txt | 7 + _sources/modules/pydna_gateway.rst.txt | 7 + _sources/modules/pydna_gel.rst.txt | 7 + _sources/modules/pydna_genbank.rst.txt | 7 + _sources/modules/pydna_genbankfile.rst.txt | 7 + _sources/modules/pydna_genbankfixer.rst.txt | 7 + _sources/modules/pydna_genbankrecord.rst.txt | 7 + _sources/modules/pydna_goldengate.rst.txt | 7 + _sources/modules/pydna_ladders.rst.txt | 7 + _sources/modules/pydna_ligate.rst.txt | 7 + _sources/modules/pydna_myenzymes.rst.txt | 7 + _sources/modules/pydna_myprimers.rst.txt | 7 + _sources/modules/pydna_parsers.rst.txt | 7 + _sources/modules/pydna_primer.rst.txt | 7 + _sources/modules/pydna_readers.rst.txt | 7 + _sources/modules/pydna_seq.rst.txt | 7 + _sources/modules/pydna_seqrecord.rst.txt | 7 + .../modules/pydna_sequence_picker.rst.txt | 7 + ...dna_threading_timer_decorator_exit.rst.txt | 7 + _sources/modules/pydna_tm.rst.txt | 7 + _sources/modules/pydna_user_cloning.rst.txt | 7 + _sources/modules/pydna_utils.rst.txt | 7 + _static/basic.css | 6 +- _static/css/theme.css | 2 +- _static/custom.css | 45 +- _static/doctools.js | 2 +- _static/documentation_options.js | 5 +- _static/favicon.ico | Bin 0 -> 15406 bytes _static/language_data.js | 4 +- _static/searchtools.js | 196 +- _static/sphinx_highlight.js | 16 +- example_gallery.html | 9 +- genindex.html | 1230 +++- getting_started.html | 23 +- index.html | 4997 +---------------- installation.html | 37 +- markdown_notebooks/CRISPR.html | 5 +- markdown_notebooks/Dseq.html | 7 +- markdown_notebooks/Dseq_Features.html | 5 +- markdown_notebooks/Example_CRISPR.html | 5 +- markdown_notebooks/Example_Gibson.html | 128 +- markdown_notebooks/Example_Restriction.html | 39 +- markdown_notebooks/Gibson.html | 5 +- markdown_notebooks/Importing_Seqs.html | 5 +- markdown_notebooks/PCR.html | 5 +- .../Restrict_Ligate_Cloning.html | 5 +- markdown_notebooks/primer_design.html | 390 ++ markdown_notebooks/readme_example.html | 5 +- modules/index.html | 202 + modules/pydna.html | 369 ++ modules/pydna__pretty.html | 188 + modules/pydna__thermodynamic_data.html | 158 + modules/pydna_all.html | 3142 +++++++++++ modules/pydna_amplicon.html | 299 + modules/pydna_amplify.html | 297 + modules/pydna_assembly.html | 245 + modules/pydna_codon.html | 159 + modules/pydna_common_sub_strings.html | 238 + modules/pydna_conftest.html | 159 + modules/pydna_contig.html | 298 + modules/pydna_crispr.html | 252 + modules/pydna_design.html | 598 ++ modules/pydna_download.html | 159 + modules/pydna_dseq.html | 1406 +++++ modules/pydna_dseqrecord.html | 874 +++ modules/pydna_editor.html | 214 + modules/pydna_fakeseq.html | 185 + modules/pydna_fusionpcr.html | 173 + modules/pydna_gateway.html | 184 + modules/pydna_gel.html | 174 + modules/pydna_genbank.html | 239 + modules/pydna_genbankfile.html | 229 + modules/pydna_genbankfixer.html | 316 ++ modules/pydna_genbankrecord.html | 250 + modules/pydna_goldengate.html | 159 + modules/pydna_ladders.html | 165 + modules/pydna_ligate.html | 168 + modules/pydna_myenzymes.html | 164 + modules/pydna_myprimers.html | 259 + modules/pydna_parsers.html | 234 + modules/pydna_primer.html | 190 + modules/pydna_readers.html | 198 + modules/pydna_seq.html | 790 +++ modules/pydna_seqrecord.html | 631 +++ modules/pydna_sequence_picker.html | 167 + .../pydna_threading_timer_decorator_exit.html | 227 + modules/pydna_tm.html | 331 ++ modules/pydna_user_cloning.html | 169 + modules/pydna_utils.html | 424 ++ objects.inv | Bin 2040 -> 4289 bytes py-modindex.html | 156 +- search.html | 25 +- searchindex.js | 2 +- 159 files changed, 20580 insertions(+), 6821 deletions(-) create mode 100644 README.html create mode 100644 _images/Example_Gibson_8_0.png create mode 100644 _images/assembly_fragment_slide_circular.png create mode 100644 _images/assembly_fragment_slide_linear.png create mode 100644 _modules/pydna/_pretty.html create mode 100644 _modules/pydna/crispr.html create mode 100644 _modules/pydna/fakeseq.html create mode 100644 _modules/pydna/fusionpcr.html create mode 100644 _modules/pydna/gateway.html create mode 100644 _modules/pydna/ligate.html create mode 100644 _modules/pydna/seq.html create mode 100644 _modules/pydna/sequence_picker.html create mode 100644 _sources/README.md.txt create mode 100644 _sources/markdown_notebooks/primer_design.md.txt create mode 100644 _sources/modules/index.rst.txt create mode 100644 _sources/modules/pydna.rst.txt create mode 100644 _sources/modules/pydna__pretty.rst.txt create mode 100644 _sources/modules/pydna__thermodynamic_data.rst.txt create mode 100644 _sources/modules/pydna_all.rst.txt create mode 100644 _sources/modules/pydna_amplicon.rst.txt create mode 100644 _sources/modules/pydna_amplify.rst.txt create mode 100644 _sources/modules/pydna_assembly.rst.txt create mode 100644 _sources/modules/pydna_codon.rst.txt create mode 100644 _sources/modules/pydna_common_sub_strings.rst.txt create mode 100644 _sources/modules/pydna_conftest.rst.txt create mode 100644 _sources/modules/pydna_contig.rst.txt create mode 100644 _sources/modules/pydna_crispr.rst.txt create mode 100644 _sources/modules/pydna_design.rst.txt create mode 100644 _sources/modules/pydna_download.rst.txt create mode 100644 _sources/modules/pydna_dseq.rst.txt create mode 100644 _sources/modules/pydna_dseqrecord.rst.txt create mode 100644 _sources/modules/pydna_editor.rst.txt create mode 100644 _sources/modules/pydna_fakeseq.rst.txt create mode 100644 _sources/modules/pydna_fusionpcr.rst.txt create mode 100644 _sources/modules/pydna_gateway.rst.txt create mode 100644 _sources/modules/pydna_gel.rst.txt create mode 100644 _sources/modules/pydna_genbank.rst.txt create mode 100644 _sources/modules/pydna_genbankfile.rst.txt create mode 100644 _sources/modules/pydna_genbankfixer.rst.txt create mode 100644 _sources/modules/pydna_genbankrecord.rst.txt create mode 100644 _sources/modules/pydna_goldengate.rst.txt create mode 100644 _sources/modules/pydna_ladders.rst.txt create mode 100644 _sources/modules/pydna_ligate.rst.txt create mode 100644 _sources/modules/pydna_myenzymes.rst.txt create mode 100644 _sources/modules/pydna_myprimers.rst.txt create mode 100644 _sources/modules/pydna_parsers.rst.txt create mode 100644 _sources/modules/pydna_primer.rst.txt create mode 100644 _sources/modules/pydna_readers.rst.txt create mode 100644 _sources/modules/pydna_seq.rst.txt create mode 100644 _sources/modules/pydna_seqrecord.rst.txt create mode 100644 _sources/modules/pydna_sequence_picker.rst.txt create mode 100644 _sources/modules/pydna_threading_timer_decorator_exit.rst.txt create mode 100644 _sources/modules/pydna_tm.rst.txt create mode 100644 _sources/modules/pydna_user_cloning.rst.txt create mode 100644 _sources/modules/pydna_utils.rst.txt create mode 100644 _static/favicon.ico create mode 100644 markdown_notebooks/primer_design.html create mode 100644 modules/index.html create mode 100644 modules/pydna.html create mode 100644 modules/pydna__pretty.html create mode 100644 modules/pydna__thermodynamic_data.html create mode 100644 modules/pydna_all.html create mode 100644 modules/pydna_amplicon.html create mode 100644 modules/pydna_amplify.html create mode 100644 modules/pydna_assembly.html create mode 100644 modules/pydna_codon.html create mode 100644 modules/pydna_common_sub_strings.html create mode 100644 modules/pydna_conftest.html create mode 100644 modules/pydna_contig.html create mode 100644 modules/pydna_crispr.html create mode 100644 modules/pydna_design.html create mode 100644 modules/pydna_download.html create mode 100644 modules/pydna_dseq.html create mode 100644 modules/pydna_dseqrecord.html create mode 100644 modules/pydna_editor.html create mode 100644 modules/pydna_fakeseq.html create mode 100644 modules/pydna_fusionpcr.html create mode 100644 modules/pydna_gateway.html create mode 100644 modules/pydna_gel.html create mode 100644 modules/pydna_genbank.html create mode 100644 modules/pydna_genbankfile.html create mode 100644 modules/pydna_genbankfixer.html create mode 100644 modules/pydna_genbankrecord.html create mode 100644 modules/pydna_goldengate.html create mode 100644 modules/pydna_ladders.html create mode 100644 modules/pydna_ligate.html create mode 100644 modules/pydna_myenzymes.html create mode 100644 modules/pydna_myprimers.html create mode 100644 modules/pydna_parsers.html create mode 100644 modules/pydna_primer.html create mode 100644 modules/pydna_readers.html create mode 100644 modules/pydna_seq.html create mode 100644 modules/pydna_seqrecord.html create mode 100644 modules/pydna_sequence_picker.html create mode 100644 modules/pydna_threading_timer_decorator_exit.html create mode 100644 modules/pydna_tm.html create mode 100644 modules/pydna_user_cloning.html create mode 100644 modules/pydna_utils.html diff --git a/.buildinfo b/.buildinfo index 5ac090c7..404ce988 100644 --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: efbbeb24c16b33baab2c29f825c99ef0 +config: b82c7ece04ac9e7d88230a9a3170eab4 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/CHANGELOG.html b/CHANGELOG.html index fe272592..7a9dcaed 100644 --- a/CHANGELOG.html +++ b/CHANGELOG.html @@ -9,9 +9,10 @@ Changelog — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -45,7 +46,7 @@ diff --git a/README.html b/README.html new file mode 100644 index 00000000..edc0238d --- /dev/null +++ b/README.html @@ -0,0 +1,191 @@ + + + + + + + + + Documentation — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Documentation

+

Documentation is built using Sphinx from docstrings +using a GitHub action. +The numpy docstring format is used.

+

Below the commands to run a local sphinx server that auto-updated when files are changed.

+
# Install docs dependency group
+poetry install --with docs
+
+# Start the sphinx server to see docs live by default at http://127.0.0.1:8000/
+sphinx-autobuild --watch src/ docs docs/_build/html
+
+
+

When you run the sphinx server live, it not always updates things if you make relevant changes (e.g. adding new pages, +changing the css, etc.). To force an update, you can run the command below which deletes the existing build folder and +then rebuilds it.

+
rm -rf docs/_build/html && sphinx-autobuild --watch src/ docs docs/_build/html
+
+
+
+

Adding new sections to the documentation

+

You can add new sections (equivalent to “Getting started” or “Example gallery”) by creating a new .rst or .md file in the docs folder, and then adding a reference to it in the .. toctree:: directive in the docs/index.rst file.

+
+
+

Auto-generated files

+

The script autogen_docs.sh is run in the github action before creating the docs. If you want to reproduce locally, you +should run it from the docs folder

+
cd docs
+bash autogen_docs.sh
+
+
+
    +
  • It converts all notebooks in the docs/notebooks folder to .md in docs/markdown_notebooks (excluded from git)

  • +
  • It creates all files in docs/modules, which are used to generate the API reference. For instance, it will create +a docs/modules/index.rst file that starts like this:

    +
    Modules
    +=======
    +
    +.. toctree::
    +   :maxdepth: 1
    +   :caption: Modules:
    +
    +   pydna
    +   pydna__pretty
    +
    +
    +

    And then individual files for each module and submodule, e.g. docs/modules/pydna.rst.

    +
    pydna
    +=====
    +
    +.. automodule:: pydna
    +    :members:
    +    :undoc-members:
    +    :show-inheritance:
    +
    +
    +
  • +
+
+
+

Text imported from README.md

+

To avoid having to maintain the same text in multiple files, fragments of the README.md are imported using the directive +include. For instance, in the installation.rst file, you can find the code below. What this does is to import the text of the README.md file between the start and end markers, which are markdown comments and therefore not rendered.

+
.. include:: ../README.md
+   :parser: myst_parser.sphinx_
+   :start-after: <!-- docs/installation.rst-start -->
+   :end-before: <!-- docs/installation.rst-end -->
+
+
+
+
+

Including notebooks in the getting started and example sections

+

You can see the example of how to do this in the getting_started.md file. Note that the notebooks present in the docs/notebooks folder will automatically be converted to markdown in the docs/markdown_notebooks folder. So if you have a notebook docs/notebooks/Example_Gibson.ipynb, it will be converted to docs/markdown_notebooks/Example_Gibson.md and you can use that file path to make a link to it.

+
+
+

Custom CSS

+

For now, I have used css to make notebook outputs that are too long scrollable, and to add a small label python code to the code cells and output to the output cells.

+

For further customization, you can edit the custom.css file.

+
+
+

Misc

+

Other changes, such as changing the favicon, the css etc., can be made in the conf.py file. See the sphinx docs and the sphinx-rtd-theme docs for more information.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2024, Björn F. Johansson.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/_images/Example_Gibson_8_0.png b/_images/Example_Gibson_8_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9b911591e7d8ccd203c08f76eb3befb7cf43c679 GIT binary patch literal 6980 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

lX2pi#@TwQaX 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 IH6K3zABBju#Q*>R literal 0 HcmV?d00001 diff --git a/_images/assembly_fragment_slide_linear.png b/_images/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/_modules/index.html b/_modules/index.html index 303c1c8c..84ffd290 100644 --- a/_modules/index.html +++ b/_modules/index.html @@ -1,20 +1,22 @@ - + - Overview: module code — pydna 0.0.0.post1+9d112d7 documentation + Overview: module code — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@ @@ -66,25 +75,33 @@

All modules for which code is available

  • pydna
  • -
    • pydna.amplicon
    • +
      • pydna._pretty
      • +
      • pydna.amplicon
      • pydna.amplify
      • pydna.assembly
      • pydna.common_sub_strings
      • pydna.contig
      • +
      • pydna.crispr
      • pydna.design
      • pydna.dseq
      • pydna.dseqrecord
      • pydna.editor
      • +
      • pydna.fakeseq
      • +
      • pydna.fusionpcr
      • +
      • pydna.gateway
      • pydna.gel
      • pydna.genbank
      • pydna.genbankfile
      • pydna.genbankfixer
      • pydna.genbankrecord
      • +
      • pydna.ligate
      • pydna.myprimers
      • pydna.parsers
      • pydna.primer
      • pydna.readers
      • +
      • pydna.seq
      • pydna.seqrecord
      • +
      • pydna.sequence_picker
      • pydna.threading_timer_decorator_exit
      • pydna.tm
      • pydna.utils
      • diff --git a/_modules/pydna.html b/_modules/pydna.html index f54d2db8..79f6de3a 100644 --- a/_modules/pydna.html +++ b/_modules/pydna.html @@ -1,20 +1,22 @@ - + - pydna — pydna 0.0.0.post1+9d112d7 documentation + pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@ @@ -218,7 +227,7 @@

        Source code for pydna

         __maintainer__ = "Björn Johansson"
         __email__ = "bjorn_johansson@bio.uminho.pt"
         __status__ = "Development"  # "Production" #"Prototype"
        -__version__ = "0.0.0-post.1+9d112d7"
        +__version__ = "0.0.0"
         
         
         # create config directory
        @@ -372,9 +381,7 @@ 

        Source code for pydna

             pass
         
         
        -
        -[docs] -def open_current_folder(): +
        [docs]def open_current_folder(): """Open the current working directory. Opens in the default file manager. The location for this folder is @@ -383,13 +390,10 @@

        Source code for pydna

             return _open_folder(_os.getcwd())
        - _logger.info("Current working directory = os.getcwd() = %s", _os.getcwd()) -
        -[docs] -def open_cache_folder(): +
        [docs]def open_cache_folder(): """Open the pydna cache folder. Opens in the default file manager. The location for this folder is stored @@ -398,10 +402,7 @@

        Source code for pydna

             return _open_folder(_os.environ["pydna_data_dir"])
        - -
        -[docs] -def open_config_folder(): +
        [docs]def open_config_folder(): """Open the pydna configuration folder. Opens in the default file manager. The location for this folder is stored @@ -445,18 +446,12 @@

        Source code for pydna

             return _open_folder(_os.environ["pydna_config_dir"])
        - -
        -[docs] -def open_log_folder(): +
        [docs]def open_log_folder(): """docstring.""" return _open_folder(_os.environ["pydna_log_dir"])
        - -
        -[docs] -def get_env(): +
        [docs]def get_env(): """Print a an ascii table containing all environmental variables. Pydna related variables have names that starts with `pydna_` @@ -472,10 +467,7 @@

        Source code for pydna

             return _table
        - -
        @@ -93,9 +102,7 @@

        Source code for pydna.amplicon

         _module_logger = _logging.getLogger("pydna." + __name__)
         
         
        -
        -[docs] -class Amplicon(_Dseqrecord): +
        [docs]class Amplicon(_Dseqrecord): """The Amplicon class holds information about a PCR reaction involving two primers and one template. This class is used by the Anneal class and is not meant to be instantiated directly. @@ -124,15 +131,12 @@

        Source code for pydna.amplicon

                 # https://medium.com/@chipiga86/circular-references-without-memory-
                 # leaks-and-destruction-of-objects-in-python-43da57915b8d
         
        -
        -[docs] - @classmethod +
        [docs] @classmethod def from_SeqRecord(cls, record, *args, path=None, **kwargs): obj = super().from_SeqRecord(record, *args, **kwargs) obj.path = path return obj
        - def __getitem__(self, sl): answer = _copy.copy(self) answer.seq = answer.seq.__getitem__(sl) @@ -152,9 +156,7 @@

        Source code for pydna.amplicon

             def _repr_html_(self):
                 return "Amplicon({})".format(self.__len__())
         
        -
        -[docs] - def reverse_complement(self): +
        [docs] def reverse_complement(self): r = type(self)(super().reverse_complement()) r.template = self.template.rc() r.forward_primer = _copy.copy(self.reverse_primer) @@ -162,12 +164,9 @@

        Source code for pydna.amplicon

                 r.forward_primer.position, r.reverse_primer.position = r.reverse_primer.position, r.forward_primer.position
                 return r
        - rc = reverse_complement -
        -[docs] - def figure(self): +
        [docs] def figure(self): """ This method returns a simple figure of the two primers binding to a part of the template. @@ -212,37 +211,20 @@

        Source code for pydna.amplicon

                 # breakpoint()
                 return _pretty_str(_textwrap.dedent(f).strip("\n"))
        - -
        -[docs] - def set_forward_primer_footprint(self, length): +
        [docs] def set_forward_primer_footprint(self, length): self.forward_primer = _Primer(self.forward_primer.tail + self.seq[:length], footprint=length)
        - -
        -[docs] - def set_reverse_primer_footprint(self, length): +
        [docs] def set_reverse_primer_footprint(self, length): self.reverse_primer = _Primer(self.reverse_primer.tail + self.seq[:length], footprint=length)
        - -
        -[docs] - def program(self): +
        [docs] def program(self): return _program(self)
        - -
        -[docs] - def dbd_program(self): +
        [docs] def dbd_program(self): return _dbd_program(self)
        - -
        -[docs] - def primers(self): - return self.forward_primer, self.reverse_primer
        -
        - +
        [docs] def primers(self): + return self.forward_primer, self.reverse_primer
        if __name__ == "__main__": diff --git a/_modules/pydna/amplify.html b/_modules/pydna/amplify.html index e4ab531c..b773e685 100644 --- a/_modules/pydna/amplify.html +++ b/_modules/pydna/amplify.html @@ -1,20 +1,22 @@ - + - pydna.amplify — pydna 0.0.0.post1+9d112d7 documentation + pydna.amplify — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -193,9 +202,7 @@

        Source code for pydna.amplify

         #         return super().__call__(*args, **kwargs)
         
         
        -
        -[docs] -class Anneal(object): # ), metaclass=_Memoize): +
        [docs]class Anneal(object): # ), metaclass=_Memoize): """The Anneal class has the following important attributes: Attributes @@ -502,10 +509,7 @@

        Source code for pydna.amplify

             report = __str__
        - -
        -[docs] -def pcr(*args, **kwargs) -> _Amplicon: +
        [docs]def pcr(*args, **kwargs) -> _Amplicon: """pcr is a convenience function for the Anneal class to simplify its usage, especially from the command line. If more than one or no PCR product is formed, a ValueError is raised. @@ -600,7 +604,6 @@

        Source code for pydna.amplify

             raise ValueError(f"PCR not specific! {format(anneal_primers.report())}")
        - if __name__ == "__main__": cached = _os.getenv("pydna_cached_funcs", "") _os.environ["pydna_cached_funcs"] = "" diff --git a/_modules/pydna/assembly.html b/_modules/pydna/assembly.html index cd54d038..d99c8252 100644 --- a/_modules/pydna/assembly.html +++ b/_modules/pydna/assembly.html @@ -1,20 +1,22 @@ - + - pydna.assembly — pydna 0.0.0.post1+9d112d7 documentation + pydna.assembly — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -144,9 +153,7 @@

        Source code for pydna.assembly

         _module_logger = _logging.getLogger("pydna." + __name__)
         
         
        -
        -[docs] -class Assembly(object): # , metaclass=_Memoize): +
        [docs]class Assembly(object): # , metaclass=_Memoize): """Assembly of a list of linear DNA fragments into linear or circular constructs. The Assembly is meant to replace the Assembly method as it is easier to use. Accepts a list of Dseqrecords (source fragments) to @@ -568,7 +575,6 @@

        Source code for pydna.assembly

                 )
        - example_fragments = ( _Dseqrecord("AacgatCAtgctcc", name="a"), _Dseqrecord("TtgctccTAAattctgc", name="b"), diff --git a/_modules/pydna/common_sub_strings.html b/_modules/pydna/common_sub_strings.html index 1f751a44..b22ee832 100644 --- a/_modules/pydna/common_sub_strings.html +++ b/_modules/pydna/common_sub_strings.html @@ -1,20 +1,22 @@ - + - pydna.common_sub_strings — pydna 0.0.0.post1+9d112d7 documentation + pydna.common_sub_strings — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -383,9 +392,7 @@

        Source code for pydna.common_sub_strings

         #     return match
         
         
        -
        -[docs] -def common_sub_strings(stringx: str, stringy: str, limit: int = 25) -> _List[Match]: +
        [docs]def common_sub_strings(stringx: str, stringy: str, limit: int = 25) -> _List[Match]: """ Finds all common substrings between stringx and stringy, and returns them sorted by length. @@ -415,10 +422,7 @@

        Source code for pydna.common_sub_strings

             return matches
        - -
        -[docs] -def terminal_overlap(stringx: str, stringy: str, limit: int = 15) -> _List[Match]: +
        [docs]def terminal_overlap(stringx: str, stringy: str, limit: int = 15) -> _List[Match]: """Finds the the flanking common substrings between stringx and stringy longer than limit. This means that the results only contains substrings that starts or ends at the the ends of stringx and stringy. @@ -467,7 +471,6 @@

        Source code for pydna.common_sub_strings

             ]
        - if __name__ == "__main__": import os as _os diff --git a/_modules/pydna/contig.html b/_modules/pydna/contig.html index 7ceec352..620a98d4 100644 --- a/_modules/pydna/contig.html +++ b/_modules/pydna/contig.html @@ -1,20 +1,22 @@ - + - pydna.contig — pydna 0.0.0.post1+9d112d7 documentation + pydna.contig — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -75,9 +84,7 @@

        Source code for pydna.contig

         from pydna.utils import rc as _rc
         
         
        -
        -[docs] -class Contig(_Dseqrecord): +
        [docs]class Contig(_Dseqrecord): """This class holds information about a DNA assembly. This class is instantiated by the :class:`Assembly` class and is not meant to be used directly. @@ -88,26 +95,20 @@

        Source code for pydna.contig

                 self.graph = graph
                 self.nodemap = nodemap
         
        -
        -[docs] - @classmethod +
        [docs] @classmethod def from_string(cls, record: str = "", *args, graph=None, nodemap=None, **kwargs): obj = super().from_string(record, *args, **kwargs) obj.graph = graph obj.nodemap = nodemap return obj
        - -
        -[docs] - @classmethod +
        [docs] @classmethod def from_SeqRecord(cls, record, *args, graph=None, nodemap=None, **kwargs): obj = super().from_SeqRecord(record, *args, **kwargs) obj.graph = graph obj.nodemap = nodemap return obj
        - def __repr__(self): return "Contig({}{})".format({True: "-", False: "o"}[not self.circular], len(self)) @@ -118,9 +119,7 @@

        Source code for pydna.contig

             def _repr_html_(self):
                 return "<pre>" + self.figure() + "</pre>"
         
        -
        -[docs] - def reverse_complement(self): +
        [docs] def reverse_complement(self): answer = type(self)(super().reverse_complement()) g = _nx.DiGraph() nm = self.nodemap @@ -137,12 +136,9 @@

        Source code for pydna.contig

                 answer.nodemap = {v: k for k, v in self.nodemap.items()}
                 return answer
        - rc = reverse_complement -
        -[docs] - def detailed_figure(self): +
        [docs] def detailed_figure(self): """Returns a text representation of the assembled fragments. Linear: @@ -196,10 +192,7 @@

        Source code for pydna.contig

         
                 return _pretty_str(fig)
        - -
        -[docs] - def figure(self): +
        [docs] def figure(self): r"""Compact ascii representation of the assembled fragments. Each fragment is represented by: @@ -319,9 +312,7 @@

        Source code for pydna.contig

                     fig += "|{space}{o1:>2}-\n".format(space=" " * (space), o1=nodes[0][1]["length"])
                     fig += "|{space}   |\n".format(space=" " * (space))
                     fig += " {space}".format(space="-" * (space + 3))
        -        return _pretty_str(_textwrap.dedent(fig))
        -
        - + return _pretty_str(_textwrap.dedent(fig))
        if __name__ == "__main__": diff --git a/_modules/pydna/crispr.html b/_modules/pydna/crispr.html new file mode 100644 index 00000000..b9555b4c --- /dev/null +++ b/_modules/pydna/crispr.html @@ -0,0 +1,239 @@ + + + + + + + + pydna.crispr — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +

        Source code for pydna.crispr

        +#!/usr/bin/env python3
        +# -*- coding: utf-8 -*-
        +
        +# Copyright 2013-2023 by Björn Johansson.  All rights reserved.
        +# This code is part of the Python-dna distribution and governed by its
        +# license.  Please see the LICENSE.txt file that should have been included
        +# as part of this package.
        +"""Provides the Dseq class for handling double stranded DNA sequences.
        +
        +Dseq is a subclass of :class:`Bio.Seq.Seq`. The Dseq class
        +is mostly useful as a part of the :class:`pydna.dseqrecord.Dseqrecord` class
        +which can hold more meta data.
        +
        +The Dseq class support the notion of circular and linear DNA topology.
        +"""
        +
        +from abc import ABC, abstractmethod
        +import re
        +from pydna.utils import rc
        +
        +
        +class _cas(ABC):
        +    scaffold = "ND"
        +    pam = "ND"
        +    size = 0
        +    fst5 = 0
        +    fst3 = 0
        +
        +    def __init__(self, protospacer):
        +        self.protospacer = protospacer.upper()
        +        self.compsite = re.compile(
        +            f"(?=(?P<watson>{self.protospacer}{self.pam}))|(?=(?P<crick>{rc(self.pam)}{rc(self.protospacer)}))",
        +            re.UNICODE,
        +        )
        +
        +    @abstractmethod
        +    def search(self, dna, linear=True):
        +        """To override in subclass."""
        +        pass
        +
        +    def __repr__(self):
        +        return f"{type(self).__name__}({self.protospacer[:3]}..{self.protospacer[-3:]})"
        +
        +    @abstractmethod
        +    def __str__(self):
        +        """To override in subclass."""
        +        pass
        +
        +
        +
        [docs]class cas9(_cas): + """docstring. + + .. code-block:: + + |----size----------| + + ---protospacer------ + -fst3 + fst5 |-| + |--------------| + PAM + 5-NNGGAAGAGTAATACACTA-AAANGGNN-3 + ||||||||||||||||||| |||||||| + 3-NNCCTTCTCATTATGTGAT-TTTNCCNN-5 + ||||||||||||||||| ||| + 5-GGAAGAGTAATACACTA-AAAg-u-a-a-g-g Scaffold + ---gRNA spacer--- u-a + u-a + u-a + u-a + a-u + g-u-g + a a + g-c-a + c-g + u-a + a-u + g a tetraloop + a-a + """ + + scaffold = "GTTTTAGAGCTAGAAATAGCAAGTTAAAATAAGG" + pam = ".GG" + size = 20 + fst5 = 17 + fst3 = -3 + ovhg = fst5 - (size + fst3) + +
        [docs] def search(self, dna, linear=True): + """docstring.""" + dna = str(dna).upper() + if linear: + dna = dna + else: + dna = dna + dna[1 : self.size] + results = [] + for mobj in self.compsite.finditer(dna): + w, c = mobj.groups() + if w: + results.append(mobj.start("watson") + 1 + self.fst5) + if c: + results.append(mobj.start("crick") + len(self.pam) + 1 - self.fst3) + return results
        + + def __str__(self): + """docstring.""" + return f">{type(self).__name__} protospacer scaffold\n{self.protospacer} {self.scaffold}"
        + + +
        [docs]def protospacer(guide_construct, cas=cas9): + """docstring.""" + in_watson = [ + mobj.group("ps") + for mobj in re.finditer(f"(?P<ps>.{{{cas.size}}})(?:{cas.scaffold})", str(guide_construct.seq).upper()) + ] + in_crick = [ + rc(mobj.group("ps")) + for mobj in re.finditer(f"(?:{rc(cas.scaffold)})(?P<ps>.{{{cas.size}}})", str(guide_construct.seq).upper()) + ] + return in_watson + in_crick
        + + +if __name__ == "__main__": + import os as _os + + cached = _os.getenv("pydna_cached_funcs", "") + _os.environ["pydna_cached_funcs"] = "" + import doctest + + doctest.testmod(verbose=True, optionflags=doctest.ELLIPSIS) + _os.environ["pydna_cached_funcs"] = cached +
        + +
        +
        +
        + +
        + +
        +

        © Copyright 2024, Björn F. Johansson.

        +
        + + Built with Sphinx using a + theme + provided by Read the Docs. + + +
        +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/_modules/pydna/design.html b/_modules/pydna/design.html index ddb431e1..cb1d0d95 100644 --- a/_modules/pydna/design.html +++ b/_modules/pydna/design.html @@ -1,20 +1,22 @@ - + - pydna.design — pydna 0.0.0.post1+9d112d7 documentation + pydna.design — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -139,9 +148,7 @@

        Source code for pydna.design

                 return prev_primer
         
         
        -
        -[docs] -def primer_design( +
        [docs]def primer_design( template, fp=None, rp=None, limit=13, target_tm=55.0, tm_func=_tm_default, estimate_function=None, **kwargs ): """This function designs a forward primer and a reverse primer for PCR amplification @@ -307,10 +314,7 @@

        Source code for pydna.design

             return prod
        - -
        -[docs] -def assembly_fragments(f, overlap=35, maxlink=40, circular=False): +
        [docs]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 @@ -827,10 +831,7 @@

        Source code for pydna.design

             ]
        - -
        -[docs] -def circular_assembly_fragments(f, overlap=35, maxlink=40): +
        [docs]def circular_assembly_fragments(f, overlap=35, maxlink=40): """ Equivalent to `assembly_fragments` with `circular=True`. @@ -846,7 +847,6 @@

        Source code for pydna.design

             return assembly_fragments(f, overlap=overlap, maxlink=maxlink, circular=True)
        - if __name__ == "__main__": cached = _os.getenv("pydna_cached_funcs", "") _os.environ["pydna_cached_funcs"] = "" diff --git a/_modules/pydna/dseq.html b/_modules/pydna/dseq.html index 42ec0689..3e257fb2 100644 --- a/_modules/pydna/dseq.html +++ b/_modules/pydna/dseq.html @@ -1,20 +1,22 @@ - + - pydna.dseq — pydna 0.0.0.post1+9d112d7 documentation + pydna.dseq — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -124,9 +133,7 @@

        Source code for pydna.dseq

         CutSiteType = _Tuple[_Tuple[int, int], _Union["_AbstractCut", None]]
         
         
        -
        -[docs] -class Dseq(_Seq): +
        [docs]class Dseq(_Seq): """Dseq holds information for a double stranded DNA fragment. Dseq also holds information describing the topology of @@ -462,9 +469,7 @@

        Source code for pydna.dseq

                 self.ovhg = ovhg
                 self.pos = pos
         
        -
        -[docs] - @classmethod +
        [docs] @classmethod def quick( cls, watson: str, @@ -485,10 +490,7 @@

        Source code for pydna.dseq

                 obj._data = _rc(cb[-max(0, ovhg) or len(cb) :]) + wb + _rc(cb[: max(0, len(cb) - ovhg - len(wb))])
                 return obj
        - -
        -[docs] - @classmethod +
        [docs] @classmethod def from_string( cls, dna: str, @@ -508,10 +510,7 @@

        Source code for pydna.dseq

                 obj._data = bytes(dna, encoding="ASCII")
                 return obj
        - -
        -[docs] - @classmethod +
        [docs] @classmethod def from_representation(cls, dsdna: str, *args, **kwargs): obj = cls.__new__(cls) # Does not call __init__ w, c, *r = [ln for ln in dsdna.splitlines() if ln] @@ -527,10 +526,7 @@

        Source code for pydna.dseq

                 obj._data = _rc(cb[-max(0, ovhg) or len(cb) :]) + wb + _rc(cb[: max(0, len(cb) - ovhg - len(wb))])
                 return obj
        - -
        -[docs] - @classmethod +
        [docs] @classmethod def from_full_sequence_and_overhangs(cls, full_sequence: str, crick_ovhg: int, watson_ovhg: int): """Create a linear Dseq object from a full sequence and the 3' overhangs of each strand. @@ -593,7 +589,6 @@

        Source code for pydna.dseq

         
                 return Dseq(watson, crick=crick, ovhg=crick_ovhg)
        - # @property # def ovhg(self): # """The ovhg property. This cannot be set directly, but is a @@ -613,9 +608,7 @@

        Source code for pydna.dseq

             #     Use :meth:`looped` to create a circular Dseq object"""
             #     return self._circular
         
        -
        -[docs] - def mw(self) -> float: +
        [docs] def mw(self) -> float: """This method returns the molecular weight of the DNA molecule in g/mol. The following formula is used:: @@ -634,10 +627,7 @@

        Source code for pydna.dseq

                     + 79.0
                 )
        - -
        -[docs] - def upper(self: DseqType) -> DseqType: +
        [docs] def upper(self: DseqType) -> DseqType: """Return an upper case copy of the sequence. >>> from pydna.dseq import Dseq @@ -670,10 +660,7 @@

        Source code for pydna.dseq

                     pos=self.pos,
                 )
        - -
        -[docs] - def lower(self: DseqType) -> DseqType: +
        [docs] def lower(self: DseqType) -> DseqType: """Return a lower case copy of the sequence. >>> from pydna.dseq import Dseq @@ -705,10 +692,7 @@

        Source code for pydna.dseq

                     pos=self.pos,
                 )
        - -
        -[docs] - def find(self, sub: _Union[_SeqAbstractBaseClass, str, bytes], start=0, end=_sys.maxsize) -> int: +
        [docs] def find(self, sub: _Union[_SeqAbstractBaseClass, str, bytes], start=0, end=_sys.maxsize) -> int: """This method behaves like the python string method of the same name. Returns an integer, the index of the first occurrence of substring @@ -752,7 +736,6 @@

        Source code for pydna.dseq

         
                 return (_pretty_str(self) + _pretty_str(self)).find(sub, start, end)
        - def __getitem__(self, sl: slice) -> "Dseq": """Returns a subsequence. This method is used by the slice notation""" @@ -890,9 +873,7 @@

        Source code for pydna.dseq

                         )
                     )
         
        -
        -[docs] - def reverse_complement(self) -> "Dseq": +
        [docs] def reverse_complement(self) -> "Dseq": """Dseq object where watson and crick have switched places. This represents the same double stranded sequence. @@ -920,12 +901,9 @@

        Source code for pydna.dseq

                     circular=self.circular,
                 )
        - rc = reverse_complement # alias for reverse_complement -
        -[docs] - def shifted(self: DseqType, shift: int) -> DseqType: +
        [docs] def shifted(self: DseqType, shift: int) -> DseqType: """Shifted version of a circular Dseq object.""" if not self.circular: raise TypeError("DNA is not circular.") @@ -935,10 +913,7 @@

        Source code for pydna.dseq

                 else:
                     return (self[shift:] + self[:shift]).looped()
        - -
        -[docs] - def looped(self: DseqType) -> DseqType: +
        [docs] def looped(self: DseqType) -> DseqType: """Circularized Dseq object. This can only be done if the two ends are compatible, @@ -995,10 +970,7 @@

        Source code for pydna.dseq

                 else:
                     raise TypeError("DNA cannot be circularized.\n" "5' and 3' sticky ends not compatible!")
        - -
        -[docs] - def tolinear(self: DseqType) -> DseqType: # pragma: no cover +
        [docs] def tolinear(self: DseqType) -> DseqType: # pragma: no cover """Returns a blunt, linear copy of a circular Dseq object. This can only be done if the Dseq object is circular, otherwise a TypeError is raised. @@ -1034,10 +1006,7 @@

        Source code for pydna.dseq

                 selfcopy.circular = False
                 return selfcopy  # self.__class__(self.watson, linear=True)
        - -
        -[docs] - def five_prime_end(self) -> _Tuple[str, str]: +
        [docs] def five_prime_end(self) -> _Tuple[str, str]: """Returns a tuple describing the structure of the 5' end of the DNA fragment @@ -1087,10 +1056,7 @@

        Source code for pydna.dseq

                     type_ = "blunt"
                 return type_, sticky
        - -
        -[docs] - def three_prime_end(self) -> _Tuple[str, str]: +
        [docs] def three_prime_end(self) -> _Tuple[str, str]: """Returns a tuple describing the structure of the 5' end of the DNA fragment @@ -1137,14 +1103,10 @@

        Source code for pydna.dseq

                     type_ = "blunt"
                 return type_, sticky
        - -
        -[docs] - def watson_ovhg(self) -> int: +
        [docs] def watson_ovhg(self) -> int: """Returns the overhang of the watson strand at the three prime.""" return len(self.watson) - len(self.crick) + self.ovhg
        - def __add__(self: DseqType, other: DseqType) -> DseqType: """Simulates ligation between two DNA fragments. @@ -1217,9 +1179,7 @@

        Source code for pydna.dseq

                             break
                 return self.watson + stuffer
         
        -
        -[docs] - def fill_in(self, nucleotides: _Union[None, str] = None) -> "Dseq": +
        [docs] def fill_in(self, nucleotides: _Union[None, str] = None) -> "Dseq": """Fill in of five prime protruding end with a DNA polymerase that has only DNA polymerase activity (such as exo-klenow [#]_) and any combination of A, G, C or T. Default are all four @@ -1284,22 +1244,13 @@

        Source code for pydna.dseq

                 watson = self._fill_in_three_prime(nucleotides)
                 return Dseq(watson, crick, ovhg)
        - -
        -[docs] - def transcribe(self) -> _Seq: +
        [docs] def transcribe(self) -> _Seq: return _Seq(self.watson).transcribe()
        - -
        -[docs] - def translate(self, table="Standard", stop_symbol="*", to_stop=False, cds=False, gap="-") -> _Seq: +
        [docs] def translate(self, table="Standard", stop_symbol="*", to_stop=False, cds=False, gap="-") -> _Seq: return _Seq(_translate_str(str(self), table, stop_symbol, to_stop, cds, gap=gap))
        - -
        -[docs] - def mung(self) -> "Dseq": +
        [docs] def mung(self) -> "Dseq": """ Simulates treatment a nuclease with 5'-3' and 3'-5' single strand specific exonuclease activity (such as mung bean nuclease [#]_) @@ -1342,10 +1293,7 @@

        Source code for pydna.dseq

                 """
                 return Dseq(self.watson[max(0, -self.ovhg) : min(len(self.watson), len(self.crick) - self.ovhg)])
        - -
        -[docs] - def T4(self, nucleotides=None) -> "Dseq": +
        [docs] def T4(self, nucleotides=None) -> "Dseq": """Fill in five prime protruding ends and chewing back three prime protruding ends by a DNA polymerase providing both 5'-3' DNA polymerase activity and 3'-5' nuclease acitivty @@ -1424,31 +1372,22 @@

        Source code for pydna.dseq

                 watson = watson[: x + 1]
                 return Dseq(watson, crick, ovhg)
        - t4 = T4 # alias for the T4 method. -
        -[docs] - def exo1_front(self: DseqType, n=1) -> DseqType: +
        [docs] def exo1_front(self: DseqType, n=1) -> DseqType: """5'-3' resection at the start (left side) of the molecule.""" d = _copy.deepcopy(self) d.ovhg += n d.watson = d.watson[n:] return d
        - -
        -[docs] - def exo1_end(self: DseqType, n=1) -> DseqType: +
        [docs] def exo1_end(self: DseqType, n=1) -> DseqType: """5'-3' resection at the end (right side) of the molecule.""" d = _copy.deepcopy(self) d.crick = d.crick[n:] return d
        - -
        -[docs] - def no_cutters(self, batch: _Union[_RestrictionBatch, None] = None) -> _RestrictionBatch: +
        [docs] def no_cutters(self, batch: _Union[_RestrictionBatch, None] = None) -> _RestrictionBatch: """Enzymes in a RestrictionBatch not cutting sequence.""" if batch is None: batch = CommOnly @@ -1456,30 +1395,21 @@

        Source code for pydna.dseq

                 ncut = {enz: sitelist for (enz, sitelist) in ana.items() if not sitelist}
                 return _RestrictionBatch(ncut)
        - -
        -[docs] - def unique_cutters(self, batch: _Union[_RestrictionBatch, None] = None) -> _RestrictionBatch: +
        [docs] def unique_cutters(self, batch: _Union[_RestrictionBatch, None] = None) -> _RestrictionBatch: """Enzymes in a RestrictionBatch cutting sequence once.""" if batch is None: batch = CommOnly return self.n_cutters(n=1, batch=batch)
        - once_cutters = unique_cutters # alias for unique_cutters -
        -[docs] - def twice_cutters(self, batch: _Union[_RestrictionBatch, None] = None) -> _RestrictionBatch: +
        [docs] def twice_cutters(self, batch: _Union[_RestrictionBatch, None] = None) -> _RestrictionBatch: """Enzymes in a RestrictionBatch cutting sequence twice.""" if batch is None: batch = CommOnly return self.n_cutters(n=2, batch=batch)
        - -
        -[docs] - def n_cutters(self, n=3, batch: _Union[_RestrictionBatch, None] = None) -> _RestrictionBatch: +
        [docs] def n_cutters(self, n=3, batch: _Union[_RestrictionBatch, None] = None) -> _RestrictionBatch: """Enzymes in a RestrictionBatch cutting n times.""" if batch is None: batch = CommOnly @@ -1487,10 +1417,7 @@

        Source code for pydna.dseq

                 ncut = {enz: sitelist for (enz, sitelist) in ana.items() if len(sitelist) == n}
                 return _RestrictionBatch(ncut)
        - -
        -[docs] - def cutters(self, batch: _Union[_RestrictionBatch, None] = None) -> _RestrictionBatch: +
        [docs] def cutters(self, batch: _Union[_RestrictionBatch, None] = None) -> _RestrictionBatch: """Enzymes in a RestrictionBatch cutting sequence at least once.""" if batch is None: batch = CommOnly @@ -1498,10 +1425,7 @@

        Source code for pydna.dseq

                 ncut = {enz: sitelist for (enz, sitelist) in ana.items() if sitelist}
                 return _RestrictionBatch(ncut)
        - -
        -[docs] - def seguid(self) -> str: +
        [docs] def seguid(self) -> str: """SEGUID checksum for the sequence.""" if self.circular: cs = _cdseguid(self.watson.upper(), self.crick.upper(), alphabet="{DNA-extended}") @@ -1512,10 +1436,7 @@

        Source code for pydna.dseq

                     cs = _ldseguid(w, c, alphabet="{DNA-extended}")
                 return cs
        - -
        -[docs] - def isblunt(self) -> bool: +
        [docs] def isblunt(self) -> bool: """isblunt. Return True if Dseq is linear and blunt and @@ -1555,10 +1476,7 @@

        Source code for pydna.dseq

                 """
                 return self.ovhg == 0 and len(self.watson) == len(self.crick) and not self.circular
        - -
        -[docs] - def cas9(self, RNA: str) -> _Tuple[slice, ...]: +
        [docs] def cas9(self, RNA: str) -> _Tuple[slice, ...]: """docstring.""" bRNA = bytes(RNA, "ASCII") slices = [] @@ -1569,20 +1487,14 @@

        Source code for pydna.dseq

                 slices = tuple(slice(x, y, 1) for x, y in zip(cuts, cuts[1:]))
                 return slices
        - -
        -[docs] - def terminal_transferase(self, nucleotides="a") -> "Dseq": +
        [docs] def terminal_transferase(self, nucleotides="a") -> "Dseq": """docstring.""" ovhg = self.ovhg if self.ovhg >= 0: ovhg += len(nucleotides) return Dseq(self.watson + nucleotides, self.crick + nucleotides, ovhg)
        - -
        -[docs] - def cut(self: DseqType, *enzymes: EnzymesType) -> _Tuple[DseqType, ...]: +
        [docs] def cut(self: DseqType, *enzymes: EnzymesType) -> _Tuple[DseqType, ...]: """Returns a list of linear Dseq fragments produced in the digestion. If there are no cuts, an empty list is returned. @@ -1632,10 +1544,7 @@

        Source code for pydna.dseq

                 cutsite_pairs = self.get_cutsite_pairs(cutsites)
                 return tuple(self.apply_cut(*cs) for cs in cutsite_pairs)
        - -
        -[docs] - def cutsite_is_valid(self, cutsite: CutSiteType) -> bool: +
        [docs] def cutsite_is_valid(self, cutsite: CutSiteType) -> bool: """Returns False if: - Cut positions fall outside the sequence (could be moved to Biopython) - Overhang is not double stranded @@ -1684,10 +1593,7 @@

        Source code for pydna.dseq

         
                 return True
        - -
        -[docs] - def get_cutsites(self: DseqType, *enzymes: EnzymesType) -> _List[CutSiteType]: +
        [docs] def get_cutsites(self: DseqType, *enzymes: EnzymesType) -> _List[CutSiteType]: """Returns a list of cutsites, represented represented as `((cut_watson, ovhg), enz)`: - `cut_watson` is a positive integer contained in `[0,len(seq))`, where `seq` is the sequence @@ -1755,10 +1661,7 @@

        Source code for pydna.dseq

         
                 return sorted([cutsite for cutsite in out if self.cutsite_is_valid(cutsite)])
        - -
        -[docs] - def left_end_position(self) -> _Tuple[int, int]: +
        [docs] def left_end_position(self) -> _Tuple[int, int]: """ The index in the full sequence of the watson and crick start positions. @@ -1775,10 +1678,7 @@

        Source code for pydna.dseq

                     return self.ovhg, 0
                 return 0, -self.ovhg
        - -
        -[docs] - def right_end_position(self) -> _Tuple[int, int]: +
        [docs] def right_end_position(self) -> _Tuple[int, int]: """The index in the full sequence of the watson and crick end positions. full sequence (str(self)) for all three cases is AAA @@ -1794,10 +1694,7 @@

        Source code for pydna.dseq

                     return len(self) + self.watson_ovhg(), len(self)
                 return len(self), len(self) - self.watson_ovhg()
        - -
        -[docs] - def get_cut_parameters(self, cut: _Union[CutSiteType, None], is_left: bool) -> _Tuple[int, int, int]: +
        [docs] def get_cut_parameters(self, cut: _Union[CutSiteType, None], is_left: bool) -> _Tuple[int, int, int]: """For a given cut expressed as ((cut_watson, ovhg), enz), returns a tuple (cut_watson, cut_crick, ovhg). @@ -1824,10 +1721,7 @@

        Source code for pydna.dseq

                 # In the right end, the overhang does not matter
                 return *self.right_end_position(), self.watson_ovhg()
        - -
        -[docs] - def apply_cut(self, left_cut: CutSiteType, right_cut: CutSiteType) -> "Dseq": +
        [docs] def apply_cut(self, left_cut: CutSiteType, right_cut: CutSiteType) -> "Dseq": """Extracts a subfragment of the sequence between two cuts. For more detail see the documentation of get_cutsite_pairs. @@ -1894,10 +1788,7 @@

        Source code for pydna.dseq

                     ovhg=ovhg_left,
                 )
        - -
        -[docs] - def get_cutsite_pairs( +
        [docs] def get_cutsite_pairs( self, cutsites: _List[CutSiteType] ) -> _List[_Tuple[_Union[None, CutSiteType], _Union[None, CutSiteType]]]: """Returns pairs of cutsites that render the edges of the resulting fragments. @@ -1948,9 +1839,7 @@

        Source code for pydna.dseq

                     # Add the first cutsite at the end, for circular cuts
                     cutsites.append(cutsites[0])
         
        -        return list(zip(cutsites, cutsites[1:]))
        -
        - + return list(zip(cutsites, cutsites[1:]))
        if __name__ == "__main__": diff --git a/_modules/pydna/dseqrecord.html b/_modules/pydna/dseqrecord.html index df8423fd..d984c8e7 100644 --- a/_modules/pydna/dseqrecord.html +++ b/_modules/pydna/dseqrecord.html @@ -1,20 +1,22 @@ - + - pydna.dseqrecord — pydna 0.0.0.post1+9d112d7 documentation + pydna.dseqrecord — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -119,9 +128,7 @@

        Source code for pydna.dseqrecord

                 return item
         
         
        -
        -[docs] -class Dseqrecord(_SeqRecord): +
        [docs]class Dseqrecord(_SeqRecord): """Dseqrecord is a double stranded version of the Biopython SeqRecord [#]_ class. The Dseqrecord object holds a Dseq object describing the sequence. Additionally, Dseqrecord hold meta information about the sequence in the @@ -272,9 +279,7 @@

        Source code for pydna.dseqrecord

                 self.n = n  # amount, set to 5E-14 which is 5 pmols
                 self.annotations.update({"molecule_type": "DNA"})
         
        -
        -[docs] - @classmethod +
        [docs] @classmethod def from_string( cls, record: str = "", @@ -307,10 +312,7 @@

        Source code for pydna.dseqrecord

                 obj.__dict__.update(kwargs)
                 return obj
        - -
        -[docs] - @classmethod +
        [docs] @classmethod def from_SeqRecord( cls, record: _SeqRecord, @@ -335,25 +337,19 @@

        Source code for pydna.dseqrecord

                 obj.seq = _Dseq.quick(str(record.seq), _rc(str(record.seq)), ovhg=0, circular=circular)
                 return obj
        - @property def circular(self): """The circular property can not be set directly. Use :meth:`looped`""" return self.seq.circular -
        -[docs] - def m(self): +
        [docs] def m(self): """This method returns the mass of the DNA molecule in grams. This is calculated as the product between the molecular weight of the Dseq object and the""" return self.seq.mw() * self.n # Da(g/mol) * mol = g
        - -
        -[docs] - def extract_feature(self, n): +
        [docs] def extract_feature(self, n): """Extracts a feature and creates a new Dseqrecord object. Parameters @@ -377,10 +373,7 @@

        Source code for pydna.dseqrecord

                 """
                 return super().extract_feature(n)
        - -
        -[docs] - def add_feature(self, x=None, y=None, seq=None, type_="misc", strand=1, *args, **kwargs): +
        [docs] def add_feature(self, x=None, y=None, seq=None, type_="misc", strand=1, *args, **kwargs): """Add a feature of type misc to the feature list of the sequence. Parameters @@ -426,10 +419,7 @@

        Source code for pydna.dseqrecord

         
                 self.features.append(sf)
        - -
        -[docs] - def seguid(self): +
        [docs] def seguid(self): """Url safe SEGUID for the sequence. This checksum is the same as seguid but with base64.urlsafe @@ -447,10 +437,7 @@

        Source code for pydna.dseqrecord

                 """
                 return self.seq.seguid()
        - -
        -[docs] - def looped(self): +
        [docs] def looped(self): """ Circular version of the Dseqrecord object. @@ -496,10 +483,7 @@

        Source code for pydna.dseqrecord

         
                 return new
        - -
        -[docs] - def tolinear(self): # pragma: no cover +
        [docs] def tolinear(self): # pragma: no cover """ Returns a linear, blunt copy of a circular Dseqrecord object. The underlying Dseq object has to be circular. @@ -534,10 +518,7 @@

        Source code for pydna.dseqrecord

         
                 return new
        - -
        -[docs] - def terminal_transferase(self, nucleotides="a"): +
        [docs] def terminal_transferase(self, nucleotides="a"): """docstring.""" newseq = _copy.deepcopy(self) newseq.seq = self.seq.terminal_transferase(nucleotides) @@ -545,10 +526,7 @@

        Source code for pydna.dseqrecord

                     feature.location += len(nucleotides)
                 return newseq
        - -
        -[docs] - def format(self, f="gb"): +
        [docs] def format(self, f="gb"): """Returns the sequence as a string using a format supported by Biopython SeqIO [#]_. Default is "gb" which is short for Genbank. @@ -589,10 +567,7 @@

        Source code for pydna.dseqrecord

                     record.annotations["topology"] = "linear"
                 return _SeqRecord.format(record, f).strip()
        - -
        -[docs] - def write(self, filename=None, f="gb"): +
        [docs] def write(self, filename=None, f="gb"): """Writes the Dseqrecord to a file using the format f, which must be a format supported by Biopython SeqIO for writing [#]_. Default is "gb" which is short for Genbank. Note that Biopython SeqIO reads @@ -705,10 +680,7 @@

        Source code for pydna.dseqrecord

                             fp.write(self.format(f))
                 return _display_html(msg, raw=True)
        - -
        -[docs] - def find(self, other): +
        [docs] def find(self, other): # TODO allow strings, seqs, seqrecords or Dseqrecords # TODO check for linearity of other, raise exception if not # TODO add tests and docstring for this method @@ -721,7 +693,6 @@

        Source code for pydna.dseqrecord

                     s = str(self.seq).upper() + str(self.seq).upper()[: len(other) - 1]
                 return s.find(o)
        - def __str__(self): return ("Dseqrecord\n" "circular: {}\n" "size: {}\n").format(self.circular, len(self)) + _SeqRecord.__str__( self @@ -740,9 +711,7 @@

        Source code for pydna.dseqrecord

                             return True
                 return False
         
        -
        -[docs] - def find_aminoacids(self, other): +
        [docs] def find_aminoacids(self, other): """ >>> from pydna.dseqrecord import Dseqrecord >>> s=Dseqrecord("atgtacgatcgtatgctggttatattttag") @@ -790,12 +759,9 @@

        Source code for pydna.dseqrecord

                 else:
                     return slice(frame + start * 3 + oh, frame + (start + len(other)) * 3 + oh)
        - find_aa = find_aminoacids -
        -[docs] - def map_trace_files(self, pth, limit=25): # TODO allow path-like objects +
        [docs] def map_trace_files(self, pth, limit=25): # TODO allow path-like objects import glob traces = [] @@ -868,7 +834,6 @@

        Source code for pydna.dseqrecord

         
                 return [x.annotations["filename"] for x in matching_reads]
        - def __repr__(self): return "Dseqrecord({}{})".format({True: "-", False: "o"}[not self.circular], len(self)) @@ -970,9 +935,7 @@

        Source code for pydna.dseqrecord

                 """__hash__ must be based on __eq__."""
                 return hash((str(self.seq).lower(), str(tuple(sorted(self.__dict__.items())))))
         
        -
        -[docs] - def linearize(self, *enzymes): +
        [docs] def linearize(self, *enzymes): """Similar to `:func:cut`. Throws an exception if there is not excactly one cut @@ -990,60 +953,36 @@

        Source code for pydna.dseqrecord

                 answer.name = answer.id[:16]
                 return fragments[0]
        - -
        -[docs] - def no_cutters(self, batch: _RestrictionBatch = None): +
        [docs] def no_cutters(self, batch: _RestrictionBatch = None): """docstring.""" return self.seq.no_cutters(batch=batch or CommOnly)
        - -
        -[docs] - def unique_cutters(self, batch: _RestrictionBatch = None): +
        [docs] def unique_cutters(self, batch: _RestrictionBatch = None): """docstring.""" return self.seq.unique_cutters(batch=batch or CommOnly)
        - -
        -[docs] - def once_cutters(self, batch: _RestrictionBatch = None): +
        [docs] def once_cutters(self, batch: _RestrictionBatch = None): """docstring.""" return self.seq.once_cutters(batch=batch or CommOnly)
        - -
        -[docs] - def twice_cutters(self, batch: _RestrictionBatch = None): +
        [docs] def twice_cutters(self, batch: _RestrictionBatch = None): """docstring.""" return self.seq.twice_cutters(batch=batch or CommOnly)
        - -
        -[docs] - def n_cutters(self, n=3, batch: _RestrictionBatch = None): +
        [docs] def n_cutters(self, n=3, batch: _RestrictionBatch = None): """docstring.""" return self.seq.n_cutters(n=n, batch=batch or CommOnly)
        - -
        -[docs] - def cutters(self, batch: _RestrictionBatch = None): +
        [docs] def cutters(self, batch: _RestrictionBatch = None): """docstring.""" return self.seq.cutters(batch=batch or CommOnly)
        - -
        -[docs] - def number_of_cuts(self, *enzymes): +
        [docs] def number_of_cuts(self, *enzymes): """The number of cuts by digestion with the Restriction enzymes contained in the iterable.""" return sum([len(enzyme.search(self.seq)) for enzyme in _flatten(enzymes)])
        - -
        -[docs] - def cas9(self, RNA: str): +
        [docs] def cas9(self, RNA: str): """docstring.""" fragments = [] result = [] @@ -1052,10 +991,7 @@

        Source code for pydna.dseqrecord

                     result.append(fragments)
                 return result
        - -
        -[docs] - def reverse_complement(self): +
        [docs] def reverse_complement(self): """Reverse complement. Examples @@ -1087,13 +1023,10 @@

        Source code for pydna.dseqrecord

                 # answer.seq._linear = self.seq.linear
                 return answer
        - rc = reverse_complement # @_memorize("pydna.dseqrecord.Dseqrecord.synced") -
        -[docs] - def synced(self, ref, limit=25): +
        [docs] def synced(self, ref, limit=25): """This method returns a new circular sequence (Dseqrecord object), which has been rotated in such a way that there is maximum overlap between the sequence and ref, which may be a string, Biopython Seq, SeqRecord object or @@ -1179,10 +1112,7 @@

        Source code for pydna.dseqrecord

                 _module_logger.info("synced")
                 return result
        - -
        -[docs] - def upper(self): +
        [docs] def upper(self): """Returns an uppercase copy. >>> from pydna.dseqrecord import Dseqrecord >>> my_seq = Dseqrecord("aAa") @@ -1212,10 +1142,7 @@

        Source code for pydna.dseqrecord

                 upper.seq = upper.seq.upper()
                 return upper
        - -
        -[docs] - def lower(self): +
        [docs] def lower(self): """>>> from pydna.dseqrecord import Dseqrecord >>> my_seq = Dseqrecord("aAa") >>> my_seq.seq @@ -1246,17 +1173,11 @@

        Source code for pydna.dseqrecord

                 lower.seq = lower.seq.lower()
                 return lower
        - -
        -[docs] - def orfs(self, minsize=300): +
        [docs] def orfs(self, minsize=300): """docstring.""" return tuple(Dseqrecord(self[x:y]) for x, y in self.seq.orfs(minsize=minsize))
        - -
        -[docs] - def orfs_to_features(self, minsize=300): +
        [docs] def orfs_to_features(self, minsize=300): """docstring.""" features = [] for strand, s in ((1, self.seq), (-1, self.seq.rc())): @@ -1278,7 +1199,6 @@

        Source code for pydna.dseqrecord

                         )
                 return features
        - def _copy_to_clipboard(self, sequence_format): """docstring.""" from pyperclip import copy @@ -1286,25 +1206,17 @@

        Source code for pydna.dseqrecord

                 copy(self.format(sequence_format))
                 return None
         
        -
        -[docs] - def copy_gb_to_clipboard(self): +
        [docs] def copy_gb_to_clipboard(self): """docstring.""" self._copy_to_clipboard("gb") return None
        - -
        -[docs] - def copy_fasta_to_clipboard(self): +
        [docs] def copy_fasta_to_clipboard(self): """docstring.""" self._copy_to_clipboard("fasta") return None
        - -
        -[docs] - def figure(self, feature=0, highlight="\x1b[48;5;11m", plain="\x1b[0m"): +
        [docs] def figure(self, feature=0, highlight="\x1b[48;5;11m", plain="\x1b[0m"): """docstring.""" if self.features: f = self.features[feature] @@ -1344,10 +1256,7 @@

        Source code for pydna.dseqrecord

                     result += f"{s2}\n{s1}"
                 return _pretty_str(result)
        - -
        -[docs] - def shifted(self, shift): +
        [docs] def shifted(self, shift): """Circular Dseqrecord with a new origin <shift>. This only works on circular Dseqrecords. If we consider the following @@ -1408,10 +1317,7 @@

        Source code for pydna.dseqrecord

                 answer.seq = newseq
                 return answer
        - -
        -[docs] - def cut(self, *enzymes): +
        [docs] def cut(self, *enzymes): """Digest a Dseqrecord object with one or more restriction enzymes. returns a list of linear Dseqrecords. If there are no cuts, an empty @@ -1453,10 +1359,7 @@

        Source code for pydna.dseqrecord

                 cutsite_pairs = self.seq.get_cutsite_pairs(cutsites)
                 return tuple(self.apply_cut(*cs) for cs in cutsite_pairs)
        - -
        -[docs] - def apply_cut(self, left_cut, right_cut): +
        [docs] def apply_cut(self, left_cut, right_cut): dseq = self.seq.apply_cut(left_cut, right_cut) # TODO: maybe remove depending on https://github.com/BjornFJohansson/pydna/issues/161 @@ -1536,9 +1439,7 @@

        Source code for pydna.dseqrecord

                     right_edge = right_watson if right_ovhg > 0 else right_crick
                     features = self[left_edge:right_edge].features
         
        -        return Dseqrecord(dseq, features=features)
        -
        - + return Dseqrecord(dseq, features=features)
        if __name__ == "__main__": diff --git a/_modules/pydna/editor.html b/_modules/pydna/editor.html index f807583f..8ac90a74 100644 --- a/_modules/pydna/editor.html +++ b/_modules/pydna/editor.html @@ -1,20 +1,22 @@ - + - pydna.editor — pydna 0.0.0.post1+9d112d7 documentation + pydna.editor — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -97,9 +106,7 @@

        Source code for pydna.editor

         _wl = "{}{}-_.()".format(_string.ascii_letters, _string.digits)
         
         
        -
        -[docs] -class Editor: +
        [docs]class Editor: """ The Editor class needs to be instantiated before use. @@ -130,9 +137,7 @@

        Source code for pydna.editor

                 except OSError:
                     pass
         
        -
        -[docs] - def open(self, seq_to_open): +
        [docs] def open(self, seq_to_open): """Open a sequence for editing in an external (DNA) editor. Parameters @@ -170,22 +175,17 @@

        Source code for pydna.editor

                     stdout=_tempfile.TemporaryFile(),
                     stderr=_tempfile.TemporaryFile(),
                 ).pid
        -        _time.sleep(0.5)
        -
        - + _time.sleep(0.5)
        apeloader = Editor(_os.getenv("pydna_ape")) -
        -[docs] -def ape(*args, **kwargs): +
        [docs]def ape(*args, **kwargs): """docstring.""" return apeloader.open(*args, **kwargs)
        - if __name__ == "__main__": import os as _os diff --git a/_modules/pydna/fakeseq.html b/_modules/pydna/fakeseq.html new file mode 100644 index 00000000..8f746dd0 --- /dev/null +++ b/_modules/pydna/fakeseq.html @@ -0,0 +1,165 @@ + + + + + + + + pydna.fakeseq — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +

        Source code for pydna.fakeseq

        +#!/usr/bin/env python3
        +# -*- coding: utf-8 -*-
        +# Copyright 2013-2023 by Björn Johansson.  All rights reserved.
        +# This code is part of the Python-dna distribution and governed by its
        +# license.  Please see the LICENSE.txt file that should have been included
        +# as part of this package.
        +"""docstring."""
        +
        +
        +
        [docs]class FakeSeq: + """docstring.""" + + def __init__( + self, + length: int, + n: float = 50e-15, # 50 fmol = 0.05 pmol + rf: float = 0.0, + ) -> None: + self._length = length + self.n = n + self.rf = rf + +
        [docs] def m(self) -> float: + """Mass of the DNA molecule in grams.""" + # M(Da) * n (mol) = g + return self.M() * self.n
        + +
        [docs] def M(self) -> float: + """M grams/mol.""" + return (308.9 * self._length + 79.0) * 2
        + + def __len__(self) -> int: + """docstring.""" + return self._length + + def __lt__(self, other) -> bool: + """docstring.""" + return self._length < len(other) + + def __repr__(self) -> str: + """docstring.""" + return f"FakeSeq({self._length:.1e})" + + def __str__(self) -> str: + """docstring.""" + return self.__repr__()
        + + +if __name__ == "__main__": + import os as _os + + cached = _os.getenv("pydna_cached_funcs", "") + _os.environ["pydna_cached_funcs"] = "" + import doctest + + doctest.testmod(verbose=True, optionflags=doctest.ELLIPSIS) + _os.environ["pydna_cached_funcs"] = cached +
        + +
        +
        +
        + +
        + +
        +

        © Copyright 2024, Björn F. Johansson.

        +
        + + Built with Sphinx using a + theme + provided by Read the Docs. + + +
        +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/_modules/pydna/fusionpcr.html b/_modules/pydna/fusionpcr.html new file mode 100644 index 00000000..64d6b8e4 --- /dev/null +++ b/_modules/pydna/fusionpcr.html @@ -0,0 +1,194 @@ + + + + + + + + pydna.fusionpcr — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +

        Source code for pydna.fusionpcr

        +#!/usr/bin/env python3
        +# -*- coding: utf-8 -*-
        +
        +from pydna.common_sub_strings import terminal_overlap
        +from pydna.dseq import Dseq
        +from pydna.dseqrecord import Dseqrecord
        +from pydna.utils import rc
        +from itertools import combinations
        +from copy import copy
        +
        +
        +
        [docs]def fuse_by_pcr(fragments, limit=15): + """docstring.""" + + def anneal(x, y, limit=limit): + """docstring.""" + new = None + for a, b in [(x, y), (x, y.rc()), (x.rc(), y)]: + try: + ((s1, s2, ln), *r) = terminal_overlap(a.seq.watson.lower(), rc(b.seq.crick.lower()), limit=limit) + except ValueError as err: + if "not enough values to unpack" not in str(err): + raise err + else: + if s2 == 0: + new = Dseqrecord(Dseq(a.seq.watson, b.seq.crick, ovhg=-s1)) + new.features = copy(a.features) + new.features.extend([f._shift(s1) for f in b.features]) + new.left = b # Setting a new property dynamically + new.right = a # Setting a new property dynamically + elif s1 == 0: + new = Dseqrecord(Dseq(b.seq.watson, a.seq.crick, ovhg=-s2)) + new.features = copy(b.features) + new.features.extend([f._shift(s2) for f in a.features]) + new.left = a # Setting a new property dynamically + new.right = b # Setting a new property dynamically + return new + + argument = fragments + for arg in argument: + arg.left = None + arg.right = None + newfragments = [] + while True: + for a, b in combinations(fragments, 2): + new = anneal(a, b, limit) + if not new: + continue + new.anneal = new.seq + new.seq = new.seq.fill_in() + new.features = list({repr(f): f for f in new.features}.values()) + newfragments.append(new) + if newfragments: + fragments = newfragments + newfragments = [] + else: + break + + return [x for x in fragments if x not in argument]
        + + +
        [docs]def list_parts(fusion_pcr_fragment): + stack = [fusion_pcr_fragment] + processed = [] + + while stack: + obj = stack.pop() + try: + a, b = obj.right, obj.left + except AttributeError: + pass + else: + stack.extend((a, b)) + processed.append(obj) + + parts = [x for x in processed[::-1] if x] + + msg = "---\n\n" + + for part in parts: + if hasattr(part, "anneal"): + msg += repr(part.anneal) + "\n\n" + msg += f"{part.name}\n{part.seq.watson}\n{part.seq.crick[::-1]}\n\n---\n\n" + msg += repr(part.seq) + "\n\n" + + return msg
        +
        + +
        +
        +
        + +
        + +
        +

        © Copyright 2024, Björn F. Johansson.

        +
        + + Built with Sphinx using a + theme + provided by Read the Docs. + + +
        +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/_modules/pydna/gateway.html b/_modules/pydna/gateway.html new file mode 100644 index 00000000..36627f8b --- /dev/null +++ b/_modules/pydna/gateway.html @@ -0,0 +1,270 @@ + + + + + + + + pydna.gateway — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +

        Source code for pydna.gateway

        +#!/usr/bin/env python3
        +# -*- coding: utf-8 -*-
        +# Copyright 2013-2023 by Björn Johansson.  All rights reserved.
        +# This code is part of the Python-dna distribution and governed by its
        +# license.  Please see the LICENSE.txt file that should have been included
        +# as part of this package.
        +
        +"""Assembly of sequences by Gateway recombination.
        +
        +Given a list of sequences (Dseqrecords), all sequences are analyzed for
        +presence of att(P|B|L|R)N where N is 1,2,3 or 4.
        +
        +A graph is constructed where the att sites form a nodes and
        +sequences separating att sites form edges.
        +
        +The NetworkX package is used to trace linear and circular paths through the
        +graph.
        +"""
        +# from Bio.SeqFeature import ExactPosition as _ExactPosition
        +# from Bio.SeqFeature import SimpleLocation as _SimpleLocation
        +# from Bio.SeqFeature import CompoundLocation as _CompoundLocation
        +# from pydna.utils import rc as _rc
        +
        +# from pydna._pretty import pretty_str as _pretty_str
        +# from pydna.contig import Contig as _Contig
        +# from pydna.common_sub_strings import common_sub_strings
        +# from pydna.dseqrecord import Dseqrecord as _Dseqrecord
        +# import networkx as _nx
        +# from copy import deepcopy as _deepcopy
        +# import itertools as _itertools
        +import logging as _logging
        +
        +_module_logger = _logging.getLogger("pydna." + __name__)
        +
        +ambiguous_dna_regex = {
        +    "A": "T",
        +    "C": "G",
        +    "G": "C",
        +    "T": "A",
        +    "M": "[ACM]",
        +    "R": "[AGR]",
        +    "W": "[ATW]",
        +    "S": "[CGS]",
        +    "Y": "[CTY]",
        +    "K": "[GTK]",
        +    "V": "[ACGVMSR]",
        +    "H": "[ACTHMYW]",
        +    "D": "[AGTDRWK]",
        +    "B": "[CGTBSKY]",
        +    "X": "X",
        +    "N": "[ACGTBDHKMNRSVWY]",
        +}
        +
        +atts = """
        +attP1 AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT GTACAAA AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG CMASTWT AAAGYWG
        +attP2 AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT GTACAAG AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG CMASTWT AAAGYWG
        +attP3 AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT GTATAAT AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG CMASTWT AAAGYWG
        +attP4 AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT GTATAGA AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG CMASTWT AAAGYWG
        +attP5 AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT GTATACA AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG CMASTWT AAAGYWG
        +
        +attB1 CMASTWT GTACAAA AAAGYWG AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG
        +attB2 CMASTWT GTACAAG AAAGYWG AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG
        +attB3 CMASTWT GTATAAT AAAGYWG AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG
        +attB4 CMASTWT GTATAGA AAAGYWG AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG
        +attB5 CMASTWT GTATACA AAAGYWG AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG
        +
        +attR1 CMASTWT GTACAAA AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT AAAGYWG
        +attR2 CMASTWT GTACAAG AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT AAAGYWG
        +attR3 CMASTWT GTATAAT AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT AAAGYWG
        +attR4 CMASTWT GTATAGA AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT AAAGYWG
        +attR5 CMASTWT GTATACA AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT AAAGYWG
        +
        +attL1 AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT GTACAAA AAAGYWG CMASTWT AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG
        +attL2 AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT GTACAAG AAAGYWG CMASTWT AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG
        +attL3 AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT GTATAAT AAAGYWG CMASTWT AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG
        +attL4 AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT GTATAGA AAAGYWG CMASTWT AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG
        +attL5 AAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAMATTGATRAGCAATKMTTTYTTATAATGCCMASTTT GTATACA AAAGYWG CMASTWT AAAGYWGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATRCTGTAAAACACAACATATSCAGTCAYWWTG
        +"""
        +
        +
        +retable = str.maketrans(ambiguous_dna_regex)
        +
        +for line in (line for line in atts.splitlines() if line.strip()):
        +    name, *parts = line.split()
        +    for part in parts:
        +        part.translate(retable)
        +
        +
        +
        [docs]class Gateway(object): + """Assembly of linear DNA fragments into linear or circular constructs. + + The Assembly is meant to replace the Assembly method as it + is easier to use. Accepts a list of Dseqrecords (source fragments) to + initiate an Assembly object. Several methods are available for analysis + of overlapping sequences, graph construction and assembly. + + Parameters + ---------- + fragments : list + a list of Dseqrecord objects. + """ + + def __init__(self, molecules=None): + self.molecules = molecules
        + + +""" +Created on Sat Aug 21 15:41:42 2021 + +@author: bjorn + + +https://en.wikipedia.org/wiki/Cre-Lox_recombination + +13bp 8bp 13bp +ATAACTTCGTATA-NNNTANNN-TATACGAAGTTAT + + +Name 13 bp 8 bp 13 bp + Recognition Spacer Recognition + Region Region Region + +Wild-Type ATAACTTCGTATA ATGTATGC TATACGAAGTTAT +lox 511 ATAACTTCGTATA ATGTATaC TATACGAAGTTAT +lox 5171 ATAACTTCGTATA ATGTgTaC TATACGAAGTTAT +lox 2272 ATAACTTCGTATA AaGTATcC TATACGAAGTTAT +M2 ATAACTTCGTATA AgaaAcca TATACGAAGTTAT +M3 ATAACTTCGTATA taaTACCA TATACGAAGTTAT +M7 ATAACTTCGTATA AgaTAGAA TATACGAAGTTAT +M11 ATAACTTCGTATA cgaTAcca TATACGAAGTTAT +lox 71 TACCGTTCGTATA NNNTANNN TATACGAAGTTAT +lox 66 ATAACTTCGTATA NNNTANNN TATACGAACGGTA + +""" + + +""" + +https://blog.addgene.org/plasmids-101-cre-lox + +https://en.wikipedia.org/wiki/Cre-Lox_recombination + +13bp 8bp 13bp +ATAACTTCGTATA-NNNTANNN-TATACGAAGTTAT + + +Name 13 bp 8 bp 13 bp + Recognition Spacer Recognition + Region Region Region + +Wild-Type ATAACTTCGTATA ATGTATGC TATACGAAGTTAT +lox511 ATAACTTCGTATA ATGTATaC TATACGAAGTTAT +lox5171 ATAACTTCGTATA ATGTgTaC TATACGAAGTTAT +lox2272 ATAACTTCGTATA AaGTATcC TATACGAAGTTAT +M2 ATAACTTCGTATA AgaaAcca TATACGAAGTTAT +M3 ATAACTTCGTATA taaTACCA TATACGAAGTTAT +M7 ATAACTTCGTATA AgaTAGAA TATACGAAGTTAT +M11 ATAACTTCGTATA cgaTAcca TATACGAAGTTAT +lox71 TACCGTTCGTATA NNNTANNN TATACGAAGTTAT +lox66 ATAACTTCGTATA NNNTANNN TATACGAACGGTA + +""" +
        + +
        +
        +
        + +
        + +
        +

        © Copyright 2024, Björn F. Johansson.

        +
        + + Built with Sphinx using a + theme + provided by Read the Docs. + + +
        +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/_modules/pydna/gel.html b/_modules/pydna/gel.html index d1a236b9..6a0a834c 100644 --- a/_modules/pydna/gel.html +++ b/_modules/pydna/gel.html @@ -1,20 +1,22 @@ - + - pydna.gel — pydna 0.0.0.post1+9d112d7 documentation + pydna.gel — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -82,9 +91,7 @@

        Source code for pydna.gel

         from pydna.ladders import GeneRuler_1kb_plus as _mwstd
         
         
        -
        -[docs] -def interpolator(mwstd): +
        [docs]def interpolator(mwstd): """docstring.""" from scipy.interpolate import CubicSpline @@ -98,10 +105,7 @@

        Source code for pydna.gel

             return interpolator
        - -
        -[docs] -def gel(samples=None, gel_length=600, margin=50, interpolator=interpolator(mwstd=_mwstd)): +
        [docs]def gel(samples=None, gel_length=600, margin=50, interpolator=interpolator(mwstd=_mwstd)): import numpy as np from PIL import Image as Image from PIL import ImageDraw as ImageDraw @@ -164,7 +168,6 @@

        Source code for pydna.gel

             return image
        - # Inverting and rotating the gel # im = gel([ GeneRuler_1kb_plus, [band, ]]) # from PIL import ImageOps diff --git a/_modules/pydna/genbank.html b/_modules/pydna/genbank.html index 0382bd7a..401ca66c 100644 --- a/_modules/pydna/genbank.html +++ b/_modules/pydna/genbank.html @@ -1,20 +1,22 @@ - + - pydna.genbank — pydna 0.0.0.post1+9d112d7 documentation + pydna.genbank — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -96,9 +105,7 @@

        Source code for pydna.genbank

         # TODO http://httpbin.org/ use for testing?
         
         
        -
        -[docs] -class Genbank: +
        [docs]class Genbank: """Class to facilitate download from genbank. It is easier and quicker to use the :func:`pydna.genbank.genbank` function directly. @@ -244,10 +251,7 @@

        Source code for pydna.genbank

                 return _GenbankRecord(_read(text), item=item, start=seq_start, stop=seq_stop, strand=strand)
        - -
        -[docs] -def genbank(accession: str = "CS570233.1", *args, **kwargs) -> _GenbankRecord: +
        [docs]def genbank(accession: str = "CS570233.1", *args, **kwargs) -> _GenbankRecord: """ Download a genbank nuclotide record. @@ -300,7 +304,6 @@

        Source code for pydna.genbank

             return gb.nucleotide(accession, *args, **kwargs)
        - if __name__ == "__main__": cached = _os.getenv("pydna_cached_funcs", "") _os.environ["pydna_cached_funcs"] = "" diff --git a/_modules/pydna/genbankfile.html b/_modules/pydna/genbankfile.html index 77875367..54ae3f85 100644 --- a/_modules/pydna/genbankfile.html +++ b/_modules/pydna/genbankfile.html @@ -1,20 +1,22 @@ - + - pydna.genbankfile — pydna 0.0.0.post1+9d112d7 documentation + pydna.genbankfile — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -76,22 +85,17 @@

        Source code for pydna.genbankfile

         from pydna.dseqrecord import Dseqrecord as _Dseqrecord
         
         
        -
        -[docs] -class GenbankFile(_Dseqrecord): +
        [docs]class GenbankFile(_Dseqrecord): def __init__(self, record, *args, path=None, **kwargs): super().__init__(record, *args, **kwargs) self.path = path -
        -[docs] - @classmethod +
        [docs] @classmethod def from_SeqRecord(cls, record, *args, path=None, **kwargs): obj = super().from_SeqRecord(record, *args, **kwargs) obj.path = path return obj
        - def __repr__(self): """returns a short string representation of the object""" return "File({})({}{})".format(self.id, {True: "-", False: "o"}[not self.circular], len(self)) @@ -103,17 +107,13 @@

        Source code for pydna.genbankfile

             def _repr_html_(self):
                 return "<a href='{path}' target='_blank'>{path}</a><br>".format(path=self.path)
         
        -
        -[docs] - def reverse_complement(self): +
        [docs] def reverse_complement(self): answer = type(self)(super().reverse_complement(), path=self.path) return answer
        - rc = reverse_complement
        - if __name__ == "__main__": import os as _os diff --git a/_modules/pydna/genbankfixer.html b/_modules/pydna/genbankfixer.html index 739825e9..e7c14f2a 100644 --- a/_modules/pydna/genbankfixer.html +++ b/_modules/pydna/genbankfixer.html @@ -1,20 +1,22 @@ - + - pydna.genbankfixer — pydna 0.0.0.post1+9d112d7 documentation + pydna.genbankfixer — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -221,9 +230,7 @@

        Source code for pydna.genbankfixer

         featLocation = _pp.Group(SimpleSlice | complexSlice)
         
         
        -
        -[docs] -def parseGBLoc(s, l_, t): +
        [docs]def parseGBLoc(s, l_, t): """retwingles parsed genbank location strings, assumes no joins of RC and FWD sequences""" strand = 1 locationlist = [] @@ -241,27 +248,20 @@

        Source code for pydna.genbankfixer

             return [["location", locationlist], ["strand", strand]]
        - featLocation.setParseAction(parseGBLoc) # ==== Genbank Feature Key-Value Pairs -
        -[docs] -def strip_multiline(s, l_, t): +
        [docs]def strip_multiline(s, l_, t): whitespace = _re.compile("[\n]{1}[ ]+") return whitespace.sub(" ", t[0])
        - -
        -[docs] -def toInt(s, l_, t): +
        [docs]def toInt(s, l_, t): return int(t[0])
        - # Quoted KeyVal: /key="value" QuoteFeaturekeyval = _pp.Group( _pp.Suppress("/") @@ -341,17 +341,12 @@

        Source code for pydna.genbankfixer

         # Main JSON Conversion Routine
         
         
        -
        -[docs] -def strip_indent(str): +
        [docs]def strip_indent(str): whitespace = _re.compile("[\n]{1}(COMMENT){0,1}[ ]+") return whitespace.sub("\n", str)
        - -
        -[docs] -def concat_dict(dlist): +
        [docs]def concat_dict(dlist): """more or less dict(list of string pairs) but merges vals with the same keys so no duplicates occur """ @@ -364,10 +359,7 @@

        Source code for pydna.genbankfixer

             return newdict
        - -
        -[docs] -def toJSON(gbkstring): +
        [docs]def toJSON(gbkstring): parsed = multipleGB.parseString(gbkstring) jseqlist = [] @@ -416,10 +408,7 @@

        Source code for pydna.genbankfixer

             return jseqlist
        - -
        -[docs] -def wrapstring(str_, rowstart, rowend, padfirst=True): +
        [docs]def wrapstring(str_, rowstart, rowend, padfirst=True): """ wraps the provided string in lines of length rowend-rowstart and padded on the left by rowstart. @@ -449,10 +438,7 @@

        Source code for pydna.genbankfixer

             return wrappedstr
        - -
        -[docs] -def locstr(locs, strand): +
        [docs]def locstr(locs, strand): "genbank formatted location string, assumes no join'd combo of rev and fwd seqs" # slice format is like: 1..10,20..30,101..200 locstr = ",".join(map((lambda x: str(x[0]) + ".." + str(x[1])), locs)) @@ -463,10 +449,7 @@

        Source code for pydna.genbankfixer

             return locstr
        - -
        -[docs] -def originstr(sequence): +
        [docs]def originstr(sequence): "formats dna sequence as broken, numbered lines ala genbank" wordlen = 10 cols = 6 @@ -494,10 +477,7 @@

        Source code for pydna.genbankfixer

             return outstr
        - -
        -[docs] -def toGB(jseq): +
        [docs]def toGB(jseq): "parses json jseq data and prints out ApE compatible genbank" # construct the LOCUS header string @@ -587,10 +567,7 @@

        Source code for pydna.genbankfixer

             return locusstr + gbprops + featuresstr + gborigin
        - -
        -[docs] -def gbtext_clean(gbtext): +
        [docs]def gbtext_clean(gbtext): """This function takes a string containing **one** genbank sequence in Genbank format and returns a named tuple containing two fields, the gbtext containing a string with the corrected genbank sequence and @@ -673,7 +650,6 @@

        Source code for pydna.genbankfixer

             return result
        - if __name__ == "__main__": import os as _os diff --git a/_modules/pydna/genbankrecord.html b/_modules/pydna/genbankrecord.html index df5e257a..d96d3b39 100644 --- a/_modules/pydna/genbankrecord.html +++ b/_modules/pydna/genbankrecord.html @@ -1,20 +1,22 @@ - + - pydna.genbankrecord — pydna 0.0.0.post1+9d112d7 documentation + pydna.genbankrecord — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -79,9 +88,7 @@

        Source code for pydna.genbankrecord

         import os as _os
         
         
        -
        -[docs] -class GenbankRecord(_Dseqrecord): +
        [docs]class GenbankRecord(_Dseqrecord): def __init__(self, record, *args, item="accession", start=None, stop=None, strand=1, **kwargs): super().__init__(record, *args, **kwargs) self.item = item @@ -102,9 +109,7 @@

        Source code for pydna.genbankrecord

                     )
                 )
         
        -
        -[docs] - @classmethod +
        [docs] @classmethod def from_string( cls, record: str = "", @@ -136,10 +141,7 @@

        Source code for pydna.genbankrecord

                 )
                 return obj
        - -
        -[docs] - @classmethod +
        [docs] @classmethod def from_SeqRecord(cls, record, *args, item="accession", start=None, stop=None, strand=1, **kwargs): obj = super().from_SeqRecord(record, *args, **kwargs) obj.item = item @@ -161,7 +163,6 @@

        Source code for pydna.genbankrecord

                 )
                 return obj
        - def __getitem__(self, sl): answer = super().__getitem__(sl) answer.item = self.item @@ -181,9 +182,7 @@

        Source code for pydna.genbankrecord

             def _repr_html_(self):
                 return self.hyperlink
         
        -
        -[docs] - def reverse_complement(self): +
        [docs] def reverse_complement(self): answer = type(self)( super().reverse_complement(), item=self.item, @@ -193,12 +192,9 @@

        Source code for pydna.genbankrecord

                 )
                 return answer
        - rc = reverse_complement -
        -[docs] - def pydna_code(self): +
        [docs] def pydna_code(self): """docstring.""" # FIXME code = ( @@ -218,10 +214,7 @@

        Source code for pydna.genbankrecord

         
                 return _ps(code)
        - -
        -[docs] - def biopython_code(self): +
        [docs] def biopython_code(self): """docstring.""" # FIXME code = ( @@ -244,9 +237,7 @@

        Source code for pydna.genbankrecord

         
                 code += "record = SeqIO.read(handle, 'genbank')"
         
        -        return _ps(code)
        -
        - + return _ps(code)
        if __name__ == "__main__": diff --git a/_modules/pydna/ligate.html b/_modules/pydna/ligate.html new file mode 100644 index 00000000..4f8415f7 --- /dev/null +++ b/_modules/pydna/ligate.html @@ -0,0 +1,176 @@ + + + + + + + + pydna.ligate — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +

        Source code for pydna.ligate

        +#!/usr/bin/env python3
        +# -*- coding: utf-8 -*-
        +# Copyright 2013-2023 by Björn Johansson.  All rights reserved.
        +# This code is part of the Python-dna distribution and governed by its
        +# license.  Please see the LICENSE.txt file that should have been included
        +# as part of this package.
        +"""docstring."""
        +from operator import add
        +from functools import reduce
        +import networkx as _nx
        +from itertools import permutations
        +import logging as _logging
        +
        +_module_logger = _logging.getLogger("pydna." + __name__)
        +
        +
        +
        [docs]def ligate(fragments: list): + """docstring.""" + G = _nx.DiGraph() + G.add_nodes_from(["begin", "end"]) + fragments = fragments[:] + + fragments.extend(f.rc() for f in fragments[1:]) + + for node in fragments: + G.add_edge("begin", node) + G.add_edge(node, "end") + + for seq1, seq2 in permutations(fragments, 2): + try: + seq1 + seq2 + except TypeError as err: + if str(err) != "sticky ends not compatible!": + raise + else: + if seq1.seq.three_prime_end() != ( + "blunt", + "", + ) and seq2.seq.five_prime_end() != ("blunt", ""): + G.add_edge(seq1, seq2) + try: + G.remove_edge("begin", seq2) + except _nx.NetworkXError as err: + if "not in graph" not in str(err): + raise + try: + G.remove_edge(seq1, "end") + except _nx.NetworkXError as err: + if "not in graph" not in str(err): + raise + + cpaths = [p for p in sorted(_nx.simple_cycles(G), key=len) if len(p) > 1] + csequences = [reduce(add, x).looped() for x in cpaths] + lpaths = [p for p in sorted(_nx.all_simple_paths(G, "begin", "end"), key=len) if len(p) > 3] + lsequences = [reduce(add, lp[1:-1]) for lp in lpaths] + + return csequences, lsequences
        + + +if __name__ == "__main__": + import os as _os + + cached = _os.getenv("pydna_cached_funcs", "") + _os.environ["pydna_cached_funcs"] = "" + import doctest + + doctest.testmod(verbose=True, optionflags=doctest.ELLIPSIS) + _os.environ["pydna_cached_funcs"] = cached +
        + +
        +
        +
        + +
        + +
        +

        © Copyright 2024, Björn F. Johansson.

        +
        + + Built with Sphinx using a + theme + provided by Read the Docs. + + +
        +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/_modules/pydna/myprimers.html b/_modules/pydna/myprimers.html index e69b07ab..918d0aba 100644 --- a/_modules/pydna/myprimers.html +++ b/_modules/pydna/myprimers.html @@ -1,20 +1,22 @@ - + - pydna.myprimers — pydna 0.0.0.post1+9d112d7 documentation + pydna.myprimers — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -116,9 +125,7 @@

        Source code for pydna.myprimers

         from builtins import __dict__ as _kw
         
         
        -
        -[docs] -class PrimerList(_UserList): +
        [docs]class PrimerList(_UserList): """Read a text file with primers. The primers can be of any format readable by the parse_primers @@ -188,9 +195,7 @@

        Source code for pydna.myprimers

                 """docstring."""
                 return [self.data[i] for i in self.accessed_indices]
         
        -
        -[docs] - def assign_numbers(self, lst: list): +
        [docs] def assign_numbers(self, lst: list): """Find new primers in lst. Returns a string containing new primers with their assigned @@ -220,10 +225,7 @@

        Source code for pydna.myprimers

                 newold = new + found
                 return _pretty_str("\n".join([p.format("primer") for p in newold]))
        - -
        -[docs] - def pydna_code_from_list(self, lst: list): +
        [docs] def pydna_code_from_list(self, lst: list): """Pydna code for a list of primer objects.""" indices = [] prstrs = [str(p.seq).upper() for p in self.data] @@ -248,24 +250,17 @@

        Source code for pydna.myprimers

                 msg += "\n''')"
                 return _pretty_str(msg)
        - -
        -[docs] - def open_folder(self): +
        [docs] def open_folder(self): """Open folder where primer file is located.""" if self.path: _open_folder(self.path.parent) else: raise ValueError("path property not set.")
        - code = pydna_code_from_list
        - -
        -[docs] -def check_primer_numbers(pl: list = None): +
        [docs]def check_primer_numbers(pl: list = None): """Find primers whose number do not match position in list.""" if not pl: pl = PrimerList() @@ -276,20 +271,14 @@

        Source code for pydna.myprimers

             return primers_with_wrong_number
        - -
        -[docs] -def undefined_sequence(pl: list = None): +
        [docs]def undefined_sequence(pl: list = None): """Primers in list with N or n instead of a sequence.""" if not pl: pl = PrimerList() return [p for p in pl if _re.match("N+", str(p.seq.upper()))]
        - -
        -[docs] -def find_duplicate_primers(pl: list = None): +
        [docs]def find_duplicate_primers(pl: list = None): """Find a list of lists with duplicated primer sequences.""" if not pl: pl = PrimerList() @@ -299,7 +288,6 @@

        Source code for pydna.myprimers

             return [pl for ps, pl in pg.items() if len(pl) > 1]
        - if __name__ == "__main__": cache = _os.getenv("pydna_cache") _os.environ["pydna_cache"] = "nocache" diff --git a/_modules/pydna/parsers.html b/_modules/pydna/parsers.html index 5b7d627c..e8958474 100644 --- a/_modules/pydna/parsers.html +++ b/_modules/pydna/parsers.html @@ -1,20 +1,22 @@ - + - pydna.parsers — pydna 0.0.0.post1+9d112d7 documentation + pydna.parsers — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -116,9 +125,7 @@

        Source code for pydna.parsers

         # use https://regex101.com to get an idea how it works.
         
         
        -
        -[docs] -def extract_from_text(text): +
        [docs]def extract_from_text(text): """docstring.""" data = _textwrap.dedent(str(text)) mos = list(_re.finditer(gb_fasta_embl_regex, data + "\n\n", flags=_re.MULTILINE)) @@ -140,10 +147,7 @@

        Source code for pydna.parsers

             return tuple(mo.group(0) for mo in mos), tuple(gaps)
        - -
        -[docs] -def embl_gb_fasta(text): +
        [docs]def embl_gb_fasta(text): """Parse embl, genbank or fasta format from text. Returns list of Bio.SeqRecord.SeqRecord @@ -198,10 +202,7 @@

        Source code for pydna.parsers

             return tuple(result_list)
        - -
        -[docs] -def parse(data, ds=True): +
        [docs]def parse(data, ds=True): """Return *all* DNA sequences found in data. If no sequences are found, an empty list is returned. This is a greedy @@ -280,15 +281,11 @@

        Source code for pydna.parsers

             return sequences
        - -
        -[docs] -def parse_primers(data): +
        [docs]def parse_primers(data): """docstring.""" return [_Primer(x) for x in parse(data, ds=False)]
        - if __name__ == "__main__": cached = _os.getenv("pydna_cached_funcs", "") _os.environ["pydna_cached_funcs"] = "" diff --git a/_modules/pydna/primer.html b/_modules/pydna/primer.html index 9005642a..0d35966b 100644 --- a/_modules/pydna/primer.html +++ b/_modules/pydna/primer.html @@ -1,20 +1,22 @@ - + - pydna.primer — pydna 0.0.0.post1+9d112d7 documentation + pydna.primer — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -80,9 +89,7 @@

        Source code for pydna.primer

         from pydna.seqrecord import SeqRecord as _SeqRecord
         
         
        -
        -[docs] -class Primer(_SeqRecord): +
        [docs]class Primer(_SeqRecord): """Primer and its position on a template, footprint and tail.""" def __init__(self, record, *args, amplicon=None, position=None, footprint=0, **kwargs): @@ -121,17 +128,13 @@

        Source code for pydna.primer

                     result._fp = self._fp - (i1 - j1 > 0) * abs(i1 - j1)
                 return result
         
        -
        -[docs] - def reverse_complement(self, *args, **kwargs): +
        [docs] def reverse_complement(self, *args, **kwargs): """Return the reverse complement of the sequence.""" answer = super().reverse_complement(*args, **kwargs) answer.amplicon = None answer.position = None answer._fp = len(self) - return answer
        -
        - + return answer
        if __name__ == "__main__": diff --git a/_modules/pydna/readers.html b/_modules/pydna/readers.html index 9a99c0dd..c188c55d 100644 --- a/_modules/pydna/readers.html +++ b/_modules/pydna/readers.html @@ -1,20 +1,22 @@ - + - pydna.readers — pydna 0.0.0.post1+9d112d7 documentation + pydna.readers — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -79,9 +88,7 @@

        Source code for pydna.readers

         from pydna.primer import Primer as _Primer
         
         
        -
        -[docs] -def read(data, ds=True): +
        [docs]def read(data, ds=True): """This function is similar the :func:`parse` function but expects one and only one sequence or and exception is thrown. @@ -120,17 +127,13 @@

        Source code for pydna.readers

             return result
        - -
        -[docs] -def read_primer(data): +
        [docs]def read_primer(data): """Use this function to read a primer sequence from a string or a local file. The usage is similar to the :func:`parse_primer` function.""" return _Primer(read(data, ds=False))
        - if __name__ == "__main__": import os as _os diff --git a/_modules/pydna/seq.html b/_modules/pydna/seq.html new file mode 100644 index 00000000..45875baf --- /dev/null +++ b/_modules/pydna/seq.html @@ -0,0 +1,353 @@ + + + + + + + + pydna.seq — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +

        Source code for pydna.seq

        +#!/usr/bin/env python3
        +# -*- coding: utf-8 -*-
        +
        +"""
        +A subclass of the Biopython SeqRecord class.
        +
        +Has a number of extra methods and uses
        +the :class:`pydna._pretty_str.pretty_str` class instread of str for a
        +nicer output in the IPython shell.
        +"""
        +
        +# from pydna.codon import weights as _weights
        +from Bio.SeqUtils.ProtParam import ProteinAnalysis
        +from pydna.codon import rare_codons as _rare_codons
        +from pydna.codon import start as _start
        +from pydna.codon import stop as _stop
        +from pydna.codon import n_end as _n_end
        +from seguid import lsseguid as _lsseguid
        +from pydna.utils import rc as _rc
        +
        +from Bio.SeqUtils import seq3 as _seq3
        +from Bio.SeqUtils import gc_fraction as _GC
        +import re as _re
        +from Bio.Seq import Seq as _Seq
        +from pydna._pretty import PrettyTable as _PrettyTable
        +
        +from typing import List as _List, Optional as _Optional, Tuple as _Tuple
        +import logging as _logging
        +
        +_module_logger = _logging.getLogger("pydna." + __name__)
        +
        +
        +
        [docs]class Seq(_Seq): + """docstring.""" + +
        [docs] def translate( + self, + *args, + stop_symbol: str = "*", + to_stop: bool = False, + cds: bool = False, + gap: str = "-", + **kwargs, + ) -> "ProteinSeq": + """Translate..""" + p = super().translate(*args, stop_symbol=stop_symbol, to_stop=to_stop, cds=cds, gap=gap, **kwargs) + return ProteinSeq(p._data)
        + +
        [docs] def gc(self) -> float: + """Return GC content.""" + return round(_GC(self._data.upper().decode("ASCII")), 3)
        + +
        [docs] def cai(self, organism: str = "sce") -> float: + """docstring.""" + from pydna.utils import cai as _cai + + return _cai(self._data.upper().decode("ASCII"), organism=organism)
        + +
        [docs] def rarecodons(self, organism: str = "sce") -> _List[slice]: + """docstring.""" + rare = _rare_codons[organism] + s = self._data.upper().decode("ASCII") + slices: _List[slice] = [] + for i in range(0, len(self) // 3): + x, y = i * 3, i * 3 + 3 + trip = s[x:y] + if trip in rare: + slices.append(slice(x, y, 1)) + return slices
        + +
        [docs] def startcodon(self, organism: str = "sce") -> _Optional[float]: + """docstring.""" + return _start[organism].get(self._data.upper().decode("ASCII")[:3])
        + +
        [docs] def stopcodon(self, organism: str = "sce") -> _Optional[float]: + """docstring.""" + return _stop[organism].get(self._data.upper().decode("ASCII")[-3:])
        + +
        [docs] def express(self, organism: str = "sce") -> _PrettyTable: + """docstring.""" + x = _PrettyTable(["cds", "len", "cai", "gc", "sta", "stp", "n-end"] + _rare_codons[organism] + ["rare"]) + val = [] + + val.append(f"{self._data.upper().decode('ASCII')[:3]}..." f"{self._data.upper().decode('ASCII')[-3:]}") + val.append(len(self) / 3) + val.append(self.cai(organism)) + val.append(self.gc()) + val.append(self.startcodon()) + val.append(self.stopcodon()) + val.append( + _n_end[organism].get(_seq3(self[3:6].translate())), + ) + s = self._data.upper().decode("ASCII") + trps = [s[i * 3 : i * 3 + 3] for i in range(0, len(s) // 3)] + tot = 0 + for cdn in _rare_codons[organism]: + cnt = trps.count(cdn) + tot += cnt + val.append(cnt) + val.append(round(tot / len(trps), 3)) + x.add_row(val) + return x
        + +
        [docs] def orfs2(self, minsize: int = 30) -> _List[str]: + """docstring.""" + orf = _re.compile(f"ATG(?:...){{{minsize},}}?(?:TAG|TAA|TGA)", flags=_re.IGNORECASE) + start = 0 + matches: _List[slice] = [] + s = self._data.decode("ASCII") + + while True: + match = orf.search(s, pos=start) + if match: + matches.append(slice(match.start(), match.end())) + start = match.start() + 1 + else: + break + return sorted([self[sl] for sl in matches], key=len, reverse=True)
        + +
        [docs] def orfs(self, minsize: int = 100) -> _List[_Tuple[int, int]]: + dna = self._data.decode("ASCII") + from pydna.utils import three_frame_orfs + + return [(x, y) for frame, x, y in three_frame_orfs(dna, limit=minsize)]
        + +
        [docs] def seguid(self) -> str: + """Url safe SEGUID [#]_ for the sequence. + + This checksum is the same as seguid but with base64.urlsafe + encoding instead of the normal base64. This means that + the characters + and / are replaced with - and _ so that + the checksum can be part of a URL. + + Examples + -------- + >>> from pydna.seq import Seq + >>> a = Seq("aa") + >>> a.seguid() + 'lsseguid=gBw0Jp907Tg_yX3jNgS4qQWttjU' + + References + ---------- + .. [#] http://wiki.christophchamp.com/index.php/SEGUID + """ + return _lsseguid(self._data.decode("utf8").upper(), alphabet="{DNA-extended}")
        + + def __getitem__(self, key): + result = super().__getitem__(key) + try: + result.__class__ = self.__class__ + except TypeError: + pass + return result + +
        [docs] def reverse_complement(self): + return self.__class__(_rc(self._data))
        + + rc = reverse_complement
        + + +
        [docs]class ProteinSeq(_Seq): + """docstring.""" + +
        [docs] def translate(self): + raise NotImplementedError("Not defined for protein.")
        + +
        [docs] def complement(self): + raise NotImplementedError("Not defined for protein.")
        + +
        [docs] def complement_rna(self): + raise NotImplementedError("Not defined for protein.")
        + +
        [docs] def reverse_complement(self): + raise NotImplementedError("Not defined for protein.")
        + + rc = reverse_complement + +
        [docs] def reverse_complement_rna(self): + raise NotImplementedError("Not defined for protein.")
        + +
        [docs] def transcribe(self): + raise NotImplementedError("Not defined for protein.")
        + +
        [docs] def back_transcribe(self): + raise NotImplementedError("Not defined for protein.")
        + +
        [docs] def seguid(self) -> str: + """Url safe SEGUID [#]_ for the sequence. + + This checksum is the same as seguid but with base64.urlsafe + encoding instead of the normal base64. This means that + the characters + and / are replaced with - and _ so that + the checksum can be part of a URL. + + Examples + -------- + >>> from pydna.seq import ProteinSeq + >>> a = ProteinSeq("aa") + >>> a.seguid() + 'lsseguid=gBw0Jp907Tg_yX3jNgS4qQWttjU' + + References + ---------- + .. [#] http://wiki.christophchamp.com/index.php/SEGUID + """ + return _lsseguid(self._data.decode("utf8").upper(), alphabet="{protein-extended}")
        + + def __getitem__(self, key): + result = super().__getitem__(key) + try: + result.__class__ = self.__class__ + except TypeError: + pass + return result + + def _pa(self) -> ProteinAnalysis: + # breakpoint() + return ProteinAnalysis(self._data.decode("ascii")) + +
        [docs] def molecular_weight(self) -> float: + return self._pa().molecular_weight()
        + +
        [docs] def pI(self) -> float: + return self._pa().isoelectric_point()
        + +
        [docs] def instability_index(self) -> float: + """ + Instability index according to Guruprasad et al. + + Value above 40 means the protein is has a short half life. + + Guruprasad K., Reddy B.V.B., Pandit M.W. Protein Engineering 4:155-161(1990). + """ + return self._pa().instability_index()
        + + +if __name__ == "__main__": + import os as _os + + cached = _os.getenv("pydna_cached_funcs", "") + _os.environ["pydna_cached_funcs"] = "" + import doctest + + doctest.testmod(verbose=True, optionflags=doctest.ELLIPSIS) + _os.environ["pydna_cached_funcs"] = cached +
        + +
        +
        +
        + +
        + +
        +

        © Copyright 2024, Björn F. Johansson.

        +
        + + Built with Sphinx using a + theme + provided by Read the Docs. + + +
        +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/_modules/pydna/seqrecord.html b/_modules/pydna/seqrecord.html index cfc69574..50cfe92c 100644 --- a/_modules/pydna/seqrecord.html +++ b/_modules/pydna/seqrecord.html @@ -1,20 +1,22 @@ - + - pydna.seqrecord — pydna 0.0.0.post1+9d112d7 documentation + pydna.seqrecord — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -110,9 +119,7 @@

        Source code for pydna.seqrecord

         _module_logger = _logging.getLogger("pydna." + __name__)
         
         
        -
        -[docs] -class SeqRecord(_SeqRecord): +
        [docs]class SeqRecord(_SeqRecord): """ A subclass of the Biopython SeqRecord class. @@ -141,9 +148,7 @@

        Source code for pydna.seqrecord

                 self.seq._data = b"".join(self.seq._data.split())  # remove whitespaces
                 self.annotations = {_pretty_str(k): _pretty_str(v) for k, v in self.annotations.items()}
         
        -
        -[docs] - @classmethod +
        [docs] @classmethod def from_Bio_SeqRecord(clc, sr: _SeqRecord): """Creates a pydnaSeqRecord from a Biopython SeqRecord.""" # https://stackoverflow.com/questions/15404256/changing-the-\ @@ -152,7 +157,6 @@

        Source code for pydna.seqrecord

                 sr._fix_attributes()
                 return sr
        - @property def locus(self): """Alias for name property.""" @@ -194,20 +198,15 @@

        Source code for pydna.seqrecord

                 self.description = value
                 return
         
        -
        -[docs] - def reverse_complement(self, *args, **kwargs): +
        [docs] def reverse_complement(self, *args, **kwargs): """Return the reverse complement of the sequence.""" answer = super().reverse_complement(*args, **kwargs) answer = type(self).from_Bio_SeqRecord(answer) return answer
        - rc = reverse_complement -
        -[docs] - def isorf(self, table=1): +
        [docs] def isorf(self, table=1): """Detect if sequence is an open reading frame (orf) in the 5'-3'. direction. @@ -250,18 +249,12 @@

        Source code for pydna.seqrecord

                 else:
                     return True
        - -
        -[docs] - def translate(self): +
        [docs] def translate(self): """docstring.""" p = super().translate() return ProteinSeqRecord(_ProteinSeq(p.seq[:-1]))
        - -
        -[docs] - def add_colors_to_features_for_ape(self): +
        [docs] def add_colors_to_features_for_ape(self): """Assign colors to features. compatible with @@ -305,10 +298,7 @@

        Source code for pydna.seqrecord

                     f.qualifiers["ApEinfo_fwdcolor"] = [cols[i % len(cols)]]
                     f.qualifiers["ApEinfo_revcolor"] = [cols[::-1][i % len(cols)]]
        - -
        -[docs] - def add_feature(self, x=None, y=None, seq=None, type_="misc", strand=1, *args, **kwargs): +
        [docs] def add_feature(self, x=None, y=None, seq=None, type_="misc", strand=1, *args, **kwargs): """Add a feature of type misc to the feature list of the sequence. Parameters @@ -380,10 +370,7 @@

        Source code for pydna.seqrecord

                 Out[11]: Seq('K', ExtendedIUPACProtein())
                 """
        - -
        -[docs] - def list_features(self): +
        [docs] def list_features(self): """Print ASCII table with all features. Examples @@ -435,10 +422,7 @@

        Source code for pydna.seqrecord

                     )
                 return x
        - -
        -[docs] - def extract_feature(self, n): +
        [docs] def extract_feature(self, n): """Extract feature and return a new SeqRecord object. Parameters @@ -458,10 +442,7 @@

        Source code for pydna.seqrecord

                 """
                 return self.features[n].extract(self)
        - -
        -[docs] - def sorted_features(self): +
        [docs] def sorted_features(self): """Return a list of the features sorted by start position. Examples @@ -487,10 +468,7 @@

        Source code for pydna.seqrecord

                 """
                 return sorted(self.features, key=lambda x: x.location.start)
        - -
        -[docs] - def seguid(self): +
        [docs] def seguid(self): """Return the url safe SEGUID [#]_ for the sequence. This checksum is the same as seguid but with base64.urlsafe @@ -511,10 +489,7 @@

        Source code for pydna.seqrecord

                 """
                 return self.seq.seguid()
        - -
        -[docs] - def comment(self, newcomment=""): +
        [docs] def comment(self, newcomment=""): """docstring.""" result = self.annotations.get("comment", "") if newcomment: @@ -522,17 +497,11 @@

        Source code for pydna.seqrecord

                     result = _pretty_str(self.annotations["comment"])
                 return result
        - -
        -[docs] - def datefunction(): +
        [docs] def datefunction(): """docstring.""" return datetime.datetime.now().replace(microsecond=0).isoformat()
        - -
        -[docs] - def stamp(self, now=datefunction, tool="pydna", separator=" ", comment=""): +
        [docs] def stamp(self, now=datefunction, tool="pydna", separator=" ", comment=""): """Add seguid checksum to COMMENTS sections The checksum is stored in object.annotations["comment"]. @@ -573,10 +542,7 @@

        Source code for pydna.seqrecord

                 self.annotations["comment"] = (f"{oldcomment}\n" f"{tool} {chksum} {now()} {comment}").strip()
                 return _pretty_str(chksum)
        - -
        -[docs] - def lcs(self, other, *args, limit=25, **kwargs): +
        [docs] def lcs(self, other, *args, limit=25, **kwargs): """Return the longest common substring between the sequence. and another sequence (other). The other sequence can be a string, @@ -634,24 +600,15 @@

        Source code for pydna.seqrecord

                     )
                 return result
        - -
        -[docs] - def gc(self): +
        [docs] def gc(self): """Return GC content.""" return self.seq.gc()
        - -
        -[docs] - def cai(self, organism="sce"): +
        [docs] def cai(self, organism="sce"): """docstring.""" return self.seq.cai(organism=organism)
        - -
        -[docs] - def rarecodons(self, organism="sce"): +
        [docs] def rarecodons(self, organism="sce"): """docstring.""" sfs = [] for slc in self.seq.rarecodons(organism): @@ -665,35 +622,22 @@

        Source code for pydna.seqrecord

                     )
                 return sfs
        - -
        -[docs] - def startcodon(self, organism="sce"): +
        [docs] def startcodon(self, organism="sce"): """docstring.""" return self.seq.startcodon()
        - -
        -[docs] - def stopcodon(self, organism="sce"): +
        [docs] def stopcodon(self, organism="sce"): """docstring.""" return self.seq.stopcodon()
        - -
        -[docs] - def express(self, organism="sce"): +
        [docs] def express(self, organism="sce"): """docstring.""" return self.seq.express()
        - -
        -[docs] - def copy(self): +
        [docs] def copy(self): """docstring.""" return _copy(self)
        - def __lt__(self, other): """docstring.""" try: @@ -801,9 +745,7 @@

        Source code for pydna.seqrecord

                 """
                 return bool(self.seq)
         
        -
        -[docs] - def dump(self, filename, protocol=None): +
        [docs] def dump(self, filename, protocol=None): """docstring.""" from pathlib import Path @@ -812,71 +754,42 @@

        Source code for pydna.seqrecord

                     pth = pth.with_suffix(".pickle")
                 with open(pth, "wb") as f:
                     _pickle.dump(self, f, protocol=protocol)
        -        return _pretty_str(pth)
        -
        + return _pretty_str(pth)
        +
        [docs]class ProteinSeqRecord(SeqRecord): -
        -[docs] -class ProteinSeqRecord(SeqRecord): - -
        -[docs] - def reverse_complement(self, *args, **kwargs): +
        [docs] def reverse_complement(self, *args, **kwargs): raise NotImplementedError("Not defined for protein.")
        - rc = reverse_complement -
        -[docs] - def isorf(self, *args, **kwargs): +
        [docs] def isorf(self, *args, **kwargs): raise NotImplementedError("Not defined for protein.")
        - -
        -[docs] - def gc(self): +
        [docs] def gc(self): raise NotImplementedError("Not defined for protein.")
        - -
        -[docs] - def cai(self, *args, **kwargs): +
        [docs] def cai(self, *args, **kwargs): raise NotImplementedError("Not defined for protein.")
        - -
        -[docs] - def rarecodons(self, *args, **kwargs): +
        [docs] def rarecodons(self, *args, **kwargs): raise NotImplementedError("Not defined for protein.")
        - -
        -[docs] - def startcodon(self, *args, **kwargs): +
        [docs] def startcodon(self, *args, **kwargs): raise NotImplementedError("Not defined for protein.")
        - -
        -[docs] - def stopcodon(self, *args, **kwargs): +
        [docs] def stopcodon(self, *args, **kwargs): raise NotImplementedError("Not defined for protein.")
        - -
        -[docs] - def express(self, *args, **kwargs): +
        [docs] def express(self, *args, **kwargs): raise NotImplementedError("Not defined for protein.")
        - def __format__(self, format): """docstring.""" return _pretty_str(_SeqRecord.__format__(self, format))
        - if __name__ == "__main__": import os as _os diff --git a/_modules/pydna/sequence_picker.html b/_modules/pydna/sequence_picker.html new file mode 100644 index 00000000..845ffa36 --- /dev/null +++ b/_modules/pydna/sequence_picker.html @@ -0,0 +1,171 @@ + + + + + + + + pydna.sequence_picker — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +

        Source code for pydna.sequence_picker

        +#!/usr/bin/env python3
        +# -*- coding: utf-8 -*-
        +# Copyright 2013-2023 by Björn Johansson.  All rights reserved.
        +# This code is part of the Python-dna distribution and governed by its
        +# license.  Please see the LICENSE.txt file that should have been included
        +# as part of this package.
        +
        +from pydna.dseqrecord import Dseqrecord
        +import os as _os
        +import logging as _logging
        +from Bio.Blast import NCBIWWW
        +from Bio.Blast import NCBIXML
        +
        +_module_logger = _logging.getLogger("pydna." + __name__)
        +
        +
        +email = _os.getenv("pydna_email")
        +tool = "pydna"
        +
        +
        +
        [docs]def genbank_accession(s: str) -> Dseqrecord: + """docstring.""" + s = Dseqrecord(s) + + NCBIWWW.email = email + NCBIWWW.tool = tool + + result_handle = NCBIWWW.qblast( + "blastn", + "nt", + str(s.seq), + hitlist_size=1, + alignments=1, + descriptions=1, + expect=1e-8, + megablast=True, + service="megablast", + ungapped_alignment=True, + ) + + blast_records = NCBIXML.read(result_handle) + best_alignment, *rest = blast_records.alignments + best_hsp, *rest = best_alignment.hsps + dbs = best_hsp.sbjct + start, stop = sorted((best_hsp.sbjct_start, best_hsp.sbjct_end)) + result = Dseqrecord( + dbs, + circular=False, + id=s.name, + name=s.name, + description=(f"{best_alignment.accession} " f"REGION: {start}..{stop}"), + ) + return result
        + + +if __name__ == "__main__": + cached = _os.getenv("pydna_cached_funcs", "") + _os.environ["pydna_cached_funcs"] = "" + import doctest + + doctest.testmod(verbose=True, optionflags=doctest.ELLIPSIS) + _os.environ["pydna_cached_funcs"] = cached + pass +
        + +
        +
        +
        + +
        + +
        +

        © Copyright 2024, Björn F. Johansson.

        +
        + + Built with Sphinx using a + theme + provided by Read the Docs. + + +
        +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/_modules/pydna/threading_timer_decorator_exit.html b/_modules/pydna/threading_timer_decorator_exit.html index c97b7498..a100a544 100644 --- a/_modules/pydna/threading_timer_decorator_exit.html +++ b/_modules/pydna/threading_timer_decorator_exit.html @@ -1,20 +1,22 @@ - + - pydna.threading_timer_decorator_exit — pydna 0.0.0.post1+9d112d7 documentation + pydna.threading_timer_decorator_exit — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -98,14 +107,14 @@

        Source code for pydna.threading_timer_decorator_exit

        import _thread as thread -def cdquit(fn_name): # pragma: no cover +
        [docs]def cdquit(fn_name): # pragma: no cover # print to stderr, unbuffered in Python 2. print("{0} took too long".format(fn_name), file=sys.stderr) sys.stderr.flush() # Python 3 stderr is likely buffered. - thread.interrupt_main() # raises KeyboardInterrupt + thread.interrupt_main() # raises KeyboardInterrupt
        -def exit_after(s): +
        [docs]def exit_after(s): """ use as decorator to exit process if function takes longer than s seconds @@ -123,44 +132,44 @@

        Source code for pydna.threading_timer_decorator_exit

        return inner - return outer + return outer
        -@exit_after(1) +
        [docs]@exit_after(1) def a(): # pragma: no cover - print("a") + print("a")
        -@exit_after(2) +
        [docs]@exit_after(2) def b(): # pragma: no cover print("b") - sleep(1) + sleep(1)
        -@exit_after(3) +
        [docs]@exit_after(3) def c(): # pragma: no cover print("c") - sleep(2) + sleep(2)
        -@exit_after(4) +
        [docs]@exit_after(4) def d(): # pragma: no cover print("d started") for i in range(10): sleep(1) - print(i) + print(i)
        -@exit_after(5) +
        [docs]@exit_after(5) def countdown(n): # pragma: no cover print("countdown started", flush=True) for i in range(n, -1, -1): print(i, end=", ", flush=True) sleep(1) - print("countdown finished") + print("countdown finished")
        -def main(): # pragma: no cover +
        [docs]def main(): # pragma: no cover a() b() c() @@ -171,7 +180,7 @@

        Source code for pydna.threading_timer_decorator_exit

        print(error) countdown(3) countdown(10) - print("This should not print!!!") + print("This should not print!!!")
        if __name__ == "__main__": diff --git a/_modules/pydna/tm.html b/_modules/pydna/tm.html index 6f6d787e..c00d6362 100644 --- a/_modules/pydna/tm.html +++ b/_modules/pydna/tm.html @@ -1,20 +1,22 @@ - + - pydna.tm — pydna 0.0.0.post1+9d112d7 documentation + pydna.tm — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -94,9 +103,7 @@

        Source code for pydna.tm

         # 0.1% (v/v) Tween 20.
         
         
        -
        -[docs] -def tm_default( +
        [docs]def tm_default( seq, check=True, strict=True, @@ -139,10 +146,7 @@

        Source code for pydna.tm

             )
        - -
        -[docs] -def tm_dbd( +
        [docs]def tm_dbd( seq, check=True, strict=True, @@ -185,10 +189,7 @@

        Source code for pydna.tm

             )
        - -
        -[docs] -def tm_product(seq: str, K=0.050): +
        [docs]def tm_product(seq: str, K=0.050): """Tm calculation for the amplicon. according to: @@ -201,10 +202,7 @@

        Source code for pydna.tm

             return tmp
        - -
        -[docs] -def ta_default(fp: str, rp: str, seq: str, tm=tm_default, tm_product=tm_product): +
        [docs]def ta_default(fp: str, rp: str, seq: str, tm=tm_default, tm_product=tm_product): """Ta calculation. according to: @@ -219,17 +217,11 @@

        Source code for pydna.tm

             return 0.3 * min((tm(fp), tm(rp))) + 0.7 * tm_product(seq) - 14.9
        - -
        -[docs] -def ta_dbd(fp, rp, seq, tm=tm_dbd, tm_product=None): +
        [docs]def ta_dbd(fp, rp, seq, tm=tm_dbd, tm_product=None): return min((tm(fp), tm(rp))) + 3
        - -
        -[docs] -def program(amplicon, tm=tm_default, ta=ta_default): +
        [docs]def program(amplicon, tm=tm_default, ta=ta_default): r"""Returns a string containing a text representation of a suggested PCR program using Taq or similar polymerase. @@ -275,13 +267,10 @@

        Source code for pydna.tm

             return _pretty_str(f)
        - taq_program = program -
        -[docs] -def dbd_program(amplicon, tm=tm_dbd, ta=ta_dbd): +
        [docs]def dbd_program(amplicon, tm=tm_dbd, ta=ta_dbd): r"""Text representation of a suggested PCR program. Using a polymerase with a DNA binding domain such as Pfu-Sso7d. @@ -361,13 +350,10 @@

        Source code for pydna.tm

             return _pretty_str(f)
        - pfu_sso7d_program = dbd_program -
        -[docs] -def Q5(primer: str, *args, **kwargs): +
        [docs]def Q5(primer: str, *args, **kwargs): """For Q5 Ta they take the lower of the two Tms and add 1C (up to 72C). For Phusion they take the lower of the two and add 3C (up to 72C). @@ -375,10 +361,7 @@

        Source code for pydna.tm

             raise NotImplementedError
        - -
        -[docs] -def tmbresluc(primer: str, *args, primerc=500.0, saltc=50, **kwargs): +
        [docs]def tmbresluc(primer: str, *args, primerc=500.0, saltc=50, **kwargs): """Returns the tm for a primer using a formula adapted to polymerases with a DNA binding domain, such as the Phusion polymerase. @@ -425,10 +408,7 @@

        Source code for pydna.tm

             return tm
        - -
        -[docs] -def tm_neb(primer, conc=0.5, prodcode="q5-0"): +
        [docs]def tm_neb(primer, conc=0.5, prodcode="q5-0"): """Calculates a single primers melting temp from NEB. Parameters @@ -475,7 +455,6 @@

        Source code for pydna.tm

                 raise requests.exceptions.HTTPError(r["error"])
        - if __name__ == "__main__": import os as _os diff --git a/_modules/pydna/utils.html b/_modules/pydna/utils.html index 1c2ea776..610ae81b 100644 --- a/_modules/pydna/utils.html +++ b/_modules/pydna/utils.html @@ -1,20 +1,22 @@ - + - pydna.utils — pydna 0.0.0.post1+9d112d7 documentation + pydna.utils — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -111,9 +120,7 @@

        Source code for pydna.utils

         _complement_table = _maketrans(_ambiguous_dna_complement)
         
         
        -
        -[docs] -def three_frame_orfs( +
        [docs]def three_frame_orfs( dna: str, limit: int = 100, startcodons: tuple = ("ATG",), @@ -147,10 +154,7 @@

        Source code for pydna.utils

             return orfs
        - -
        -[docs] -def shift_location(original_location, shift, lim): +
        [docs]def shift_location(original_location, shift, lim): """docstring.""" newparts = [] strand = original_location.strand @@ -196,7 +200,6 @@

        Source code for pydna.utils

             return newloc
        - # def shift_feature(feature, shift, lim): # """Return a new feature with shifted location.""" # # TODO: Missing tests @@ -206,9 +209,7 @@

        Source code for pydna.utils

         #     return new_feature
         
         
        -
        -[docs] -def shift_feature(feature, shift, lim): +
        [docs]def shift_feature(feature, shift, lim): """Return a new feature with shifted location.""" # TODO: Missing tests new_location = shift_location(feature.location, shift, lim) @@ -217,7 +218,6 @@

        Source code for pydna.utils

             return new_feature
        - # def smallest_rotation(s): # """Smallest rotation of a string. @@ -258,9 +258,7 @@

        Source code for pydna.utils

         #                 return "".join(w * rep)
         
         
        -
        -[docs] -def smallest_rotation(s): +
        [docs]def smallest_rotation(s): """Smallest rotation of a string. Algorithm described in Pierre Duval, Jean. 1983. Factorizing Words @@ -281,20 +279,14 @@

        Source code for pydna.utils

             return s[k:] + s[:k]
        - -
        -[docs] -def cai(seq: str, organism: str = "sce", weights: dict = _weights): +
        [docs]def cai(seq: str, organism: str = "sce", weights: dict = _weights): """docstring.""" from cai2 import CAI as _CAI return round(_CAI(seq.upper(), weights=weights[organism]), 3)
        - -
        -[docs] -def rarecodons(seq: str, organism="sce"): +
        [docs]def rarecodons(seq: str, organism="sce"): """docstring.""" rare = _rare_codons[organism] s = seq.upper() @@ -307,10 +299,7 @@

        Source code for pydna.utils

             return slices
        - -
        -[docs] -def express(seq: str, organism="sce"): +
        [docs]def express(seq: str, organism="sce"): """docstring. **NOT IMPLEMENTED YET** @@ -338,10 +327,7 @@

        Source code for pydna.utils

             raise NotImplementedError
        - -
        -[docs] -def open_folder(pth): +
        [docs]def open_folder(pth): """docstring.""" if _sys.platform == "win32": _subprocess.run(["start", pth], shell=True) @@ -354,10 +340,7 @@

        Source code for pydna.utils

                     return "no cache to open."
        - -
        -[docs] -def rc(sequence: StrOrBytes) -> StrOrBytes: +
        [docs]def rc(sequence: StrOrBytes) -> StrOrBytes: """Reverse complement. accepts mixed DNA/RNA @@ -365,10 +348,7 @@

        Source code for pydna.utils

             return sequence.translate(_complement_table)[::-1]
        - -
        -[docs] -def complement(sequence: str): +
        [docs]def complement(sequence: str): """Complement. accepts mixed DNA/RNA @@ -376,10 +356,7 @@

        Source code for pydna.utils

             return sequence.translate(_complement_table)
        - -
        -[docs] -def memorize(filename): +
        [docs]def memorize(filename): """Cache functions and classes. see pydna.download @@ -424,10 +401,7 @@

        Source code for pydna.utils

             return decorator
        - -
        -[docs] -def identifier_from_string(s: str) -> str: +
        [docs]def identifier_from_string(s: str) -> str: """Return a valid python identifier. based on the argument s or an empty string @@ -442,10 +416,7 @@

        Source code for pydna.utils

             return s
        - -
        -[docs] -def flatten(*args) -> _List: +
        [docs]def flatten(*args) -> _List: """Flattens an iterable of iterables. Down to str, bytes, bytearray or any of the pydna or Biopython seq objects @@ -465,10 +436,7 @@

        Source code for pydna.utils

             return output[::-1]
        - -
        -[docs] -def seq31(seq): +
        [docs]def seq31(seq): """Turn a three letter code protein sequence into one with one letter code. The single input argument 'seq' should be a protein sequence using single @@ -528,30 +496,21 @@

        Source code for pydna.utils

             return padding.join([threecode.get(aa, "X") for aa in sequence])
        - -
        -[docs] -def randomRNA(length, maxlength=None): +
        [docs]def randomRNA(length, maxlength=None): """docstring.""" if maxlength and maxlength > length: length = int(round(random.triangular(length, maxlength))) return "".join([random.choice("GAUC") for x in range(length)])
        - -
        -[docs] -def randomDNA(length, maxlength=None): +
        [docs]def randomDNA(length, maxlength=None): """docstring.""" if maxlength and maxlength > length: length = int(round(random.triangular(length, maxlength))) return "".join([random.choice("GATC") for x in range(length)])
        - -
        -[docs] -def randomORF(length, maxlength=None): +
        [docs]def randomORF(length, maxlength=None): """docstring.""" length -= 2 if maxlength and maxlength > length: @@ -627,20 +586,14 @@

        Source code for pydna.utils

             return random.choice(starts) + "".join([random.choice(cdns) for x in range(length)]) + random.choice(stops)
        - -
        -[docs] -def randomprot(length, maxlength=None): +
        [docs]def randomprot(length, maxlength=None): """docstring.""" if maxlength and maxlength > length: length = int(round(random.triangular(length, maxlength))) return "".join([random.choice("ACDEFGHIKLMNPQRSTVWY") for x in range(length)])
        - -
        -[docs] -def eq(*args, **kwargs): +
        [docs]def eq(*args, **kwargs): """Compare two or more DNA sequences for equality. Compares two or more DNA sequences for equality i.e. if they @@ -771,7 +724,6 @@

        Source code for pydna.utils

             return same
        - # def cuts_overlap(left_cut, right_cut, seq_len): # # Special cases: # if left_cut is None or right_cut is None or left_cut == right_cut: @@ -804,9 +756,7 @@

        Source code for pydna.utils

         #         return loc.parts[0].start, loc.parts[-1].end
         
         
        -
        -[docs] -def cuts_overlap(left_cut, right_cut, seq_len): +
        [docs]def cuts_overlap(left_cut, right_cut, seq_len): # Special cases: if left_cut is None or right_cut is None or left_cut == right_cut: return False @@ -831,20 +781,14 @@

        Source code for pydna.utils

             return (x[1] > y[0]) != (y[1] < x[0])
        - -
        -[docs] -def location_boundaries(loc: _Union[_sl, _cl]): +
        [docs]def location_boundaries(loc: _Union[_sl, _cl]): if loc.strand == -1: return loc.parts[-1].start, loc.parts[0].end else: return loc.parts[0].start, loc.parts[-1].end
        - -
        -[docs] -def locations_overlap(loc1: _Union[_sl, _cl], loc2: _Union[_sl, _cl], seq_len): +
        [docs]def locations_overlap(loc1: _Union[_sl, _cl], loc2: _Union[_sl, _cl], seq_len): start1, end1 = location_boundaries(loc1) start2, end2 = location_boundaries(loc2) @@ -869,7 +813,6 @@

        Source code for pydna.utils

             return False
        - if __name__ == "__main__": cached = _os.getenv("pydna_cached_funcs", "") _os.environ["pydna_cached_funcs"] = "" diff --git a/_sources/README.md.txt b/_sources/README.md.txt new file mode 100644 index 00000000..fa6f252b --- /dev/null +++ b/_sources/README.md.txt @@ -0,0 +1,91 @@ +# Documentation + +Documentation is built using [Sphinx](http://www.sphinx-doc.org/) from [docstrings](https://www.python.org/dev/peps/pep-0257/) +using a GitHub [action](https://github.com/BjornFJohansson/pydna/actions/workflows/publish-docs.yml). +The [numpy](www.numpy.org) [docstring format](https://numpy.org/doc/stable/dev/howto-docs.html#docstring-intro) is used. + +Below the commands to run a local sphinx server that auto-updated when files are changed. + +```bash +# Install docs dependency group +poetry install --with docs + +# Start the sphinx server to see docs live by default at http://127.0.0.1:8000/ +sphinx-autobuild --watch src/ docs docs/_build/html +``` + +When you run the sphinx server live, it not always updates things if you make relevant changes (e.g. adding new pages, +changing the css, etc.). To force an update, you can run the command below which deletes the existing build folder and +then rebuilds it. + +```bash +rm -rf docs/_build/html && sphinx-autobuild --watch src/ docs docs/_build/html +``` + +## Adding new sections to the documentation + +You can add new sections (equivalent to "Getting started" or "Example gallery") by creating a new `.rst` or `.md` file in the `docs` folder, and then adding a reference to it in the `.. toctree::` directive in the `docs/index.rst` file. + +## Auto-generated files + +The script `autogen_docs.sh` is run in the github action before creating the docs. If you want to reproduce locally, you +should run it from the `docs` folder + +```bash +cd docs +bash autogen_docs.sh +``` + + +* It converts all notebooks in the `docs/notebooks` folder to `.md` in `docs/markdown_notebooks` (excluded from git) +* It creates all files in `docs/modules`, which are used to generate the API reference. For instance, it will create + a `docs/modules/index.rst` file that starts like this: + + ```rst + Modules + ======= + + .. toctree:: + :maxdepth: 1 + :caption: Modules: + + pydna + pydna__pretty + ``` + And then individual files for each module and submodule, e.g. `docs/modules/pydna.rst`. + + ``` + pydna + ===== + + .. automodule:: pydna + :members: + :undoc-members: + :show-inheritance: + ``` + +## Text imported from README.md + +To avoid having to maintain the same text in multiple files, fragments of the `README.md` are imported using the directive +`include`. For instance, in the `installation.rst` file, you can find the code below. What this does is to import the text of the README.md file between the start and end markers, which are markdown comments and therefore not rendered. + +```rst +.. include:: ../README.md + :parser: myst_parser.sphinx_ + :start-after: + :end-before: +``` + +## Including notebooks in the getting started and example sections + +You can see the example of how to do this in the `getting_started.md` file. Note that the notebooks present in the `docs/notebooks` folder will automatically be converted to markdown in the `docs/markdown_notebooks` folder. So if you have a notebook `docs/notebooks/Example_Gibson.ipynb`, it will be converted to `docs/markdown_notebooks/Example_Gibson.md` and you can use that file path to make a link to it. + +## Custom CSS + +For now, I have used css to make notebook outputs that are too long scrollable, and to add a small label `python code` to the code cells and `output` to the output cells. + +For further customization, you can edit the `custom.css` file. + +## Misc + +Other changes, such as changing the favicon, the css etc., can be made in the `conf.py` file. See the [sphinx docs](https://www.sphinx-doc.org/en/master/usage/configuration.html) and the [sphinx-rtd-theme](https://sphinx-rtd-theme.readthedocs.io/en/stable/configuring.html) docs for more information. diff --git a/_sources/example_gallery.md.txt b/_sources/example_gallery.md.txt index 54cc1ebf..9d7155a4 100644 --- a/_sources/example_gallery.md.txt +++ b/_sources/example_gallery.md.txt @@ -2,4 +2,6 @@ Below are some examples that show the functionality of pydna in real-world scenarios. -* [Example_Restriction](./markdown_notebooks/Example_Restriction.md): Using restriction and ligation to do xyz. +* [Example_Restriction](./markdown_notebooks/Example_Restriction.md): PCRing a gene out of the genome, and cloning into a vector using restriction and ligation. +* [Example_Gibson](./markdown_notebooks/Example_Gibson.md): Gibson assembly of _R. cellulolyticum_ genomic fragments into a plasmid, from the original Gibson assembly paper [doi: 10.1038/nmeth.1318](https://www.nature.com/articles/nmeth.1318). +* [Example_CRISPR](./markdown_notebooks/Example_CRISPR.md): Using CRISPR with homologous recombination to delete genes by making two cuts in the genome, and repair it with an oligo. Used in the industrially relevant _K. phaffi_. diff --git a/_sources/getting_started.md.txt b/_sources/getting_started.md.txt index c1d8bc51..c5f6c7fc 100644 --- a/_sources/getting_started.md.txt +++ b/_sources/getting_started.md.txt @@ -8,8 +8,18 @@ are reproduced here so they can serve as documentation. You can run the notebooks locally, but also on the browser using Google Colab, simply click in the badge of the notebook to open it in Colab. -We recommend that you start in this order: +We recommend that you first go through the following notebooks, which cover the basics of how sequences are handled in pydna: 1. [Dseq](./markdown_notebooks/Dseq.md): Basic introduction to how sequences are handled in pydna. +2. [Dseq_Features](./markdown_notebooks/Dseq_Features.md): How to work with sequence features, which are often present in genbank or dna files to mark regions of interest (coding sequences, resistance markers, etc.) +3. [Importing_Seqs](./markdown_notebooks/Importing_Seqs.md): How to import sequences from various sources. -etc. +Next, you can learn how specific cloning techniques are handled. + +* [Restrict_Ligate_Cloning](./markdown_notebooks/Restrict_Ligate_Cloning.md): How to perform restriction and ligation. +* [PCR](./markdown_notebooks/PCR.md): How to perform PCR. +* [primer_design](./markdown_notebooks/primer_design.md): How to design primers for Gibson assembly and restriction-ligation cloning. +* [Gibson](./markdown_notebooks/Gibson.md): How to perform Gibson assembly. +* [CRISPR](./markdown_notebooks/CRISPR.md): How to perform CRISPR-Cas9 cutting. + +These notebooks cover the basics, but you can see real-world examples in the [example gallery](./example_gallery.md). diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt index 274878a0..69ab1aa0 100644 --- a/_sources/index.rst.txt +++ b/_sources/index.rst.txt @@ -1,205 +1,30 @@ -Welcome to pydna's documentation! -================================= - -Stuff & other stuff - - - - -Module contents ---------------- - -.. automodule:: pydna - :members: - :undoc-members: - :show-inheritance: - -pydna.dseq module ------------------ - -.. automodule:: pydna.dseq - :members: - :undoc-members: - :show-inheritance: - -pydna.dseqrecord module ------------------------ - -.. automodule:: pydna.dseqrecord - :members: - :undoc-members: - :show-inheritance: - -pydna.amplicon module ---------------------- - -.. automodule:: pydna.amplicon - :members: - :undoc-members: - :show-inheritance: - -pydna.amplify module --------------------- - -.. automodule:: pydna.amplify - :members: - :undoc-members: - :show-inheritance: - -pydna.assembly module ---------------------- - -.. automodule:: pydna.assembly - :members: - :undoc-members: - :show-inheritance: - -pydna.common_sub_strings module -------------------------------- - -.. automodule:: pydna.common_sub_strings - :members: - :undoc-members: - :show-inheritance: - -pydna.contig module -------------------- - -.. automodule:: pydna.contig - :members: - :undoc-members: - :show-inheritance: - -pydna.design module -------------------- - -.. automodule:: pydna.design - :members: - :undoc-members: - :show-inheritance: - -pydna.download module ---------------------- - -.. automodule:: pydna.download - :members: - :undoc-members: - :show-inheritance: - - +Pydna +====== -pydna.editor module -------------------- - -.. automodule:: pydna.editor - :members: - :undoc-members: - :show-inheritance: - -pydna.gel module ----------------- - -.. automodule:: pydna.gel - :members: - :undoc-members: - :show-inheritance: - -pydna.genbank module --------------------- - -.. automodule:: pydna.genbank - :members: - :undoc-members: - :show-inheritance: - -pydna.genbankfile module ------------------------- - -.. automodule:: pydna.genbankfile - :members: - :undoc-members: - :show-inheritance: - -pydna.genbankfixer module -------------------------- - -.. automodule:: pydna.genbankfixer - :members: - :undoc-members: - :show-inheritance: - -pydna.genbankrecord module --------------------------- - -.. automodule:: pydna.genbankrecord - :members: - :undoc-members: - :show-inheritance: - -pydna.myprimers module ----------------------- - -.. automodule:: pydna.myprimers - :members: - :undoc-members: - :show-inheritance: - -pydna.parsers module --------------------- - -.. automodule:: pydna.parsers - :members: - :undoc-members: - :show-inheritance: - -pydna.primer module -------------------- - -.. automodule:: pydna.primer - :members: - :undoc-members: - :show-inheritance: - -pydna.readers module --------------------- - -.. automodule:: pydna.readers - :members: - :undoc-members: - :show-inheritance: - -pydna.seqrecord module ----------------------- - -.. automodule:: pydna.seqrecord - :members: - :undoc-members: - :show-inheritance: - -pydna.tm module ---------------- - -.. automodule:: pydna.tm - :members: - :undoc-members: - :show-inheritance: - -pydna.utils module ------------------- - -.. automodule:: pydna.utils - :members: - :undoc-members: - :show-inheritance: +Welcome to pydna's documentation! +--------------------------------- +.. include:: ../README.md + :parser: myst_parser.sphinx_ + :start-after: + :end-before: +.. toctree:: + :caption: Contents: + :maxdepth: 1 + :hidden: + self + installation + modules/index + getting_started + example_gallery -Indices and tables -================== +.. Indices and tables +.. ================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` +.. * :ref:`genindex` +.. * :ref:`modindex` +.. * :ref:`search` diff --git a/_sources/installation.rst.txt b/_sources/installation.rst.txt index 98ee149e..db68d711 100644 --- a/_sources/installation.rst.txt +++ b/_sources/installation.rst.txt @@ -3,5 +3,5 @@ Installation .. include:: ../README.md :parser: myst_parser.sphinx_ - :start-after: ## Installation 📦 - :end-before: ## Contributing and feedback 🛠️ + :start-after: + :end-before: diff --git a/_sources/markdown_notebooks/Dseq.md.txt b/_sources/markdown_notebooks/Dseq.md.txt index 9e74293e..2d099d58 100644 --- a/_sources/markdown_notebooks/Dseq.md.txt +++ b/_sources/markdown_notebooks/Dseq.md.txt @@ -348,7 +348,7 @@ sequence_with_overhangs[2:] Dseq(-8) - acgt + acgttcc atgcaagg diff --git a/_sources/markdown_notebooks/Example_Gibson.md.txt b/_sources/markdown_notebooks/Example_Gibson.md.txt index aef8d841..77386e2f 100644 --- a/_sources/markdown_notebooks/Example_Gibson.md.txt +++ b/_sources/markdown_notebooks/Example_Gibson.md.txt @@ -32,28 +32,77 @@ from pydna.tm import tm_default from pydna.amplify import pcr from pydna.dseqrecord import Dseqrecord from pydna.assembly import Assembly +from pydna.genbank import Genbank +from pydna.gel import gel +from pydna.ladders import GeneRuler_1kb_plus + ``` ```python -# Parsing the files +# Reading the R. cellulolyticum genome from GenBank +gb = Genbank("example@example.com") +genome = gb.nucleotide("CP001348.1") +# Print the info of the genome +genome.annotations +``` + + + + + {'molecule_type': 'DNA', + 'topology': 'circular', + 'data_file_division': 'BCT', + 'date': '25-AUG-2017', + 'accessions': ['CP001348', 'AAVC01000000', 'AAVC01000001-AAVC01000121'], + 'sequence_version': 1, + 'keywords': [''], + 'source': 'Ruminiclostridium cellulolyticum H10', + 'organism': 'Ruminiclostridium cellulolyticum H10', + 'taxonomy': ['Bacteria', + 'Bacillota', + 'Clostridia', + 'Eubacteriales', + 'Oscillospiraceae', + 'Ruminiclostridium'], + 'references': [Reference(title='Complete sequence of Clostridium cellulolyticum H10', ...), + Reference(title='Direct Submission', ...)], + 'comment': 'URL -- http://www.jgi.doe.gov\nJGI Project ID: 4002584\nSource DNA and bacteria available from Jizhong Zhou\n(jzhou@rccc.ou.edu)\nContacts: Jizhong Zhou (jzhou@rccc.ou.edu)\n David Bruce (microbe@cuba.jgi-psf.org)\nAnnotation done by JGI-ORNL and JGI-PGF\nFinishing done by JGI-LANL\nFinished microbial genomes have been curated to close all gaps with\ngreater than 98% coverage of at least two independent clones. Each\nbase pair has a minimum q (quality) value of 30 and the total error\nrate is less than one per 50000.\nThe JGI and collaborators endorse the principles for the\ndistribution and use of large scale sequencing data adopted by the\nlarger genome sequencing community and urge users of this data to\nfollow them. it is our intention to publish the work of this\nproject in a timely fashion and we welcome collaborative\ninteraction on the project and analysis.\n(http://www.genome.gov/page.cfm?pageID=10506376).'} -pCC1BAC_path = "./pCC1BAC.gb" -gene_path = "./R_cellulolyticum.fasta" -pCC1BAC_docs = parse(pCC1BAC_path) -gene_docs = parse(gene_path) -# Printing the parsed files -print(pCC1BAC_docs[0].format("gb")) -# print(gene_docs[0].format("fasta")) + +```python +# Reading the plasmid +vector = parse("./pCC1BAC.gb")[0] +vector.annotations ``` + + + {'molecule_type': 'DNA', + 'topology': 'circular', + 'data_file_division': 'SYN', + 'date': '29-AUG-2024', + 'accessions': ['.'], + 'keywords': [''], + 'source': 'synthetic DNA construct', + 'organism': 'synthetic DNA construct', + 'taxonomy': [], + 'references': [Reference(title='Direct Submission', ...), + Reference(title='Direct Submission', ...), + Reference(title='Direct Submission', ...), + Reference(title='Direct Submission', ...)], + 'comment': 'SGRef: number: 1; type: "Journal Article"; journalName: "Submitted\n(23-AUG-2007) 726 Post Road, Madison, WI 53713, USA"\nSGRef: number: 2; type: "Journal Article"\nSGRef: number: 3; type: "Journal Article"'} + + + + ```python # Importing pre-designed primers for the PylRS insert fragment. -F1_For = "GCAGCTTCAAGTCCTGCAAACAAGGTGTACCAGGATCGTT" #Remember that all sequnces are written from 5'-3' +F1_For = "GCAGCTTCAAGTCCTGCAAACAAGGTGTACCAGGATCGTT" F1_Rev = "GATTTCAGTGTAGTTAGGGCCAGTTGAATTCAAACCTGCC" F2_For = "GGCAGGTTTGAATTCAACTGGCCCTAACTACACTGAAATC" F2_Rev = "CTTGGTGCCATCAGCATTGTTCTCTGTACCGCCCACTGTC" @@ -65,29 +114,50 @@ BACF3_Rev = "GGTACTGCATTTGCCGCAGGAACACATGATTATTCAACTGgcggccgccgggtaccgagctcgaatt ```python -# (Optional) Checking that the primer Tm are matching +# Getting the PCR products from the genome (might take a while since the genome is large) + +pcr_product_F1 = pcr(F1_For, F1_Rev, genome, limit=20) +pcr_product_F2 = pcr(F2_For, F2_Rev, genome, limit=20) +pcr_product_F3 = pcr(F3_For, F3_Rev, genome, limit=20) +pcr_product_BAC = pcr(BACF1_For, BACF3_Rev, vector, limit=20) + +# Printing out the PCR fragment sizes +print(len(pcr_product_F1)) +print(len(pcr_product_F2)) +print(len(pcr_product_F3)) +print(len(pcr_product_BAC)) -print(tm_default(F1_For)) # F1_For and F1_Rev have been used as examples here -print(tm_default(F1_Rev)) ``` + 5210 + 5384 + 5172 + 8221 + + ```python -# Checking primer specificity using the pcr function. An error message is returned if otherwise. +# Making a gel to show the PCR products +im = gel( + [ + GeneRuler_1kb_plus, + [pcr_product_F1], + [pcr_product_F2], + [pcr_product_F3], + [pcr_product_BAC], + ] +) +im.rotate(90, expand=1) +``` -pcr_product_F1 = pcr(F1_For, F1_Rev, gene_docs[0], limit=40) -pcr_product_F2 = pcr(F2_For, F2_Rev, gene_docs[0], limit=40) -pcr_product_F3 = pcr(F3_For, F3_Rev, gene_docs[0], limit=40) -pcr_product_BAC = pcr(BACF1_For, BACF3_Rev, pCC1BAC_docs[0], limit=69) -# Printing out the PCR results -print(pcr_product_F1.format("gb")) -print(pcr_product_F2.format("gb")) -print(pcr_product_F3.format("gb")) -print(pcr_product_BAC.format("fasta")) -``` + +![png](Example_Gibson_files/Example_Gibson_8_0.png) + + + ```python @@ -99,3 +169,16 @@ assembled_circ = assembled.assemble_circular() # Printing out the Gibson Assembly product print(assembled_circ[0]) ``` + + Dseqrecord + circular: True + size: 23827 + ID: id + Name: name + Description: description + Number of features: 28 + /molecule_type=DNA + Dseq(o23827) + GCAG..ccgc + CGTC..ggcg + diff --git a/_sources/markdown_notebooks/Example_Restriction.md.txt b/_sources/markdown_notebooks/Example_Restriction.md.txt index 905c8130..4d443c7f 100644 --- a/_sources/markdown_notebooks/Example_Restriction.md.txt +++ b/_sources/markdown_notebooks/Example_Restriction.md.txt @@ -598,7 +598,7 @@ print(pcr_product.format("gb")) ORGANISM . . FEATURES Location/Qualifiers - CDS join(1..424,472..2243) + CDS join(12..435,483..2254) /gene="ase1" /locus_tag="SPOM_SPAPB1A10.09" /codon_start=1 @@ -618,13 +618,13 @@ print(pcr_product.format("gb")) QGANGSDSNMSSSPVSGNSNTPFNKFPNSVSRNTHFESKSPHPNYSRTPHETYSKASSK NVPLSPPKQRVVNEHALNIMSEKLQRTNLKEQTPEMDIENSSQNLPFSPMKISPIRASP VKTIPSSPSPTTNIFSAPLNNITNCTPMEDEWGEEGF" - primer_bind 1..20 + primer_bind 12..31 /label="name" /PCR_conditions="primer sequence:ACCATGTCGACATGCAAACAGTAATGATGGA" /ApEinfo_fwdcolor="#baffa3" /ApEinfo_revcolor="#ffbaba" - primer_bind complement(2225..2243) + primer_bind complement(2236..2254) /label="name" /PCR_conditions="primer sequence:GGCGCGCCATTAAAAGCCTTCTTCTCCC" @@ -789,7 +789,33 @@ print(synthetic_vector.format("gb")) primer_bind 3859..3876 /label="SP6" /note="SP6 promoter, forward primer" - primer_bind complement(6131..6149) + CDS join(3918..4341,4389..6160) + /gene="ase1" + /locus_tag="SPOM_SPAPB1A10.09" + /codon_start=1 + /product="antiparallel microtubule cross-linking factor + Ase1" + /protein_id="CAC21482.1" + /translation="MQTVMMDDIQSTDSIAEKDNHSNNESNFTWKAFREQVEKHFSKIE + RLHQVLGTDGDNSSLFELFTTAMNAQLHEMEQCQKKLEDDCQQRIDSIRFLVSSLKLTD + DTSSLKIESPLIQCLNRLSMVEGQYMAQYDQKLSTIKEMYHKLESYCNRLGSPFVLPDF + ENSFLSDVSDAFTESLRGRINEAEKEIDARLEVINSFEEEILGLWSELGVEPADVPQYE + QLLESHTNRPNDVYVTQELIDQLCKQKEVFSAEKEKRSDHLKSIQSEVSNLWNKLQVSP + NEQSQFGDSSNINQENISLWETELEKLHQLKKEHLPIFLEDCRQQILQLWDSLFYSEEQ + RKSFTPMYEDIITEQVLTAHENYIKQLEAEVSANKSFLSLINRYASLIEGKKELEASSN + DASRLTQRGRRDPGLLLREEKIRKRLSRELPKVQSLLIPEITAWEERNGRTFLFYDEPL + LKICQEATQPKSLYRSASAAANRPKTATTTDSVNRTPSQRGRVAVPSTPSVRSASRAMT + SPRTPLPRVKNTQNPSRSISAEPPSATSTANRRHPTANRIDINARLNSASRSRSANMIR + QGANGSDSNMSSSPVSGNSNTPFNKFPNSVSRNTHFESKSPHPNYSRTPHETYSKASSK + NVPLSPPKQRVVNEHALNIMSEKLQRTNLKEQTPEMDIENSSQNLPFSPMKISPIRASP + VKTIPSSPSPTTNIFSAPLNNITNCTPMEDEWGEEGF" + primer_bind 3918..3937 + /label="name" + /PCR_conditions="primer + sequence:ACCATGTCGACATGCAAACAGTAATGATGGA" + /ApEinfo_fwdcolor="#baffa3" + /ApEinfo_revcolor="#ffbaba" + primer_bind complement(6142..6160) /label="name" /PCR_conditions="primer sequence:GGCGCGCCATTAAAAGCCTTCTTCTCCC" diff --git a/_sources/markdown_notebooks/primer_design.md.txt b/_sources/markdown_notebooks/primer_design.md.txt new file mode 100644 index 00000000..6a33a7fb --- /dev/null +++ b/_sources/markdown_notebooks/primer_design.md.txt @@ -0,0 +1,298 @@ +# Primer design in pydna + +You can use `pydna` for primer design in different contexts, let's start with some basic primer functionalities. + +## Checking the Tm of a primer + +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`. + + +```python +from pydna.tm import tm_default + +# The primers from the readme example +print(tm_default("ATGCAAACAGTAATGATGGA")) +print(tm_default("ATTATCTTTTTCAGCAATAGAATCA")) + +``` + + 55.047602641480864 + 54.55481807340169 + + +### Using NEB Tm calculator + +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: + +- `primer`: The primer sequence. +- `conc`: The primer concentration. +- `prodcode`: The product code, which you can find on [NEB's website](https://tmapi.neb.com/docs/productcodes). + +> **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. + + +```python +from pydna.tm import tm_neb + +print(tm_neb("ATGCAAACAGTAATGATGGA", 0.5, "q5-0")) +print(tm_neb("ATTATCTTTTTCAGCAATAGAATCA", 0.5, "q5-0")) + +``` + + 59 + 57 + + +## Designing primers for PCR + +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`). + + +```python +from pydna.dseqrecord import Dseqrecord +from Bio.SeqFeature import SeqFeature, SimpleLocation +from pydna.design import primer_design + +dna = Dseqrecord("ggttcaATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAATAAcatttacatca") + +# Let's add a feature representing the CDS +dna.features.append(SeqFeature(SimpleLocation(start=6, end=60), type="CDS")) + +# To design the primer, we extract the template sequence we want to amplify, and use the `primer_design` method. +template = dna.features[0].location.extract(dna) + +# We get an amplicon object (a subclass of Dseqrecord), that also contains extra info +# of where the primers align etc. +amplicon = primer_design(template, target_tm=60.0, limit=15) + +# We extract the primers +fwd_primer, rvs_primer = amplicon.primers() + +# We print the Tms +print("Forward primer Tm:", tm_default(fwd_primer.seq)) +print("Forward primer sequence:", fwd_primer.seq) +print() +print("Reverse primer Tm:", tm_default(rvs_primer.seq)) +print("Reverse primer sequence:", rvs_primer.seq) +``` + + Forward primer Tm: 59.71997924024873 + Forward primer sequence: ATGCAAACAGTAATGATGGATGAC + + Reverse primer Tm: 60.22377911083646 + Reverse primer sequence: TTATTCAGCAATAGAATCAGTGCTTTG + + +### Special primers + +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. + +#### Restriction enzyme + +Simply append the sequence you want at the 5' end of the primers. + + +```python +from Bio.Restriction import EcoRI +fwd_primer_EcoRI = 'ttGAATTC' + fwd_primer +# You can also do it like this! +rvs_primer_EcoRI = 'tt' + EcoRI.site + rvs_primer + +print(fwd_primer_EcoRI.seq) +print(rvs_primer_EcoRI.seq) + +``` + + ttGAATTCATGCAAACAGTAATGATGGATGAC + ttGAATTCTTATTCAGCAATAGAATCAGTGCTTTG + + +> **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. + +#### Gibson Assembly + +To design primers for Gibson Assembly, you can use the `assembly_fragments` function. + +##### Linear Gibson Assembly + + +```python +from pydna.design import assembly_fragments +# Let's imagine we want to join these two sequences together linearly with Gibson Assembly +seq1 = Dseqrecord('ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAAT') +seq2 = Dseqrecord('CACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAAGCAT') + +# First, we design primers for each fragment, as before: +pre_amplicon1 = primer_design(seq1, target_tm=60.0, limit=15) +pre_amplicon2 = primer_design(seq2, target_tm=60.0, limit=15) + +# Then, we use the `assembly_fragments` function to design primers for Gibson Assembly +amplicon1, amplicon2 = assembly_fragments([pre_amplicon1, pre_amplicon2], overlap=10) + +# We print the primers: +fwd_1, rvs_1 = amplicon1.primers() +fwd_2, rvs_2 = amplicon2.primers() + +print('Primers for fragment 1:') +print(fwd_1.seq) +print(rvs_1.seq) +print() +print('Primers for fragment 2:') +print(fwd_2.seq) +print(rvs_2.seq) +print() + +# The amplicons contain the PCR products (note the overlap between the two fragments) +print('PCR product 1:') +print(amplicon1.seq) +print() +print('PCR product 2:') +print(amplicon2.seq) +print() + +print('Overlap') +print(amplicon1.seq) +print(' '*55,amplicon2.seq, sep='') + +``` + + Primers for fragment 1: + ATGCAAACAGTAATGATGGATGAC + GAGTGATTATCTTTTTCAGCAATAGAATCAGTGC + + Primers for fragment 2: + ATAATCACTCTAATAATGAATCTAACTTTACTTGGAAA + ATGCTTTTCCACTTGTTCACG + + PCR product 1: + ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATCACTC + + PCR product 2: + ATAATCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAAGCAT + + Overlap + ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATCACTC + ATAATCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAAGCAT + + +Once you have the amplicons, you can use `Assembly` to join them together (see the `Gibson` notebook for more details) + + +```python +from pydna.assembly import Assembly +from pydna.common_sub_strings import terminal_overlap + + +assembly = Assembly([amplicon1, amplicon2], limit=10, algorithm=terminal_overlap) +product = assembly.assemble_linear()[0] +print(product.figure()) + +print() + +print(Dseqrecord(product).figure()) + + +``` + + 65bp_PCR_prod|10 + \/ + /\ + 10|65bp_PCR_prod + + Dseqrecord(-120) + ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAAGCAT + TACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTAGTGAGATTATTACTTAGATTGAAATGAACCTTTCGCAAAGCACTTGTTCACCTTTTCGTA + + +##### Circular Gibson Assembly + + +```python +# We use the `assembly_fragments` function with `circular=True` +amplicon1, amplicon2 = assembly_fragments([pre_amplicon1, pre_amplicon2], overlap=10, circular=True) + +# We print the primers: +fwd_1, rvs_1 = amplicon1.primers() +fwd_2, rvs_2 = amplicon2.primers() + +print('Primers for fragment 1:') +print(fwd_1.seq) +print(rvs_1.seq) +print() +print('Primers for fragment 2:') +print(fwd_2.seq) +print(rvs_2.seq) +print() + +assembly = Assembly([amplicon1, amplicon2], limit=10, algorithm=terminal_overlap) + +# Here we use assemble_circular! +product = assembly.assemble_circular()[0] +print(product.figure()) + +print() + +print(Dseqrecord(product).figure()) +``` + + Primers for fragment 1: + AGCATATGCAAACAGTAATGATGGATGAC + GAGTGATTATCTTTTTCAGCAATAGAATCAGTGC + + Primers for fragment 2: + ATAATCACTCTAATAATGAATCTAACTTTACTTGGAAA + TGCATATGCTTTTCCACTTGTTCACG + + -|70bp_PCR_prod|10 + | \/ + | /\ + | 10|70bp_PCR_prod|10 + | \/ + | /\ + | 10- + | | + ------------------------------------ + + Dseqrecord(o120) + AGCATATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAA + TCGTATACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTAGTGAGATTATTACTTAGATTGAAATGAACCTTTCGCAAAGCACTTGTTCACCTTT + + +#### Adding spacers / linkers to Gibson Assembly primers + +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`. + + +```python +# We create two spacers as dseqrecords +spacer1 = Dseqrecord('aaa') +spacer2 = Dseqrecord('ttt') + +amplicon1, amplicon2 = assembly_fragments([pre_amplicon1, spacer1, pre_amplicon2, spacer2], overlap=10, circular=True) + +assembly = Assembly([amplicon1, amplicon2], limit=10, algorithm=terminal_overlap) + +# Here we use assemble_circular! +product = assembly.assemble_circular()[0] + +# See the linkers that have been added +print() +print(Dseqrecord(product).seq) +print(4*' ', '^^^', 60*' ', '^^^', sep='') + + +``` + + + GCATtttATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATaaaCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAA + ^^^ ^^^ + + +#### Summary of assembly_fragments behaviour + +The behaviour is summarised in the following graphics for linear and circular assembly. + +![assembly_fragments behaviour](../_static/assembly_fragment_slide_linear.png) +![assembly_fragments behaviour](../_static/assembly_fragment_slide_circular.png) + + diff --git a/_sources/modules/index.rst.txt b/_sources/modules/index.rst.txt new file mode 100644 index 00000000..56be5e05 --- /dev/null +++ b/_sources/modules/index.rst.txt @@ -0,0 +1,47 @@ +Modules +======= + +.. toctree:: + :maxdepth: 1 + :caption: Modules: + + pydna + pydna__pretty + pydna__thermodynamic_data + pydna_all + pydna_amplicon + pydna_amplify + pydna_assembly + pydna_codon + pydna_common_sub_strings + pydna_conftest + pydna_contig + pydna_crispr + pydna_design + pydna_download + pydna_dseq + pydna_dseqrecord + pydna_editor + pydna_fakeseq + pydna_fusionpcr + pydna_gateway + pydna_gel + pydna_genbank + pydna_genbankfile + pydna_genbankfixer + pydna_genbankrecord + pydna_goldengate + pydna_ladders + pydna_ligate + pydna_myenzymes + pydna_myprimers + pydna_parsers + pydna_primer + pydna_readers + pydna_seq + pydna_seqrecord + pydna_sequence_picker + pydna_threading_timer_decorator_exit + pydna_tm + pydna_user_cloning + pydna_utils diff --git a/_sources/modules/pydna.rst.txt b/_sources/modules/pydna.rst.txt new file mode 100644 index 00000000..bad004e3 --- /dev/null +++ b/_sources/modules/pydna.rst.txt @@ -0,0 +1,7 @@ +pydna +===== + +.. automodule:: pydna + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna__pretty.rst.txt b/_sources/modules/pydna__pretty.rst.txt new file mode 100644 index 00000000..c58d4da9 --- /dev/null +++ b/_sources/modules/pydna__pretty.rst.txt @@ -0,0 +1,7 @@ +pydna._pretty +========== + +.. automodule:: pydna._pretty + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna__thermodynamic_data.rst.txt b/_sources/modules/pydna__thermodynamic_data.rst.txt new file mode 100644 index 00000000..2816e11d --- /dev/null +++ b/_sources/modules/pydna__thermodynamic_data.rst.txt @@ -0,0 +1,7 @@ +pydna._thermodynamic_data +========== + +.. automodule:: pydna._thermodynamic_data + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_all.rst.txt b/_sources/modules/pydna_all.rst.txt new file mode 100644 index 00000000..062c8b2d --- /dev/null +++ b/_sources/modules/pydna_all.rst.txt @@ -0,0 +1,7 @@ +pydna.all +========== + +.. automodule:: pydna.all + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_amplicon.rst.txt b/_sources/modules/pydna_amplicon.rst.txt new file mode 100644 index 00000000..abafb912 --- /dev/null +++ b/_sources/modules/pydna_amplicon.rst.txt @@ -0,0 +1,7 @@ +pydna.amplicon +========== + +.. automodule:: pydna.amplicon + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_amplify.rst.txt b/_sources/modules/pydna_amplify.rst.txt new file mode 100644 index 00000000..20067f80 --- /dev/null +++ b/_sources/modules/pydna_amplify.rst.txt @@ -0,0 +1,7 @@ +pydna.amplify +========== + +.. automodule:: pydna.amplify + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_assembly.rst.txt b/_sources/modules/pydna_assembly.rst.txt new file mode 100644 index 00000000..5e21ed1c --- /dev/null +++ b/_sources/modules/pydna_assembly.rst.txt @@ -0,0 +1,7 @@ +pydna.assembly +========== + +.. automodule:: pydna.assembly + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_codon.rst.txt b/_sources/modules/pydna_codon.rst.txt new file mode 100644 index 00000000..f9371c94 --- /dev/null +++ b/_sources/modules/pydna_codon.rst.txt @@ -0,0 +1,7 @@ +pydna.codon +========== + +.. automodule:: pydna.codon + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_common_sub_strings.rst.txt b/_sources/modules/pydna_common_sub_strings.rst.txt new file mode 100644 index 00000000..34f2af5c --- /dev/null +++ b/_sources/modules/pydna_common_sub_strings.rst.txt @@ -0,0 +1,7 @@ +pydna.common_sub_strings +========== + +.. automodule:: pydna.common_sub_strings + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_conftest.rst.txt b/_sources/modules/pydna_conftest.rst.txt new file mode 100644 index 00000000..d4ba2d96 --- /dev/null +++ b/_sources/modules/pydna_conftest.rst.txt @@ -0,0 +1,7 @@ +pydna.conftest +========== + +.. automodule:: pydna.conftest + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_contig.rst.txt b/_sources/modules/pydna_contig.rst.txt new file mode 100644 index 00000000..c4859d2c --- /dev/null +++ b/_sources/modules/pydna_contig.rst.txt @@ -0,0 +1,7 @@ +pydna.contig +========== + +.. automodule:: pydna.contig + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_crispr.rst.txt b/_sources/modules/pydna_crispr.rst.txt new file mode 100644 index 00000000..03b0ce66 --- /dev/null +++ b/_sources/modules/pydna_crispr.rst.txt @@ -0,0 +1,7 @@ +pydna.crispr +========== + +.. automodule:: pydna.crispr + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_design.rst.txt b/_sources/modules/pydna_design.rst.txt new file mode 100644 index 00000000..a3306982 --- /dev/null +++ b/_sources/modules/pydna_design.rst.txt @@ -0,0 +1,7 @@ +pydna.design +========== + +.. automodule:: pydna.design + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_download.rst.txt b/_sources/modules/pydna_download.rst.txt new file mode 100644 index 00000000..2a8821bd --- /dev/null +++ b/_sources/modules/pydna_download.rst.txt @@ -0,0 +1,7 @@ +pydna.download +========== + +.. automodule:: pydna.download + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_dseq.rst.txt b/_sources/modules/pydna_dseq.rst.txt new file mode 100644 index 00000000..71ed6448 --- /dev/null +++ b/_sources/modules/pydna_dseq.rst.txt @@ -0,0 +1,7 @@ +pydna.dseq +========== + +.. automodule:: pydna.dseq + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_dseqrecord.rst.txt b/_sources/modules/pydna_dseqrecord.rst.txt new file mode 100644 index 00000000..beeaa213 --- /dev/null +++ b/_sources/modules/pydna_dseqrecord.rst.txt @@ -0,0 +1,7 @@ +pydna.dseqrecord +========== + +.. automodule:: pydna.dseqrecord + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_editor.rst.txt b/_sources/modules/pydna_editor.rst.txt new file mode 100644 index 00000000..96e1b332 --- /dev/null +++ b/_sources/modules/pydna_editor.rst.txt @@ -0,0 +1,7 @@ +pydna.editor +========== + +.. automodule:: pydna.editor + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_fakeseq.rst.txt b/_sources/modules/pydna_fakeseq.rst.txt new file mode 100644 index 00000000..7a33eed3 --- /dev/null +++ b/_sources/modules/pydna_fakeseq.rst.txt @@ -0,0 +1,7 @@ +pydna.fakeseq +========== + +.. automodule:: pydna.fakeseq + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_fusionpcr.rst.txt b/_sources/modules/pydna_fusionpcr.rst.txt new file mode 100644 index 00000000..54501777 --- /dev/null +++ b/_sources/modules/pydna_fusionpcr.rst.txt @@ -0,0 +1,7 @@ +pydna.fusionpcr +========== + +.. automodule:: pydna.fusionpcr + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_gateway.rst.txt b/_sources/modules/pydna_gateway.rst.txt new file mode 100644 index 00000000..68ec95ab --- /dev/null +++ b/_sources/modules/pydna_gateway.rst.txt @@ -0,0 +1,7 @@ +pydna.gateway +========== + +.. automodule:: pydna.gateway + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_gel.rst.txt b/_sources/modules/pydna_gel.rst.txt new file mode 100644 index 00000000..ded66b11 --- /dev/null +++ b/_sources/modules/pydna_gel.rst.txt @@ -0,0 +1,7 @@ +pydna.gel +========== + +.. automodule:: pydna.gel + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_genbank.rst.txt b/_sources/modules/pydna_genbank.rst.txt new file mode 100644 index 00000000..77c453e3 --- /dev/null +++ b/_sources/modules/pydna_genbank.rst.txt @@ -0,0 +1,7 @@ +pydna.genbank +========== + +.. automodule:: pydna.genbank + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_genbankfile.rst.txt b/_sources/modules/pydna_genbankfile.rst.txt new file mode 100644 index 00000000..e1ad4528 --- /dev/null +++ b/_sources/modules/pydna_genbankfile.rst.txt @@ -0,0 +1,7 @@ +pydna.genbankfile +========== + +.. automodule:: pydna.genbankfile + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_genbankfixer.rst.txt b/_sources/modules/pydna_genbankfixer.rst.txt new file mode 100644 index 00000000..9da25346 --- /dev/null +++ b/_sources/modules/pydna_genbankfixer.rst.txt @@ -0,0 +1,7 @@ +pydna.genbankfixer +========== + +.. automodule:: pydna.genbankfixer + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_genbankrecord.rst.txt b/_sources/modules/pydna_genbankrecord.rst.txt new file mode 100644 index 00000000..4237c23f --- /dev/null +++ b/_sources/modules/pydna_genbankrecord.rst.txt @@ -0,0 +1,7 @@ +pydna.genbankrecord +========== + +.. automodule:: pydna.genbankrecord + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_goldengate.rst.txt b/_sources/modules/pydna_goldengate.rst.txt new file mode 100644 index 00000000..00d5148f --- /dev/null +++ b/_sources/modules/pydna_goldengate.rst.txt @@ -0,0 +1,7 @@ +pydna.goldengate +========== + +.. automodule:: pydna.goldengate + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_ladders.rst.txt b/_sources/modules/pydna_ladders.rst.txt new file mode 100644 index 00000000..49fcb9f3 --- /dev/null +++ b/_sources/modules/pydna_ladders.rst.txt @@ -0,0 +1,7 @@ +pydna.ladders +========== + +.. automodule:: pydna.ladders + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_ligate.rst.txt b/_sources/modules/pydna_ligate.rst.txt new file mode 100644 index 00000000..abe63c87 --- /dev/null +++ b/_sources/modules/pydna_ligate.rst.txt @@ -0,0 +1,7 @@ +pydna.ligate +========== + +.. automodule:: pydna.ligate + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_myenzymes.rst.txt b/_sources/modules/pydna_myenzymes.rst.txt new file mode 100644 index 00000000..00158c97 --- /dev/null +++ b/_sources/modules/pydna_myenzymes.rst.txt @@ -0,0 +1,7 @@ +pydna.myenzymes +========== + +.. automodule:: pydna.myenzymes + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_myprimers.rst.txt b/_sources/modules/pydna_myprimers.rst.txt new file mode 100644 index 00000000..ec93b404 --- /dev/null +++ b/_sources/modules/pydna_myprimers.rst.txt @@ -0,0 +1,7 @@ +pydna.myprimers +========== + +.. automodule:: pydna.myprimers + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_parsers.rst.txt b/_sources/modules/pydna_parsers.rst.txt new file mode 100644 index 00000000..3073e023 --- /dev/null +++ b/_sources/modules/pydna_parsers.rst.txt @@ -0,0 +1,7 @@ +pydna.parsers +========== + +.. automodule:: pydna.parsers + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_primer.rst.txt b/_sources/modules/pydna_primer.rst.txt new file mode 100644 index 00000000..6d8e17bd --- /dev/null +++ b/_sources/modules/pydna_primer.rst.txt @@ -0,0 +1,7 @@ +pydna.primer +========== + +.. automodule:: pydna.primer + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_readers.rst.txt b/_sources/modules/pydna_readers.rst.txt new file mode 100644 index 00000000..3504a864 --- /dev/null +++ b/_sources/modules/pydna_readers.rst.txt @@ -0,0 +1,7 @@ +pydna.readers +========== + +.. automodule:: pydna.readers + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_seq.rst.txt b/_sources/modules/pydna_seq.rst.txt new file mode 100644 index 00000000..d5641ab1 --- /dev/null +++ b/_sources/modules/pydna_seq.rst.txt @@ -0,0 +1,7 @@ +pydna.seq +========== + +.. automodule:: pydna.seq + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_seqrecord.rst.txt b/_sources/modules/pydna_seqrecord.rst.txt new file mode 100644 index 00000000..575b637c --- /dev/null +++ b/_sources/modules/pydna_seqrecord.rst.txt @@ -0,0 +1,7 @@ +pydna.seqrecord +========== + +.. automodule:: pydna.seqrecord + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_sequence_picker.rst.txt b/_sources/modules/pydna_sequence_picker.rst.txt new file mode 100644 index 00000000..c14ff198 --- /dev/null +++ b/_sources/modules/pydna_sequence_picker.rst.txt @@ -0,0 +1,7 @@ +pydna.sequence_picker +========== + +.. automodule:: pydna.sequence_picker + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_threading_timer_decorator_exit.rst.txt b/_sources/modules/pydna_threading_timer_decorator_exit.rst.txt new file mode 100644 index 00000000..94e02931 --- /dev/null +++ b/_sources/modules/pydna_threading_timer_decorator_exit.rst.txt @@ -0,0 +1,7 @@ +pydna.threading_timer_decorator_exit +========== + +.. automodule:: pydna.threading_timer_decorator_exit + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_tm.rst.txt b/_sources/modules/pydna_tm.rst.txt new file mode 100644 index 00000000..ec190b42 --- /dev/null +++ b/_sources/modules/pydna_tm.rst.txt @@ -0,0 +1,7 @@ +pydna.tm +========== + +.. automodule:: pydna.tm + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_user_cloning.rst.txt b/_sources/modules/pydna_user_cloning.rst.txt new file mode 100644 index 00000000..5e14b551 --- /dev/null +++ b/_sources/modules/pydna_user_cloning.rst.txt @@ -0,0 +1,7 @@ +pydna.user_cloning +========== + +.. automodule:: pydna.user_cloning + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/modules/pydna_utils.rst.txt b/_sources/modules/pydna_utils.rst.txt new file mode 100644 index 00000000..6b481652 --- /dev/null +++ b/_sources/modules/pydna_utils.rst.txt @@ -0,0 +1,7 @@ +pydna.utils +========== + +.. automodule:: pydna.utils + :members: + :undoc-members: + :show-inheritance: diff --git a/_static/basic.css b/_static/basic.css index f316efcb..cfc60b86 100644 --- a/_static/basic.css +++ b/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -237,10 +237,6 @@ a.headerlink { visibility: hidden; } -a:visited { - color: #551A8B; -} - h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, diff --git a/_static/css/theme.css b/_static/css/theme.css index 0f14f106..6843d97b 100644 --- a/_static/css/theme.css +++ b/_static/css/theme.css @@ -1,4 +1,4 @@ html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_static/custom.css b/_static/custom.css index a77890ee..df81fb92 100644 --- a/_static/custom.css +++ b/_static/custom.css @@ -1,5 +1,48 @@ /* Make output cells that are too long scrollable */ -.highlight-none pre { +.highlight-none { + position: relative; + margin-top: 20px; +} + +/* Add a label to the top of the output cell */ +.highlight-none::before { + content: "output"; + position: absolute; + top: 0px; + left: 0; + background-color: #f0f0f0; + color: #333; + padding: 2px 8px; + font-size: 12px; + border-radius: 3px 3px 0 0; + z-index: 1; +} + +div.highlight-none pre { max-height: 300px; overflow-y: auto; } + +/* Add same label to highlight-python cells */ +.highlight-python { + position: relative; +} + +/* Add a label to the top of the output cell */ +.highlight-python::before { + content: "python code"; + position: absolute; + top: 0px; + left: 0; + background-color: #f0f0f0; + color: #333; + padding: 2px 8px; + font-size: 12px; + border-radius: 3px 3px 0 0; + z-index: 1; +} + +/* Add padding to the top to fit the label */ +.rst-content div[class^="highlight"] pre { + padding-top: 25px; +} diff --git a/_static/doctools.js b/_static/doctools.js index 4d67807d..d06a71d7 100644 --- a/_static/doctools.js +++ b/_static/doctools.js @@ -4,7 +4,7 @@ * * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/_static/documentation_options.js b/_static/documentation_options.js index 9435409f..b3e83ea4 100644 --- a/_static/documentation_options.js +++ b/_static/documentation_options.js @@ -1,5 +1,6 @@ -const DOCUMENTATION_OPTIONS = { - VERSION: '0.0.0.post1+9d112d7', +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '6.0.0a24.post17+b7b559bd66', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/_static/favicon.ico b/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..db139baf7481c880bfd05992cd0dcd9d808960ac GIT binary patch literal 15406 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 { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -const _displayItem = (item, searchTerms, highlightTerms) => { +const _displayItem = (item, searchTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; - const contentRoot = document.documentElement.dataset.content_root; const [docName, title, anchor, descr, score, _filename] = item; @@ -75,35 +75,28 @@ const _displayItem = (item, searchTerms, highlightTerms) => { if (dirname.match(/\/index\/$/)) dirname = dirname.substring(0, dirname.length - 6); else if (dirname === "index/") dirname = ""; - requestUrl = contentRoot + dirname; + requestUrl = docUrlRoot + dirname; linkUrl = requestUrl; } else { // normal html builders - requestUrl = contentRoot + docName + docFileSuffix; + requestUrl = docUrlRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } let linkEl = listItem.appendChild(document.createElement("a")); linkEl.href = linkUrl + anchor; linkEl.dataset.score = score; linkEl.innerHTML = title; - if (descr) { + if (descr) listItem.appendChild(document.createElement("span")).innerHTML = " (" + descr + ")"; - // highlight search terms in the description - if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js - highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); - } else if (showSearchSummary) fetch(requestUrl) .then((responseData) => responseData.text()) .then((data) => { if (data) listItem.appendChild( - Search.makeSearchSummary(data, searchTerms, anchor) + Search.makeSearchSummary(data, searchTerms) ); - // highlight search terms in the summary - if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js - highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); }); Search.output.appendChild(listItem); }; @@ -116,43 +109,26 @@ const _finishSearch = (resultCount) => { ); else Search.status.innerText = _( - "Search finished, found ${resultCount} page(s) matching the search query." - ).replace('${resultCount}', resultCount); + `Search finished, found ${resultCount} page(s) matching the search query.` + ); }; const _displayNextItem = ( results, resultCount, - searchTerms, - highlightTerms, + searchTerms ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { - _displayItem(results.pop(), searchTerms, highlightTerms); + _displayItem(results.pop(), searchTerms); setTimeout( - () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + () => _displayNextItem(results, resultCount, searchTerms), 5 ); } // search finished, update title and status message else _finishSearch(resultCount); }; -// Helper function used by query() to order search results. -// Each input is an array of [docname, title, anchor, descr, score, filename]. -// Order the results by score (in opposite order of appearance, since the -// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. -const _orderResultsByScoreThenName = (a, b) => { - const leftScore = a[4]; - const rightScore = b[4]; - if (leftScore === rightScore) { - // same score: sort alphabetically - const leftTitle = a[1].toLowerCase(); - const rightTitle = b[1].toLowerCase(); - if (leftTitle === rightTitle) return 0; - return leftTitle > rightTitle ? -1 : 1; // inverted is intentional - } - return leftScore > rightScore ? 1 : -1; -}; /** * Default splitQuery function. Can be overridden in ``sphinx.search`` with a @@ -176,26 +152,13 @@ const Search = { _queued_query: null, _pulse_status: -1, - htmlToText: (htmlString, anchor) => { + htmlToText: (htmlString) => { const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); - for (const removalQuery of [".headerlink", "script", "style"]) { - htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); - } - if (anchor) { - const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); - if (anchorContent) return anchorContent.textContent; - - console.warn( - `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` - ); - } - - // if anchor not specified or not found, fall back to main content + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); const docContent = htmlElement.querySelector('[role="main"]'); - if (docContent) return docContent.textContent; - + if (docContent !== undefined) return docContent.textContent; console.warn( - "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." ); return ""; }, @@ -268,7 +231,16 @@ const Search = { else Search.deferQuery(query); }, - _parseQuery: (query) => { + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + // stem the search terms and add them to the correct list const stemmer = new Stemmer(); const searchTerms = new Set(); @@ -304,38 +276,21 @@ const Search = { // console.info("required: ", [...searchTerms]); // console.info("excluded: ", [...excludedTerms]); - return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; - }, - - /** - * execute search (requires search index to be loaded) - */ - _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const titles = Search._index.titles; - const allTitles = Search._index.alltitles; - const indexEntries = Search._index.indexentries; - - // Collect multiple result groups to be sorted separately and then ordered. - // Each is an array of [docname, title, anchor, descr, score, filename]. - const normalResults = []; - const nonMainIndexResults = []; - + // array of [docname, title, anchor, descr, score, filename] + let results = []; _removeChildren(document.getElementById("search-progress")); - const queryLower = query.toLowerCase().trim(); + const queryLower = query.toLowerCase(); for (const [title, foundTitles] of Object.entries(allTitles)) { - if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { for (const [file, id] of foundTitles) { - const score = Math.round(Scorer.title * queryLower.length / title.length); - const boost = titles[file] === title ? 1 : 0; // add a boost for document titles - normalResults.push([ + let score = Math.round(100 * queryLower.length / title.length) + results.push([ docNames[file], titles[file] !== title ? `${titles[file]} > ${title}` : title, id !== null ? "#" + id : "", null, - score + boost, + score, filenames[file], ]); } @@ -345,47 +300,46 @@ const Search = { // search for explicit entries in index directives for (const [entry, foundEntries] of Object.entries(indexEntries)) { if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { - for (const [file, id, isMain] of foundEntries) { - const score = Math.round(100 * queryLower.length / entry.length); - const result = [ + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ docNames[file], titles[file], id ? "#" + id : "", null, score, filenames[file], - ]; - if (isMain) { - normalResults.push(result); - } else { - nonMainIndexResults.push(result); - } + ]); } } } // lookup as object objectTerms.forEach((term) => - normalResults.push(...Search.performObjectSearch(term, objectTerms)) + results.push(...Search.performObjectSearch(term, objectTerms)) ); // lookup as search terms in fulltext - normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); // let the scorer override scores with a custom scoring function - if (Scorer.score) { - normalResults.forEach((item) => (item[4] = Scorer.score(item))); - nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); - } - - // Sort each group of results by score and then alphabetically by name. - normalResults.sort(_orderResultsByScoreThenName); - nonMainIndexResults.sort(_orderResultsByScoreThenName); - - // Combine the result groups in (reverse) order. - // Non-main index entries are typically arbitrary cross-references, - // so display them after other results. - let results = [...nonMainIndexResults, ...normalResults]; + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); // remove duplicate search results // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept @@ -399,19 +353,14 @@ const Search = { return acc; }, []); - return results.reverse(); - }, - - query: (query) => { - const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); - const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + results = results.reverse(); // for debugging //Search.lastresults = results.slice(); // a copy // console.info("search results:", Search.lastresults); // print the results - _displayNextItem(results, results.length, searchTerms, highlightTerms); + _displayNextItem(results, results.length, searchTerms); }, /** @@ -509,18 +458,14 @@ const Search = { // add support for partial matches if (word.length > 2) { const escapedWord = _escapeRegExp(word); - if (!terms.hasOwnProperty(word)) { - Object.keys(terms).forEach((term) => { - if (term.match(escapedWord)) - arr.push({ files: terms[term], score: Scorer.partialTerm }); - }); - } - if (!titleTerms.hasOwnProperty(word)) { - Object.keys(titleTerms).forEach((term) => { - if (term.match(escapedWord)) - arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); - }); - } + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); } // no match but word was a required one @@ -543,8 +488,9 @@ const Search = { // create the mapping files.forEach((file) => { - if (!fileMap.has(file)) fileMap.set(file, [word]); - else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); }); }); @@ -595,8 +541,8 @@ const Search = { * search summary for a given text. keywords is a list * of stemmed words. */ - makeSearchSummary: (htmlText, keywords, anchor) => { - const text = Search.htmlToText(htmlText, anchor); + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); if (text === "") return null; const textLower = text.toLowerCase(); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js index 8a96c69a..aae669d7 100644 --- a/_static/sphinx_highlight.js +++ b/_static/sphinx_highlight.js @@ -29,19 +29,14 @@ const _highlight = (node, addItems, text, className) => { } span.appendChild(document.createTextNode(val.substr(pos, text.length))); - const rest = document.createTextNode(val.substr(pos + text.length)); parent.insertBefore( span, parent.insertBefore( - rest, + document.createTextNode(val.substr(pos + text.length)), node.nextSibling ) ); node.nodeValue = val.substr(0, pos); - /* There may be more occurrences of search term in this node. So call this - * function recursively on the remaining fragment. - */ - _highlight(rest, addItems, text, className); if (isInSVG) { const rect = document.createElementNS( @@ -145,10 +140,5 @@ const SphinxHighlight = { }, }; -_ready(() => { - /* Do not call highlightSearchWords() when we are on the search page. - * It will highlight words from the *previous* search query. - */ - if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); - SphinxHighlight.initEscapeListener(); -}); +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/example_gallery.html b/example_gallery.html index be576deb..85d116aa 100644 --- a/example_gallery.html +++ b/example_gallery.html @@ -9,9 +9,10 @@ Example gallery — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -46,7 +47,7 @@ @@ -79,7 +80,9 @@

        Example gallery

        Below are some examples that show the functionality of pydna in real-world scenarios.

          -
        • Example_Restriction: Using restriction and ligation to do xyz.

        • +
        • Example_Restriction: PCRing a gene out of the genome, and cloning into a vector using restriction and ligation.

        • +
        • Example_Gibson: Gibson assembly of R. cellulolyticum genomic fragments into a plasmid, from the original Gibson assembly paper doi: 10.1038/nmeth.1318.

        • +
        • Example_CRISPR: Using CRISPR with homologous recombination to delete genes by making two cuts in the genome, and repair it with an oligo. Used in the industrially relevant K. phaffi.

        diff --git a/genindex.html b/genindex.html index bb1ff56b..7c7479ce 100644 --- a/genindex.html +++ b/genindex.html @@ -1,20 +1,22 @@ - + - Index — pydna 0.0.0.post1+9d112d7 documentation + Index — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -39,8 +41,15 @@
        @@ -92,49 +101,95 @@

        Index

        A

        B

        +
        @@ -142,60 +197,112 @@

        B

        C

        @@ -204,25 +311,37 @@

        C

        D

        @@ -230,33 +349,51 @@

        D

        E

        @@ -264,101 +401,183 @@

        E

        F

        G

        @@ -366,18 +585,24 @@

        G

        I

        @@ -386,38 +611,64 @@

        I

        L

        @@ -426,128 +677,222 @@

        L

        M

        N

        O

        @@ -555,95 +900,173 @@

        O

        P

        @@ -652,318 +1075,511 @@

        P

        pydna.dseqrecord
      • pydna.editor
      • +
      • + pydna.fakeseq + +
      • +
      • + pydna.fusionpcr + +
      • +
      • + pydna.gateway + +
      • pydna.gel
      • pydna.genbank
      • pydna.genbankfile
      • pydna.genbankfixer
      • pydna.genbankrecord
      • +
      • + pydna.goldengate + +
      • +
      • + pydna.ladders + +
      • +
      • + pydna.ligate + +
      • +
      • + pydna.myenzymes + +
      • pydna.myprimers
      • pydna.parsers
      • pydna.primer
      • pydna.readers
      • +
      • + pydna.seq + +
      • pydna.seqrecord
      • +
      • + pydna.sequence_picker + +
      • +
      • + pydna.threading_timer_decorator_exit + +
      • pydna.tm
      • +
      • + pydna.user_cloning + +
      • pydna.utils
      • -
      • pydna_code() (pydna.genbankrecord.GenbankRecord method) +
      • pydna_code() (pydna.genbankrecord.GenbankRecord method)
      • -
      • pydna_code_from_list() (pydna.myprimers.PrimerList method) +
      • pydna_code_from_list() (pydna.all.PrimerList method) + +
      • Q

        R

        S

        T

        @@ -972,20 +1588,28 @@

        T

        U

        +
      • translate() (pydna.all.Dseq method)
      • -
      • trunc (pydna.dseq.Dseq attribute) +
      • trunc (pydna.all.Dseq attribute) + +
      • +
      • twice_cutters() (pydna.all.Dseq method)
      • @@ -994,14 +1618,22 @@

        U

        W

        diff --git a/getting_started.html b/getting_started.html index 2ec78863..21aee3c6 100644 --- a/getting_started.html +++ b/getting_started.html @@ -9,9 +9,10 @@ Getting started — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -21,7 +22,7 @@ - + @@ -47,7 +48,7 @@ @@ -83,18 +84,28 @@

        Getting started
      • Dseq: Basic introduction to how sequences are handled in pydna.

      • +
      • Dseq_Features: How to work with sequence features, which are often present in genbank or dna files to mark regions of interest (coding sequences, resistance markers, etc.)

      • +
      • Importing_Seqs: How to import sequences from various sources.

      • -

        etc.

        +

        Next, you can learn how specific cloning techniques are handled.

        +
          +
        • Restrict_Ligate_Cloning: How to perform restriction and ligation.

        • +
        • PCR: How to perform PCR.

        • +
        • primer_design: How to design primers for Gibson assembly and restriction-ligation cloning.

        • +
        • Gibson: How to perform Gibson assembly.

        • +
        • CRISPR: How to perform CRISPR-Cas9 cutting.

        • +
        +

        These notebooks cover the basics, but you can see real-world examples in the example gallery.

        diff --git a/index.html b/index.html index 880429a3..9dd8df29 100644 --- a/index.html +++ b/index.html @@ -1,24 +1,27 @@ - + - Welcome to pydna’s documentation! — pydna 0.0.0.post1+9d112d7 documentation + Pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + - + + @@ -40,359 +43,15 @@
        @@ -407,7 +66,7 @@
        • - +
        • View page source
        • @@ -417,4608 +76,40 @@
          -
          -

          Welcome to pydna’s documentation!

          -

          Stuff & other stuff

          -
          -

          Module contents

          -
          -
          copyright:
          -

          Copyright 2013-2023 by Björn Johansson. All rights reserved.

          -
          -
          license:
          -

          This code is part of the pydna package, governed by the -license in LICENSE.txt that should be included as part -of this package.

          -
          -
          -
          -

          pydna

          -

          Pydna is a python package providing code for simulation of the creation of -recombinant DNA molecules using -molecular biology -techniques. Development of pydna happens in this Github repository.

          -
          -
          Provided:
            -
          1. PCR simulation

          2. -
          3. Assembly simulation based on shared identical sequences

          4. -
          5. Primer design for amplification of a given sequence

          6. -
          7. Automatic design of primer tails for Gibson assembly -or homologous recombination.

          8. -
          9. Restriction digestion and cut&paste cloning

          10. -
          11. Agarose gel simulation

          12. -
          13. Download sequences from Genbank

          14. -
          15. Parsing various sequence formats including the capacity to -handle broken Genbank format

          16. -
          -
          -
          -
          -

          pydna package layout

          -

          The most important modules and how to import functions or classes from -them are listed below. Class names starts with a capital letter, -functions with a lowercase letter:

          -
          from pydna.module import function
          -from pydna.module import Class
          -
          -Example: from pydna.gel import Gel
          -
          -pydna
          -   ├── amplify
          -   │         ├── Anneal
          -   │         └── pcr
          -   ├── assembly
          -   │          └── Assembly
          -   ├── design
          -   │        ├── assembly_fragments
          -   │        └── primer_design
          -   ├── download
          -   │          └── download_text
          -   ├── dseqrecord
          -   │            └── Dseqrecord
          -   ├── gel
          -   │     └── Gel
          -   ├── genbank
          -   │         ├── genbank
          -   │         └── Genbank
          -   ├── parsers
          -   │         ├── parse
          -   │         └── parse_primers
          -   └── readers
          -             ├── read
          -             └── read_primers
          -
          -
          -
          -
          -

          How to use the documentation

          -

          Documentation is available as docstrings provided in the source code for -each module. -These docstrings can be inspected by reading the source code directly. -See further below on how to obtain the code for pydna.

          -

          In the python shell, use the built-in help function to view a -function’s docstring:

          -
          >>> from pydna import readers
          ->>> help(readers.read)
          -... 
          -
          -
          -

          The doctrings are also used to provide an automaticly generated reference -manual available online at -read the docs.

          -

          Docstrings can be explored using IPython, an -advanced Python shell with -TAB-completion and introspection capabilities. To see which functions -are available in pydna, -type pydna.<TAB> (where <TAB> refers to the TAB key). -Use pydna.open_config_folder?<ENTER>`to view the docstring or -`pydna.open_config_folder??<ENTER> to view the source code.

          -

          In the Spyder IDE it is possible -to place the cursor immediately before the name of a module,class or -function and press ctrl+i to bring up docstrings in a separate window in Spyder

          -

          Code snippets are indicated by three greater-than signs:

          -
          >>> x=41
          ->>> x=x+1
          ->>> x
          -42
          -
          -
          -
          -
          -

          pydna source code

          -

          The pydna source code is -available on Github.

          -
          -
          -

          How to get more help

          -

          Please join the -Google group -for pydna, this is the preferred location for help. If you find bugs -in pydna itself, open an issue at the -Github repository.

          -
          -
          -

          Examples of pydna in use

          -
          -
          See this repository for a collection of

          examples.

          -
          -
          -
          -
          -
          -
          -pydna.open_current_folder()[source]
          -

          Open the current working directory.

          -

          Opens in the default file manager. The location for this folder is -given by the os.getcwd() function

          -
          - -
          -
          -pydna.open_cache_folder()[source]
          -

          Open the pydna cache folder.

          -

          Opens in the default file manager. The location for this folder is stored -in the pydna_data_dir environmental variable.

          -
          - -
          -
          -pydna.open_config_folder()[source]
          -

          Open the pydna configuration folder.

          -

          Opens in the default file manager. The location for this folder is stored -in the pydna_config_dir environmental variable.

          -

          The pydna.ini file can be edited to make pydna quicker to use. -See the documentation of the :class:configparser.ConfigParser´ class.

          -

          Below is the content of a typical pydna.ini file on a Linux -system.

          -
          [main]
          -loglevel=30
          -email=myemail@example.org
          -data_dir=/home/bjorn/.local/share/pydna
          -log_dir=/home/bjorn/.cache/pydna/log
          -ape=tclsh /home/bjorn/.ApE/AppMain.tcl
          -cached_funcs=Genbank_nucleotide
          -primers=/home/bjorn/Dropbox/wikidata/PRIMERS.txt
          -enzymes=/home/bjorn/Dropbox/wikidata/RestrictionEnzymes.txt
          -
          -
          -

          The email address is set to someone@example.com by default. If you change -this to you own address, the pydna.genbank.genbank() function can be -used to download sequences from Genbank directly without having to -explicitly add the email address.

          -

          Pydna can cache results from the following functions or methods:

          - -

          These can be added separated by a comma to the cached_funcs entry -in pydna.ini file or the pydna_cached_funcs environment variable.

          -
          - -
          -
          -pydna.open_log_folder()[source]
          -

          docstring.

          -
          - -
          -
          -pydna.get_env()[source]
          -

          Print a an ascii table containing all environmental variables.

          -

          Pydna related variables have names that starts with pydna_

          -
          - -
          - -

          Ascii-art logotype of pydna.

          -
          - -
          -
          -

          pydna.dseq module

          -

          Provides the Dseq class for handling double stranded DNA sequences.

          -

          Dseq is a subclass of Bio.Seq.Seq. The Dseq class -is mostly useful as a part of the pydna.dseqrecord.Dseqrecord class -which can hold more meta data.

          -

          The Dseq class support the notion of circular and linear DNA topology.

          -
          -
          -class pydna.dseq.Dseq(watson: str | bytes, crick: str | bytes | None = None, ovhg=None, circular=False, pos=0)[source]
          -

          Bases: Seq

          -

          Dseq holds information for a double stranded DNA fragment.

          -

          Dseq also holds information describing the topology of -the DNA fragment (linear or circular).

          -
          -
          Parameters:
          -
            -
          • watson (str) – a string representing the watson (sense) DNA strand.

          • -
          • crick (str, optional) – a string representing the crick (antisense) DNA strand.

          • -
          • ovhg (int, optional) – A positive or negative number to describe the stagger between the -watson and crick strands. -see below for a detailed explanation.

          • -
          • linear (bool, optional) – True indicates that sequence is linear, False that it is circular.

          • -
          • circular (bool, optional) – True indicates that sequence is circular, False that it is linear.

          • -
          -
          -
          -

          Examples

          -

          Dseq is a subclass of the Biopython Seq object. It stores two -strings representing the watson (sense) and crick(antisense) strands. -two properties called linear and circular, and a numeric value ovhg -(overhang) describing the stagger for the watson and crick strand -in the 5’ end of the fragment.

          -

          The most common usage is probably to create a Dseq object as a -part of a Dseqrecord object (see pydna.dseqrecord.Dseqrecord).

          -

          There are three ways of creating a Dseq object directly listed below, but you can also -use the function Dseq.from_full_sequence_and_overhangs() to create a Dseq:

          -

          Only one argument (string):

          -
          >>> from pydna.dseq import Dseq
          ->>> Dseq("aaa")
          -Dseq(-3)
          -aaa
          -ttt
          -
          -
          -

          The given string will be interpreted as the watson strand of a -blunt, linear double stranded sequence object. The crick strand -is created automatically from the watson strand.

          -

          Two arguments (string, string):

          -
          >>> from pydna.dseq import Dseq
          ->>> Dseq("gggaaat","ttt")
          -Dseq(-7)
          -gggaaat
          -   ttt
          -
          -
          -

          If both watson and crick are given, but not ovhg an attempt -will be made to find the best annealing between the strands. -There are limitations to this. For long fragments it is quite -slow. The length of the annealing sequences have to be at least -half the length of the shortest of the strands.

          -

          Three arguments (string, string, ovhg=int):

          -

          The ovhg parameter is an integer describing the length of the -crick strand overhang in the 5’ end of the molecule.

          -

          The ovhg parameter controls the stagger at the five prime end:

          -
          dsDNA       overhang
          -
          -  nnn...    2
          -nnnnn...
          -
          - nnnn...    1
          -nnnnn...
          -
          -nnnnn...    0
          -nnnnn...
          -
          -nnnnn...   -1
          - nnnn...
          -
          -nnnnn...   -2
          -  nnn...
          -
          -
          -

          Example of creating Dseq objects with different amounts of stagger:

          -
          >>> Dseq(watson="agt", crick="actta", ovhg=-2)
          -Dseq(-7)
          -agt
          -  attca
          ->>> Dseq(watson="agt",crick="actta",ovhg=-1)
          -Dseq(-6)
          -agt
          - attca
          ->>> Dseq(watson="agt",crick="actta",ovhg=0)
          -Dseq(-5)
          -agt
          -attca
          ->>> Dseq(watson="agt",crick="actta",ovhg=1)
          -Dseq(-5)
          - agt
          -attca
          ->>> Dseq(watson="agt",crick="actta",ovhg=2)
          -Dseq(-5)
          -  agt
          -attca
          -
          -
          -

          If the ovhg parameter is specified a crick strand also -needs to be supplied, otherwise an exception is raised.

          -
          >>> Dseq(watson="agt", ovhg=2)
          -Traceback (most recent call last):
          -  File "<stdin>", line 1, in <module>
          -  File "/usr/local/lib/python2.7/dist-packages/pydna_/dsdna.py", line 169, in __init__
          -    else:
          -ValueError: ovhg defined without crick strand!
          -
          -
          -

          The shape of the fragment is set by circular = True, False

          -

          Note that both ends of the DNA fragment has to be compatible to set -circular = True.

          -
          >>> Dseq("aaa","ttt")
          -Dseq(-3)
          -aaa
          -ttt
          ->>> Dseq("aaa","ttt",ovhg=0)
          -Dseq(-3)
          -aaa
          -ttt
          ->>> Dseq("aaa","ttt",ovhg=1)
          -Dseq(-4)
          - aaa
          -ttt
          ->>> Dseq("aaa","ttt",ovhg=-1)
          -Dseq(-4)
          -aaa
          - ttt
          ->>> Dseq("aaa", "ttt", circular = True , ovhg=0)
          -Dseq(o3)
          -aaa
          -ttt
          -
          -
          -
          >>> a=Dseq("tttcccc","aaacccc")
          ->>> a
          -Dseq(-11)
          -    tttcccc
          -ccccaaa
          ->>> a.ovhg
          -4
          -
          -
          -
          >>> b=Dseq("ccccttt","ccccaaa")
          ->>> b
          -Dseq(-11)
          -ccccttt
          -    aaacccc
          ->>> b.ovhg
          --4
          ->>>
          -
          -
          -

          Coercing to string

          -
          >>> str(a)
          -'ggggtttcccc'
          -
          -
          -

          A Dseq object can be longer that either the watson or crick strands.

          -
          <-- length -->
          -GATCCTTT
          -     AAAGCCTAG
          -
          -<-- length -->
          -      GATCCTTT
          -AAAGCCCTA
          -
          -
          -

          The slicing of a linear Dseq object works mostly as it does for a string.

          -
          >>> s="ggatcc"
          ->>> s[2:3]
          -'a'
          ->>> s[2:4]
          -'at'
          ->>> s[2:4:-1]
          -''
          ->>> s[::2]
          -'gac'
          ->>> from pydna.dseq import Dseq
          ->>> d=Dseq(s, circular=False)
          ->>> d[2:3]
          -Dseq(-1)
          -a
          -t
          ->>> d[2:4]
          -Dseq(-2)
          -at
          -ta
          ->>> d[2:4:-1]
          -Dseq(-0)
          -
          -
          ->>> d[::2]
          -Dseq(-3)
          -gac
          -ctg
          -
          -
          -

          The slicing of a circular Dseq object has a slightly different meaning.

          -
          >>> s="ggAtCc"
          ->>> d=Dseq(s, circular=True)
          ->>> d
          -Dseq(o6)
          -ggAtCc
          -ccTaGg
          ->>> d[4:3]
          -Dseq(-5)
          -CcggA
          -GgccT
          -
          -
          -

          The slice [X:X] produces an empty slice for a string, while this -will return the linearized sequence starting at X:

          -
          >>> s="ggatcc"
          ->>> d=Dseq(s, circular=True)
          ->>> d
          -Dseq(o6)
          -ggatcc
          -cctagg
          ->>> d[3:3]
          -Dseq(-6)
          -tccgga
          -aggcct
          ->>>
          -
          -
          - -
          -
          -trunc = 30
          -
          - -
          -
          -classmethod quick(watson: str, crick: str, ovhg=0, circular=False, pos=0)[source]
          -
          - -
          -
          -classmethod from_string(dna: str, *args, circular=False, **kwargs)[source]
          -
          - -
          -
          -classmethod from_representation(dsdna: str, *args, **kwargs)[source]
          -
          - -
          -
          -classmethod from_full_sequence_and_overhangs(full_sequence: str, crick_ovhg: int, watson_ovhg: int)[source]
          -

          Create a linear Dseq object from a full sequence and the 3’ overhangs of each strand.

          -

          The order of the parameters is like this because the 3’ overhang of the crick strand is the one -on the left side of the sequence.

          -
          -
          Parameters:
          -
            -
          • full_sequence (str) – The full sequence of the Dseq object.

          • -
          • crick_ovhg (int) – The overhang of the crick strand in the 3’ end. Equivalent to Dseq.ovhg.

          • -
          • watson_ovhg (int) – The overhang of the watson strand in the 5’ end.

          • -
          -
          -
          Returns:
          -

          A Dseq object.

          -
          -
          Return type:
          -

          Dseq

          -
          -
          -

          Examples

          -
          >>> Dseq.from_full_sequence_and_overhangs('AAAAAA', crick_ovhg=2, watson_ovhg=2)
          -Dseq(-6)
          -  AAAA
          -TTTT
          ->>> Dseq.from_full_sequence_and_overhangs('AAAAAA', crick_ovhg=-2, watson_ovhg=2)
          -Dseq(-6)
          -AAAAAA
          -  TT
          ->>> Dseq.from_full_sequence_and_overhangs('AAAAAA', crick_ovhg=2, watson_ovhg=-2)
          -Dseq(-6)
          -  AA
          -TTTTTT
          ->>> Dseq.from_full_sequence_and_overhangs('AAAAAA', crick_ovhg=-2, watson_ovhg=-2)
          -Dseq(-6)
          -AAAA
          -  TTTT
          -
          -
          -
          - -
          -
          -mw() float[source]
          -

          This method returns the molecular weight of the DNA molecule -in g/mol. The following formula is used:

          -
          MW = (A x 313.2) + (T x 304.2) +
          -     (C x 289.2) + (G x 329.2) +
          -     (N x 308.9) + 79.0
          -
          -
          -
          - -
          -
          -upper() DseqType[source]
          -

          Return an upper case copy of the sequence.

          -
          >>> from pydna.dseq import Dseq
          ->>> my_seq = Dseq("aAa")
          ->>> my_seq
          -Dseq(-3)
          -aAa
          -tTt
          ->>> my_seq.upper()
          -Dseq(-3)
          -AAA
          -TTT
          -
          -
          -
          -
          Returns:
          -

          Dseq object in uppercase

          -
          -
          Return type:
          -

          Dseq

          -
          -
          -
          -

          See also

          -

          pydna.dseq.Dseq.lower

          -
          -
          - -
          -
          -lower() DseqType[source]
          -

          Return a lower case copy of the sequence.

          -
          >>> from pydna.dseq import Dseq
          ->>> my_seq = Dseq("aAa")
          ->>> my_seq
          -Dseq(-3)
          -aAa
          -tTt
          ->>> my_seq.lower()
          -Dseq(-3)
          -aaa
          -ttt
          -
          -
          -
          -
          Returns:
          -

          Dseq object in lowercase

          -
          -
          Return type:
          -

          Dseq

          -
          -
          -
          -

          See also

          -

          pydna.dseq.Dseq.upper

          -
          -
          - -
          -
          -find(sub: _SeqAbstractBaseClass | str | bytes, start=0, end=_sys.maxsize) int[source]
          -

          This method behaves like the python string method of the same name.

          -

          Returns an integer, the index of the first occurrence of substring -argument sub in the (sub)sequence given by [start:end].

          -

          Returns -1 if the subsequence is NOT found.

          -
          -
          Parameters:
          -
            -
          • sub (string or Seq object) – a string or another Seq object to look for.

          • -
          • start (int, optional) – slice start.

          • -
          • end (int, optional) – slice end.

          • -
          -
          -
          -

          Examples

          -
          >>> from pydna.dseq import Dseq
          ->>> seq = Dseq("atcgactgacgtgtt")
          ->>> seq
          -Dseq(-15)
          -atcgactgacgtgtt
          -tagctgactgcacaa
          ->>> seq.find("gac")
          -3
          ->>> seq = Dseq(watson="agt",crick="actta",ovhg=-2)
          ->>> seq
          -Dseq(-7)
          -agt
          -  attca
          ->>> seq.find("taa")
          -2
          -
          -
          -
          - -
          -
          -reverse_complement() Dseq[source]
          -

          Dseq object where watson and crick have switched places.

          -

          This represents the same double stranded sequence.

          -

          Examples

          -
          >>> from pydna.dseq import Dseq
          ->>> a=Dseq("catcgatc")
          ->>> a
          -Dseq(-8)
          -catcgatc
          -gtagctag
          ->>> b=a.reverse_complement()
          ->>> b
          -Dseq(-8)
          -gatcgatg
          -ctagctac
          ->>>
          -
          -
          -
          - -
          -
          -rc() Dseq
          -

          Dseq object where watson and crick have switched places.

          -

          This represents the same double stranded sequence.

          -

          Examples

          -
          >>> from pydna.dseq import Dseq
          ->>> a=Dseq("catcgatc")
          ->>> a
          -Dseq(-8)
          -catcgatc
          -gtagctag
          ->>> b=a.reverse_complement()
          ->>> b
          -Dseq(-8)
          -gatcgatg
          -ctagctac
          ->>>
          -
          -
          -
          - -
          -
          -shifted(shift: int) DseqType[source]
          -

          Shifted version of a circular Dseq object.

          -
          - -
          -
          -looped() DseqType[source]
          -

          Circularized Dseq object.

          -

          This can only be done if the two ends are compatible, -otherwise a TypeError is raised.

          -

          Examples

          -
          >>> from pydna.dseq import Dseq
          ->>> a=Dseq("catcgatc")
          ->>> a
          -Dseq(-8)
          -catcgatc
          -gtagctag
          ->>> a.looped()
          -Dseq(o8)
          -catcgatc
          -gtagctag
          ->>> a.T4("t")
          -Dseq(-8)
          -catcgat
          - tagctag
          ->>> a.T4("t").looped()
          -Dseq(o7)
          -catcgat
          -gtagcta
          ->>> a.T4("a")
          -Dseq(-8)
          -catcga
          -  agctag
          ->>> a.T4("a").looped()
          -Traceback (most recent call last):
          -  File "<stdin>", line 1, in <module>
          -  File "/usr/local/lib/python2.7/dist-packages/pydna/dsdna.py", line 357, in looped
          -    if type5 == type3 and str(sticky5) == str(rc(sticky3)):
          -TypeError: DNA cannot be circularized.
          -5' and 3' sticky ends not compatible!
          ->>>
          -
          -
          -
          - -
          -
          -tolinear() DseqType[source]
          -

          Returns a blunt, linear copy of a circular Dseq object. This can -only be done if the Dseq object is circular, otherwise a -TypeError is raised.

          -

          This method is deprecated, use slicing instead. See example below.

          -

          Examples

          -
          >>> from pydna.dseq import Dseq
          ->>> a=Dseq("catcgatc", circular=True)
          ->>> a
          -Dseq(o8)
          -catcgatc
          -gtagctag
          ->>> a[:]
          -Dseq(-8)
          -catcgatc
          -gtagctag
          ->>>
          -
          -
          -
          - -
          -
          -five_prime_end() Tuple[str, str][source]
          -

          Returns a tuple describing the structure of the 5’ end of -the DNA fragment

          -

          Examples

          -
          >>> from pydna.dseq import Dseq
          ->>> a=Dseq("aaa", "ttt")
          ->>> a
          -Dseq(-3)
          -aaa
          -ttt
          ->>> a.five_prime_end()
          -('blunt', '')
          ->>> a=Dseq("aaa", "ttt", ovhg=1)
          ->>> a
          -Dseq(-4)
          - aaa
          -ttt
          ->>> a.five_prime_end()
          -("3'", 't')
          ->>> a=Dseq("aaa", "ttt", ovhg=-1)
          ->>> a
          -Dseq(-4)
          -aaa
          - ttt
          ->>> a.five_prime_end()
          -("5'", 'a')
          ->>>
          -
          -
          - -
          - -
          -
          -three_prime_end() Tuple[str, str][source]
          -

          Returns a tuple describing the structure of the 5’ end of -the DNA fragment

          -
          >>> from pydna.dseq import Dseq
          ->>> a=Dseq("aaa", "ttt")
          ->>> a
          -Dseq(-3)
          -aaa
          -ttt
          ->>> a.three_prime_end()
          -('blunt', '')
          ->>> a=Dseq("aaa", "ttt", ovhg=1)
          ->>> a
          -Dseq(-4)
          - aaa
          -ttt
          ->>> a.three_prime_end()
          -("3'", 'a')
          ->>> a=Dseq("aaa", "ttt", ovhg=-1)
          ->>> a
          -Dseq(-4)
          -aaa
          - ttt
          ->>> a.three_prime_end()
          -("5'", 't')
          ->>>
          -
          -
          - -
          - -
          -
          -watson_ovhg() int[source]
          -

          Returns the overhang of the watson strand at the three prime.

          -
          - -
          -
          -fill_in(nucleotides: None | str = None) Dseq[source]
          -

          Fill in of five prime protruding end with a DNA polymerase -that has only DNA polymerase activity (such as exo-klenow [1]) -and any combination of A, G, C or T. Default are all four -nucleotides together.

          -
          -
          Parameters:
          -

          nucleotides (str)

          -
          -
          -

          Examples

          -
          >>> from pydna.dseq import Dseq
          ->>> a=Dseq("aaa", "ttt")
          ->>> a
          -Dseq(-3)
          -aaa
          -ttt
          ->>> a.fill_in()
          -Dseq(-3)
          -aaa
          -ttt
          ->>> b=Dseq("caaa", "cttt")
          ->>> b
          -Dseq(-5)
          -caaa
          - tttc
          ->>> b.fill_in()
          -Dseq(-5)
          -caaag
          -gtttc
          ->>> b.fill_in("g")
          -Dseq(-5)
          -caaag
          -gtttc
          ->>> b.fill_in("tac")
          -Dseq(-5)
          -caaa
          - tttc
          ->>> c=Dseq("aaac", "tttg")
          ->>> c
          -Dseq(-5)
          - aaac
          -gttt
          ->>> c.fill_in()
          -Dseq(-5)
          - aaac
          -gttt
          ->>>
          -
          -
          -

          References

          - -
          - -
          -
          -transcribe() Seq[source]
          -

          Transcribe a DNA sequence into RNA and return the RNA sequence as a new Seq object.

          -

          Following the usual convention, the sequence is interpreted as the -coding strand of the DNA double helix, not the template strand. This -means we can get the RNA sequence just by switching T to U.

          -
          >>> from Bio.Seq import Seq
          ->>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
          ->>> coding_dna
          -Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
          ->>> coding_dna.transcribe()
          -Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
          -
          -
          -

          The sequence is modified in-place and returned if inplace is True:

          -
          >>> sequence = MutableSeq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
          ->>> sequence
          -MutableSeq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
          ->>> sequence.transcribe()
          -MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
          ->>> sequence
          -MutableSeq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
          -
          -
          -
          >>> sequence.transcribe(inplace=True)
          -MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
          ->>> sequence
          -MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
          -
          -
          -

          As Seq objects are immutable, a TypeError is raised if -transcribe is called on a Seq object with inplace=True.

          -

          Trying to transcribe an RNA sequence has no effect. -If you have a nucleotide sequence which might be DNA or RNA -(or even a mixture), calling the transcribe method will ensure -any T becomes U.

          -

          Trying to transcribe a protein sequence will replace any -T for Threonine with U for Selenocysteine, which has no -biologically plausible rational.

          -
          >>> from Bio.Seq import Seq
          ->>> my_protein = Seq("MAIVMGRT")
          ->>> my_protein.transcribe()
          -Seq('MAIVMGRU')
          -
          -
          -
          - -
          -
          -translate(table='Standard', stop_symbol='*', to_stop=False, cds=False, gap='-') Seq[source]
          -

          Translate..

          -
          - -
          -
          -mung() Dseq[source]
          -

          Simulates treatment a nuclease with 5’-3’ and 3’-5’ single -strand specific exonuclease activity (such as mung bean nuclease [2])

          -
              ggatcc    ->     gatcc
          -     ctaggg          ctagg
          -
          -     ggatcc   ->      ggatc
          -    tcctag            cctag
          -
          ->>> from pydna.dseq import Dseq
          ->>> b=Dseq("caaa", "cttt")
          ->>> b
          -Dseq(-5)
          -caaa
          - tttc
          ->>> b.mung()
          -Dseq(-3)
          -aaa
          -ttt
          ->>> c=Dseq("aaac", "tttg")
          ->>> c
          -Dseq(-5)
          - aaac
          -gttt
          ->>> c.mung()
          -Dseq(-3)
          -aaa
          -ttt
          -
          -
          -

          References

          - -
          - -
          -
          -T4(nucleotides=None) Dseq[source]
          -

          Fill in five prime protruding ends and chewing back -three prime protruding ends by a DNA polymerase providing both -5’-3’ DNA polymerase activity and 3’-5’ nuclease acitivty -(such as T4 DNA polymerase). This can be done in presence of any -combination of the four A, G, C or T. Removing one or more nucleotides -can facilitate engineering of sticky ends. Default are all four nucleotides together.

          -
          -
          Parameters:
          -

          nucleotides (str)

          -
          -
          -

          Examples

          -
          >>> from pydna.dseq import Dseq
          ->>> a=Dseq("gatcgatc")
          ->>> a
          -Dseq(-8)
          -gatcgatc
          -ctagctag
          ->>> a.T4()
          -Dseq(-8)
          -gatcgatc
          -ctagctag
          ->>> a.T4("t")
          -Dseq(-8)
          -gatcgat
          - tagctag
          ->>> a.T4("a")
          -Dseq(-8)
          -gatcga
          -  agctag
          ->>> a.T4("g")
          -Dseq(-8)
          -gatcg
          -   gctag
          ->>>
          -
          -
          -
          - -
          -
          -t4(nucleotides=None) Dseq
          -

          Fill in five prime protruding ends and chewing back -three prime protruding ends by a DNA polymerase providing both -5’-3’ DNA polymerase activity and 3’-5’ nuclease acitivty -(such as T4 DNA polymerase). This can be done in presence of any -combination of the four A, G, C or T. Removing one or more nucleotides -can facilitate engineering of sticky ends. Default are all four nucleotides together.

          -
          -
          Parameters:
          -

          nucleotides (str)

          -
          -
          -

          Examples

          -
          >>> from pydna.dseq import Dseq
          ->>> a=Dseq("gatcgatc")
          ->>> a
          -Dseq(-8)
          -gatcgatc
          -ctagctag
          ->>> a.T4()
          -Dseq(-8)
          -gatcgatc
          -ctagctag
          ->>> a.T4("t")
          -Dseq(-8)
          -gatcgat
          - tagctag
          ->>> a.T4("a")
          -Dseq(-8)
          -gatcga
          -  agctag
          ->>> a.T4("g")
          -Dseq(-8)
          -gatcg
          -   gctag
          ->>>
          -
          -
          -
          - -
          -
          -exo1_front(n=1) DseqType[source]
          -

          5’-3’ resection at the start (left side) of the molecule.

          -
          - -
          -
          -exo1_end(n=1) DseqType[source]
          -

          5’-3’ resection at the end (right side) of the molecule.

          -
          - -
          -
          -no_cutters(batch: RestrictionBatch | None = None) RestrictionBatch[source]
          -

          Enzymes in a RestrictionBatch not cutting sequence.

          -
          - -
          -
          -unique_cutters(batch: RestrictionBatch | None = None) RestrictionBatch[source]
          -

          Enzymes in a RestrictionBatch cutting sequence once.

          -
          - -
          -
          -once_cutters(batch: RestrictionBatch | None = None) RestrictionBatch
          -

          Enzymes in a RestrictionBatch cutting sequence once.

          -
          - -
          -
          -twice_cutters(batch: RestrictionBatch | None = None) RestrictionBatch[source]
          -

          Enzymes in a RestrictionBatch cutting sequence twice.

          -
          - -
          -
          -n_cutters(n=3, batch: RestrictionBatch | None = None) RestrictionBatch[source]
          -

          Enzymes in a RestrictionBatch cutting n times.

          -
          - -
          -
          -cutters(batch: RestrictionBatch | None = None) RestrictionBatch[source]
          -

          Enzymes in a RestrictionBatch cutting sequence at least once.

          -
          - -
          -
          -seguid() str[source]
          -

          SEGUID checksum for the sequence.

          -
          - -
          -
          -isblunt() bool[source]
          -

          isblunt.

          -

          Return True if Dseq is linear and blunt and -false if staggered or circular.

          -

          Examples

          -
          >>> from pydna.dseq import Dseq
          ->>> a=Dseq("gat")
          ->>> a
          -Dseq(-3)
          -gat
          -cta
          ->>> a.isblunt()
          -True
          ->>> a=Dseq("gat", "atcg")
          ->>> a
          -Dseq(-4)
          - gat
          -gcta
          ->>> a.isblunt()
          -False
          ->>> a=Dseq("gat", "gatc")
          ->>> a
          -Dseq(-4)
          -gat
          -ctag
          ->>> a.isblunt()
          -False
          ->>> a=Dseq("gat", circular=True)
          ->>> a
          -Dseq(o3)
          -gat
          -cta
          ->>> a.isblunt()
          -False
          -
          -
          -
          - -
          -
          -cas9(RNA: str) Tuple[slice, ...][source]
          -

          docstring.

          -
          - -
          -
          -terminal_transferase(nucleotides='a') Dseq[source]
          -

          docstring.

          -
          - -
          -
          -cut(*enzymes: EnzymesType) Tuple[DseqType, ...][source]
          -

          Returns a list of linear Dseq fragments produced in the digestion. -If there are no cuts, an empty list is returned.

          -
          -
          Parameters:
          -

          enzymes (enzyme object or iterable of such objects) – A Bio.Restriction.XXX restriction objects or iterable.

          -
          -
          Returns:
          -

          frags – list of Dseq objects formed by the digestion

          -
          -
          Return type:
          -

          list

          -
          -
          -

          Examples

          -
          >>> from pydna.dseq import Dseq
          ->>> seq=Dseq("ggatccnnngaattc")
          ->>> seq
          -Dseq(-15)
          -ggatccnnngaattc
          -cctaggnnncttaag
          ->>> from Bio.Restriction import BamHI,EcoRI
          ->>> type(seq.cut(BamHI))
          -<class 'tuple'>
          ->>> for frag in seq.cut(BamHI): print(repr(frag))
          -Dseq(-5)
          -g
          -cctag
          -Dseq(-14)
          -gatccnnngaattc
          -    gnnncttaag
          ->>> seq.cut(EcoRI, BamHI) ==  seq.cut(BamHI, EcoRI)
          -True
          ->>> a,b,c = seq.cut(EcoRI, BamHI)
          ->>> a+b+c
          -Dseq(-15)
          -ggatccnnngaattc
          -cctaggnnncttaag
          ->>>
          -
          -
          -
          - -
          -
          -cutsite_is_valid(cutsite: Tuple[Tuple[int, int], _AbstractCut | None]) bool[source]
          -

          Returns False if: -- Cut positions fall outside the sequence (could be moved to Biopython) -- Overhang is not double stranded -- Recognition site is not double stranded or is outside the sequence -- For enzymes that cut twice, it checks that at least one possibility is valid

          -
          - -
          -
          -get_cutsites(*enzymes: EnzymesType) List[Tuple[Tuple[int, int], _AbstractCut | None]][source]
          -

          Returns a list of cutsites, represented represented as ((cut_watson, ovhg), enz):

          -
            -
          • cut_watson is a positive integer contained in [0,len(seq)), where seq is the sequence -that will be cut. It represents the position of the cut on the watson strand, using the full -sequence as a reference. By “full sequence” I mean the one you would get from str(Dseq).

          • -
          • ovhg is the overhang left after the cut. It has the same meaning as ovhg in -the Bio.Restriction enzyme objects, or pydna’s Dseq property.

          • -
          • -
            enz is the enzyme object. It’s not necessary to perform the cut, but can be

            used to keep track of which enzyme was used.

            -
            -
            -
          • -
          -

          Cuts are only returned if the recognition site and overhang are on the double-strand -part of the sequence.

          -
          -
          Parameters:
          -

          enzymes (Union[_RestrictionBatch,list[_AbstractCut]])

          -
          -
          Return type:
          -

          list[tuple[tuple[int,int], _AbstractCut]]

          -
          -
          -

          Examples

          -
          >>> from Bio.Restriction import EcoRI
          ->>> from pydna.dseq import Dseq
          ->>> seq = Dseq('AAGAATTCAAGAATTC')
          ->>> seq.get_cutsites(EcoRI)
          -[((3, -4), EcoRI), ((11, -4), EcoRI)]
          -
          -
          -

          cut_watson is defined with respect to the “full sequence”, not the -watson strand:

          -
          >>> dseq = Dseq.from_full_sequence_and_overhangs('aaGAATTCaa', 1, 0)
          ->>> dseq
          -Dseq(-10)
          - aGAATTCaa
          -ttCTTAAGtt
          ->>> dseq.get_cutsites([EcoRI])
          -[((3, -4), EcoRI)]
          -
          -
          -

          Cuts are only returned if the recognition site and overhang are on the double-strand -part of the sequence.

          -
          >>> Dseq('GAATTC').get_cutsites([EcoRI])
          -[((1, -4), EcoRI)]
          ->>> Dseq.from_full_sequence_and_overhangs('GAATTC', -1, 0).get_cutsites([EcoRI])
          -[]
          -
          -
          -
          - -
          -
          -left_end_position() Tuple[int, int][source]
          -

          The index in the full sequence of the watson and crick start positions.

          -

          full sequence (str(self)) for all three cases is AAA

          -
          AAA              AA               AAT
          - TT             TTT               TTT
          -Returns (0, 1)  Returns (1, 0)    Returns (0, 0)
          -
          -
          -
          - -
          -
          -right_end_position() Tuple[int, int][source]
          -

          The index in the full sequence of the watson and crick end positions.

          -

          full sequence (str(self)) for all three cases is AAA

          -

          ` -AAA               AA                   AAA -TT                TTT                  TTT -Returns (3, 2)    Returns (2, 3)       Returns (3, 3) -`

          -
          - -
          -
          -get_cut_parameters(cut: Tuple[Tuple[int, int], _AbstractCut | None] | None, is_left: bool) Tuple[int, int, int][source]
          -

          For a given cut expressed as ((cut_watson, ovhg), enz), returns -a tuple (cut_watson, cut_crick, ovhg).

          +
          +

          Pydna

          +
          +

          Welcome to pydna’s documentation!

          +

          Pydna is a python package that provides a human-readable formal descriptions of 🧬 cloning and genetic assembly strategies in Python 🐍 for simulation and verification. +Pydna can be used as executable documentation for cloning.

          +

          Designing genetic constructs with many components and steps, like recombinant metabolic pathways 🧫, often makes accurate documentation difficult, as seen in the poor state of scientific literature ☢️

          +

          A cloning strategy expressed in pydna is complete, unambiguous and stable.

          +

          Pydna provides simulation of:

            -
          • cut_watson: see get_cutsites docs

          • -
          • cut_crick: equivalent of cut_watson in the crick strand

          • -
          • ovhg: see get_cutsites docs

          • -
          -

          The cut can be None if it represents the left or right end of the sequence. -Then it will return the position of the watson and crick ends with respect -to the “full sequence”. The is_left parameter is only used in this case.

          -
          - -
          -
          -apply_cut(left_cut: Tuple[Tuple[int, int], _AbstractCut | None], right_cut: Tuple[Tuple[int, int], _AbstractCut | None]) Dseq[source]
          -

          Extracts a subfragment of the sequence between two cuts.

          -

          For more detail see the documentation of get_cutsite_pairs.

          -
          -
          Parameters:
          -
          -
          -
          Return type:
          -

          Dseq

          -
          -
          -

          Examples

          -
          >>> from Bio.Restriction import EcoRI
          ->>> from pydna.dseq import Dseq
          ->>> dseq = Dseq('aaGAATTCaaGAATTCaa')
          ->>> cutsites = dseq.get_cutsites([EcoRI])
          ->>> cutsites
          -[((3, -4), EcoRI), ((11, -4), EcoRI)]
          ->>> p1, p2, p3 = dseq.get_cutsite_pairs(cutsites)
          ->>> p1
          -(None, ((3, -4), EcoRI))
          ->>> dseq.apply_cut(*p1)
          -Dseq(-7)
          -aaG
          -ttCTTAA
          ->>> p2
          -(((3, -4), EcoRI), ((11, -4), EcoRI))
          ->>> dseq.apply_cut(*p2)
          -Dseq(-12)
          -AATTCaaG
          -    GttCTTAA
          ->>> p3
          -(((11, -4), EcoRI), None)
          ->>> dseq.apply_cut(*p3)
          -Dseq(-7)
          -AATTCaa
          -    Gtt
          -
          -
          -
          >>> dseq = Dseq('TTCaaGAA', circular=True)
          ->>> cutsites = dseq.get_cutsites([EcoRI])
          ->>> cutsites
          -[((6, -4), EcoRI)]
          ->>> pair = dseq.get_cutsite_pairs(cutsites)[0]
          ->>> pair
          -(((6, -4), EcoRI), ((6, -4), EcoRI))
          ->>> dseq.apply_cut(*pair)
          -Dseq(-12)
          -AATTCaaG
          -    GttCTTAA
          -
          -
          -
          - -
          -
          -get_cutsite_pairs(cutsites: List[Tuple[Tuple[int, int], _AbstractCut | None]]) List[Tuple[None | Tuple[Tuple[int, int], _AbstractCut | None], None | Tuple[Tuple[int, int], _AbstractCut | None]]][source]
          -

          Returns pairs of cutsites that render the edges of the resulting fragments.

          -

          A fragment produced by restriction is represented by a tuple of length 2 that -may contain cutsites or None:

          -
          -
            -
          • Two cutsites: represents the extraction of a fragment between those two -cutsites, in that orientation. To represent the opening of a circular -molecule with a single cutsite, we put the same cutsite twice.

          • -
          • None, cutsite: represents the extraction of a fragment between the left -edge of linear sequence and the cutsite.

          • -
          • cutsite, None: represents the extraction of a fragment between the cutsite -and the right edge of a linear sequence.

          • -
          -
          -
          -
          Parameters:
          -

          cutsites (list[tuple[tuple[int,int], _AbstractCut]])

          -
          -
          Return type:
          -

          list[tuple[tuple[tuple[int,int], _AbstractCut]|None],tuple[tuple[int,int], _AbstractCut]|None]

          -
          -
          -

          Examples

          -
          >>> from Bio.Restriction import EcoRI
          ->>> from pydna.dseq import Dseq
          ->>> dseq = Dseq('aaGAATTCaaGAATTCaa')
          ->>> cutsites = dseq.get_cutsites([EcoRI])
          ->>> cutsites
          -[((3, -4), EcoRI), ((11, -4), EcoRI)]
          ->>> dseq.get_cutsite_pairs(cutsites)
          -[(None, ((3, -4), EcoRI)), (((3, -4), EcoRI), ((11, -4), EcoRI)), (((11, -4), EcoRI), None)]
          -
          -
          -
          >>> dseq = Dseq('TTCaaGAA', circular=True)
          ->>> cutsites = dseq.get_cutsites([EcoRI])
          ->>> cutsites
          -[((6, -4), EcoRI)]
          ->>> dseq.get_cutsite_pairs(cutsites)
          -[(((6, -4), EcoRI), ((6, -4), EcoRI))]
          -
          -
          -
          - -
          - -
          -
          -

          pydna.dseqrecord module

          -

          This module provides the Dseqrecord class, for handling double stranded -DNA sequences. The Dseqrecord holds sequence information in the form of a pydna.dseq.Dseq -object. The Dseq and Dseqrecord classes are subclasses of Biopythons -Seq and SeqRecord classes, respectively.

          -

          The Dseq and Dseqrecord classes support the notion of circular and linear DNA topology.

          -
          -
          -class pydna.dseqrecord.Dseqrecord(record, *args, circular=None, n=5e-14, **kwargs)[source]
          -

          Bases: SeqRecord

          -

          Dseqrecord is a double stranded version of the Biopython SeqRecord [3] class. -The Dseqrecord object holds a Dseq object describing the sequence. -Additionally, Dseqrecord hold meta information about the sequence in the -from of a list of SeqFeatures, in the same way as the SeqRecord does.

          -

          The Dseqrecord can be initialized with a string, Seq, Dseq, SeqRecord -or another Dseqrecord. The sequence information will be stored in a -Dseq object in all cases.

          -

          Dseqrecord objects can be read or parsed from sequences in FASTA, EMBL or Genbank formats. -See the pydna.readers and pydna.parsers modules for further information.

          -

          There is a short representation associated with the Dseqrecord. -Dseqrecord(-3) represents a linear sequence of length 2 -while Dseqrecord(o7) -represents a circular sequence of length 7.

          -

          Dseqrecord and Dseq share the same concept of length. This length can be larger -than each strand alone if they are staggered as in the example below.

          -
          <-- length -->
          -GATCCTTT
          -     AAAGCCTAG
          -
          -
          -
          -
          Parameters:
          -
            -
          • record (string, Seq, SeqRecord, Dseq or other Dseqrecord object) – This data will be used to form the seq property

          • -
          • circular (bool, optional) – True or False reflecting the shape of the DNA molecule

          • -
          • linear (bool, optional) – True or False reflecting the shape of the DNA molecule

          • -
          -
          -
          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("aaa")
          ->>> a
          -Dseqrecord(-3)
          ->>> a.seq
          -Dseq(-3)
          -aaa
          -ttt
          ->>> from pydna.seq import Seq
          ->>> b=Dseqrecord(Seq("aaa"))
          ->>> b
          -Dseqrecord(-3)
          ->>> b.seq
          -Dseq(-3)
          -aaa
          -ttt
          ->>> from Bio.SeqRecord import SeqRecord
          ->>> c=Dseqrecord(SeqRecord(Seq("aaa")))
          ->>> c
          -Dseqrecord(-3)
          ->>> c.seq
          -Dseq(-3)
          -aaa
          -ttt
          -
          -
          -

          References

          - -
          -
          -classmethod from_string(record: str = '', *args, circular=False, n=5e-14, **kwargs)[source]
          -

          docstring.

          -
          - -
          -
          -classmethod from_SeqRecord(record: SeqRecord, *args, circular=None, n=5e-14, **kwargs)[source]
          -
          - -
          -
          -property circular
          -

          The circular property can not be set directly. -Use looped()

          -
          - -
          -
          -m()[source]
          -

          This method returns the mass of the DNA molecule in grams. This is -calculated as the product between the molecular weight of the Dseq object -and the

          -
          - -
          -
          -extract_feature(n)[source]
          -

          Extracts a feature and creates a new Dseqrecord object.

          -
          -
          Parameters:
          -

          n (int) – Indicates the feature to extract

          -
          -
          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("atgtaa")
          ->>> a.add_feature(2,4)
          ->>> b=a.extract_feature(0)
          ->>> b
          -Dseqrecord(-2)
          ->>> b.seq
          -Dseq(-2)
          -gt
          -ca
          -
          -
          -
          - -
          -
          -add_feature(x=None, y=None, seq=None, type_='misc', strand=1, *args, **kwargs)[source]
          -

          Add a feature of type misc to the feature list of the sequence.

          -
          -
          Parameters:
          -
            -
          • x (int) – Indicates start of the feature

          • -
          • y (int) – Indicates end of the feature

          • -
          -
          -
          -

          Examples

          -
          >>> from pydna.seqrecord import SeqRecord
          ->>> a=SeqRecord("atgtaa")
          ->>> a.features
          -[]
          ->>> a.add_feature(2,4)
          ->>> a.features
          -[SeqFeature(SimpleLocation(ExactPosition(2), ExactPosition(4), strand=1), type='misc', qualifiers=...)]
          -
          -
          -
          - -
          -
          -seguid()[source]
          -

          Url safe SEGUID for the sequence.

          -

          This checksum is the same as seguid but with base64.urlsafe -encoding instead of the normal base64. This means that -the characters + and / are replaced with - and _ so that -the checksum can be part of a URL.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a = Dseqrecord("aa")
          ->>> a.seguid()
          -'ldseguid=TEwydy0ugvGXh3VJnVwgtxoyDQA'
          -
          -
          -
          - -
          -
          -looped()[source]
          -

          Circular version of the Dseqrecord object.

          -

          The underlying linear Dseq object has to have compatible ends.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("aaa")
          ->>> a
          -Dseqrecord(-3)
          ->>> b=a.looped()
          ->>> b
          -Dseqrecord(o3)
          ->>>
          -
          -
          - -
          - -
          -
          -tolinear()[source]
          -

          Returns a linear, blunt copy of a circular Dseqrecord object. The -underlying Dseq object has to be circular.

          -

          This method is deprecated, use slicing instead. See example below.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("aaa", circular = True)
          ->>> a
          -Dseqrecord(o3)
          ->>> b=a[:]
          ->>> b
          -Dseqrecord(-3)
          ->>>
          -
          -
          -
          - -
          -
          -terminal_transferase(nucleotides='a')[source]
          -

          docstring.

          -
          - -
          -
          -format(f='gb')[source]
          -

          Returns the sequence as a string using a format supported by Biopython -SeqIO [4]. Default is “gb” which is short for Genbank.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> x=Dseqrecord("aaa")
          ->>> x.annotations['date'] = '02-FEB-2013'
          ->>> x
          -Dseqrecord(-3)
          ->>> print(x.format("gb"))
          -LOCUS       name                       3 bp    DNA     linear   UNK 02-FEB-2013
          -DEFINITION  description.
          -ACCESSION   id
          -VERSION     id
          -KEYWORDS    .
          -SOURCE      .
          -  ORGANISM  .
          -            .
          -FEATURES             Location/Qualifiers
          -ORIGIN
          -        1 aaa
          -//
          -
          -
          -

          References

          - -
          - -
          -
          -write(filename=None, f='gb')[source]
          -

          Writes the Dseqrecord to a file using the format f, which must -be a format supported by Biopython SeqIO for writing [5]. Default -is “gb” which is short for Genbank. Note that Biopython SeqIO reads -more formats than it writes.

          -

          Filename is the path to the file where the sequece is to be -written. The filename is optional, if it is not given, the -description property (string) is used together with the format.

          -

          If obj is the Dseqrecord object, the default file name will be:

          -

          <obj.locus>.<f>

          -

          Where <f> is “gb” by default. If the filename already exists and -AND the sequence it contains is different, a new file name will be -used so that the old file is not lost:

          -

          <obj.locus>_NEW.<f>

          -

          References

          - -
          - -
          -
          -find(other)[source]
          -
          - -
          -
          -find_aminoacids(other)[source]
          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> s=Dseqrecord("atgtacgatcgtatgctggttatattttag")
          ->>> s.seq.translate()
          -Seq('MYDRMLVIF*')
          ->>> "RML" in s
          -True
          ->>> "MMM" in s
          -False
          ->>> s.seq.rc().translate()
          -Seq('LKYNQHTIVH')
          ->>> "QHT" in s.rc()
          -True
          ->>> "QHT" in s
          -False
          ->>> slc = s.find_aa("RML")
          ->>> slc
          -slice(9, 18, None)
          ->>> s[slc]
          -Dseqrecord(-9)
          ->>> code = s[slc].seq
          ->>> code
          -Dseq(-9)
          -cgtatgctg
          -gcatacgac
          ->>> code.translate()
          -Seq('RML')
          -
          -
          -
          - -
          -
          -find_aa(other)
          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> s=Dseqrecord("atgtacgatcgtatgctggttatattttag")
          ->>> s.seq.translate()
          -Seq('MYDRMLVIF*')
          ->>> "RML" in s
          -True
          ->>> "MMM" in s
          -False
          ->>> s.seq.rc().translate()
          -Seq('LKYNQHTIVH')
          ->>> "QHT" in s.rc()
          -True
          ->>> "QHT" in s
          -False
          ->>> slc = s.find_aa("RML")
          ->>> slc
          -slice(9, 18, None)
          ->>> s[slc]
          -Dseqrecord(-9)
          ->>> code = s[slc].seq
          ->>> code
          -Dseq(-9)
          -cgtatgctg
          -gcatacgac
          ->>> code.translate()
          -Seq('RML')
          -
          -
          -
          - -
          -
          -map_trace_files(pth, limit=25)[source]
          -
          - -
          -
          -linearize(*enzymes)[source]
          -

          Similar to :func:cut.

          -

          Throws an exception if there is not excactly one cut -i.e. none or more than one digestion products.

          -
          - -
          -
          -no_cutters(batch: RestrictionBatch | None = None)[source]
          -

          docstring.

          -
          - -
          -
          -unique_cutters(batch: RestrictionBatch | None = None)[source]
          -

          docstring.

          -
          - -
          -
          -once_cutters(batch: RestrictionBatch | None = None)[source]
          -

          docstring.

          -
          - -
          -
          -twice_cutters(batch: RestrictionBatch | None = None)[source]
          -

          docstring.

          -
          - -
          -
          -n_cutters(n=3, batch: RestrictionBatch | None = None)[source]
          -

          docstring.

          -
          - -
          -
          -cutters(batch: RestrictionBatch | None = None)[source]
          -

          docstring.

          -
          - -
          -
          -number_of_cuts(*enzymes)[source]
          -

          The number of cuts by digestion with the Restriction enzymes -contained in the iterable.

          -
          - -
          -
          -cas9(RNA: str)[source]
          -

          docstring.

          -
          - -
          -
          -reverse_complement()[source]
          -

          Reverse complement.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("ggaatt")
          ->>> a
          -Dseqrecord(-6)
          ->>> a.seq
          -Dseq(-6)
          -ggaatt
          -ccttaa
          ->>> a.reverse_complement().seq
          -Dseq(-6)
          -aattcc
          -ttaagg
          ->>>
          -
          -
          - -
          - -
          -
          -rc()
          -

          Reverse complement.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("ggaatt")
          ->>> a
          -Dseqrecord(-6)
          ->>> a.seq
          -Dseq(-6)
          -ggaatt
          -ccttaa
          ->>> a.reverse_complement().seq
          -Dseq(-6)
          -aattcc
          -ttaagg
          ->>>
          -
          -
          - -
          - -
          -
          -synced(ref, limit=25)[source]
          -

          This method returns a new circular sequence (Dseqrecord object), which has been rotated -in such a way that there is maximum overlap between the sequence and -ref, which may be a string, Biopython Seq, SeqRecord object or -another Dseqrecord object.

          -

          The reason for using this could be to rotate a new recombinant plasmid so -that it starts at the same position after cloning. See the example below:

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("gaat", circular=True)
          ->>> a.seq
          -Dseq(o4)
          -gaat
          -ctta
          ->>> d = a[2:] + a[:2]
          ->>> d.seq
          -Dseq(-4)
          -atga
          -tact
          ->>> insert=Dseqrecord("CCC")
          ->>> recombinant = (d+insert).looped()
          ->>> recombinant.seq
          -Dseq(o7)
          -atgaCCC
          -tactGGG
          ->>> recombinant.synced(a).seq
          -Dseq(o7)
          -gaCCCat
          -ctGGGta
          -
          -
          -
          - -
          -
          -upper()[source]
          -

          Returns an uppercase copy. ->>> from pydna.dseqrecord import Dseqrecord ->>> my_seq = Dseqrecord(“aAa”) ->>> my_seq.seq -Dseq(-3) -aAa -tTt ->>> upper = my_seq.upper() ->>> upper.seq -Dseq(-3) -AAA -TTT ->>>

          -
          -
          Returns:
          -

          Dseqrecord object in uppercase

          -
          -
          Return type:
          -

          Dseqrecord

          -
          -
          - -
          - -
          -
          -lower()[source]
          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> my_seq = Dseqrecord("aAa")
          ->>> my_seq.seq
          -Dseq(-3)
          -aAa
          -tTt
          ->>> upper = my_seq.upper()
          ->>> upper.seq
          -Dseq(-3)
          -AAA
          -TTT
          ->>> lower = my_seq.lower()
          ->>> lower
          -Dseqrecord(-3)
          ->>>
          -
          -
          -
          -
          Returns:
          -

          Dseqrecord object in lowercase

          -
          -
          Return type:
          -

          Dseqrecord

          -
          -
          - -
          - -
          -
          -orfs(minsize=300)[source]
          -

          docstring.

          -
          - -
          -
          -orfs_to_features(minsize=300)[source]
          -

          docstring.

          -
          - -
          -
          -copy_gb_to_clipboard()[source]
          -

          docstring.

          -
          - -
          -
          -copy_fasta_to_clipboard()[source]
          -

          docstring.

          -
          - -
          -
          -figure(feature=0, highlight='\x1b[48;5;11m', plain='\x1b[0m')[source]
          -

          docstring.

          -
          - -
          -
          -shifted(shift)[source]
          -

          Circular Dseqrecord with a new origin <shift>.

          -

          This only works on circular Dseqrecords. If we consider the following -circular sequence:

          -
          -
          GAAAT   <-- watson strand
          -
          CTTTA   <-- crick strand
          -
          -

          The T and the G on the watson strand are linked together as well -as the A and the C of the of the crick strand.

          -

          if shift is 1, this indicates a new origin at position 1:

          -
          -
          -
          new origin at the | symbol:
          -

          -
          -
          G|AAAT
          -
          C|TTTA
          -
          -

          new sequence:

          -
          -
          AAATG
          -
          TTTAC
          -
          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("aaat",circular=True)
          ->>> a
          -Dseqrecord(o4)
          ->>> a.seq
          -Dseq(o4)
          -aaat
          -ttta
          ->>> b=a.shifted(1)
          ->>> b
          -Dseqrecord(o4)
          ->>> b.seq
          -Dseq(o4)
          -aata
          -ttat
          -
          -
          -
          - -
          -
          -cut(*enzymes)[source]
          -

          Digest a Dseqrecord object with one or more restriction enzymes.

          -

          returns a list of linear Dseqrecords. If there are no cuts, an empty -list is returned.

          -

          See also Dseq.cut() -:param enzymes: A Bio.Restriction.XXX restriction object or iterable of such. -:type enzymes: enzyme object or iterable of such objects

          -
          -
          Returns:
          -

          Dseqrecord_frags – list of Dseqrecord objects formed by the digestion

          -
          -
          Return type:
          -

          list

          -
          -
          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("ggatcc")
          ->>> from Bio.Restriction import BamHI
          ->>> a.cut(BamHI)
          -(Dseqrecord(-5), Dseqrecord(-5))
          ->>> frag1, frag2 = a.cut(BamHI)
          ->>> frag1.seq
          -Dseq(-5)
          -g
          -cctag
          ->>> frag2.seq
          -Dseq(-5)
          -gatcc
          -    g
          -
          -
          -
          - -
          -
          -apply_cut(left_cut, right_cut)[source]
          -
          - -
          - -
          -
          -

          pydna.amplicon module

          -

          This module provides the Amplicon class for PCR simulation. -This class is not meant to be use directly but is -used by the amplify module

          -
          -
          -class pydna.amplicon.Amplicon(record, *args, template=None, forward_primer=None, reverse_primer=None, **kwargs)[source]
          -

          Bases: Dseqrecord

          -

          The Amplicon class holds information about a PCR reaction involving two -primers and one template. This class is used by the Anneal class and is not -meant to be instantiated directly.

          -
          -
          Parameters:
          -
            -
          • forward_primer (SeqRecord(Biopython)) – SeqRecord object holding the forward (sense) primer

          • -
          • reverse_primer (SeqRecord(Biopython)) – SeqRecord object holding the reverse (antisense) primer

          • -
          • template (Dseqrecord) – Dseqrecord object holding the template (circular or linear)

          • +
          • Primer design

          • +
          • PCR

          • +
          • Restriction digestion

          • +
          • Ligation

          • +
          • Gel electrophoresis of DNA with generation of gel images

          • +
          • Homologous recombination

          • +
          • Gibson assembly

          • +
          • Golden gate assembly (in progress)

          -
          -
          -
          -
          -classmethod from_SeqRecord(record, *args, path=None, **kwargs)[source]
          -
          - -
          -
          -reverse_complement()[source]
          -

          Reverse complement.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("ggaatt")
          ->>> a
          -Dseqrecord(-6)
          ->>> a.seq
          -Dseq(-6)
          -ggaatt
          -ccttaa
          ->>> a.reverse_complement().seq
          -Dseq(-6)
          -aattcc
          -ttaagg
          ->>>
          -
          -
          -
          -

          See also

          -

          pydna.dseq.Dseq.reverse_complement

          +

          Virtually any sub-cloning experiment can be described in pydna, and its execution yield the sequences of intermediate and final DNA molecules.

          +

          Pydna has been designed with the goal of being understandable for biologists with only some basic understanding of Python.

          +

          Pydna can formalize planning and sharing of cloning strategies and is especially useful for complex or combinatorial +DNA molecule constructions.

          +
          -
          - -
          -
          -rc()
          -

          Reverse complement.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("ggaatt")
          ->>> a
          -Dseqrecord(-6)
          ->>> a.seq
          -Dseq(-6)
          -ggaatt
          -ccttaa
          ->>> a.reverse_complement().seq
          -Dseq(-6)
          -aattcc
          -ttaagg
          ->>>
          -
          -
          - -
          - -
          -
          -figure()[source]
          -

          This method returns a simple figure of the two primers binding -to a part of the template.

          -
          5tacactcaccgtctatcattatc...cgactgtatcatctgatagcac3
          -                           ||||||||||||||||||||||
          -                          3gctgacatagtagactatcgtg5
          -5tacactcaccgtctatcattatc3
          - |||||||||||||||||||||||
          -3atgtgagtggcagatagtaatag...gctgacatagtagactatcgtg5
          -
          -
          -
          -
          Returns:
          -

          figure – A string containing a text representation of the primers -annealing on the template (see example above).

          -
          -
          Return type:
          -

          string

          -
          -
          -
          - -
          -
          -set_forward_primer_footprint(length)[source]
          -
          - -
          -
          -set_reverse_primer_footprint(length)[source]
          -
          - -
          -
          -program()[source]
          -
          - -
          -
          -dbd_program()[source]
          -
          - -
          -
          -primers()[source]
          -
          - -
          -
          -
          -

          pydna.amplify module

          -

          This module provide the Anneal class and the pcr() function -for PCR simulation. The pcr function is simpler to use, but expects only one -PCR product. The Anneal class should be used if more flexibility is required.

          -

          Primers with 5’ tails as well as inverse PCR on circular templates are handled -correctly.

          -
          -
          -class pydna.amplify.Anneal(primers, template, limit=13, **kwargs)[source]
          -

          Bases: object

          -

          The Anneal class has the following important attributes:

          -
          -
          -forward_primers
          -

          Description of forward_primers.

          -
          -
          Type:
          -

          list

          -
          -
          -
          - -
          -
          -reverse_primers
          -

          Description of reverse_primers.

          -
          -
          Type:
          -

          list

          -
          -
          -
          - -
          -
          -template
          -

          A copy of the template argument. Primers annealing sites has been -added as features that can be visualized in a seqence editor such as -ApE.

          -
          -
          Type:
          -

          Dseqrecord

          -
          -
          -
          - -
          -
          -limit
          -

          The limit of PCR primer annealing, default is 13 bp.

          -
          -
          Type:
          -

          int, optional

          -
          -
          -
          - -
          -
          -property products
          -
          - -
          -
          -report()
          -

          returns a short report describing if or where primer -anneal on the template.

          -
          - -
          - -
          -
          -pydna.amplify.pcr(*args, **kwargs) Amplicon[source]
          -

          pcr is a convenience function for the Anneal class to simplify its -usage, especially from the command line. If more than one or no PCR -product is formed, a ValueError is raised.

          -

          args is any iterable of Dseqrecords or an iterable of iterables of -Dseqrecords. args will be greedily flattened.

          -
          -
          Parameters:
          -
            -
          • args (iterable containing sequence objects) – Several arguments are also accepted.

          • -
          • limit (int = 13, optional) – limit length of the annealing part of the primers.

          • -
          -
          -
          -

          Notes

          -

          sequences in args could be of type:

          -
            -
          • string

          • -
          • Seq

          • -
          • SeqRecord (or subclass)

          • -
          • Dseqrecord (or sublcass)

          • -
          -

          The last sequence will be assumed to be the template while -all preceeding sequences will be assumed to be primers.

          -

          This is a powerful function, use with care!

          -
          -
          Returns:
          -

          product – An pydna.amplicon.Amplicon object representing the PCR -product. The direction of the PCR product will be the same as for -the template sequence.

          -
          -
          Return type:
          -

          Amplicon

          -
          -
          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> from pydna.readers import read
          ->>> from pydna.amplify import pcr
          ->>> from pydna.primer import Primer
          ->>> template = Dseqrecord("tacactcaccgtctatcattatctactatcgactgtatcatctgatagcac")
          ->>> from Bio.SeqRecord import SeqRecord
          ->>> p1 = Primer("tacactcaccgtctatcattatc")
          ->>> p2 = Primer("cgactgtatcatctgatagcac").reverse_complement()
          ->>> pcr(p1, p2, template)
          -Amplicon(51)
          ->>> pcr([p1, p2], template)
          -Amplicon(51)
          ->>> pcr((p1,p2,), template)
          -Amplicon(51)
          ->>>
          -
          -
          -
          - -
          -
          -

          pydna.assembly module

          -

          Assembly of sequences by homologous recombination.

          -

          Should also be useful for related techniques such as Gibson assembly and fusion -PCR. Given a list of sequences (Dseqrecords), all sequences are analyzed for -shared homology longer than the set limit.

          -

          A graph is constructed where each overlapping region form a node and -sequences separating the overlapping regions form edges.

          -
                      -- A --
          -catgatctacgtatcgtgt     -- B --
          -            atcgtgtactgtcatattc
          -                        catattcaaagttct
          -
          -
          -
          ---x--> A --y--> B --z-->   (Graph)
          -
          -Nodes:
          -
          -A : atcgtgt
          -B : catattc
          -
          -Edges:
          -
          -x : catgatctacgt
          -y : actgt
          -z : aaagttct
          -
          -
          -

          The NetworkX package is used to trace linear and circular paths through the -graph.

          -
          -
          -class pydna.assembly.Assembly(frags: List[Dseqrecord], limit: int = 25, algorithm: Callable[[str, str, int], List[Tuple[int, int, int]]] = common_sub_strings)[source]
          -

          Bases: object

          -

          Assembly of a list of linear DNA fragments into linear or circular -constructs. The Assembly is meant to replace the Assembly method as it -is easier to use. Accepts a list of Dseqrecords (source fragments) to -initiate an Assembly object. Several methods are available for analysis -of overlapping sequences, graph construction and assembly.

          -
          -
          Parameters:
          -
            -
          • fragments (list) – a list of Dseqrecord objects.

          • -
          • limit (int, optional) – The shortest shared homology to be considered

          • -
          • algorithm (function, optional) – The algorithm used to determine the shared sequences.

          • -
          • max_nodes (int) – The maximum number of nodes in the graph. This can be tweaked to -manage sequences with a high number of shared sub sequences.

          • -
          -
          -
          -

          Examples

          -
          >>> from pydna.assembly import Assembly
          ->>> from pydna.dseqrecord import Dseqrecord
          ->>> a = Dseqrecord("acgatgctatactgCCCCCtgtgctgtgctcta")
          ->>> b = Dseqrecord("tgtgctgtgctctaTTTTTtattctggctgtatc")
          ->>> c = Dseqrecord("tattctggctgtatcGGGGGtacgatgctatactg")
          ->>> x = Assembly((a,b,c), limit=14)
          ->>> x
          -Assembly
          -fragments....: 33bp 34bp 35bp
          -limit(bp)....: 14
          -G.nodes......: 6
          -algorithm....: common_sub_strings
          ->>> x.assemble_circular()
          -[Contig(o59), Contig(o59)]
          ->>> x.assemble_circular()[0].seq.watson
          -'acgatgctatactgCCCCCtgtgctgtgctctaTTTTTtattctggctgtatcGGGGGt'
          -
          -
          -
          -
          -assemble_linear(**kwargs)
          -
          - -
          -
          -assemble_circular(**kwargs)
          -
          - -
          - -
          -
          -

          pydna.common_sub_strings module

          -

          This module is based on the Py-rstr-max package that -was written by Romain Brixtel (rbrixtel_at_gmail_dot_com) -(https://brixtel.users.greyc.fr) and is available from -https://code.google.com/p/py-rstr-max -https://github.com/gip0/py-rstr-max -the original code was covered by an MIT licence.

          -
          -
          -pydna.common_sub_strings.common_sub_strings(stringx: str, stringy: str, limit: int = 25) List[Tuple[int, int, int]][source]
          -

          Finds all common substrings between stringx and stringy, and returns -them sorted by length.

          -

          This function is case sensitive.

          -
          -
          Parameters:
          -
            -
          • stringx (str)

          • -
          • stringy (str)

          • -
          • limit (int, optional)

          • -
          -
          -
          Returns:
          -

          [(startx1, starty1, length1),(startx2, starty2, length2), …]

          -

          startx1 = startposition in x, where substring 1 starts -starty1 = position in y where substring 1 starts -length1 = lenght of substring

          -

          -
          -
          Return type:
          -

          list of tuple

          -
          -
          -
          - -
          -
          -pydna.common_sub_strings.terminal_overlap(stringx: str, stringy: str, limit: int = 15) List[Tuple[int, int, int]][source]
          -

          Finds the the flanking common substrings between stringx and stringy -longer than limit. This means that the results only contains substrings -that starts or ends at the the ends of stringx and stringy.

          -

          This function is case sensitive.

          -

          returns a list of tuples describing the substrings -The list is sorted longest -> shortest.

          -
          -
          Parameters:
          -
            -
          • stringx (str)

          • -
          • stringy (str)

          • -
          • limit (int, optional)

          • -
          -
          -
          Returns:
          -

          [(startx1,starty1,length1),(startx2,starty2,length2), …]

          -

          startx1 = startposition in x, where substring 1 starts -starty1 = position in y where substring 1 starts -length1 = lenght of substring

          -

          -
          -
          Return type:
          -

          list of tuple

          -
          -
          -

          Examples

          -
          >>> from pydna.common_sub_strings import terminal_overlap
          ->>> terminal_overlap("agctatgtatcttgcatcgta", "gcatcgtagtctatttgcttac", limit=8)
          -[(13, 0, 8)]
          -
          -
          -
                       <-- 8 ->
          -<---- 13 --->
          -agctatgtatcttgcatcgta                    stringx
          -             gcatcgtagtctatttgcttac      stringy
          -             0
          -
          -
          -
          - -
          -
          -

          pydna.contig module

          -
          -
          -class pydna.contig.Contig(record, *args, graph=None, nodemap=None, **kwargs)[source]
          -

          Bases: Dseqrecord

          -

          This class holds information about a DNA assembly. This class is instantiated by -the Assembly class and is not meant to be used directly.

          -
          -
          -classmethod from_string(record: str = '', *args, graph=None, nodemap=None, **kwargs)[source]
          -

          docstring.

          -
          - -
          -
          -classmethod from_SeqRecord(record, *args, graph=None, nodemap=None, **kwargs)[source]
          -
          - -
          -
          -reverse_complement()[source]
          -

          Reverse complement.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("ggaatt")
          ->>> a
          -Dseqrecord(-6)
          ->>> a.seq
          -Dseq(-6)
          -ggaatt
          -ccttaa
          ->>> a.reverse_complement().seq
          -Dseq(-6)
          -aattcc
          -ttaagg
          ->>>
          -
          -
          - -
          - -
          -
          -rc()
          -

          Reverse complement.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("ggaatt")
          ->>> a
          -Dseqrecord(-6)
          ->>> a.seq
          -Dseq(-6)
          -ggaatt
          -ccttaa
          ->>> a.reverse_complement().seq
          -Dseq(-6)
          -aattcc
          -ttaagg
          ->>>
          -
          -
          - -
          - -
          -
          -detailed_figure()[source]
          -

          Returns a text representation of the assembled fragments.

          -

          Linear:

          -
          acgatgctatactgCCCCCtgtgctgtgctcta
          -                   TGTGCTGTGCTCTA
          -                   tgtgctgtgctctaTTTTTtattctggctgtatc
          -
          -
          -

          Circular:

          -
          ||||||||||||||
          -acgatgctatactgCCCCCtgtgctgtgctcta
          -                   TGTGCTGTGCTCTA
          -                   tgtgctgtgctctaTTTTTtattctggctgtatc
          -                                      TATTCTGGCTGTATC
          -                                      tattctggctgtatcGGGGGtacgatgctatactg
          -                                                           ACGATGCTATACTG
          -
          -
          -
          - -
          -
          -figure()[source]
          -

          Compact ascii representation of the assembled fragments.

          -

          Each fragment is represented by:

          -
          Size of common 5' substring|Name and size of DNA fragment|
          -Size of common 5' substring
          -
          -
          -

          Linear:

          -
          frag20| 6
          -       \\/
          -       /\\
          -        6|frag23| 6
          -                 \\/
          -                 /\\
          -                  6|frag14
          -
          -
          -

          Circular:

          -
           -|2577|61
          -|       \\/
          -|       /\\
          -|       61|5681|98
          -|               \\/
          -|               /\\
          -|               98|2389|557
          -|                       \\/
          -|                       /\\
          -|                       557-
          -|                          |
          - --------------------------
          -
          -
          -
          - -
          - -
          -
          -

          pydna.design module

          -

          This module contain functions for primer design for various purposes.

          -
            -
          • :func:primer_design for designing primers for a sequence or a matching primer for an existing primer. Returns an Amplicon object (same as the amplify module returns).

          • -
          • :func:assembly_fragments Adds tails to primers for a linear assembly through homologous recombination or Gibson assembly.

          • -
          • :func:circular_assembly_fragments Adds tails to primers for a circular assembly through homologous recombination or Gibson assembly.

          • -
          -
          -
          -pydna.design.primer_design(template, fp=None, rp=None, limit=13, target_tm=55.0, tm_func=_tm_default, estimate_function=None, **kwargs)[source]
          -

          This function designs a forward primer and a reverse primer for PCR amplification -of a given template sequence.

          -

          The template argument is a Dseqrecord object or equivalent containing the template sequence.

          -

          The optional fp and rp arguments can contain an existing primer for the sequence (either the forward or reverse primer). -One or the other primers can be specified, not both (since then there is nothing to design!, use the pydna.amplify.pcr function instead).

          -

          The limit argument is the minimum length of the primer. The default value is 13.

          -

          If one of the primers is given, the other primer is designed to match in terms of Tm. -If both primers are designed, they will be designed to target_tm

          -

          tm_func is a function that takes an ascii string representing an oligonuceotide as argument and returns a float. -Some useful functions can be found in the pydna.tm module, but can be substituted for a custom made function.

          -

          estimate_function is a tm_func-like function that is used to get a first guess for the primer design, that is then used as starting -point for the final result. This is useful when the tm_func function is slow to calculate (e.g. it relies on an -external API, such as the NEB primer design API). The estimate_function should be faster than the tm_func function. -The default value is None. -To use the default tm_func as estimate function to get the NEB Tm faster, you can do: -primer_design(dseqr, target_tm=55, tm_func=tm_neb, estimate_function=tm_default).

          -

          The function returns a pydna.amplicon.Amplicon class instance. This object has -the object.forward_primer and object.reverse_primer properties which contain the designed primers.

          -
          -
          Parameters:
          -
            -
          • template (pydna.dseqrecord.Dseqrecord) – a Dseqrecord object. The only required argument.

          • -
          • fp (pydna.primer.Primer, optional) – optional pydna.primer.Primer objects containing one primer each.

          • -
          • rp (pydna.primer.Primer, optional) – optional pydna.primer.Primer objects containing one primer each.

          • -
          • target_tm (float, optional) – target tm for the primers, set to 55°C by default.

          • -
          • tm_func (function) – Function used for tm calculation. This function takes an ascii string -representing an oligonuceotide as argument and returns a float. -Some useful functions can be found in the pydna.tm module, but can be -substituted for a custom made function.

          • -
          -
          -
          Returns:
          -

          result

          -
          -
          Return type:
          -

          Amplicon

          -
          -
          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> t=Dseqrecord("atgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatg")
          ->>> t
          -Dseqrecord(-64)
          ->>> from pydna.design import primer_design
          ->>> ampl = primer_design(t)
          ->>> ampl
          -Amplicon(64)
          ->>> ampl.forward_primer
          -f64 17-mer:5'-atgactgctaacccttc-3'
          ->>> ampl.reverse_primer
          -r64 18-mer:5'-catcgtaagtttcgaacg-3'
          ->>> print(ampl.figure())
          -5atgactgctaacccttc...cgttcgaaacttacgatg3
          -                     ||||||||||||||||||
          -                    3gcaagctttgaatgctac5
          -5atgactgctaacccttc3
          - |||||||||||||||||
          -3tactgacgattgggaag...gcaagctttgaatgctac5
          ->>> pf = "GGATCC" + ampl.forward_primer
          ->>> pr = "GGATCC" + ampl.reverse_primer
          ->>> pf
          -f64 23-mer:5'-GGATCCatgactgct..ttc-3'
          ->>> pr
          -r64 24-mer:5'-GGATCCcatcgtaag..acg-3'
          ->>> from pydna.amplify import pcr
          ->>> pcr_prod = pcr(pf, pr, t)
          ->>> print(pcr_prod.figure())
          -      5atgactgctaacccttc...cgttcgaaacttacgatg3
          -                           ||||||||||||||||||
          -                          3gcaagctttgaatgctacCCTAGG5
          -5GGATCCatgactgctaacccttc3
          -       |||||||||||||||||
          -      3tactgacgattgggaag...gcaagctttgaatgctac5
          ->>> print(pcr_prod.seq)
          -GGATCCatgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatgGGATCC
          ->>> from pydna.primer import Primer
          ->>> pf = Primer("atgactgctaacccttccttggtgttg", id="myprimer")
          ->>> ampl = primer_design(t, fp = pf)
          ->>> ampl.forward_primer
          -myprimer 27-mer:5'-atgactgctaaccct..ttg-3'
          ->>> ampl.reverse_primer
          -r64 32-mer:5'-catcgtaagtttcga..atc-3'
          -
          -
          -
          - -
          -
          -pydna.design.assembly_fragments(f, overlap=35, maxlink=40, circular=False)[source]
          -

          This function return a list of 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 -recombination.

          -

          Given that we have two linear pydna.amplicon.Amplicon objects a and b

          -

          we can modify the reverse primer of a and forward primer of b with tails to allow -fusion by fusion PCR, Gibson assembly or in-vivo homologous recombination. -The basic requirements for the primers for the three techniques are the same.

          -
           _________ a _________
          -/                     \
          -agcctatcatcttggtctctgca
          -                  |||||
          -                 <gacgt
          -agcct>
          -|||||
          -tcggatagtagaaccagagacgt
          -
          -                        __________ b ________
          -                       /                     \
          -                       TTTATATCGCATGACTCTTCTTT
          -                                         |||||
          -                                        <AGAAA
          -                       TTTAT>
          -                       |||||
          -                       AAATATAGCGTACTGAGAAGAAA
          -
          -agcctatcatcttggtctctgcaTTTATATCGCATGACTCTTCTTT
          -||||||||||||||||||||||||||||||||||||||||||||||
          -tcggatagtagaaccagagacgtAAATATAGCGTACTGAGAAGAAA
          -\___________________ c ______________________/
          -
          -
          -

          Design tailed primers incorporating a part of the next or previous fragment to be assembled.

          -
          agcctatcatcttggtctctgca
          -|||||||||||||||||||||||
          -                gagacgtAAATATA
          -
          -|||||||||||||||||||||||
          -tcggatagtagaaccagagacgt
          -
          -                       TTTATATCGCATGACTCTTCTTT
          -                       |||||||||||||||||||||||
          -
          -                ctctgcaTTTATAT
          -                       |||||||||||||||||||||||
          -                       AAATATAGCGTACTGAGAAGAAA
          -
          -
          -

          PCR products with flanking sequences are formed in the PCR process.

          -
          agcctatcatcttggtctctgcaTTTATAT
          -||||||||||||||||||||||||||||||
          -tcggatagtagaaccagagacgtAAATATA
          -                \____________/
          -
          -                   identical
          -                   sequences
          -                 ____________
          -                /            \
          -                ctctgcaTTTATATCGCATGACTCTTCTTT
          -                ||||||||||||||||||||||||||||||
          -                gagacgtAAATATAGCGTACTGAGAAGAAA
          -
          -
          -

          The fragments can be fused by any of the techniques mentioned earlier to form c:

          -
          agcctatcatcttggtctctgcaTTTATATCGCATGACTCTTCTTT
          -||||||||||||||||||||||||||||||||||||||||||||||
          -tcggatagtagaaccagagacgtAAATATAGCGTACTGAGAAGAAA
          -
          -
          -

          The first argument of this function is a list of sequence objects containing -Amplicons and other similar objects.

          -

          At least every second sequence object needs to be an Amplicon

          -

          This rule exists because if a sequence object is that is not a PCR product -is to be fused with another fragment, that other fragment needs to be an Amplicon -so that the primer of the other object can be modified to include the whole stretch -of sequence homology needed for the fusion. See the example below where a is a -non-amplicon (a linear plasmid vector for instance)

          -
           _________ a _________           __________ b ________
          -/                     \         /                     \
          -agcctatcatcttggtctctgca   <-->  TTTATATCGCATGACTCTTCTTT
          -|||||||||||||||||||||||         |||||||||||||||||||||||
          -tcggatagtagaaccagagacgt                          <AGAAA
          -                                TTTAT>
          -                                |||||||||||||||||||||||
          -                          <-->  AAATATAGCGTACTGAGAAGAAA
          -
          -     agcctatcatcttggtctctgcaTTTATATCGCATGACTCTTCTTT
          -     ||||||||||||||||||||||||||||||||||||||||||||||
          -     tcggatagtagaaccagagacgtAAATATAGCGTACTGAGAAGAAA
          -     \___________________ c ______________________/
          -
          -
          -

          In this case only the forward primer of b is fitted with a tail with a part a:

          -
          agcctatcatcttggtctctgca
          -|||||||||||||||||||||||
          -tcggatagtagaaccagagacgt
          -
          -                       TTTATATCGCATGACTCTTCTTT
          -                       |||||||||||||||||||||||
          -                                        <AGAAA
          -         tcttggtctctgcaTTTATAT
          -                       |||||||||||||||||||||||
          -                       AAATATAGCGTACTGAGAAGAAA
          -
          -
          -

          PCR products with flanking sequences are formed in the PCR process.

          -
          agcctatcatcttggtctctgcaTTTATAT
          -||||||||||||||||||||||||||||||
          -tcggatagtagaaccagagacgtAAATATA
          -                \____________/
          -
          -                   identical
          -                   sequences
          -                 ____________
          -                /            \
          -                ctctgcaTTTATATCGCATGACTCTTCTTT
          -                ||||||||||||||||||||||||||||||
          -                gagacgtAAATATAGCGTACTGAGAAGAAA
          -
          -
          -

          The fragments can be fused by for example Gibson assembly:

          -
          agcctatcatcttggtctctgcaTTTATAT
          -||||||||||||||||||||||||||||||
          -tcggatagtagaacca
          -
          -                             TCGCATGACTCTTCTTT
          -                ||||||||||||||||||||||||||||||
          -                gagacgtAAATATAGCGTACTGAGAAGAAA
          -
          -
          -

          to form c:

          -
          agcctatcatcttggtctctgcaTTTATATCGCATGACTCTTCTTT
          -||||||||||||||||||||||||||||||||||||||||||||||
          -tcggatagtagaaccagagacgtAAATATAGCGTACTGAGAAGAAA
          -
          -
          -

          The first argument of this function is a list of sequence objects containing -Amplicons and other similar objects.

          -

          The overlap argument controls how many base pairs of overlap required between -adjacent sequence fragments. In the junction between Amplicons, tails with the -length of about half of this value is added to the two primers -closest to the junction.

          -
          >       <
          -Amplicon1
          -         Amplicon2
          -         >       <
          -
          -         ⇣
          -
          ->       <-
          -Amplicon1
          -         Amplicon2
          -        ->       <
          -
          -
          -

          In the case of an Amplicon adjacent to a Dseqrecord object, the tail will -be twice as long (1*overlap) since the -recombining sequence is present entirely on this primer:

          -
          Dseqrecd1
          -         Amplicon1
          -         >       <
          -
          -         ⇣
          -
          -Dseqrecd1
          -         Amplicon1
          -       -->       <
          -
          -
          -

          Note that if the sequence of DNA fragments starts or stops with an Amplicon, -the very first and very last prinmer will not be modified i.e. assembles are -always assumed to be linear. There are simple tricks around that for circular -assemblies depicted in the last two examples below.

          -

          The maxlink arguments controls the cut off length for sequences that will be -synhtesized by adding them to primers for the adjacent fragment(s). The -argument list may contain short spacers (such as spacers between fusion proteins).

          -
          Example 1: Linear assembly of PCR products (pydna.amplicon.Amplicon class objects) ------
          -
          ->       <         >       <
          -Amplicon1         Amplicon3
          -         Amplicon2         Amplicon4
          -         >       <         >       <
          -
          -                     ⇣
          -                     pydna.design.assembly_fragments
          -                     ⇣
          -
          ->       <-       ->       <-                      pydna.assembly.Assembly
          -Amplicon1         Amplicon3
          -         Amplicon2         Amplicon4     ➤  Amplicon1Amplicon2Amplicon3Amplicon4
          -        ->       <-       ->       <
          -
          -Example 2: Linear assembly of alternating Amplicons and other fragments
          -
          ->       <         >       <
          -Amplicon1         Amplicon2
          -         Dseqrecd1         Dseqrecd2
          -
          -                     ⇣
          -                     pydna.design.assembly_fragments
          -                     ⇣
          -
          ->       <--     -->       <--                     pydna.assembly.Assembly
          -Amplicon1         Amplicon2
          -         Dseqrecd1         Dseqrecd2     ➤  Amplicon1Dseqrecd1Amplicon2Dseqrecd2
          -
          -Example 3: Linear assembly of alternating Amplicons and other fragments
          -
          -Dseqrecd1         Dseqrecd2
          -         Amplicon1         Amplicon2
          -         >       <       -->       <
          -
          -                     ⇣
          -             pydna.design.assembly_fragments
          -                     ⇣
          -                                                  pydna.assembly.Assembly
          -Dseqrecd1         Dseqrecd2
          -         Amplicon1         Amplicon2     ➤  Dseqrecd1Amplicon1Dseqrecd2Amplicon2
          -       -->       <--     -->       <
          -
          -Example 4: Circular assembly of alternating Amplicons and other fragments
          -
          -                 ->       <==
          -Dseqrecd1         Amplicon2
          -         Amplicon1         Dseqrecd1
          -       -->       <-
          -                     ⇣
          -                     pydna.design.assembly_fragments
          -                     ⇣
          -                                                   pydna.assembly.Assembly
          -                 ->       <==
          -Dseqrecd1         Amplicon2                    -Dseqrecd1Amplicon1Amplicon2-
          -         Amplicon1                       ➤    |                             |
          -       -->       <-                            -----------------------------
          -
          ------- Example 5: Circular assembly of Amplicons
          -
          ->       <         >       <
          -Amplicon1         Amplicon3
          -         Amplicon2         Amplicon1
          -         >       <         >       <
          -
          -                     ⇣
          -                     pydna.design.assembly_fragments
          -                     ⇣
          -
          ->       <=       ->       <-
          -Amplicon1         Amplicon3
          -         Amplicon2         Amplicon1
          -        ->       <-       +>       <
          -
          -                     ⇣
          -             make new Amplicon using the Amplicon1.template and
          -             the last fwd primer and the first rev primer.
          -                     ⇣
          -                                                   pydna.assembly.Assembly
          -+>       <=       ->       <-
          - Amplicon1         Amplicon3                  -Amplicon1Amplicon2Amplicon3-
          -          Amplicon2                      ➤   |                             |
          -         ->       <-                          -----------------------------
          -
          -
          -
          -
          Parameters:
          -
            -
          • f (list of pydna.amplicon.Amplicon and other Dseqrecord like objects) – list Amplicon and Dseqrecord object for which fusion primers should be constructed.

          • -
          • overlap (int, optional) – Length of required overlap between fragments.

          • -
          • 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

          -
          [Amplicon1,
          - Amplicon2, ...]
          -
          -
          -

          -
          -
          Return type:
          -

          list of pydna.amplicon.Amplicon and other Dseqrecord like objects pydna.amplicon.Amplicon objects

          -
          -
          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> from pydna.design import primer_design
          ->>> a=primer_design(Dseqrecord("atgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatg"))
          ->>> b=primer_design(Dseqrecord("ccaaacccaccaggtaccttatgtaagtacttcaagtcgccagaagacttcttggtcaagttgcc"))
          ->>> c=primer_design(Dseqrecord("tgtactggtgctgaaccttgtatcaagttgggtgttgacgccattgccccaggtggtcgtttcgtt"))
          ->>> from pydna.design import assembly_fragments
          ->>> # We would like a circular recombination, so the first sequence has to be repeated
          ->>> fa1,fb,fc,fa2 = assembly_fragments([a,b,c,a])
          ->>> # Since all fragments are Amplicons, we need to extract the rp of the 1st and fp of the last fragments.
          ->>> from pydna.amplify import pcr
          ->>> fa = pcr(fa2.forward_primer, fa1.reverse_primer, a)
          ->>> [fa,fb,fc]
          -[Amplicon(100), Amplicon(101), Amplicon(102)]
          ->>> fa.name, fb.name, fc.name = "fa fb fc".split()
          ->>> from pydna.assembly import Assembly
          ->>> assemblyobj = Assembly([fa,fb,fc])
          ->>> assemblyobj
          -Assembly
          -fragments....: 100bp 101bp 102bp
          -limit(bp)....: 25
          -G.nodes......: 6
          -algorithm....: common_sub_strings
          ->>> assemblyobj.assemble_linear()
          -[Contig(-231), Contig(-166), Contig(-36)]
          ->>> assemblyobj.assemble_circular()[0].seguid()
          -'cdseguid=85t6tfcvWav0wnXEIb-lkUtrl4s'
          ->>> (a+b+c).looped().seguid()
          -'cdseguid=85t6tfcvWav0wnXEIb-lkUtrl4s'
          ->>> print(assemblyobj.assemble_circular()[0].figure())
          - -|fa|36
          -|     \/
          -|     /\
          -|     36|fb|36
          -|           \/
          -|           /\
          -|           36|fc|36
          -|                 \/
          -|                 /\
          -|                 36-
          -|                    |
          - --------------------
          ->>>
          -
          -
          -
          - -
          -
          -pydna.design.circular_assembly_fragments(f, overlap=35, maxlink=40)[source]
          -

          Equivalent to assembly_fragments with circular=True.

          -

          Deprecated, kept for backward compatibility. Use assembly_fragments with circular=True instead.

          -
          - -
          -
          -

          pydna.download module

          -

          Provides a function for downloading online text files.

          -
          -
          -

          pydna.editor module

          -

          This module provides a class for opening a sequence using an editor -that accepts a file as a command line argument.

          -

          ApE - A plasmid Editor [6] is and excellent editor for this purpose.

          -

          References

          - -
          -
          -class pydna.editor.Editor(shell_command_for_editor, tmpdir=None)[source]
          -

          Bases: object

          -

          The Editor class needs to be instantiated before use.

          -
          -
          Parameters:
          -
            -
          • shell_command_for_editor (str) – String containing the path to the editor

          • -
          • tmpdir (str, optional) – String containing path to the temprary directory where sequence -files are stored before opening.

          • -
          -
          -
          -

          Examples

          -
          >>> import pydna
          ->>> #ape = pydna.Editor("tclsh8.6 /home/bjorn/.ApE/apeextractor/ApE.vfs/lib/app-AppMain/AppMain.tcl")
          ->>> #ape.open("aaa") # This command opens the sequence in the ApE editor
          -
          -
          -
          -
          -open(seq_to_open)[source]
          -

          Open a sequence for editing in an external (DNA) editor.

          -
          -
          Parameters:
          -

          args (SeqRecord or Dseqrecord object)

          -
          -
          -
          - -
          - -
          -
          -pydna.editor.ape(*args, **kwargs)[source]
          -

          docstring.

          -
          - -
          -
          -

          pydna.gel module

          -

          docstring.

          -
          -
          -pydna.gel.interpolator(mwstd)[source]
          -

          docstring.

          -
          - -
          -
          -pydna.gel.gel(samples=None, gel_length=600, margin=50, interpolator=interpolator(mwstd=_mwstd))[source]
          -
          - -
          -
          -

          pydna.genbank module

          -

          This module provides a class for downloading sequences from genbank -called Genbank and an function that does the same thing called genbank.

          -

          The function can be used if the environmental variable pydna_email has -been set to a valid email address. The easiest way to do this permanantly is to edit the -pydna.ini file. See the documentation of pydna.open_config_folder()

          -
          -
          -class pydna.genbank.Genbank(users_email: str, *, tool: str = 'pydna')[source]
          -

          Bases: object

          -

          Class to facilitate download from genbank. It is easier and -quicker to use the pydna.genbank.genbank() function directly.

          -
          -
          Parameters:
          -

          users_email (string) – Has to be a valid email address. You should always tell -Genbanks who you are, so that they can contact you.

          -
          -
          -

          Examples

          -
          >>> from pydna.genbank import Genbank
          ->>> gb=Genbank("bjornjobb@gmail.com")
          ->>> rec = gb.nucleotide("LP002422.1")   # <- entry from genbank
          ->>> print(len(rec))
          -1
          -
          -
          -
          -
          -nucleotide(**kwargs)
          -
          - -
          - -
          -
          -pydna.genbank.genbank(accession: str = 'CS570233.1', *args, **kwargs) GenbankRecord[source]
          -

          Download a genbank nuclotide record.

          -

          This function takes the same paramenters as the -:func:pydna.genbank.Genbank.nucleotide method. The email address stored -in the pydna_email environment variable is used. The easiest way set -this permanantly is to edit the pydna.ini file. -See the documentation of pydna.open_config_folder()

          -

          if no accession is given, a very short Genbank -entry -is used as an example (see below). This can be useful for testing the -connection to Genbank.

          -

          Please note that this result is also cached by default by settings in -the pydna.ini file. -See the documentation of pydna.open_config_folder()

          -
          LOCUS       CS570233                  14 bp    DNA     linear   PAT 18-MAY-2007
          -DEFINITION  Sequence 6 from Patent WO2007025016.
          -ACCESSION   CS570233
          -VERSION     CS570233.1
          -KEYWORDS    .
          -SOURCE      synthetic construct
          -  ORGANISM  synthetic construct
          -            other sequences; artificial sequences.
          -REFERENCE   1
          -  AUTHORS   Shaw,R.W. and Cottenoir,M.
          -  TITLE     Inhibition of metallo-beta-lactamase by double-stranded dna
          -  JOURNAL   Patent: WO 2007025016-A1 6 01-MAR-2007;
          -            Texas Tech University System (US)
          -FEATURES             Location/Qualifiers
          -     source          1..14
          -                     /organism="synthetic construct"
          -                     /mol_type="unassigned DNA"
          -                     /db_xref="taxon:32630"
          -                     /note="This is a 14bp aptamer inhibitor."
          -ORIGIN
          -        1 atgttcctac atga
          -//
          -
          -
          -
          - -
          -
          -

          pydna.genbankfile module

          -
          -
          -class pydna.genbankfile.GenbankFile(record, *args, path=None, **kwargs)[source]
          -

          Bases: Dseqrecord

          -
          -
          -classmethod from_SeqRecord(record, *args, path=None, **kwargs)[source]
          -
          - -
          -
          -reverse_complement()[source]
          -

          Reverse complement.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("ggaatt")
          ->>> a
          -Dseqrecord(-6)
          ->>> a.seq
          -Dseq(-6)
          -ggaatt
          -ccttaa
          ->>> a.reverse_complement().seq
          -Dseq(-6)
          -aattcc
          -ttaagg
          ->>>
          -
          -
          - -
          - -
          -
          -rc()
          -

          Reverse complement.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("ggaatt")
          ->>> a
          -Dseqrecord(-6)
          ->>> a.seq
          -Dseq(-6)
          -ggaatt
          -ccttaa
          ->>> a.reverse_complement().seq
          -Dseq(-6)
          -aattcc
          -ttaagg
          ->>>
          -
          -
          - -
          - -
          - -
          -
          -

          pydna.genbankfixer module

          -

          This module provides the gbtext_clean() function which can clean up broken Genbank files enough to -pass the BioPython Genbank parser

          -

          Almost all of this code was lifted from BioJSON (https://github.com/levskaya/BioJSON) by Anselm Levskaya. -The original code was not accompanied by any software licence. This parser is based on pyparsing.

          -

          There are some modifications to deal with fringe cases.

          -

          The parser first produces JSON as an intermediate format which is then formatted back into a -string in Genbank format.

          -

          The parser is not complete, so some fields do not survive the roundtrip (see below). -This should not be a difficult fix. The returned result has two properties, -.jseq which is the intermediate JSON produced by the parser and .gbtext -which is the formatted genbank string.

          -
          -
          -pydna.genbankfixer.parseGBLoc(s, l_, t)[source]
          -

          retwingles parsed genbank location strings, assumes no joins of RC and FWD sequences

          -
          - -
          -
          -pydna.genbankfixer.strip_multiline(s, l_, t)[source]
          -
          - -
          -
          -pydna.genbankfixer.toInt(s, l_, t)[source]
          -
          - -
          -
          -pydna.genbankfixer.strip_indent(str)[source]
          -
          - -
          -
          -pydna.genbankfixer.concat_dict(dlist)[source]
          -

          more or less dict(list of string pairs) but merges -vals with the same keys so no duplicates occur

          -
          - -
          -
          -pydna.genbankfixer.toJSON(gbkstring)[source]
          -
          - -
          -
          -pydna.genbankfixer.wrapstring(str_, rowstart, rowend, padfirst=True)[source]
          -

          wraps the provided string in lines of length rowend-rowstart -and padded on the left by rowstart. --> if padfirst is false the first line is not padded

          -
          - -
          -
          -pydna.genbankfixer.locstr(locs, strand)[source]
          -

          genbank formatted location string, assumes no join’d combo of rev and fwd seqs

          -
          - -
          -
          -pydna.genbankfixer.originstr(sequence)[source]
          -

          formats dna sequence as broken, numbered lines ala genbank

          -
          - -
          -
          -pydna.genbankfixer.toGB(jseq)[source]
          -

          parses json jseq data and prints out ApE compatible genbank

          -
          - -
          -
          -pydna.genbankfixer.gbtext_clean(gbtext)[source]
          -

          This function takes a string containing one genbank sequence -in Genbank format and returns a named tuple containing two fields, -the gbtext containing a string with the corrected genbank sequence and -jseq which contains the JSON intermediate.

          -

          Examples

          -
          >>> s = '''LOCUS       New_DNA      3 bp    DNA   CIRCULAR SYN        19-JUN-2013
          -... DEFINITION  .
          -... ACCESSION
          -... VERSION
          -... SOURCE      .
          -...   ORGANISM  .
          -... COMMENT
          -... COMMENT     ApEinfo:methylated:1
          -... ORIGIN
          -...         1 aaa
          -... //'''
          ->>> from pydna.readers import read
          ->>> read(s)  
          -/home/bjorn/anaconda3/envs/bjorn36/lib/python3.6/site-packages/Bio/GenBank/Scanner.py:1388: BiopythonParserWarning: Malformed LOCUS line found - is this correct?
          -:'LOCUS       New_DNA      3 bp    DNA   CIRCULAR SYN        19-JUN-2013\n'
          -  "correct?\n:%r" % line, BiopythonParserWarning)
          -Traceback (most recent call last):
          -  File "/home/bjorn/python_packages/pydna/pydna/readers.py", line 48, in read
          -    results = results.pop()
          -IndexError: pop from empty list
          -
          -During handling of the above exception, another exception occurred:
          -
          -Traceback (most recent call last):
          -  File "<stdin>", line 1, in <module>
          -  File "/home/bjorn/python_packages/pydna/pydna/readers.py", line 50, in read
          -    raise ValueError("No sequences found in data:\n({})".format(data[:79]))
          -ValueError: No sequences found in data:
          -(LOCUS       New_DNA      3 bp    DNA   CIRCULAR SYN        19-JUN-2013
          -DEFINITI)
          ->>> from pydna.genbankfixer import gbtext_clean
          ->>> s2, j2 = gbtext_clean(s)
          ->>> print(s2)
          -LOCUS       New_DNA                    3 bp ds-DNA     circular SYN 19-JUN-2013
          -DEFINITION  .
          -ACCESSION
          -VERSION
          -SOURCE      .
          -ORGANISM  .
          -COMMENT
          -COMMENT     ApEinfo:methylated:1
          -FEATURES             Location/Qualifiers
          -ORIGIN
          -        1 aaa
          -//
          ->>> s3 = read(s2)
          ->>> s3
          -Dseqrecord(o3)
          ->>> print(s3.format())
          -LOCUS       New_DNA                    3 bp    DNA     circular SYN 19-JUN-2013
          -DEFINITION  .
          -ACCESSION   New_DNA
          -VERSION     New_DNA
          -KEYWORDS    .
          -SOURCE
          -  ORGANISM  .
          -            .
          -COMMENT
          -            ApEinfo:methylated:1
          -FEATURES             Location/Qualifiers
          -ORIGIN
          -        1 aaa
          -//
          -
          -
          -
          - -
          -
          -

          pydna.genbankrecord module

          -
          -
          -class pydna.genbankrecord.GenbankRecord(record, *args, item='accession', start=None, stop=None, strand=1, **kwargs)[source]
          -

          Bases: Dseqrecord

          -
          -
          -classmethod from_string(record: str = '', *args, item='accession', start=None, stop=None, strand=1, **kwargs)[source]
          -

          docstring.

          -
          - -
          -
          -classmethod from_SeqRecord(record, *args, item='accession', start=None, stop=None, strand=1, **kwargs)[source]
          -
          - -
          -
          -reverse_complement()[source]
          -

          Reverse complement.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("ggaatt")
          ->>> a
          -Dseqrecord(-6)
          ->>> a.seq
          -Dseq(-6)
          -ggaatt
          -ccttaa
          ->>> a.reverse_complement().seq
          -Dseq(-6)
          -aattcc
          -ttaagg
          ->>>
          -
          -
          - -
          - -
          -
          -rc()
          -

          Reverse complement.

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> a=Dseqrecord("ggaatt")
          ->>> a
          -Dseqrecord(-6)
          ->>> a.seq
          -Dseq(-6)
          -ggaatt
          -ccttaa
          ->>> a.reverse_complement().seq
          -Dseq(-6)
          -aattcc
          -ttaagg
          ->>>
          -
          -
          - -
          - -
          -
          -pydna_code()[source]
          -

          docstring.

          -
          - -
          -
          -biopython_code()[source]
          -

          docstring.

          -
          - -
          - -
          -
          -

          pydna.myprimers module

          -

          Provides a practical way to access a list of primer sequences in a text file.

          -

          The path of a text file can be specified in the pydna.ini file or by the -´pydna_primers´ environment variable.

          -

          The file is expected to contain sequences in FASTA, Genbank or EMBL formats or -any format readable by the parse_primers function.

          -

          The primer list is expected to follow the convension below. The primer name is -expected to begin with the number.

          -

          can have the format below for example:

          -
          >2_third_primer
          -tgagtagtcgtagtcgtcgtat
          -
          ->1_second_primer
          -tgatcgtcatgctgactatactat
          -
          ->0_first_primer
          -ctaggatcgtagatctagctg
          -...
          -
          -
          -

          The primerlist funtion returns a list of pydna.primer.Primer objects -primerdict returns a dict where the key is the id of the object.

          -
          -
          -class pydna.myprimers.PrimerList(initlist: ~typing.Iterable = None, path: (<class 'str'>, <class 'pathlib.Path'>) = None, *args, identifier: str = "p", **kwargs)[source]
          -

          Bases: UserList

          -

          Read a text file with primers.

          -

          The primers can be of any format readable by the parse_primers -function. Lines beginning with # are ignored. Path defaults to -the path given by the pydna_primers environment variable.

          -

          The primer list does not accept new primers. Use the -assign_numbers_to_new_primers method and paste the new -primers at the top of the list.

          -

          The primer list remembers the numbers of accessed primers. -The indices of accessed primers are stored in the .accessed -property.

          -
          -
          -property accessed
          -

          docstring.

          -
          - -
          -
          -assign_numbers(lst: list)[source]
          -

          Find new primers in lst.

          -

          Returns a string containing new primers with their assigned -numbers. This string can be copied and pasted to the primer -text file.

          -
          - -
          -
          -pydna_code_from_list(lst: list)[source]
          -

          Pydna code for a list of primer objects.

          -
          - -
          -
          -open_folder()[source]
          -

          Open folder where primer file is located.

          -
          - -
          -
          -code(lst: list)
          -

          Pydna code for a list of primer objects.

          -
          - -
          - -
          -
          -pydna.myprimers.check_primer_numbers(pl: list | None = None)[source]
          -

          Find primers whose number do not match position in list.

          -
          - -
          -
          -pydna.myprimers.undefined_sequence(pl: list | None = None)[source]
          -

          Primers in list with N or n instead of a sequence.

          -
          - -
          -
          -pydna.myprimers.find_duplicate_primers(pl: list | None = None)[source]
          -

          Find a list of lists with duplicated primer sequences.

          -
          - -
          -
          -

          pydna.parsers module

          -

          Provides two functions, parse and parse_primers

          -
          -
          -pydna.parsers.extract_from_text(text)[source]
          -

          docstring.

          -
          - -
          -
          -pydna.parsers.embl_gb_fasta(text)[source]
          -

          Parse embl, genbank or fasta format from text.

          -

          Returns list of Bio.SeqRecord.SeqRecord

          -

          annotations[“molecule_type”] -annotations[“topology”]

          -
          - -
          -
          -pydna.parsers.parse(data, ds=True)[source]
          -

          Return all DNA sequences found in data.

          -

          If no sequences are found, an empty list is returned. This is a greedy -function, use carefully.

          -
          -
          Parameters:
          -
            -
          • data (string or iterable) –

            The data parameter is a string containing:

            -
              -
            1. an absolute path to a local file. -The file will be read in text -mode and parsed for EMBL, FASTA -and Genbank sequences. Can be -a string or a Path object.

            2. -
            3. a string containing one or more -sequences in EMBL, GENBANK, -or FASTA format. Mixed formats -are allowed.

            4. -
            5. data can be a list or other iterable where the elements are 1 or 2

            6. -
            -

          • -
          • ds (bool) – If True double stranded Dseqrecord objects are returned. -If False single stranded Bio.SeqRecord [7] objects are -returned.

          • -
          -
          -
          Returns:
          -

          contains Dseqrecord or SeqRecord objects

          -
          -
          Return type:
          -

          list

          -
          -
          -

          References

          - -
          -

          See also

          -

          read

          -
          -
          - -
          -
          -pydna.parsers.parse_primers(data)[source]
          -

          docstring.

          -
          - -
          -
          -

          pydna.primer module

          -

          This module provide the Primer class that is a subclass of the biopython SeqRecord.

          -
          -
          -class pydna.primer.Primer(record, *args, amplicon=None, position=None, footprint=0, **kwargs)[source]
          -

          Bases: SeqRecord

          -

          Primer and its position on a template, footprint and tail.

          -
          -
          -property footprint
          -
          - -
          -
          -property tail
          -
          - -
          -
          -reverse_complement(*args, **kwargs)[source]
          -

          Return the reverse complement of the sequence.

          -
          - -
          - -
          -
          -

          pydna.readers module

          -

          Provides two functions, read and read_primer.

          -
          -
          -pydna.readers.read(data, ds=True)[source]
          -

          This function is similar the parse() function but expects one and only -one sequence or and exception is thrown.

          -
          -
          Parameters:
          -
            -
          • data (string) – see below

          • -
          • ds (bool) – Double stranded or single stranded DNA, if True return -Dseqrecord objects, else Bio.SeqRecord objects.

          • -
          -
          -
          Returns:
          -

          contains the first Dseqrecord or SeqRecord object parsed.

          -
          -
          Return type:
          -

          Dseqrecord

          -
          -
          -

          Notes

          -

          The data parameter is similar to the data parameter for parse().

          -
          -

          See also

          -

          parse

          -
          -
          - -
          -
          -pydna.readers.read_primer(data)[source]
          -

          Use this function to read a primer sequence from a string or a local file. -The usage is similar to the parse_primer() function.

          -
          - -
          -
          -

          pydna.seqrecord module

          -

          A subclass of the Biopython SeqRecord class.

          -

          Has a number of extra methods and uses -the pydna._pretty_str.pretty_str class instread of str for a -nicer output in the IPython shell.

          -
          -
          -class pydna.seqrecord.SeqRecord(seq, *args, id='id', name='name', description='description', **kwargs)[source]
          -

          Bases: SeqRecord

          -

          A subclass of the Biopython SeqRecord class.

          -

          Has a number of extra methods and uses -the pydna._pretty_str.pretty_str class instread of str for a -nicer output in the IPython shell.

          -
          -
          -classmethod from_Bio_SeqRecord(sr: SeqRecord)[source]
          -

          Creates a pydnaSeqRecord from a Biopython SeqRecord.

          -
          - -
          -
          -property locus
          -

          Alias for name property.

          -
          - -
          -
          -property accession
          -

          Alias for id property.

          -
          - -
          -
          -property definition
          -

          Alias for description property.

          -
          - -
          -
          -reverse_complement(*args, **kwargs)[source]
          -

          Return the reverse complement of the sequence.

          -
          - -
          -
          -rc(*args, **kwargs)
          -

          Return the reverse complement of the sequence.

          -
          - -
          -
          -isorf(table=1)[source]
          -

          Detect if sequence is an open reading frame (orf) in the 5’-3’.

          -

          direction.

          -

          Translation tables are numbers according to the NCBI numbering [8].

          -
          -
          Parameters:
          -

          table (int) – Sets the translation table, default is 1 (standard code)

          -
          -
          Returns:
          -

          True if sequence is an orf, False otherwise.

          -
          -
          Return type:
          -

          bool

          -
          -
          -

          Examples

          -
          >>> from pydna.seqrecord import SeqRecord
          ->>> a=SeqRecord("atgtaa")
          ->>> a.isorf()
          -True
          ->>> b=SeqRecord("atgaaa")
          ->>> b.isorf()
          -False
          ->>> c=SeqRecord("atttaa")
          ->>> c.isorf()
          -False
          -
          -
          -

          References

          - -
          - -
          -
          -translate()[source]
          -

          docstring.

          -
          - -
          -
          -add_colors_to_features_for_ape()[source]
          -

          Assign colors to features.

          -

          compatible with -the ApE editor.

          -
          - -
          -
          -add_feature(x=None, y=None, seq=None, type_='misc', strand=1, *args, **kwargs)[source]
          -

          Add a feature of type misc to the feature list of the sequence.

          -
          -
          Parameters:
          -
            -
          • x (int) – Indicates start of the feature

          • -
          • y (int) – Indicates end of the feature

          • -
          -
          -
          -

          Examples

          -
          >>> from pydna.seqrecord import SeqRecord
          ->>> a=SeqRecord("atgtaa")
          ->>> a.features
          -[]
          ->>> a.add_feature(2,4)
          ->>> a.features
          -[SeqFeature(SimpleLocation(ExactPosition(2),
          -                           ExactPosition(4),
          -                           strand=1),
          -            type='misc',
          -            qualifiers=...)]
          -
          -
          -
          - -
          -
          -list_features()[source]
          -

          Print ASCII table with all features.

          -

          Examples

          -
          >>> from pydna.seq import Seq
          ->>> from pydna.seqrecord import SeqRecord
          ->>> a=SeqRecord(Seq("atgtaa"))
          ->>> a.add_feature(2,4)
          ->>> print(a.list_features())
          -+-----+---------------+-----+-----+-----+-----+------+------+
          -| Ft# | Label or Note | Dir | Sta | End | Len | type | orf? |
          -+-----+---------------+-----+-----+-----+-----+------+------+
          -|   0 | L:ft2         | --> | 2   | 4   |   2 | misc |  no  |
          -+-----+---------------+-----+-----+-----+-----+------+------+
          -
          -
          -
          - -
          -
          -extract_feature(n)[source]
          -

          Extract feature and return a new SeqRecord object.

          -
          -
          Parameters:
          -
            -
          • n (int)

          • -
          • extract (Indicates the feature to)

          • -
          -
          -
          -

          Examples

          -
          >>> from pydna.seqrecord import SeqRecord
          ->>> a=SeqRecord("atgtaa")
          ->>> a.add_feature(2,4)
          ->>> b=a.extract_feature(0)
          ->>> b
          -SeqRecord(seq=Seq('gt'), id='ft2', name='part_name',
          -          description='description', dbxrefs=[])
          -
          -
          -
          - -
          -
          -sorted_features()[source]
          -

          Return a list of the features sorted by start position.

          -

          Examples

          -
          >>> from pydna.seqrecord import SeqRecord
          ->>> a=SeqRecord("atgtaa")
          ->>> a.add_feature(3,4)
          ->>> a.add_feature(2,4)
          ->>> print(a.features)
          -[SeqFeature(SimpleLocation(ExactPosition(3), ExactPosition(4),
          -                           strand=1),
          -            type='misc', qualifiers=...),
          - SeqFeature(SimpleLocation(ExactPosition(2), ExactPosition(4),
          -                           strand=1),
          -            type='misc', qualifiers=...)]
          ->>> print(a.sorted_features())
          -[SeqFeature(SimpleLocation(ExactPosition(2), ExactPosition(4),
          -                           strand=1),
          -            type='misc', qualifiers=...),
          - SeqFeature(SimpleLocation(ExactPosition(3), ExactPosition(4),
          -                           strand=1),
          -            type='misc', qualifiers=...)]
          -
          -
          -
          - -
          -
          -seguid()[source]
          -

          Return the url safe SEGUID [9] for the sequence.

          -

          This checksum is the same as seguid but with base64.urlsafe -encoding instead of the normal base 64. This means that -the characters + and / are replaced with - and _ so that -the checksum can be a part of and URL or a filename.

          -

          Examples

          -
          >>> from pydna.seqrecord import SeqRecord
          ->>> a=SeqRecord("gattaca")
          ->>> a.seguid() # original seguid is +bKGnebMkia5kNg/gF7IORXMnIU
          -'lsseguid=tp2jzeCM2e3W4yxtrrx09CMKa_8'
          -
          -
          -

          References

          - -
          - -
          -
          -comment(newcomment='')[source]
          -

          docstring.

          -
          - -
          -
          -datefunction()[source]
          -

          docstring.

          -
          - -
          -
          -stamp(now=datefunction, tool='pydna', separator=' ', comment='')[source]
          -

          Add seguid checksum to COMMENTS sections

          -

          The checksum is stored in object.annotations[“comment”]. -This shows in the COMMENTS section of a formatted genbank file.

          -

          For blunt linear sequences:

          -

          SEGUID <seguid>

          -

          For circular sequences:

          -

          cSEGUID <seguid>

          -

          Fore linear sequences which are not blunt:

          -

          lSEGUID <seguid>

          -

          Examples

          -
          >>> from pydna.seqrecord import SeqRecord
          ->>> a = SeqRecord("aa")
          ->>> a.stamp()
          -'lsseguid=gBw0Jp907Tg_yX3jNgS4qQWttjU'
          ->>> a.annotations["comment"][:41]
          -'pydna lsseguid=gBw0Jp907Tg_yX3jNgS4qQWttj'
          -
          -
          -
          - -
          -
          -lcs(other, *args, limit=25, **kwargs)[source]
          -

          Return the longest common substring between the sequence.

          -

          and another sequence (other). The other sequence can be a string, -Seq, SeqRecord, Dseq or DseqRecord. -The method returns a SeqFeature with type “read” as this method -is mostly used to map sequence reads to the sequence. This can be -changed by passing a type as keyword with some other string value.

          -

          Examples

          -
          >>> from pydna.seqrecord import SeqRecord
          ->>> a = SeqRecord("GGATCC")
          ->>> a.lcs("GGATCC", limit=6)
          -SeqFeature(SimpleLocation(ExactPosition(0),
          -                          ExactPosition(6), strand=1),
          -                          type='read',
          -                          qualifiers=...)
          ->>> a.lcs("GATC", limit=4)
          -SeqFeature(SimpleLocation(ExactPosition(1),
          -                          ExactPosition(5), strand=1),
          -                          type='read',
          -                          qualifiers=...)
          ->>> a = SeqRecord("CCCCC")
          ->>> a.lcs("GGATCC", limit=6)
          -SeqFeature(None)
          -
          -
          -
          - -
          -
          -gc()[source]
          -

          Return GC content.

          -
          - -
          -
          -cai(organism='sce')[source]
          -

          docstring.

          -
          - -
          -
          -rarecodons(organism='sce')[source]
          -

          docstring.

          -
          - -
          -
          -startcodon(organism='sce')[source]
          -

          docstring.

          -
          - -
          -
          -stopcodon(organism='sce')[source]
          -

          docstring.

          -
          - -
          -
          -express(organism='sce')[source]
          -

          docstring.

          -
          - -
          -
          -copy()[source]
          -

          docstring.

          -
          - -
          -
          -dump(filename, protocol=None)[source]
          -

          docstring.

          -
          - -
          - -
          -
          -class pydna.seqrecord.ProteinSeqRecord(seq, *args, id='id', name='name', description='description', **kwargs)[source]
          -

          Bases: SeqRecord

          -
          -
          -reverse_complement(*args, **kwargs)[source]
          -

          Return the reverse complement of the sequence.

          -
          - -
          -
          -rc(*args, **kwargs)
          -

          Return the reverse complement of the sequence.

          -
          - -
          -
          -isorf(*args, **kwargs)[source]
          -

          Detect if sequence is an open reading frame (orf) in the 5’-3’.

          -

          direction.

          -

          Translation tables are numbers according to the NCBI numbering [10].

          -
          -
          Parameters:
          -

          table (int) – Sets the translation table, default is 1 (standard code)

          -
          -
          Returns:
          -

          True if sequence is an orf, False otherwise.

          -
          -
          Return type:
          -

          bool

          -
          -
          -

          Examples

          -
          >>> from pydna.seqrecord import SeqRecord
          ->>> a=SeqRecord("atgtaa")
          ->>> a.isorf()
          -True
          ->>> b=SeqRecord("atgaaa")
          ->>> b.isorf()
          -False
          ->>> c=SeqRecord("atttaa")
          ->>> c.isorf()
          -False
          -
          -
          -

          References

          - -
          - -
          -
          -gc()[source]
          -

          Return GC content.

          -
          - -
          -
          -cai(*args, **kwargs)[source]
          -

          docstring.

          -
          - -
          -
          -rarecodons(*args, **kwargs)[source]
          -

          docstring.

          -
          - -
          -
          -startcodon(*args, **kwargs)[source]
          -

          docstring.

          -
          - -
          -
          -stopcodon(*args, **kwargs)[source]
          -

          docstring.

          -
          - -
          -
          -express(*args, **kwargs)[source]
          -

          docstring.

          -
          - -
          - -
          -
          -

          pydna.tm module

          -

          This module provide functions for melting temperature calculations.

          -
          -
          -pydna.tm.tm_default(seq, check=True, strict=True, c_seq=None, shift=0, nn_table=_mt.DNA_NN4, tmm_table=None, imm_table=None, de_table=None, dnac1=500 / 2, dnac2=500 / 2, selfcomp=False, Na=40, K=0, Tris=75.0, Mg=1.5, dNTPs=0.8, saltcorr=7, func=_mt.Tm_NN)[source]
          -
          - -
          -
          -pydna.tm.tm_dbd(seq, check=True, strict=True, c_seq=None, shift=0, nn_table=_mt.DNA_NN3, tmm_table=None, imm_table=None, de_table=None, dnac1=250, dnac2=250, selfcomp=False, Na=50, K=0, Tris=0, Mg=1.5, dNTPs=0.8, saltcorr=1, func=_mt.Tm_NN)[source]
          -
          - -
          -
          -pydna.tm.tm_product(seq: str, K=0.050)[source]
          -

          Tm calculation for the amplicon.

          -

          according to:

          -

          Rychlik, Spencer, and Rhoads, 1990, Optimization of the anneal -ing temperature for DNA amplification in vitro -http://www.ncbi.nlm.nih.gov/pubmed/2243783

          -
          - -
          -
          -pydna.tm.ta_default(fp: str, rp: str, seq: str, tm=tm_default, tm_product=tm_product)[source]
          -

          Ta calculation.

          -

          according to:

          -

          Rychlik, Spencer, and Rhoads, 1990, Optimization of the anneal -ing temperature for DNA amplification in vitro -http://www.ncbi.nlm.nih.gov/pubmed/2243783

          -

          The formula described uses the length and GC content of the product and -salt concentration (monovalent cations)

          -
          - -
          -
          -pydna.tm.ta_dbd(fp, rp, seq, tm=tm_dbd, tm_product=None)[source]
          -
          - -
          -
          -pydna.tm.program(amplicon, tm=tm_default, ta=ta_default)[source]
          -

          Returns a string containing a text representation of a suggested -PCR program using Taq or similar polymerase.

          -
          |95°C|95°C               |    |tmf:59.5
          -|____|_____          72°C|72°C|tmr:59.7
          -|3min|30s  \ 59.1°C _____|____|60s/kb
          -|    |      \______/ 0:32|5min|GC 51%
          -|    |       30s         |    |1051bp
          -
          -
          -
          - -
          -
          -pydna.tm.taq_program(amplicon, tm=tm_default, ta=ta_default)
          -

          Returns a string containing a text representation of a suggested -PCR program using Taq or similar polymerase.

          -
          |95°C|95°C               |    |tmf:59.5
          -|____|_____          72°C|72°C|tmr:59.7
          -|3min|30s  \ 59.1°C _____|____|60s/kb
          -|    |      \______/ 0:32|5min|GC 51%
          -|    |       30s         |    |1051bp
          -
          -
          -
          - -
          -
          -pydna.tm.dbd_program(amplicon, tm=tm_dbd, ta=ta_dbd)[source]
          -

          Text representation of a suggested PCR program.

          -

          Using a polymerase with a DNA binding domain such as Pfu-Sso7d.

          -
          |98°C|98°C               |    |tmf:53.8
          -|____|_____          72°C|72°C|tmr:54.8
          -|30s |10s  \ 57.0°C _____|____|15s/kb
          -|    |      \______/ 0:15|5min|GC 51%
          -|    |       10s         |    |1051bp
          -
          -|98°C|98°C      |    |tmf:82.5
          -|____|____      |    |tmr:84.4
          -|30s |10s \ 72°C|72°C|15s/kb
          -|    |     \____|____|GC 52%
          -|    |      3:45|5min|15058bp
          -
          -
          -
          - -
          -
          -pydna.tm.pfu_sso7d_program(amplicon, tm=tm_dbd, ta=ta_dbd)
          -

          Text representation of a suggested PCR program.

          -

          Using a polymerase with a DNA binding domain such as Pfu-Sso7d.

          -
          |98°C|98°C               |    |tmf:53.8
          -|____|_____          72°C|72°C|tmr:54.8
          -|30s |10s  \ 57.0°C _____|____|15s/kb
          -|    |      \______/ 0:15|5min|GC 51%
          -|    |       10s         |    |1051bp
          -
          -|98°C|98°C      |    |tmf:82.5
          -|____|____      |    |tmr:84.4
          -|30s |10s \ 72°C|72°C|15s/kb
          -|    |     \____|____|GC 52%
          -|    |      3:45|5min|15058bp
          -
          -
          -
          - -
          -
          -pydna.tm.Q5(primer: str, *args, **kwargs)[source]
          -

          For Q5 Ta they take the lower of the two Tms and add 1C -(up to 72C). For Phusion they take the lower of the two -and add 3C (up to 72C).

          -
          - -
          -
          -pydna.tm.tmbresluc(primer: str, *args, primerc=500.0, saltc=50, **kwargs)[source]
          -

          Returns the tm for a primer using a formula adapted to polymerases -with a DNA binding domain, such as the Phusion polymerase.

          -
          -
          Parameters:
          -
            -
          • primer (string) – primer sequence 5’-3’

          • -
          • primerc (float) – primer concentration in nM), set to 500.0 nm by default.

          • -
          • saltc (float, optional) – Monovalent cation concentration in mM, set to 50.0 mM by default.

          • -
          • thermodynamics (bool, optional) – prints details of the thermodynamic data to stdout. For -debugging only.

          • -
          -
          -
          Returns:
          -

          tm – the tm of the primer

          -
          -
          Return type:
          -

          float

          -
          -
          -
          - -
          -
          -pydna.tm.tm_neb(primer, conc=0.5, prodcode='q5-0')[source]
          -

          Calculates a single primers melting temp from NEB.

          -
          -
          Parameters:
          -
          -
          -
          Returns:
          -

          tm – primer melting temperature

          -
          -
          Return type:
          -

          int

          -
          -
          -
          - -
          -
          -

          pydna.utils module

          -

          Miscellaneous functions.

          -
          -
          -pydna.utils.three_frame_orfs(dna: str, limit: int = 100, startcodons: tuple = ('ATG',), stopcodons: tuple = ('TAG', 'TAA', 'TGA'))[source]
          -

          Overlapping orfs in three frames.

          -
          - -
          -
          -pydna.utils.shift_location(original_location, shift, lim)[source]
          -

          docstring.

          -
          - -
          -
          -pydna.utils.shift_feature(feature, shift, lim)[source]
          -

          Return a new feature with shifted location.

          -
          - -
          -
          -pydna.utils.smallest_rotation(s)[source]
          -

          Smallest rotation of a string.

          -

          Algorithm described in Pierre Duval, Jean. 1983. Factorizing Words -over an Ordered Alphabet. Journal of Algorithms & Computational Technology -4 (4) (December 1): 363–381. and Algorithms on strings and sequences based -on Lyndon words, David Eppstein 2011. -https://gist.github.com/dvberkel/1950267

          -

          Examples

          -
          >>> from pydna.utils import smallest_rotation
          ->>> smallest_rotation("taaa")
          -'aaat'
          -
          -
          -
          - -
          -
          -pydna.utils.cai(seq: str, organism: str = 'sce', weights: dict = _weights)[source]
          -

          docstring.

          -
          - -
          -
          -pydna.utils.rarecodons(seq: str, organism='sce')[source]
          -

          docstring.

          -
          - -
          -
          -pydna.utils.express(seq: str, organism='sce')[source]
          -

          docstring.

          -

          NOT IMPLEMENTED YET

          -
          - -
          -
          -pydna.utils.open_folder(pth)[source]
          -

          docstring.

          -
          - -
          -
          -pydna.utils.rc(sequence: StrOrBytes) StrOrBytes[source]
          -

          Reverse complement.

          -

          accepts mixed DNA/RNA

          -
          - -
          -
          -pydna.utils.complement(sequence: str)[source]
          -

          Complement.

          -

          accepts mixed DNA/RNA

          -
          - -
          -
          -pydna.utils.memorize(filename)[source]
          -

          Cache functions and classes.

          -

          see pydna.download

          -
          - -
          -
          -pydna.utils.identifier_from_string(s: str) str[source]
          -

          Return a valid python identifier.

          -

          based on the argument s or an empty string

          -
          - -
          -
          -pydna.utils.flatten(*args) List[source]
          -

          Flattens an iterable of iterables.

          -

          Down to str, bytes, bytearray or any of the pydna or Biopython seq objects

          -
          - -
          -
          -pydna.utils.seq31(seq)[source]
          -

          Turn a three letter code protein sequence into one with one letter code.

          -

          The single input argument ‘seq’ should be a protein sequence using single -letter codes, as a python string.

          -

          This function returns the amino acid sequence as a string using the one -letter amino acid codes. Output follows the IUPAC standard (including -ambiguous characters B for “Asx”, J for “Xle” and X for “Xaa”, and also U -for “Sel” and O for “Pyl”) plus “Ter” for a terminator given as an -asterisk.

          -

          Any unknown -character (including possible gap characters), is changed into ‘Xaa’.

          -

          Examples

          -
          >>> from Bio.SeqUtils import seq3
          ->>> seq3("MAIVMGRWKGAR*")
          -'MetAlaIleValMetGlyArgTrpLysGlyAlaArgTer'
          ->>> from pydna.utils import seq31
          ->>> seq31('MetAlaIleValMetGlyArgTrpLysGlyAlaArgTer')
          -'M  A  I  V  M  G  R  W  K  G  A  R  *'
          -
          -
          -
          - -
          -
          -pydna.utils.randomRNA(length, maxlength=None)[source]
          -

          docstring.

          -
          - -
          -
          -pydna.utils.randomDNA(length, maxlength=None)[source]
          -

          docstring.

          -
          - -
          -
          -pydna.utils.randomORF(length, maxlength=None)[source]
          -

          docstring.

          -
          - -
          -
          -pydna.utils.randomprot(length, maxlength=None)[source]
          -

          docstring.

          -
          - -
          -
          -pydna.utils.eq(*args, **kwargs)[source]
          -

          Compare two or more DNA sequences for equality.

          -

          Compares two or more DNA sequences for equality i.e. if they -represent the same double stranded DNA molecule.

          -
          -
          Parameters:
          -
            -
          • args (iterable) – iterable containing sequences -args can be strings, Biopython Seq or SeqRecord, Dseqrecord -or dsDNA objects.

          • -
          • circular (bool, optional) – Consider all molecules circular or linear

          • -
          • linear (bool, optional) – Consider all molecules circular or linear

          • -
          -
          -
          Returns:
          -

          eq – Returns True or False

          -
          -
          Return type:
          -

          bool

          -
          -
          -

          Notes

          -

          Compares two or more DNA sequences for equality i.e. if they -represent the same DNA molecule.

          -

          Two linear sequences are considiered equal if either:

          -
            -
          1. They have the same sequence (case insensitive)

          2. -
          3. One sequence is the reverse complement of the other

          4. -
          -

          Two circular sequences are considered equal if they are circular -permutations meaning that they have the same length and:

          -
            -
          1. One sequence can be found in the concatenation of the other sequence with itself.

          2. -
          3. The reverse complement of one sequence can be found in the concatenation of the other sequence with itself.

          4. -
          -

          The topology for the comparison can be set using one of the keywords -linear or circular to True or False.

          -

          If circular or linear is not set, it will be deduced from the topology of -each sequence for sequences that have a linear or circular attribute -(like Dseq and Dseqrecord).

          -

          Examples

          -
          >>> from pydna.dseqrecord import Dseqrecord
          ->>> from pydna.utils import eq
          ->>> eq("aaa","AAA")
          -True
          ->>> eq("aaa","AAA","TTT")
          -True
          ->>> eq("aaa","AAA","TTT","tTt")
          -True
          ->>> eq("aaa","AAA","TTT","tTt", linear=True)
          -True
          ->>> eq("Taaa","aTaa", linear = True)
          -False
          ->>> eq("Taaa","aTaa", circular = True)
          -True
          ->>> a=Dseqrecord("Taaa")
          ->>> b=Dseqrecord("aTaa")
          ->>> eq(a,b)
          -False
          ->>> eq(a,b,circular=True)
          -True
          ->>> a=a.looped()
          ->>> b=b.looped()
          ->>> eq(a,b)
          -True
          ->>> eq(a,b,circular=False)
          -False
          ->>> eq(a,b,linear=True)
          -False
          ->>> eq(a,b,linear=False)
          -True
          ->>> eq("ggatcc","GGATCC")
          -True
          ->>> eq("ggatcca","GGATCCa")
          -True
          ->>> eq("ggatcca","tGGATCC")
          -True
          -
          -
          -
          - -
          -
          -pydna.utils.cuts_overlap(left_cut, right_cut, seq_len)[source]
          -
          - -
          -
          -pydna.utils.location_boundaries(loc: SimpleLocation | CompoundLocation)[source]
          -
          - -
          -
          -pydna.utils.locations_overlap(loc1: SimpleLocation | CompoundLocation, loc2: SimpleLocation | CompoundLocation, seq_len)[source]
          -
          - -
          -
          -
          -

          Indices and tables

          -
          -
          +

          diff --git a/installation.html b/installation.html index 4ed16c5a..46667436 100644 --- a/installation.html +++ b/installation.html @@ -9,9 +9,10 @@ Installation — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -20,7 +21,7 @@ - + @@ -47,15 +48,12 @@ @@ -87,10 +85,13 @@

          Installation

          By default, pydna is installed with minimal dependencies, but there are optional dependencies for additional functionality.

          +
          +

          Optional dependencies

          Click here to see optional dependencies -
          -

          clipboard

          + +
          +

          clipboard

          Enables the pydna.dseqrecord.Dseqrecord.copy_gb_to_clipboard() and pydna.dseqrecord.Dseqrecord.copy_fasta_to_clipboard()

          These methods will put a copy the sequence on the clipboard in either Genbank (gb) or fasta format.

          @@ -105,9 +106,8 @@

          clipboard

          -
          -
          -

          download

          +
          +

          download

          Pyparsing enables the pydna.genbankfixer.gbtext_clean() function that can automatically correct malformed sequence files in Genbank format. These are often found online, so this option also installs requests to enable the pydna.genbankfixer.download.download_text() function which can be used to get cleaned up text from a URL.

          @@ -126,16 +126,14 @@

          download -

          -
          -

          express

          +
          +

          express

          This option enables the pydna.utils.cai() function and the cai() method available from subclasses of pydna.seqrecord.SeqRecord, such as pydna.dseqrecord.Dseqrecord.

          | cai2 | codon adaptation index calculations in several modules |

          -
          -
          -

          gel

          +
          +

          gel

          Scipy, matplotlib and pillow (PIL) enable the generation of gel images. Numpy is also needed, but usually installed as a dependency of biopython.

          @@ -156,6 +154,7 @@

          gel

          +
          @@ -191,7 +190,7 @@

          Installing with poetry 🧙‍♂️ - +


        diff --git a/markdown_notebooks/CRISPR.html b/markdown_notebooks/CRISPR.html index 9145430e..1be05c97 100644 --- a/markdown_notebooks/CRISPR.html +++ b/markdown_notebooks/CRISPR.html @@ -9,9 +9,10 @@ How to Model CRISPR-Cas9 Experiments in pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -45,7 +46,7 @@ diff --git a/markdown_notebooks/Dseq.html b/markdown_notebooks/Dseq.html index 1dd45224..c7b883a0 100644 --- a/markdown_notebooks/Dseq.html +++ b/markdown_notebooks/Dseq.html @@ -9,9 +9,10 @@ Representing sequences in pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -45,7 +46,7 @@ @@ -330,7 +331,7 @@

        Slicing sequences (
        Dseq(-8)
        - acgt
        + acgttcc
         atgcaagg
         

        diff --git a/markdown_notebooks/Dseq_Features.html b/markdown_notebooks/Dseq_Features.html index 2726fece..6b6f9ff3 100644 --- a/markdown_notebooks/Dseq_Features.html +++ b/markdown_notebooks/Dseq_Features.html @@ -9,9 +9,10 @@ Working with Features using the Dseqrecord class — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -45,7 +46,7 @@ diff --git a/markdown_notebooks/Example_CRISPR.html b/markdown_notebooks/Example_CRISPR.html index 36ad1d7d..f20a8937 100644 --- a/markdown_notebooks/Example_CRISPR.html +++ b/markdown_notebooks/Example_CRISPR.html @@ -9,9 +9,10 @@ Implementation of Oligonucleotide-based CRISPR-Cas9 toolbox for efficient engineering of Komagataella phaffii — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -45,7 +46,7 @@ diff --git a/markdown_notebooks/Example_Gibson.html b/markdown_notebooks/Example_Gibson.html index 82d11da8..618457ae 100644 --- a/markdown_notebooks/Example_Gibson.html +++ b/markdown_notebooks/Example_Gibson.html @@ -9,9 +9,10 @@ Example of a Gibson Assembly in pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -45,7 +46,7 @@ @@ -102,24 +103,63 @@

        Example of a Gibson Assembly in pydnafrom pydna.amplify import pcr from pydna.dseqrecord import Dseqrecord from pydna.assembly import Assembly +from pydna.genbank import Genbank +from pydna.gel import gel +from pydna.ladders import GeneRuler_1kb_plus +

        -
        # Parsing the files
        -
        -pCC1BAC_path = "./pCC1BAC.gb"
        -gene_path = "./R_cellulolyticum.fasta"
        -pCC1BAC_docs = parse(pCC1BAC_path)
        -gene_docs = parse(gene_path)
        -
        -# Printing the parsed files
        -
        -print(pCC1BAC_docs[0].format("gb"))
        -# print(gene_docs[0].format("fasta"))
        +
        # Reading the R. cellulolyticum genome from GenBank
        +gb = Genbank("example@example.com")
        +genome = gb.nucleotide("CP001348.1")
        +# Print the info of the genome
        +genome.annotations
        +
        +
        +
        {'molecule_type': 'DNA',
        + 'topology': 'circular',
        + 'data_file_division': 'BCT',
        + 'date': '25-AUG-2017',
        + 'accessions': ['CP001348', 'AAVC01000000', 'AAVC01000001-AAVC01000121'],
        + 'sequence_version': 1,
        + 'keywords': [''],
        + 'source': 'Ruminiclostridium cellulolyticum H10',
        + 'organism': 'Ruminiclostridium cellulolyticum H10',
        + 'taxonomy': ['Bacteria',
        +  'Bacillota',
        +  'Clostridia',
        +  'Eubacteriales',
        +  'Oscillospiraceae',
        +  'Ruminiclostridium'],
        + 'references': [Reference(title='Complete sequence of Clostridium cellulolyticum H10', ...),
        +  Reference(title='Direct Submission', ...)],
        + 'comment': 'URL -- http://www.jgi.doe.gov\nJGI Project ID: 4002584\nSource DNA and bacteria available from Jizhong Zhou\n(jzhou@rccc.ou.edu)\nContacts: Jizhong Zhou (jzhou@rccc.ou.edu)\n          David Bruce (microbe@cuba.jgi-psf.org)\nAnnotation done by JGI-ORNL and JGI-PGF\nFinishing done by JGI-LANL\nFinished microbial genomes have been curated to close all gaps with\ngreater than 98% coverage of at least two independent clones. Each\nbase pair has a minimum q (quality) value of 30 and the total error\nrate is less than one per 50000.\nThe JGI and collaborators endorse the principles for the\ndistribution and use of large scale sequencing data adopted by the\nlarger genome sequencing community and urge users of this data to\nfollow them. it is our intention to publish the work of this\nproject in a timely fashion and we welcome collaborative\ninteraction on the project and analysis.\n(http://www.genome.gov/page.cfm?pageID=10506376).'}
        +
        +
        +
        # Reading the plasmid
        +vector = parse("./pCC1BAC.gb")[0]
        +vector.annotations
        +
        +
        +
        {'molecule_type': 'DNA',
        + 'topology': 'circular',
        + 'data_file_division': 'SYN',
        + 'date': '29-AUG-2024',
        + 'accessions': ['.'],
        + 'keywords': [''],
        + 'source': 'synthetic DNA construct',
        + 'organism': 'synthetic DNA construct',
        + 'taxonomy': [],
        + 'references': [Reference(title='Direct Submission', ...),
        +  Reference(title='Direct Submission', ...),
        +  Reference(title='Direct Submission', ...),
        +  Reference(title='Direct Submission', ...)],
        + 'comment': 'SGRef: number: 1; type: "Journal Article"; journalName: "Submitted\n(23-AUG-2007) 726 Post Road, Madison, WI 53713, USA"\nSGRef: number: 2; type: "Journal Article"\nSGRef: number: 3; type: "Journal Article"'}
         
        -
        # (Optional) Checking that the primer Tm are matching
        +
        # Getting the PCR products from the genome (might take a while since the genome is large)
         
        -print(tm_default(F1_For)) # F1_For and F1_Rev have been used as examples here
        -print(tm_default(F1_Rev))
        -
        -
        -
        # Checking primer specificity using the pcr function. An error message is returned if otherwise.
        -
        -pcr_product_F1 = pcr(F1_For, F1_Rev, gene_docs[0], limit=40)
        -pcr_product_F2 = pcr(F2_For, F2_Rev, gene_docs[0], limit=40)
        -pcr_product_F3 = pcr(F3_For, F3_Rev, gene_docs[0], limit=40)
        -pcr_product_BAC = pcr(BACF1_For, BACF3_Rev, pCC1BAC_docs[0], limit=69)
        +pcr_product_F1 = pcr(F1_For, F1_Rev, genome, limit=20)
        +pcr_product_F2 = pcr(F2_For, F2_Rev, genome, limit=20)
        +pcr_product_F3 = pcr(F3_For, F3_Rev, genome, limit=20)
        +pcr_product_BAC = pcr(BACF1_For, BACF3_Rev, vector, limit=20)
         
        -# Printing out the PCR results
        -
        -print(pcr_product_F1.format("gb"))
        -print(pcr_product_F2.format("gb"))
        -print(pcr_product_F3.format("gb"))
        -print(pcr_product_BAC.format("fasta"))
        +# Printing out the PCR fragment sizes
        +print(len(pcr_product_F1))
        +print(len(pcr_product_F2))
        +print(len(pcr_product_F3))
        +print(len(pcr_product_BAC))
         
         
        +
        5210
        +5384
        +5172
        +8221
        +
        +
        +
        # Making a gel to show the PCR products
        +im = gel(
        +    [
        +        GeneRuler_1kb_plus,
        +        [pcr_product_F1],
        +        [pcr_product_F2],
        +        [pcr_product_F3],
        +        [pcr_product_BAC],
        +    ]
        +)
        +im.rotate(90, expand=1)
        +
        +
        +

        png

        +
        Dseqrecord
        +circular: True
        +size: 23827
        +ID: id
        +Name: name
        +Description: description
        +Number of features: 28
        +/molecule_type=DNA
        +Dseq(o23827)
        +GCAG..ccgc
        +CGTC..ggcg
        +
        +
        diff --git a/markdown_notebooks/Example_Restriction.html b/markdown_notebooks/Example_Restriction.html index d8f7f17d..7e7669f2 100644 --- a/markdown_notebooks/Example_Restriction.html +++ b/markdown_notebooks/Example_Restriction.html @@ -9,9 +9,10 @@ Example of a Plasmid Restriction/Ligation Cloning — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -45,7 +46,7 @@
        @@ -664,7 +665,7 @@

        Example of a Plasmid Restriction/Ligation CloningExample of a Plasmid Restriction/Ligation CloningExample of a Plasmid Restriction/Ligation CloningGibson Assembly in pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -45,7 +46,7 @@ diff --git a/markdown_notebooks/Importing_Seqs.html b/markdown_notebooks/Importing_Seqs.html index 4ab00b47..f3e48005 100644 --- a/markdown_notebooks/Importing_Seqs.html +++ b/markdown_notebooks/Importing_Seqs.html @@ -9,9 +9,10 @@ Importing and viewing sequence files in pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -45,7 +46,7 @@ diff --git a/markdown_notebooks/PCR.html b/markdown_notebooks/PCR.html index b980e36e..25d91ac5 100644 --- a/markdown_notebooks/PCR.html +++ b/markdown_notebooks/PCR.html @@ -9,9 +9,10 @@ How to Perform a Polymerase Chain Reaction (PCR) — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -45,7 +46,7 @@ diff --git a/markdown_notebooks/Restrict_Ligate_Cloning.html b/markdown_notebooks/Restrict_Ligate_Cloning.html index 06729705..deddc200 100644 --- a/markdown_notebooks/Restrict_Ligate_Cloning.html +++ b/markdown_notebooks/Restrict_Ligate_Cloning.html @@ -9,9 +9,10 @@ Restriction and Ligation — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -45,7 +46,7 @@ diff --git a/markdown_notebooks/primer_design.html b/markdown_notebooks/primer_design.html new file mode 100644 index 00000000..2fecd80c --- /dev/null +++ b/markdown_notebooks/primer_design.html @@ -0,0 +1,390 @@ + + + + + + + + + Primer design in pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        Primer design in pydna

        +

        You can use pydna for primer design in different contexts, let’s start with some basic primer functionalities.

        +
        +

        Checking the Tm of a primer

        +

        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) 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.

        +
        from pydna.tm import tm_default
        +
        +# The primers from the readme example
        +print(tm_default("ATGCAAACAGTAATGATGGA"))
        +print(tm_default("ATTATCTTTTTCAGCAATAGAATCA"))
        +
        +
        +
        +
        55.047602641480864
        +54.55481807340169
        +
        +
        +
        +

        Using NEB Tm calculator

        +

        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:

        +
          +
        • primer: The primer sequence.

        • +
        • conc: The primer concentration.

        • +
        • prodcode: The product code, which you can find on NEB’s website.

        • +
        +
        +

        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.

        +
        +
        from pydna.tm import tm_neb
        +
        +print(tm_neb("ATGCAAACAGTAATGATGGA", 0.5, "q5-0"))
        +print(tm_neb("ATTATCTTTTTCAGCAATAGAATCA", 0.5, "q5-0"))
        +
        +
        +
        +
        59
        +57
        +
        +
        +
        +
        +
        +

        Designing primers for PCR

        +

        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).

        +
        from pydna.dseqrecord import Dseqrecord
        +from Bio.SeqFeature import SeqFeature, SimpleLocation
        +from pydna.design import primer_design
        +
        +dna = Dseqrecord("ggttcaATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAATAAcatttacatca")
        +
        +# Let's add a feature representing the CDS
        +dna.features.append(SeqFeature(SimpleLocation(start=6, end=60), type="CDS"))
        +
        +# To design the primer, we extract the template sequence we want to amplify, and use the `primer_design` method.
        +template = dna.features[0].location.extract(dna)
        +
        +# We get an amplicon object (a subclass of Dseqrecord), that also contains extra info
        +# of where the primers align etc.
        +amplicon = primer_design(template, target_tm=60.0, limit=15)
        +
        +# We extract the primers
        +fwd_primer, rvs_primer = amplicon.primers()
        +
        +# We print the Tms
        +print("Forward primer Tm:", tm_default(fwd_primer.seq))
        +print("Forward primer sequence:", fwd_primer.seq)
        +print()
        +print("Reverse primer Tm:", tm_default(rvs_primer.seq))
        +print("Reverse primer sequence:", rvs_primer.seq)
        +
        +
        +
        Forward primer Tm: 59.71997924024873
        +Forward primer sequence: ATGCAAACAGTAATGATGGATGAC
        +
        +Reverse primer Tm: 60.22377911083646
        +Reverse primer sequence: TTATTCAGCAATAGAATCAGTGCTTTG
        +
        +
        +
        +

        Special primers

        +

        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.

        +
        +

        Restriction enzyme

        +

        Simply append the sequence you want at the 5’ end of the primers.

        +
        from Bio.Restriction import EcoRI
        +fwd_primer_EcoRI = 'ttGAATTC' + fwd_primer
        +# You can also do it like this!
        +rvs_primer_EcoRI = 'tt' + EcoRI.site + rvs_primer
        +
        +print(fwd_primer_EcoRI.seq)
        +print(rvs_primer_EcoRI.seq)
        +
        +
        +
        +
        ttGAATTCATGCAAACAGTAATGATGGATGAC
        +ttGAATTCTTATTCAGCAATAGAATCAGTGCTTTG
        +
        +
        +
        +

        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.

        +
        +
        +
        +

        Gibson Assembly

        +

        To design primers for Gibson Assembly, you can use the assembly_fragments function.

        +
        +
        Linear Gibson Assembly
        +
        from pydna.design import assembly_fragments
        +# Let's imagine we want to join these two sequences together linearly with Gibson Assembly
        +seq1 = Dseqrecord('ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAAT')
        +seq2 = Dseqrecord('CACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAAGCAT')
        +
        +# First, we design primers for each fragment, as before:
        +pre_amplicon1 = primer_design(seq1, target_tm=60.0, limit=15)
        +pre_amplicon2 = primer_design(seq2, target_tm=60.0, limit=15)
        +
        +# Then, we use the `assembly_fragments` function to design primers for Gibson Assembly
        +amplicon1, amplicon2 = assembly_fragments([pre_amplicon1, pre_amplicon2], overlap=10)
        +
        +# We print the primers:
        +fwd_1, rvs_1 = amplicon1.primers()
        +fwd_2, rvs_2 = amplicon2.primers()
        +
        +print('Primers for fragment 1:')
        +print(fwd_1.seq)
        +print(rvs_1.seq)
        +print()
        +print('Primers for fragment 2:')
        +print(fwd_2.seq)
        +print(rvs_2.seq)
        +print()
        +
        +# The amplicons contain the PCR products (note the overlap between the two fragments)
        +print('PCR product 1:')
        +print(amplicon1.seq)
        +print()
        +print('PCR product 2:')
        +print(amplicon2.seq)
        +print()
        +
        +print('Overlap')
        +print(amplicon1.seq)
        +print(' '*55,amplicon2.seq, sep='')
        +
        +
        +
        +
        Primers for fragment 1:
        +ATGCAAACAGTAATGATGGATGAC
        +GAGTGATTATCTTTTTCAGCAATAGAATCAGTGC
        +
        +Primers for fragment 2:
        +ATAATCACTCTAATAATGAATCTAACTTTACTTGGAAA
        +ATGCTTTTCCACTTGTTCACG
        +
        +PCR product 1:
        +ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATCACTC
        +
        +PCR product 2:
        +ATAATCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAAGCAT
        +
        +Overlap
        +ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATCACTC
        +                                                       ATAATCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAAGCAT
        +
        +
        +

        Once you have the amplicons, you can use Assembly to join them together (see the Gibson notebook for more details)

        +
        from pydna.assembly import Assembly
        +from pydna.common_sub_strings import terminal_overlap
        +
        +
        +assembly = Assembly([amplicon1, amplicon2], limit=10, algorithm=terminal_overlap)
        +product = assembly.assemble_linear()[0]
        +print(product.figure())
        +
        +print()
        +
        +print(Dseqrecord(product).figure())
        +
        +
        +
        +
        +
        65bp_PCR_prod|10
        +              \/
        +              /\
        +              10|65bp_PCR_prod
        +
        +Dseqrecord(-120)
        +ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAAGCAT
        +TACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTAGTGAGATTATTACTTAGATTGAAATGAACCTTTCGCAAAGCACTTGTTCACCTTTTCGTA
        +
        +
        +
        +
        +
        Circular Gibson Assembly
        +
        # We use the `assembly_fragments` function with `circular=True`
        +amplicon1, amplicon2 = assembly_fragments([pre_amplicon1, pre_amplicon2], overlap=10, circular=True)
        +
        +# We print the primers:
        +fwd_1, rvs_1 = amplicon1.primers()
        +fwd_2, rvs_2 = amplicon2.primers()
        +
        +print('Primers for fragment 1:')
        +print(fwd_1.seq)
        +print(rvs_1.seq)
        +print()
        +print('Primers for fragment 2:')
        +print(fwd_2.seq)
        +print(rvs_2.seq)
        +print()
        +
        +assembly = Assembly([amplicon1, amplicon2], limit=10, algorithm=terminal_overlap)
        +
        +# Here we use assemble_circular!
        +product = assembly.assemble_circular()[0]
        +print(product.figure())
        +
        +print()
        +
        +print(Dseqrecord(product).figure())
        +
        +
        +
        Primers for fragment 1:
        +AGCATATGCAAACAGTAATGATGGATGAC
        +GAGTGATTATCTTTTTCAGCAATAGAATCAGTGC
        +
        +Primers for fragment 2:
        +ATAATCACTCTAATAATGAATCTAACTTTACTTGGAAA
        +TGCATATGCTTTTCCACTTGTTCACG
        +
        + -|70bp_PCR_prod|10
        +|                \/
        +|                /\
        +|                10|70bp_PCR_prod|10
        +|                                 \/
        +|                                 /\
        +|                                 10-
        +|                                    |
        + ------------------------------------
        +
        +Dseqrecord(o120)
        +AGCATATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAA
        +TCGTATACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTAGTGAGATTATTACTTAGATTGAAATGAACCTTTCGCAAAGCACTTGTTCACCTTT
        +
        +
        +
        +
        +
        +

        Adding spacers / linkers to Gibson Assembly primers

        +

        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.

        +
        # We create two spacers as dseqrecords
        +spacer1 = Dseqrecord('aaa')
        +spacer2 = Dseqrecord('ttt')
        +
        +amplicon1, amplicon2 = assembly_fragments([pre_amplicon1, spacer1, pre_amplicon2, spacer2], overlap=10, circular=True)
        +
        +assembly = Assembly([amplicon1, amplicon2], limit=10, algorithm=terminal_overlap)
        +
        +# Here we use assemble_circular!
        +product = assembly.assemble_circular()[0]
        +
        +# See the linkers that have been added
        +print()
        +print(Dseqrecord(product).seq)
        +print(4*' ', '^^^', 60*' ', '^^^', sep='')
        +
        +
        +
        +
        +
        GCATtttATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATaaaCACTCTAATAATGAATCTAACTTTACTTGGAAAGCGTTTCGTGAACAAGTGGAAAA
        +    ^^^                                                            ^^^
        +
        +
        +
        +
        +

        Summary of assembly_fragments behaviour

        +

        The behaviour is summarised in the following graphics for linear and circular assembly.

        +

        assembly_fragments behaviour +assembly_fragments behaviour

        +
        +
        +
        +
        + + +
        +
        +
        + +
        + +
        +

        © Copyright 2024, Björn F. Johansson.

        +
        + + Built with Sphinx using a + theme + provided by Read the Docs. + + +
        +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/markdown_notebooks/readme_example.html b/markdown_notebooks/readme_example.html index 1ea81be6..23415fb8 100644 --- a/markdown_notebooks/readme_example.html +++ b/markdown_notebooks/readme_example.html @@ -9,9 +9,10 @@ README Example — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + @@ -45,7 +46,7 @@ diff --git a/modules/index.html b/modules/index.html new file mode 100644 index 00000000..e12e5c9e --- /dev/null +++ b/modules/index.html @@ -0,0 +1,202 @@ + + + + + + + + + Modules — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + + +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna.html b/modules/pydna.html new file mode 100644 index 00000000..f6150bc4 --- /dev/null +++ b/modules/pydna.html @@ -0,0 +1,369 @@ + + + + + + + + + pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna

        +
        +
        copyright:
        +

        Copyright 2013-2023 by Björn Johansson. All rights reserved.

        +
        +
        license:
        +

        This code is part of the pydna package, governed by the +license in LICENSE.txt that should be included as part +of this package.

        +
        +
        +
        +

        pydna

        +

        Pydna is a python package providing code for simulation of the creation of +recombinant DNA molecules using +molecular biology +techniques. Development of pydna happens in this Github repository.

        +
        +
        Provided:
          +
        1. PCR simulation

        2. +
        3. Assembly simulation based on shared identical sequences

        4. +
        5. Primer design for amplification of a given sequence

        6. +
        7. Automatic design of primer tails for Gibson assembly +or homologous recombination.

        8. +
        9. Restriction digestion and cut&paste cloning

        10. +
        11. Agarose gel simulation

        12. +
        13. Download sequences from Genbank

        14. +
        15. Parsing various sequence formats including the capacity to +handle broken Genbank format

        16. +
        +
        +
        +
        +

        pydna package layout

        +

        The most important modules and how to import functions or classes from +them are listed below. Class names starts with a capital letter, +functions with a lowercase letter:

        +
        from pydna.module import function
        +from pydna.module import Class
        +
        +Example: from pydna.gel import Gel
        +
        +pydna
        +   ├── amplify
        +   │         ├── Anneal
        +   │         └── pcr
        +   ├── assembly
        +   │          └── Assembly
        +   ├── design
        +   │        ├── assembly_fragments
        +   │        └── primer_design
        +   ├── download
        +   │          └── download_text
        +   ├── dseqrecord
        +   │            └── Dseqrecord
        +   ├── gel
        +   │     └── Gel
        +   ├── genbank
        +   │         ├── genbank
        +   │         └── Genbank
        +   ├── parsers
        +   │         ├── parse
        +   │         └── parse_primers
        +   └── readers
        +             ├── read
        +             └── read_primers
        +
        +
        +
        +
        +

        How to use the documentation

        +

        Documentation is available as docstrings provided in the source code for +each module. +These docstrings can be inspected by reading the source code directly. +See further below on how to obtain the code for pydna.

        +

        In the python shell, use the built-in help function to view a +function’s docstring:

        +
        >>> from pydna import readers
        +>>> help(readers.read)
        +... 
        +
        +
        +

        The doctrings are also used to provide an automaticly generated reference +manual available online at +read the docs.

        +

        Docstrings can be explored using IPython, an +advanced Python shell with +TAB-completion and introspection capabilities. To see which functions +are available in pydna, +type pydna.<TAB> (where <TAB> refers to the TAB key). +Use pydna.open_config_folder?<ENTER>`to view the docstring or +`pydna.open_config_folder??<ENTER> to view the source code.

        +

        In the Spyder IDE it is possible +to place the cursor immediately before the name of a module,class or +function and press ctrl+i to bring up docstrings in a separate window in Spyder

        +

        Code snippets are indicated by three greater-than signs:

        +
        >>> x=41
        +>>> x=x+1
        +>>> x
        +42
        +
        +
        +
        +
        +

        pydna source code

        +

        The pydna source code is +available on Github.

        +
        +
        +

        How to get more help

        +

        Please join the +Google group +for pydna, this is the preferred location for help. If you find bugs +in pydna itself, open an issue at the +Github repository.

        +
        +
        +

        Examples of pydna in use

        +
        +
        See this repository for a collection of

        examples.

        +
        +
        +
        +
        +
        +
        +pydna.open_current_folder()[source]
        +

        Open the current working directory.

        +

        Opens in the default file manager. The location for this folder is +given by the os.getcwd() function

        +
        + +
        +
        +pydna.open_cache_folder()[source]
        +

        Open the pydna cache folder.

        +

        Opens in the default file manager. The location for this folder is stored +in the pydna_data_dir environmental variable.

        +
        + +
        +
        +pydna.open_config_folder()[source]
        +

        Open the pydna configuration folder.

        +

        Opens in the default file manager. The location for this folder is stored +in the pydna_config_dir environmental variable.

        +

        The pydna.ini file can be edited to make pydna quicker to use. +See the documentation of the :class:configparser.ConfigParser´ class.

        +

        Below is the content of a typical pydna.ini file on a Linux +system.

        +
        [main]
        +loglevel=30
        +email=myemail@example.org
        +data_dir=/home/bjorn/.local/share/pydna
        +log_dir=/home/bjorn/.cache/pydna/log
        +ape=tclsh /home/bjorn/.ApE/AppMain.tcl
        +cached_funcs=Genbank_nucleotide
        +primers=/home/bjorn/Dropbox/wikidata/PRIMERS.txt
        +enzymes=/home/bjorn/Dropbox/wikidata/RestrictionEnzymes.txt
        +
        +
        +

        The email address is set to someone@example.com by default. If you change +this to you own address, the pydna.genbank.genbank() function can be +used to download sequences from Genbank directly without having to +explicitly add the email address.

        +

        Pydna can cache results from the following functions or methods:

        + +

        These can be added separated by a comma to the cached_funcs entry +in pydna.ini file or the pydna_cached_funcs environment variable.

        +
        + +
        +
        +pydna.open_log_folder()[source]
        +

        docstring.

        +
        + +
        +
        +pydna.get_env()[source]
        +

        Print a an ascii table containing all environmental variables.

        +

        Pydna related variables have names that starts with pydna_

        +
        + +
        + +

        Ascii-art logotype of pydna.

        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna__pretty.html b/modules/pydna__pretty.html new file mode 100644 index 00000000..a9c90233 --- /dev/null +++ b/modules/pydna__pretty.html @@ -0,0 +1,188 @@ + + + + + + + + + pydna._pretty — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna._pretty

        +

        Classes for nicer Jupyter output.

        +

        The pretty_str class is similar to str but has a _repr_pretty_ method +for for nicer string output in the IPython shell and Jupyter notebook.

        +
        +
        +class pydna._pretty.pretty_str[source]
        +

        Bases: str

        +

        Thanks to Min RK, UC Berkeley for this.

        +
        + +
        +
        +class pydna._pretty.PrettyTable(field_names=None, **kwargs)[source]
        +

        Bases: PrettyTable

        +

        docstring.

        +
        +
        +lol() List[list][source]
        +

        docstring.

        +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna__thermodynamic_data.html b/modules/pydna__thermodynamic_data.html new file mode 100644 index 00000000..75fbdb45 --- /dev/null +++ b/modules/pydna__thermodynamic_data.html @@ -0,0 +1,158 @@ + + + + + + + + + pydna._thermodynamic_data — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/pydna_all.html b/modules/pydna_all.html new file mode 100644 index 00000000..eab812cc --- /dev/null +++ b/modules/pydna_all.html @@ -0,0 +1,3142 @@ + + + + + + + + + pydna.all — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.all

        +

        This module provide most pydna functionality in the local namespace.

        +

        Example

        +
        >>> from pydna.all import *
        +>>> Dseq("aaa")
        +Dseq(-3)
        +aaa
        +ttt
        +>>> Dseqrecord("aaa")
        +Dseqrecord(-3)
        +>>> from pydna.all import __all__
        +>>> __all__
        +['Anneal', 'pcr', 'Assembly', 'genbank', 'Genbank', 'download_text', 'Dseqrecord', 'Dseq', 'read', 'read_primer', 'parse', 'parse_primers', 'ape', 'primer_design', 'assembly_fragments', 'circular_assembly_fragments', 'eq', 'gbtext_clean', 'PrimerList']
        +>>>
        +
        +
        +
        +
        +class pydna.all.Anneal(primers, template, limit=13, **kwargs)[source]
        +

        Bases: object

        +

        The Anneal class has the following important attributes:

        +
        +
        +forward_primers
        +

        Description of forward_primers.

        +
        +
        Type:
        +

        list

        +
        +
        +
        + +
        +
        +reverse_primers
        +

        Description of reverse_primers.

        +
        +
        Type:
        +

        list

        +
        +
        +
        + +
        +
        +template
        +

        A copy of the template argument. Primers annealing sites has been +added as features that can be visualized in a seqence editor such as +ApE.

        +
        +
        Type:
        +

        Dseqrecord

        +
        +
        +
        + +
        +
        +limit
        +

        The limit of PCR primer annealing, default is 13 bp.

        +
        +
        Type:
        +

        int, optional

        +
        +
        +
        + +
        +
        +property products
        +
        + +
        +
        +report()
        +

        returns a short report describing if or where primer +anneal on the template.

        +
        + +
        + +
        +
        +pydna.all.pcr(*args, **kwargs) Amplicon[source]
        +

        pcr is a convenience function for the Anneal class to simplify its +usage, especially from the command line. If more than one or no PCR +product is formed, a ValueError is raised.

        +

        args is any iterable of Dseqrecords or an iterable of iterables of +Dseqrecords. args will be greedily flattened.

        +
        +
        Parameters:
        +
          +
        • args (iterable containing sequence objects) – Several arguments are also accepted.

        • +
        • limit (int = 13, optional) – limit length of the annealing part of the primers.

        • +
        +
        +
        +

        Notes

        +

        sequences in args could be of type:

        +
          +
        • string

        • +
        • Seq

        • +
        • SeqRecord (or subclass)

        • +
        • Dseqrecord (or sublcass)

        • +
        +

        The last sequence will be assumed to be the template while +all preceeding sequences will be assumed to be primers.

        +

        This is a powerful function, use with care!

        +
        +
        Returns:
        +

        product – An pydna.amplicon.Amplicon object representing the PCR +product. The direction of the PCR product will be the same as for +the template sequence.

        +
        +
        Return type:
        +

        Amplicon

        +
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> from pydna.readers import read
        +>>> from pydna.amplify import pcr
        +>>> from pydna.primer import Primer
        +>>> template = Dseqrecord("tacactcaccgtctatcattatctactatcgactgtatcatctgatagcac")
        +>>> from Bio.SeqRecord import SeqRecord
        +>>> p1 = Primer("tacactcaccgtctatcattatc")
        +>>> p2 = Primer("cgactgtatcatctgatagcac").reverse_complement()
        +>>> pcr(p1, p2, template)
        +Amplicon(51)
        +>>> pcr([p1, p2], template)
        +Amplicon(51)
        +>>> pcr((p1,p2,), template)
        +Amplicon(51)
        +>>>
        +
        +
        +
        + +
        +
        +class pydna.all.Assembly(frags: List[Dseqrecord], limit: int = 25, algorithm: Callable[[str, str, int], List[Tuple[int, int, int]]] = common_sub_strings)[source]
        +

        Bases: object

        +

        Assembly of a list of linear DNA fragments into linear or circular +constructs. The Assembly is meant to replace the Assembly method as it +is easier to use. Accepts a list of Dseqrecords (source fragments) to +initiate an Assembly object. Several methods are available for analysis +of overlapping sequences, graph construction and assembly.

        +
        +
        Parameters:
        +
          +
        • fragments (list) – a list of Dseqrecord objects.

        • +
        • limit (int, optional) – The shortest shared homology to be considered

        • +
        • algorithm (function, optional) – The algorithm used to determine the shared sequences.

        • +
        • max_nodes (int) – The maximum number of nodes in the graph. This can be tweaked to +manage sequences with a high number of shared sub sequences.

        • +
        +
        +
        +

        Examples

        +
        >>> from pydna.assembly import Assembly
        +>>> from pydna.dseqrecord import Dseqrecord
        +>>> a = Dseqrecord("acgatgctatactgCCCCCtgtgctgtgctcta")
        +>>> b = Dseqrecord("tgtgctgtgctctaTTTTTtattctggctgtatc")
        +>>> c = Dseqrecord("tattctggctgtatcGGGGGtacgatgctatactg")
        +>>> x = Assembly((a,b,c), limit=14)
        +>>> x
        +Assembly
        +fragments....: 33bp 34bp 35bp
        +limit(bp)....: 14
        +G.nodes......: 6
        +algorithm....: common_sub_strings
        +>>> x.assemble_circular()
        +[Contig(o59), Contig(o59)]
        +>>> x.assemble_circular()[0].seq.watson
        +'acgatgctatactgCCCCCtgtgctgtgctctaTTTTTtattctggctgtatcGGGGGt'
        +
        +
        +
        +
        +assemble_linear(**kwargs)
        +
        + +
        +
        +assemble_circular(**kwargs)
        +
        + +
        + +
        +
        +pydna.all.genbank(accession: str = 'CS570233.1', *args, **kwargs) GenbankRecord[source]
        +

        Download a genbank nuclotide record.

        +

        This function takes the same paramenters as the +:func:pydna.genbank.Genbank.nucleotide method. The email address stored +in the pydna_email environment variable is used. The easiest way set +this permanantly is to edit the pydna.ini file. +See the documentation of pydna.open_config_folder()

        +

        if no accession is given, a very short Genbank +entry +is used as an example (see below). This can be useful for testing the +connection to Genbank.

        +

        Please note that this result is also cached by default by settings in +the pydna.ini file. +See the documentation of pydna.open_config_folder()

        +
        LOCUS       CS570233                  14 bp    DNA     linear   PAT 18-MAY-2007
        +DEFINITION  Sequence 6 from Patent WO2007025016.
        +ACCESSION   CS570233
        +VERSION     CS570233.1
        +KEYWORDS    .
        +SOURCE      synthetic construct
        +  ORGANISM  synthetic construct
        +            other sequences; artificial sequences.
        +REFERENCE   1
        +  AUTHORS   Shaw,R.W. and Cottenoir,M.
        +  TITLE     Inhibition of metallo-beta-lactamase by double-stranded dna
        +  JOURNAL   Patent: WO 2007025016-A1 6 01-MAR-2007;
        +            Texas Tech University System (US)
        +FEATURES             Location/Qualifiers
        +     source          1..14
        +                     /organism="synthetic construct"
        +                     /mol_type="unassigned DNA"
        +                     /db_xref="taxon:32630"
        +                     /note="This is a 14bp aptamer inhibitor."
        +ORIGIN
        +        1 atgttcctac atga
        +//
        +
        +
        +
        + +
        +
        +class pydna.all.Genbank(users_email: str, *, tool: str = 'pydna')[source]
        +

        Bases: object

        +

        Class to facilitate download from genbank. It is easier and +quicker to use the pydna.genbank.genbank() function directly.

        +
        +
        Parameters:
        +

        users_email (string) – Has to be a valid email address. You should always tell +Genbanks who you are, so that they can contact you.

        +
        +
        +

        Examples

        +
        >>> from pydna.genbank import Genbank
        +>>> gb=Genbank("bjornjobb@gmail.com")
        +>>> rec = gb.nucleotide("LP002422.1")   # <- entry from genbank
        +>>> print(len(rec))
        +1
        +
        +
        +
        +
        +nucleotide(**kwargs)
        +
        + +
        + +
        +
        +pydna.all.download_text(*args, **kwargs)
        +
        + +
        +
        +class pydna.all.Dseqrecord(record, *args, circular=None, n=5e-14, **kwargs)[source]
        +

        Bases: SeqRecord

        +

        Dseqrecord is a double stranded version of the Biopython SeqRecord [1] class. +The Dseqrecord object holds a Dseq object describing the sequence. +Additionally, Dseqrecord hold meta information about the sequence in the +from of a list of SeqFeatures, in the same way as the SeqRecord does.

        +

        The Dseqrecord can be initialized with a string, Seq, Dseq, SeqRecord +or another Dseqrecord. The sequence information will be stored in a +Dseq object in all cases.

        +

        Dseqrecord objects can be read or parsed from sequences in FASTA, EMBL or Genbank formats. +See the pydna.readers and pydna.parsers modules for further information.

        +

        There is a short representation associated with the Dseqrecord. +Dseqrecord(-3) represents a linear sequence of length 2 +while Dseqrecord(o7) +represents a circular sequence of length 7.

        +

        Dseqrecord and Dseq share the same concept of length. This length can be larger +than each strand alone if they are staggered as in the example below.

        +
        <-- length -->
        +GATCCTTT
        +     AAAGCCTAG
        +
        +
        +
        +
        Parameters:
        +
          +
        • record (string, Seq, SeqRecord, Dseq or other Dseqrecord object) – This data will be used to form the seq property

        • +
        • circular (bool, optional) – True or False reflecting the shape of the DNA molecule

        • +
        • linear (bool, optional) – True or False reflecting the shape of the DNA molecule

        • +
        +
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("aaa")
        +>>> a
        +Dseqrecord(-3)
        +>>> a.seq
        +Dseq(-3)
        +aaa
        +ttt
        +>>> from pydna.seq import Seq
        +>>> b=Dseqrecord(Seq("aaa"))
        +>>> b
        +Dseqrecord(-3)
        +>>> b.seq
        +Dseq(-3)
        +aaa
        +ttt
        +>>> from Bio.SeqRecord import SeqRecord
        +>>> c=Dseqrecord(SeqRecord(Seq("aaa")))
        +>>> c
        +Dseqrecord(-3)
        +>>> c.seq
        +Dseq(-3)
        +aaa
        +ttt
        +
        +
        +

        References

        + +
        +
        +classmethod from_string(record: str = '', *args, circular=False, n=5e-14, **kwargs)[source]
        +

        docstring.

        +
        + +
        +
        +classmethod from_SeqRecord(record: SeqRecord, *args, circular=None, n=5e-14, **kwargs)[source]
        +
        + +
        +
        +property circular
        +

        The circular property can not be set directly. +Use looped()

        +
        + +
        +
        +m()[source]
        +

        This method returns the mass of the DNA molecule in grams. This is +calculated as the product between the molecular weight of the Dseq object +and the

        +
        + +
        +
        +extract_feature(n)[source]
        +

        Extracts a feature and creates a new Dseqrecord object.

        +
        +
        Parameters:
        +

        n (int) – Indicates the feature to extract

        +
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("atgtaa")
        +>>> a.add_feature(2,4)
        +>>> b=a.extract_feature(0)
        +>>> b
        +Dseqrecord(-2)
        +>>> b.seq
        +Dseq(-2)
        +gt
        +ca
        +
        +
        +
        + +
        +
        +add_feature(x=None, y=None, seq=None, type_='misc', strand=1, *args, **kwargs)[source]
        +

        Add a feature of type misc to the feature list of the sequence.

        +
        +
        Parameters:
        +
          +
        • x (int) – Indicates start of the feature

        • +
        • y (int) – Indicates end of the feature

        • +
        +
        +
        +

        Examples

        +
        >>> from pydna.seqrecord import SeqRecord
        +>>> a=SeqRecord("atgtaa")
        +>>> a.features
        +[]
        +>>> a.add_feature(2,4)
        +>>> a.features
        +[SeqFeature(SimpleLocation(ExactPosition(2), ExactPosition(4), strand=1), type='misc', qualifiers=...)]
        +
        +
        +
        + +
        +
        +seguid()[source]
        +

        Url safe SEGUID for the sequence.

        +

        This checksum is the same as seguid but with base64.urlsafe +encoding instead of the normal base64. This means that +the characters + and / are replaced with - and _ so that +the checksum can be part of a URL.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a = Dseqrecord("aa")
        +>>> a.seguid()
        +'ldseguid=TEwydy0ugvGXh3VJnVwgtxoyDQA'
        +
        +
        +
        + +
        +
        +looped()[source]
        +

        Circular version of the Dseqrecord object.

        +

        The underlying linear Dseq object has to have compatible ends.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("aaa")
        +>>> a
        +Dseqrecord(-3)
        +>>> b=a.looped()
        +>>> b
        +Dseqrecord(o3)
        +>>>
        +
        +
        + +
        + +
        +
        +tolinear()[source]
        +

        Returns a linear, blunt copy of a circular Dseqrecord object. The +underlying Dseq object has to be circular.

        +

        This method is deprecated, use slicing instead. See example below.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("aaa", circular = True)
        +>>> a
        +Dseqrecord(o3)
        +>>> b=a[:]
        +>>> b
        +Dseqrecord(-3)
        +>>>
        +
        +
        +
        + +
        +
        +terminal_transferase(nucleotides='a')[source]
        +

        docstring.

        +
        + +
        +
        +format(f='gb')[source]
        +

        Returns the sequence as a string using a format supported by Biopython +SeqIO [2]. Default is “gb” which is short for Genbank.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> x=Dseqrecord("aaa")
        +>>> x.annotations['date'] = '02-FEB-2013'
        +>>> x
        +Dseqrecord(-3)
        +>>> print(x.format("gb"))
        +LOCUS       name                       3 bp    DNA     linear   UNK 02-FEB-2013
        +DEFINITION  description.
        +ACCESSION   id
        +VERSION     id
        +KEYWORDS    .
        +SOURCE      .
        +  ORGANISM  .
        +            .
        +FEATURES             Location/Qualifiers
        +ORIGIN
        +        1 aaa
        +//
        +
        +
        +

        References

        + +
        + +
        +
        +write(filename=None, f='gb')[source]
        +

        Writes the Dseqrecord to a file using the format f, which must +be a format supported by Biopython SeqIO for writing [3]. Default +is “gb” which is short for Genbank. Note that Biopython SeqIO reads +more formats than it writes.

        +

        Filename is the path to the file where the sequece is to be +written. The filename is optional, if it is not given, the +description property (string) is used together with the format.

        +

        If obj is the Dseqrecord object, the default file name will be:

        +

        <obj.locus>.<f>

        +

        Where <f> is “gb” by default. If the filename already exists and +AND the sequence it contains is different, a new file name will be +used so that the old file is not lost:

        +

        <obj.locus>_NEW.<f>

        +

        References

        + +
        + +
        +
        +find(other)[source]
        +
        + +
        +
        +find_aminoacids(other)[source]
        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> s=Dseqrecord("atgtacgatcgtatgctggttatattttag")
        +>>> s.seq.translate()
        +Seq('MYDRMLVIF*')
        +>>> "RML" in s
        +True
        +>>> "MMM" in s
        +False
        +>>> s.seq.rc().translate()
        +Seq('LKYNQHTIVH')
        +>>> "QHT" in s.rc()
        +True
        +>>> "QHT" in s
        +False
        +>>> slc = s.find_aa("RML")
        +>>> slc
        +slice(9, 18, None)
        +>>> s[slc]
        +Dseqrecord(-9)
        +>>> code = s[slc].seq
        +>>> code
        +Dseq(-9)
        +cgtatgctg
        +gcatacgac
        +>>> code.translate()
        +Seq('RML')
        +
        +
        +
        + +
        +
        +find_aa(other)
        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> s=Dseqrecord("atgtacgatcgtatgctggttatattttag")
        +>>> s.seq.translate()
        +Seq('MYDRMLVIF*')
        +>>> "RML" in s
        +True
        +>>> "MMM" in s
        +False
        +>>> s.seq.rc().translate()
        +Seq('LKYNQHTIVH')
        +>>> "QHT" in s.rc()
        +True
        +>>> "QHT" in s
        +False
        +>>> slc = s.find_aa("RML")
        +>>> slc
        +slice(9, 18, None)
        +>>> s[slc]
        +Dseqrecord(-9)
        +>>> code = s[slc].seq
        +>>> code
        +Dseq(-9)
        +cgtatgctg
        +gcatacgac
        +>>> code.translate()
        +Seq('RML')
        +
        +
        +
        + +
        +
        +map_trace_files(pth, limit=25)[source]
        +
        + +
        +
        +linearize(*enzymes)[source]
        +

        Similar to :func:cut.

        +

        Throws an exception if there is not excactly one cut +i.e. none or more than one digestion products.

        +
        + +
        +
        +no_cutters(batch: RestrictionBatch | None = None)[source]
        +

        docstring.

        +
        + +
        +
        +unique_cutters(batch: RestrictionBatch | None = None)[source]
        +

        docstring.

        +
        + +
        +
        +once_cutters(batch: RestrictionBatch | None = None)[source]
        +

        docstring.

        +
        + +
        +
        +twice_cutters(batch: RestrictionBatch | None = None)[source]
        +

        docstring.

        +
        + +
        +
        +n_cutters(n=3, batch: RestrictionBatch | None = None)[source]
        +

        docstring.

        +
        + +
        +
        +cutters(batch: RestrictionBatch | None = None)[source]
        +

        docstring.

        +
        + +
        +
        +number_of_cuts(*enzymes)[source]
        +

        The number of cuts by digestion with the Restriction enzymes +contained in the iterable.

        +
        + +
        +
        +cas9(RNA: str)[source]
        +

        docstring.

        +
        + +
        +
        +reverse_complement()[source]
        +

        Reverse complement.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggaatt")
        +>>> a
        +Dseqrecord(-6)
        +>>> a.seq
        +Dseq(-6)
        +ggaatt
        +ccttaa
        +>>> a.reverse_complement().seq
        +Dseq(-6)
        +aattcc
        +ttaagg
        +>>>
        +
        +
        + +
        + +
        +
        +rc()
        +

        Reverse complement.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggaatt")
        +>>> a
        +Dseqrecord(-6)
        +>>> a.seq
        +Dseq(-6)
        +ggaatt
        +ccttaa
        +>>> a.reverse_complement().seq
        +Dseq(-6)
        +aattcc
        +ttaagg
        +>>>
        +
        +
        + +
        + +
        +
        +synced(ref, limit=25)[source]
        +

        This method returns a new circular sequence (Dseqrecord object), which has been rotated +in such a way that there is maximum overlap between the sequence and +ref, which may be a string, Biopython Seq, SeqRecord object or +another Dseqrecord object.

        +

        The reason for using this could be to rotate a new recombinant plasmid so +that it starts at the same position after cloning. See the example below:

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("gaat", circular=True)
        +>>> a.seq
        +Dseq(o4)
        +gaat
        +ctta
        +>>> d = a[2:] + a[:2]
        +>>> d.seq
        +Dseq(-4)
        +atga
        +tact
        +>>> insert=Dseqrecord("CCC")
        +>>> recombinant = (d+insert).looped()
        +>>> recombinant.seq
        +Dseq(o7)
        +atgaCCC
        +tactGGG
        +>>> recombinant.synced(a).seq
        +Dseq(o7)
        +gaCCCat
        +ctGGGta
        +
        +
        +
        + +
        +
        +upper()[source]
        +

        Returns an uppercase copy. +>>> from pydna.dseqrecord import Dseqrecord +>>> my_seq = Dseqrecord(“aAa”) +>>> my_seq.seq +Dseq(-3) +aAa +tTt +>>> upper = my_seq.upper() +>>> upper.seq +Dseq(-3) +AAA +TTT +>>>

        +
        +
        Returns:
        +

        Dseqrecord object in uppercase

        +
        +
        Return type:
        +

        Dseqrecord

        +
        +
        + +
        + +
        +
        +lower()[source]
        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> my_seq = Dseqrecord("aAa")
        +>>> my_seq.seq
        +Dseq(-3)
        +aAa
        +tTt
        +>>> upper = my_seq.upper()
        +>>> upper.seq
        +Dseq(-3)
        +AAA
        +TTT
        +>>> lower = my_seq.lower()
        +>>> lower
        +Dseqrecord(-3)
        +>>>
        +
        +
        +
        +
        Returns:
        +

        Dseqrecord object in lowercase

        +
        +
        Return type:
        +

        Dseqrecord

        +
        +
        + +
        + +
        +
        +orfs(minsize=300)[source]
        +

        docstring.

        +
        + +
        +
        +orfs_to_features(minsize=300)[source]
        +

        docstring.

        +
        + +
        +
        +copy_gb_to_clipboard()[source]
        +

        docstring.

        +
        + +
        +
        +copy_fasta_to_clipboard()[source]
        +

        docstring.

        +
        + +
        +
        +figure(feature=0, highlight='\x1b[48;5;11m', plain='\x1b[0m')[source]
        +

        docstring.

        +
        + +
        +
        +shifted(shift)[source]
        +

        Circular Dseqrecord with a new origin <shift>.

        +

        This only works on circular Dseqrecords. If we consider the following +circular sequence:

        +
        +
        GAAAT   <-- watson strand
        +
        CTTTA   <-- crick strand
        +
        +

        The T and the G on the watson strand are linked together as well +as the A and the C of the of the crick strand.

        +

        if shift is 1, this indicates a new origin at position 1:

        +
        +
        +
        new origin at the | symbol:
        +

        +
        +
        G|AAAT
        +
        C|TTTA
        +
        +

        new sequence:

        +
        +
        AAATG
        +
        TTTAC
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("aaat",circular=True)
        +>>> a
        +Dseqrecord(o4)
        +>>> a.seq
        +Dseq(o4)
        +aaat
        +ttta
        +>>> b=a.shifted(1)
        +>>> b
        +Dseqrecord(o4)
        +>>> b.seq
        +Dseq(o4)
        +aata
        +ttat
        +
        +
        +
        + +
        +
        +cut(*enzymes)[source]
        +

        Digest a Dseqrecord object with one or more restriction enzymes.

        +

        returns a list of linear Dseqrecords. If there are no cuts, an empty +list is returned.

        +

        See also Dseq.cut() +:param enzymes: A Bio.Restriction.XXX restriction object or iterable of such. +:type enzymes: enzyme object or iterable of such objects

        +
        +
        Returns:
        +

        Dseqrecord_frags – list of Dseqrecord objects formed by the digestion

        +
        +
        Return type:
        +

        list

        +
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggatcc")
        +>>> from Bio.Restriction import BamHI
        +>>> a.cut(BamHI)
        +(Dseqrecord(-5), Dseqrecord(-5))
        +>>> frag1, frag2 = a.cut(BamHI)
        +>>> frag1.seq
        +Dseq(-5)
        +g
        +cctag
        +>>> frag2.seq
        +Dseq(-5)
        +gatcc
        +    g
        +
        +
        +
        + +
        +
        +apply_cut(left_cut, right_cut)[source]
        +
        + +
        + +
        +
        +class pydna.all.Dseq(watson: str | bytes, crick: str | bytes | None = None, ovhg=None, circular=False, pos=0)[source]
        +

        Bases: Seq

        +

        Dseq holds information for a double stranded DNA fragment.

        +

        Dseq also holds information describing the topology of +the DNA fragment (linear or circular).

        +
        +
        Parameters:
        +
          +
        • watson (str) – a string representing the watson (sense) DNA strand.

        • +
        • crick (str, optional) – a string representing the crick (antisense) DNA strand.

        • +
        • ovhg (int, optional) – A positive or negative number to describe the stagger between the +watson and crick strands. +see below for a detailed explanation.

        • +
        • linear (bool, optional) – True indicates that sequence is linear, False that it is circular.

        • +
        • circular (bool, optional) – True indicates that sequence is circular, False that it is linear.

        • +
        +
        +
        +

        Examples

        +

        Dseq is a subclass of the Biopython Seq object. It stores two +strings representing the watson (sense) and crick(antisense) strands. +two properties called linear and circular, and a numeric value ovhg +(overhang) describing the stagger for the watson and crick strand +in the 5’ end of the fragment.

        +

        The most common usage is probably to create a Dseq object as a +part of a Dseqrecord object (see pydna.dseqrecord.Dseqrecord).

        +

        There are three ways of creating a Dseq object directly listed below, but you can also +use the function Dseq.from_full_sequence_and_overhangs() to create a Dseq:

        +

        Only one argument (string):

        +
        >>> from pydna.dseq import Dseq
        +>>> Dseq("aaa")
        +Dseq(-3)
        +aaa
        +ttt
        +
        +
        +

        The given string will be interpreted as the watson strand of a +blunt, linear double stranded sequence object. The crick strand +is created automatically from the watson strand.

        +

        Two arguments (string, string):

        +
        >>> from pydna.dseq import Dseq
        +>>> Dseq("gggaaat","ttt")
        +Dseq(-7)
        +gggaaat
        +   ttt
        +
        +
        +

        If both watson and crick are given, but not ovhg an attempt +will be made to find the best annealing between the strands. +There are limitations to this. For long fragments it is quite +slow. The length of the annealing sequences have to be at least +half the length of the shortest of the strands.

        +

        Three arguments (string, string, ovhg=int):

        +

        The ovhg parameter is an integer describing the length of the +crick strand overhang in the 5’ end of the molecule.

        +

        The ovhg parameter controls the stagger at the five prime end:

        +
        dsDNA       overhang
        +
        +  nnn...    2
        +nnnnn...
        +
        + nnnn...    1
        +nnnnn...
        +
        +nnnnn...    0
        +nnnnn...
        +
        +nnnnn...   -1
        + nnnn...
        +
        +nnnnn...   -2
        +  nnn...
        +
        +
        +

        Example of creating Dseq objects with different amounts of stagger:

        +
        >>> Dseq(watson="agt", crick="actta", ovhg=-2)
        +Dseq(-7)
        +agt
        +  attca
        +>>> Dseq(watson="agt",crick="actta",ovhg=-1)
        +Dseq(-6)
        +agt
        + attca
        +>>> Dseq(watson="agt",crick="actta",ovhg=0)
        +Dseq(-5)
        +agt
        +attca
        +>>> Dseq(watson="agt",crick="actta",ovhg=1)
        +Dseq(-5)
        + agt
        +attca
        +>>> Dseq(watson="agt",crick="actta",ovhg=2)
        +Dseq(-5)
        +  agt
        +attca
        +
        +
        +

        If the ovhg parameter is specified a crick strand also +needs to be supplied, otherwise an exception is raised.

        +
        >>> Dseq(watson="agt", ovhg=2)
        +Traceback (most recent call last):
        +  File "<stdin>", line 1, in <module>
        +  File "/usr/local/lib/python2.7/dist-packages/pydna_/dsdna.py", line 169, in __init__
        +    else:
        +ValueError: ovhg defined without crick strand!
        +
        +
        +

        The shape of the fragment is set by circular = True, False

        +

        Note that both ends of the DNA fragment has to be compatible to set +circular = True.

        +
        >>> Dseq("aaa","ttt")
        +Dseq(-3)
        +aaa
        +ttt
        +>>> Dseq("aaa","ttt",ovhg=0)
        +Dseq(-3)
        +aaa
        +ttt
        +>>> Dseq("aaa","ttt",ovhg=1)
        +Dseq(-4)
        + aaa
        +ttt
        +>>> Dseq("aaa","ttt",ovhg=-1)
        +Dseq(-4)
        +aaa
        + ttt
        +>>> Dseq("aaa", "ttt", circular = True , ovhg=0)
        +Dseq(o3)
        +aaa
        +ttt
        +
        +
        +
        >>> a=Dseq("tttcccc","aaacccc")
        +>>> a
        +Dseq(-11)
        +    tttcccc
        +ccccaaa
        +>>> a.ovhg
        +4
        +
        +
        +
        >>> b=Dseq("ccccttt","ccccaaa")
        +>>> b
        +Dseq(-11)
        +ccccttt
        +    aaacccc
        +>>> b.ovhg
        +-4
        +>>>
        +
        +
        +

        Coercing to string

        +
        >>> str(a)
        +'ggggtttcccc'
        +
        +
        +

        A Dseq object can be longer that either the watson or crick strands.

        +
        <-- length -->
        +GATCCTTT
        +     AAAGCCTAG
        +
        +<-- length -->
        +      GATCCTTT
        +AAAGCCCTA
        +
        +
        +

        The slicing of a linear Dseq object works mostly as it does for a string.

        +
        >>> s="ggatcc"
        +>>> s[2:3]
        +'a'
        +>>> s[2:4]
        +'at'
        +>>> s[2:4:-1]
        +''
        +>>> s[::2]
        +'gac'
        +>>> from pydna.dseq import Dseq
        +>>> d=Dseq(s, circular=False)
        +>>> d[2:3]
        +Dseq(-1)
        +a
        +t
        +>>> d[2:4]
        +Dseq(-2)
        +at
        +ta
        +>>> d[2:4:-1]
        +Dseq(-0)
        +
        +
        +>>> d[::2]
        +Dseq(-3)
        +gac
        +ctg
        +
        +
        +

        The slicing of a circular Dseq object has a slightly different meaning.

        +
        >>> s="ggAtCc"
        +>>> d=Dseq(s, circular=True)
        +>>> d
        +Dseq(o6)
        +ggAtCc
        +ccTaGg
        +>>> d[4:3]
        +Dseq(-5)
        +CcggA
        +GgccT
        +
        +
        +

        The slice [X:X] produces an empty slice for a string, while this +will return the linearized sequence starting at X:

        +
        >>> s="ggatcc"
        +>>> d=Dseq(s, circular=True)
        +>>> d
        +Dseq(o6)
        +ggatcc
        +cctagg
        +>>> d[3:3]
        +Dseq(-6)
        +tccgga
        +aggcct
        +>>>
        +
        +
        + +
        +
        +trunc = 30
        +
        + +
        +
        +classmethod quick(watson: str, crick: str, ovhg=0, circular=False, pos=0)[source]
        +
        + +
        +
        +classmethod from_string(dna: str, *args, circular=False, **kwargs)[source]
        +
        + +
        +
        +classmethod from_representation(dsdna: str, *args, **kwargs)[source]
        +
        + +
        +
        +classmethod from_full_sequence_and_overhangs(full_sequence: str, crick_ovhg: int, watson_ovhg: int)[source]
        +

        Create a linear Dseq object from a full sequence and the 3’ overhangs of each strand.

        +

        The order of the parameters is like this because the 3’ overhang of the crick strand is the one +on the left side of the sequence.

        +
        +
        Parameters:
        +
          +
        • full_sequence (str) – The full sequence of the Dseq object.

        • +
        • crick_ovhg (int) – The overhang of the crick strand in the 3’ end. Equivalent to Dseq.ovhg.

        • +
        • watson_ovhg (int) – The overhang of the watson strand in the 5’ end.

        • +
        +
        +
        Returns:
        +

        A Dseq object.

        +
        +
        Return type:
        +

        Dseq

        +
        +
        +

        Examples

        +
        >>> Dseq.from_full_sequence_and_overhangs('AAAAAA', crick_ovhg=2, watson_ovhg=2)
        +Dseq(-6)
        +  AAAA
        +TTTT
        +>>> Dseq.from_full_sequence_and_overhangs('AAAAAA', crick_ovhg=-2, watson_ovhg=2)
        +Dseq(-6)
        +AAAAAA
        +  TT
        +>>> Dseq.from_full_sequence_and_overhangs('AAAAAA', crick_ovhg=2, watson_ovhg=-2)
        +Dseq(-6)
        +  AA
        +TTTTTT
        +>>> Dseq.from_full_sequence_and_overhangs('AAAAAA', crick_ovhg=-2, watson_ovhg=-2)
        +Dseq(-6)
        +AAAA
        +  TTTT
        +
        +
        +
        + +
        +
        +mw() float[source]
        +

        This method returns the molecular weight of the DNA molecule +in g/mol. The following formula is used:

        +
        MW = (A x 313.2) + (T x 304.2) +
        +     (C x 289.2) + (G x 329.2) +
        +     (N x 308.9) + 79.0
        +
        +
        +
        + +
        +
        +upper() DseqType[source]
        +

        Return an upper case copy of the sequence.

        +
        >>> from pydna.dseq import Dseq
        +>>> my_seq = Dseq("aAa")
        +>>> my_seq
        +Dseq(-3)
        +aAa
        +tTt
        +>>> my_seq.upper()
        +Dseq(-3)
        +AAA
        +TTT
        +
        +
        +
        +
        Returns:
        +

        Dseq object in uppercase

        +
        +
        Return type:
        +

        Dseq

        +
        +
        +
        +

        See also

        +

        pydna.dseq.Dseq.lower

        +
        +
        + +
        +
        +lower() DseqType[source]
        +

        Return a lower case copy of the sequence.

        +
        >>> from pydna.dseq import Dseq
        +>>> my_seq = Dseq("aAa")
        +>>> my_seq
        +Dseq(-3)
        +aAa
        +tTt
        +>>> my_seq.lower()
        +Dseq(-3)
        +aaa
        +ttt
        +
        +
        +
        +
        Returns:
        +

        Dseq object in lowercase

        +
        +
        Return type:
        +

        Dseq

        +
        +
        +
        +

        See also

        +

        pydna.dseq.Dseq.upper

        +
        +
        + +
        +
        +find(sub: _SeqAbstractBaseClass | str | bytes, start=0, end=_sys.maxsize) int[source]
        +

        This method behaves like the python string method of the same name.

        +

        Returns an integer, the index of the first occurrence of substring +argument sub in the (sub)sequence given by [start:end].

        +

        Returns -1 if the subsequence is NOT found.

        +
        +
        Parameters:
        +
          +
        • sub (string or Seq object) – a string or another Seq object to look for.

        • +
        • start (int, optional) – slice start.

        • +
        • end (int, optional) – slice end.

        • +
        +
        +
        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> seq = Dseq("atcgactgacgtgtt")
        +>>> seq
        +Dseq(-15)
        +atcgactgacgtgtt
        +tagctgactgcacaa
        +>>> seq.find("gac")
        +3
        +>>> seq = Dseq(watson="agt",crick="actta",ovhg=-2)
        +>>> seq
        +Dseq(-7)
        +agt
        +  attca
        +>>> seq.find("taa")
        +2
        +
        +
        +
        + +
        +
        +reverse_complement() Dseq[source]
        +

        Dseq object where watson and crick have switched places.

        +

        This represents the same double stranded sequence.

        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("catcgatc")
        +>>> a
        +Dseq(-8)
        +catcgatc
        +gtagctag
        +>>> b=a.reverse_complement()
        +>>> b
        +Dseq(-8)
        +gatcgatg
        +ctagctac
        +>>>
        +
        +
        +
        + +
        +
        +rc() Dseq
        +

        Dseq object where watson and crick have switched places.

        +

        This represents the same double stranded sequence.

        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("catcgatc")
        +>>> a
        +Dseq(-8)
        +catcgatc
        +gtagctag
        +>>> b=a.reverse_complement()
        +>>> b
        +Dseq(-8)
        +gatcgatg
        +ctagctac
        +>>>
        +
        +
        +
        + +
        +
        +shifted(shift: int) DseqType[source]
        +

        Shifted version of a circular Dseq object.

        +
        + +
        +
        +looped() DseqType[source]
        +

        Circularized Dseq object.

        +

        This can only be done if the two ends are compatible, +otherwise a TypeError is raised.

        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("catcgatc")
        +>>> a
        +Dseq(-8)
        +catcgatc
        +gtagctag
        +>>> a.looped()
        +Dseq(o8)
        +catcgatc
        +gtagctag
        +>>> a.T4("t")
        +Dseq(-8)
        +catcgat
        + tagctag
        +>>> a.T4("t").looped()
        +Dseq(o7)
        +catcgat
        +gtagcta
        +>>> a.T4("a")
        +Dseq(-8)
        +catcga
        +  agctag
        +>>> a.T4("a").looped()
        +Traceback (most recent call last):
        +  File "<stdin>", line 1, in <module>
        +  File "/usr/local/lib/python2.7/dist-packages/pydna/dsdna.py", line 357, in looped
        +    if type5 == type3 and str(sticky5) == str(rc(sticky3)):
        +TypeError: DNA cannot be circularized.
        +5' and 3' sticky ends not compatible!
        +>>>
        +
        +
        +
        + +
        +
        +tolinear() DseqType[source]
        +

        Returns a blunt, linear copy of a circular Dseq object. This can +only be done if the Dseq object is circular, otherwise a +TypeError is raised.

        +

        This method is deprecated, use slicing instead. See example below.

        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("catcgatc", circular=True)
        +>>> a
        +Dseq(o8)
        +catcgatc
        +gtagctag
        +>>> a[:]
        +Dseq(-8)
        +catcgatc
        +gtagctag
        +>>>
        +
        +
        +
        + +
        +
        +five_prime_end() Tuple[str, str][source]
        +

        Returns a tuple describing the structure of the 5’ end of +the DNA fragment

        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("aaa", "ttt")
        +>>> a
        +Dseq(-3)
        +aaa
        +ttt
        +>>> a.five_prime_end()
        +('blunt', '')
        +>>> a=Dseq("aaa", "ttt", ovhg=1)
        +>>> a
        +Dseq(-4)
        + aaa
        +ttt
        +>>> a.five_prime_end()
        +("3'", 't')
        +>>> a=Dseq("aaa", "ttt", ovhg=-1)
        +>>> a
        +Dseq(-4)
        +aaa
        + ttt
        +>>> a.five_prime_end()
        +("5'", 'a')
        +>>>
        +
        +
        + +
        + +
        +
        +three_prime_end() Tuple[str, str][source]
        +

        Returns a tuple describing the structure of the 5’ end of +the DNA fragment

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("aaa", "ttt")
        +>>> a
        +Dseq(-3)
        +aaa
        +ttt
        +>>> a.three_prime_end()
        +('blunt', '')
        +>>> a=Dseq("aaa", "ttt", ovhg=1)
        +>>> a
        +Dseq(-4)
        + aaa
        +ttt
        +>>> a.three_prime_end()
        +("3'", 'a')
        +>>> a=Dseq("aaa", "ttt", ovhg=-1)
        +>>> a
        +Dseq(-4)
        +aaa
        + ttt
        +>>> a.three_prime_end()
        +("5'", 't')
        +>>>
        +
        +
        + +
        + +
        +
        +watson_ovhg() int[source]
        +

        Returns the overhang of the watson strand at the three prime.

        +
        + +
        +
        +fill_in(nucleotides: None | str = None) Dseq[source]
        +

        Fill in of five prime protruding end with a DNA polymerase +that has only DNA polymerase activity (such as exo-klenow [4]) +and any combination of A, G, C or T. Default are all four +nucleotides together.

        +
        +
        Parameters:
        +

        nucleotides (str) –

        +
        +
        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("aaa", "ttt")
        +>>> a
        +Dseq(-3)
        +aaa
        +ttt
        +>>> a.fill_in()
        +Dseq(-3)
        +aaa
        +ttt
        +>>> b=Dseq("caaa", "cttt")
        +>>> b
        +Dseq(-5)
        +caaa
        + tttc
        +>>> b.fill_in()
        +Dseq(-5)
        +caaag
        +gtttc
        +>>> b.fill_in("g")
        +Dseq(-5)
        +caaag
        +gtttc
        +>>> b.fill_in("tac")
        +Dseq(-5)
        +caaa
        + tttc
        +>>> c=Dseq("aaac", "tttg")
        +>>> c
        +Dseq(-5)
        + aaac
        +gttt
        +>>> c.fill_in()
        +Dseq(-5)
        + aaac
        +gttt
        +>>>
        +
        +
        +

        References

        + +
        + +
        +
        +transcribe() Seq[source]
        +

        Transcribe a DNA sequence into RNA and return the RNA sequence as a new Seq object.

        +

        Following the usual convention, the sequence is interpreted as the +coding strand of the DNA double helix, not the template strand. This +means we can get the RNA sequence just by switching T to U.

        +
        >>> from Bio.Seq import Seq
        +>>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
        +>>> coding_dna
        +Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +>>> coding_dna.transcribe()
        +Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +
        +
        +

        The sequence is modified in-place and returned if inplace is True:

        +
        >>> sequence = MutableSeq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
        +>>> sequence
        +MutableSeq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +>>> sequence.transcribe()
        +MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +>>> sequence
        +MutableSeq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +
        +
        +
        >>> sequence.transcribe(inplace=True)
        +MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +>>> sequence
        +MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +
        +
        +

        As Seq objects are immutable, a TypeError is raised if +transcribe is called on a Seq object with inplace=True.

        +

        Trying to transcribe an RNA sequence has no effect. +If you have a nucleotide sequence which might be DNA or RNA +(or even a mixture), calling the transcribe method will ensure +any T becomes U.

        +

        Trying to transcribe a protein sequence will replace any +T for Threonine with U for Selenocysteine, which has no +biologically plausible rational.

        +
        >>> from Bio.Seq import Seq
        +>>> my_protein = Seq("MAIVMGRT")
        +>>> my_protein.transcribe()
        +Seq('MAIVMGRU')
        +
        +
        +
        + +
        +
        +translate(table='Standard', stop_symbol='*', to_stop=False, cds=False, gap='-') Seq[source]
        +

        Translate..

        +
        + +
        +
        +mung() Dseq[source]
        +

        Simulates treatment a nuclease with 5’-3’ and 3’-5’ single +strand specific exonuclease activity (such as mung bean nuclease [5])

        +
            ggatcc    ->     gatcc
        +     ctaggg          ctagg
        +
        +     ggatcc   ->      ggatc
        +    tcctag            cctag
        +
        +>>> from pydna.dseq import Dseq
        +>>> b=Dseq("caaa", "cttt")
        +>>> b
        +Dseq(-5)
        +caaa
        + tttc
        +>>> b.mung()
        +Dseq(-3)
        +aaa
        +ttt
        +>>> c=Dseq("aaac", "tttg")
        +>>> c
        +Dseq(-5)
        + aaac
        +gttt
        +>>> c.mung()
        +Dseq(-3)
        +aaa
        +ttt
        +
        +
        +

        References

        + +
        + +
        +
        +T4(nucleotides=None) Dseq[source]
        +

        Fill in five prime protruding ends and chewing back +three prime protruding ends by a DNA polymerase providing both +5’-3’ DNA polymerase activity and 3’-5’ nuclease acitivty +(such as T4 DNA polymerase). This can be done in presence of any +combination of the four A, G, C or T. Removing one or more nucleotides +can facilitate engineering of sticky ends. Default are all four nucleotides together.

        +
        +
        Parameters:
        +

        nucleotides (str) –

        +
        +
        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("gatcgatc")
        +>>> a
        +Dseq(-8)
        +gatcgatc
        +ctagctag
        +>>> a.T4()
        +Dseq(-8)
        +gatcgatc
        +ctagctag
        +>>> a.T4("t")
        +Dseq(-8)
        +gatcgat
        + tagctag
        +>>> a.T4("a")
        +Dseq(-8)
        +gatcga
        +  agctag
        +>>> a.T4("g")
        +Dseq(-8)
        +gatcg
        +   gctag
        +>>>
        +
        +
        +
        + +
        +
        +t4(nucleotides=None) Dseq
        +

        Fill in five prime protruding ends and chewing back +three prime protruding ends by a DNA polymerase providing both +5’-3’ DNA polymerase activity and 3’-5’ nuclease acitivty +(such as T4 DNA polymerase). This can be done in presence of any +combination of the four A, G, C or T. Removing one or more nucleotides +can facilitate engineering of sticky ends. Default are all four nucleotides together.

        +
        +
        Parameters:
        +

        nucleotides (str) –

        +
        +
        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("gatcgatc")
        +>>> a
        +Dseq(-8)
        +gatcgatc
        +ctagctag
        +>>> a.T4()
        +Dseq(-8)
        +gatcgatc
        +ctagctag
        +>>> a.T4("t")
        +Dseq(-8)
        +gatcgat
        + tagctag
        +>>> a.T4("a")
        +Dseq(-8)
        +gatcga
        +  agctag
        +>>> a.T4("g")
        +Dseq(-8)
        +gatcg
        +   gctag
        +>>>
        +
        +
        +
        + +
        +
        +exo1_front(n=1) DseqType[source]
        +

        5’-3’ resection at the start (left side) of the molecule.

        +
        + +
        +
        +exo1_end(n=1) DseqType[source]
        +

        5’-3’ resection at the end (right side) of the molecule.

        +
        + +
        +
        +no_cutters(batch: RestrictionBatch | None = None) RestrictionBatch[source]
        +

        Enzymes in a RestrictionBatch not cutting sequence.

        +
        + +
        +
        +unique_cutters(batch: RestrictionBatch | None = None) RestrictionBatch[source]
        +

        Enzymes in a RestrictionBatch cutting sequence once.

        +
        + +
        +
        +once_cutters(batch: RestrictionBatch | None = None) RestrictionBatch
        +

        Enzymes in a RestrictionBatch cutting sequence once.

        +
        + +
        +
        +twice_cutters(batch: RestrictionBatch | None = None) RestrictionBatch[source]
        +

        Enzymes in a RestrictionBatch cutting sequence twice.

        +
        + +
        +
        +n_cutters(n=3, batch: RestrictionBatch | None = None) RestrictionBatch[source]
        +

        Enzymes in a RestrictionBatch cutting n times.

        +
        + +
        +
        +cutters(batch: RestrictionBatch | None = None) RestrictionBatch[source]
        +

        Enzymes in a RestrictionBatch cutting sequence at least once.

        +
        + +
        +
        +seguid() str[source]
        +

        SEGUID checksum for the sequence.

        +
        + +
        +
        +isblunt() bool[source]
        +

        isblunt.

        +

        Return True if Dseq is linear and blunt and +false if staggered or circular.

        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("gat")
        +>>> a
        +Dseq(-3)
        +gat
        +cta
        +>>> a.isblunt()
        +True
        +>>> a=Dseq("gat", "atcg")
        +>>> a
        +Dseq(-4)
        + gat
        +gcta
        +>>> a.isblunt()
        +False
        +>>> a=Dseq("gat", "gatc")
        +>>> a
        +Dseq(-4)
        +gat
        +ctag
        +>>> a.isblunt()
        +False
        +>>> a=Dseq("gat", circular=True)
        +>>> a
        +Dseq(o3)
        +gat
        +cta
        +>>> a.isblunt()
        +False
        +
        +
        +
        + +
        +
        +cas9(RNA: str) Tuple[slice, ...][source]
        +

        docstring.

        +
        + +
        +
        +terminal_transferase(nucleotides='a') Dseq[source]
        +

        docstring.

        +
        + +
        +
        +cut(*enzymes: EnzymesType) Tuple[DseqType, ...][source]
        +

        Returns a list of linear Dseq fragments produced in the digestion. +If there are no cuts, an empty list is returned.

        +
        +
        Parameters:
        +

        enzymes (enzyme object or iterable of such objects) – A Bio.Restriction.XXX restriction objects or iterable.

        +
        +
        Returns:
        +

        frags – list of Dseq objects formed by the digestion

        +
        +
        Return type:
        +

        list

        +
        +
        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> seq=Dseq("ggatccnnngaattc")
        +>>> seq
        +Dseq(-15)
        +ggatccnnngaattc
        +cctaggnnncttaag
        +>>> from Bio.Restriction import BamHI,EcoRI
        +>>> type(seq.cut(BamHI))
        +<class 'tuple'>
        +>>> for frag in seq.cut(BamHI): print(repr(frag))
        +Dseq(-5)
        +g
        +cctag
        +Dseq(-14)
        +gatccnnngaattc
        +    gnnncttaag
        +>>> seq.cut(EcoRI, BamHI) ==  seq.cut(BamHI, EcoRI)
        +True
        +>>> a,b,c = seq.cut(EcoRI, BamHI)
        +>>> a+b+c
        +Dseq(-15)
        +ggatccnnngaattc
        +cctaggnnncttaag
        +>>>
        +
        +
        +
        + +
        +
        +cutsite_is_valid(cutsite: Tuple[Tuple[int, int], _AbstractCut | None]) bool[source]
        +

        Returns False if: +- Cut positions fall outside the sequence (could be moved to Biopython) +- Overhang is not double stranded +- Recognition site is not double stranded or is outside the sequence +- For enzymes that cut twice, it checks that at least one possibility is valid

        +
        + +
        +
        +get_cutsites(*enzymes: EnzymesType) List[Tuple[Tuple[int, int], _AbstractCut | None]][source]
        +

        Returns a list of cutsites, represented represented as ((cut_watson, ovhg), enz):

        +
          +
        • cut_watson is a positive integer contained in [0,len(seq)), where seq is the sequence +that will be cut. It represents the position of the cut on the watson strand, using the full +sequence as a reference. By “full sequence” I mean the one you would get from str(Dseq).

        • +
        • ovhg is the overhang left after the cut. It has the same meaning as ovhg in +the Bio.Restriction enzyme objects, or pydna’s Dseq property.

        • +
        • +
          enz is the enzyme object. It’s not necessary to perform the cut, but can be

          used to keep track of which enzyme was used.

          +
          +
          +
        • +
        +

        Cuts are only returned if the recognition site and overhang are on the double-strand +part of the sequence.

        +
        +
        Parameters:
        +

        enzymes (Union[_RestrictionBatch,list[_AbstractCut]]) –

        +
        +
        Return type:
        +

        list[tuple[tuple[int,int], _AbstractCut]]

        +
        +
        +

        Examples

        +
        >>> from Bio.Restriction import EcoRI
        +>>> from pydna.dseq import Dseq
        +>>> seq = Dseq('AAGAATTCAAGAATTC')
        +>>> seq.get_cutsites(EcoRI)
        +[((3, -4), EcoRI), ((11, -4), EcoRI)]
        +
        +
        +

        cut_watson is defined with respect to the “full sequence”, not the +watson strand:

        +
        >>> dseq = Dseq.from_full_sequence_and_overhangs('aaGAATTCaa', 1, 0)
        +>>> dseq
        +Dseq(-10)
        + aGAATTCaa
        +ttCTTAAGtt
        +>>> dseq.get_cutsites([EcoRI])
        +[((3, -4), EcoRI)]
        +
        +
        +

        Cuts are only returned if the recognition site and overhang are on the double-strand +part of the sequence.

        +
        >>> Dseq('GAATTC').get_cutsites([EcoRI])
        +[((1, -4), EcoRI)]
        +>>> Dseq.from_full_sequence_and_overhangs('GAATTC', -1, 0).get_cutsites([EcoRI])
        +[]
        +
        +
        +
        + +
        +
        +left_end_position() Tuple[int, int][source]
        +

        The index in the full sequence of the watson and crick start positions.

        +

        full sequence (str(self)) for all three cases is AAA

        +
        AAA              AA               AAT
        + TT             TTT               TTT
        +Returns (0, 1)  Returns (1, 0)    Returns (0, 0)
        +
        +
        +
        + +
        +
        +right_end_position() Tuple[int, int][source]
        +

        The index in the full sequence of the watson and crick end positions.

        +

        full sequence (str(self)) for all three cases is AAA

        +

        ` +AAA               AA                   AAA +TT                TTT                  TTT +Returns (3, 2)    Returns (2, 3)       Returns (3, 3) +`

        +
        + +
        +
        +get_cut_parameters(cut: Tuple[Tuple[int, int], _AbstractCut | None] | None, is_left: bool) Tuple[int, int, int][source]
        +

        For a given cut expressed as ((cut_watson, ovhg), enz), returns +a tuple (cut_watson, cut_crick, ovhg).

        +
          +
        • cut_watson: see get_cutsites docs

        • +
        • cut_crick: equivalent of cut_watson in the crick strand

        • +
        • ovhg: see get_cutsites docs

        • +
        +

        The cut can be None if it represents the left or right end of the sequence. +Then it will return the position of the watson and crick ends with respect +to the “full sequence”. The is_left parameter is only used in this case.

        +
        + +
        +
        +apply_cut(left_cut: Tuple[Tuple[int, int], _AbstractCut | None], right_cut: Tuple[Tuple[int, int], _AbstractCut | None]) Dseq[source]
        +

        Extracts a subfragment of the sequence between two cuts.

        +

        For more detail see the documentation of get_cutsite_pairs.

        +
        +
        Parameters:
        +
        +
        +
        Return type:
        +

        Dseq

        +
        +
        +

        Examples

        +
        >>> from Bio.Restriction import EcoRI
        +>>> from pydna.dseq import Dseq
        +>>> dseq = Dseq('aaGAATTCaaGAATTCaa')
        +>>> cutsites = dseq.get_cutsites([EcoRI])
        +>>> cutsites
        +[((3, -4), EcoRI), ((11, -4), EcoRI)]
        +>>> p1, p2, p3 = dseq.get_cutsite_pairs(cutsites)
        +>>> p1
        +(None, ((3, -4), EcoRI))
        +>>> dseq.apply_cut(*p1)
        +Dseq(-7)
        +aaG
        +ttCTTAA
        +>>> p2
        +(((3, -4), EcoRI), ((11, -4), EcoRI))
        +>>> dseq.apply_cut(*p2)
        +Dseq(-12)
        +AATTCaaG
        +    GttCTTAA
        +>>> p3
        +(((11, -4), EcoRI), None)
        +>>> dseq.apply_cut(*p3)
        +Dseq(-7)
        +AATTCaa
        +    Gtt
        +
        +
        +
        >>> dseq = Dseq('TTCaaGAA', circular=True)
        +>>> cutsites = dseq.get_cutsites([EcoRI])
        +>>> cutsites
        +[((6, -4), EcoRI)]
        +>>> pair = dseq.get_cutsite_pairs(cutsites)[0]
        +>>> pair
        +(((6, -4), EcoRI), ((6, -4), EcoRI))
        +>>> dseq.apply_cut(*pair)
        +Dseq(-12)
        +AATTCaaG
        +    GttCTTAA
        +
        +
        +
        + +
        +
        +get_cutsite_pairs(cutsites: List[Tuple[Tuple[int, int], _AbstractCut | None]]) List[Tuple[None | Tuple[Tuple[int, int], _AbstractCut | None], None | Tuple[Tuple[int, int], _AbstractCut | None]]][source]
        +

        Returns pairs of cutsites that render the edges of the resulting fragments.

        +

        A fragment produced by restriction is represented by a tuple of length 2 that +may contain cutsites or None:

        +
        +
          +
        • Two cutsites: represents the extraction of a fragment between those two +cutsites, in that orientation. To represent the opening of a circular +molecule with a single cutsite, we put the same cutsite twice.

        • +
        • None, cutsite: represents the extraction of a fragment between the left +edge of linear sequence and the cutsite.

        • +
        • cutsite, None: represents the extraction of a fragment between the cutsite +and the right edge of a linear sequence.

        • +
        +
        +
        +
        Parameters:
        +

        cutsites (list[tuple[tuple[int,int], _AbstractCut]]) –

        +
        +
        Return type:
        +

        list[tuple[tuple[tuple[int,int], _AbstractCut]|None],tuple[tuple[int,int], _AbstractCut]|None]

        +
        +
        +

        Examples

        +
        >>> from Bio.Restriction import EcoRI
        +>>> from pydna.dseq import Dseq
        +>>> dseq = Dseq('aaGAATTCaaGAATTCaa')
        +>>> cutsites = dseq.get_cutsites([EcoRI])
        +>>> cutsites
        +[((3, -4), EcoRI), ((11, -4), EcoRI)]
        +>>> dseq.get_cutsite_pairs(cutsites)
        +[(None, ((3, -4), EcoRI)), (((3, -4), EcoRI), ((11, -4), EcoRI)), (((11, -4), EcoRI), None)]
        +
        +
        +
        >>> dseq = Dseq('TTCaaGAA', circular=True)
        +>>> cutsites = dseq.get_cutsites([EcoRI])
        +>>> cutsites
        +[((6, -4), EcoRI)]
        +>>> dseq.get_cutsite_pairs(cutsites)
        +[(((6, -4), EcoRI), ((6, -4), EcoRI))]
        +
        +
        +
        + +
        + +
        +
        +pydna.all.read(data, ds=True)[source]
        +

        This function is similar the parse() function but expects one and only +one sequence or and exception is thrown.

        +
        +
        Parameters:
        +
          +
        • data (string) – see below

        • +
        • ds (bool) – Double stranded or single stranded DNA, if True return +Dseqrecord objects, else Bio.SeqRecord objects.

        • +
        +
        +
        Returns:
        +

        contains the first Dseqrecord or SeqRecord object parsed.

        +
        +
        Return type:
        +

        Dseqrecord

        +
        +
        +

        Notes

        +

        The data parameter is similar to the data parameter for parse().

        +
        +

        See also

        +

        parse

        +
        +
        + +
        +
        +pydna.all.read_primer(data)[source]
        +

        Use this function to read a primer sequence from a string or a local file. +The usage is similar to the parse_primer() function.

        +
        + +
        +
        +pydna.all.parse(data, ds=True)[source]
        +

        Return all DNA sequences found in data.

        +

        If no sequences are found, an empty list is returned. This is a greedy +function, use carefully.

        +
        +
        Parameters:
        +
          +
        • data (string or iterable) –

          The data parameter is a string containing:

          +
            +
          1. an absolute path to a local file. +The file will be read in text +mode and parsed for EMBL, FASTA +and Genbank sequences. Can be +a string or a Path object.

          2. +
          3. a string containing one or more +sequences in EMBL, GENBANK, +or FASTA format. Mixed formats +are allowed.

          4. +
          5. data can be a list or other iterable where the elements are 1 or 2

          6. +
          +

        • +
        • ds (bool) – If True double stranded Dseqrecord objects are returned. +If False single stranded Bio.SeqRecord [6] objects are +returned.

        • +
        +
        +
        Returns:
        +

        contains Dseqrecord or SeqRecord objects

        +
        +
        Return type:
        +

        list

        +
        +
        +

        References

        + +
        +

        See also

        +

        read

        +
        +
        + +
        +
        +pydna.all.parse_primers(data)[source]
        +

        docstring.

        +
        + +
        +
        +pydna.all.ape(*args, **kwargs)[source]
        +

        docstring.

        +
        + +
        +
        +pydna.all.primer_design(template, fp=None, rp=None, limit=13, target_tm=55.0, tm_func=_tm_default, estimate_function=None, **kwargs)[source]
        +

        This function designs a forward primer and a reverse primer for PCR amplification +of a given template sequence.

        +

        The template argument is a Dseqrecord object or equivalent containing the template sequence.

        +

        The optional fp and rp arguments can contain an existing primer for the sequence (either the forward or reverse primer). +One or the other primers can be specified, not both (since then there is nothing to design!, use the pydna.amplify.pcr function instead).

        +

        The limit argument is the minimum length of the primer. The default value is 13.

        +

        If one of the primers is given, the other primer is designed to match in terms of Tm. +If both primers are designed, they will be designed to target_tm

        +

        tm_func is a function that takes an ascii string representing an oligonuceotide as argument and returns a float. +Some useful functions can be found in the pydna.tm module, but can be substituted for a custom made function.

        +

        estimate_function is a tm_func-like function that is used to get a first guess for the primer design, that is then used as starting +point for the final result. This is useful when the tm_func function is slow to calculate (e.g. it relies on an +external API, such as the NEB primer design API). The estimate_function should be faster than the tm_func function. +The default value is None. +To use the default tm_func as estimate function to get the NEB Tm faster, you can do: +primer_design(dseqr, target_tm=55, tm_func=tm_neb, estimate_function=tm_default).

        +

        The function returns a pydna.amplicon.Amplicon class instance. This object has +the object.forward_primer and object.reverse_primer properties which contain the designed primers.

        +
        +
        Parameters:
        +
          +
        • template (pydna.dseqrecord.Dseqrecord) – a Dseqrecord object. The only required argument.

        • +
        • fp (pydna.primer.Primer, optional) – optional pydna.primer.Primer objects containing one primer each.

        • +
        • rp (pydna.primer.Primer, optional) – optional pydna.primer.Primer objects containing one primer each.

        • +
        • target_tm (float, optional) – target tm for the primers, set to 55°C by default.

        • +
        • tm_func (function) – Function used for tm calculation. This function takes an ascii string +representing an oligonuceotide as argument and returns a float. +Some useful functions can be found in the pydna.tm module, but can be +substituted for a custom made function.

        • +
        +
        +
        Returns:
        +

        result

        +
        +
        Return type:
        +

        Amplicon

        +
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> t=Dseqrecord("atgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatg")
        +>>> t
        +Dseqrecord(-64)
        +>>> from pydna.design import primer_design
        +>>> ampl = primer_design(t)
        +>>> ampl
        +Amplicon(64)
        +>>> ampl.forward_primer
        +f64 17-mer:5'-atgactgctaacccttc-3'
        +>>> ampl.reverse_primer
        +r64 18-mer:5'-catcgtaagtttcgaacg-3'
        +>>> print(ampl.figure())
        +5atgactgctaacccttc...cgttcgaaacttacgatg3
        +                     ||||||||||||||||||
        +                    3gcaagctttgaatgctac5
        +5atgactgctaacccttc3
        + |||||||||||||||||
        +3tactgacgattgggaag...gcaagctttgaatgctac5
        +>>> pf = "GGATCC" + ampl.forward_primer
        +>>> pr = "GGATCC" + ampl.reverse_primer
        +>>> pf
        +f64 23-mer:5'-GGATCCatgactgct..ttc-3'
        +>>> pr
        +r64 24-mer:5'-GGATCCcatcgtaag..acg-3'
        +>>> from pydna.amplify import pcr
        +>>> pcr_prod = pcr(pf, pr, t)
        +>>> print(pcr_prod.figure())
        +      5atgactgctaacccttc...cgttcgaaacttacgatg3
        +                           ||||||||||||||||||
        +                          3gcaagctttgaatgctacCCTAGG5
        +5GGATCCatgactgctaacccttc3
        +       |||||||||||||||||
        +      3tactgacgattgggaag...gcaagctttgaatgctac5
        +>>> print(pcr_prod.seq)
        +GGATCCatgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatgGGATCC
        +>>> from pydna.primer import Primer
        +>>> pf = Primer("atgactgctaacccttccttggtgttg", id="myprimer")
        +>>> ampl = primer_design(t, fp = pf)
        +>>> ampl.forward_primer
        +myprimer 27-mer:5'-atgactgctaaccct..ttg-3'
        +>>> ampl.reverse_primer
        +r64 32-mer:5'-catcgtaagtttcga..atc-3'
        +
        +
        +
        + +
        +
        +pydna.all.assembly_fragments(f, overlap=35, maxlink=40, circular=False)[source]
        +

        This function return a list of 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 +recombination.

        +

        Given that we have two linear pydna.amplicon.Amplicon objects a and b

        +

        we can modify the reverse primer of a and forward primer of b with tails to allow +fusion by fusion PCR, Gibson assembly or in-vivo homologous recombination. +The basic requirements for the primers for the three techniques are the same.

        +
         _________ a _________
        +/                     \
        +agcctatcatcttggtctctgca
        +                  |||||
        +                 <gacgt
        +agcct>
        +|||||
        +tcggatagtagaaccagagacgt
        +
        +                        __________ b ________
        +                       /                     \
        +                       TTTATATCGCATGACTCTTCTTT
        +                                         |||||
        +                                        <AGAAA
        +                       TTTAT>
        +                       |||||
        +                       AAATATAGCGTACTGAGAAGAAA
        +
        +agcctatcatcttggtctctgcaTTTATATCGCATGACTCTTCTTT
        +||||||||||||||||||||||||||||||||||||||||||||||
        +tcggatagtagaaccagagacgtAAATATAGCGTACTGAGAAGAAA
        +\___________________ c ______________________/
        +
        +
        +

        Design tailed primers incorporating a part of the next or previous fragment to be assembled.

        +
        agcctatcatcttggtctctgca
        +|||||||||||||||||||||||
        +                gagacgtAAATATA
        +
        +|||||||||||||||||||||||
        +tcggatagtagaaccagagacgt
        +
        +                       TTTATATCGCATGACTCTTCTTT
        +                       |||||||||||||||||||||||
        +
        +                ctctgcaTTTATAT
        +                       |||||||||||||||||||||||
        +                       AAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        PCR products with flanking sequences are formed in the PCR process.

        +
        agcctatcatcttggtctctgcaTTTATAT
        +||||||||||||||||||||||||||||||
        +tcggatagtagaaccagagacgtAAATATA
        +                \____________/
        +
        +                   identical
        +                   sequences
        +                 ____________
        +                /            \
        +                ctctgcaTTTATATCGCATGACTCTTCTTT
        +                ||||||||||||||||||||||||||||||
        +                gagacgtAAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        The fragments can be fused by any of the techniques mentioned earlier to form c:

        +
        agcctatcatcttggtctctgcaTTTATATCGCATGACTCTTCTTT
        +||||||||||||||||||||||||||||||||||||||||||||||
        +tcggatagtagaaccagagacgtAAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        The first argument of this function is a list of sequence objects containing +Amplicons and other similar objects.

        +

        At least every second sequence object needs to be an Amplicon

        +

        This rule exists because if a sequence object is that is not a PCR product +is to be fused with another fragment, that other fragment needs to be an Amplicon +so that the primer of the other object can be modified to include the whole stretch +of sequence homology needed for the fusion. See the example below where a is a +non-amplicon (a linear plasmid vector for instance)

        +
         _________ a _________           __________ b ________
        +/                     \         /                     \
        +agcctatcatcttggtctctgca   <-->  TTTATATCGCATGACTCTTCTTT
        +|||||||||||||||||||||||         |||||||||||||||||||||||
        +tcggatagtagaaccagagacgt                          <AGAAA
        +                                TTTAT>
        +                                |||||||||||||||||||||||
        +                          <-->  AAATATAGCGTACTGAGAAGAAA
        +
        +     agcctatcatcttggtctctgcaTTTATATCGCATGACTCTTCTTT
        +     ||||||||||||||||||||||||||||||||||||||||||||||
        +     tcggatagtagaaccagagacgtAAATATAGCGTACTGAGAAGAAA
        +     \___________________ c ______________________/
        +
        +
        +

        In this case only the forward primer of b is fitted with a tail with a part a:

        +
        agcctatcatcttggtctctgca
        +|||||||||||||||||||||||
        +tcggatagtagaaccagagacgt
        +
        +                       TTTATATCGCATGACTCTTCTTT
        +                       |||||||||||||||||||||||
        +                                        <AGAAA
        +         tcttggtctctgcaTTTATAT
        +                       |||||||||||||||||||||||
        +                       AAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        PCR products with flanking sequences are formed in the PCR process.

        +
        agcctatcatcttggtctctgcaTTTATAT
        +||||||||||||||||||||||||||||||
        +tcggatagtagaaccagagacgtAAATATA
        +                \____________/
        +
        +                   identical
        +                   sequences
        +                 ____________
        +                /            \
        +                ctctgcaTTTATATCGCATGACTCTTCTTT
        +                ||||||||||||||||||||||||||||||
        +                gagacgtAAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        The fragments can be fused by for example Gibson assembly:

        +
        agcctatcatcttggtctctgcaTTTATAT
        +||||||||||||||||||||||||||||||
        +tcggatagtagaacca
        +
        +                             TCGCATGACTCTTCTTT
        +                ||||||||||||||||||||||||||||||
        +                gagacgtAAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        to form c:

        +
        agcctatcatcttggtctctgcaTTTATATCGCATGACTCTTCTTT
        +||||||||||||||||||||||||||||||||||||||||||||||
        +tcggatagtagaaccagagacgtAAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        The first argument of this function is a list of sequence objects containing +Amplicons and other similar objects.

        +

        The overlap argument controls how many base pairs of overlap required between +adjacent sequence fragments. In the junction between Amplicons, tails with the +length of about half of this value is added to the two primers +closest to the junction.

        +
        >       <
        +Amplicon1
        +         Amplicon2
        +         >       <
        +
        +         ⇣
        +
        +>       <-
        +Amplicon1
        +         Amplicon2
        +        ->       <
        +
        +
        +

        In the case of an Amplicon adjacent to a Dseqrecord object, the tail will +be twice as long (1*overlap) since the +recombining sequence is present entirely on this primer:

        +
        Dseqrecd1
        +         Amplicon1
        +         >       <
        +
        +         ⇣
        +
        +Dseqrecd1
        +         Amplicon1
        +       -->       <
        +
        +
        +

        Note that if the sequence of DNA fragments starts or stops with an Amplicon, +the very first and very last prinmer will not be modified i.e. assembles are +always assumed to be linear. There are simple tricks around that for circular +assemblies depicted in the last two examples below.

        +

        The maxlink arguments controls the cut off length for sequences that will be +synhtesized by adding them to primers for the adjacent fragment(s). The +argument list may contain short spacers (such as spacers between fusion proteins).

        +
        Example 1: Linear assembly of PCR products (pydna.amplicon.Amplicon class objects) ------
        +
        +>       <         >       <
        +Amplicon1         Amplicon3
        +         Amplicon2         Amplicon4
        +         >       <         >       <
        +
        +                     ⇣
        +                     pydna.design.assembly_fragments
        +                     ⇣
        +
        +>       <-       ->       <-                      pydna.assembly.Assembly
        +Amplicon1         Amplicon3
        +         Amplicon2         Amplicon4     ➤  Amplicon1Amplicon2Amplicon3Amplicon4
        +        ->       <-       ->       <
        +
        +Example 2: Linear assembly of alternating Amplicons and other fragments
        +
        +>       <         >       <
        +Amplicon1         Amplicon2
        +         Dseqrecd1         Dseqrecd2
        +
        +                     ⇣
        +                     pydna.design.assembly_fragments
        +                     ⇣
        +
        +>       <--     -->       <--                     pydna.assembly.Assembly
        +Amplicon1         Amplicon2
        +         Dseqrecd1         Dseqrecd2     ➤  Amplicon1Dseqrecd1Amplicon2Dseqrecd2
        +
        +Example 3: Linear assembly of alternating Amplicons and other fragments
        +
        +Dseqrecd1         Dseqrecd2
        +         Amplicon1         Amplicon2
        +         >       <       -->       <
        +
        +                     ⇣
        +             pydna.design.assembly_fragments
        +                     ⇣
        +                                                  pydna.assembly.Assembly
        +Dseqrecd1         Dseqrecd2
        +         Amplicon1         Amplicon2     ➤  Dseqrecd1Amplicon1Dseqrecd2Amplicon2
        +       -->       <--     -->       <
        +
        +Example 4: Circular assembly of alternating Amplicons and other fragments
        +
        +                 ->       <==
        +Dseqrecd1         Amplicon2
        +         Amplicon1         Dseqrecd1
        +       -->       <-
        +                     ⇣
        +                     pydna.design.assembly_fragments
        +                     ⇣
        +                                                   pydna.assembly.Assembly
        +                 ->       <==
        +Dseqrecd1         Amplicon2                    -Dseqrecd1Amplicon1Amplicon2-
        +         Amplicon1                       ➤    |                             |
        +       -->       <-                            -----------------------------
        +
        +------ Example 5: Circular assembly of Amplicons
        +
        +>       <         >       <
        +Amplicon1         Amplicon3
        +         Amplicon2         Amplicon1
        +         >       <         >       <
        +
        +                     ⇣
        +                     pydna.design.assembly_fragments
        +                     ⇣
        +
        +>       <=       ->       <-
        +Amplicon1         Amplicon3
        +         Amplicon2         Amplicon1
        +        ->       <-       +>       <
        +
        +                     ⇣
        +             make new Amplicon using the Amplicon1.template and
        +             the last fwd primer and the first rev primer.
        +                     ⇣
        +                                                   pydna.assembly.Assembly
        ++>       <=       ->       <-
        + Amplicon1         Amplicon3                  -Amplicon1Amplicon2Amplicon3-
        +          Amplicon2                      ➤   |                             |
        +         ->       <-                          -----------------------------
        +
        +
        +
        +
        Parameters:
        +
          +
        • f (list of pydna.amplicon.Amplicon and other Dseqrecord like objects) – list Amplicon and Dseqrecord object for which fusion primers should be constructed.

        • +
        • overlap (int, optional) – Length of required overlap between fragments.

        • +
        • 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

        +
        [Amplicon1,
        + Amplicon2, ...]
        +
        +
        +

        +
        +
        Return type:
        +

        list of pydna.amplicon.Amplicon and other Dseqrecord like objects pydna.amplicon.Amplicon objects

        +
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> from pydna.design import primer_design
        +>>> a=primer_design(Dseqrecord("atgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatg"))
        +>>> b=primer_design(Dseqrecord("ccaaacccaccaggtaccttatgtaagtacttcaagtcgccagaagacttcttggtcaagttgcc"))
        +>>> c=primer_design(Dseqrecord("tgtactggtgctgaaccttgtatcaagttgggtgttgacgccattgccccaggtggtcgtttcgtt"))
        +>>> from pydna.design import assembly_fragments
        +>>> # We would like a circular recombination, so the first sequence has to be repeated
        +>>> fa1,fb,fc,fa2 = assembly_fragments([a,b,c,a])
        +>>> # Since all fragments are Amplicons, we need to extract the rp of the 1st and fp of the last fragments.
        +>>> from pydna.amplify import pcr
        +>>> fa = pcr(fa2.forward_primer, fa1.reverse_primer, a)
        +>>> [fa,fb,fc]
        +[Amplicon(100), Amplicon(101), Amplicon(102)]
        +>>> fa.name, fb.name, fc.name = "fa fb fc".split()
        +>>> from pydna.assembly import Assembly
        +>>> assemblyobj = Assembly([fa,fb,fc])
        +>>> assemblyobj
        +Assembly
        +fragments....: 100bp 101bp 102bp
        +limit(bp)....: 25
        +G.nodes......: 6
        +algorithm....: common_sub_strings
        +>>> assemblyobj.assemble_linear()
        +[Contig(-231), Contig(-166), Contig(-36)]
        +>>> assemblyobj.assemble_circular()[0].seguid()
        +'cdseguid=85t6tfcvWav0wnXEIb-lkUtrl4s'
        +>>> (a+b+c).looped().seguid()
        +'cdseguid=85t6tfcvWav0wnXEIb-lkUtrl4s'
        +>>> print(assemblyobj.assemble_circular()[0].figure())
        + -|fa|36
        +|     \/
        +|     /\
        +|     36|fb|36
        +|           \/
        +|           /\
        +|           36|fc|36
        +|                 \/
        +|                 /\
        +|                 36-
        +|                    |
        + --------------------
        +>>>
        +
        +
        +
        + +
        +
        +pydna.all.circular_assembly_fragments(f, overlap=35, maxlink=40)[source]
        +

        Equivalent to assembly_fragments with circular=True.

        +

        Deprecated, kept for backward compatibility. Use assembly_fragments with circular=True instead.

        +
        + +
        +
        +pydna.all.eq(*args, **kwargs)[source]
        +

        Compare two or more DNA sequences for equality.

        +

        Compares two or more DNA sequences for equality i.e. if they +represent the same double stranded DNA molecule.

        +
        +
        Parameters:
        +
          +
        • args (iterable) – iterable containing sequences +args can be strings, Biopython Seq or SeqRecord, Dseqrecord +or dsDNA objects.

        • +
        • circular (bool, optional) – Consider all molecules circular or linear

        • +
        • linear (bool, optional) – Consider all molecules circular or linear

        • +
        +
        +
        Returns:
        +

        eq – Returns True or False

        +
        +
        Return type:
        +

        bool

        +
        +
        +

        Notes

        +

        Compares two or more DNA sequences for equality i.e. if they +represent the same DNA molecule.

        +

        Two linear sequences are considiered equal if either:

        +
          +
        1. They have the same sequence (case insensitive)

        2. +
        3. One sequence is the reverse complement of the other

        4. +
        +

        Two circular sequences are considered equal if they are circular +permutations meaning that they have the same length and:

        +
          +
        1. One sequence can be found in the concatenation of the other sequence with itself.

        2. +
        3. The reverse complement of one sequence can be found in the concatenation of the other sequence with itself.

        4. +
        +

        The topology for the comparison can be set using one of the keywords +linear or circular to True or False.

        +

        If circular or linear is not set, it will be deduced from the topology of +each sequence for sequences that have a linear or circular attribute +(like Dseq and Dseqrecord).

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> from pydna.utils import eq
        +>>> eq("aaa","AAA")
        +True
        +>>> eq("aaa","AAA","TTT")
        +True
        +>>> eq("aaa","AAA","TTT","tTt")
        +True
        +>>> eq("aaa","AAA","TTT","tTt", linear=True)
        +True
        +>>> eq("Taaa","aTaa", linear = True)
        +False
        +>>> eq("Taaa","aTaa", circular = True)
        +True
        +>>> a=Dseqrecord("Taaa")
        +>>> b=Dseqrecord("aTaa")
        +>>> eq(a,b)
        +False
        +>>> eq(a,b,circular=True)
        +True
        +>>> a=a.looped()
        +>>> b=b.looped()
        +>>> eq(a,b)
        +True
        +>>> eq(a,b,circular=False)
        +False
        +>>> eq(a,b,linear=True)
        +False
        +>>> eq(a,b,linear=False)
        +True
        +>>> eq("ggatcc","GGATCC")
        +True
        +>>> eq("ggatcca","GGATCCa")
        +True
        +>>> eq("ggatcca","tGGATCC")
        +True
        +
        +
        +
        + +
        +
        +pydna.all.gbtext_clean(gbtext)[source]
        +

        This function takes a string containing one genbank sequence +in Genbank format and returns a named tuple containing two fields, +the gbtext containing a string with the corrected genbank sequence and +jseq which contains the JSON intermediate.

        +

        Examples

        +
        >>> s = '''LOCUS       New_DNA      3 bp    DNA   CIRCULAR SYN        19-JUN-2013
        +... DEFINITION  .
        +... ACCESSION
        +... VERSION
        +... SOURCE      .
        +...   ORGANISM  .
        +... COMMENT
        +... COMMENT     ApEinfo:methylated:1
        +... ORIGIN
        +...         1 aaa
        +... //'''
        +>>> from pydna.readers import read
        +>>> read(s)  
        +/home/bjorn/anaconda3/envs/bjorn36/lib/python3.6/site-packages/Bio/GenBank/Scanner.py:1388: BiopythonParserWarning: Malformed LOCUS line found - is this correct?
        +:'LOCUS       New_DNA      3 bp    DNA   CIRCULAR SYN        19-JUN-2013\n'
        +  "correct?\n:%r" % line, BiopythonParserWarning)
        +Traceback (most recent call last):
        +  File "/home/bjorn/python_packages/pydna/pydna/readers.py", line 48, in read
        +    results = results.pop()
        +IndexError: pop from empty list
        +
        +During handling of the above exception, another exception occurred:
        +
        +Traceback (most recent call last):
        +  File "<stdin>", line 1, in <module>
        +  File "/home/bjorn/python_packages/pydna/pydna/readers.py", line 50, in read
        +    raise ValueError("No sequences found in data:\n({})".format(data[:79]))
        +ValueError: No sequences found in data:
        +(LOCUS       New_DNA      3 bp    DNA   CIRCULAR SYN        19-JUN-2013
        +DEFINITI)
        +>>> from pydna.genbankfixer import gbtext_clean
        +>>> s2, j2 = gbtext_clean(s)
        +>>> print(s2)
        +LOCUS       New_DNA                    3 bp ds-DNA     circular SYN 19-JUN-2013
        +DEFINITION  .
        +ACCESSION
        +VERSION
        +SOURCE      .
        +ORGANISM  .
        +COMMENT
        +COMMENT     ApEinfo:methylated:1
        +FEATURES             Location/Qualifiers
        +ORIGIN
        +        1 aaa
        +//
        +>>> s3 = read(s2)
        +>>> s3
        +Dseqrecord(o3)
        +>>> print(s3.format())
        +LOCUS       New_DNA                    3 bp    DNA     circular SYN 19-JUN-2013
        +DEFINITION  .
        +ACCESSION   New_DNA
        +VERSION     New_DNA
        +KEYWORDS    .
        +SOURCE
        +  ORGANISM  .
        +            .
        +COMMENT
        +            ApEinfo:methylated:1
        +FEATURES             Location/Qualifiers
        +ORIGIN
        +        1 aaa
        +//
        +
        +
        +
        + +
        +
        +class pydna.all.PrimerList(initlist: ~typing.Iterable = None, path: (<class 'str'>, <class 'pathlib.Path'>) = None, *args, identifier: str = "p", **kwargs)[source]
        +

        Bases: UserList

        +

        Read a text file with primers.

        +

        The primers can be of any format readable by the parse_primers +function. Lines beginning with # are ignored. Path defaults to +the path given by the pydna_primers environment variable.

        +

        The primer list does not accept new primers. Use the +assign_numbers_to_new_primers method and paste the new +primers at the top of the list.

        +

        The primer list remembers the numbers of accessed primers. +The indices of accessed primers are stored in the .accessed +property.

        +
        +
        +property accessed
        +

        docstring.

        +
        + +
        +
        +assign_numbers(lst: list)[source]
        +

        Find new primers in lst.

        +

        Returns a string containing new primers with their assigned +numbers. This string can be copied and pasted to the primer +text file.

        +
        + +
        +
        +pydna_code_from_list(lst: list)[source]
        +

        Pydna code for a list of primer objects.

        +
        + +
        +
        +open_folder()[source]
        +

        Open folder where primer file is located.

        +
        + +
        +
        +code(lst: list)
        +

        Pydna code for a list of primer objects.

        +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_amplicon.html b/modules/pydna_amplicon.html new file mode 100644 index 00000000..82da39a0 --- /dev/null +++ b/modules/pydna_amplicon.html @@ -0,0 +1,299 @@ + + + + + + + + + pydna.amplicon — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.amplicon

        +

        This module provides the Amplicon class for PCR simulation. +This class is not meant to be use directly but is +used by the amplify module

        +
        +
        +class pydna.amplicon.Amplicon(record, *args, template=None, forward_primer=None, reverse_primer=None, **kwargs)[source]
        +

        Bases: Dseqrecord

        +

        The Amplicon class holds information about a PCR reaction involving two +primers and one template. This class is used by the Anneal class and is not +meant to be instantiated directly.

        +
        +
        Parameters:
        +
          +
        • forward_primer (SeqRecord(Biopython)) – SeqRecord object holding the forward (sense) primer

        • +
        • reverse_primer (SeqRecord(Biopython)) – SeqRecord object holding the reverse (antisense) primer

        • +
        • template (Dseqrecord) – Dseqrecord object holding the template (circular or linear)

        • +
        +
        +
        +
        +
        +classmethod from_SeqRecord(record, *args, path=None, **kwargs)[source]
        +
        + +
        +
        +reverse_complement()[source]
        +

        Reverse complement.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggaatt")
        +>>> a
        +Dseqrecord(-6)
        +>>> a.seq
        +Dseq(-6)
        +ggaatt
        +ccttaa
        +>>> a.reverse_complement().seq
        +Dseq(-6)
        +aattcc
        +ttaagg
        +>>>
        +
        +
        + +
        + +
        +
        +rc()
        +

        Reverse complement.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggaatt")
        +>>> a
        +Dseqrecord(-6)
        +>>> a.seq
        +Dseq(-6)
        +ggaatt
        +ccttaa
        +>>> a.reverse_complement().seq
        +Dseq(-6)
        +aattcc
        +ttaagg
        +>>>
        +
        +
        + +
        + +
        +
        +figure()[source]
        +

        This method returns a simple figure of the two primers binding +to a part of the template.

        +
        5tacactcaccgtctatcattatc...cgactgtatcatctgatagcac3
        +                           ||||||||||||||||||||||
        +                          3gctgacatagtagactatcgtg5
        +5tacactcaccgtctatcattatc3
        + |||||||||||||||||||||||
        +3atgtgagtggcagatagtaatag...gctgacatagtagactatcgtg5
        +
        +
        +
        +
        Returns:
        +

        figure – A string containing a text representation of the primers +annealing on the template (see example above).

        +
        +
        Return type:
        +

        string

        +
        +
        +
        + +
        +
        +set_forward_primer_footprint(length)[source]
        +
        + +
        +
        +set_reverse_primer_footprint(length)[source]
        +
        + +
        +
        +program()[source]
        +
        + +
        +
        +dbd_program()[source]
        +
        + +
        +
        +primers()[source]
        +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_amplify.html b/modules/pydna_amplify.html new file mode 100644 index 00000000..1b633b02 --- /dev/null +++ b/modules/pydna_amplify.html @@ -0,0 +1,297 @@ + + + + + + + + + pydna.amplify — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.amplify

        +

        This module provide the Anneal class and the pcr() function +for PCR simulation. The pcr function is simpler to use, but expects only one +PCR product. The Anneal class should be used if more flexibility is required.

        +

        Primers with 5’ tails as well as inverse PCR on circular templates are handled +correctly.

        +
        +
        +class pydna.amplify.Anneal(primers, template, limit=13, **kwargs)[source]
        +

        Bases: object

        +

        The Anneal class has the following important attributes:

        +
        +
        +forward_primers
        +

        Description of forward_primers.

        +
        +
        Type:
        +

        list

        +
        +
        +
        + +
        +
        +reverse_primers
        +

        Description of reverse_primers.

        +
        +
        Type:
        +

        list

        +
        +
        +
        + +
        +
        +template
        +

        A copy of the template argument. Primers annealing sites has been +added as features that can be visualized in a seqence editor such as +ApE.

        +
        +
        Type:
        +

        Dseqrecord

        +
        +
        +
        + +
        +
        +limit
        +

        The limit of PCR primer annealing, default is 13 bp.

        +
        +
        Type:
        +

        int, optional

        +
        +
        +
        + +
        +
        +property products
        +
        + +
        +
        +report()
        +

        returns a short report describing if or where primer +anneal on the template.

        +
        + +
        + +
        +
        +pydna.amplify.pcr(*args, **kwargs) Amplicon[source]
        +

        pcr is a convenience function for the Anneal class to simplify its +usage, especially from the command line. If more than one or no PCR +product is formed, a ValueError is raised.

        +

        args is any iterable of Dseqrecords or an iterable of iterables of +Dseqrecords. args will be greedily flattened.

        +
        +
        Parameters:
        +
          +
        • args (iterable containing sequence objects) – Several arguments are also accepted.

        • +
        • limit (int = 13, optional) – limit length of the annealing part of the primers.

        • +
        +
        +
        +

        Notes

        +

        sequences in args could be of type:

        +
          +
        • string

        • +
        • Seq

        • +
        • SeqRecord (or subclass)

        • +
        • Dseqrecord (or sublcass)

        • +
        +

        The last sequence will be assumed to be the template while +all preceeding sequences will be assumed to be primers.

        +

        This is a powerful function, use with care!

        +
        +
        Returns:
        +

        product – An pydna.amplicon.Amplicon object representing the PCR +product. The direction of the PCR product will be the same as for +the template sequence.

        +
        +
        Return type:
        +

        Amplicon

        +
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> from pydna.readers import read
        +>>> from pydna.amplify import pcr
        +>>> from pydna.primer import Primer
        +>>> template = Dseqrecord("tacactcaccgtctatcattatctactatcgactgtatcatctgatagcac")
        +>>> from Bio.SeqRecord import SeqRecord
        +>>> p1 = Primer("tacactcaccgtctatcattatc")
        +>>> p2 = Primer("cgactgtatcatctgatagcac").reverse_complement()
        +>>> pcr(p1, p2, template)
        +Amplicon(51)
        +>>> pcr([p1, p2], template)
        +Amplicon(51)
        +>>> pcr((p1,p2,), template)
        +Amplicon(51)
        +>>>
        +
        +
        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_assembly.html b/modules/pydna_assembly.html new file mode 100644 index 00000000..dad68540 --- /dev/null +++ b/modules/pydna_assembly.html @@ -0,0 +1,245 @@ + + + + + + + + + pydna.assembly — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.assembly

        +

        Assembly of sequences by homologous recombination.

        +

        Should also be useful for related techniques such as Gibson assembly and fusion +PCR. Given a list of sequences (Dseqrecords), all sequences are analyzed for +shared homology longer than the set limit.

        +

        A graph is constructed where each overlapping region form a node and +sequences separating the overlapping regions form edges.

        +
                    -- A --
        +catgatctacgtatcgtgt     -- B --
        +            atcgtgtactgtcatattc
        +                        catattcaaagttct
        +
        +
        +
        +--x--> A --y--> B --z-->   (Graph)
        +
        +Nodes:
        +
        +A : atcgtgt
        +B : catattc
        +
        +Edges:
        +
        +x : catgatctacgt
        +y : actgt
        +z : aaagttct
        +
        +
        +

        The NetworkX package is used to trace linear and circular paths through the +graph.

        +
        +
        +class pydna.assembly.Assembly(frags: List[Dseqrecord], limit: int = 25, algorithm: Callable[[str, str, int], List[Tuple[int, int, int]]] = common_sub_strings)[source]
        +

        Bases: object

        +

        Assembly of a list of linear DNA fragments into linear or circular +constructs. The Assembly is meant to replace the Assembly method as it +is easier to use. Accepts a list of Dseqrecords (source fragments) to +initiate an Assembly object. Several methods are available for analysis +of overlapping sequences, graph construction and assembly.

        +
        +
        Parameters:
        +
          +
        • fragments (list) – a list of Dseqrecord objects.

        • +
        • limit (int, optional) – The shortest shared homology to be considered

        • +
        • algorithm (function, optional) – The algorithm used to determine the shared sequences.

        • +
        • max_nodes (int) – The maximum number of nodes in the graph. This can be tweaked to +manage sequences with a high number of shared sub sequences.

        • +
        +
        +
        +

        Examples

        +
        >>> from pydna.assembly import Assembly
        +>>> from pydna.dseqrecord import Dseqrecord
        +>>> a = Dseqrecord("acgatgctatactgCCCCCtgtgctgtgctcta")
        +>>> b = Dseqrecord("tgtgctgtgctctaTTTTTtattctggctgtatc")
        +>>> c = Dseqrecord("tattctggctgtatcGGGGGtacgatgctatactg")
        +>>> x = Assembly((a,b,c), limit=14)
        +>>> x
        +Assembly
        +fragments....: 33bp 34bp 35bp
        +limit(bp)....: 14
        +G.nodes......: 6
        +algorithm....: common_sub_strings
        +>>> x.assemble_circular()
        +[Contig(o59), Contig(o59)]
        +>>> x.assemble_circular()[0].seq.watson
        +'acgatgctatactgCCCCCtgtgctgtgctctaTTTTTtattctggctgtatcGGGGGt'
        +
        +
        +
        +
        +assemble_linear(**kwargs)
        +
        + +
        +
        +assemble_circular(**kwargs)
        +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_codon.html b/modules/pydna_codon.html new file mode 100644 index 00000000..7472c8d3 --- /dev/null +++ b/modules/pydna_codon.html @@ -0,0 +1,159 @@ + + + + + + + + + pydna.codon — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/pydna_common_sub_strings.html b/modules/pydna_common_sub_strings.html new file mode 100644 index 00000000..dc74bb17 --- /dev/null +++ b/modules/pydna_common_sub_strings.html @@ -0,0 +1,238 @@ + + + + + + + + + pydna.common_sub_strings — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.common_sub_strings

        +

        This module is based on the Py-rstr-max package that +was written by Romain Brixtel (rbrixtel_at_gmail_dot_com) +(https://brixtel.users.greyc.fr) and is available from +https://code.google.com/p/py-rstr-max +https://github.com/gip0/py-rstr-max +the original code was covered by an MIT licence.

        +
        +
        +pydna.common_sub_strings.common_sub_strings(stringx: str, stringy: str, limit: int = 25) List[Tuple[int, int, int]][source]
        +

        Finds all common substrings between stringx and stringy, and returns +them sorted by length.

        +

        This function is case sensitive.

        +
        +
        Parameters:
        +
          +
        • stringx (str) –

        • +
        • stringy (str) –

        • +
        • limit (int, optional) –

        • +
        +
        +
        Returns:
        +

        [(startx1, starty1, length1),(startx2, starty2, length2), …]

        +

        startx1 = startposition in x, where substring 1 starts +starty1 = position in y where substring 1 starts +length1 = lenght of substring

        +

        +
        +
        Return type:
        +

        list of tuple

        +
        +
        +
        + +
        +
        +pydna.common_sub_strings.terminal_overlap(stringx: str, stringy: str, limit: int = 15) List[Tuple[int, int, int]][source]
        +

        Finds the the flanking common substrings between stringx and stringy +longer than limit. This means that the results only contains substrings +that starts or ends at the the ends of stringx and stringy.

        +

        This function is case sensitive.

        +

        returns a list of tuples describing the substrings +The list is sorted longest -> shortest.

        +
        +
        Parameters:
        +
          +
        • stringx (str) –

        • +
        • stringy (str) –

        • +
        • limit (int, optional) –

        • +
        +
        +
        Returns:
        +

        [(startx1,starty1,length1),(startx2,starty2,length2), …]

        +

        startx1 = startposition in x, where substring 1 starts +starty1 = position in y where substring 1 starts +length1 = lenght of substring

        +

        +
        +
        Return type:
        +

        list of tuple

        +
        +
        +

        Examples

        +
        >>> from pydna.common_sub_strings import terminal_overlap
        +>>> terminal_overlap("agctatgtatcttgcatcgta", "gcatcgtagtctatttgcttac", limit=8)
        +[(13, 0, 8)]
        +
        +
        +
                     <-- 8 ->
        +<---- 13 --->
        +agctatgtatcttgcatcgta                    stringx
        +             gcatcgtagtctatttgcttac      stringy
        +             0
        +
        +
        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_conftest.html b/modules/pydna_conftest.html new file mode 100644 index 00000000..0ede8143 --- /dev/null +++ b/modules/pydna_conftest.html @@ -0,0 +1,159 @@ + + + + + + + + + pydna.conftest — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/pydna_contig.html b/modules/pydna_contig.html new file mode 100644 index 00000000..b8f270ab --- /dev/null +++ b/modules/pydna_contig.html @@ -0,0 +1,298 @@ + + + + + + + + + pydna.contig — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.contig

        +
        +
        +class pydna.contig.Contig(record, *args, graph=None, nodemap=None, **kwargs)[source]
        +

        Bases: Dseqrecord

        +

        This class holds information about a DNA assembly. This class is instantiated by +the Assembly class and is not meant to be used directly.

        +
        +
        +classmethod from_string(record: str = '', *args, graph=None, nodemap=None, **kwargs)[source]
        +

        docstring.

        +
        + +
        +
        +classmethod from_SeqRecord(record, *args, graph=None, nodemap=None, **kwargs)[source]
        +
        + +
        +
        +reverse_complement()[source]
        +

        Reverse complement.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggaatt")
        +>>> a
        +Dseqrecord(-6)
        +>>> a.seq
        +Dseq(-6)
        +ggaatt
        +ccttaa
        +>>> a.reverse_complement().seq
        +Dseq(-6)
        +aattcc
        +ttaagg
        +>>>
        +
        +
        + +
        + +
        +
        +rc()
        +

        Reverse complement.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggaatt")
        +>>> a
        +Dseqrecord(-6)
        +>>> a.seq
        +Dseq(-6)
        +ggaatt
        +ccttaa
        +>>> a.reverse_complement().seq
        +Dseq(-6)
        +aattcc
        +ttaagg
        +>>>
        +
        +
        + +
        + +
        +
        +detailed_figure()[source]
        +

        Returns a text representation of the assembled fragments.

        +

        Linear:

        +
        acgatgctatactgCCCCCtgtgctgtgctcta
        +                   TGTGCTGTGCTCTA
        +                   tgtgctgtgctctaTTTTTtattctggctgtatc
        +
        +
        +

        Circular:

        +
        ||||||||||||||
        +acgatgctatactgCCCCCtgtgctgtgctcta
        +                   TGTGCTGTGCTCTA
        +                   tgtgctgtgctctaTTTTTtattctggctgtatc
        +                                      TATTCTGGCTGTATC
        +                                      tattctggctgtatcGGGGGtacgatgctatactg
        +                                                           ACGATGCTATACTG
        +
        +
        +
        + +
        +
        +figure()[source]
        +

        Compact ascii representation of the assembled fragments.

        +

        Each fragment is represented by:

        +
        Size of common 5' substring|Name and size of DNA fragment|
        +Size of common 5' substring
        +
        +
        +

        Linear:

        +
        frag20| 6
        +       \\/
        +       /\\
        +        6|frag23| 6
        +                 \\/
        +                 /\\
        +                  6|frag14
        +
        +
        +

        Circular:

        +
         -|2577|61
        +|       \\/
        +|       /\\
        +|       61|5681|98
        +|               \\/
        +|               /\\
        +|               98|2389|557
        +|                       \\/
        +|                       /\\
        +|                       557-
        +|                          |
        + --------------------------
        +
        +
        +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_crispr.html b/modules/pydna_crispr.html new file mode 100644 index 00000000..3bb0e1b2 --- /dev/null +++ b/modules/pydna_crispr.html @@ -0,0 +1,252 @@ + + + + + + + + + pydna.crispr — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.crispr

        +

        Provides the Dseq class for handling double stranded DNA sequences.

        +

        Dseq is a subclass of Bio.Seq.Seq. The Dseq class +is mostly useful as a part of the pydna.dseqrecord.Dseqrecord class +which can hold more meta data.

        +

        The Dseq class support the notion of circular and linear DNA topology.

        +
        +
        +class pydna.crispr.cas9(protospacer)[source]
        +

        Bases: _cas

        +

        docstring.

        +
            |----size----------|
        +
        +    ---protospacer------
        +                    -fst3
        +    fst5             |-|
        +    |--------------|
        +                        PAM
        +5-NNGGAAGAGTAATACACTA-AAANGGNN-3
        +||||||||||||||||||| ||||||||
        +3-NNCCTTCTCATTATGTGAT-TTTNCCNN-5
        +    ||||||||||||||||| |||
        +5-GGAAGAGTAATACACTA-AAAg-u-a-a-g-g  Scaffold
        +    ---gRNA spacer---    u-a
        +                        u-a
        +                        u-a
        +                        u-a
        +                        a-u
        +                        g-u-g
        +                        a    a
        +                        g-c-a
        +                        c-g
        +                        u-a
        +                        a-u
        +                        g   a  tetraloop
        +                        a-a
        +
        +
        +
        +
        +scaffold = 'GTTTTAGAGCTAGAAATAGCAAGTTAAAATAAGG'
        +
        + +
        +
        +pam = '.GG'
        +
        + +
        +
        +size = 20
        +
        + +
        +
        +fst5 = 17
        +
        + +
        +
        +fst3 = -3
        +
        + +
        +
        +ovhg = 0
        +
        + +
        +
        +search(dna, linear=True)[source]
        +

        docstring.

        +
        + +
        + +
        +
        +pydna.crispr.protospacer(guide_construct, cas=cas9)[source]
        +

        docstring.

        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_design.html b/modules/pydna_design.html new file mode 100644 index 00000000..f9b96d80 --- /dev/null +++ b/modules/pydna_design.html @@ -0,0 +1,598 @@ + + + + + + + + + pydna.design — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.design

        +

        This module contain functions for primer design for various purposes.

        +
          +
        • :func:primer_design for designing primers for a sequence or a matching primer for an existing primer. Returns an Amplicon object (same as the amplify module returns).

        • +
        • :func:assembly_fragments Adds tails to primers for a linear assembly through homologous recombination or Gibson assembly.

        • +
        • :func:circular_assembly_fragments Adds tails to primers for a circular assembly through homologous recombination or Gibson assembly.

        • +
        +
        +
        +pydna.design.primer_design(template, fp=None, rp=None, limit=13, target_tm=55.0, tm_func=_tm_default, estimate_function=None, **kwargs)[source]
        +

        This function designs a forward primer and a reverse primer for PCR amplification +of a given template sequence.

        +

        The template argument is a Dseqrecord object or equivalent containing the template sequence.

        +

        The optional fp and rp arguments can contain an existing primer for the sequence (either the forward or reverse primer). +One or the other primers can be specified, not both (since then there is nothing to design!, use the pydna.amplify.pcr function instead).

        +

        The limit argument is the minimum length of the primer. The default value is 13.

        +

        If one of the primers is given, the other primer is designed to match in terms of Tm. +If both primers are designed, they will be designed to target_tm

        +

        tm_func is a function that takes an ascii string representing an oligonuceotide as argument and returns a float. +Some useful functions can be found in the pydna.tm module, but can be substituted for a custom made function.

        +

        estimate_function is a tm_func-like function that is used to get a first guess for the primer design, that is then used as starting +point for the final result. This is useful when the tm_func function is slow to calculate (e.g. it relies on an +external API, such as the NEB primer design API). The estimate_function should be faster than the tm_func function. +The default value is None. +To use the default tm_func as estimate function to get the NEB Tm faster, you can do: +primer_design(dseqr, target_tm=55, tm_func=tm_neb, estimate_function=tm_default).

        +

        The function returns a pydna.amplicon.Amplicon class instance. This object has +the object.forward_primer and object.reverse_primer properties which contain the designed primers.

        +
        +
        Parameters:
        +
          +
        • template (pydna.dseqrecord.Dseqrecord) – a Dseqrecord object. The only required argument.

        • +
        • fp (pydna.primer.Primer, optional) – optional pydna.primer.Primer objects containing one primer each.

        • +
        • rp (pydna.primer.Primer, optional) – optional pydna.primer.Primer objects containing one primer each.

        • +
        • target_tm (float, optional) – target tm for the primers, set to 55°C by default.

        • +
        • tm_func (function) – Function used for tm calculation. This function takes an ascii string +representing an oligonuceotide as argument and returns a float. +Some useful functions can be found in the pydna.tm module, but can be +substituted for a custom made function.

        • +
        +
        +
        Returns:
        +

        result

        +
        +
        Return type:
        +

        Amplicon

        +
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> t=Dseqrecord("atgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatg")
        +>>> t
        +Dseqrecord(-64)
        +>>> from pydna.design import primer_design
        +>>> ampl = primer_design(t)
        +>>> ampl
        +Amplicon(64)
        +>>> ampl.forward_primer
        +f64 17-mer:5'-atgactgctaacccttc-3'
        +>>> ampl.reverse_primer
        +r64 18-mer:5'-catcgtaagtttcgaacg-3'
        +>>> print(ampl.figure())
        +5atgactgctaacccttc...cgttcgaaacttacgatg3
        +                     ||||||||||||||||||
        +                    3gcaagctttgaatgctac5
        +5atgactgctaacccttc3
        + |||||||||||||||||
        +3tactgacgattgggaag...gcaagctttgaatgctac5
        +>>> pf = "GGATCC" + ampl.forward_primer
        +>>> pr = "GGATCC" + ampl.reverse_primer
        +>>> pf
        +f64 23-mer:5'-GGATCCatgactgct..ttc-3'
        +>>> pr
        +r64 24-mer:5'-GGATCCcatcgtaag..acg-3'
        +>>> from pydna.amplify import pcr
        +>>> pcr_prod = pcr(pf, pr, t)
        +>>> print(pcr_prod.figure())
        +      5atgactgctaacccttc...cgttcgaaacttacgatg3
        +                           ||||||||||||||||||
        +                          3gcaagctttgaatgctacCCTAGG5
        +5GGATCCatgactgctaacccttc3
        +       |||||||||||||||||
        +      3tactgacgattgggaag...gcaagctttgaatgctac5
        +>>> print(pcr_prod.seq)
        +GGATCCatgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatgGGATCC
        +>>> from pydna.primer import Primer
        +>>> pf = Primer("atgactgctaacccttccttggtgttg", id="myprimer")
        +>>> ampl = primer_design(t, fp = pf)
        +>>> ampl.forward_primer
        +myprimer 27-mer:5'-atgactgctaaccct..ttg-3'
        +>>> ampl.reverse_primer
        +r64 32-mer:5'-catcgtaagtttcga..atc-3'
        +
        +
        +
        + +
        +
        +pydna.design.assembly_fragments(f, overlap=35, maxlink=40, circular=False)[source]
        +

        This function return a list of 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 +recombination.

        +

        Given that we have two linear pydna.amplicon.Amplicon objects a and b

        +

        we can modify the reverse primer of a and forward primer of b with tails to allow +fusion by fusion PCR, Gibson assembly or in-vivo homologous recombination. +The basic requirements for the primers for the three techniques are the same.

        +
         _________ a _________
        +/                     \
        +agcctatcatcttggtctctgca
        +                  |||||
        +                 <gacgt
        +agcct>
        +|||||
        +tcggatagtagaaccagagacgt
        +
        +                        __________ b ________
        +                       /                     \
        +                       TTTATATCGCATGACTCTTCTTT
        +                                         |||||
        +                                        <AGAAA
        +                       TTTAT>
        +                       |||||
        +                       AAATATAGCGTACTGAGAAGAAA
        +
        +agcctatcatcttggtctctgcaTTTATATCGCATGACTCTTCTTT
        +||||||||||||||||||||||||||||||||||||||||||||||
        +tcggatagtagaaccagagacgtAAATATAGCGTACTGAGAAGAAA
        +\___________________ c ______________________/
        +
        +
        +

        Design tailed primers incorporating a part of the next or previous fragment to be assembled.

        +
        agcctatcatcttggtctctgca
        +|||||||||||||||||||||||
        +                gagacgtAAATATA
        +
        +|||||||||||||||||||||||
        +tcggatagtagaaccagagacgt
        +
        +                       TTTATATCGCATGACTCTTCTTT
        +                       |||||||||||||||||||||||
        +
        +                ctctgcaTTTATAT
        +                       |||||||||||||||||||||||
        +                       AAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        PCR products with flanking sequences are formed in the PCR process.

        +
        agcctatcatcttggtctctgcaTTTATAT
        +||||||||||||||||||||||||||||||
        +tcggatagtagaaccagagacgtAAATATA
        +                \____________/
        +
        +                   identical
        +                   sequences
        +                 ____________
        +                /            \
        +                ctctgcaTTTATATCGCATGACTCTTCTTT
        +                ||||||||||||||||||||||||||||||
        +                gagacgtAAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        The fragments can be fused by any of the techniques mentioned earlier to form c:

        +
        agcctatcatcttggtctctgcaTTTATATCGCATGACTCTTCTTT
        +||||||||||||||||||||||||||||||||||||||||||||||
        +tcggatagtagaaccagagacgtAAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        The first argument of this function is a list of sequence objects containing +Amplicons and other similar objects.

        +

        At least every second sequence object needs to be an Amplicon

        +

        This rule exists because if a sequence object is that is not a PCR product +is to be fused with another fragment, that other fragment needs to be an Amplicon +so that the primer of the other object can be modified to include the whole stretch +of sequence homology needed for the fusion. See the example below where a is a +non-amplicon (a linear plasmid vector for instance)

        +
         _________ a _________           __________ b ________
        +/                     \         /                     \
        +agcctatcatcttggtctctgca   <-->  TTTATATCGCATGACTCTTCTTT
        +|||||||||||||||||||||||         |||||||||||||||||||||||
        +tcggatagtagaaccagagacgt                          <AGAAA
        +                                TTTAT>
        +                                |||||||||||||||||||||||
        +                          <-->  AAATATAGCGTACTGAGAAGAAA
        +
        +     agcctatcatcttggtctctgcaTTTATATCGCATGACTCTTCTTT
        +     ||||||||||||||||||||||||||||||||||||||||||||||
        +     tcggatagtagaaccagagacgtAAATATAGCGTACTGAGAAGAAA
        +     \___________________ c ______________________/
        +
        +
        +

        In this case only the forward primer of b is fitted with a tail with a part a:

        +
        agcctatcatcttggtctctgca
        +|||||||||||||||||||||||
        +tcggatagtagaaccagagacgt
        +
        +                       TTTATATCGCATGACTCTTCTTT
        +                       |||||||||||||||||||||||
        +                                        <AGAAA
        +         tcttggtctctgcaTTTATAT
        +                       |||||||||||||||||||||||
        +                       AAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        PCR products with flanking sequences are formed in the PCR process.

        +
        agcctatcatcttggtctctgcaTTTATAT
        +||||||||||||||||||||||||||||||
        +tcggatagtagaaccagagacgtAAATATA
        +                \____________/
        +
        +                   identical
        +                   sequences
        +                 ____________
        +                /            \
        +                ctctgcaTTTATATCGCATGACTCTTCTTT
        +                ||||||||||||||||||||||||||||||
        +                gagacgtAAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        The fragments can be fused by for example Gibson assembly:

        +
        agcctatcatcttggtctctgcaTTTATAT
        +||||||||||||||||||||||||||||||
        +tcggatagtagaacca
        +
        +                             TCGCATGACTCTTCTTT
        +                ||||||||||||||||||||||||||||||
        +                gagacgtAAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        to form c:

        +
        agcctatcatcttggtctctgcaTTTATATCGCATGACTCTTCTTT
        +||||||||||||||||||||||||||||||||||||||||||||||
        +tcggatagtagaaccagagacgtAAATATAGCGTACTGAGAAGAAA
        +
        +
        +

        The first argument of this function is a list of sequence objects containing +Amplicons and other similar objects.

        +

        The overlap argument controls how many base pairs of overlap required between +adjacent sequence fragments. In the junction between Amplicons, tails with the +length of about half of this value is added to the two primers +closest to the junction.

        +
        >       <
        +Amplicon1
        +         Amplicon2
        +         >       <
        +
        +         ⇣
        +
        +>       <-
        +Amplicon1
        +         Amplicon2
        +        ->       <
        +
        +
        +

        In the case of an Amplicon adjacent to a Dseqrecord object, the tail will +be twice as long (1*overlap) since the +recombining sequence is present entirely on this primer:

        +
        Dseqrecd1
        +         Amplicon1
        +         >       <
        +
        +         ⇣
        +
        +Dseqrecd1
        +         Amplicon1
        +       -->       <
        +
        +
        +

        Note that if the sequence of DNA fragments starts or stops with an Amplicon, +the very first and very last prinmer will not be modified i.e. assembles are +always assumed to be linear. There are simple tricks around that for circular +assemblies depicted in the last two examples below.

        +

        The maxlink arguments controls the cut off length for sequences that will be +synhtesized by adding them to primers for the adjacent fragment(s). The +argument list may contain short spacers (such as spacers between fusion proteins).

        +
        Example 1: Linear assembly of PCR products (pydna.amplicon.Amplicon class objects) ------
        +
        +>       <         >       <
        +Amplicon1         Amplicon3
        +         Amplicon2         Amplicon4
        +         >       <         >       <
        +
        +                     ⇣
        +                     pydna.design.assembly_fragments
        +                     ⇣
        +
        +>       <-       ->       <-                      pydna.assembly.Assembly
        +Amplicon1         Amplicon3
        +         Amplicon2         Amplicon4     ➤  Amplicon1Amplicon2Amplicon3Amplicon4
        +        ->       <-       ->       <
        +
        +Example 2: Linear assembly of alternating Amplicons and other fragments
        +
        +>       <         >       <
        +Amplicon1         Amplicon2
        +         Dseqrecd1         Dseqrecd2
        +
        +                     ⇣
        +                     pydna.design.assembly_fragments
        +                     ⇣
        +
        +>       <--     -->       <--                     pydna.assembly.Assembly
        +Amplicon1         Amplicon2
        +         Dseqrecd1         Dseqrecd2     ➤  Amplicon1Dseqrecd1Amplicon2Dseqrecd2
        +
        +Example 3: Linear assembly of alternating Amplicons and other fragments
        +
        +Dseqrecd1         Dseqrecd2
        +         Amplicon1         Amplicon2
        +         >       <       -->       <
        +
        +                     ⇣
        +             pydna.design.assembly_fragments
        +                     ⇣
        +                                                  pydna.assembly.Assembly
        +Dseqrecd1         Dseqrecd2
        +         Amplicon1         Amplicon2     ➤  Dseqrecd1Amplicon1Dseqrecd2Amplicon2
        +       -->       <--     -->       <
        +
        +Example 4: Circular assembly of alternating Amplicons and other fragments
        +
        +                 ->       <==
        +Dseqrecd1         Amplicon2
        +         Amplicon1         Dseqrecd1
        +       -->       <-
        +                     ⇣
        +                     pydna.design.assembly_fragments
        +                     ⇣
        +                                                   pydna.assembly.Assembly
        +                 ->       <==
        +Dseqrecd1         Amplicon2                    -Dseqrecd1Amplicon1Amplicon2-
        +         Amplicon1                       ➤    |                             |
        +       -->       <-                            -----------------------------
        +
        +------ Example 5: Circular assembly of Amplicons
        +
        +>       <         >       <
        +Amplicon1         Amplicon3
        +         Amplicon2         Amplicon1
        +         >       <         >       <
        +
        +                     ⇣
        +                     pydna.design.assembly_fragments
        +                     ⇣
        +
        +>       <=       ->       <-
        +Amplicon1         Amplicon3
        +         Amplicon2         Amplicon1
        +        ->       <-       +>       <
        +
        +                     ⇣
        +             make new Amplicon using the Amplicon1.template and
        +             the last fwd primer and the first rev primer.
        +                     ⇣
        +                                                   pydna.assembly.Assembly
        ++>       <=       ->       <-
        + Amplicon1         Amplicon3                  -Amplicon1Amplicon2Amplicon3-
        +          Amplicon2                      ➤   |                             |
        +         ->       <-                          -----------------------------
        +
        +
        +
        +
        Parameters:
        +
          +
        • f (list of pydna.amplicon.Amplicon and other Dseqrecord like objects) – list Amplicon and Dseqrecord object for which fusion primers should be constructed.

        • +
        • overlap (int, optional) – Length of required overlap between fragments.

        • +
        • 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

        +
        [Amplicon1,
        + Amplicon2, ...]
        +
        +
        +

        +
        +
        Return type:
        +

        list of pydna.amplicon.Amplicon and other Dseqrecord like objects pydna.amplicon.Amplicon objects

        +
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> from pydna.design import primer_design
        +>>> a=primer_design(Dseqrecord("atgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatg"))
        +>>> b=primer_design(Dseqrecord("ccaaacccaccaggtaccttatgtaagtacttcaagtcgccagaagacttcttggtcaagttgcc"))
        +>>> c=primer_design(Dseqrecord("tgtactggtgctgaaccttgtatcaagttgggtgttgacgccattgccccaggtggtcgtttcgtt"))
        +>>> from pydna.design import assembly_fragments
        +>>> # We would like a circular recombination, so the first sequence has to be repeated
        +>>> fa1,fb,fc,fa2 = assembly_fragments([a,b,c,a])
        +>>> # Since all fragments are Amplicons, we need to extract the rp of the 1st and fp of the last fragments.
        +>>> from pydna.amplify import pcr
        +>>> fa = pcr(fa2.forward_primer, fa1.reverse_primer, a)
        +>>> [fa,fb,fc]
        +[Amplicon(100), Amplicon(101), Amplicon(102)]
        +>>> fa.name, fb.name, fc.name = "fa fb fc".split()
        +>>> from pydna.assembly import Assembly
        +>>> assemblyobj = Assembly([fa,fb,fc])
        +>>> assemblyobj
        +Assembly
        +fragments....: 100bp 101bp 102bp
        +limit(bp)....: 25
        +G.nodes......: 6
        +algorithm....: common_sub_strings
        +>>> assemblyobj.assemble_linear()
        +[Contig(-231), Contig(-166), Contig(-36)]
        +>>> assemblyobj.assemble_circular()[0].seguid()
        +'cdseguid=85t6tfcvWav0wnXEIb-lkUtrl4s'
        +>>> (a+b+c).looped().seguid()
        +'cdseguid=85t6tfcvWav0wnXEIb-lkUtrl4s'
        +>>> print(assemblyobj.assemble_circular()[0].figure())
        + -|fa|36
        +|     \/
        +|     /\
        +|     36|fb|36
        +|           \/
        +|           /\
        +|           36|fc|36
        +|                 \/
        +|                 /\
        +|                 36-
        +|                    |
        + --------------------
        +>>>
        +
        +
        +
        + +
        +
        +pydna.design.circular_assembly_fragments(f, overlap=35, maxlink=40)[source]
        +

        Equivalent to assembly_fragments with circular=True.

        +

        Deprecated, kept for backward compatibility. Use assembly_fragments with circular=True instead.

        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_download.html b/modules/pydna_download.html new file mode 100644 index 00000000..b6eb0105 --- /dev/null +++ b/modules/pydna_download.html @@ -0,0 +1,159 @@ + + + + + + + + + pydna.download — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/pydna_dseq.html b/modules/pydna_dseq.html new file mode 100644 index 00000000..06703b22 --- /dev/null +++ b/modules/pydna_dseq.html @@ -0,0 +1,1406 @@ + + + + + + + + + pydna.dseq — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.dseq

        +

        Provides the Dseq class for handling double stranded DNA sequences.

        +

        Dseq is a subclass of Bio.Seq.Seq. The Dseq class +is mostly useful as a part of the pydna.dseqrecord.Dseqrecord class +which can hold more meta data.

        +

        The Dseq class support the notion of circular and linear DNA topology.

        +
        +
        +class pydna.dseq.Dseq(watson: str | bytes, crick: str | bytes | None = None, ovhg=None, circular=False, pos=0)[source]
        +

        Bases: Seq

        +

        Dseq holds information for a double stranded DNA fragment.

        +

        Dseq also holds information describing the topology of +the DNA fragment (linear or circular).

        +
        +
        Parameters:
        +
          +
        • watson (str) – a string representing the watson (sense) DNA strand.

        • +
        • crick (str, optional) – a string representing the crick (antisense) DNA strand.

        • +
        • ovhg (int, optional) – A positive or negative number to describe the stagger between the +watson and crick strands. +see below for a detailed explanation.

        • +
        • linear (bool, optional) – True indicates that sequence is linear, False that it is circular.

        • +
        • circular (bool, optional) – True indicates that sequence is circular, False that it is linear.

        • +
        +
        +
        +

        Examples

        +

        Dseq is a subclass of the Biopython Seq object. It stores two +strings representing the watson (sense) and crick(antisense) strands. +two properties called linear and circular, and a numeric value ovhg +(overhang) describing the stagger for the watson and crick strand +in the 5’ end of the fragment.

        +

        The most common usage is probably to create a Dseq object as a +part of a Dseqrecord object (see pydna.dseqrecord.Dseqrecord).

        +

        There are three ways of creating a Dseq object directly listed below, but you can also +use the function Dseq.from_full_sequence_and_overhangs() to create a Dseq:

        +

        Only one argument (string):

        +
        >>> from pydna.dseq import Dseq
        +>>> Dseq("aaa")
        +Dseq(-3)
        +aaa
        +ttt
        +
        +
        +

        The given string will be interpreted as the watson strand of a +blunt, linear double stranded sequence object. The crick strand +is created automatically from the watson strand.

        +

        Two arguments (string, string):

        +
        >>> from pydna.dseq import Dseq
        +>>> Dseq("gggaaat","ttt")
        +Dseq(-7)
        +gggaaat
        +   ttt
        +
        +
        +

        If both watson and crick are given, but not ovhg an attempt +will be made to find the best annealing between the strands. +There are limitations to this. For long fragments it is quite +slow. The length of the annealing sequences have to be at least +half the length of the shortest of the strands.

        +

        Three arguments (string, string, ovhg=int):

        +

        The ovhg parameter is an integer describing the length of the +crick strand overhang in the 5’ end of the molecule.

        +

        The ovhg parameter controls the stagger at the five prime end:

        +
        dsDNA       overhang
        +
        +  nnn...    2
        +nnnnn...
        +
        + nnnn...    1
        +nnnnn...
        +
        +nnnnn...    0
        +nnnnn...
        +
        +nnnnn...   -1
        + nnnn...
        +
        +nnnnn...   -2
        +  nnn...
        +
        +
        +

        Example of creating Dseq objects with different amounts of stagger:

        +
        >>> Dseq(watson="agt", crick="actta", ovhg=-2)
        +Dseq(-7)
        +agt
        +  attca
        +>>> Dseq(watson="agt",crick="actta",ovhg=-1)
        +Dseq(-6)
        +agt
        + attca
        +>>> Dseq(watson="agt",crick="actta",ovhg=0)
        +Dseq(-5)
        +agt
        +attca
        +>>> Dseq(watson="agt",crick="actta",ovhg=1)
        +Dseq(-5)
        + agt
        +attca
        +>>> Dseq(watson="agt",crick="actta",ovhg=2)
        +Dseq(-5)
        +  agt
        +attca
        +
        +
        +

        If the ovhg parameter is specified a crick strand also +needs to be supplied, otherwise an exception is raised.

        +
        >>> Dseq(watson="agt", ovhg=2)
        +Traceback (most recent call last):
        +  File "<stdin>", line 1, in <module>
        +  File "/usr/local/lib/python2.7/dist-packages/pydna_/dsdna.py", line 169, in __init__
        +    else:
        +ValueError: ovhg defined without crick strand!
        +
        +
        +

        The shape of the fragment is set by circular = True, False

        +

        Note that both ends of the DNA fragment has to be compatible to set +circular = True.

        +
        >>> Dseq("aaa","ttt")
        +Dseq(-3)
        +aaa
        +ttt
        +>>> Dseq("aaa","ttt",ovhg=0)
        +Dseq(-3)
        +aaa
        +ttt
        +>>> Dseq("aaa","ttt",ovhg=1)
        +Dseq(-4)
        + aaa
        +ttt
        +>>> Dseq("aaa","ttt",ovhg=-1)
        +Dseq(-4)
        +aaa
        + ttt
        +>>> Dseq("aaa", "ttt", circular = True , ovhg=0)
        +Dseq(o3)
        +aaa
        +ttt
        +
        +
        +
        >>> a=Dseq("tttcccc","aaacccc")
        +>>> a
        +Dseq(-11)
        +    tttcccc
        +ccccaaa
        +>>> a.ovhg
        +4
        +
        +
        +
        >>> b=Dseq("ccccttt","ccccaaa")
        +>>> b
        +Dseq(-11)
        +ccccttt
        +    aaacccc
        +>>> b.ovhg
        +-4
        +>>>
        +
        +
        +

        Coercing to string

        +
        >>> str(a)
        +'ggggtttcccc'
        +
        +
        +

        A Dseq object can be longer that either the watson or crick strands.

        +
        <-- length -->
        +GATCCTTT
        +     AAAGCCTAG
        +
        +<-- length -->
        +      GATCCTTT
        +AAAGCCCTA
        +
        +
        +

        The slicing of a linear Dseq object works mostly as it does for a string.

        +
        >>> s="ggatcc"
        +>>> s[2:3]
        +'a'
        +>>> s[2:4]
        +'at'
        +>>> s[2:4:-1]
        +''
        +>>> s[::2]
        +'gac'
        +>>> from pydna.dseq import Dseq
        +>>> d=Dseq(s, circular=False)
        +>>> d[2:3]
        +Dseq(-1)
        +a
        +t
        +>>> d[2:4]
        +Dseq(-2)
        +at
        +ta
        +>>> d[2:4:-1]
        +Dseq(-0)
        +
        +
        +>>> d[::2]
        +Dseq(-3)
        +gac
        +ctg
        +
        +
        +

        The slicing of a circular Dseq object has a slightly different meaning.

        +
        >>> s="ggAtCc"
        +>>> d=Dseq(s, circular=True)
        +>>> d
        +Dseq(o6)
        +ggAtCc
        +ccTaGg
        +>>> d[4:3]
        +Dseq(-5)
        +CcggA
        +GgccT
        +
        +
        +

        The slice [X:X] produces an empty slice for a string, while this +will return the linearized sequence starting at X:

        +
        >>> s="ggatcc"
        +>>> d=Dseq(s, circular=True)
        +>>> d
        +Dseq(o6)
        +ggatcc
        +cctagg
        +>>> d[3:3]
        +Dseq(-6)
        +tccgga
        +aggcct
        +>>>
        +
        +
        + +
        +
        +trunc = 30
        +
        + +
        +
        +classmethod quick(watson: str, crick: str, ovhg=0, circular=False, pos=0)[source]
        +
        + +
        +
        +classmethod from_string(dna: str, *args, circular=False, **kwargs)[source]
        +
        + +
        +
        +classmethod from_representation(dsdna: str, *args, **kwargs)[source]
        +
        + +
        +
        +classmethod from_full_sequence_and_overhangs(full_sequence: str, crick_ovhg: int, watson_ovhg: int)[source]
        +

        Create a linear Dseq object from a full sequence and the 3’ overhangs of each strand.

        +

        The order of the parameters is like this because the 3’ overhang of the crick strand is the one +on the left side of the sequence.

        +
        +
        Parameters:
        +
          +
        • full_sequence (str) – The full sequence of the Dseq object.

        • +
        • crick_ovhg (int) – The overhang of the crick strand in the 3’ end. Equivalent to Dseq.ovhg.

        • +
        • watson_ovhg (int) – The overhang of the watson strand in the 5’ end.

        • +
        +
        +
        Returns:
        +

        A Dseq object.

        +
        +
        Return type:
        +

        Dseq

        +
        +
        +

        Examples

        +
        >>> Dseq.from_full_sequence_and_overhangs('AAAAAA', crick_ovhg=2, watson_ovhg=2)
        +Dseq(-6)
        +  AAAA
        +TTTT
        +>>> Dseq.from_full_sequence_and_overhangs('AAAAAA', crick_ovhg=-2, watson_ovhg=2)
        +Dseq(-6)
        +AAAAAA
        +  TT
        +>>> Dseq.from_full_sequence_and_overhangs('AAAAAA', crick_ovhg=2, watson_ovhg=-2)
        +Dseq(-6)
        +  AA
        +TTTTTT
        +>>> Dseq.from_full_sequence_and_overhangs('AAAAAA', crick_ovhg=-2, watson_ovhg=-2)
        +Dseq(-6)
        +AAAA
        +  TTTT
        +
        +
        +
        + +
        +
        +mw() float[source]
        +

        This method returns the molecular weight of the DNA molecule +in g/mol. The following formula is used:

        +
        MW = (A x 313.2) + (T x 304.2) +
        +     (C x 289.2) + (G x 329.2) +
        +     (N x 308.9) + 79.0
        +
        +
        +
        + +
        +
        +upper() DseqType[source]
        +

        Return an upper case copy of the sequence.

        +
        >>> from pydna.dseq import Dseq
        +>>> my_seq = Dseq("aAa")
        +>>> my_seq
        +Dseq(-3)
        +aAa
        +tTt
        +>>> my_seq.upper()
        +Dseq(-3)
        +AAA
        +TTT
        +
        +
        +
        +
        Returns:
        +

        Dseq object in uppercase

        +
        +
        Return type:
        +

        Dseq

        +
        +
        +
        +

        See also

        +

        pydna.dseq.Dseq.lower

        +
        +
        + +
        +
        +lower() DseqType[source]
        +

        Return a lower case copy of the sequence.

        +
        >>> from pydna.dseq import Dseq
        +>>> my_seq = Dseq("aAa")
        +>>> my_seq
        +Dseq(-3)
        +aAa
        +tTt
        +>>> my_seq.lower()
        +Dseq(-3)
        +aaa
        +ttt
        +
        +
        +
        +
        Returns:
        +

        Dseq object in lowercase

        +
        +
        Return type:
        +

        Dseq

        +
        +
        +
        +

        See also

        +

        pydna.dseq.Dseq.upper

        +
        +
        + +
        +
        +find(sub: _SeqAbstractBaseClass | str | bytes, start=0, end=_sys.maxsize) int[source]
        +

        This method behaves like the python string method of the same name.

        +

        Returns an integer, the index of the first occurrence of substring +argument sub in the (sub)sequence given by [start:end].

        +

        Returns -1 if the subsequence is NOT found.

        +
        +
        Parameters:
        +
          +
        • sub (string or Seq object) – a string or another Seq object to look for.

        • +
        • start (int, optional) – slice start.

        • +
        • end (int, optional) – slice end.

        • +
        +
        +
        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> seq = Dseq("atcgactgacgtgtt")
        +>>> seq
        +Dseq(-15)
        +atcgactgacgtgtt
        +tagctgactgcacaa
        +>>> seq.find("gac")
        +3
        +>>> seq = Dseq(watson="agt",crick="actta",ovhg=-2)
        +>>> seq
        +Dseq(-7)
        +agt
        +  attca
        +>>> seq.find("taa")
        +2
        +
        +
        +
        + +
        +
        +reverse_complement() Dseq[source]
        +

        Dseq object where watson and crick have switched places.

        +

        This represents the same double stranded sequence.

        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("catcgatc")
        +>>> a
        +Dseq(-8)
        +catcgatc
        +gtagctag
        +>>> b=a.reverse_complement()
        +>>> b
        +Dseq(-8)
        +gatcgatg
        +ctagctac
        +>>>
        +
        +
        +
        + +
        +
        +rc() Dseq
        +

        Dseq object where watson and crick have switched places.

        +

        This represents the same double stranded sequence.

        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("catcgatc")
        +>>> a
        +Dseq(-8)
        +catcgatc
        +gtagctag
        +>>> b=a.reverse_complement()
        +>>> b
        +Dseq(-8)
        +gatcgatg
        +ctagctac
        +>>>
        +
        +
        +
        + +
        +
        +shifted(shift: int) DseqType[source]
        +

        Shifted version of a circular Dseq object.

        +
        + +
        +
        +looped() DseqType[source]
        +

        Circularized Dseq object.

        +

        This can only be done if the two ends are compatible, +otherwise a TypeError is raised.

        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("catcgatc")
        +>>> a
        +Dseq(-8)
        +catcgatc
        +gtagctag
        +>>> a.looped()
        +Dseq(o8)
        +catcgatc
        +gtagctag
        +>>> a.T4("t")
        +Dseq(-8)
        +catcgat
        + tagctag
        +>>> a.T4("t").looped()
        +Dseq(o7)
        +catcgat
        +gtagcta
        +>>> a.T4("a")
        +Dseq(-8)
        +catcga
        +  agctag
        +>>> a.T4("a").looped()
        +Traceback (most recent call last):
        +  File "<stdin>", line 1, in <module>
        +  File "/usr/local/lib/python2.7/dist-packages/pydna/dsdna.py", line 357, in looped
        +    if type5 == type3 and str(sticky5) == str(rc(sticky3)):
        +TypeError: DNA cannot be circularized.
        +5' and 3' sticky ends not compatible!
        +>>>
        +
        +
        +
        + +
        +
        +tolinear() DseqType[source]
        +

        Returns a blunt, linear copy of a circular Dseq object. This can +only be done if the Dseq object is circular, otherwise a +TypeError is raised.

        +

        This method is deprecated, use slicing instead. See example below.

        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("catcgatc", circular=True)
        +>>> a
        +Dseq(o8)
        +catcgatc
        +gtagctag
        +>>> a[:]
        +Dseq(-8)
        +catcgatc
        +gtagctag
        +>>>
        +
        +
        +
        + +
        +
        +five_prime_end() Tuple[str, str][source]
        +

        Returns a tuple describing the structure of the 5’ end of +the DNA fragment

        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("aaa", "ttt")
        +>>> a
        +Dseq(-3)
        +aaa
        +ttt
        +>>> a.five_prime_end()
        +('blunt', '')
        +>>> a=Dseq("aaa", "ttt", ovhg=1)
        +>>> a
        +Dseq(-4)
        + aaa
        +ttt
        +>>> a.five_prime_end()
        +("3'", 't')
        +>>> a=Dseq("aaa", "ttt", ovhg=-1)
        +>>> a
        +Dseq(-4)
        +aaa
        + ttt
        +>>> a.five_prime_end()
        +("5'", 'a')
        +>>>
        +
        +
        + +
        + +
        +
        +three_prime_end() Tuple[str, str][source]
        +

        Returns a tuple describing the structure of the 5’ end of +the DNA fragment

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("aaa", "ttt")
        +>>> a
        +Dseq(-3)
        +aaa
        +ttt
        +>>> a.three_prime_end()
        +('blunt', '')
        +>>> a=Dseq("aaa", "ttt", ovhg=1)
        +>>> a
        +Dseq(-4)
        + aaa
        +ttt
        +>>> a.three_prime_end()
        +("3'", 'a')
        +>>> a=Dseq("aaa", "ttt", ovhg=-1)
        +>>> a
        +Dseq(-4)
        +aaa
        + ttt
        +>>> a.three_prime_end()
        +("5'", 't')
        +>>>
        +
        +
        + +
        + +
        +
        +watson_ovhg() int[source]
        +

        Returns the overhang of the watson strand at the three prime.

        +
        + +
        +
        +fill_in(nucleotides: None | str = None) Dseq[source]
        +

        Fill in of five prime protruding end with a DNA polymerase +that has only DNA polymerase activity (such as exo-klenow [1]) +and any combination of A, G, C or T. Default are all four +nucleotides together.

        +
        +
        Parameters:
        +

        nucleotides (str) –

        +
        +
        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("aaa", "ttt")
        +>>> a
        +Dseq(-3)
        +aaa
        +ttt
        +>>> a.fill_in()
        +Dseq(-3)
        +aaa
        +ttt
        +>>> b=Dseq("caaa", "cttt")
        +>>> b
        +Dseq(-5)
        +caaa
        + tttc
        +>>> b.fill_in()
        +Dseq(-5)
        +caaag
        +gtttc
        +>>> b.fill_in("g")
        +Dseq(-5)
        +caaag
        +gtttc
        +>>> b.fill_in("tac")
        +Dseq(-5)
        +caaa
        + tttc
        +>>> c=Dseq("aaac", "tttg")
        +>>> c
        +Dseq(-5)
        + aaac
        +gttt
        +>>> c.fill_in()
        +Dseq(-5)
        + aaac
        +gttt
        +>>>
        +
        +
        +

        References

        + +
        + +
        +
        +transcribe() Seq[source]
        +

        Transcribe a DNA sequence into RNA and return the RNA sequence as a new Seq object.

        +

        Following the usual convention, the sequence is interpreted as the +coding strand of the DNA double helix, not the template strand. This +means we can get the RNA sequence just by switching T to U.

        +
        >>> from Bio.Seq import Seq
        +>>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
        +>>> coding_dna
        +Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +>>> coding_dna.transcribe()
        +Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +
        +
        +

        The sequence is modified in-place and returned if inplace is True:

        +
        >>> sequence = MutableSeq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
        +>>> sequence
        +MutableSeq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +>>> sequence.transcribe()
        +MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +>>> sequence
        +MutableSeq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +
        +
        +
        >>> sequence.transcribe(inplace=True)
        +MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +>>> sequence
        +MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +
        +
        +

        As Seq objects are immutable, a TypeError is raised if +transcribe is called on a Seq object with inplace=True.

        +

        Trying to transcribe an RNA sequence has no effect. +If you have a nucleotide sequence which might be DNA or RNA +(or even a mixture), calling the transcribe method will ensure +any T becomes U.

        +

        Trying to transcribe a protein sequence will replace any +T for Threonine with U for Selenocysteine, which has no +biologically plausible rational.

        +
        >>> from Bio.Seq import Seq
        +>>> my_protein = Seq("MAIVMGRT")
        +>>> my_protein.transcribe()
        +Seq('MAIVMGRU')
        +
        +
        +
        + +
        +
        +translate(table='Standard', stop_symbol='*', to_stop=False, cds=False, gap='-') Seq[source]
        +

        Translate..

        +
        + +
        +
        +mung() Dseq[source]
        +

        Simulates treatment a nuclease with 5’-3’ and 3’-5’ single +strand specific exonuclease activity (such as mung bean nuclease [2])

        +
            ggatcc    ->     gatcc
        +     ctaggg          ctagg
        +
        +     ggatcc   ->      ggatc
        +    tcctag            cctag
        +
        +>>> from pydna.dseq import Dseq
        +>>> b=Dseq("caaa", "cttt")
        +>>> b
        +Dseq(-5)
        +caaa
        + tttc
        +>>> b.mung()
        +Dseq(-3)
        +aaa
        +ttt
        +>>> c=Dseq("aaac", "tttg")
        +>>> c
        +Dseq(-5)
        + aaac
        +gttt
        +>>> c.mung()
        +Dseq(-3)
        +aaa
        +ttt
        +
        +
        +

        References

        + +
        + +
        +
        +T4(nucleotides=None) Dseq[source]
        +

        Fill in five prime protruding ends and chewing back +three prime protruding ends by a DNA polymerase providing both +5’-3’ DNA polymerase activity and 3’-5’ nuclease acitivty +(such as T4 DNA polymerase). This can be done in presence of any +combination of the four A, G, C or T. Removing one or more nucleotides +can facilitate engineering of sticky ends. Default are all four nucleotides together.

        +
        +
        Parameters:
        +

        nucleotides (str) –

        +
        +
        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("gatcgatc")
        +>>> a
        +Dseq(-8)
        +gatcgatc
        +ctagctag
        +>>> a.T4()
        +Dseq(-8)
        +gatcgatc
        +ctagctag
        +>>> a.T4("t")
        +Dseq(-8)
        +gatcgat
        + tagctag
        +>>> a.T4("a")
        +Dseq(-8)
        +gatcga
        +  agctag
        +>>> a.T4("g")
        +Dseq(-8)
        +gatcg
        +   gctag
        +>>>
        +
        +
        +
        + +
        +
        +t4(nucleotides=None) Dseq
        +

        Fill in five prime protruding ends and chewing back +three prime protruding ends by a DNA polymerase providing both +5’-3’ DNA polymerase activity and 3’-5’ nuclease acitivty +(such as T4 DNA polymerase). This can be done in presence of any +combination of the four A, G, C or T. Removing one or more nucleotides +can facilitate engineering of sticky ends. Default are all four nucleotides together.

        +
        +
        Parameters:
        +

        nucleotides (str) –

        +
        +
        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("gatcgatc")
        +>>> a
        +Dseq(-8)
        +gatcgatc
        +ctagctag
        +>>> a.T4()
        +Dseq(-8)
        +gatcgatc
        +ctagctag
        +>>> a.T4("t")
        +Dseq(-8)
        +gatcgat
        + tagctag
        +>>> a.T4("a")
        +Dseq(-8)
        +gatcga
        +  agctag
        +>>> a.T4("g")
        +Dseq(-8)
        +gatcg
        +   gctag
        +>>>
        +
        +
        +
        + +
        +
        +exo1_front(n=1) DseqType[source]
        +

        5’-3’ resection at the start (left side) of the molecule.

        +
        + +
        +
        +exo1_end(n=1) DseqType[source]
        +

        5’-3’ resection at the end (right side) of the molecule.

        +
        + +
        +
        +no_cutters(batch: RestrictionBatch | None = None) RestrictionBatch[source]
        +

        Enzymes in a RestrictionBatch not cutting sequence.

        +
        + +
        +
        +unique_cutters(batch: RestrictionBatch | None = None) RestrictionBatch[source]
        +

        Enzymes in a RestrictionBatch cutting sequence once.

        +
        + +
        +
        +once_cutters(batch: RestrictionBatch | None = None) RestrictionBatch
        +

        Enzymes in a RestrictionBatch cutting sequence once.

        +
        + +
        +
        +twice_cutters(batch: RestrictionBatch | None = None) RestrictionBatch[source]
        +

        Enzymes in a RestrictionBatch cutting sequence twice.

        +
        + +
        +
        +n_cutters(n=3, batch: RestrictionBatch | None = None) RestrictionBatch[source]
        +

        Enzymes in a RestrictionBatch cutting n times.

        +
        + +
        +
        +cutters(batch: RestrictionBatch | None = None) RestrictionBatch[source]
        +

        Enzymes in a RestrictionBatch cutting sequence at least once.

        +
        + +
        +
        +seguid() str[source]
        +

        SEGUID checksum for the sequence.

        +
        + +
        +
        +isblunt() bool[source]
        +

        isblunt.

        +

        Return True if Dseq is linear and blunt and +false if staggered or circular.

        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> a=Dseq("gat")
        +>>> a
        +Dseq(-3)
        +gat
        +cta
        +>>> a.isblunt()
        +True
        +>>> a=Dseq("gat", "atcg")
        +>>> a
        +Dseq(-4)
        + gat
        +gcta
        +>>> a.isblunt()
        +False
        +>>> a=Dseq("gat", "gatc")
        +>>> a
        +Dseq(-4)
        +gat
        +ctag
        +>>> a.isblunt()
        +False
        +>>> a=Dseq("gat", circular=True)
        +>>> a
        +Dseq(o3)
        +gat
        +cta
        +>>> a.isblunt()
        +False
        +
        +
        +
        + +
        +
        +cas9(RNA: str) Tuple[slice, ...][source]
        +

        docstring.

        +
        + +
        +
        +terminal_transferase(nucleotides='a') Dseq[source]
        +

        docstring.

        +
        + +
        +
        +cut(*enzymes: EnzymesType) Tuple[DseqType, ...][source]
        +

        Returns a list of linear Dseq fragments produced in the digestion. +If there are no cuts, an empty list is returned.

        +
        +
        Parameters:
        +

        enzymes (enzyme object or iterable of such objects) – A Bio.Restriction.XXX restriction objects or iterable.

        +
        +
        Returns:
        +

        frags – list of Dseq objects formed by the digestion

        +
        +
        Return type:
        +

        list

        +
        +
        +

        Examples

        +
        >>> from pydna.dseq import Dseq
        +>>> seq=Dseq("ggatccnnngaattc")
        +>>> seq
        +Dseq(-15)
        +ggatccnnngaattc
        +cctaggnnncttaag
        +>>> from Bio.Restriction import BamHI,EcoRI
        +>>> type(seq.cut(BamHI))
        +<class 'tuple'>
        +>>> for frag in seq.cut(BamHI): print(repr(frag))
        +Dseq(-5)
        +g
        +cctag
        +Dseq(-14)
        +gatccnnngaattc
        +    gnnncttaag
        +>>> seq.cut(EcoRI, BamHI) ==  seq.cut(BamHI, EcoRI)
        +True
        +>>> a,b,c = seq.cut(EcoRI, BamHI)
        +>>> a+b+c
        +Dseq(-15)
        +ggatccnnngaattc
        +cctaggnnncttaag
        +>>>
        +
        +
        +
        + +
        +
        +cutsite_is_valid(cutsite: Tuple[Tuple[int, int], _AbstractCut | None]) bool[source]
        +

        Returns False if: +- Cut positions fall outside the sequence (could be moved to Biopython) +- Overhang is not double stranded +- Recognition site is not double stranded or is outside the sequence +- For enzymes that cut twice, it checks that at least one possibility is valid

        +
        + +
        +
        +get_cutsites(*enzymes: EnzymesType) List[Tuple[Tuple[int, int], _AbstractCut | None]][source]
        +

        Returns a list of cutsites, represented represented as ((cut_watson, ovhg), enz):

        +
          +
        • cut_watson is a positive integer contained in [0,len(seq)), where seq is the sequence +that will be cut. It represents the position of the cut on the watson strand, using the full +sequence as a reference. By “full sequence” I mean the one you would get from str(Dseq).

        • +
        • ovhg is the overhang left after the cut. It has the same meaning as ovhg in +the Bio.Restriction enzyme objects, or pydna’s Dseq property.

        • +
        • +
          enz is the enzyme object. It’s not necessary to perform the cut, but can be

          used to keep track of which enzyme was used.

          +
          +
          +
        • +
        +

        Cuts are only returned if the recognition site and overhang are on the double-strand +part of the sequence.

        +
        +
        Parameters:
        +

        enzymes (Union[_RestrictionBatch,list[_AbstractCut]]) –

        +
        +
        Return type:
        +

        list[tuple[tuple[int,int], _AbstractCut]]

        +
        +
        +

        Examples

        +
        >>> from Bio.Restriction import EcoRI
        +>>> from pydna.dseq import Dseq
        +>>> seq = Dseq('AAGAATTCAAGAATTC')
        +>>> seq.get_cutsites(EcoRI)
        +[((3, -4), EcoRI), ((11, -4), EcoRI)]
        +
        +
        +

        cut_watson is defined with respect to the “full sequence”, not the +watson strand:

        +
        >>> dseq = Dseq.from_full_sequence_and_overhangs('aaGAATTCaa', 1, 0)
        +>>> dseq
        +Dseq(-10)
        + aGAATTCaa
        +ttCTTAAGtt
        +>>> dseq.get_cutsites([EcoRI])
        +[((3, -4), EcoRI)]
        +
        +
        +

        Cuts are only returned if the recognition site and overhang are on the double-strand +part of the sequence.

        +
        >>> Dseq('GAATTC').get_cutsites([EcoRI])
        +[((1, -4), EcoRI)]
        +>>> Dseq.from_full_sequence_and_overhangs('GAATTC', -1, 0).get_cutsites([EcoRI])
        +[]
        +
        +
        +
        + +
        +
        +left_end_position() Tuple[int, int][source]
        +

        The index in the full sequence of the watson and crick start positions.

        +

        full sequence (str(self)) for all three cases is AAA

        +
        AAA              AA               AAT
        + TT             TTT               TTT
        +Returns (0, 1)  Returns (1, 0)    Returns (0, 0)
        +
        +
        +
        + +
        +
        +right_end_position() Tuple[int, int][source]
        +

        The index in the full sequence of the watson and crick end positions.

        +

        full sequence (str(self)) for all three cases is AAA

        +

        ` +AAA               AA                   AAA +TT                TTT                  TTT +Returns (3, 2)    Returns (2, 3)       Returns (3, 3) +`

        +
        + +
        +
        +get_cut_parameters(cut: Tuple[Tuple[int, int], _AbstractCut | None] | None, is_left: bool) Tuple[int, int, int][source]
        +

        For a given cut expressed as ((cut_watson, ovhg), enz), returns +a tuple (cut_watson, cut_crick, ovhg).

        +
          +
        • cut_watson: see get_cutsites docs

        • +
        • cut_crick: equivalent of cut_watson in the crick strand

        • +
        • ovhg: see get_cutsites docs

        • +
        +

        The cut can be None if it represents the left or right end of the sequence. +Then it will return the position of the watson and crick ends with respect +to the “full sequence”. The is_left parameter is only used in this case.

        +
        + +
        +
        +apply_cut(left_cut: Tuple[Tuple[int, int], _AbstractCut | None], right_cut: Tuple[Tuple[int, int], _AbstractCut | None]) Dseq[source]
        +

        Extracts a subfragment of the sequence between two cuts.

        +

        For more detail see the documentation of get_cutsite_pairs.

        +
        +
        Parameters:
        +
        +
        +
        Return type:
        +

        Dseq

        +
        +
        +

        Examples

        +
        >>> from Bio.Restriction import EcoRI
        +>>> from pydna.dseq import Dseq
        +>>> dseq = Dseq('aaGAATTCaaGAATTCaa')
        +>>> cutsites = dseq.get_cutsites([EcoRI])
        +>>> cutsites
        +[((3, -4), EcoRI), ((11, -4), EcoRI)]
        +>>> p1, p2, p3 = dseq.get_cutsite_pairs(cutsites)
        +>>> p1
        +(None, ((3, -4), EcoRI))
        +>>> dseq.apply_cut(*p1)
        +Dseq(-7)
        +aaG
        +ttCTTAA
        +>>> p2
        +(((3, -4), EcoRI), ((11, -4), EcoRI))
        +>>> dseq.apply_cut(*p2)
        +Dseq(-12)
        +AATTCaaG
        +    GttCTTAA
        +>>> p3
        +(((11, -4), EcoRI), None)
        +>>> dseq.apply_cut(*p3)
        +Dseq(-7)
        +AATTCaa
        +    Gtt
        +
        +
        +
        >>> dseq = Dseq('TTCaaGAA', circular=True)
        +>>> cutsites = dseq.get_cutsites([EcoRI])
        +>>> cutsites
        +[((6, -4), EcoRI)]
        +>>> pair = dseq.get_cutsite_pairs(cutsites)[0]
        +>>> pair
        +(((6, -4), EcoRI), ((6, -4), EcoRI))
        +>>> dseq.apply_cut(*pair)
        +Dseq(-12)
        +AATTCaaG
        +    GttCTTAA
        +
        +
        +
        + +
        +
        +get_cutsite_pairs(cutsites: List[Tuple[Tuple[int, int], _AbstractCut | None]]) List[Tuple[None | Tuple[Tuple[int, int], _AbstractCut | None], None | Tuple[Tuple[int, int], _AbstractCut | None]]][source]
        +

        Returns pairs of cutsites that render the edges of the resulting fragments.

        +

        A fragment produced by restriction is represented by a tuple of length 2 that +may contain cutsites or None:

        +
        +
          +
        • Two cutsites: represents the extraction of a fragment between those two +cutsites, in that orientation. To represent the opening of a circular +molecule with a single cutsite, we put the same cutsite twice.

        • +
        • None, cutsite: represents the extraction of a fragment between the left +edge of linear sequence and the cutsite.

        • +
        • cutsite, None: represents the extraction of a fragment between the cutsite +and the right edge of a linear sequence.

        • +
        +
        +
        +
        Parameters:
        +

        cutsites (list[tuple[tuple[int,int], _AbstractCut]]) –

        +
        +
        Return type:
        +

        list[tuple[tuple[tuple[int,int], _AbstractCut]|None],tuple[tuple[int,int], _AbstractCut]|None]

        +
        +
        +

        Examples

        +
        >>> from Bio.Restriction import EcoRI
        +>>> from pydna.dseq import Dseq
        +>>> dseq = Dseq('aaGAATTCaaGAATTCaa')
        +>>> cutsites = dseq.get_cutsites([EcoRI])
        +>>> cutsites
        +[((3, -4), EcoRI), ((11, -4), EcoRI)]
        +>>> dseq.get_cutsite_pairs(cutsites)
        +[(None, ((3, -4), EcoRI)), (((3, -4), EcoRI), ((11, -4), EcoRI)), (((11, -4), EcoRI), None)]
        +
        +
        +
        >>> dseq = Dseq('TTCaaGAA', circular=True)
        +>>> cutsites = dseq.get_cutsites([EcoRI])
        +>>> cutsites
        +[((6, -4), EcoRI)]
        +>>> dseq.get_cutsite_pairs(cutsites)
        +[(((6, -4), EcoRI), ((6, -4), EcoRI))]
        +
        +
        +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_dseqrecord.html b/modules/pydna_dseqrecord.html new file mode 100644 index 00000000..cadadd63 --- /dev/null +++ b/modules/pydna_dseqrecord.html @@ -0,0 +1,874 @@ + + + + + + + + + pydna.dseqrecord — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.dseqrecord

        +

        This module provides the Dseqrecord class, for handling double stranded +DNA sequences. The Dseqrecord holds sequence information in the form of a pydna.dseq.Dseq +object. The Dseq and Dseqrecord classes are subclasses of Biopythons +Seq and SeqRecord classes, respectively.

        +

        The Dseq and Dseqrecord classes support the notion of circular and linear DNA topology.

        +
        +
        +class pydna.dseqrecord.Dseqrecord(record, *args, circular=None, n=5e-14, **kwargs)[source]
        +

        Bases: SeqRecord

        +

        Dseqrecord is a double stranded version of the Biopython SeqRecord [1] class. +The Dseqrecord object holds a Dseq object describing the sequence. +Additionally, Dseqrecord hold meta information about the sequence in the +from of a list of SeqFeatures, in the same way as the SeqRecord does.

        +

        The Dseqrecord can be initialized with a string, Seq, Dseq, SeqRecord +or another Dseqrecord. The sequence information will be stored in a +Dseq object in all cases.

        +

        Dseqrecord objects can be read or parsed from sequences in FASTA, EMBL or Genbank formats. +See the pydna.readers and pydna.parsers modules for further information.

        +

        There is a short representation associated with the Dseqrecord. +Dseqrecord(-3) represents a linear sequence of length 2 +while Dseqrecord(o7) +represents a circular sequence of length 7.

        +

        Dseqrecord and Dseq share the same concept of length. This length can be larger +than each strand alone if they are staggered as in the example below.

        +
        <-- length -->
        +GATCCTTT
        +     AAAGCCTAG
        +
        +
        +
        +
        Parameters:
        +
          +
        • record (string, Seq, SeqRecord, Dseq or other Dseqrecord object) – This data will be used to form the seq property

        • +
        • circular (bool, optional) – True or False reflecting the shape of the DNA molecule

        • +
        • linear (bool, optional) – True or False reflecting the shape of the DNA molecule

        • +
        +
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("aaa")
        +>>> a
        +Dseqrecord(-3)
        +>>> a.seq
        +Dseq(-3)
        +aaa
        +ttt
        +>>> from pydna.seq import Seq
        +>>> b=Dseqrecord(Seq("aaa"))
        +>>> b
        +Dseqrecord(-3)
        +>>> b.seq
        +Dseq(-3)
        +aaa
        +ttt
        +>>> from Bio.SeqRecord import SeqRecord
        +>>> c=Dseqrecord(SeqRecord(Seq("aaa")))
        +>>> c
        +Dseqrecord(-3)
        +>>> c.seq
        +Dseq(-3)
        +aaa
        +ttt
        +
        +
        +

        References

        + +
        +
        +classmethod from_string(record: str = '', *args, circular=False, n=5e-14, **kwargs)[source]
        +

        docstring.

        +
        + +
        +
        +classmethod from_SeqRecord(record: SeqRecord, *args, circular=None, n=5e-14, **kwargs)[source]
        +
        + +
        +
        +property circular
        +

        The circular property can not be set directly. +Use looped()

        +
        + +
        +
        +m()[source]
        +

        This method returns the mass of the DNA molecule in grams. This is +calculated as the product between the molecular weight of the Dseq object +and the

        +
        + +
        +
        +extract_feature(n)[source]
        +

        Extracts a feature and creates a new Dseqrecord object.

        +
        +
        Parameters:
        +

        n (int) – Indicates the feature to extract

        +
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("atgtaa")
        +>>> a.add_feature(2,4)
        +>>> b=a.extract_feature(0)
        +>>> b
        +Dseqrecord(-2)
        +>>> b.seq
        +Dseq(-2)
        +gt
        +ca
        +
        +
        +
        + +
        +
        +add_feature(x=None, y=None, seq=None, type_='misc', strand=1, *args, **kwargs)[source]
        +

        Add a feature of type misc to the feature list of the sequence.

        +
        +
        Parameters:
        +
          +
        • x (int) – Indicates start of the feature

        • +
        • y (int) – Indicates end of the feature

        • +
        +
        +
        +

        Examples

        +
        >>> from pydna.seqrecord import SeqRecord
        +>>> a=SeqRecord("atgtaa")
        +>>> a.features
        +[]
        +>>> a.add_feature(2,4)
        +>>> a.features
        +[SeqFeature(SimpleLocation(ExactPosition(2), ExactPosition(4), strand=1), type='misc', qualifiers=...)]
        +
        +
        +
        + +
        +
        +seguid()[source]
        +

        Url safe SEGUID for the sequence.

        +

        This checksum is the same as seguid but with base64.urlsafe +encoding instead of the normal base64. This means that +the characters + and / are replaced with - and _ so that +the checksum can be part of a URL.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a = Dseqrecord("aa")
        +>>> a.seguid()
        +'ldseguid=TEwydy0ugvGXh3VJnVwgtxoyDQA'
        +
        +
        +
        + +
        +
        +looped()[source]
        +

        Circular version of the Dseqrecord object.

        +

        The underlying linear Dseq object has to have compatible ends.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("aaa")
        +>>> a
        +Dseqrecord(-3)
        +>>> b=a.looped()
        +>>> b
        +Dseqrecord(o3)
        +>>>
        +
        +
        + +
        + +
        +
        +tolinear()[source]
        +

        Returns a linear, blunt copy of a circular Dseqrecord object. The +underlying Dseq object has to be circular.

        +

        This method is deprecated, use slicing instead. See example below.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("aaa", circular = True)
        +>>> a
        +Dseqrecord(o3)
        +>>> b=a[:]
        +>>> b
        +Dseqrecord(-3)
        +>>>
        +
        +
        +
        + +
        +
        +terminal_transferase(nucleotides='a')[source]
        +

        docstring.

        +
        + +
        +
        +format(f='gb')[source]
        +

        Returns the sequence as a string using a format supported by Biopython +SeqIO [2]. Default is “gb” which is short for Genbank.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> x=Dseqrecord("aaa")
        +>>> x.annotations['date'] = '02-FEB-2013'
        +>>> x
        +Dseqrecord(-3)
        +>>> print(x.format("gb"))
        +LOCUS       name                       3 bp    DNA     linear   UNK 02-FEB-2013
        +DEFINITION  description.
        +ACCESSION   id
        +VERSION     id
        +KEYWORDS    .
        +SOURCE      .
        +  ORGANISM  .
        +            .
        +FEATURES             Location/Qualifiers
        +ORIGIN
        +        1 aaa
        +//
        +
        +
        +

        References

        + +
        + +
        +
        +write(filename=None, f='gb')[source]
        +

        Writes the Dseqrecord to a file using the format f, which must +be a format supported by Biopython SeqIO for writing [3]. Default +is “gb” which is short for Genbank. Note that Biopython SeqIO reads +more formats than it writes.

        +

        Filename is the path to the file where the sequece is to be +written. The filename is optional, if it is not given, the +description property (string) is used together with the format.

        +

        If obj is the Dseqrecord object, the default file name will be:

        +

        <obj.locus>.<f>

        +

        Where <f> is “gb” by default. If the filename already exists and +AND the sequence it contains is different, a new file name will be +used so that the old file is not lost:

        +

        <obj.locus>_NEW.<f>

        +

        References

        + +
        + +
        +
        +find(other)[source]
        +
        + +
        +
        +find_aminoacids(other)[source]
        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> s=Dseqrecord("atgtacgatcgtatgctggttatattttag")
        +>>> s.seq.translate()
        +Seq('MYDRMLVIF*')
        +>>> "RML" in s
        +True
        +>>> "MMM" in s
        +False
        +>>> s.seq.rc().translate()
        +Seq('LKYNQHTIVH')
        +>>> "QHT" in s.rc()
        +True
        +>>> "QHT" in s
        +False
        +>>> slc = s.find_aa("RML")
        +>>> slc
        +slice(9, 18, None)
        +>>> s[slc]
        +Dseqrecord(-9)
        +>>> code = s[slc].seq
        +>>> code
        +Dseq(-9)
        +cgtatgctg
        +gcatacgac
        +>>> code.translate()
        +Seq('RML')
        +
        +
        +
        + +
        +
        +find_aa(other)
        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> s=Dseqrecord("atgtacgatcgtatgctggttatattttag")
        +>>> s.seq.translate()
        +Seq('MYDRMLVIF*')
        +>>> "RML" in s
        +True
        +>>> "MMM" in s
        +False
        +>>> s.seq.rc().translate()
        +Seq('LKYNQHTIVH')
        +>>> "QHT" in s.rc()
        +True
        +>>> "QHT" in s
        +False
        +>>> slc = s.find_aa("RML")
        +>>> slc
        +slice(9, 18, None)
        +>>> s[slc]
        +Dseqrecord(-9)
        +>>> code = s[slc].seq
        +>>> code
        +Dseq(-9)
        +cgtatgctg
        +gcatacgac
        +>>> code.translate()
        +Seq('RML')
        +
        +
        +
        + +
        +
        +map_trace_files(pth, limit=25)[source]
        +
        + +
        +
        +linearize(*enzymes)[source]
        +

        Similar to :func:cut.

        +

        Throws an exception if there is not excactly one cut +i.e. none or more than one digestion products.

        +
        + +
        +
        +no_cutters(batch: RestrictionBatch | None = None)[source]
        +

        docstring.

        +
        + +
        +
        +unique_cutters(batch: RestrictionBatch | None = None)[source]
        +

        docstring.

        +
        + +
        +
        +once_cutters(batch: RestrictionBatch | None = None)[source]
        +

        docstring.

        +
        + +
        +
        +twice_cutters(batch: RestrictionBatch | None = None)[source]
        +

        docstring.

        +
        + +
        +
        +n_cutters(n=3, batch: RestrictionBatch | None = None)[source]
        +

        docstring.

        +
        + +
        +
        +cutters(batch: RestrictionBatch | None = None)[source]
        +

        docstring.

        +
        + +
        +
        +number_of_cuts(*enzymes)[source]
        +

        The number of cuts by digestion with the Restriction enzymes +contained in the iterable.

        +
        + +
        +
        +cas9(RNA: str)[source]
        +

        docstring.

        +
        + +
        +
        +reverse_complement()[source]
        +

        Reverse complement.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggaatt")
        +>>> a
        +Dseqrecord(-6)
        +>>> a.seq
        +Dseq(-6)
        +ggaatt
        +ccttaa
        +>>> a.reverse_complement().seq
        +Dseq(-6)
        +aattcc
        +ttaagg
        +>>>
        +
        +
        + +
        + +
        +
        +rc()
        +

        Reverse complement.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggaatt")
        +>>> a
        +Dseqrecord(-6)
        +>>> a.seq
        +Dseq(-6)
        +ggaatt
        +ccttaa
        +>>> a.reverse_complement().seq
        +Dseq(-6)
        +aattcc
        +ttaagg
        +>>>
        +
        +
        + +
        + +
        +
        +synced(ref, limit=25)[source]
        +

        This method returns a new circular sequence (Dseqrecord object), which has been rotated +in such a way that there is maximum overlap between the sequence and +ref, which may be a string, Biopython Seq, SeqRecord object or +another Dseqrecord object.

        +

        The reason for using this could be to rotate a new recombinant plasmid so +that it starts at the same position after cloning. See the example below:

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("gaat", circular=True)
        +>>> a.seq
        +Dseq(o4)
        +gaat
        +ctta
        +>>> d = a[2:] + a[:2]
        +>>> d.seq
        +Dseq(-4)
        +atga
        +tact
        +>>> insert=Dseqrecord("CCC")
        +>>> recombinant = (d+insert).looped()
        +>>> recombinant.seq
        +Dseq(o7)
        +atgaCCC
        +tactGGG
        +>>> recombinant.synced(a).seq
        +Dseq(o7)
        +gaCCCat
        +ctGGGta
        +
        +
        +
        + +
        +
        +upper()[source]
        +

        Returns an uppercase copy. +>>> from pydna.dseqrecord import Dseqrecord +>>> my_seq = Dseqrecord(“aAa”) +>>> my_seq.seq +Dseq(-3) +aAa +tTt +>>> upper = my_seq.upper() +>>> upper.seq +Dseq(-3) +AAA +TTT +>>>

        +
        +
        Returns:
        +

        Dseqrecord object in uppercase

        +
        +
        Return type:
        +

        Dseqrecord

        +
        +
        + +
        + +
        +
        +lower()[source]
        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> my_seq = Dseqrecord("aAa")
        +>>> my_seq.seq
        +Dseq(-3)
        +aAa
        +tTt
        +>>> upper = my_seq.upper()
        +>>> upper.seq
        +Dseq(-3)
        +AAA
        +TTT
        +>>> lower = my_seq.lower()
        +>>> lower
        +Dseqrecord(-3)
        +>>>
        +
        +
        +
        +
        Returns:
        +

        Dseqrecord object in lowercase

        +
        +
        Return type:
        +

        Dseqrecord

        +
        +
        + +
        + +
        +
        +orfs(minsize=300)[source]
        +

        docstring.

        +
        + +
        +
        +orfs_to_features(minsize=300)[source]
        +

        docstring.

        +
        + +
        +
        +copy_gb_to_clipboard()[source]
        +

        docstring.

        +
        + +
        +
        +copy_fasta_to_clipboard()[source]
        +

        docstring.

        +
        + +
        +
        +figure(feature=0, highlight='\x1b[48;5;11m', plain='\x1b[0m')[source]
        +

        docstring.

        +
        + +
        +
        +shifted(shift)[source]
        +

        Circular Dseqrecord with a new origin <shift>.

        +

        This only works on circular Dseqrecords. If we consider the following +circular sequence:

        +
        +
        GAAAT   <-- watson strand
        +
        CTTTA   <-- crick strand
        +
        +

        The T and the G on the watson strand are linked together as well +as the A and the C of the of the crick strand.

        +

        if shift is 1, this indicates a new origin at position 1:

        +
        +
        +
        new origin at the | symbol:
        +

        +
        +
        G|AAAT
        +
        C|TTTA
        +
        +

        new sequence:

        +
        +
        AAATG
        +
        TTTAC
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("aaat",circular=True)
        +>>> a
        +Dseqrecord(o4)
        +>>> a.seq
        +Dseq(o4)
        +aaat
        +ttta
        +>>> b=a.shifted(1)
        +>>> b
        +Dseqrecord(o4)
        +>>> b.seq
        +Dseq(o4)
        +aata
        +ttat
        +
        +
        +
        + +
        +
        +cut(*enzymes)[source]
        +

        Digest a Dseqrecord object with one or more restriction enzymes.

        +

        returns a list of linear Dseqrecords. If there are no cuts, an empty +list is returned.

        +

        See also Dseq.cut() +:param enzymes: A Bio.Restriction.XXX restriction object or iterable of such. +:type enzymes: enzyme object or iterable of such objects

        +
        +
        Returns:
        +

        Dseqrecord_frags – list of Dseqrecord objects formed by the digestion

        +
        +
        Return type:
        +

        list

        +
        +
        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggatcc")
        +>>> from Bio.Restriction import BamHI
        +>>> a.cut(BamHI)
        +(Dseqrecord(-5), Dseqrecord(-5))
        +>>> frag1, frag2 = a.cut(BamHI)
        +>>> frag1.seq
        +Dseq(-5)
        +g
        +cctag
        +>>> frag2.seq
        +Dseq(-5)
        +gatcc
        +    g
        +
        +
        +
        + +
        +
        +apply_cut(left_cut, right_cut)[source]
        +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_editor.html b/modules/pydna_editor.html new file mode 100644 index 00000000..ef8885e9 --- /dev/null +++ b/modules/pydna_editor.html @@ -0,0 +1,214 @@ + + + + + + + + + pydna.editor — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.editor

        +

        This module provides a class for opening a sequence using an editor +that accepts a file as a command line argument.

        +

        ApE - A plasmid Editor [1] is and excellent editor for this purpose.

        +

        References

        + +
        +
        +class pydna.editor.Editor(shell_command_for_editor, tmpdir=None)[source]
        +

        Bases: object

        +

        The Editor class needs to be instantiated before use.

        +
        +
        Parameters:
        +
          +
        • shell_command_for_editor (str) – String containing the path to the editor

        • +
        • tmpdir (str, optional) – String containing path to the temprary directory where sequence +files are stored before opening.

        • +
        +
        +
        +

        Examples

        +
        >>> import pydna
        +>>> #ape = pydna.Editor("tclsh8.6 /home/bjorn/.ApE/apeextractor/ApE.vfs/lib/app-AppMain/AppMain.tcl")
        +>>> #ape.open("aaa") # This command opens the sequence in the ApE editor
        +
        +
        +
        +
        +open(seq_to_open)[source]
        +

        Open a sequence for editing in an external (DNA) editor.

        +
        +
        Parameters:
        +

        args (SeqRecord or Dseqrecord object) –

        +
        +
        +
        + +
        + +
        +
        +pydna.editor.ape(*args, **kwargs)[source]
        +

        docstring.

        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_fakeseq.html b/modules/pydna_fakeseq.html new file mode 100644 index 00000000..881e143b --- /dev/null +++ b/modules/pydna_fakeseq.html @@ -0,0 +1,185 @@ + + + + + + + + + pydna.fakeseq — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.fakeseq

        +

        docstring.

        +
        +
        +class pydna.fakeseq.FakeSeq(length: int, n: float = 50e-15, rf: float = 0.0)[source]
        +

        Bases: object

        +

        docstring.

        +
        +
        +m() float[source]
        +

        Mass of the DNA molecule in grams.

        +
        + +
        +
        +M() float[source]
        +

        M grams/mol.

        +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_fusionpcr.html b/modules/pydna_fusionpcr.html new file mode 100644 index 00000000..e0d19598 --- /dev/null +++ b/modules/pydna_fusionpcr.html @@ -0,0 +1,173 @@ + + + + + + + + + pydna.fusionpcr — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/pydna_gateway.html b/modules/pydna_gateway.html new file mode 100644 index 00000000..4ef814c5 --- /dev/null +++ b/modules/pydna_gateway.html @@ -0,0 +1,184 @@ + + + + + + + + + pydna.gateway — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.gateway

        +

        Assembly of sequences by Gateway recombination.

        +

        Given a list of sequences (Dseqrecords), all sequences are analyzed for +presence of att(P|B|L|R)N where N is 1,2,3 or 4.

        +

        A graph is constructed where the att sites form a nodes and +sequences separating att sites form edges.

        +

        The NetworkX package is used to trace linear and circular paths through the +graph.

        +
        +
        +class pydna.gateway.Gateway(molecules=None)[source]
        +

        Bases: object

        +

        Assembly of linear DNA fragments into linear or circular constructs.

        +

        The Assembly is meant to replace the Assembly method as it +is easier to use. Accepts a list of Dseqrecords (source fragments) to +initiate an Assembly object. Several methods are available for analysis +of overlapping sequences, graph construction and assembly.

        +
        +
        Parameters:
        +

        fragments (list) – a list of Dseqrecord objects.

        +
        +
        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_gel.html b/modules/pydna_gel.html new file mode 100644 index 00000000..8aade715 --- /dev/null +++ b/modules/pydna_gel.html @@ -0,0 +1,174 @@ + + + + + + + + + pydna.gel — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.gel

        +

        docstring.

        +
        +
        +pydna.gel.interpolator(mwstd)[source]
        +

        docstring.

        +
        + +
        +
        +pydna.gel.gel(samples=None, gel_length=600, margin=50, interpolator=interpolator(mwstd=_mwstd))[source]
        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_genbank.html b/modules/pydna_genbank.html new file mode 100644 index 00000000..72fa8247 --- /dev/null +++ b/modules/pydna_genbank.html @@ -0,0 +1,239 @@ + + + + + + + + + pydna.genbank — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.genbank

        +

        This module provides a class for downloading sequences from genbank +called Genbank and an function that does the same thing called genbank.

        +

        The function can be used if the environmental variable pydna_email has +been set to a valid email address. The easiest way to do this permanantly is to edit the +pydna.ini file. See the documentation of pydna.open_config_folder()

        +
        +
        +class pydna.genbank.Genbank(users_email: str, *, tool: str = 'pydna')[source]
        +

        Bases: object

        +

        Class to facilitate download from genbank. It is easier and +quicker to use the pydna.genbank.genbank() function directly.

        +
        +
        Parameters:
        +

        users_email (string) – Has to be a valid email address. You should always tell +Genbanks who you are, so that they can contact you.

        +
        +
        +

        Examples

        +
        >>> from pydna.genbank import Genbank
        +>>> gb=Genbank("bjornjobb@gmail.com")
        +>>> rec = gb.nucleotide("LP002422.1")   # <- entry from genbank
        +>>> print(len(rec))
        +1
        +
        +
        +
        +
        +nucleotide(**kwargs)
        +
        + +
        + +
        +
        +pydna.genbank.genbank(accession: str = 'CS570233.1', *args, **kwargs) GenbankRecord[source]
        +

        Download a genbank nuclotide record.

        +

        This function takes the same paramenters as the +:func:pydna.genbank.Genbank.nucleotide method. The email address stored +in the pydna_email environment variable is used. The easiest way set +this permanantly is to edit the pydna.ini file. +See the documentation of pydna.open_config_folder()

        +

        if no accession is given, a very short Genbank +entry +is used as an example (see below). This can be useful for testing the +connection to Genbank.

        +

        Please note that this result is also cached by default by settings in +the pydna.ini file. +See the documentation of pydna.open_config_folder()

        +
        LOCUS       CS570233                  14 bp    DNA     linear   PAT 18-MAY-2007
        +DEFINITION  Sequence 6 from Patent WO2007025016.
        +ACCESSION   CS570233
        +VERSION     CS570233.1
        +KEYWORDS    .
        +SOURCE      synthetic construct
        +  ORGANISM  synthetic construct
        +            other sequences; artificial sequences.
        +REFERENCE   1
        +  AUTHORS   Shaw,R.W. and Cottenoir,M.
        +  TITLE     Inhibition of metallo-beta-lactamase by double-stranded dna
        +  JOURNAL   Patent: WO 2007025016-A1 6 01-MAR-2007;
        +            Texas Tech University System (US)
        +FEATURES             Location/Qualifiers
        +     source          1..14
        +                     /organism="synthetic construct"
        +                     /mol_type="unassigned DNA"
        +                     /db_xref="taxon:32630"
        +                     /note="This is a 14bp aptamer inhibitor."
        +ORIGIN
        +        1 atgttcctac atga
        +//
        +
        +
        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_genbankfile.html b/modules/pydna_genbankfile.html new file mode 100644 index 00000000..4efbefef --- /dev/null +++ b/modules/pydna_genbankfile.html @@ -0,0 +1,229 @@ + + + + + + + + + pydna.genbankfile — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.genbankfile

        +
        +
        +class pydna.genbankfile.GenbankFile(record, *args, path=None, **kwargs)[source]
        +

        Bases: Dseqrecord

        +
        +
        +classmethod from_SeqRecord(record, *args, path=None, **kwargs)[source]
        +
        + +
        +
        +reverse_complement()[source]
        +

        Reverse complement.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggaatt")
        +>>> a
        +Dseqrecord(-6)
        +>>> a.seq
        +Dseq(-6)
        +ggaatt
        +ccttaa
        +>>> a.reverse_complement().seq
        +Dseq(-6)
        +aattcc
        +ttaagg
        +>>>
        +
        +
        + +
        + +
        +
        +rc()
        +

        Reverse complement.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggaatt")
        +>>> a
        +Dseqrecord(-6)
        +>>> a.seq
        +Dseq(-6)
        +ggaatt
        +ccttaa
        +>>> a.reverse_complement().seq
        +Dseq(-6)
        +aattcc
        +ttaagg
        +>>>
        +
        +
        + +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_genbankfixer.html b/modules/pydna_genbankfixer.html new file mode 100644 index 00000000..96d4aaad --- /dev/null +++ b/modules/pydna_genbankfixer.html @@ -0,0 +1,316 @@ + + + + + + + + + pydna.genbankfixer — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.genbankfixer

        +

        This module provides the gbtext_clean() function which can clean up broken Genbank files enough to +pass the BioPython Genbank parser

        +

        Almost all of this code was lifted from BioJSON (https://github.com/levskaya/BioJSON) by Anselm Levskaya. +The original code was not accompanied by any software licence. This parser is based on pyparsing.

        +

        There are some modifications to deal with fringe cases.

        +

        The parser first produces JSON as an intermediate format which is then formatted back into a +string in Genbank format.

        +

        The parser is not complete, so some fields do not survive the roundtrip (see below). +This should not be a difficult fix. The returned result has two properties, +.jseq which is the intermediate JSON produced by the parser and .gbtext +which is the formatted genbank string.

        +
        +
        +pydna.genbankfixer.parseGBLoc(s, l_, t)[source]
        +

        retwingles parsed genbank location strings, assumes no joins of RC and FWD sequences

        +
        + +
        +
        +pydna.genbankfixer.strip_multiline(s, l_, t)[source]
        +
        + +
        +
        +pydna.genbankfixer.toInt(s, l_, t)[source]
        +
        + +
        +
        +pydna.genbankfixer.strip_indent(str)[source]
        +
        + +
        +
        +pydna.genbankfixer.concat_dict(dlist)[source]
        +

        more or less dict(list of string pairs) but merges +vals with the same keys so no duplicates occur

        +
        + +
        +
        +pydna.genbankfixer.toJSON(gbkstring)[source]
        +
        + +
        +
        +pydna.genbankfixer.wrapstring(str_, rowstart, rowend, padfirst=True)[source]
        +

        wraps the provided string in lines of length rowend-rowstart +and padded on the left by rowstart. +-> if padfirst is false the first line is not padded

        +
        + +
        +
        +pydna.genbankfixer.locstr(locs, strand)[source]
        +

        genbank formatted location string, assumes no join’d combo of rev and fwd seqs

        +
        + +
        +
        +pydna.genbankfixer.originstr(sequence)[source]
        +

        formats dna sequence as broken, numbered lines ala genbank

        +
        + +
        +
        +pydna.genbankfixer.toGB(jseq)[source]
        +

        parses json jseq data and prints out ApE compatible genbank

        +
        + +
        +
        +pydna.genbankfixer.gbtext_clean(gbtext)[source]
        +

        This function takes a string containing one genbank sequence +in Genbank format and returns a named tuple containing two fields, +the gbtext containing a string with the corrected genbank sequence and +jseq which contains the JSON intermediate.

        +

        Examples

        +
        >>> s = '''LOCUS       New_DNA      3 bp    DNA   CIRCULAR SYN        19-JUN-2013
        +... DEFINITION  .
        +... ACCESSION
        +... VERSION
        +... SOURCE      .
        +...   ORGANISM  .
        +... COMMENT
        +... COMMENT     ApEinfo:methylated:1
        +... ORIGIN
        +...         1 aaa
        +... //'''
        +>>> from pydna.readers import read
        +>>> read(s)  
        +/home/bjorn/anaconda3/envs/bjorn36/lib/python3.6/site-packages/Bio/GenBank/Scanner.py:1388: BiopythonParserWarning: Malformed LOCUS line found - is this correct?
        +:'LOCUS       New_DNA      3 bp    DNA   CIRCULAR SYN        19-JUN-2013\n'
        +  "correct?\n:%r" % line, BiopythonParserWarning)
        +Traceback (most recent call last):
        +  File "/home/bjorn/python_packages/pydna/pydna/readers.py", line 48, in read
        +    results = results.pop()
        +IndexError: pop from empty list
        +
        +During handling of the above exception, another exception occurred:
        +
        +Traceback (most recent call last):
        +  File "<stdin>", line 1, in <module>
        +  File "/home/bjorn/python_packages/pydna/pydna/readers.py", line 50, in read
        +    raise ValueError("No sequences found in data:\n({})".format(data[:79]))
        +ValueError: No sequences found in data:
        +(LOCUS       New_DNA      3 bp    DNA   CIRCULAR SYN        19-JUN-2013
        +DEFINITI)
        +>>> from pydna.genbankfixer import gbtext_clean
        +>>> s2, j2 = gbtext_clean(s)
        +>>> print(s2)
        +LOCUS       New_DNA                    3 bp ds-DNA     circular SYN 19-JUN-2013
        +DEFINITION  .
        +ACCESSION
        +VERSION
        +SOURCE      .
        +ORGANISM  .
        +COMMENT
        +COMMENT     ApEinfo:methylated:1
        +FEATURES             Location/Qualifiers
        +ORIGIN
        +        1 aaa
        +//
        +>>> s3 = read(s2)
        +>>> s3
        +Dseqrecord(o3)
        +>>> print(s3.format())
        +LOCUS       New_DNA                    3 bp    DNA     circular SYN 19-JUN-2013
        +DEFINITION  .
        +ACCESSION   New_DNA
        +VERSION     New_DNA
        +KEYWORDS    .
        +SOURCE
        +  ORGANISM  .
        +            .
        +COMMENT
        +            ApEinfo:methylated:1
        +FEATURES             Location/Qualifiers
        +ORIGIN
        +        1 aaa
        +//
        +
        +
        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_genbankrecord.html b/modules/pydna_genbankrecord.html new file mode 100644 index 00000000..b73b2191 --- /dev/null +++ b/modules/pydna_genbankrecord.html @@ -0,0 +1,250 @@ + + + + + + + + + pydna.genbankrecord — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.genbankrecord

        +
        +
        +class pydna.genbankrecord.GenbankRecord(record, *args, item='accession', start=None, stop=None, strand=1, **kwargs)[source]
        +

        Bases: Dseqrecord

        +
        +
        +classmethod from_string(record: str = '', *args, item='accession', start=None, stop=None, strand=1, **kwargs)[source]
        +

        docstring.

        +
        + +
        +
        +classmethod from_SeqRecord(record, *args, item='accession', start=None, stop=None, strand=1, **kwargs)[source]
        +
        + +
        +
        +reverse_complement()[source]
        +

        Reverse complement.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggaatt")
        +>>> a
        +Dseqrecord(-6)
        +>>> a.seq
        +Dseq(-6)
        +ggaatt
        +ccttaa
        +>>> a.reverse_complement().seq
        +Dseq(-6)
        +aattcc
        +ttaagg
        +>>>
        +
        +
        + +
        + +
        +
        +rc()
        +

        Reverse complement.

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> a=Dseqrecord("ggaatt")
        +>>> a
        +Dseqrecord(-6)
        +>>> a.seq
        +Dseq(-6)
        +ggaatt
        +ccttaa
        +>>> a.reverse_complement().seq
        +Dseq(-6)
        +aattcc
        +ttaagg
        +>>>
        +
        +
        + +
        + +
        +
        +pydna_code()[source]
        +

        docstring.

        +
        + +
        +
        +biopython_code()[source]
        +

        docstring.

        +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_goldengate.html b/modules/pydna_goldengate.html new file mode 100644 index 00000000..9f98096e --- /dev/null +++ b/modules/pydna_goldengate.html @@ -0,0 +1,159 @@ + + + + + + + + + pydna.goldengate — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/pydna_ladders.html b/modules/pydna_ladders.html new file mode 100644 index 00000000..8623a0a1 --- /dev/null +++ b/modules/pydna_ladders.html @@ -0,0 +1,165 @@ + + + + + + + + + pydna.ladders — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.ladders

        +

        Agarose gel DNA ladders.

        +

        A DNA ladder is a list of FakeSeq objects that has to be initiated with +Size (bp), amount of substance (mol) and Relative mobility (Rf).

        +

        Rf is a float value between 0.000 and 1.000. These are used together with +the cubic spline interpolator in the gel module to calculate migartion +distance from fragment length. The Rf values are calculated manually from +a gel image. Exampel can be found in scripts/molecular_weight_standards.ods.

        +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_ligate.html b/modules/pydna_ligate.html new file mode 100644 index 00000000..7f2dc795 --- /dev/null +++ b/modules/pydna_ligate.html @@ -0,0 +1,168 @@ + + + + + + + + + pydna.ligate — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/pydna_myenzymes.html b/modules/pydna_myenzymes.html new file mode 100644 index 00000000..8fc9095a --- /dev/null +++ b/modules/pydna_myenzymes.html @@ -0,0 +1,164 @@ + + + + + + + + + pydna.myenzymes — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.myenzymes

        +

        This module establish a RestrictionBatch based on enzymes found in a text file specified in the enzymes entry +in the python.ini file or by the environment variable pydna_enzymes.

        +

        The text file will be searched for all enzymes in the biopython +AllEnzymes batch which is located in the Bio.Restriction package.

        +

        The pydna.myenzymes.myenzymes contains a new restriction batch with the enzymes contained +within the file specified.

        +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_myprimers.html b/modules/pydna_myprimers.html new file mode 100644 index 00000000..937fec36 --- /dev/null +++ b/modules/pydna_myprimers.html @@ -0,0 +1,259 @@ + + + + + + + + + pydna.myprimers — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.myprimers

        +

        Provides a practical way to access a list of primer sequences in a text file.

        +

        The path of a text file can be specified in the pydna.ini file or by the +´pydna_primers´ environment variable.

        +

        The file is expected to contain sequences in FASTA, Genbank or EMBL formats or +any format readable by the parse_primers function.

        +

        The primer list is expected to follow the convension below. The primer name is +expected to begin with the number.

        +

        can have the format below for example:

        +
        >2_third_primer
        +tgagtagtcgtagtcgtcgtat
        +
        +>1_second_primer
        +tgatcgtcatgctgactatactat
        +
        +>0_first_primer
        +ctaggatcgtagatctagctg
        +...
        +
        +
        +

        The primerlist funtion returns a list of pydna.primer.Primer objects +primerdict returns a dict where the key is the id of the object.

        +
        +
        +class pydna.myprimers.PrimerList(initlist: ~typing.Iterable = None, path: (<class 'str'>, <class 'pathlib.Path'>) = None, *args, identifier: str = "p", **kwargs)[source]
        +

        Bases: UserList

        +

        Read a text file with primers.

        +

        The primers can be of any format readable by the parse_primers +function. Lines beginning with # are ignored. Path defaults to +the path given by the pydna_primers environment variable.

        +

        The primer list does not accept new primers. Use the +assign_numbers_to_new_primers method and paste the new +primers at the top of the list.

        +

        The primer list remembers the numbers of accessed primers. +The indices of accessed primers are stored in the .accessed +property.

        +
        +
        +property accessed
        +

        docstring.

        +
        + +
        +
        +assign_numbers(lst: list)[source]
        +

        Find new primers in lst.

        +

        Returns a string containing new primers with their assigned +numbers. This string can be copied and pasted to the primer +text file.

        +
        + +
        +
        +pydna_code_from_list(lst: list)[source]
        +

        Pydna code for a list of primer objects.

        +
        + +
        +
        +open_folder()[source]
        +

        Open folder where primer file is located.

        +
        + +
        +
        +code(lst: list)
        +

        Pydna code for a list of primer objects.

        +
        + +
        + +
        +
        +pydna.myprimers.check_primer_numbers(pl: list | None = None)[source]
        +

        Find primers whose number do not match position in list.

        +
        + +
        +
        +pydna.myprimers.undefined_sequence(pl: list | None = None)[source]
        +

        Primers in list with N or n instead of a sequence.

        +
        + +
        +
        +pydna.myprimers.find_duplicate_primers(pl: list | None = None)[source]
        +

        Find a list of lists with duplicated primer sequences.

        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_parsers.html b/modules/pydna_parsers.html new file mode 100644 index 00000000..fb94f073 --- /dev/null +++ b/modules/pydna_parsers.html @@ -0,0 +1,234 @@ + + + + + + + + + pydna.parsers — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.parsers

        +

        Provides two functions, parse and parse_primers

        +
        +
        +pydna.parsers.extract_from_text(text)[source]
        +

        docstring.

        +
        + +
        +
        +pydna.parsers.embl_gb_fasta(text)[source]
        +

        Parse embl, genbank or fasta format from text.

        +

        Returns list of Bio.SeqRecord.SeqRecord

        +

        annotations[“molecule_type”] +annotations[“topology”]

        +
        + +
        +
        +pydna.parsers.parse(data, ds=True)[source]
        +

        Return all DNA sequences found in data.

        +

        If no sequences are found, an empty list is returned. This is a greedy +function, use carefully.

        +
        +
        Parameters:
        +
          +
        • data (string or iterable) –

          The data parameter is a string containing:

          +
            +
          1. an absolute path to a local file. +The file will be read in text +mode and parsed for EMBL, FASTA +and Genbank sequences. Can be +a string or a Path object.

          2. +
          3. a string containing one or more +sequences in EMBL, GENBANK, +or FASTA format. Mixed formats +are allowed.

          4. +
          5. data can be a list or other iterable where the elements are 1 or 2

          6. +
          +

        • +
        • ds (bool) – If True double stranded Dseqrecord objects are returned. +If False single stranded Bio.SeqRecord [1] objects are +returned.

        • +
        +
        +
        Returns:
        +

        contains Dseqrecord or SeqRecord objects

        +
        +
        Return type:
        +

        list

        +
        +
        +

        References

        + +
        +

        See also

        +

        read

        +
        +
        + +
        +
        +pydna.parsers.parse_primers(data)[source]
        +

        docstring.

        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_primer.html b/modules/pydna_primer.html new file mode 100644 index 00000000..d6babcb9 --- /dev/null +++ b/modules/pydna_primer.html @@ -0,0 +1,190 @@ + + + + + + + + + pydna.primer — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.primer

        +

        This module provide the Primer class that is a subclass of the biopython SeqRecord.

        +
        +
        +class pydna.primer.Primer(record, *args, amplicon=None, position=None, footprint=0, **kwargs)[source]
        +

        Bases: SeqRecord

        +

        Primer and its position on a template, footprint and tail.

        +
        +
        +property footprint
        +
        + +
        +
        +property tail
        +
        + +
        +
        +reverse_complement(*args, **kwargs)[source]
        +

        Return the reverse complement of the sequence.

        +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_readers.html b/modules/pydna_readers.html new file mode 100644 index 00000000..87f075e1 --- /dev/null +++ b/modules/pydna_readers.html @@ -0,0 +1,198 @@ + + + + + + + + + pydna.readers — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.readers

        +

        Provides two functions, read and read_primer.

        +
        +
        +pydna.readers.read(data, ds=True)[source]
        +

        This function is similar the parse() function but expects one and only +one sequence or and exception is thrown.

        +
        +
        Parameters:
        +
          +
        • data (string) – see below

        • +
        • ds (bool) – Double stranded or single stranded DNA, if True return +Dseqrecord objects, else Bio.SeqRecord objects.

        • +
        +
        +
        Returns:
        +

        contains the first Dseqrecord or SeqRecord object parsed.

        +
        +
        Return type:
        +

        Dseqrecord

        +
        +
        +

        Notes

        +

        The data parameter is similar to the data parameter for parse().

        +
        +

        See also

        +

        parse

        +
        +
        + +
        +
        +pydna.readers.read_primer(data)[source]
        +

        Use this function to read a primer sequence from a string or a local file. +The usage is similar to the parse_primer() function.

        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_seq.html b/modules/pydna_seq.html new file mode 100644 index 00000000..838f7e09 --- /dev/null +++ b/modules/pydna_seq.html @@ -0,0 +1,790 @@ + + + + + + + + + pydna.seq — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.seq

        +

        A subclass of the Biopython SeqRecord class.

        +

        Has a number of extra methods and uses +the pydna._pretty_str.pretty_str class instread of str for a +nicer output in the IPython shell.

        +
        +
        +class pydna.seq.Seq(data: str | bytes | bytearray | _SeqAbstractBaseClass | SequenceDataAbstractBaseClass | dict | None, length: int | None = None)[source]
        +

        Bases: Seq

        +

        docstring.

        +
        +
        +translate(*args, stop_symbol: str = '*', to_stop: bool = False, cds: bool = False, gap: str = '-', **kwargs) ProteinSeq[source]
        +

        Translate..

        +
        + +
        +
        +gc() float[source]
        +

        Return GC content.

        +
        + +
        +
        +cai(organism: str = 'sce') float[source]
        +

        docstring.

        +
        + +
        +
        +rarecodons(organism: str = 'sce') List[slice][source]
        +

        docstring.

        +
        + +
        +
        +startcodon(organism: str = 'sce') float | None[source]
        +

        docstring.

        +
        + +
        +
        +stopcodon(organism: str = 'sce') float | None[source]
        +

        docstring.

        +
        + +
        +
        +express(organism: str = 'sce') PrettyTable[source]
        +

        docstring.

        +
        + +
        +
        +orfs2(minsize: int = 30) List[str][source]
        +

        docstring.

        +
        + +
        +
        +orfs(minsize: int = 100) List[Tuple[int, int]][source]
        +
        + +
        +
        +seguid() str[source]
        +

        Url safe SEGUID [1] for the sequence.

        +

        This checksum is the same as seguid but with base64.urlsafe +encoding instead of the normal base64. This means that +the characters + and / are replaced with - and _ so that +the checksum can be part of a URL.

        +

        Examples

        +
        >>> from pydna.seq import Seq
        +>>> a = Seq("aa")
        +>>> a.seguid()
        +'lsseguid=gBw0Jp907Tg_yX3jNgS4qQWttjU'
        +
        +
        +

        References

        + +
        + +
        +
        +reverse_complement()[source]
        +

        Return the reverse complement as a DNA sequence.

        +
        >>> Seq("CGA").reverse_complement()
        +Seq('TCG')
        +
        +
        +

        Any U in the sequence is treated as a T:

        +
        >>> Seq("CGAUT").reverse_complement()
        +Seq('AATCG')
        +
        +
        +

        In contrast, reverse_complement_rna returns an RNA sequence:

        +
        >>> Seq("CGA").reverse_complement_rna()
        +Seq('UCG')
        +
        +
        +

        The sequence is modified in-place and returned if inplace is True:

        +
        >>> my_seq = MutableSeq("CGA")
        +>>> my_seq
        +MutableSeq('CGA')
        +>>> my_seq.reverse_complement()
        +MutableSeq('TCG')
        +>>> my_seq
        +MutableSeq('CGA')
        +
        +
        +
        >>> my_seq.reverse_complement(inplace=True)
        +MutableSeq('TCG')
        +>>> my_seq
        +MutableSeq('TCG')
        +
        +
        +

        As Seq objects are immutable, a TypeError is raised if +reverse_complement is called on a Seq object with +inplace=True.

        +
        + +
        +
        +rc()
        +

        Return the reverse complement as a DNA sequence.

        +
        >>> Seq("CGA").reverse_complement()
        +Seq('TCG')
        +
        +
        +

        Any U in the sequence is treated as a T:

        +
        >>> Seq("CGAUT").reverse_complement()
        +Seq('AATCG')
        +
        +
        +

        In contrast, reverse_complement_rna returns an RNA sequence:

        +
        >>> Seq("CGA").reverse_complement_rna()
        +Seq('UCG')
        +
        +
        +

        The sequence is modified in-place and returned if inplace is True:

        +
        >>> my_seq = MutableSeq("CGA")
        +>>> my_seq
        +MutableSeq('CGA')
        +>>> my_seq.reverse_complement()
        +MutableSeq('TCG')
        +>>> my_seq
        +MutableSeq('CGA')
        +
        +
        +
        >>> my_seq.reverse_complement(inplace=True)
        +MutableSeq('TCG')
        +>>> my_seq
        +MutableSeq('TCG')
        +
        +
        +

        As Seq objects are immutable, a TypeError is raised if +reverse_complement is called on a Seq object with +inplace=True.

        +
        + +
        + +
        +
        +class pydna.seq.ProteinSeq(data: str | bytes | bytearray | _SeqAbstractBaseClass | SequenceDataAbstractBaseClass | dict | None, length: int | None = None)[source]
        +

        Bases: Seq

        +

        docstring.

        +
        +
        +translate()[source]
        +

        Turn a nucleotide sequence into a protein sequence by creating a new sequence object.

        +

        This method will translate DNA or RNA sequences. It should not +be used on protein sequences as any result will be biologically +meaningless.

        +
        +
        Parameters:
        +
          +
        • name (- table - Which codon table to use? This can be either a) – (string), an NCBI identifier (integer), or a CodonTable +object (useful for non-standard genetic codes). This +defaults to the “Standard” table.

        • +
        • string (- stop_symbol - Single character) – terminators. This defaults to the asterisk, “*”.

        • +
        • for (what to use) – terminators. This defaults to the asterisk, “*”.

        • +
        • Boolean (- cds -) – translation continuing on past any stop codons (translated as the +specified stop_symbol). If True, translation is terminated at +the first in frame stop codon (and the stop_symbol is not +appended to the returned protein sequence).

        • +
        • full (defaults to False meaning do a) – translation continuing on past any stop codons (translated as the +specified stop_symbol). If True, translation is terminated at +the first in frame stop codon (and the stop_symbol is not +appended to the returned protein sequence).

        • +
        • Boolean – this checks the sequence starts with a valid alternative start +codon (which will be translated as methionine, M), that the +sequence length is a multiple of three, and that there is a +single in frame stop codon at the end (this will be excluded +from the protein sequence, regardless of the to_stop option). +If these tests fail, an exception is raised.

        • +
        • True (indicates this is a complete CDS. If) – this checks the sequence starts with a valid alternative start +codon (which will be translated as methionine, M), that the +sequence length is a multiple of three, and that there is a +single in frame stop codon at the end (this will be excluded +from the protein sequence, regardless of the to_stop option). +If these tests fail, an exception is raised.

        • +
        +
        +
        +
        +
        :paramthis checks the sequence starts with a valid alternative start

        codon (which will be translated as methionine, M), that the +sequence length is a multiple of three, and that there is a +single in frame stop codon at the end (this will be excluded +from the protein sequence, regardless of the to_stop option). +If these tests fail, an exception is raised.

        +
        +
        +
        +
        Parameters:
        +

        gaps. (- gap - Single character string to denote symbol used for) – Defaults to the minus sign.

        +
        +
        +

        A Seq object is returned if translate is called on a Seq +object; a MutableSeq object is returned if translate is called +pn a MutableSeq object.

        +

        e.g. Using the standard table:

        +
        >>> coding_dna = Seq("GTGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
        +>>> coding_dna.translate()
        +Seq('VAIVMGR*KGAR*')
        +>>> coding_dna.translate(stop_symbol="@")
        +Seq('VAIVMGR@KGAR@')
        +>>> coding_dna.translate(to_stop=True)
        +Seq('VAIVMGR')
        +
        +
        +

        Now using NCBI table 2, where TGA is not a stop codon:

        +
        >>> coding_dna.translate(table=2)
        +Seq('VAIVMGRWKGAR*')
        +>>> coding_dna.translate(table=2, to_stop=True)
        +Seq('VAIVMGRWKGAR')
        +
        +
        +

        In fact, GTG is an alternative start codon under NCBI table 2, meaning +this sequence could be a complete CDS:

        +
        >>> coding_dna.translate(table=2, cds=True)
        +Seq('MAIVMGRWKGAR')
        +
        +
        +

        It isn’t a valid CDS under NCBI table 1, due to both the start codon +and also the in frame stop codons:

        +
        >>> coding_dna.translate(table=1, cds=True)
        +Traceback (most recent call last):
        +    ...
        +Bio.Data.CodonTable.TranslationError: First codon 'GTG' is not a start codon
        +
        +
        +

        If the sequence has no in-frame stop codon, then the to_stop argument +has no effect:

        +
        >>> coding_dna2 = Seq("TTGGCCATTGTAATGGGCCGC")
        +>>> coding_dna2.translate()
        +Seq('LAIVMGR')
        +>>> coding_dna2.translate(to_stop=True)
        +Seq('LAIVMGR')
        +
        +
        +

        NOTE - Ambiguous codons like “TAN” or “NNN” could be an amino acid +or a stop codon. These are translated as “X”. Any invalid codon +(e.g. “TA?” or “T-A”) will throw a TranslationError.

        +

        NOTE - This does NOT behave like the python string’s translate +method. For that use str(my_seq).translate(…) instead

        +
        + +
        +
        +complement()[source]
        +

        Return the complement as a DNA sequence.

        +
        >>> Seq("CGA").complement()
        +Seq('GCT')
        +
        +
        +

        Any U in the sequence is treated as a T:

        +
        >>> Seq("CGAUT").complement()
        +Seq('GCTAA')
        +
        +
        +

        In contrast, complement_rna returns an RNA sequence:

        +
        >>> Seq("CGAUT").complement_rna()
        +Seq('GCUAA')
        +
        +
        +

        The sequence is modified in-place and returned if inplace is True:

        +
        >>> my_seq = MutableSeq("CGA")
        +>>> my_seq
        +MutableSeq('CGA')
        +>>> my_seq.complement()
        +MutableSeq('GCT')
        +>>> my_seq
        +MutableSeq('CGA')
        +
        +
        +
        >>> my_seq.complement(inplace=True)
        +MutableSeq('GCT')
        +>>> my_seq
        +MutableSeq('GCT')
        +
        +
        +

        As Seq objects are immutable, a TypeError is raised if +complement_rna is called on a Seq object with inplace=True.

        +
        + +
        +
        +complement_rna()[source]
        +

        Return the complement as an RNA sequence.

        +
        >>> Seq("CGA").complement_rna()
        +Seq('GCU')
        +
        +
        +

        Any T in the sequence is treated as a U:

        +
        >>> Seq("CGAUT").complement_rna()
        +Seq('GCUAA')
        +
        +
        +

        In contrast, complement returns a DNA sequence by default:

        +
        >>> Seq("CGA").complement()
        +Seq('GCT')
        +
        +
        +

        The sequence is modified in-place and returned if inplace is True:

        +
        >>> my_seq = MutableSeq("CGA")
        +>>> my_seq
        +MutableSeq('CGA')
        +>>> my_seq.complement_rna()
        +MutableSeq('GCU')
        +>>> my_seq
        +MutableSeq('CGA')
        +
        +
        +
        >>> my_seq.complement_rna(inplace=True)
        +MutableSeq('GCU')
        +>>> my_seq
        +MutableSeq('GCU')
        +
        +
        +

        As Seq objects are immutable, a TypeError is raised if +complement_rna is called on a Seq object with inplace=True.

        +
        + +
        +
        +reverse_complement()[source]
        +

        Return the reverse complement as a DNA sequence.

        +
        >>> Seq("CGA").reverse_complement()
        +Seq('TCG')
        +
        +
        +

        Any U in the sequence is treated as a T:

        +
        >>> Seq("CGAUT").reverse_complement()
        +Seq('AATCG')
        +
        +
        +

        In contrast, reverse_complement_rna returns an RNA sequence:

        +
        >>> Seq("CGA").reverse_complement_rna()
        +Seq('UCG')
        +
        +
        +

        The sequence is modified in-place and returned if inplace is True:

        +
        >>> my_seq = MutableSeq("CGA")
        +>>> my_seq
        +MutableSeq('CGA')
        +>>> my_seq.reverse_complement()
        +MutableSeq('TCG')
        +>>> my_seq
        +MutableSeq('CGA')
        +
        +
        +
        >>> my_seq.reverse_complement(inplace=True)
        +MutableSeq('TCG')
        +>>> my_seq
        +MutableSeq('TCG')
        +
        +
        +

        As Seq objects are immutable, a TypeError is raised if +reverse_complement is called on a Seq object with +inplace=True.

        +
        + +
        +
        +rc()
        +

        Return the reverse complement as a DNA sequence.

        +
        >>> Seq("CGA").reverse_complement()
        +Seq('TCG')
        +
        +
        +

        Any U in the sequence is treated as a T:

        +
        >>> Seq("CGAUT").reverse_complement()
        +Seq('AATCG')
        +
        +
        +

        In contrast, reverse_complement_rna returns an RNA sequence:

        +
        >>> Seq("CGA").reverse_complement_rna()
        +Seq('UCG')
        +
        +
        +

        The sequence is modified in-place and returned if inplace is True:

        +
        >>> my_seq = MutableSeq("CGA")
        +>>> my_seq
        +MutableSeq('CGA')
        +>>> my_seq.reverse_complement()
        +MutableSeq('TCG')
        +>>> my_seq
        +MutableSeq('CGA')
        +
        +
        +
        >>> my_seq.reverse_complement(inplace=True)
        +MutableSeq('TCG')
        +>>> my_seq
        +MutableSeq('TCG')
        +
        +
        +

        As Seq objects are immutable, a TypeError is raised if +reverse_complement is called on a Seq object with +inplace=True.

        +
        + +
        +
        +reverse_complement_rna()[source]
        +

        Return the reverse complement as an RNA sequence.

        +
        >>> Seq("CGA").reverse_complement_rna()
        +Seq('UCG')
        +
        +
        +

        Any T in the sequence is treated as a U:

        +
        >>> Seq("CGAUT").reverse_complement_rna()
        +Seq('AAUCG')
        +
        +
        +

        In contrast, reverse_complement returns a DNA sequence:

        +
        >>> Seq("CGA").reverse_complement()
        +Seq('TCG')
        +
        +
        +

        The sequence is modified in-place and returned if inplace is True:

        +
        >>> my_seq = MutableSeq("CGA")
        +>>> my_seq
        +MutableSeq('CGA')
        +>>> my_seq.reverse_complement_rna()
        +MutableSeq('UCG')
        +>>> my_seq
        +MutableSeq('CGA')
        +
        +
        +
        >>> my_seq.reverse_complement_rna(inplace=True)
        +MutableSeq('UCG')
        +>>> my_seq
        +MutableSeq('UCG')
        +
        +
        +

        As Seq objects are immutable, a TypeError is raised if +reverse_complement_rna is called on a Seq object with +inplace=True.

        +
        + +
        +
        +transcribe()[source]
        +

        Transcribe a DNA sequence into RNA and return the RNA sequence as a new Seq object.

        +

        Following the usual convention, the sequence is interpreted as the +coding strand of the DNA double helix, not the template strand. This +means we can get the RNA sequence just by switching T to U.

        +
        >>> from Bio.Seq import Seq
        +>>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
        +>>> coding_dna
        +Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +>>> coding_dna.transcribe()
        +Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +
        +
        +

        The sequence is modified in-place and returned if inplace is True:

        +
        >>> sequence = MutableSeq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
        +>>> sequence
        +MutableSeq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +>>> sequence.transcribe()
        +MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +>>> sequence
        +MutableSeq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +
        +
        +
        >>> sequence.transcribe(inplace=True)
        +MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +>>> sequence
        +MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +
        +
        +

        As Seq objects are immutable, a TypeError is raised if +transcribe is called on a Seq object with inplace=True.

        +

        Trying to transcribe an RNA sequence has no effect. +If you have a nucleotide sequence which might be DNA or RNA +(or even a mixture), calling the transcribe method will ensure +any T becomes U.

        +

        Trying to transcribe a protein sequence will replace any +T for Threonine with U for Selenocysteine, which has no +biologically plausible rational.

        +
        >>> from Bio.Seq import Seq
        +>>> my_protein = Seq("MAIVMGRT")
        +>>> my_protein.transcribe()
        +Seq('MAIVMGRU')
        +
        +
        +
        + +
        +
        +back_transcribe()[source]
        +

        Return the DNA sequence from an RNA sequence by creating a new Seq object.

        +
        >>> from Bio.Seq import Seq
        +>>> messenger_rna = Seq("AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG")
        +>>> messenger_rna
        +Seq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +>>> messenger_rna.back_transcribe()
        +Seq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +
        +
        +

        The sequence is modified in-place and returned if inplace is True:

        +
        >>> sequence = MutableSeq("AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG")
        +>>> sequence
        +MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +>>> sequence.back_transcribe()
        +MutableSeq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +>>> sequence
        +MutableSeq('AUGGCCAUUGUAAUGGGCCGCUGAAAGGGUGCCCGAUAG')
        +
        +
        +
        >>> sequence.back_transcribe(inplace=True)
        +MutableSeq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +>>> sequence
        +MutableSeq('ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG')
        +
        +
        +

        As Seq objects are immutable, a TypeError is raised if +transcribe is called on a Seq object with inplace=True.

        +

        Trying to back-transcribe DNA has no effect, If you have a nucleotide +sequence which might be DNA or RNA (or even a mixture), calling the +back-transcribe method will ensure any U becomes T.

        +

        Trying to back-transcribe a protein sequence will replace any U for +Selenocysteine with T for Threonine, which is biologically meaningless.

        +
        >>> from Bio.Seq import Seq
        +>>> my_protein = Seq("MAIVMGRU")
        +>>> my_protein.back_transcribe()
        +Seq('MAIVMGRT')
        +
        +
        +
        + +
        +
        +seguid() str[source]
        +

        Url safe SEGUID [2] for the sequence.

        +

        This checksum is the same as seguid but with base64.urlsafe +encoding instead of the normal base64. This means that +the characters + and / are replaced with - and _ so that +the checksum can be part of a URL.

        +

        Examples

        +
        >>> from pydna.seq import ProteinSeq
        +>>> a = ProteinSeq("aa")
        +>>> a.seguid()
        +'lsseguid=gBw0Jp907Tg_yX3jNgS4qQWttjU'
        +
        +
        +

        References

        + +
        + +
        +
        +molecular_weight() float[source]
        +
        + +
        +
        +pI() float[source]
        +
        + +
        +
        +instability_index() float[source]
        +

        Instability index according to Guruprasad et al.

        +

        Value above 40 means the protein is has a short half life.

        +

        Guruprasad K., Reddy B.V.B., Pandit M.W. Protein Engineering 4:155-161(1990).

        +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_seqrecord.html b/modules/pydna_seqrecord.html new file mode 100644 index 00000000..3642a44b --- /dev/null +++ b/modules/pydna_seqrecord.html @@ -0,0 +1,631 @@ + + + + + + + + + pydna.seqrecord — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.seqrecord

        +

        A subclass of the Biopython SeqRecord class.

        +

        Has a number of extra methods and uses +the pydna._pretty_str.pretty_str class instread of str for a +nicer output in the IPython shell.

        +
        +
        +class pydna.seqrecord.SeqRecord(seq, *args, id='id', name='name', description='description', **kwargs)[source]
        +

        Bases: SeqRecord

        +

        A subclass of the Biopython SeqRecord class.

        +

        Has a number of extra methods and uses +the pydna._pretty_str.pretty_str class instread of str for a +nicer output in the IPython shell.

        +
        +
        +classmethod from_Bio_SeqRecord(sr: SeqRecord)[source]
        +

        Creates a pydnaSeqRecord from a Biopython SeqRecord.

        +
        + +
        +
        +property locus
        +

        Alias for name property.

        +
        + +
        +
        +property accession
        +

        Alias for id property.

        +
        + +
        +
        +property definition
        +

        Alias for description property.

        +
        + +
        +
        +reverse_complement(*args, **kwargs)[source]
        +

        Return the reverse complement of the sequence.

        +
        + +
        +
        +rc(*args, **kwargs)
        +

        Return the reverse complement of the sequence.

        +
        + +
        +
        +isorf(table=1)[source]
        +

        Detect if sequence is an open reading frame (orf) in the 5’-3’.

        +

        direction.

        +

        Translation tables are numbers according to the NCBI numbering [1].

        +
        +
        Parameters:
        +

        table (int) – Sets the translation table, default is 1 (standard code)

        +
        +
        Returns:
        +

        True if sequence is an orf, False otherwise.

        +
        +
        Return type:
        +

        bool

        +
        +
        +

        Examples

        +
        >>> from pydna.seqrecord import SeqRecord
        +>>> a=SeqRecord("atgtaa")
        +>>> a.isorf()
        +True
        +>>> b=SeqRecord("atgaaa")
        +>>> b.isorf()
        +False
        +>>> c=SeqRecord("atttaa")
        +>>> c.isorf()
        +False
        +
        +
        +

        References

        + +
        + +
        +
        +translate()[source]
        +

        docstring.

        +
        + +
        +
        +add_colors_to_features_for_ape()[source]
        +

        Assign colors to features.

        +

        compatible with +the ApE editor.

        +
        + +
        +
        +add_feature(x=None, y=None, seq=None, type_='misc', strand=1, *args, **kwargs)[source]
        +

        Add a feature of type misc to the feature list of the sequence.

        +
        +
        Parameters:
        +
          +
        • x (int) – Indicates start of the feature

        • +
        • y (int) – Indicates end of the feature

        • +
        +
        +
        +

        Examples

        +
        >>> from pydna.seqrecord import SeqRecord
        +>>> a=SeqRecord("atgtaa")
        +>>> a.features
        +[]
        +>>> a.add_feature(2,4)
        +>>> a.features
        +[SeqFeature(SimpleLocation(ExactPosition(2),
        +                           ExactPosition(4),
        +                           strand=1),
        +            type='misc',
        +            qualifiers=...)]
        +
        +
        +
        + +
        +
        +list_features()[source]
        +

        Print ASCII table with all features.

        +

        Examples

        +
        >>> from pydna.seq import Seq
        +>>> from pydna.seqrecord import SeqRecord
        +>>> a=SeqRecord(Seq("atgtaa"))
        +>>> a.add_feature(2,4)
        +>>> print(a.list_features())
        ++-----+---------------+-----+-----+-----+-----+------+------+
        +| Ft# | Label or Note | Dir | Sta | End | Len | type | orf? |
        ++-----+---------------+-----+-----+-----+-----+------+------+
        +|   0 | L:ft2         | --> | 2   | 4   |   2 | misc |  no  |
        ++-----+---------------+-----+-----+-----+-----+------+------+
        +
        +
        +
        + +
        +
        +extract_feature(n)[source]
        +

        Extract feature and return a new SeqRecord object.

        +
        +
        Parameters:
        +
          +
        • n (int) –

        • +
        • extract (Indicates the feature to) –

        • +
        +
        +
        +

        Examples

        +
        >>> from pydna.seqrecord import SeqRecord
        +>>> a=SeqRecord("atgtaa")
        +>>> a.add_feature(2,4)
        +>>> b=a.extract_feature(0)
        +>>> b
        +SeqRecord(seq=Seq('gt'), id='ft2', name='part_name',
        +          description='description', dbxrefs=[])
        +
        +
        +
        + +
        +
        +sorted_features()[source]
        +

        Return a list of the features sorted by start position.

        +

        Examples

        +
        >>> from pydna.seqrecord import SeqRecord
        +>>> a=SeqRecord("atgtaa")
        +>>> a.add_feature(3,4)
        +>>> a.add_feature(2,4)
        +>>> print(a.features)
        +[SeqFeature(SimpleLocation(ExactPosition(3), ExactPosition(4),
        +                           strand=1),
        +            type='misc', qualifiers=...),
        + SeqFeature(SimpleLocation(ExactPosition(2), ExactPosition(4),
        +                           strand=1),
        +            type='misc', qualifiers=...)]
        +>>> print(a.sorted_features())
        +[SeqFeature(SimpleLocation(ExactPosition(2), ExactPosition(4),
        +                           strand=1),
        +            type='misc', qualifiers=...),
        + SeqFeature(SimpleLocation(ExactPosition(3), ExactPosition(4),
        +                           strand=1),
        +            type='misc', qualifiers=...)]
        +
        +
        +
        + +
        +
        +seguid()[source]
        +

        Return the url safe SEGUID [2] for the sequence.

        +

        This checksum is the same as seguid but with base64.urlsafe +encoding instead of the normal base 64. This means that +the characters + and / are replaced with - and _ so that +the checksum can be a part of and URL or a filename.

        +

        Examples

        +
        >>> from pydna.seqrecord import SeqRecord
        +>>> a=SeqRecord("gattaca")
        +>>> a.seguid() # original seguid is +bKGnebMkia5kNg/gF7IORXMnIU
        +'lsseguid=tp2jzeCM2e3W4yxtrrx09CMKa_8'
        +
        +
        +

        References

        + +
        + +
        +
        +comment(newcomment='')[source]
        +

        docstring.

        +
        + +
        +
        +datefunction()[source]
        +

        docstring.

        +
        + +
        +
        +stamp(now=datefunction, tool='pydna', separator=' ', comment='')[source]
        +

        Add seguid checksum to COMMENTS sections

        +

        The checksum is stored in object.annotations[“comment”]. +This shows in the COMMENTS section of a formatted genbank file.

        +

        For blunt linear sequences:

        +

        SEGUID <seguid>

        +

        For circular sequences:

        +

        cSEGUID <seguid>

        +

        Fore linear sequences which are not blunt:

        +

        lSEGUID <seguid>

        +

        Examples

        +
        >>> from pydna.seqrecord import SeqRecord
        +>>> a = SeqRecord("aa")
        +>>> a.stamp()
        +'lsseguid=gBw0Jp907Tg_yX3jNgS4qQWttjU'
        +>>> a.annotations["comment"][:41]
        +'pydna lsseguid=gBw0Jp907Tg_yX3jNgS4qQWttj'
        +
        +
        +
        + +
        +
        +lcs(other, *args, limit=25, **kwargs)[source]
        +

        Return the longest common substring between the sequence.

        +

        and another sequence (other). The other sequence can be a string, +Seq, SeqRecord, Dseq or DseqRecord. +The method returns a SeqFeature with type “read” as this method +is mostly used to map sequence reads to the sequence. This can be +changed by passing a type as keyword with some other string value.

        +

        Examples

        +
        >>> from pydna.seqrecord import SeqRecord
        +>>> a = SeqRecord("GGATCC")
        +>>> a.lcs("GGATCC", limit=6)
        +SeqFeature(SimpleLocation(ExactPosition(0),
        +                          ExactPosition(6), strand=1),
        +                          type='read',
        +                          qualifiers=...)
        +>>> a.lcs("GATC", limit=4)
        +SeqFeature(SimpleLocation(ExactPosition(1),
        +                          ExactPosition(5), strand=1),
        +                          type='read',
        +                          qualifiers=...)
        +>>> a = SeqRecord("CCCCC")
        +>>> a.lcs("GGATCC", limit=6)
        +SeqFeature(None)
        +
        +
        +
        + +
        +
        +gc()[source]
        +

        Return GC content.

        +
        + +
        +
        +cai(organism='sce')[source]
        +

        docstring.

        +
        + +
        +
        +rarecodons(organism='sce')[source]
        +

        docstring.

        +
        + +
        +
        +startcodon(organism='sce')[source]
        +

        docstring.

        +
        + +
        +
        +stopcodon(organism='sce')[source]
        +

        docstring.

        +
        + +
        +
        +express(organism='sce')[source]
        +

        docstring.

        +
        + +
        +
        +copy()[source]
        +

        docstring.

        +
        + +
        +
        +dump(filename, protocol=None)[source]
        +

        docstring.

        +
        + +
        + +
        +
        +class pydna.seqrecord.ProteinSeqRecord(seq, *args, id='id', name='name', description='description', **kwargs)[source]
        +

        Bases: SeqRecord

        +
        +
        +reverse_complement(*args, **kwargs)[source]
        +

        Return the reverse complement of the sequence.

        +
        + +
        +
        +rc(*args, **kwargs)
        +

        Return the reverse complement of the sequence.

        +
        + +
        +
        +isorf(*args, **kwargs)[source]
        +

        Detect if sequence is an open reading frame (orf) in the 5’-3’.

        +

        direction.

        +

        Translation tables are numbers according to the NCBI numbering [3].

        +
        +
        Parameters:
        +

        table (int) – Sets the translation table, default is 1 (standard code)

        +
        +
        Returns:
        +

        True if sequence is an orf, False otherwise.

        +
        +
        Return type:
        +

        bool

        +
        +
        +

        Examples

        +
        >>> from pydna.seqrecord import SeqRecord
        +>>> a=SeqRecord("atgtaa")
        +>>> a.isorf()
        +True
        +>>> b=SeqRecord("atgaaa")
        +>>> b.isorf()
        +False
        +>>> c=SeqRecord("atttaa")
        +>>> c.isorf()
        +False
        +
        +
        +

        References

        + +
        + +
        +
        +gc()[source]
        +

        Return GC content.

        +
        + +
        +
        +cai(*args, **kwargs)[source]
        +

        docstring.

        +
        + +
        +
        +rarecodons(*args, **kwargs)[source]
        +

        docstring.

        +
        + +
        +
        +startcodon(*args, **kwargs)[source]
        +

        docstring.

        +
        + +
        +
        +stopcodon(*args, **kwargs)[source]
        +

        docstring.

        +
        + +
        +
        +express(*args, **kwargs)[source]
        +

        docstring.

        +
        + +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_sequence_picker.html b/modules/pydna_sequence_picker.html new file mode 100644 index 00000000..81fc4455 --- /dev/null +++ b/modules/pydna_sequence_picker.html @@ -0,0 +1,167 @@ + + + + + + + + + pydna.sequence_picker — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/pydna_threading_timer_decorator_exit.html b/modules/pydna_threading_timer_decorator_exit.html new file mode 100644 index 00000000..04888191 --- /dev/null +++ b/modules/pydna_threading_timer_decorator_exit.html @@ -0,0 +1,227 @@ + + + + + + + + + pydna.threading_timer_decorator_exit — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.threading_timer_decorator_exit

        +

        MIT License

        +

        Copyright (c) 2015 Aaron Hall

        +

        Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions:

        +

        The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software.

        +

        THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.

        +
        +
        +pydna.threading_timer_decorator_exit.cdquit(fn_name)[source]
        +
        + +
        +
        +pydna.threading_timer_decorator_exit.exit_after(s)[source]
        +

        use as decorator to exit process if +function takes longer than s seconds

        +
        + +
        +
        +pydna.threading_timer_decorator_exit.a(*args, **kwargs)[source]
        +
        + +
        +
        +pydna.threading_timer_decorator_exit.b(*args, **kwargs)[source]
        +
        + +
        +
        +pydna.threading_timer_decorator_exit.c(*args, **kwargs)[source]
        +
        + +
        +
        +pydna.threading_timer_decorator_exit.d(*args, **kwargs)[source]
        +
        + +
        +
        +pydna.threading_timer_decorator_exit.countdown(*args, **kwargs)[source]
        +
        + +
        +
        +pydna.threading_timer_decorator_exit.main()[source]
        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_tm.html b/modules/pydna_tm.html new file mode 100644 index 00000000..4ca2e87e --- /dev/null +++ b/modules/pydna_tm.html @@ -0,0 +1,331 @@ + + + + + + + + + pydna.tm — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.tm

        +

        This module provide functions for melting temperature calculations.

        +
        +
        +pydna.tm.tm_default(seq, check=True, strict=True, c_seq=None, shift=0, nn_table=_mt.DNA_NN4, tmm_table=None, imm_table=None, de_table=None, dnac1=500 / 2, dnac2=500 / 2, selfcomp=False, Na=40, K=0, Tris=75.0, Mg=1.5, dNTPs=0.8, saltcorr=7, func=_mt.Tm_NN)[source]
        +
        + +
        +
        +pydna.tm.tm_dbd(seq, check=True, strict=True, c_seq=None, shift=0, nn_table=_mt.DNA_NN3, tmm_table=None, imm_table=None, de_table=None, dnac1=250, dnac2=250, selfcomp=False, Na=50, K=0, Tris=0, Mg=1.5, dNTPs=0.8, saltcorr=1, func=_mt.Tm_NN)[source]
        +
        + +
        +
        +pydna.tm.tm_product(seq: str, K=0.050)[source]
        +

        Tm calculation for the amplicon.

        +

        according to:

        +

        Rychlik, Spencer, and Rhoads, 1990, Optimization of the anneal +ing temperature for DNA amplification in vitro +http://www.ncbi.nlm.nih.gov/pubmed/2243783

        +
        + +
        +
        +pydna.tm.ta_default(fp: str, rp: str, seq: str, tm=tm_default, tm_product=tm_product)[source]
        +

        Ta calculation.

        +

        according to:

        +

        Rychlik, Spencer, and Rhoads, 1990, Optimization of the anneal +ing temperature for DNA amplification in vitro +http://www.ncbi.nlm.nih.gov/pubmed/2243783

        +

        The formula described uses the length and GC content of the product and +salt concentration (monovalent cations)

        +
        + +
        +
        +pydna.tm.ta_dbd(fp, rp, seq, tm=tm_dbd, tm_product=None)[source]
        +
        + +
        +
        +pydna.tm.program(amplicon, tm=tm_default, ta=ta_default)[source]
        +

        Returns a string containing a text representation of a suggested +PCR program using Taq or similar polymerase.

        +
        |95°C|95°C               |    |tmf:59.5
        +|____|_____          72°C|72°C|tmr:59.7
        +|3min|30s  \ 59.1°C _____|____|60s/kb
        +|    |      \______/ 0:32|5min|GC 51%
        +|    |       30s         |    |1051bp
        +
        +
        +
        + +
        +
        +pydna.tm.taq_program(amplicon, tm=tm_default, ta=ta_default)
        +

        Returns a string containing a text representation of a suggested +PCR program using Taq or similar polymerase.

        +
        |95°C|95°C               |    |tmf:59.5
        +|____|_____          72°C|72°C|tmr:59.7
        +|3min|30s  \ 59.1°C _____|____|60s/kb
        +|    |      \______/ 0:32|5min|GC 51%
        +|    |       30s         |    |1051bp
        +
        +
        +
        + +
        +
        +pydna.tm.dbd_program(amplicon, tm=tm_dbd, ta=ta_dbd)[source]
        +

        Text representation of a suggested PCR program.

        +

        Using a polymerase with a DNA binding domain such as Pfu-Sso7d.

        +
        |98°C|98°C               |    |tmf:53.8
        +|____|_____          72°C|72°C|tmr:54.8
        +|30s |10s  \ 57.0°C _____|____|15s/kb
        +|    |      \______/ 0:15|5min|GC 51%
        +|    |       10s         |    |1051bp
        +
        +|98°C|98°C      |    |tmf:82.5
        +|____|____      |    |tmr:84.4
        +|30s |10s \ 72°C|72°C|15s/kb
        +|    |     \____|____|GC 52%
        +|    |      3:45|5min|15058bp
        +
        +
        +
        + +
        +
        +pydna.tm.pfu_sso7d_program(amplicon, tm=tm_dbd, ta=ta_dbd)
        +

        Text representation of a suggested PCR program.

        +

        Using a polymerase with a DNA binding domain such as Pfu-Sso7d.

        +
        |98°C|98°C               |    |tmf:53.8
        +|____|_____          72°C|72°C|tmr:54.8
        +|30s |10s  \ 57.0°C _____|____|15s/kb
        +|    |      \______/ 0:15|5min|GC 51%
        +|    |       10s         |    |1051bp
        +
        +|98°C|98°C      |    |tmf:82.5
        +|____|____      |    |tmr:84.4
        +|30s |10s \ 72°C|72°C|15s/kb
        +|    |     \____|____|GC 52%
        +|    |      3:45|5min|15058bp
        +
        +
        +
        + +
        +
        +pydna.tm.Q5(primer: str, *args, **kwargs)[source]
        +

        For Q5 Ta they take the lower of the two Tms and add 1C +(up to 72C). For Phusion they take the lower of the two +and add 3C (up to 72C).

        +
        + +
        +
        +pydna.tm.tmbresluc(primer: str, *args, primerc=500.0, saltc=50, **kwargs)[source]
        +

        Returns the tm for a primer using a formula adapted to polymerases +with a DNA binding domain, such as the Phusion polymerase.

        +
        +
        Parameters:
        +
          +
        • primer (string) – primer sequence 5’-3’

        • +
        • primerc (float) – primer concentration in nM), set to 500.0 nm by default.

        • +
        • saltc (float, optional) – Monovalent cation concentration in mM, set to 50.0 mM by default.

        • +
        • thermodynamics (bool, optional) – prints details of the thermodynamic data to stdout. For +debugging only.

        • +
        +
        +
        Returns:
        +

        tm – the tm of the primer

        +
        +
        Return type:
        +

        float

        +
        +
        +
        + +
        +
        +pydna.tm.tm_neb(primer, conc=0.5, prodcode='q5-0')[source]
        +

        Calculates a single primers melting temp from NEB.

        +
        +
        Parameters:
        +
        +
        +
        Returns:
        +

        tm – primer melting temperature

        +
        +
        Return type:
        +

        int

        +
        +
        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_user_cloning.html b/modules/pydna_user_cloning.html new file mode 100644 index 00000000..e9dac567 --- /dev/null +++ b/modules/pydna_user_cloning.html @@ -0,0 +1,169 @@ + + + + + + + + + pydna.user_cloning — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.user_cloning

        +

        Nicking & USER cloning

        +

        CGAuGTCGACTTAGATCTCACAGGCTTTTTTCAAGaCGGCCTTGAATTCAGTCATTTGGATCCGGCCGATC +GCTACAGCTGAATCTAGAGTGTCCGAAAAAAGTTCTGCCGGAACTTAAGTCAGTAAACCTAGGCCGGCuAG

        +
          +
        1. Digest both strands

        2. +
        3. Collect all linear ssDNA

        4. +
        5. Anneal all combinations

        6. +
        7. Keep ones present in original molecule

        8. +
        +

        5. Rank by stability +6.

        +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/modules/pydna_utils.html b/modules/pydna_utils.html new file mode 100644 index 00000000..bb5fcc10 --- /dev/null +++ b/modules/pydna_utils.html @@ -0,0 +1,424 @@ + + + + + + + + + pydna.utils — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + + +
        + + +
        + +
        +
        +
        + +
        +
        +
        +
        + +
        +

        pydna.utils

        +

        Miscellaneous functions.

        +
        +
        +pydna.utils.three_frame_orfs(dna: str, limit: int = 100, startcodons: tuple = ('ATG',), stopcodons: tuple = ('TAG', 'TAA', 'TGA'))[source]
        +

        Overlapping orfs in three frames.

        +
        + +
        +
        +pydna.utils.shift_location(original_location, shift, lim)[source]
        +

        docstring.

        +
        + +
        +
        +pydna.utils.shift_feature(feature, shift, lim)[source]
        +

        Return a new feature with shifted location.

        +
        + +
        +
        +pydna.utils.smallest_rotation(s)[source]
        +

        Smallest rotation of a string.

        +

        Algorithm described in Pierre Duval, Jean. 1983. Factorizing Words +over an Ordered Alphabet. Journal of Algorithms & Computational Technology +4 (4) (December 1): 363–381. and Algorithms on strings and sequences based +on Lyndon words, David Eppstein 2011. +https://gist.github.com/dvberkel/1950267

        +

        Examples

        +
        >>> from pydna.utils import smallest_rotation
        +>>> smallest_rotation("taaa")
        +'aaat'
        +
        +
        +
        + +
        +
        +pydna.utils.cai(seq: str, organism: str = 'sce', weights: dict = _weights)[source]
        +

        docstring.

        +
        + +
        +
        +pydna.utils.rarecodons(seq: str, organism='sce')[source]
        +

        docstring.

        +
        + +
        +
        +pydna.utils.express(seq: str, organism='sce')[source]
        +

        docstring.

        +

        NOT IMPLEMENTED YET

        +
        + +
        +
        +pydna.utils.open_folder(pth)[source]
        +

        docstring.

        +
        + +
        +
        +pydna.utils.rc(sequence: StrOrBytes) StrOrBytes[source]
        +

        Reverse complement.

        +

        accepts mixed DNA/RNA

        +
        + +
        +
        +pydna.utils.complement(sequence: str)[source]
        +

        Complement.

        +

        accepts mixed DNA/RNA

        +
        + +
        +
        +pydna.utils.memorize(filename)[source]
        +

        Cache functions and classes.

        +

        see pydna.download

        +
        + +
        +
        +pydna.utils.identifier_from_string(s: str) str[source]
        +

        Return a valid python identifier.

        +

        based on the argument s or an empty string

        +
        + +
        +
        +pydna.utils.flatten(*args) List[source]
        +

        Flattens an iterable of iterables.

        +

        Down to str, bytes, bytearray or any of the pydna or Biopython seq objects

        +
        + +
        +
        +pydna.utils.seq31(seq)[source]
        +

        Turn a three letter code protein sequence into one with one letter code.

        +

        The single input argument ‘seq’ should be a protein sequence using single +letter codes, as a python string.

        +

        This function returns the amino acid sequence as a string using the one +letter amino acid codes. Output follows the IUPAC standard (including +ambiguous characters B for “Asx”, J for “Xle” and X for “Xaa”, and also U +for “Sel” and O for “Pyl”) plus “Ter” for a terminator given as an +asterisk.

        +

        Any unknown +character (including possible gap characters), is changed into ‘Xaa’.

        +

        Examples

        +
        >>> from Bio.SeqUtils import seq3
        +>>> seq3("MAIVMGRWKGAR*")
        +'MetAlaIleValMetGlyArgTrpLysGlyAlaArgTer'
        +>>> from pydna.utils import seq31
        +>>> seq31('MetAlaIleValMetGlyArgTrpLysGlyAlaArgTer')
        +'M  A  I  V  M  G  R  W  K  G  A  R  *'
        +
        +
        +
        + +
        +
        +pydna.utils.randomRNA(length, maxlength=None)[source]
        +

        docstring.

        +
        + +
        +
        +pydna.utils.randomDNA(length, maxlength=None)[source]
        +

        docstring.

        +
        + +
        +
        +pydna.utils.randomORF(length, maxlength=None)[source]
        +

        docstring.

        +
        + +
        +
        +pydna.utils.randomprot(length, maxlength=None)[source]
        +

        docstring.

        +
        + +
        +
        +pydna.utils.eq(*args, **kwargs)[source]
        +

        Compare two or more DNA sequences for equality.

        +

        Compares two or more DNA sequences for equality i.e. if they +represent the same double stranded DNA molecule.

        +
        +
        Parameters:
        +
          +
        • args (iterable) – iterable containing sequences +args can be strings, Biopython Seq or SeqRecord, Dseqrecord +or dsDNA objects.

        • +
        • circular (bool, optional) – Consider all molecules circular or linear

        • +
        • linear (bool, optional) – Consider all molecules circular or linear

        • +
        +
        +
        Returns:
        +

        eq – Returns True or False

        +
        +
        Return type:
        +

        bool

        +
        +
        +

        Notes

        +

        Compares two or more DNA sequences for equality i.e. if they +represent the same DNA molecule.

        +

        Two linear sequences are considiered equal if either:

        +
          +
        1. They have the same sequence (case insensitive)

        2. +
        3. One sequence is the reverse complement of the other

        4. +
        +

        Two circular sequences are considered equal if they are circular +permutations meaning that they have the same length and:

        +
          +
        1. One sequence can be found in the concatenation of the other sequence with itself.

        2. +
        3. The reverse complement of one sequence can be found in the concatenation of the other sequence with itself.

        4. +
        +

        The topology for the comparison can be set using one of the keywords +linear or circular to True or False.

        +

        If circular or linear is not set, it will be deduced from the topology of +each sequence for sequences that have a linear or circular attribute +(like Dseq and Dseqrecord).

        +

        Examples

        +
        >>> from pydna.dseqrecord import Dseqrecord
        +>>> from pydna.utils import eq
        +>>> eq("aaa","AAA")
        +True
        +>>> eq("aaa","AAA","TTT")
        +True
        +>>> eq("aaa","AAA","TTT","tTt")
        +True
        +>>> eq("aaa","AAA","TTT","tTt", linear=True)
        +True
        +>>> eq("Taaa","aTaa", linear = True)
        +False
        +>>> eq("Taaa","aTaa", circular = True)
        +True
        +>>> a=Dseqrecord("Taaa")
        +>>> b=Dseqrecord("aTaa")
        +>>> eq(a,b)
        +False
        +>>> eq(a,b,circular=True)
        +True
        +>>> a=a.looped()
        +>>> b=b.looped()
        +>>> eq(a,b)
        +True
        +>>> eq(a,b,circular=False)
        +False
        +>>> eq(a,b,linear=True)
        +False
        +>>> eq(a,b,linear=False)
        +True
        +>>> eq("ggatcc","GGATCC")
        +True
        +>>> eq("ggatcca","GGATCCa")
        +True
        +>>> eq("ggatcca","tGGATCC")
        +True
        +
        +
        +
        + +
        +
        +pydna.utils.cuts_overlap(left_cut, right_cut, seq_len)[source]
        +
        + +
        +
        +pydna.utils.location_boundaries(loc: SimpleLocation | CompoundLocation)[source]
        +
        + +
        +
        +pydna.utils.locations_overlap(loc1: SimpleLocation | CompoundLocation, loc2: SimpleLocation | CompoundLocation, seq_len)[source]
        +
        + +
        + + +
        +
        + +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv index 013f9abbcfbcd9408d4c7b8e055967d1c245408d..038047e7773afae7f3579af1beb6b38af488abed 100644 GIT binary patch delta 4217 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 delta 1951 zcmV;Q2VnTYA@~oFIR!8-FfK5WK{|h}o6U~fHW0_}c?uWpb%h3PQM9*B(*!BfBuxtR zNYLU)CPI-~lGc!0t8Z7@ zDtIh5u`yo{-`#w(x_Q&Mtp+1k5D?Vauiyx8}K0y&2F(TvnaU7s)8sTegh5In4=OPipu#1>C>R4 z*5gMP@om1|ShGyMYRhxiYFpe|3)0Yhb#GoAw!0s78Kc+hE&@@)=tjpJ5Zy&}W$X*Z z_bvFiC88c$=joj}Ve?VRYHfc6{467|*tYb^zUpilH3pPZ<{?0{HjJ^~0mbc%JU{$T ziSZkpMB0~~k)F`2r$vm$ULr`~jBT71p<9c9ooMSoZuBvFLhVv_F9=2OjkeMVhmK-o zOOvrt*No~X^Wv91b#}ZCtP2HEY6D787l=bVlVUC@3-r*vT$HjVJRyHF)&m7W*YxaQ zFyBuBQF&RXf=C{>gU6XBu2R`8EmQq3a_+$zCl$S|0q$7F#mgOW)~END#h>33#%FIW z+ZMa3>>>v$W%!9@&y??C&=G_V;$9l9m~13vS`z|~?zsS~*bGiX%W7DqjS<@N5MIS9 zeZO0ZxlQVWO4VTv@l$^Xwge%q>Vx)1j%x`=3-bvN0VkmBClD8>#V}@Io zL%B2sGPt`=m!CNRWlf%0=d8yQt?Ny``vj;vUOWyPT}7V9Mb>`;w$Co3mo`-3WdIhx z@sJrYqoZc#GbYut#2pT>sd0xyhcI^`ZK-C=gU)mM&T3pVvdFgO1(*jJ18y@dh*Crh z!$!AjC%ww9P?CSE*I!2KiazD|`7sWUIHSvWt!q&Co~LN5u3?3g*Wnnqoh-G=?#9ab zMrMy8cMpC>g_EluOAM=s{yTdlIa%EjP0sL+;U*iDZCbK%wZUBxWV-+}A6yV{S1WYQ z8oY2-zXQls;b)r*8os)UO;L3hlCpKE$?O7|nb;mHangU(1)7txF5p`n$!t15on6pk z<);fgKN&n0$w>?sROm_KG5p{)C36O)qx0l6aWF4_-BV}N!vpIA!?mSW2ope{oJ7`O z$aP2C(Vie%Xp3XlI^2LbPh;#_+Ru#Y^!CN;i96ewPwX)Qmj+zaiZIF}JF6qHIcc5Z zHYqV3w78HLhiWDQng>vhCb8+QsI zEgLqj#JrA;Ij?JNbI4X=@4kNV)|G5DC7`WHb~a|hO=qG`3kI8y?)8fd=uJjdqxY!OM2a(TOPY*x-N~=gmjj;lUZUSZmz!;uL?wOxH02+@e-y6gjO$-T0gn>Mg!N z;~1fBna>Ju=`i)4;#J1gj$+qr=eLC@p0_885B=*~9pXioTY?H%mJq^_yD#r2K;e_pfY#<0OMAy*qmI-3+-HRSv9+gByC6;>jVJ6O0cP(ybm! zxgMnA_{Yw^f2H*I++Iwbe+lD1x0p7(AH08ypzXmze|FeTqeUt8<(@yo!(+My5U$dw z%d2o5oUg7@@G||PoV~6c{RS?E&a@fm8m=?U;dYxxD$GvyQ7lg(>BhT%)R2KS&MniCj&QrE4SnO$TaQ@+ zNxC=;H$ - + - Python Module Index — pydna 0.0.0.post1+9d112d7 documentation + Python Module Index — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -42,8 +44,15 @@

        @@ -82,117 +91,202 @@

        Python Module Index

        - pydna + pydna + + + +     + pydna._pretty + + + +     + pydna._thermodynamic_data + + + +     + pydna.all + + + +     + pydna.amplicon + + + +     + pydna.amplify + + + +     + pydna.assembly + + + +     + pydna.codon + + + +     + pydna.common_sub_strings + + + +     + pydna.conftest + + + +     + pydna.contig + + + +     + pydna.crispr + + + +     + pydna.design + + + +     + pydna.download + + + +     + pydna.dseq + + + +     + pydna.dseqrecord + + + +     + pydna.editor + + + +     + pydna.fakeseq     - pydna.amplicon + pydna.fusionpcr     - pydna.amplify + pydna.gateway     - pydna.assembly + pydna.gel     - pydna.common_sub_strings + pydna.genbank     - pydna.contig + pydna.genbankfile     - pydna.design + pydna.genbankfixer     - pydna.download + pydna.genbankrecord     - pydna.dseq + pydna.goldengate     - pydna.dseqrecord + pydna.ladders     - pydna.editor + pydna.ligate     - pydna.gel + pydna.myenzymes     - pydna.genbank + pydna.myprimers     - pydna.genbankfile + pydna.parsers     - pydna.genbankfixer + pydna.primer     - pydna.genbankrecord + pydna.readers     - pydna.myprimers + pydna.seq     - pydna.parsers + pydna.seqrecord     - pydna.primer + pydna.sequence_picker     - pydna.readers + pydna.threading_timer_decorator_exit     - pydna.seqrecord + pydna.tm     - pydna.tm + pydna.user_cloning     - pydna.utils + pydna.utils diff --git a/search.html b/search.html index d4433683..2385826c 100644 --- a/search.html +++ b/search.html @@ -1,21 +1,23 @@ - + - Search — pydna 0.0.0.post1+9d112d7 documentation + Search — pydna 6.0.0a24.post17+b7b559bd66 documentation - + + + - - - + + + @@ -42,8 +44,15 @@
        diff --git a/searchindex.js b/searchindex.js index 5b463542..a3ba9414 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"Examples of pydna in use": [[0, "examples-of-pydna-in-use"]], "How to get more help": [[0, "how-to-get-more-help"]], "How to use the documentation": [[0, "how-to-use-the-documentation"]], "Indices and tables": [[0, "indices-and-tables"]], "Module contents": [[0, "module-pydna"]], "Welcome to pydna\u2019s documentation!": [[0, null]], "pydna": [[0, "pydna"]], "pydna package layout": [[0, "pydna-package-layout"]], "pydna source code": [[0, "pydna-source-code"]], "pydna.amplicon module": [[0, "module-pydna.amplicon"]], "pydna.amplify module": [[0, "module-pydna.amplify"]], "pydna.assembly module": [[0, "module-pydna.assembly"]], "pydna.common_sub_strings module": [[0, "module-pydna.common_sub_strings"]], "pydna.contig module": [[0, "module-pydna.contig"]], "pydna.design module": [[0, "module-pydna.design"]], "pydna.download module": [[0, "module-pydna.download"]], "pydna.dseq module": [[0, "module-pydna.dseq"]], "pydna.dseqrecord module": [[0, "module-pydna.dseqrecord"]], "pydna.editor module": [[0, "module-pydna.editor"]], "pydna.gel module": [[0, "module-pydna.gel"]], "pydna.genbank module": [[0, "module-pydna.genbank"]], "pydna.genbankfile module": [[0, "module-pydna.genbankfile"]], "pydna.genbankfixer module": [[0, "module-pydna.genbankfixer"]], "pydna.genbankrecord module": [[0, "module-pydna.genbankrecord"]], "pydna.myprimers module": [[0, "module-pydna.myprimers"]], "pydna.parsers module": [[0, "module-pydna.parsers"]], "pydna.primer module": [[0, "module-pydna.primer"]], "pydna.readers module": [[0, "module-pydna.readers"]], "pydna.seqrecord module": [[0, "module-pydna.seqrecord"]], "pydna.tm module": [[0, "module-pydna.tm"]], "pydna.utils module": [[0, "module-pydna.utils"]]}, "docnames": ["index"], "envversion": {"sphinx": 63, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.viewcode": 1}, "filenames": ["index.rst"], "indexentries": {"accessed (pydna.myprimers.primerlist property)": [[0, "pydna.myprimers.PrimerList.accessed", false]], "accession (pydna.seqrecord.seqrecord property)": [[0, "pydna.seqrecord.SeqRecord.accession", false]], "add_colors_to_features_for_ape() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.add_colors_to_features_for_ape", false]], "add_feature() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.add_feature", false]], "add_feature() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.add_feature", false]], "amplicon (class in pydna.amplicon)": [[0, "pydna.amplicon.Amplicon", false]], "anneal (class in pydna.amplify)": [[0, "pydna.amplify.Anneal", false]], "ape() (in module pydna.editor)": [[0, "pydna.editor.ape", false]], "apply_cut() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.apply_cut", false]], "apply_cut() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.apply_cut", false]], "assemble_circular() (pydna.assembly.assembly method)": [[0, "pydna.assembly.Assembly.assemble_circular", false]], "assemble_linear() (pydna.assembly.assembly method)": [[0, "pydna.assembly.Assembly.assemble_linear", false]], "assembly (class in pydna.assembly)": [[0, "pydna.assembly.Assembly", false]], "assembly_fragments() (in module pydna.design)": [[0, "pydna.design.assembly_fragments", false]], "assign_numbers() (pydna.myprimers.primerlist method)": [[0, "pydna.myprimers.PrimerList.assign_numbers", false]], "biopython_code() (pydna.genbankrecord.genbankrecord method)": [[0, "pydna.genbankrecord.GenbankRecord.biopython_code", false]], "cai() (in module pydna.utils)": [[0, "pydna.utils.cai", false]], "cai() (pydna.seqrecord.proteinseqrecord method)": [[0, "pydna.seqrecord.ProteinSeqRecord.cai", false]], "cai() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.cai", false]], "cas9() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.cas9", false]], "cas9() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.cas9", false]], "check_primer_numbers() (in module pydna.myprimers)": [[0, "pydna.myprimers.check_primer_numbers", false]], "circular (pydna.dseqrecord.dseqrecord property)": [[0, "pydna.dseqrecord.Dseqrecord.circular", false]], "circular_assembly_fragments() (in module pydna.design)": [[0, "pydna.design.circular_assembly_fragments", false]], "code() (pydna.myprimers.primerlist method)": [[0, "pydna.myprimers.PrimerList.code", false]], "comment() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.comment", false]], "common_sub_strings() (in module pydna.common_sub_strings)": [[0, "pydna.common_sub_strings.common_sub_strings", false]], "complement() (in module pydna.utils)": [[0, "pydna.utils.complement", false]], "concat_dict() (in module pydna.genbankfixer)": [[0, "pydna.genbankfixer.concat_dict", false]], "contig (class in pydna.contig)": [[0, "pydna.contig.Contig", false]], "copy() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.copy", false]], "copy_fasta_to_clipboard() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.copy_fasta_to_clipboard", false]], "copy_gb_to_clipboard() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.copy_gb_to_clipboard", false]], "cut() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.cut", false]], "cut() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.cut", false]], "cuts_overlap() (in module pydna.utils)": [[0, "pydna.utils.cuts_overlap", false]], "cutsite_is_valid() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.cutsite_is_valid", false]], "cutters() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.cutters", false]], "cutters() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.cutters", false]], "datefunction() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.datefunction", false]], "dbd_program() (in module pydna.tm)": [[0, "pydna.tm.dbd_program", false]], "dbd_program() (pydna.amplicon.amplicon method)": [[0, "pydna.amplicon.Amplicon.dbd_program", false]], "definition (pydna.seqrecord.seqrecord property)": [[0, "pydna.seqrecord.SeqRecord.definition", false]], "detailed_figure() (pydna.contig.contig method)": [[0, "pydna.contig.Contig.detailed_figure", false]], "dseq (class in pydna.dseq)": [[0, "pydna.dseq.Dseq", false]], "dseqrecord (class in pydna.dseqrecord)": [[0, "pydna.dseqrecord.Dseqrecord", false]], "dump() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.dump", false]], "editor (class in pydna.editor)": [[0, "pydna.editor.Editor", false]], "embl_gb_fasta() (in module pydna.parsers)": [[0, "pydna.parsers.embl_gb_fasta", false]], "eq() (in module pydna.utils)": [[0, "pydna.utils.eq", false]], "exo1_end() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.exo1_end", false]], "exo1_front() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.exo1_front", false]], "express() (in module pydna.utils)": [[0, "pydna.utils.express", false]], "express() (pydna.seqrecord.proteinseqrecord method)": [[0, "pydna.seqrecord.ProteinSeqRecord.express", false]], "express() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.express", false]], "extract_feature() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.extract_feature", false]], "extract_feature() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.extract_feature", false]], "extract_from_text() (in module pydna.parsers)": [[0, "pydna.parsers.extract_from_text", false]], "figure() (pydna.amplicon.amplicon method)": [[0, "pydna.amplicon.Amplicon.figure", false]], "figure() (pydna.contig.contig method)": [[0, "pydna.contig.Contig.figure", false]], "figure() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.figure", false]], "fill_in() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.fill_in", false]], "find() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.find", false]], "find() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.find", false]], "find_aa() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.find_aa", false]], "find_aminoacids() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.find_aminoacids", false]], "find_duplicate_primers() (in module pydna.myprimers)": [[0, "pydna.myprimers.find_duplicate_primers", false]], "five_prime_end() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.five_prime_end", false]], "flatten() (in module pydna.utils)": [[0, "pydna.utils.flatten", false]], "footprint (pydna.primer.primer property)": [[0, "pydna.primer.Primer.footprint", false]], "format() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.format", false]], "forward_primers (pydna.amplify.anneal attribute)": [[0, "pydna.amplify.Anneal.forward_primers", false]], "from_bio_seqrecord() (pydna.seqrecord.seqrecord class method)": [[0, "pydna.seqrecord.SeqRecord.from_Bio_SeqRecord", false]], "from_full_sequence_and_overhangs() (pydna.dseq.dseq class method)": [[0, "pydna.dseq.Dseq.from_full_sequence_and_overhangs", false]], "from_representation() (pydna.dseq.dseq class method)": [[0, "pydna.dseq.Dseq.from_representation", false]], "from_seqrecord() (pydna.amplicon.amplicon class method)": [[0, "pydna.amplicon.Amplicon.from_SeqRecord", false]], "from_seqrecord() (pydna.contig.contig class method)": [[0, "pydna.contig.Contig.from_SeqRecord", false]], "from_seqrecord() (pydna.dseqrecord.dseqrecord class method)": [[0, "pydna.dseqrecord.Dseqrecord.from_SeqRecord", false]], "from_seqrecord() (pydna.genbankfile.genbankfile class method)": [[0, "pydna.genbankfile.GenbankFile.from_SeqRecord", false]], "from_seqrecord() (pydna.genbankrecord.genbankrecord class method)": [[0, "pydna.genbankrecord.GenbankRecord.from_SeqRecord", false]], "from_string() (pydna.contig.contig class method)": [[0, "pydna.contig.Contig.from_string", false]], "from_string() (pydna.dseq.dseq class method)": [[0, "pydna.dseq.Dseq.from_string", false]], "from_string() (pydna.dseqrecord.dseqrecord class method)": [[0, "pydna.dseqrecord.Dseqrecord.from_string", false]], "from_string() (pydna.genbankrecord.genbankrecord class method)": [[0, "pydna.genbankrecord.GenbankRecord.from_string", false]], "gbtext_clean() (in module pydna.genbankfixer)": [[0, "pydna.genbankfixer.gbtext_clean", false]], "gc() (pydna.seqrecord.proteinseqrecord method)": [[0, "pydna.seqrecord.ProteinSeqRecord.gc", false]], "gc() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.gc", false]], "gel() (in module pydna.gel)": [[0, "pydna.gel.gel", false]], "genbank (class in pydna.genbank)": [[0, "pydna.genbank.Genbank", false]], "genbank() (in module pydna.genbank)": [[0, "pydna.genbank.genbank", false]], "genbankfile (class in pydna.genbankfile)": [[0, "pydna.genbankfile.GenbankFile", false]], "genbankrecord (class in pydna.genbankrecord)": [[0, "pydna.genbankrecord.GenbankRecord", false]], "get_cut_parameters() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.get_cut_parameters", false]], "get_cutsite_pairs() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.get_cutsite_pairs", false]], "get_cutsites() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.get_cutsites", false]], "get_env() (in module pydna)": [[0, "pydna.get_env", false]], "identifier_from_string() (in module pydna.utils)": [[0, "pydna.utils.identifier_from_string", false]], "interpolator() (in module pydna.gel)": [[0, "pydna.gel.interpolator", false]], "isblunt() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.isblunt", false]], "isorf() (pydna.seqrecord.proteinseqrecord method)": [[0, "pydna.seqrecord.ProteinSeqRecord.isorf", false]], "isorf() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.isorf", false]], "lcs() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.lcs", false]], "left_end_position() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.left_end_position", false]], "limit (pydna.amplify.anneal attribute)": [[0, "pydna.amplify.Anneal.limit", false]], "linearize() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.linearize", false]], "list_features() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.list_features", false]], "location_boundaries() (in module pydna.utils)": [[0, "pydna.utils.location_boundaries", false]], "locations_overlap() (in module pydna.utils)": [[0, "pydna.utils.locations_overlap", false]], "locstr() (in module pydna.genbankfixer)": [[0, "pydna.genbankfixer.locstr", false]], "locus (pydna.seqrecord.seqrecord property)": [[0, "pydna.seqrecord.SeqRecord.locus", false]], "logo() (in module pydna)": [[0, "pydna.logo", false]], "looped() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.looped", false]], "looped() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.looped", false]], "lower() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.lower", false]], "lower() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.lower", false]], "m() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.m", false]], "map_trace_files() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.map_trace_files", false]], "memorize() (in module pydna.utils)": [[0, "pydna.utils.memorize", false]], "module": [[0, "module-pydna", false], [0, "module-pydna.amplicon", false], [0, "module-pydna.amplify", false], [0, "module-pydna.assembly", false], [0, "module-pydna.common_sub_strings", false], [0, "module-pydna.contig", false], [0, "module-pydna.design", false], [0, "module-pydna.download", false], [0, "module-pydna.dseq", false], [0, "module-pydna.dseqrecord", false], [0, "module-pydna.editor", false], [0, "module-pydna.gel", false], [0, "module-pydna.genbank", false], [0, "module-pydna.genbankfile", false], [0, "module-pydna.genbankfixer", false], [0, "module-pydna.genbankrecord", false], [0, "module-pydna.myprimers", false], [0, "module-pydna.parsers", false], [0, "module-pydna.primer", false], [0, "module-pydna.readers", false], [0, "module-pydna.seqrecord", false], [0, "module-pydna.tm", false], [0, "module-pydna.utils", false]], "mung() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.mung", false]], "mw() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.mw", false]], "n_cutters() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.n_cutters", false]], "n_cutters() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.n_cutters", false]], "no_cutters() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.no_cutters", false]], "no_cutters() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.no_cutters", false]], "nucleotide() (pydna.genbank.genbank method)": [[0, "pydna.genbank.Genbank.nucleotide", false]], "number_of_cuts() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.number_of_cuts", false]], "once_cutters() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.once_cutters", false]], "once_cutters() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.once_cutters", false]], "open() (pydna.editor.editor method)": [[0, "pydna.editor.Editor.open", false]], "open_cache_folder() (in module pydna)": [[0, "pydna.open_cache_folder", false]], "open_config_folder() (in module pydna)": [[0, "pydna.open_config_folder", false]], "open_current_folder() (in module pydna)": [[0, "pydna.open_current_folder", false]], "open_folder() (in module pydna.utils)": [[0, "pydna.utils.open_folder", false]], "open_folder() (pydna.myprimers.primerlist method)": [[0, "pydna.myprimers.PrimerList.open_folder", false]], "open_log_folder() (in module pydna)": [[0, "pydna.open_log_folder", false]], "orfs() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.orfs", false]], "orfs_to_features() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.orfs_to_features", false]], "originstr() (in module pydna.genbankfixer)": [[0, "pydna.genbankfixer.originstr", false]], "parse() (in module pydna.parsers)": [[0, "pydna.parsers.parse", false]], "parse_primers() (in module pydna.parsers)": [[0, "pydna.parsers.parse_primers", false]], "parsegbloc() (in module pydna.genbankfixer)": [[0, "pydna.genbankfixer.parseGBLoc", false]], "pcr() (in module pydna.amplify)": [[0, "pydna.amplify.pcr", false]], "pfu_sso7d_program() (in module pydna.tm)": [[0, "pydna.tm.pfu_sso7d_program", false]], "primer (class in pydna.primer)": [[0, "pydna.primer.Primer", false]], "primer_design() (in module pydna.design)": [[0, "pydna.design.primer_design", false]], "primerlist (class in pydna.myprimers)": [[0, "pydna.myprimers.PrimerList", false]], "primers() (pydna.amplicon.amplicon method)": [[0, "pydna.amplicon.Amplicon.primers", false]], "products (pydna.amplify.anneal property)": [[0, "pydna.amplify.Anneal.products", false]], "program() (in module pydna.tm)": [[0, "pydna.tm.program", false]], "program() (pydna.amplicon.amplicon method)": [[0, "pydna.amplicon.Amplicon.program", false]], "proteinseqrecord (class in pydna.seqrecord)": [[0, "pydna.seqrecord.ProteinSeqRecord", false]], "pydna": [[0, "module-pydna", false]], "pydna.amplicon": [[0, "module-pydna.amplicon", false]], "pydna.amplify": [[0, "module-pydna.amplify", false]], "pydna.assembly": [[0, "module-pydna.assembly", false]], "pydna.common_sub_strings": [[0, "module-pydna.common_sub_strings", false]], "pydna.contig": [[0, "module-pydna.contig", false]], "pydna.design": [[0, "module-pydna.design", false]], "pydna.download": [[0, "module-pydna.download", false]], "pydna.dseq": [[0, "module-pydna.dseq", false]], "pydna.dseqrecord": [[0, "module-pydna.dseqrecord", false]], "pydna.editor": [[0, "module-pydna.editor", false]], "pydna.gel": [[0, "module-pydna.gel", false]], "pydna.genbank": [[0, "module-pydna.genbank", false]], "pydna.genbankfile": [[0, "module-pydna.genbankfile", false]], "pydna.genbankfixer": [[0, "module-pydna.genbankfixer", false]], "pydna.genbankrecord": [[0, "module-pydna.genbankrecord", false]], "pydna.myprimers": [[0, "module-pydna.myprimers", false]], "pydna.parsers": [[0, "module-pydna.parsers", false]], "pydna.primer": [[0, "module-pydna.primer", false]], "pydna.readers": [[0, "module-pydna.readers", false]], "pydna.seqrecord": [[0, "module-pydna.seqrecord", false]], "pydna.tm": [[0, "module-pydna.tm", false]], "pydna.utils": [[0, "module-pydna.utils", false]], "pydna_code() (pydna.genbankrecord.genbankrecord method)": [[0, "pydna.genbankrecord.GenbankRecord.pydna_code", false]], "pydna_code_from_list() (pydna.myprimers.primerlist method)": [[0, "pydna.myprimers.PrimerList.pydna_code_from_list", false]], "q5() (in module pydna.tm)": [[0, "pydna.tm.Q5", false]], "quick() (pydna.dseq.dseq class method)": [[0, "pydna.dseq.Dseq.quick", false]], "randomdna() (in module pydna.utils)": [[0, "pydna.utils.randomDNA", false]], "randomorf() (in module pydna.utils)": [[0, "pydna.utils.randomORF", false]], "randomprot() (in module pydna.utils)": [[0, "pydna.utils.randomprot", false]], "randomrna() (in module pydna.utils)": [[0, "pydna.utils.randomRNA", false]], "rarecodons() (in module pydna.utils)": [[0, "pydna.utils.rarecodons", false]], "rarecodons() (pydna.seqrecord.proteinseqrecord method)": [[0, "pydna.seqrecord.ProteinSeqRecord.rarecodons", false]], "rarecodons() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.rarecodons", false]], "rc() (in module pydna.utils)": [[0, "pydna.utils.rc", false]], "rc() (pydna.amplicon.amplicon method)": [[0, "pydna.amplicon.Amplicon.rc", false]], "rc() (pydna.contig.contig method)": [[0, "pydna.contig.Contig.rc", false]], "rc() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.rc", false]], "rc() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.rc", false]], "rc() (pydna.genbankfile.genbankfile method)": [[0, "pydna.genbankfile.GenbankFile.rc", false]], "rc() (pydna.genbankrecord.genbankrecord method)": [[0, "pydna.genbankrecord.GenbankRecord.rc", false]], "rc() (pydna.seqrecord.proteinseqrecord method)": [[0, "pydna.seqrecord.ProteinSeqRecord.rc", false]], "rc() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.rc", false]], "read() (in module pydna.readers)": [[0, "pydna.readers.read", false]], "read_primer() (in module pydna.readers)": [[0, "pydna.readers.read_primer", false]], "report() (pydna.amplify.anneal method)": [[0, "pydna.amplify.Anneal.report", false]], "reverse_complement() (pydna.amplicon.amplicon method)": [[0, "pydna.amplicon.Amplicon.reverse_complement", false]], "reverse_complement() (pydna.contig.contig method)": [[0, "pydna.contig.Contig.reverse_complement", false]], "reverse_complement() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.reverse_complement", false]], "reverse_complement() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.reverse_complement", false]], "reverse_complement() (pydna.genbankfile.genbankfile method)": [[0, "pydna.genbankfile.GenbankFile.reverse_complement", false]], "reverse_complement() (pydna.genbankrecord.genbankrecord method)": [[0, "pydna.genbankrecord.GenbankRecord.reverse_complement", false]], "reverse_complement() (pydna.primer.primer method)": [[0, "pydna.primer.Primer.reverse_complement", false]], "reverse_complement() (pydna.seqrecord.proteinseqrecord method)": [[0, "pydna.seqrecord.ProteinSeqRecord.reverse_complement", false]], "reverse_complement() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.reverse_complement", false]], "reverse_primers (pydna.amplify.anneal attribute)": [[0, "pydna.amplify.Anneal.reverse_primers", false]], "right_end_position() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.right_end_position", false]], "seguid() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.seguid", false]], "seguid() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.seguid", false]], "seguid() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.seguid", false]], "seq31() (in module pydna.utils)": [[0, "pydna.utils.seq31", false]], "seqrecord (class in pydna.seqrecord)": [[0, "pydna.seqrecord.SeqRecord", false]], "set_forward_primer_footprint() (pydna.amplicon.amplicon method)": [[0, "pydna.amplicon.Amplicon.set_forward_primer_footprint", false]], "set_reverse_primer_footprint() (pydna.amplicon.amplicon method)": [[0, "pydna.amplicon.Amplicon.set_reverse_primer_footprint", false]], "shift_feature() (in module pydna.utils)": [[0, "pydna.utils.shift_feature", false]], "shift_location() (in module pydna.utils)": [[0, "pydna.utils.shift_location", false]], "shifted() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.shifted", false]], "shifted() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.shifted", false]], "smallest_rotation() (in module pydna.utils)": [[0, "pydna.utils.smallest_rotation", false]], "sorted_features() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.sorted_features", false]], "stamp() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.stamp", false]], "startcodon() (pydna.seqrecord.proteinseqrecord method)": [[0, "pydna.seqrecord.ProteinSeqRecord.startcodon", false]], "startcodon() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.startcodon", false]], "stopcodon() (pydna.seqrecord.proteinseqrecord method)": [[0, "pydna.seqrecord.ProteinSeqRecord.stopcodon", false]], "stopcodon() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.stopcodon", false]], "strip_indent() (in module pydna.genbankfixer)": [[0, "pydna.genbankfixer.strip_indent", false]], "strip_multiline() (in module pydna.genbankfixer)": [[0, "pydna.genbankfixer.strip_multiline", false]], "synced() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.synced", false]], "t4() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.T4", false], [0, "pydna.dseq.Dseq.t4", false]], "ta_dbd() (in module pydna.tm)": [[0, "pydna.tm.ta_dbd", false]], "ta_default() (in module pydna.tm)": [[0, "pydna.tm.ta_default", false]], "tail (pydna.primer.primer property)": [[0, "pydna.primer.Primer.tail", false]], "taq_program() (in module pydna.tm)": [[0, "pydna.tm.taq_program", false]], "template (pydna.amplify.anneal attribute)": [[0, "pydna.amplify.Anneal.template", false]], "terminal_overlap() (in module pydna.common_sub_strings)": [[0, "pydna.common_sub_strings.terminal_overlap", false]], "terminal_transferase() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.terminal_transferase", false]], "terminal_transferase() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.terminal_transferase", false]], "three_frame_orfs() (in module pydna.utils)": [[0, "pydna.utils.three_frame_orfs", false]], "three_prime_end() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.three_prime_end", false]], "tm_dbd() (in module pydna.tm)": [[0, "pydna.tm.tm_dbd", false]], "tm_default() (in module pydna.tm)": [[0, "pydna.tm.tm_default", false]], "tm_neb() (in module pydna.tm)": [[0, "pydna.tm.tm_neb", false]], "tm_product() (in module pydna.tm)": [[0, "pydna.tm.tm_product", false]], "tmbresluc() (in module pydna.tm)": [[0, "pydna.tm.tmbresluc", false]], "togb() (in module pydna.genbankfixer)": [[0, "pydna.genbankfixer.toGB", false]], "toint() (in module pydna.genbankfixer)": [[0, "pydna.genbankfixer.toInt", false]], "tojson() (in module pydna.genbankfixer)": [[0, "pydna.genbankfixer.toJSON", false]], "tolinear() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.tolinear", false]], "tolinear() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.tolinear", false]], "transcribe() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.transcribe", false]], "translate() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.translate", false]], "translate() (pydna.seqrecord.seqrecord method)": [[0, "pydna.seqrecord.SeqRecord.translate", false]], "trunc (pydna.dseq.dseq attribute)": [[0, "pydna.dseq.Dseq.trunc", false]], "twice_cutters() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.twice_cutters", false]], "twice_cutters() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.twice_cutters", false]], "undefined_sequence() (in module pydna.myprimers)": [[0, "pydna.myprimers.undefined_sequence", false]], "unique_cutters() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.unique_cutters", false]], "unique_cutters() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.unique_cutters", false]], "upper() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.upper", false]], "upper() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.upper", false]], "watson_ovhg() (pydna.dseq.dseq method)": [[0, "pydna.dseq.Dseq.watson_ovhg", false]], "wrapstring() (in module pydna.genbankfixer)": [[0, "pydna.genbankfixer.wrapstring", false]], "write() (pydna.dseqrecord.dseqrecord method)": [[0, "pydna.dseqrecord.Dseqrecord.write", false]]}, "objects": {"": [[0, 0, 0, "-", "pydna"]], "pydna": [[0, 0, 0, "-", "amplicon"], [0, 0, 0, "-", "amplify"], [0, 0, 0, "-", "assembly"], [0, 0, 0, "-", "common_sub_strings"], [0, 0, 0, "-", "contig"], [0, 0, 0, "-", "design"], [0, 0, 0, "-", "download"], [0, 0, 0, "-", "dseq"], [0, 0, 0, "-", "dseqrecord"], [0, 0, 0, "-", "editor"], [0, 0, 0, "-", "gel"], [0, 0, 0, "-", "genbank"], [0, 0, 0, "-", "genbankfile"], [0, 0, 0, "-", "genbankfixer"], [0, 0, 0, "-", "genbankrecord"], [0, 5, 1, "", "get_env"], [0, 5, 1, "", "logo"], [0, 0, 0, "-", "myprimers"], [0, 5, 1, "", "open_cache_folder"], [0, 5, 1, "", "open_config_folder"], [0, 5, 1, "", "open_current_folder"], [0, 5, 1, "", "open_log_folder"], [0, 0, 0, "-", "parsers"], [0, 0, 0, "-", "primer"], [0, 0, 0, "-", "readers"], [0, 0, 0, "-", "seqrecord"], [0, 0, 0, "-", "tm"], [0, 0, 0, "-", "utils"]], "pydna.amplicon": [[0, 1, 1, "", "Amplicon"]], "pydna.amplicon.Amplicon": [[0, 2, 1, "", "dbd_program"], [0, 2, 1, "", "figure"], [0, 2, 1, "", "from_SeqRecord"], [0, 2, 1, "", "primers"], [0, 2, 1, "", "program"], [0, 2, 1, "", "rc"], [0, 2, 1, "", "reverse_complement"], [0, 2, 1, "", "set_forward_primer_footprint"], [0, 2, 1, "", "set_reverse_primer_footprint"]], "pydna.amplify": [[0, 1, 1, "", "Anneal"], [0, 5, 1, "", "pcr"]], "pydna.amplify.Anneal": [[0, 3, 1, "", "forward_primers"], [0, 3, 1, "", "limit"], [0, 4, 1, "", "products"], [0, 2, 1, "", "report"], [0, 3, 1, "", "reverse_primers"], [0, 3, 1, "", "template"]], "pydna.assembly": [[0, 1, 1, "", "Assembly"]], "pydna.assembly.Assembly": [[0, 2, 1, "", "assemble_circular"], [0, 2, 1, "", "assemble_linear"]], "pydna.common_sub_strings": [[0, 5, 1, "", "common_sub_strings"], [0, 5, 1, "", "terminal_overlap"]], "pydna.contig": [[0, 1, 1, "", "Contig"]], "pydna.contig.Contig": [[0, 2, 1, "", "detailed_figure"], [0, 2, 1, "", "figure"], [0, 2, 1, "", "from_SeqRecord"], [0, 2, 1, "", "from_string"], [0, 2, 1, "", "rc"], [0, 2, 1, "", "reverse_complement"]], "pydna.design": [[0, 5, 1, "", "assembly_fragments"], [0, 5, 1, "", "circular_assembly_fragments"], [0, 5, 1, "", "primer_design"]], "pydna.dseq": [[0, 1, 1, "", "Dseq"]], "pydna.dseq.Dseq": [[0, 2, 1, "", "T4"], [0, 2, 1, "", "apply_cut"], [0, 2, 1, "", "cas9"], [0, 2, 1, "", "cut"], [0, 2, 1, "", "cutsite_is_valid"], [0, 2, 1, "", "cutters"], [0, 2, 1, "", "exo1_end"], [0, 2, 1, "", "exo1_front"], [0, 2, 1, "", "fill_in"], [0, 2, 1, "", "find"], [0, 2, 1, "", "five_prime_end"], [0, 2, 1, "", "from_full_sequence_and_overhangs"], [0, 2, 1, "", "from_representation"], [0, 2, 1, "", "from_string"], [0, 2, 1, "", "get_cut_parameters"], [0, 2, 1, "", "get_cutsite_pairs"], [0, 2, 1, "", "get_cutsites"], [0, 2, 1, "", "isblunt"], [0, 2, 1, "", "left_end_position"], [0, 2, 1, "", "looped"], [0, 2, 1, "", "lower"], [0, 2, 1, "", "mung"], [0, 2, 1, "", "mw"], [0, 2, 1, "", "n_cutters"], [0, 2, 1, "", "no_cutters"], [0, 2, 1, "", "once_cutters"], [0, 2, 1, "", "quick"], [0, 2, 1, "", "rc"], [0, 2, 1, "", "reverse_complement"], [0, 2, 1, "", "right_end_position"], [0, 2, 1, "", "seguid"], [0, 2, 1, "", "shifted"], [0, 2, 1, "", "t4"], [0, 2, 1, "", "terminal_transferase"], [0, 2, 1, "", "three_prime_end"], [0, 2, 1, "", "tolinear"], [0, 2, 1, "", "transcribe"], [0, 2, 1, "", "translate"], [0, 3, 1, "", "trunc"], [0, 2, 1, "", "twice_cutters"], [0, 2, 1, "", "unique_cutters"], [0, 2, 1, "", "upper"], [0, 2, 1, "", "watson_ovhg"]], "pydna.dseqrecord": [[0, 1, 1, "", "Dseqrecord"]], "pydna.dseqrecord.Dseqrecord": [[0, 2, 1, "", "add_feature"], [0, 2, 1, "", "apply_cut"], [0, 2, 1, "", "cas9"], [0, 4, 1, "", "circular"], [0, 2, 1, "", "copy_fasta_to_clipboard"], [0, 2, 1, "", "copy_gb_to_clipboard"], [0, 2, 1, "", "cut"], [0, 2, 1, "", "cutters"], [0, 2, 1, "", "extract_feature"], [0, 2, 1, "", "figure"], [0, 2, 1, "", "find"], [0, 2, 1, "", "find_aa"], [0, 2, 1, "", "find_aminoacids"], [0, 2, 1, "", "format"], [0, 2, 1, "", "from_SeqRecord"], [0, 2, 1, "", "from_string"], [0, 2, 1, "", "linearize"], [0, 2, 1, "", "looped"], [0, 2, 1, "", "lower"], [0, 2, 1, "", "m"], [0, 2, 1, "", "map_trace_files"], [0, 2, 1, "", "n_cutters"], [0, 2, 1, "", "no_cutters"], [0, 2, 1, "", "number_of_cuts"], [0, 2, 1, "", "once_cutters"], [0, 2, 1, "", "orfs"], [0, 2, 1, "", "orfs_to_features"], [0, 2, 1, "", "rc"], [0, 2, 1, "", "reverse_complement"], [0, 2, 1, "", "seguid"], [0, 2, 1, "", "shifted"], [0, 2, 1, "", "synced"], [0, 2, 1, "", "terminal_transferase"], [0, 2, 1, "", "tolinear"], [0, 2, 1, "", "twice_cutters"], [0, 2, 1, "", "unique_cutters"], [0, 2, 1, "", "upper"], [0, 2, 1, "", "write"]], "pydna.editor": [[0, 1, 1, "", "Editor"], [0, 5, 1, "", "ape"]], "pydna.editor.Editor": [[0, 2, 1, "", "open"]], "pydna.gel": [[0, 5, 1, "", "gel"], [0, 5, 1, "", "interpolator"]], "pydna.genbank": [[0, 1, 1, "", "Genbank"], [0, 5, 1, "", "genbank"]], "pydna.genbank.Genbank": [[0, 2, 1, "", "nucleotide"]], "pydna.genbankfile": [[0, 1, 1, "", "GenbankFile"]], "pydna.genbankfile.GenbankFile": [[0, 2, 1, "", "from_SeqRecord"], [0, 2, 1, "", "rc"], [0, 2, 1, "", "reverse_complement"]], "pydna.genbankfixer": [[0, 5, 1, "", "concat_dict"], [0, 5, 1, "", "gbtext_clean"], [0, 5, 1, "", "locstr"], [0, 5, 1, "", "originstr"], [0, 5, 1, "", "parseGBLoc"], [0, 5, 1, "", "strip_indent"], [0, 5, 1, "", "strip_multiline"], [0, 5, 1, "", "toGB"], [0, 5, 1, "", "toInt"], [0, 5, 1, "", "toJSON"], [0, 5, 1, "", "wrapstring"]], "pydna.genbankrecord": [[0, 1, 1, "", "GenbankRecord"]], "pydna.genbankrecord.GenbankRecord": [[0, 2, 1, "", "biopython_code"], [0, 2, 1, "", "from_SeqRecord"], [0, 2, 1, "", "from_string"], [0, 2, 1, "", "pydna_code"], [0, 2, 1, "", "rc"], [0, 2, 1, "", "reverse_complement"]], "pydna.myprimers": [[0, 1, 1, "", "PrimerList"], [0, 5, 1, "", "check_primer_numbers"], [0, 5, 1, "", "find_duplicate_primers"], [0, 5, 1, "", "undefined_sequence"]], "pydna.myprimers.PrimerList": [[0, 4, 1, "", "accessed"], [0, 2, 1, "", "assign_numbers"], [0, 2, 1, "", "code"], [0, 2, 1, "", "open_folder"], [0, 2, 1, "", "pydna_code_from_list"]], "pydna.parsers": [[0, 5, 1, "", "embl_gb_fasta"], [0, 5, 1, "", "extract_from_text"], [0, 5, 1, "", "parse"], [0, 5, 1, "", "parse_primers"]], "pydna.primer": [[0, 1, 1, "", "Primer"]], "pydna.primer.Primer": [[0, 4, 1, "", "footprint"], [0, 2, 1, "", "reverse_complement"], [0, 4, 1, "", "tail"]], "pydna.readers": [[0, 5, 1, "", "read"], [0, 5, 1, "", "read_primer"]], "pydna.seqrecord": [[0, 1, 1, "", "ProteinSeqRecord"], [0, 1, 1, "", "SeqRecord"]], "pydna.seqrecord.ProteinSeqRecord": [[0, 2, 1, "", "cai"], [0, 2, 1, "", "express"], [0, 2, 1, "", "gc"], [0, 2, 1, "", "isorf"], [0, 2, 1, "", "rarecodons"], [0, 2, 1, "", "rc"], [0, 2, 1, "", "reverse_complement"], [0, 2, 1, "", "startcodon"], [0, 2, 1, "", "stopcodon"]], "pydna.seqrecord.SeqRecord": [[0, 4, 1, "", "accession"], [0, 2, 1, "", "add_colors_to_features_for_ape"], [0, 2, 1, "", "add_feature"], [0, 2, 1, "", "cai"], [0, 2, 1, "", "comment"], [0, 2, 1, "", "copy"], [0, 2, 1, "", "datefunction"], [0, 4, 1, "", "definition"], [0, 2, 1, "", "dump"], [0, 2, 1, "", "express"], [0, 2, 1, "", "extract_feature"], [0, 2, 1, "", "from_Bio_SeqRecord"], [0, 2, 1, "", "gc"], [0, 2, 1, "", "isorf"], [0, 2, 1, "", "lcs"], [0, 2, 1, "", "list_features"], [0, 4, 1, "", "locus"], [0, 2, 1, "", "rarecodons"], [0, 2, 1, "", "rc"], [0, 2, 1, "", "reverse_complement"], [0, 2, 1, "", "seguid"], [0, 2, 1, "", "sorted_features"], [0, 2, 1, "", "stamp"], [0, 2, 1, "", "startcodon"], [0, 2, 1, "", "stopcodon"], [0, 2, 1, "", "translate"]], "pydna.tm": [[0, 5, 1, "", "Q5"], [0, 5, 1, "", "dbd_program"], [0, 5, 1, "", "pfu_sso7d_program"], [0, 5, 1, "", "program"], [0, 5, 1, "", "ta_dbd"], [0, 5, 1, "", "ta_default"], [0, 5, 1, "", "taq_program"], [0, 5, 1, "", "tm_dbd"], [0, 5, 1, "", "tm_default"], [0, 5, 1, "", "tm_neb"], [0, 5, 1, "", "tm_product"], [0, 5, 1, "", "tmbresluc"]], "pydna.utils": [[0, 5, 1, "", "cai"], [0, 5, 1, "", "complement"], [0, 5, 1, "", "cuts_overlap"], [0, 5, 1, "", "eq"], [0, 5, 1, "", "express"], [0, 5, 1, "", "flatten"], [0, 5, 1, "", "identifier_from_string"], [0, 5, 1, "", "location_boundaries"], [0, 5, 1, "", "locations_overlap"], [0, 5, 1, "", "memorize"], [0, 5, 1, "", "open_folder"], [0, 5, 1, "", "randomDNA"], [0, 5, 1, "", "randomORF"], [0, 5, 1, "", "randomRNA"], [0, 5, 1, "", "randomprot"], [0, 5, 1, "", "rarecodons"], [0, 5, 1, "", "rc"], [0, 5, 1, "", "seq31"], [0, 5, 1, "", "shift_feature"], [0, 5, 1, "", "shift_location"], [0, 5, 1, "", "smallest_rotation"], [0, 5, 1, "", "three_frame_orfs"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "property", "Python property"], "5": ["py", "function", "Python function"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:property", "5": "py:function"}, "terms": {"0": 0, "01": 0, "02": 0, "050": 0, "0_first_prim": 0, "0m": 0, "1": 0, "10": 0, "100": 0, "100bp": 0, "101": 0, "101bp": 0, "102": 0, "102bp": 0, "1051bp": 0, "11": 0, "11m": 0, "12": 0, "13": 0, "1388": 0, "14": 0, "14bp": 0, "15": 0, "15058bp": 0, "166": 0, "169": 0, "17": 0, "18": 0, "19": 0, "1950267": 0, "1983": 0, "1990": 0, "1_second_prim": 0, "1c": 0, "1st": 0, "2": 0, "2007": 0, "2007025016": 0, "2011": 0, "2013": 0, "2023": 0, "2243783": 0, "23": 0, "231": 0, "2389": 0, "24": 0, "25": 0, "250": 0, "2577": 0, "27": 0, "289": 0, "2_third_prim": 0, "3": 0, "30": 0, "300": 0, "304": 0, "308": 0, "313": 0, "32": 0, "32630": 0, "329": 0, "33bp": 0, "34bp": 0, "35": 0, "357": 0, "35bp": 0, "36": 0, "363": 0, "381": 0, "3atgtgagtggcagatagtaatag": 0, "3c": 0, "3gcaagctttgaatgctac5": 0, "3gcaagctttgaatgctaccctagg5": 0, "3gctgacatagtagactatcgtg5": 0, "3min": 0, "3tactgacgattgggaag": 0, "4": 0, "40": 0, "41": 0, "42": 0, "45": 0, "48": 0, "5": 0, "50": 0, "500": 0, "51": 0, "52": 0, "53": 0, "54": 0, "55": 0, "557": 0, "5681": 0, "57": 0, "59": 0, "5atgactgctaacccttc": 0, "5atgactgctaacccttc3": 0, "5e": 0, "5ggatccatgactgctaacccttc3": 0, "5min": 0, "5tacactcaccgtctatcattatc": 0, "5tacactcaccgtctatcattatc3": 0, "6": 0, "60": 0, "600": 0, "61": 0, "64": 0, "7": 0, "72": 0, "72c": 0, "75": 0, "79": 0, "8": 0, "82": 0, "84": 0, "85t6tfcvwav0wnxeib": 0, "9": 0, "95": 0, "98": 0, "A": 0, "AND": 0, "As": 0, "At": 0, "By": 0, "For": 0, "If": 0, "In": 0, "It": 0, "NOT": 0, "No": 0, "One": 0, "The": 0, "Then": 0, "There": 0, "These": 0, "To": 0, "_": 0, "____": 0, "_____": 0, "______": 0, "________": 0, "_________": 0, "__________": 0, "____________": 0, "___________________": 0, "______________________": 0, "__init__": 0, "_abstractcut": 0, "_klenow_frag": 0, "_mt": 0, "_mwstd": 0, "_new": 0, "_pretty_str": 0, "_restrictionbatch": 0, "_seqabstractbaseclass": 0, "_sy": 0, "_tm_default": 0, "_weight": 0, "a1": 0, "aa": 0, "aaa": 0, "aaaa": 0, "aaaaaa": 0, "aaac": 0, "aaacccc": 0, "aaagcccta": 0, "aaagcctag": 0, "aaagttct": 0, "aaat": 0, "aaatatagcgtactgagaagaaa": 0, "aaatg": 0, "aag": 0, "aagaattcaa": 0, "aagaattcaagaattc": 0, "aagaattcaagaattcaa": 0, "aat": 0, "aata": 0, "aattcaa": 0, "aattcaag": 0, "aattcc": 0, "about": 0, "abov": 0, "absolut": 0, "accept": 0, "access": 0, "accompani": 0, "accord": 0, "acg": 0, "acgatgctatactg": 0, "acgatgctatactgccccctgtgctgtgctcta": 0, "acgatgctatactgccccctgtgctgtgctctattttttattctggctgtatcgggggt": 0, "acid": 0, "acitivti": 0, "actgt": 0, "activ": 0, "actta": 0, "ad": 0, "adapt": 0, "add": 0, "add_colors_to_features_for_ap": 0, "add_featur": 0, "addition": 0, "address": 0, "adjac": 0, "advanc": 0, "after": 0, "agaaa": 0, "agaattcaa": 0, "agaros": 0, "agcct": 0, "agcctatcatcttggtctctgca": 0, "agcctatcatcttggtctctgcatttatat": 0, "agcctatcatcttggtctctgcatttatatcgcatgactcttcttt": 0, "agctag": 0, "agctatgtatcttgcatcgta": 0, "aggcct": 0, "agt": 0, "ala": 0, "algorithm": 0, "alia": 0, "all": 0, "allow": 0, "almost": 0, "alon": 0, "alphabet": 0, "alreadi": 0, "also": 0, "altern": 0, "alwai": 0, "ambigu": 0, "amino": 0, "amount": 0, "ampl": 0, "amplicon1": 0, "amplicon1amplicon2amplicon3": 0, "amplicon1amplicon2amplicon3amplicon4": 0, "amplicon1dseqrecd1amplicon2dseqrecd2": 0, "amplicon2": 0, "amplicon3": 0, "amplicon4": 0, "amplif": 0, "amplify_ann": 0, "an": 0, "anaconda3": 0, "analysi": 0, "analyz": 0, "ani": 0, "anneal": 0, "annot": 0, "anoth": 0, "anselm": 0, "antisens": 0, "ap": 0, "apeextractor": 0, "apeinfo": 0, "api": 0, "app": 0, "appear": 0, "apply_cut": 0, "appmain": 0, "aptam": 0, "ar": 0, "arg": 0, "argument": 0, "around": 0, "art": 0, "artifici": 0, "ascii": 0, "assembl": 0, "assemble_circular": 0, "assemble_linear": 0, "assembly_assembli": 0, "assembly_frag": 0, "assemblyobj": 0, "assign": 0, "assign_numb": 0, "assign_numbers_to_new_prim": 0, "associ": 0, "assum": 0, "asterisk": 0, "asx": 0, "ataa": 0, "atc": 0, "atcg": 0, "atcgactgacgtgtt": 0, "atcgtgt": 0, "atcgtgtactgtcatattc": 0, "atg": 0, "atga": 0, "atgaaa": 0, "atgaccc": 0, "atgactgctaaccct": 0, "atgactgctaacccttc": 0, "atgactgctaacccttccttggtgttg": 0, "atgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatg": 0, "atggccattgtaatgggccgctgaaagggtgcccgatag": 0, "atgtaa": 0, "atgtacgatcgtatgctggttatattttag": 0, "atgttcctac": 0, "attca": 0, "attempt": 0, "attribut": 0, "atttaa": 0, "auggccauuguaaugggccgcugaaagggugcccgauag": 0, "author": 0, "automat": 0, "automaticli": 0, "avail": 0, "b": 0, "back": 0, "backward": 0, "bamhi": 0, "base": 0, "base64": 0, "basic": 0, "batch": 0, "bean": 0, "becaus": 0, "becom": 0, "been": 0, "befor": 0, "begin": 0, "behav": 0, "below": 0, "best": 0, "beta": 0, "between": 0, "bind": 0, "bio": 0, "biojson": 0, "biolog": 0, "biologi": 0, "biologylab": 0, "biopython": 0, "biopython_cod": 0, "biopythonparserwarn": 0, "bjorn": 0, "bjorn36": 0, "bjornjobb": 0, "bj\u00f6rn": 0, "bkgnebmkia5kng": 0, "blunt": 0, "bool": 0, "both": 0, "bp": 0, "bring": 0, "brixtel": 0, "broken": 0, "bug": 0, "built": 0, "byte": 0, "bytearrai": 0, "c": 0, "c_seq": 0, "ca": 0, "caaa": 0, "caaag": 0, "cach": 0, "cached_func": 0, "cai": 0, "calcul": 0, "call": 0, "callabl": 0, "can": 0, "cannot": 0, "capabl": 0, "capac": 0, "capit": 0, "care": 0, "carefulli": 0, "cas9": 0, "case": 0, "catattc": 0, "catattcaaagttct": 0, "catcga": 0, "catcgat": 0, "catcgatc": 0, "catcgtaagtttcga": 0, "catcgtaagtttcgaacg": 0, "catgatctacgt": 0, "catgatctacgtatcgtgt": 0, "cation": 0, "ccaaacccaccaggtaccttatgtaagtacttcaagtcgccagaagacttcttggtcaagttgcc": 0, "ccc": 0, "ccccaaa": 0, "ccccc": 0, "ccccttt": 0, "ccgga": 0, "cctag": 0, "cctagg": 0, "cctaggnnncttaag": 0, "ccttaa": 0, "cd": 0, "cdseguid": 0, "cgactgtatcatctgatagcac": 0, "cgactgtatcatctgatagcac3": 0, "cgi": 0, "cgtatgctg": 0, "cgttcgaaacttacgatg3": 0, "chang": 0, "charact": 0, "check": 0, "check_primer_numb": 0, "checksum": 0, "chew": 0, "christophchamp": 0, "circular": 0, "circular_assembly_frag": 0, "class": 0, "classmethod": 0, "clean": 0, "clone": 0, "closest": 0, "coding_dna": 0, "coerc": 0, "collect": 0, "color": 0, "com": 0, "combin": 0, "combo": 0, "comma": 0, "command": 0, "comment": 0, "common": 0, "compact": 0, "compar": 0, "comparison": 0, "compat": 0, "complement": 0, "complet": 0, "compoundloc": 0, "comput": 0, "conc": 0, "concat_dict": 0, "concaten": 0, "concentr": 0, "concept": 0, "configpars": 0, "configur": 0, "connect": 0, "consid": 0, "considi": 0, "construct": 0, "contact": 0, "contain": 0, "control": 0, "conveni": 0, "convens": 0, "convent": 0, "copi": 0, "copy_fasta_to_clipboard": 0, "copy_gb_to_clipboard": 0, "copyright": 0, "correct": 0, "correctli": 0, "cottenoir": 0, "could": 0, "cover": 0, "creat": 0, "creation": 0, "crick": 0, "crick_ovhg": 0, "cs570233": 0, "cseguid": 0, "cta": 0, "ctag": 0, "ctagctac": 0, "ctagctag": 0, "ctagg": 0, "ctaggatcgtagatctagctg": 0, "ctaggg": 0, "ctctgcatttatat": 0, "ctctgcatttatatcgcatgactcttcttt": 0, "ctg": 0, "ctgggta": 0, "ctrl": 0, "ctta": 0, "cttt": 0, "cttta": 0, "current": 0, "cursor": 0, "custom": 0, "cut": 0, "cut_crick": 0, "cut_watson": 0, "cuts_overlap": 0, "cutsit": 0, "cutsite_is_valid": 0, "cutter": 0, "d": 0, "data": 0, "data_dir": 0, "date": 0, "datefunct": 0, "david": 0, "db_xref": 0, "dbd_program": 0, "dbxref": 0, "de_tabl": 0, "deal": 0, "debug": 0, "decemb": 0, "deduc": 0, "default": 0, "defin": 0, "definit": 0, "depict": 0, "deprec": 0, "describ": 0, "descript": 0, "detail": 0, "detailed_figur": 0, "detect": 0, "determin": 0, "develop": 0, "dict": 0, "differ": 0, "difficult": 0, "digest": 0, "dir": 0, "direct": 0, "directli": 0, "directori": 0, "dist": 0, "dlist": 0, "dna": 0, "dna_nn3": 0, "dna_nn4": 0, "dnac1": 0, "dnac2": 0, "dntp": 0, "do": 0, "doc": 0, "docstr": 0, "doctr": 0, "doe": 0, "domain": 0, "done": 0, "doubl": 0, "down": 0, "download_text": 0, "dropbox": 0, "dsdna": 0, "dseqr": 0, "dseqrecd1": 0, "dseqrecd1amplicon1amplicon2": 0, "dseqrecd1amplicon1dseqrecd2amplicon2": 0, "dseqrecd2": 0, "dseqrecord_frag": 0, "dseqrecord_sync": 0, "dseqtyp": 0, "dump": 0, "duplic": 0, "dure": 0, "duval": 0, "dvberkel": 0, "e": 0, "each": 0, "earlier": 0, "easier": 0, "easiest": 0, "ecori": 0, "edg": 0, "edit": 0, "edu": 0, "effect": 0, "either": 0, "element": 0, "els": 0, "email": 0, "embl": 0, "embl_gb_fasta": 0, "empti": 0, "en": 0, "encod": 0, "end": 0, "engin": 0, "enough": 0, "ensur": 0, "enter": 0, "entir": 0, "entri": 0, "env": 0, "environ": 0, "environment": 0, "enz": 0, "enzym": 0, "enzymestyp": 0, "eppstein": 0, "eq": 0, "equal": 0, "equival": 0, "especi": 0, "estim": 0, "estimate_funct": 0, "even": 0, "everi": 0, "exactposit": 0, "excactli": 0, "excel": 0, "except": 0, "exist": 0, "exo": 0, "exo1_end": 0, "exo1_front": 0, "exonucleas": 0, "expect": 0, "explan": 0, "explicitli": 0, "explor": 0, "express": 0, "extern": 0, "extra": 0, "extract": 0, "extract_featur": 0, "extract_from_text": 0, "f": 0, "f64": 0, "fa": 0, "fa1": 0, "fa2": 0, "facilit": 0, "factor": 0, "fall": 0, "fals": 0, "fasta": 0, "faster": 0, "fb": 0, "fc": 0, "featur": 0, "feb": 0, "field": 0, "figur": 0, "file": 0, "filenam": 0, "fill": 0, "fill_in": 0, "final": 0, "find": 0, "find_aa": 0, "find_aminoacid": 0, "find_duplicate_prim": 0, "first": 0, "fit": 0, "five": 0, "five_prime_end": 0, "fix": 0, "flank": 0, "flatten": 0, "flexibl": 0, "float": 0, "folder": 0, "follow": 0, "footprint": 0, "fore": 0, "form": 0, "format": 0, "formula": 0, "forward": 0, "forward_prim": 0, "found": 0, "four": 0, "fp": 0, "fr": 0, "frag": 0, "frag1": 0, "frag14": 0, "frag2": 0, "frag20": 0, "frag23": 0, "fragment": 0, "frame": 0, "fring": 0, "from": 0, "from_bio_seqrecord": 0, "from_full_sequence_and_overhang": 0, "from_represent": 0, "from_seqrecord": 0, "from_str": 0, "ft": 0, "ft2": 0, "full": 0, "full_sequ": 0, "func": 0, "function": 0, "funtion": 0, "further": 0, "fuse": 0, "fusion": 0, "fwd": 0, "g": 0, "gaaat": 0, "gaat": 0, "gaattc": 0, "gac": 0, "gacccat": 0, "gacgt": 0, "gagacgtaaatata": 0, "gagacgtaaatatagcgtactgagaagaaa": 0, "gap": 0, "gat": 0, "gatc": 0, "gatcc": 0, "gatccnnngaattc": 0, "gatccttt": 0, "gatcg": 0, "gatcga": 0, "gatcgat": 0, "gatcgatc": 0, "gatcgatg": 0, "gattaca": 0, "gb": 0, "gbkstring": 0, "gbtext": 0, "gbtext_clean": 0, "gbw0jp907tg_yx3jngs4qqwttj": 0, "gbw0jp907tg_yx3jngs4qqwttju": 0, "gc": 0, "gcaagctttgaatgctac5": 0, "gcatacgac": 0, "gcatcgtagtctatttgcttac": 0, "gcta": 0, "gctag": 0, "gctgacatagtagactatcgtg5": 0, "gel_length": 0, "genbank_nucleotid": 0, "gener": 0, "get_cut_paramet": 0, "get_cutsit": 0, "get_cutsite_pair": 0, "get_env": 0, "getcwd": 0, "gf7iorxmniu": 0, "ggaatt": 0, "ggatc": 0, "ggatcc": 0, "ggatcca": 0, "ggatccatgactgct": 0, "ggatccatgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatgggatcc": 0, "ggatcccatcgtaag": 0, "ggatccnnngaattc": 0, "ggcct": 0, "gggaaat": 0, "ggggtttcccc": 0, "gibson": 0, "gip0": 0, "gist": 0, "github": 0, "given": 0, "gmail": 0, "gnnncttaag": 0, "googl": 0, "gov": 0, "govern": 0, "gram": 0, "graph": 0, "greater": 0, "greedi": 0, "greedili": 0, "greyc": 0, "group": 0, "gt": 0, "gtagcta": 0, "gtagctag": 0, "gtt": 0, "gttcttaa": 0, "gttt": 0, "gtttc": 0, "guess": 0, "ha": 0, "half": 0, "handl": 0, "happen": 0, "have": 0, "helix": 0, "high": 0, "highlight": 0, "hold": 0, "home": 0, "homolog": 0, "homologi": 0, "http": 0, "i": 0, "id": 0, "ident": 0, "identifi": 0, "identifier_from_str": 0, "ignor": 0, "imm_tabl": 0, "immedi": 0, "immut": 0, "implement": 0, "import": 0, "includ": 0, "incorpor": 0, "index": 0, "indexerror": 0, "inform": 0, "ing": 0, "inhibit": 0, "inhibitor": 0, "ini": 0, "initi": 0, "initlist": 0, "inplac": 0, "input": 0, "insensit": 0, "insert": 0, "inspect": 0, "instanc": 0, "instanti": 0, "instead": 0, "instread": 0, "int": 0, "integ": 0, "intermedi": 0, "interpol": 0, "interpret": 0, "introspect": 0, "invers": 0, "involv": 0, "ipython": 0, "is_left": 0, "isblunt": 0, "isorf": 0, "issu": 0, "item": 0, "iter": 0, "its": 0, "itself": 0, "iupac": 0, "j": 0, "j2": 0, "jean": 0, "johansson": 0, "join": 0, "jorgensen": 0, "journal": 0, "jseq": 0, "json": 0, "jun": 0, "junction": 0, "just": 0, "k": 0, "kb": 0, "keep": 0, "kei": 0, "kept": 0, "keyword": 0, "klenow": 0, "klenow_frag": 0, "kwarg": 0, "l": 0, "l_": 0, "label": 0, "lactamas": 0, "larger": 0, "last": 0, "lc": 0, "ldseguid": 0, "least": 0, "left": 0, "left_cut": 0, "left_end_posit": 0, "len": 0, "lenght": 0, "length": 0, "length1": 0, "length2": 0, "less": 0, "letter": 0, "levskaya": 0, "lib": 0, "licenc": 0, "licens": 0, "lift": 0, "like": 0, "lim": 0, "limit": 0, "line": 0, "linear": 0, "link": 0, "linux": 0, "list": 0, "list_featur": 0, "lkutrl4": 0, "lkynqhtivh": 0, "loc": 0, "loc1": 0, "loc2": 0, "local": 0, "locat": 0, "location_boundari": 0, "locations_overlap": 0, "locstr": 0, "locu": 0, "log": 0, "log_dir": 0, "loglevel": 0, "logo": 0, "logotyp": 0, "long": 0, "longer": 0, "longest": 0, "look": 0, "loop": 0, "lost": 0, "lower": 0, "lowercas": 0, "lp002422": 0, "lseguid": 0, "lsseguid": 0, "lst": 0, "lyndon": 0, "m": 0, "made": 0, "mai": 0, "main": 0, "maivmgrt": 0, "maivmgru": 0, "maivmgrwkgar": 0, "make": 0, "malform": 0, "manag": 0, "mani": 0, "manual": 0, "map": 0, "map_trace_fil": 0, "mar": 0, "margin": 0, "mass": 0, "match": 0, "max": 0, "max_nod": 0, "maximum": 0, "maxlength": 0, "maxlink": 0, "maxsiz": 0, "mean": 0, "meant": 0, "melt": 0, "memor": 0, "mention": 0, "mer": 0, "merg": 0, "meta": 0, "metalailevalmetglyargtrplysglyalaargt": 0, "metallo": 0, "method": 0, "methyl": 0, "mg": 0, "might": 0, "minimum": 0, "minsiz": 0, "misc": 0, "miscellan": 0, "mit": 0, "mix": 0, "mixtur": 0, "mm": 0, "mmm": 0, "mode": 0, "modif": 0, "modifi": 0, "mol": 0, "mol_typ": 0, "molecul": 0, "molecular": 0, "molecule_typ": 0, "monoval": 0, "most": 0, "mostli": 0, "move": 0, "mung": 0, "mung_bean_nucleas": 0, "must": 0, "mutableseq": 0, "mw": 0, "mwstd": 0, "my_protein": 0, "my_seq": 0, "mydrmlvif": 0, "myemail": 0, "n": 0, "n_cutter": 0, "na": 0, "name": 0, "ncbi": 0, "neb": 0, "nebswebsit": 0, "necessari": 0, "need": 0, "neg": 0, "networkx": 0, "new": 0, "new_dna": 0, "newcom": 0, "next": 0, "nicer": 0, "nih": 0, "nlm": 0, "nm": 0, "nn_tabl": 0, "nnn": 0, "nnnn": 0, "nnnnn": 0, "no_cutt": 0, "node": 0, "nodemap": 0, "non": 0, "none": 0, "normal": 0, "note": 0, "noth": 0, "notion": 0, "now": 0, "nucleas": 0, "nucleotid": 0, "nuclotid": 0, "number": 0, "number_of_cut": 0, "numer": 0, "o": 0, "o3": 0, "o4": 0, "o59": 0, "o6": 0, "o7": 0, "o8": 0, "obj": 0, "object": 0, "obtain": 0, "occur": 0, "occurr": 0, "off": 0, "old": 0, "oligonuceotid": 0, "onc": 0, "once_cutt": 0, "one": 0, "onli": 0, "onlin": 0, "open": 0, "open_cache_fold": 0, "open_config_fold": 0, "open_current_fold": 0, "open_fold": 0, "open_log_fold": 0, "optim": 0, "option": 0, "order": 0, "orf": 0, "orfs_to_featur": 0, "org": 0, "organ": 0, "orient": 0, "origin": 0, "original_loc": 0, "originstr": 0, "other": 0, "otherwis": 0, "out": 0, "output": 0, "outsid": 0, "over": 0, "overhang": 0, "overlap": 0, "ovhg": 0, "own": 0, "p": 0, "p1": 0, "p2": 0, "p3": 0, "pad": 0, "padfirst": 0, "page": 0, "pair": 0, "param": 0, "parament": 0, "paramet": 0, "pars": 0, "parse_prim": 0, "parsegbloc": 0, "part": 0, "part_nam": 0, "pass": 0, "past": 0, "pat": 0, "patent": 0, "path": 0, "pathlib": 0, "pcr": 0, "pcr_prod": 0, "perform": 0, "permanantli": 0, "permut": 0, "pf": 0, "pfu": 0, "pfu_sso7d_program": 0, "php": 0, "phusion": 0, "pierr": 0, "pl": 0, "place": 0, "plain": 0, "plasmid": 0, "plausibl": 0, "pleas": 0, "plu": 0, "po": 0, "point": 0, "polymeras": 0, "pop": 0, "posit": 0, "possibl": 0, "power": 0, "pr": 0, "practic": 0, "preceed": 0, "prefer": 0, "presenc": 0, "present": 0, "press": 0, "pretty_str": 0, "previou": 0, "prime": 0, "primer1": 0, "primer_design": 0, "primerc": 0, "primerdict": 0, "primerlist": 0, "prinmer": 0, "print": 0, "probabl": 0, "process": 0, "prodcod": 0, "produc": 0, "product": 0, "productcod": 0, "program": 0, "properti": 0, "protein": 0, "proteinseqrecord": 0, "protocol": 0, "protrud": 0, "provid": 0, "pth": 0, "pubm": 0, "purpos": 0, "put": 0, "py": 0, "pydna_": 0, "pydna_cached_func": 0, "pydna_cod": 0, "pydna_code_from_list": 0, "pydna_config_dir": 0, "pydna_data_dir": 0, "pydna_email": 0, "pydna_prim": 0, "pydnaseqrecord": 0, "pyl": 0, "pypars": 0, "python": 0, "python2": 0, "python3": 0, "python_packag": 0, "q5": 0, "qht": 0, "qualifi": 0, "quick": 0, "quicker": 0, "quit": 0, "r": 0, "r64": 0, "rais": 0, "randomdna": 0, "randomorf": 0, "randomprot": 0, "randomrna": 0, "rarecodon": 0, "ration": 0, "rbrixtel_at_gmail_dot_com": 0, "rc": 0, "reaction": 0, "read": 0, "read_prim": 0, "readabl": 0, "reason": 0, "rec": 0, "recent": 0, "recognit": 0, "recombin": 0, "record": 0, "ref": 0, "refer": 0, "reflect": 0, "region": 0, "relat": 0, "reli": 0, "rememb": 0, "remov": 0, "render": 0, "repeat": 0, "replac": 0, "report": 0, "repositori": 0, "repr": 0, "repres": 0, "represent": 0, "requir": 0, "resect": 0, "reserv": 0, "respect": 0, "restrict": 0, "restrictionbatch": 0, "restrictionenzym": 0, "result": 0, "return": 0, "retwingl": 0, "rev": 0, "revers": 0, "reverse_compl": 0, "reverse_prim": 0, "rhoad": 0, "right": 0, "right_cut": 0, "right_end_posit": 0, "rml": 0, "rna": 0, "romain": 0, "rotat": 0, "roundtrip": 0, "rowend": 0, "rowstart": 0, "rp": 0, "rstr": 0, "rule": 0, "rychlik": 0, "s2": 0, "s3": 0, "safe": 0, "salt": 0, "saltc": 0, "saltcorr": 0, "same": 0, "sampl": 0, "scanner": 0, "sce": 0, "search": 0, "second": 0, "section": 0, "see": 0, "seguid": 0, "sel": 0, "selenocystein": 0, "self": 0, "selfcomp": 0, "sens": 0, "sensit": 0, "separ": 0, "seq": 0, "seq3": 0, "seq31": 0, "seq_len": 0, "seq_to_open": 0, "seqenc": 0, "seqfeatur": 0, "seqio": 0, "sequec": 0, "sequenc": 0, "sequtil": 0, "set": 0, "set_forward_primer_footprint": 0, "set_reverse_primer_footprint": 0, "sever": 0, "shape": 0, "share": 0, "shaw": 0, "shell": 0, "shell_command_for_editor": 0, "shift": 0, "shift_featur": 0, "shift_loc": 0, "short": 0, "shortest": 0, "should": 0, "show": 0, "side": 0, "sign": 0, "similar": 0, "simpl": 0, "simpleloc": 0, "simpler": 0, "simplifi": 0, "simul": 0, "sinc": 0, "singl": 0, "site": 0, "size": 0, "slc": 0, "slice": 0, "slightli": 0, "slow": 0, "smallest": 0, "smallest_rot": 0, "snippet": 0, "so": 0, "softwar": 0, "some": 0, "someon": 0, "sort": 0, "sorted_featur": 0, "spacer": 0, "specif": 0, "specifi": 0, "spencer": 0, "split": 0, "spyder": 0, "sr": 0, "sso7d": 0, "sta": 0, "stagger": 0, "stamp": 0, "standard": 0, "start": 0, "startcodon": 0, "startposit": 0, "startx1": 0, "startx2": 0, "starty1": 0, "starty2": 0, "stdin": 0, "stdout": 0, "sticki": 0, "sticky3": 0, "sticky5": 0, "stop": 0, "stop_symbol": 0, "stopcodon": 0, "store": 0, "str": 0, "str_": 0, "strand": 0, "stretch": 0, "strict": 0, "string": 0, "stringi": 0, "stringx": 0, "strip_ind": 0, "strip_multilin": 0, "strorbyt": 0, "structur": 0, "stuff": 0, "sub": 0, "subclass": 0, "subfrag": 0, "sublcass": 0, "subsequ": 0, "substitut": 0, "substr": 0, "suggest": 0, "suppli": 0, "support": 0, "surviv": 0, "switch": 0, "symbol": 0, "syn": 0, "sync": 0, "synhtes": 0, "synthet": 0, "system": 0, "t": 0, "t4": 0, "ta": 0, "ta_dbd": 0, "ta_default": 0, "taa": 0, "taaa": 0, "tab": 0, "tac": 0, "tacactcaccgtctatcattatc": 0, "tacactcaccgtctatcattatctactatcgactgtatcatctgatagcac": 0, "tact": 0, "tactggg": 0, "tag": 0, "tagctag": 0, "tagctgactgcacaa": 0, "tail": 0, "take": 0, "taq": 0, "taq_program": 0, "target": 0, "target_tm": 0, "tattctggctgtatc": 0, "tattctggctgtatcgggggtacgatgctatactg": 0, "taxon": 0, "taxonomi": 0, "tccgga": 0, "tcctag": 0, "tcgcatgactcttcttt": 0, "tcggatagtagaacca": 0, "tcggatagtagaaccagagacgt": 0, "tcggatagtagaaccagagacgtaaatata": 0, "tcggatagtagaaccagagacgtaaatatagcgtactgagaagaaa": 0, "tcl": 0, "tclsh": 0, "tclsh8": 0, "tcttggtctctgcatttatat": 0, "tech": 0, "techniqu": 0, "technologi": 0, "tell": 0, "temp": 0, "temperatur": 0, "templat": 0, "temprari": 0, "ter": 0, "term": 0, "termin": 0, "terminal_overlap": 0, "terminal_transferas": 0, "test": 0, "tewydy0ugvgxh3vjnvwgtxoydqa": 0, "texa": 0, "text": 0, "tga": 0, "tgagtagtcgtagtcgtcgtat": 0, "tgatcgtcatgctgactatactat": 0, "tggatcc": 0, "tgtactggtgctgaaccttgtatcaagttgggtgttgacgccattgccccaggtggtcgtttcgtt": 0, "tgtgctgtgctcta": 0, "tgtgctgtgctctattttttattctggctgtatc": 0, "than": 0, "the_exo": 0, "thei": 0, "them": 0, "thermodynam": 0, "thi": 0, "thing": 0, "those": 0, "three": 0, "three_frame_orf": 0, "three_prime_end": 0, "threonin": 0, "through": 0, "throw": 0, "thrown": 0, "time": 0, "titl": 0, "tm_dbd": 0, "tm_default": 0, "tm_func": 0, "tm_neb": 0, "tm_nn": 0, "tm_product": 0, "tmapi": 0, "tmbresluc": 0, "tmf": 0, "tmm_tabl": 0, "tmpdir": 0, "tmr": 0, "to_stop": 0, "togb": 0, "togeth": 0, "toint": 0, "tojson": 0, "tolinear": 0, "tool": 0, "top": 0, "topologi": 0, "tp2jzecm2e3w4yxtrrx09cmka_8": 0, "trace": 0, "traceback": 0, "track": 0, "transcrib": 0, "translat": 0, "treatment": 0, "tri": 0, "trick": 0, "true": 0, "trunc": 0, "try": 0, "tt": 0, "ttaagg": 0, "ttat": 0, "ttc": 0, "ttcaagaa": 0, "ttcttaa": 0, "ttcttaagtt": 0, "ttg": 0, "ttt": 0, "ttta": 0, "tttac": 0, "tttat": 0, "tttatatcgcatgactcttcttt": 0, "tttc": 0, "tttcccc": 0, "tttg": 0, "tttt": 0, "tttttt": 0, "tupl": 0, "turn": 0, "tweak": 0, "twice": 0, "twice_cutt": 0, "two": 0, "txt": 0, "type": 0, "type3": 0, "type5": 0, "type_": 0, "typeerror": 0, "typic": 0, "u": 0, "unassign": 0, "undefined_sequ": 0, "underli": 0, "union": 0, "unique_cutt": 0, "univers": 0, "unk": 0, "unknown": 0, "up": 0, "upper": 0, "uppercas": 0, "url": 0, "urlsaf": 0, "usag": 0, "user": 0, "userlist": 0, "users_email": 0, "usr": 0, "usual": 0, "utah": 0, "v": 0, "val": 0, "valid": 0, "valu": 0, "valueerror": 0, "variabl": 0, "variou": 0, "vector": 0, "veri": 0, "version": 0, "vf": 0, "view": 0, "visual": 0, "vitro": 0, "vivo": 0, "w": 0, "wa": 0, "wai": 0, "watson": 0, "watson_ovhg": 0, "wayn": 0, "we": 0, "weight": 0, "well": 0, "when": 0, "where": 0, "which": 0, "while": 0, "who": 0, "whole": 0, "whose": 0, "wiki": 0, "wikidata": 0, "wikipedia": 0, "window": 0, "without": 0, "wo": 0, "wo2007025016": 0, "word": 0, "work": 0, "would": 0, "wprintgc": 0, "wrap": 0, "wrapstr": 0, "write": 0, "written": 0, "www": 0, "x": 0, "x1b": 0, "xaa": 0, "xle": 0, "xxx": 0, "y": 0, "yet": 0, "you": 0, "z": 0}, "titles": ["Welcome to pydna\u2019s documentation!"], "titleterms": {"": 0, "amplicon": 0, "amplifi": 0, "assembli": 0, "code": 0, "common_sub_str": 0, "content": 0, "contig": 0, "design": 0, "document": 0, "download": 0, "dseq": 0, "dseqrecord": 0, "editor": 0, "exampl": 0, "gel": 0, "genbank": 0, "genbankfil": 0, "genbankfix": 0, "genbankrecord": 0, "get": 0, "help": 0, "how": 0, "indic": 0, "layout": 0, "modul": 0, "more": 0, "myprim": 0, "packag": 0, "parser": 0, "primer": 0, "pydna": 0, "reader": 0, "seqrecord": 0, "sourc": 0, "tabl": 0, "tm": 0, "us": 0, "util": 0, "welcom": 0}}) \ No newline at end of file +Search.setIndex({"docnames": ["CHANGELOG", "README", "example_gallery", "getting_started", "index", "installation", "markdown_notebooks/CRISPR", "markdown_notebooks/Dseq", "markdown_notebooks/Dseq_Features", "markdown_notebooks/Example_CRISPR", "markdown_notebooks/Example_Gibson", "markdown_notebooks/Example_Restriction", "markdown_notebooks/Gibson", "markdown_notebooks/Importing_Seqs", "markdown_notebooks/PCR", "markdown_notebooks/Restrict_Ligate_Cloning", "markdown_notebooks/primer_design", "markdown_notebooks/readme_example", "modules/index", "modules/pydna", "modules/pydna__pretty", "modules/pydna__thermodynamic_data", "modules/pydna_all", "modules/pydna_amplicon", "modules/pydna_amplify", "modules/pydna_assembly", "modules/pydna_codon", "modules/pydna_common_sub_strings", "modules/pydna_conftest", "modules/pydna_contig", "modules/pydna_crispr", "modules/pydna_design", "modules/pydna_download", "modules/pydna_dseq", "modules/pydna_dseqrecord", "modules/pydna_editor", "modules/pydna_fakeseq", "modules/pydna_fusionpcr", "modules/pydna_gateway", "modules/pydna_gel", "modules/pydna_genbank", "modules/pydna_genbankfile", "modules/pydna_genbankfixer", "modules/pydna_genbankrecord", "modules/pydna_goldengate", "modules/pydna_ladders", "modules/pydna_ligate", "modules/pydna_myenzymes", "modules/pydna_myprimers", "modules/pydna_parsers", "modules/pydna_primer", "modules/pydna_readers", "modules/pydna_seq", "modules/pydna_seqrecord", "modules/pydna_sequence_picker", "modules/pydna_threading_timer_decorator_exit", "modules/pydna_tm", "modules/pydna_user_cloning", "modules/pydna_utils"], "filenames": ["CHANGELOG.md", "README.md", "example_gallery.md", "getting_started.md", "index.rst", "installation.rst", "markdown_notebooks/CRISPR.md", "markdown_notebooks/Dseq.md", "markdown_notebooks/Dseq_Features.md", "markdown_notebooks/Example_CRISPR.md", "markdown_notebooks/Example_Gibson.md", "markdown_notebooks/Example_Restriction.md", "markdown_notebooks/Gibson.md", "markdown_notebooks/Importing_Seqs.md", "markdown_notebooks/PCR.md", "markdown_notebooks/Restrict_Ligate_Cloning.md", "markdown_notebooks/primer_design.md", "markdown_notebooks/readme_example.md", "modules/index.rst", "modules/pydna.rst", "modules/pydna__pretty.rst", "modules/pydna__thermodynamic_data.rst", "modules/pydna_all.rst", "modules/pydna_amplicon.rst", "modules/pydna_amplify.rst", "modules/pydna_assembly.rst", "modules/pydna_codon.rst", "modules/pydna_common_sub_strings.rst", "modules/pydna_conftest.rst", "modules/pydna_contig.rst", "modules/pydna_crispr.rst", "modules/pydna_design.rst", "modules/pydna_download.rst", "modules/pydna_dseq.rst", "modules/pydna_dseqrecord.rst", "modules/pydna_editor.rst", "modules/pydna_fakeseq.rst", "modules/pydna_fusionpcr.rst", "modules/pydna_gateway.rst", "modules/pydna_gel.rst", "modules/pydna_genbank.rst", "modules/pydna_genbankfile.rst", "modules/pydna_genbankfixer.rst", "modules/pydna_genbankrecord.rst", "modules/pydna_goldengate.rst", "modules/pydna_ladders.rst", "modules/pydna_ligate.rst", "modules/pydna_myenzymes.rst", "modules/pydna_myprimers.rst", "modules/pydna_parsers.rst", "modules/pydna_primer.rst", "modules/pydna_readers.rst", "modules/pydna_seq.rst", "modules/pydna_seqrecord.rst", "modules/pydna_sequence_picker.rst", "modules/pydna_threading_timer_decorator_exit.rst", "modules/pydna_tm.rst", "modules/pydna_user_cloning.rst", "modules/pydna_utils.rst"], "titles": ["Changelog", "Documentation", "Example gallery", "Getting started", "Pydna", "Installation", "How to Model CRISPR-Cas9 Experiments in pydna", "Representing sequences in pydna", "Working with Features using the Dseqrecord class", "Implementation of Oligonucleotide-based CRISPR-Cas9 toolbox for efficient engineering of Komagataella phaffii", "Example of a Gibson Assembly in pydna", "Example of a Plasmid Restriction/Ligation Cloning", "Gibson Assembly in pydna", "Importing and viewing sequence files in pydna", "How to Perform a Polymerase Chain Reaction (PCR)", "Restriction and Ligation", "Primer design in pydna", "README Example", "Modules", "pydna", "pydna._pretty", "pydna._thermodynamic_data", "pydna.all", "pydna.amplicon", "pydna.amplify", "pydna.assembly", "pydna.codon", "pydna.common_sub_strings", "pydna.conftest", "pydna.contig", "pydna.crispr", "pydna.design", "pydna.download", "pydna.dseq", "pydna.dseqrecord", "pydna.editor", "pydna.fakeseq", "pydna.fusionpcr", "pydna.gateway", "pydna.gel", "pydna.genbank", "pydna.genbankfile", "pydna.genbankfixer", "pydna.genbankrecord", "pydna.goldengate", "pydna.ladders", "pydna.ligate", "pydna.myenzymes", "pydna.myprimers", "pydna.parsers", "pydna.primer", "pydna.readers", "pydna.seq", "pydna.seqrecord", "pydna.sequence_picker", "pydna.threading_timer_decorator_exit", "pydna.tm", "pydna.user_cloning", "pydna.utils"], "terms": {"all": [0, 1, 7, 8, 10, 11, 13, 14, 15, 17, 18, 19, 24, 25, 27, 31, 33, 34, 38, 42, 47, 49, 53, 55, 57, 58], "notabl": 0, "thi": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 22, 23, 24, 25, 27, 29, 31, 33, 34, 35, 40, 42, 47, 48, 49, 50, 51, 52, 53, 55, 56, 58], "project": [0, 5, 10, 11], "document": [0, 3, 6, 7, 8, 10, 11, 12, 13, 14, 15, 22, 33, 40, 55], "file": [0, 3, 5, 7, 8, 10, 11, 14, 15, 17, 19, 22, 32, 33, 34, 35, 40, 42, 47, 48, 49, 51, 53, 55], "The": [0, 1, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 22, 23, 24, 25, 27, 30, 31, 33, 34, 35, 38, 40, 42, 45, 47, 48, 49, 51, 52, 53, 55, 56, 58], "format": [0, 1, 5, 8, 11, 13, 14, 17, 19, 22, 34, 42, 48, 49, 53], "i": [0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 22, 23, 24, 25, 27, 29, 30, 31, 33, 34, 35, 38, 40, 42, 45, 47, 48, 49, 50, 51, 52, 53, 55, 58], "base": [0, 7, 8, 11, 13, 14, 16, 19, 20, 22, 23, 24, 25, 27, 29, 30, 31, 33, 34, 35, 36, 38, 40, 41, 42, 43, 47, 48, 50, 52, 53, 58], "keep": [0, 22, 33, 57], "adher": 0, "semant": 0, "version": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 22, 33, 34, 40, 42], "new": [0, 7, 8, 13, 14, 15, 22, 31, 33, 34, 47, 48, 52, 53, 58], "common_sub_str": [0, 12, 16, 18, 22, 25, 31], "function": [0, 2, 5, 7, 11, 12, 13, 14, 16, 19, 22, 24, 25, 27, 31, 32, 33, 40, 42, 48, 49, 51, 55, 56, 58], "previou": [0, 22, 31], "wa": [0, 8, 22, 27, 33, 42], "implement": [0, 58], "pure": 0, "python": [0, 1, 4, 7, 8, 13, 19, 22, 33, 47, 52, 58], "quit": [0, 22, 33], "fast": 0, "still": 0, "bottleneck": 0, "code": [0, 1, 3, 7, 8, 10, 11, 13, 14, 16, 22, 27, 33, 34, 42, 48, 52, 53, 56, 58], "thank": [0, 20], "louisabraham": 0, "we": [0, 3, 7, 8, 10, 12, 14, 15, 16, 17, 22, 31, 33, 34, 52], "now": [0, 1, 7, 13, 17, 52, 53], "have": [0, 1, 5, 8, 9, 10, 13, 14, 16, 19, 22, 31, 33, 34, 48, 52, 58], "pydivsufsort": 0, "which": [0, 1, 3, 5, 6, 7, 8, 11, 12, 14, 15, 16, 17, 19, 22, 30, 31, 33, 34, 42, 47, 52, 53], "provid": [0, 4, 7, 8, 12, 13, 14, 16, 19, 22, 23, 24, 30, 32, 33, 34, 35, 40, 42, 48, 49, 50, 51, 55, 56], "bind": [0, 14, 23, 56], "libdivsufsort": 0, "veri": [0, 8, 15, 16, 22, 31, 40], "suffix": 0, "arrai": 0, "construct": [0, 4, 8, 10, 11, 22, 25, 31, 38, 40], "algorithm": [0, 12, 16, 22, 25, 31, 58], "written": [0, 22, 27, 34], "c": [0, 11, 17, 22, 25, 30, 31, 33, 34, 53, 55, 56], "As": [0, 13, 22, 33, 52], "consequ": [0, 7], "assembli": [0, 2, 3, 4, 9, 11, 17, 18, 19, 22, 29, 31, 38, 44], "much": [0, 16], "faster": [0, 22, 31], "poetri": [0, 1], "us": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 22, 23, 24, 25, 29, 30, 31, 33, 34, 35, 38, 40, 45, 48, 49, 51, 52, 53, 55, 56, 58], "build": [0, 1, 11], "pydna": [0, 1, 2, 3, 5, 8, 9, 11, 15, 17, 18], "remov": [0, 5, 13, 15, 22, 33], "setup": 0, "py": [0, 1, 16, 22, 27, 28, 33, 42], "also": [0, 3, 5, 6, 8, 11, 13, 14, 15, 16, 19, 22, 24, 25, 33, 34, 40, 52, 58], "do": [0, 1, 7, 16, 17, 22, 31, 40, 42, 48, 52, 55], "anaconda": 0, "packag": [0, 4, 6, 14, 22, 25, 27, 33, 38, 42, 47], "anymor": 0, "conda": 0, "got": 0, "too": [0, 1, 14], "slow": [0, 22, 31, 33], "work": [0, 3, 10, 11, 12, 13, 15, 19, 22, 33, 34], "plan": [0, 4, 15], "updat": [0, 1], "bioconda": 0, "recip": 0, "anyon": 0, "can": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 22, 24, 25, 30, 31, 33, 34, 40, 42, 45, 48, 49, 52, 53, 58], "make": [0, 1, 2, 4, 7, 8, 9, 10, 12, 14, 15, 16, 19, 22, 31], "grayskul": 0, "exampl": [0, 3, 6, 7, 8, 9, 12, 13, 14, 15, 16, 22, 23, 24, 25, 27, 29, 31, 33, 34, 35, 40, 41, 42, 43, 48, 52, 53, 58], "dseq": [0, 3, 9, 10, 12, 14, 15, 18, 22, 23, 29, 30, 34, 41, 43, 53, 58], "dseqrecord": [0, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 23, 24, 25, 29, 30, 31, 33, 35, 38, 41, 42, 43, 49, 51, 53, 54, 58], "onli": [0, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 22, 24, 27, 31, 33, 34, 51, 56], "take": [0, 10, 12, 13, 14, 16, 22, 31, 40, 42, 55, 56], "circular": [0, 8, 9, 10, 11, 12, 13, 14, 17, 22, 23, 24, 25, 29, 30, 31, 33, 34, 38, 42, 53, 58], "argument": [0, 7, 12, 13, 14, 16, 22, 24, 31, 33, 35, 52, 58], "true": [0, 7, 8, 10, 12, 15, 16, 17, 22, 30, 31, 33, 34, 42, 49, 51, 52, 53, 56, 58], "fals": [0, 9, 15, 22, 31, 33, 34, 42, 49, 52, 53, 56, 58], "indic": [0, 7, 14, 16, 19, 22, 33, 34, 48, 52, 53], "topologi": [0, 9, 10, 13, 22, 30, 33, 34, 49, 58], "previous": [0, 14], "linear": [0, 7, 8, 9, 11, 13, 14, 15, 17, 22, 23, 25, 29, 30, 31, 33, 34, 38, 40, 53, 57, 58], "accept": [0, 22, 24, 25, 35, 38, 48, 58], "littl": 0, "featur": [0, 3, 7, 9, 10, 11, 12, 13, 14, 16, 17, 22, 24, 34, 40, 42, 53, 58], "me": 0, "made": [0, 1, 6, 10, 11, 22, 31, 33], "init": [0, 9], "method": [0, 5, 10, 11, 12, 13, 14, 15, 16, 19, 20, 22, 23, 25, 33, 34, 38, 40, 48, 52, 53], "both": [0, 7, 11, 22, 31, 33, 52, 57], "class": [0, 6, 10, 11, 12, 13, 14, 15, 17, 19, 20, 22, 23, 24, 25, 29, 30, 31, 33, 34, 35, 36, 38, 40, 41, 43, 48, 50, 52, 53, 58], "complex": [0, 4], "violat": 0, "zen": 0, "There": [0, 15, 22, 31, 33, 34, 42], "should": [0, 1, 6, 8, 10, 14, 15, 19, 22, 24, 25, 31, 40, 42, 52, 58], "one": [0, 6, 7, 8, 10, 12, 13, 14, 17, 22, 23, 24, 31, 33, 34, 42, 49, 51, 58], "prefer": [0, 19], "could": [0, 8, 12, 13, 22, 24, 33, 34, 52], "break": 0, "henc": [0, 13], "bump": 0, "major": 0, "number": [0, 7, 8, 9, 10, 11, 12, 15, 22, 25, 33, 34, 42, 48, 52, 53], "black": 0, "suggest": [0, 56], "git": [0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17], "pre": [0, 5, 10, 12], "commit": 0, "hook": 0, "so": [0, 1, 3, 5, 7, 8, 13, 14, 15, 16, 22, 31, 34, 40, 42, 52, 53, 55], "more": [0, 1, 12, 13, 14, 16, 17, 22, 24, 30, 33, 34, 42, 49, 58], "standard": [0, 22, 33, 52, 53, 58], "cach": [0, 19, 22, 40, 58], "download": [0, 5, 18, 19, 22, 40, 58], "genbank": [0, 3, 5, 7, 8, 9, 10, 13, 14, 15, 17, 18, 19, 22, 34, 42, 48, 49, 53], "sever": [0, 5, 8, 22, 24, 25, 38], "someth": 0, "saw": [0, 16], "remain": 0, "reduc": 0, "load": [0, 9], "server": [0, 1, 11, 16], "speed": 0, "thing": [0, 1, 8, 40], "up": [0, 5, 19, 42, 56], "environ": [0, 19, 22, 40, 47, 48], "variabl": [0, 7, 15, 19, 22, 40, 47, 48], "pydna_assembly_limit": 0, "set": [0, 16, 19, 22, 25, 31, 33, 34, 40, 53, 56, 58], "execut": [0, 4], "time": [0, 10, 22, 33], "second": [0, 7, 15, 22, 31, 55], "default": [0, 1, 5, 8, 12, 14, 19, 22, 24, 31, 33, 34, 40, 48, 52, 53, 56], "assemble_linear": [0, 9, 16, 22, 25, 31], "assemble_circular": [0, 10, 12, 16, 17, 22, 25, 31], "might": [0, 7, 8, 10, 14, 22, 33, 52], "better": 0, "wai": [0, 3, 7, 8, 13, 15, 22, 33, 34, 40, 48], "find": [0, 1, 3, 7, 8, 11, 12, 14, 16, 19, 22, 27, 33, 34, 48, 56], "out": [0, 2, 7, 8, 9, 10, 11, 42, 55], "an": [0, 1, 2, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 19, 22, 24, 25, 27, 31, 33, 34, 35, 38, 40, 42, 49, 52, 53, 55, 58], "like": [0, 1, 4, 7, 8, 9, 10, 11, 14, 16, 22, 31, 33, 52, 58], "long": [0, 1, 8, 16, 22, 31, 33], "usual": [0, 5, 22, 33, 52], "when": [0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 22, 31], "ar": [0, 1, 2, 3, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 19, 22, 24, 25, 31, 33, 34, 35, 38, 40, 42, 45, 48, 49, 52, 53, 58], "mani": [0, 4, 8, 22, 31], "path": [0, 1, 13, 14, 15, 22, 23, 25, 34, 35, 38, 41, 48, 49], "through": [0, 3, 6, 8, 11, 14, 25, 31, 38], "graph": [0, 22, 25, 29, 38], "01": [0, 8, 11, 14, 17, 22, 40], "log": [0, 19], "onelin": 0, "v5": 0, "a03c2a06a20afef95415f5f1786df2f71e921fd0": 0, "a03c2a06a2": 0, "head": 0, "dev_bjorn": [0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17], "origin": [0, 2, 7, 10, 11, 13, 14, 17, 22, 27, 34, 40, 42, 53, 57], "master": 0, "c7ce8582fa": 0, "uppd": 0, "action": [0, 1, 55], "ca4c969c28": 0, "fix": [0, 5, 42], "test": [0, 22, 40, 52], "comment": [0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 22, 42, 53], "unneed": 0, "6539a1f076": 0, "probabl": [0, 22, 33], "need": [0, 5, 6, 7, 8, 12, 14, 22, 31, 33, 35], "futur": [0, 16], "c933ca5a7b": 0, "c32fc5c9be": 0, "dsecrecord": 0, "70ced77d24": 0, "min_rot": 0, "from": [0, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 19, 22, 23, 24, 25, 27, 29, 31, 33, 34, 40, 41, 42, 43, 45, 49, 51, 52, 53, 55, 56, 58], "2cc4edbc68": 0, "w": [0, 11, 22, 40, 52, 58], "4888db36f3": 0, "0bf9fbd993": 0, "precommit": 0, "74e3e1c229": 0, "fromat": 0, "f78dcb2fdd": 0, "lock": 0, "769dc98d89": 0, "mergeexp": 0, "merg": [0, 42, 55], "d242459fc5": 0, "speed_up_dseqrecord": 0, "try": [0, 7, 22, 33, 52], "ignor": [0, 22, 48], "prof": 0, "dir": [0, 8, 53], "bef4f6800c": 0, "edit": [0, 1, 6, 9, 19, 22, 35, 40], "e29ac49f8": 0, "prep": 0, "dundermethod": 0, "2acbc5033c": 0, "__copy__": 0, "__deepcopy__": 0, "9916a62c93": 0, "pstat": 0, "script": [0, 1, 45], "0b41671c1c": 0, "mod": 0, "9f060a0dea": 0, "cbd4773605": 0, "back": [0, 15, 22, 33, 42, 52], "iter": [0, 13, 22, 24, 33, 34, 48, 49, 58], "9b93d8988c": 0, "properti": [0, 8, 22, 24, 31, 33, 34, 42, 48, 50, 53], "798899569a": 0, "profil": 0, "9b5e7a6c13": 0, "b1a8771323": 0, "add": [0, 1, 5, 8, 9, 14, 16, 17, 19, 22, 31, 34, 53, 56], "profilig": 0, "ae93cb340f": 0, "dep": 0, "6f3f39398a": 0, "pass": [0, 6, 7, 13, 14, 16, 42, 53], "modifi": [0, 7, 8, 14, 22, 31, 33, 52, 55], "694ea1b5d5": 0, "smallest_rot": [0, 58], "c57f5cb3c5": 0, "profin": 0, "error": [0, 10, 11], "f82a5676d6": 0, "9d18ed4c03": 0, "gitignor": 0, "28d8e98fd8": 0, "separ": [0, 19, 25, 38, 53], "doctest": 0, "dacf9e1f3b": 0, "whitespac": 0, "6513a0bf85": 0, "cruft": 0, "c4a0265a12": 0, "3c11115871": 0, "01999514c2": 0, "track": [0, 22, 33], "6eb2154fff": 0, "reformat": 0, "4e08cb910d": 0, "switch": [0, 22, 33, 52], "docstr": [0, 1, 14, 19, 20, 22, 26, 29, 30, 33, 34, 35, 36, 37, 39, 43, 46, 48, 49, 52, 53, 54, 58], "014b40e20d": 0, "reorgan": 0, "190541a51": 0, "pyproject": 0, "toml": 0, "4c9d27042f": 0, "pytest": 0, "env": [0, 22, 42], "733d83782a": 0, "run_test": 0, "1db40a1bc7": 0, "experi": [0, 4, 9, 15], "9ac4f4c6f2": 0, "b867cd2039": 0, "old": [0, 22, 34], "35f8eb03d1": 0, "4b4bafb272": 0, "badg": [0, 3], "f496be825b": 0, "url": [0, 5, 9, 10, 22, 34, 52, 53], "a16e7a004d": 0, "uppdat": 0, "5190177811": 0, "76a5930791": 0, "timeout": 0, "var": 0, "3cf0bba9bc": 0, "limit": [0, 9, 10, 12, 16, 17, 22, 24, 25, 27, 31, 33, 34, 37, 53, 55, 58], "cd76b4a123": 0, "f4ef97dbc0": 0, "cheat": 0, "sheet": 0, "c0f111c67a": 0, "target": [0, 6, 9, 11, 16, 22, 31], "branch": 0, "pull": 0, "req": 0, "f0385b7981": 0, "5252df3cf4": 0, "wrapt": 0, "decor": [0, 55], "5d46b153e6": 0, "upd": 0, "436ae27381": 0, "cython": 0, "notebook": [0, 3, 7, 8, 10, 11, 13, 16, 17, 20], "ce9a919e15": 0, "2ce61667d": 0, "8be47b5463": 0, "stuff": 0, "75ea5dbee1": 0, "http": [0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 22, 27, 33, 34, 35, 42, 49, 52, 53, 56, 58], "github": [0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19, 27, 42, 58], "com": [0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19, 22, 27, 40, 42, 52, 53, 56, 58], "bjornfjohansson": [0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17], "5c2ec77539": 0, "request": [0, 5, 16], "106": 0, "dependabot": 0, "pip": [0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17], "coverag": [0, 10], "b15fd0cbb4": 0, "8e529ff1c7": 0, "cash": 0, "some": [0, 2, 4, 8, 9, 14, 16, 22, 31, 42, 53], "8dd2ca19a0": 0, "bugfix": 0, "hardcod": 0, "strand": [0, 7, 8, 22, 30, 33, 34, 40, 42, 43, 49, 51, 52, 53, 57, 58], "dacb024944": 0, "a3c3791917": 0, "74d3850352": 0, "94": [0, 11], "ipython": [0, 9, 19, 20, 52, 53], "66f20aa195": 0, "30d109bbb2": 0, "95": [0, 56], "biopython": [0, 5, 7, 13, 16, 22, 23, 33, 34, 42, 47, 49, 50, 52, 53, 58], "81": 0, "bd0ef21a96": 0, "80": [0, 17], "879c81ccf7": 0, "96": 0, "pyqt5": 0, "5482b0788f": 0, "813ac07394": 0, "gel": [0, 4, 5, 10, 18, 19, 45], "imag": [0, 4, 5, 9, 45], "63de396a5f": 0, "1eb18bc709": 0, "c6d1fbda8c": 0, "link": [0, 1, 8, 11, 22, 34], "ffda81e24": 0, "f8896ab27f": 0, "readm": [0, 16], "md": 0, "546f357997": 0, "98b6eaa55f": 0, "improv": 0, "186dbff025": 0, "slice": [0, 22, 33, 34, 52], "genbankrecord": [0, 18, 22, 40], "10e79ccaba": 0, "tabl": [0, 19, 22, 33, 52, 53], "c45913bee0": 0, "593b1f4dfb": 0, "simplifi": [0, 22, 24], "9800fdf2bb": 0, "9276a054fa": 0, "start": [0, 7, 9, 11, 16, 19, 22, 27, 31, 33, 34, 43, 52, 53], "figur": [0, 7, 9, 14, 16, 17, 22, 23, 29, 31, 34], "amplicon": [0, 11, 14, 16, 17, 18, 22, 24, 31, 50, 56], "0cb741bf84": 0, "pcr": [0, 3, 4, 7, 8, 10, 11, 12, 17, 19, 22, 23, 24, 25, 31, 56], "a6fda7a276": 0, "c1ec911a22": 0, "5b53ffc9ff": 0, "raw": 0, "77f2121d76": 0, "fbcdb0bea4": 0, "b9ada45f20": 0, "a16e7a004da1292f33db5a9a48f19c61b415dff6": 0, "end": [0, 1, 7, 8, 9, 11, 14, 15, 16, 22, 27, 33, 34, 52, 53], "modul": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19, 22, 23, 24, 27, 31, 33, 34, 35, 40, 42, 45, 47, 50, 56], "myprimers_gdoc": 0, "store": [0, 7, 8, 13, 15, 19, 22, 33, 34, 35, 40, 48, 53], "primer": [0, 3, 4, 10, 11, 12, 17, 18, 19, 22, 23, 24, 31, 48, 51, 56], "googl": [0, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19, 27], "doc": [0, 1, 3, 19, 22, 33, 56], "fakeseq": [0, 18, 45], "dna": [0, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 22, 25, 29, 30, 31, 33, 34, 35, 36, 38, 40, 42, 45, 49, 51, 52, 56, 58], "ladder": [0, 10, 18], "contain": [0, 6, 7, 8, 11, 13, 14, 16, 17, 19, 22, 23, 24, 27, 31, 33, 34, 35, 42, 47, 48, 49, 51, 56, 58], "molecular": [0, 7, 11, 12, 14, 15, 19, 22, 33, 34], "weight": [0, 22, 33, 34, 58], "marker": [0, 1, 3, 11], "myprim": [0, 18, 22, 31], "sorted_featur": [0, 53], "seqrecord": [0, 5, 7, 13, 18, 22, 23, 24, 34, 35, 49, 50, 51, 52, 58], "lc": [0, 53], "l": [0, 11, 38, 53], "ongest": 0, "ommon": 0, "": [0, 6, 7, 8, 9, 11, 13, 14, 15, 16, 17, 19, 22, 31, 33, 34, 42, 52, 54, 55, 58], "ubstr": 0, "78": 0, "requir": [0, 5, 8, 12, 13, 22, 24, 31], "txt": [0, 19], "check_my_prim": 0, "releas": 0, "bug": [0, 19], "stamp": [0, 53], "cseguid": [0, 53], "locat": [0, 8, 11, 13, 14, 16, 17, 19, 22, 34, 40, 42, 47, 48, 58], "certain": 0, "test_marker_replacement_on_plasmid": 0, "test_module_assembli": 0, "src": [0, 1, 16], "layout": 0, "how": [0, 1, 3, 7, 8, 9, 13, 15, 17, 22, 31], "melt": [0, 14, 17, 56], "temperatur": [0, 14, 17, 56], "calcul": [0, 5, 22, 31, 34, 45, 56], "conftest": [0, 18], "comat": 0, "mysequ": 0, "upper": [0, 7, 22, 33, 34], "lower": [0, 7, 22, 33, 34, 56], "especi": [0, 4, 22, 24], "easili": [0, 7, 8], "rerun": 0, "after": [0, 1, 7, 8, 15, 22, 33, 34], "modif": [0, 42], "templat": [0, 14, 16, 17, 22, 23, 24, 31, 33, 50, 52], "first": [0, 3, 7, 11, 13, 14, 15, 16, 22, 31, 33, 42, 51, 52], "alpha": 0, "_multiply_circular": 0, "import": [0, 3, 6, 7, 8, 10, 11, 12, 14, 15, 16, 17, 19, 22, 23, 24, 25, 27, 29, 31, 33, 34, 35, 40, 41, 42, 43, 52, 53, 58], "main": [0, 7, 19, 55], "namespac": [0, 22], "finer": 0, "control": [0, 13, 22, 31, 33], "over": [0, 8, 13, 58], "assembly_frag": [0, 19, 22, 31], "creat": [0, 1, 6, 7, 8, 9, 12, 13, 15, 16, 17, 22, 33, 34, 52, 53], "tail": [0, 19, 22, 24, 31, 50], "_": [0, 22, 34, 52, 53], "delete_cach": 0, "simplic": 0, "design": [0, 3, 4, 10, 11, 12, 17, 18, 19, 22], "print_primer_pair": 0, "cloning_prim": 0, "integration_prim": 0, "assembly_prim": 0, "compat": [0, 7, 8, 22, 31, 33, 34, 42, 53], "simpler": [0, 24], "api": [0, 1, 13, 22, 31], "gibson": [0, 2, 3, 4, 17, 19, 22, 25, 31], "see": [0, 1, 3, 5, 8, 9, 14, 16, 17, 19, 22, 23, 31, 33, 34, 40, 42, 51, 58], "allow": [0, 6, 13, 14, 22, 31, 49], "subsequ": [0, 22, 33], "edg": [0, 16, 22, 25, 33, 38], "sequenc": [0, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14, 15, 16, 17, 19, 22, 24, 25, 30, 31, 33, 34, 35, 38, 40, 42, 44, 48, 49, 50, 51, 52, 53, 56, 58], "messag": [0, 11], "write": [0, 8, 22, 34], "split": [0, 22, 31], "logic": 0, "smaller": 0, "chunk": 0, "same": [0, 1, 7, 11, 17, 22, 24, 31, 33, 34, 40, 42, 52, 53, 58], "amplifi": [0, 10, 11, 14, 16, 17, 18, 19, 22, 23, 31], "less": [0, 10, 11, 42], "getcach": 0, "return": [0, 7, 11, 12, 13, 14, 15, 22, 23, 24, 27, 29, 31, 33, 34, 42, 48, 49, 50, 51, 52, 53, 56, 58], "pydna_cach": 0, "nocach": 0, "refresh": 0, "repr": [0, 22, 33], "jupyt": [0, 20], "One": [0, 7, 22, 31, 58], "run": [0, 1, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17], "part": [0, 14, 19, 22, 23, 24, 30, 31, 33, 34, 52, 53], "suit": 0, "nbval": 0, "parse_prim": [0, 19, 22, 48, 49, 51], "list": [0, 6, 7, 8, 10, 12, 13, 14, 15, 16, 19, 20, 22, 24, 25, 27, 31, 33, 34, 38, 42, 45, 46, 48, 49, 52, 53, 58], "object": [0, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 22, 23, 24, 25, 31, 33, 34, 35, 36, 38, 40, 45, 48, 49, 51, 52, 53, 58], "read_prim": [0, 19, 22, 51], "read_url": 0, "parse_url": 0, "sinc": [0, 7, 8, 10, 15, 16, 22, 31], "thei": [0, 3, 7, 8, 16, 17, 22, 31, 34, 40, 56, 58], "riski": 0, "download_text": [0, 5, 19, 22], "combin": [0, 22, 33, 57], "read": [0, 8, 9, 10, 13, 19, 22, 24, 34, 42, 48, 49, 51, 53], "pars": [0, 8, 10, 11, 13, 14, 15, 19, 22, 34, 42, 49, 51], "intermedi": [0, 4, 22, 42], "text": [0, 5, 22, 23, 29, 32, 47, 48, 49, 56], "inspect": [0, 19], "genbankfix": [0, 5, 18, 22], "appli": [0, 7, 12, 14, 15], "necessari": [0, 10, 11, 22, 33], "salvag": 0, "broken": [0, 19, 42], "gbtext_clean": [0, 5, 22, 42], "readprim": 0, "shortcut": 0, "kei": [0, 8, 9, 10, 11, 13, 19, 42, 48], "open_cach": 0, "open_cache_fold": [0, 19], "open": [0, 3, 8, 19, 22, 33, 35, 48, 53], "folder": [0, 1, 3, 19, 22, 48], "browser": [0, 3], "level": 0, "info": [0, 7, 10, 16], "possibl": [0, 7, 17, 19, 22, 33, 58], "specifi": [0, 7, 8, 14, 22, 31, 33, 47, 48, 52], "ap": [0, 19, 22, 24, 35, 42, 53], "plasmid": [0, 2, 6, 7, 8, 10, 15, 22, 31, 34, 35], "editor": [0, 18, 22, 24, 53], "biologylab": [0, 35], "utah": [0, 35], "edu": [0, 10, 35], "jorgensen": [0, 35], "wayn": [0, 35], "These": [0, 3, 5, 7, 19, 22, 31, 45, 52], "ini": [0, 19, 22, 40, 47, 48], "user_config_dir": 0, "each": [0, 1, 8, 10, 12, 16, 19, 22, 25, 29, 31, 33, 34, 58], "platform": 0, "appdir": 0, "linux": [0, 19], "config": 0, "invis": 0, "band": 0, "larg": [0, 10, 11], "record": [0, 8, 12, 13, 14, 15, 17, 22, 23, 29, 34, 40, 41, 43, 50], "were": 0, "complet": [0, 4, 10, 11, 12, 13, 15, 19, 42, 52], "simul": [0, 4, 5, 6, 7, 9, 12, 17, 19, 22, 23, 24, 33], "shelv": 0, "doe": [0, 1, 8, 10, 15, 22, 33, 34, 40, 48, 52], "under": [0, 5, 8, 52], "maco": 0, "condit": [0, 55], "tri": [0, 56], "solv": 0, "extens": 0, "two": [0, 2, 7, 8, 9, 10, 11, 12, 14, 15, 16, 22, 23, 31, 33, 42, 49, 51, 56, 58], "pydna_data_dir": [0, 19], "encod": [0, 11, 22, 34, 52, 53], "string": [0, 7, 8, 14, 15, 20, 22, 23, 24, 31, 33, 34, 35, 40, 42, 48, 49, 51, 52, 53, 56, 58], "instead": [0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 22, 31, 33, 34, 48, 52, 53], "unicod": 0, "popen": 0, "critic": [0, 14], "seguid": [0, 22, 31, 33, 34, 52, 53], "checksum": [0, 22, 33, 34, 52, 53], "safe": [0, 22, 34, 52, 53], "name": [0, 8, 9, 10, 11, 12, 14, 15, 17, 19, 22, 29, 31, 33, 34, 42, 48, 52, 53], "locu": [0, 8, 11, 13, 14, 17, 22, 34, 40, 42, 53], "alia": [0, 53], "access": [0, 8, 9, 10, 11, 13, 14, 17, 22, 34, 40, 42, 43, 48, 53], "id": [0, 8, 9, 10, 11, 12, 14, 15, 17, 19, 22, 31, 34, 48, 53], "definit": [0, 8, 11, 13, 14, 17, 22, 34, 40, 42, 53], "descript": [0, 4, 8, 9, 10, 11, 12, 15, 17, 22, 24, 34, 53], "product": [0, 8, 9, 10, 11, 12, 13, 16, 17, 22, 24, 31, 34, 56], "identifi": [0, 22, 48, 52, 58], "proxi": 0, "handl": [0, 3, 19, 22, 24, 30, 33, 34, 42], "current": [0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19], "empti": [0, 22, 33, 34, 42, 49, 58], "datadir": 0, "environment": [0, 19, 40], "pydna_dna_dir": 0, "initi": [0, 22, 25, 34, 38, 45], "longer": [0, 22, 25, 27, 33, 55], "than": [0, 7, 10, 16, 19, 22, 24, 25, 27, 31, 34, 55], "charact": [0, 7, 22, 34, 52, 53, 58], "truncat": [0, 15], "char": 0, "warn": 0, "issu": [0, 19], "na": [0, 56], "eq": [0, 22, 58], "ne": 0, "defin": [0, 7, 8, 14, 22, 33, 42], "overwrit": [0, 8], "filenam": [0, 22, 34, 53, 58], "primari": [0, 9], "look": [0, 7, 8, 9, 17, 22, 33], "directori": [0, 19, 35], "ipynb_import": 0, "window": [0, 19], "data": [0, 10, 15, 16, 22, 30, 33, 34, 42, 49, 51, 52, 56], "map": [0, 53], "public": [0, 7], "pretty_str": [0, 20, 52, 53], "beautifi": 0, "output": [0, 1, 7, 12, 14, 20, 52, 53, 58], "shell": [0, 19, 20, 52, 53], "short": [0, 22, 24, 31, 34, 40, 52], "linker": 0, "incorpor": [0, 22, 31], "desqrecord": 0, "sync": [0, 17, 19, 22, 34], "four": [0, 22, 33], "shelf": 0, "user": [0, 10, 14, 27, 57], "applic": [0, 8], "o": [0, 11, 19, 58], "specif": [0, 3, 6, 7, 8, 11, 14, 15, 16, 22, 33], "pypi": 0, "org": [0, 10, 19, 22, 33, 34, 49], "nopcr": 0, "cut": [0, 2, 3, 6, 9, 11, 16, 17, 19, 22, 31, 33, 34], "preserv": 0, "networkx": [0, 25, 38], "anneal": [0, 14, 17, 19, 22, 23, 24, 33, 56, 57], "deal": [0, 7, 42, 55], "ambigu": [0, 7, 16, 52, 58], "codon": [0, 5, 8, 18, 52], "r": [0, 2, 10, 11, 22, 38, 40, 42, 58], "A": [0, 4, 7, 8, 11, 13, 14, 15, 22, 23, 24, 25, 33, 34, 35, 38, 45, 52, 53, 55, 58], "g": [0, 1, 7, 8, 11, 12, 13, 14, 15, 22, 25, 30, 31, 33, 34, 52, 58], "In": [0, 6, 7, 8, 9, 14, 15, 16, 19, 22, 31, 52], "result": [0, 11, 14, 15, 19, 22, 27, 31, 33, 40, 42, 52], "nucleotid": [0, 7, 8, 9, 10, 11, 16, 19, 22, 33, 34, 40, 52], "e": [0, 1, 7, 8, 11, 13, 14, 15, 22, 31, 34, 52, 58], "correspond": [0, 7], "add_featur": [0, 17, 22, 34, 53], "other": [0, 1, 7, 11, 12, 15, 22, 31, 34, 40, 49, 53, 55, 58], "input": [0, 13, 14, 58], "produc": [0, 15, 16, 17, 22, 33, 42], "gain": 0, "three": [0, 7, 15, 16, 19, 22, 31, 33, 52, 58], "isorf": [0, 53], "list_featur": [0, 8, 53], "ascii": [0, 19, 22, 29, 31, 53], "extract_featur": [0, 22, 34, 53], "extract": [0, 8, 13, 16, 22, 31, 33, 34, 53], "form": [0, 22, 24, 25, 31, 33, 34, 38], "primer_design": [0, 3, 11, 14, 16, 17, 19, 22, 31], "util": [0, 5, 18, 22, 53], "subclass": [0, 5, 7, 14, 16, 17, 22, 24, 30, 33, 34, 50, 52, 53], "compound": [0, 8], "fit": [0, 22, 31, 55], "62": 0, "seqfeatur": [0, 8, 11, 16, 22, 34, 53], "dict": [0, 42, 48, 52, 58], "span": 0, "behaviour": [0, 13], "substr": [0, 22, 27, 29, 33, 53], "slightli": [0, 22, 33], "differ": [0, 7, 14, 16, 22, 33, 34], "permit": [0, 55], "instal": [0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17], "sourc": [0, 3, 8, 9, 10, 11, 13, 14, 17, 20, 22, 23, 24, 25, 27, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 58], "without": [0, 6, 7, 8, 14, 19, 22, 33, 55], "compil": 0, "clean": [0, 5, 42], "renam": 0, "drecord": 0, "consist": 0, "seq": [0, 7, 8, 9, 11, 14, 16, 17, 18, 22, 23, 24, 25, 29, 30, 31, 33, 34, 41, 42, 43, 53, 56, 58], "keyword": [0, 8, 9, 10, 11, 13, 14, 17, 22, 34, 40, 42, 53, 58], "d": [0, 11, 22, 33, 34, 42, 49, 51, 55], "while": [0, 8, 10, 22, 24, 33, 34], "built": [1, 19], "sphinx": 1, "numpi": [1, 5], "below": [1, 2, 5, 7, 8, 12, 13, 14, 19, 22, 31, 33, 34, 40, 42, 48, 51], "command": [1, 5, 22, 24, 35], "local": [1, 3, 19, 22, 33, 49, 51], "chang": [1, 7, 13, 16, 19, 53, 58], "depend": 1, "group": [1, 19], "live": 1, "127": 1, "0": [1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 22, 25, 27, 30, 31, 33, 34, 36, 45, 50, 53, 56], "1": [1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 22, 27, 31, 33, 34, 35, 38, 40, 42, 43, 45, 49, 52, 53, 56, 58], "8000": 1, "autobuild": 1, "watch": 1, "_build": 1, "html": 1, "you": [1, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 19, 22, 31, 33, 40, 52], "alwai": [1, 8, 16, 22, 31, 40], "relev": [1, 2, 9], "page": [1, 6, 8, 10, 12, 14, 15], "etc": [1, 3, 7, 8, 15, 16], "To": [1, 8, 12, 13, 14, 15, 16, 19, 22, 31, 33], "forc": 1, "delet": [1, 2], "exist": [1, 8, 12, 22, 31, 34], "rebuild": 1, "rm": 1, "rf": [1, 36, 45], "equival": [1, 22, 31, 33], "galleri": [1, 3], "rst": 1, "refer": [1, 7, 8, 9, 10, 11, 12, 13, 14, 15, 19, 22, 33, 34, 35, 40, 49, 52, 53], "toctre": 1, "direct": [1, 6, 7, 9, 10, 11, 13, 22, 24, 53], "index": [1, 5, 7, 13, 14, 15, 22, 33, 52, 53], "autogen_doc": 1, "sh": 1, "befor": [1, 8, 11, 16, 19, 35], "If": [1, 5, 7, 8, 14, 15, 16, 17, 19, 22, 24, 31, 33, 34, 49, 52, 58], "want": [1, 5, 7, 8, 9, 14, 16, 17], "reproduc": [1, 3], "cd": [1, 8, 11, 13, 16, 22, 33, 52], "bash": 1, "It": [1, 8, 22, 33, 40, 52], "convert": [1, 13], "markdown_notebook": 1, "exclud": [1, 8, 52], "For": [1, 7, 8, 9, 12, 14, 15, 16, 22, 33, 52, 53, 56], "instanc": [1, 8, 14, 15, 16, 22, 31], "maxdepth": 1, "caption": 1, "pydna__pretti": 1, "And": 1, "individu": 1, "submodul": 1, "automodul": 1, "member": 1, "undoc": 1, "show": [1, 2, 7, 10, 12, 13, 15, 17, 53], "inherit": 1, "avoid": 1, "maintain": [1, 8], "multipl": [1, 6, 8, 12, 13, 14, 15, 52], "fragment": [1, 2, 10, 11, 12, 16, 17, 22, 25, 29, 31, 33, 37, 38, 45, 46], "what": [1, 7, 16, 52], "between": [1, 7, 8, 12, 16, 17, 22, 27, 31, 33, 34, 45, 53], "markdown": 1, "therefor": [1, 8, 9], "render": [1, 22, 33], "parser": [1, 8, 10, 11, 13, 14, 15, 18, 19, 22, 34, 42], "myst_pars": 1, "sphinx_": 1, "getting_start": 1, "note": [1, 6, 7, 8, 10, 11, 12, 13, 14, 16, 22, 24, 31, 33, 34, 40, 51, 52, 53, 58], "present": [1, 3, 7, 22, 31, 57], "automat": [1, 5, 8, 19, 22, 33], "example_gibson": [1, 2, 12], "ipynb": 1, "scrollabl": 1, "small": [1, 11], "label": [1, 8, 11, 14, 17, 53], "cell": [1, 9], "further": [1, 8, 19, 22, 34], "favicon": 1, "conf": 1, "rtd": 1, "theme": 1, "inform": [1, 8, 12, 13, 14, 15, 22, 23, 29, 33, 34], "real": [2, 3, 8, 9, 16], "world": [2, 3, 8], "scenario": [2, 7, 8], "example_restrict": 2, "pcring": 2, "gene": [2, 8, 10, 11, 13, 14, 15, 17], "genom": [2, 8, 9, 10, 11, 13], "clone": [2, 3, 4, 7, 10, 12, 14, 15, 19, 22, 34, 57], "vector": [2, 10, 11, 17, 22, 31], "restrict": [2, 3, 4, 7, 8, 14, 17, 19, 22, 33, 34, 47, 55], "ligat": [2, 3, 4, 14, 17, 18, 44], "cellulolyticum": [2, 10], "paper": [2, 10], "doi": [2, 9], "10": [2, 7, 9, 11, 13, 16, 17, 22, 33, 56], "1038": 2, "nmeth": 2, "1318": 2, "example_crispr": 2, "crispr": [2, 3, 18], "homolog": [2, 4, 9, 11, 12, 19, 22, 25, 31], "recombin": [2, 4, 9, 12, 19, 22, 25, 31, 34, 38], "repair": [2, 9], "oligo": [2, 9], "industri": [2, 9], "k": [2, 9, 11, 13, 52, 56, 58], "phaffi": [2, 9], "best": [3, 7, 8, 22, 33], "follow": [3, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, 19, 22, 24, 33, 34, 48, 52, 55, 58], "our": [3, 9, 10], "tutori": 3, "them": [3, 7, 8, 9, 10, 15, 16, 19, 22, 27, 31], "repositori": [3, 19], "here": [3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "serv": 3, "colab": [3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17], "simpli": [3, 8, 15, 16], "click": [3, 5], "recommend": [3, 16], "go": [3, 15], "cover": [3, 27], "basic": [3, 4, 5, 9, 16, 22, 31], "introduct": 3, "dseq_featur": [3, 13, 15], "often": [3, 4, 5, 6], "mark": [3, 8], "region": [3, 8, 12, 13, 14, 16, 25], "interest": [3, 8, 13, 17], "resist": [3, 11], "importing_seq": [3, 8, 14], "variou": [3, 19, 31], "next": [3, 8, 9, 11, 13, 22, 31], "learn": 3, "techniqu": [3, 19, 22, 25, 31], "restrict_ligate_clon": 3, "perform": [3, 8, 10, 11, 12, 15, 22, 33], "cas9": [3, 22, 30, 33, 34], "human": 4, "readabl": [4, 22, 48], "formal": 4, "genet": [4, 52], "strategi": 4, "verif": 4, "compon": 4, "step": [4, 10, 11, 12, 14], "metabol": 4, "pathwai": 4, "accur": 4, "difficult": [4, 42], "seen": 4, "poor": 4, "state": 4, "scientif": 4, "literatur": 4, "express": [4, 5, 22, 33, 52, 53, 55, 58], "unambigu": 4, "stabl": [4, 9], "digest": [4, 11, 14, 15, 19, 22, 33, 34, 57], "electrophoresi": 4, "gener": [4, 5, 6, 9, 12, 13, 14, 17, 19], "golden": 4, "gate": 4, "progress": 4, "virtual": 4, "ani": [4, 8, 15, 16, 22, 24, 31, 33, 42, 48, 52, 55, 58], "sub": [4, 22, 25, 33], "describ": [4, 8, 9, 10, 11, 22, 24, 27, 33, 34, 56, 58], "its": [4, 8, 13, 22, 24, 50], "yield": 4, "final": [4, 9, 17, 22, 31], "molecul": [4, 19, 22, 33, 34, 36, 38, 57, 58], "ha": [4, 6, 7, 8, 10, 11, 12, 14, 15, 20, 22, 24, 31, 33, 34, 40, 42, 45, 52, 53], "been": [4, 6, 8, 9, 10, 12, 14, 15, 16, 22, 24, 31, 34, 40], "goal": 4, "being": 4, "understand": 4, "biologist": 4, "share": [4, 12, 19, 22, 25, 34], "combinatori": 4, "By": [5, 8, 12, 22, 33], "minim": [5, 8], "addit": [5, 8, 14, 16], "clipboard": 5, "enabl": 5, "copy_gb_to_clipboard": [5, 22, 34], "copy_fasta_to_clipboard": [5, 22, 34], "put": [5, 22, 33], "copi": [5, 8, 11, 22, 24, 33, 34, 48, 53, 55], "either": [5, 7, 22, 31, 33, 52, 58], "gb": [5, 8, 9, 10, 11, 13, 14, 15, 22, 34, 40], "fasta": [5, 7, 13, 15, 22, 34, 48, 49], "pyperclip": 5, "pypars": [5, 42], "correct": [5, 11, 14, 15, 22, 42], "malform": [5, 22, 42], "found": [5, 7, 8, 10, 11, 14, 15, 22, 31, 33, 42, 45, 47, 49, 58], "onlin": [5, 19, 32], "get": [5, 6, 7, 8, 10, 11, 16, 17, 22, 31, 33, 52], "corrupt": 5, "cai": [5, 52, 53, 58], "avail": [5, 10, 16, 19, 22, 25, 27, 38], "cai2": 5, "adapt": [5, 14, 56], "scipi": 5, "matplotlib": 5, "pillow": 5, "pil": 5, "flag": 5, "latest": 5, "upgrad": 5, "insid": [5, 14], "squar": [5, 7, 11], "bracket": [5, 7], "sure": [5, 14, 15], "leav": [5, 15], "space": 5, "recogn": 5, "your": [5, 7, 8, 9, 13, 15], "manag": [5, 19, 22, 25], "With": [5, 9], "ommit": 5, "don": [5, 7, 17], "t": [5, 7, 11, 13, 14, 15, 17, 22, 31, 33, 34, 42, 52], "extra": [5, 14, 16, 52, 53], "alreadi": [5, 8, 14, 22, 34], "uninstal": 5, "again": 5, "visit": [6, 7, 8, 10, 11, 12, 13, 14, 15], "full": [6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 22, 33, 52], "librari": [6, 7, 8, 10, 11, 12, 13, 14, 15], "site": [6, 11, 13, 14, 15, 16, 17, 22, 24, 33, 38, 42], "guid": [6, 9, 14], "rna": [6, 11, 22, 33, 34, 52, 58], "grna": [6, 30], "protein": [6, 8, 11, 13, 22, 31, 33, 52, 58], "process": [6, 11, 22, 31, 55], "biolog": [6, 8, 10, 14, 22, 33, 52], "activit": 6, "guiderna": 6, "addtion": 6, "target_sequ": 6, "sy": [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17], "captur": [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17], "develop": [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 19], "uncom": [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17], "protospac": [6, 9, 30], "scaffold": [6, 30], "gttactttacccgacgtcccgttttagagctagaaatagcaagttaaaataagg": 6, "gttactttacccgacgtcccagg": 6, "pam": [6, 30], "enzym": [6, 9, 11, 19, 22, 33, 34, 47], "gttactttacccgacgtccc": 6, "target_dseq": [6, 9], "print": [6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 22, 31, 33, 34, 40, 42, 53, 56], "grna_protospac": 6, "ca": [6, 22, 30, 34], "becaus": [6, 22, 31, 33], "enzyme2": [6, 9], "2": [6, 7, 8, 9, 10, 11, 13, 16, 22, 31, 33, 34, 38, 49, 52, 53, 56], "target_nopam_dseq": 6, "gttactttacccgacgtcccaaa": 6, "17": [6, 11, 22, 30, 31], "6": [6, 7, 8, 11, 12, 14, 16, 22, 23, 25, 29, 31, 33, 34, 35, 40, 41, 42, 43, 53, 57], "doubl": [7, 22, 30, 33, 34, 40, 49, 51, 52, 58], "Be": 7, "overhang": [7, 22, 33], "sticki": [7, 15, 22, 33], "biologi": [7, 8, 10, 12, 13, 19], "think": 7, "author": [7, 11, 13, 22, 40, 55], "whose": [7, 15, 48], "my_seq": [7, 22, 33, 34, 52], "aatat": 7, "5": [7, 8, 9, 11, 14, 15, 16, 17, 22, 24, 29, 30, 31, 33, 34, 53, 56, 57], "ttata": 7, "represent": [7, 13, 22, 23, 29, 34, 56], "abov": [7, 22, 23, 42, 52, 55], "line": [7, 13, 22, 24, 33, 35, 42, 48], "basepair": [7, 16], "top": [7, 22, 48], "sens": [7, 8, 22, 23, 33], "watson": [7, 22, 25, 33, 34], "bottom": [7, 8], "anti": 7, "crick": [7, 22, 33, 34], "let": [7, 9, 16, 17], "o5": 7, "instanti": [7, 8, 13, 23, 29, 35], "3": [7, 8, 10, 11, 13, 14, 22, 30, 31, 33, 34, 38, 42, 53, 56], "ovhg": [7, 22, 30, 33], "posit": [7, 8, 11, 22, 27, 33, 34, 48, 50, 53], "neg": [7, 22, 33], "extend": 7, "beyond": 7, "actag": 7, "ctag": [7, 22, 33], "gatc": [7, 22, 33, 53], "omit": 7, "valu": [7, 8, 10, 14, 16, 22, 31, 33, 45, 52, 53], "complementari": [7, 15], "feel": 7, "mean": [7, 22, 27, 33, 34, 52, 53, 58], "visualis": 7, "dsdna": [7, 22, 33, 58], "nnn": [7, 22, 33, 52], "nnnnn": [7, 22, 33], "nnnn": [7, 22, 33], "Of": 7, "convent": [7, 8, 14, 22, 33, 52], "atcg": [7, 22, 33], "support": [7, 8, 16, 22, 30, 33, 34], "iupac": [7, 58], "anoth": [7, 8, 13, 14, 22, 31, 33, 34, 42, 53], "from_full_sequence_and_overhang": [7, 22, 33], "classmethod": [7, 22, 23, 29, 33, 34, 41, 43, 53], "entir": [7, 8, 22, 31], "side": [7, 22, 33], "watson_ovhg": [7, 22, 33], "crick_ovhg": [7, 22, 33], "rule": [7, 22, 31], "ident": [7, 19, 22, 31], "revers": [7, 11, 12, 14, 16, 17, 22, 23, 29, 31, 34, 41, 43, 50, 52, 53, 58], "aaattaaa": 7, "8": [7, 8, 9, 11, 22, 27, 33, 56], "aaatta": 7, "aattt": 7, "n": [7, 8, 10, 11, 16, 22, 33, 34, 36, 38, 42, 48, 53], "aaatt": 7, "taattt": 7, "taa": [7, 22, 33, 58], "att": [7, 38], "tttaattt": 7, "attaaa": 7, "tttaa": 7, "draw": 7, "help": [7, 8], "visual": [7, 14, 22, 24], "x": [7, 17, 19, 22, 25, 27, 33, 34, 52, 53, 58], "would": [7, 8, 9, 10, 11, 14, 17, 22, 31, 33], "check": [7, 8, 11, 14, 15, 22, 33, 52, 56], "done": [7, 10, 22, 33], "call": [7, 16, 17, 22, 33, 40, 42, 52], "five_prime_end": [7, 22, 33], "three_prime_end": [7, 22, 33], "respect": [7, 14, 22, 33, 34], "demonstr": [7, 14], "7": [7, 8, 9, 11, 13, 22, 33, 34, 56], "atatt": 7, "aa": [7, 22, 33, 34, 52, 53], "tt": [7, 16, 22, 33], "join": [7, 8, 10, 11, 15, 16, 19, 42], "loop": [7, 11, 15, 17, 22, 31, 33, 34, 58], "must": [7, 14, 15, 22, 34], "shift": [7, 22, 33, 34, 56, 58], "tataa": 7, "builtin": [7, 16], "my_list": 7, "none": [7, 20, 22, 23, 29, 31, 33, 34, 35, 38, 39, 41, 43, 48, 50, 52, 53, 56, 58], "stop": [7, 22, 31, 43, 52], "similarli": 7, "word": [7, 58], "zero": [7, 8, 14], "aatataa": 7, "tat": 7, "ata": 7, "tata": 7, "leftmost": [7, 11], "necessarili": 7, "left": [7, 11, 22, 33, 42], "sequence_with_overhang": 7, "aatacgttcc": 7, "acgttcc": 7, "ttatgcaagg": 7, "count": 7, "atgcaagg": 7, "circular_seq": 7, "aatctaa": 7, "4": [7, 8, 11, 14, 16, 22, 31, 33, 34, 38, 52, 53, 56, 58], "atct": [7, 12, 15], "taga": [7, 12, 15], "across": [7, 8], "where": [7, 12, 14, 16, 17, 19, 22, 24, 25, 27, 31, 33, 34, 35, 38, 48, 49, 52], "bigger": 7, "aaaa": [7, 12, 22, 33], "tttt": [7, 12, 22, 33], "assign": [7, 22, 48, 53], "date": [7, 8, 9, 10, 22, 34], "datetim": 7, "my_dat": 7, "2023": [7, 19], "15": [7, 8, 16, 22, 27, 33, 36, 37, 56], "statement": 7, "08": [7, 11], "similar": [7, 14, 15, 20, 22, 31, 34, 51, 56], "purpos": [7, 9, 31, 35, 55], "most": [7, 8, 19, 22, 33, 42, 52], "right": [7, 14, 19, 22, 33, 55], "even": [7, 8, 22, 33, 52], "last": [7, 8, 13, 22, 24, 31, 33, 42, 52], "miss": 7, "arbitrari": 7, "won": 7, "abl": [7, 9], "xxxx": 7, "atat": 7, "includ": [8, 14, 15, 19, 22, 31, 55, 58], "well": [8, 13, 15, 16, 22, 24, 34], "signific": 8, "report": [8, 22, 24], "associ": [8, 11, 22, 34, 55], "terminologi": 8, "annot": [8, 10, 11, 13, 22, 34, 49, 53], "intron": [8, 11], "promot": [8, 11], "offer": 8, "via": [8, 12, 14, 15], "sampl": [8, 14, 39], "u49845": [8, 13], "file_path": [8, 13], "sample_record": 8, "5028": [8, 13], "chromosom": [8, 11, 13], "ix": [8, 13], "db_xref": [8, 11, 13, 22, 40], "taxon": [8, 11, 13, 22, 40], "4932": [8, 13], "mol_typ": [8, 11, 13, 22, 40], "organ": [8, 9, 10, 11, 13, 14, 17, 22, 34, 40, 42, 52, 53, 58], "saccharomyc": [8, 11, 13], "cerevisia": [8, 11, 13], "mrna": [8, 13], "206": [8, 11, 13], "tcp1": [8, 13], "beta": [8, 11, 13, 22, 40], "codon_start": [8, 11, 13], "protein_id": [8, 11, 13], "aaa98665": [8, 13], "translat": [8, 11, 13, 22, 33, 34, 52, 53], "ssiyngistsgldlnngtiadmrqlgivesyklkravvssaseaaevllrvdniirarprtanrqhm": 8, "686": 8, "3158": [8, 13], "axl2": [8, 13], "axl2p": [8, 13], "plasma": [8, 13], "membran": [8, 13], "glycoprotein": [8, 13], "aaa98666": [8, 13], "mtqlqisllltatisllhlvvatpyeaypigkqyppvarvnesftfqisndtykssvdktaqityncfdlpswlsfdsssrtfsgepssdllsdanttlyfnvilegtdsadstslnntyqfvvtnrpsislssdfnllallknygytngknalkldpnevfnvtfdrsmftneesivsyygrsqlynaplpnwlffdsgelkftgtapvinsaiapetsysfviiatdiegfsavevefelvigahqlttsiqnsliinvtdtgnvsydlplnyvyldddpissdklgsinlldapdwvaldnatisgsvpdellgknsnpanfsvsiydtygdviyfnfevvsttdlfaisslpninatrgewfsyyflpsqftdyvntnvsleftnssqdhdwvkfqssnltlagevpknfdklslglkanqgsqsqelyfniigmdskithsnhsanatstrsshhststssytsstytakisstsaaatssapaalpaanktsshnkkavaiacgvaiplgvilvalicflifwrrrrenpddenlphaisgpdlnnpankpnqenatplnnpfdddassyddtsiarrlaalntlkldnhsatesdissvdekrdslsgmntyndqfqsqskeellakppvqppespffdpqnrsssvymdsepavnkswrytgnlspvsdivrdsygsqktvdteklfdleapekekrtsrdvtmssldpwnsnispspvrksvtpspynvtkhrnrhlqniqdsqsgkngitpttmstsssddfvpvkdgenfcwvhsmepdrrpskkrlvdfsnksnvnvgqvkdihgripeml": 8, "3299": 8, "4037": [8, 13], "rev7": [8, 13], "rev7p": [8, 13], "aaa98667": [8, 13], "mnrwvekwlrvylkcyinlilfyrnvyppqsfdyttyqsfnlpqfvpinrhpalidyieelildvlsklthvyrfsiciinkkndlciekyvldfselqhvdkddqiitetevfdefrsslnslimhleklpkvnddtitfeavinaielelghkldrnrrvdsleekaeierdsnwvkcqedenlpdnngfqppkikltslvgsdvgpliihqfseklisgddkilngvysqyeegesifgslf": 8, "search": [8, 12, 30, 47], "particular": [8, 55], "shown": [8, 13, 15, 17], "featureloc": 8, "rang": 8, "interv": 8, "wherea": 8, "close": [8, 10, 11], "2nd": 8, "5th": 8, "repres": [8, 14, 16, 22, 24, 29, 31, 33, 34, 58], "bio": [8, 11, 13, 15, 16, 17, 22, 24, 30, 33, 34, 42, 47, 49, 51, 52, 58], "dummi": 8, "dummy_record": 8, "aaaatgcgtacgtgaacgt": 8, "my_featur": 8, "append": [8, 16, 52], "confirm": 8, "19": [8, 14, 22, 42], "bp": [8, 11, 12, 13, 14, 17, 22, 24, 25, 31, 34, 40, 42, 45], "unk": [8, 11, 14, 17, 22, 34], "jan": [8, 11, 14, 17], "1980": [8, 11, 14, 17], "aaaatgcgta": 8, "cgtgaacgt": 8, "give": [8, 9, 13, 14], "about": [8, 22, 23, 29, 31, 34], "dictionari": [8, 16], "domain": [8, 14, 56], "9": [8, 11, 17, 22, 33, 34], "my": [8, 9, 14], "my_feature2": 8, "my_record": [8, 13], "practic": [8, 9, 48], "reason": [8, 22, 34], "singl": [8, 12, 15, 22, 33, 49, 51, 52, 56, 58], "ase1": [8, 11], "pomb": [8, 11], "embl": [8, 13, 22, 34, 48, 49], "ft": [8, 53], "1878362": 8, "1878785": 8, "1878833": 8, "1880604": 8, "colour": 8, "primary_nam": 8, "antiparallel": [8, 11], "microtubul": [8, 11], "cross": [8, 11], "factor": [8, 11, 58], "systematic_id": 8, "spapb1a10": 8, "09": [8, 11], "controlled_cur": 8, "term": [8, 10, 22, 31], "speci": 8, "distribut": [8, 55], "conserv": [8, 11], "eukaryot": 8, "20081110": 8, "metazoa": 8, "vertebr": 8, "predominantli": 8, "fungi": [8, 9, 11, 13], "howev": [8, 15], "risk": 8, "qualifier_nam": 8, "new_valu": 8, "assum": [8, 22, 24, 31, 42], "minu": [8, 52], "paramet": [8, 10, 14, 22, 23, 24, 25, 27, 31, 33, 34, 35, 38, 40, 49, 51, 52, 53, 56, 58], "my_feature3": 8, "example_domain": 8, "complement": [8, 11, 12, 13, 14, 22, 23, 29, 34, 41, 43, 50, 52, 53, 58], "16": [8, 11, 14], "compoundloc": [8, 11, 58], "9bp": 8, "12": [8, 11, 22, 33], "15bp": 8, "skip": 8, "acg": [8, 22, 31], "atgcgt": 8, "tga": [8, 52, 58], "compound_loc": 8, "cds_featur": 8, "example_gen": [8, 14, 15], "13": [8, 11, 17, 22, 24, 27, 31], "mr": 8, "sub_record": 8, "molecule_typ": [8, 9, 10, 12, 15, 49], "proteinseq": [8, 52], "suppport": 8, "non": [8, 11, 22, 31, 52], "exhaust": 8, "exon": 8, "utr": [8, 11], "termin": [8, 11, 12, 52, 58], "enhanc": 8, "rb": 8, "custom": [8, 14, 22, 31], "synthet": [8, 10, 11, 12, 22, 40], "bio_brick": 8, "spacer": [8, 22, 30, 31], "standardis": 8, "stick": 8, "bioinformat": 8, "tool": [8, 14, 22, 40, 53], "databas": 8, "pleas": [8, 12, 13, 14, 15, 19, 22, 40], "offici": 8, "genbank_feature_t": 8, "special": 8, "immedi": [8, 19], "normal": [8, 12, 14, 15, 22, 34, 52, 53], "25bp": 8, "25": [8, 9, 10, 22, 25, 27, 31, 34, 53], "displai": [8, 9, 12, 15], "snapgen": [8, 11, 13], "viewer": 8, "benchl": 8, "circular_record": [8, 15], "acgtgaaaaaaaaaaaaaaatgcgt": 8, "ori_feat_loc": 8, "ori_featur": 8, "misc": [8, 17, 22, 34, 53], "properli": 8, "atgcgtacgtga": 8, "20": [8, 9, 10, 30], "acgtgaaaaa": 8, "aaaaaaaaaa": 8, "tgcgt": 8, "simpl": [8, 13, 22, 23, 31], "sta": [8, 53], "len": [8, 9, 10, 22, 33, 40, 53], "orf": [8, 22, 34, 52, 53, 58], "nd": 8, "2472": 8, "ye": 8, "738": 8, "conveni": [8, 22, 24], "brief": 8, "overview": 8, "altern": [8, 22, 31, 52], "filter": 8, "f": [8, 9, 11, 22, 31, 34], "rev7_cds_featur": 8, "replac": [8, 11, 22, 25, 33, 34, 38, 52, 53], "desir": [8, 14, 17], "quotat": 8, "qualifif": 8, "life": [9, 16, 52], "intuit": 9, "chosen": 9, "strucko": 9, "et": [9, 11, 14, 52], "al": [9, 11, 14, 52], "2024": [9, 10, 11], "academ": 9, "oup": 9, "femsyr": 9, "articl": [9, 10], "1093": 9, "foae026": 9, "7740463": 9, "login": 9, "silverchair": 9, "cdn": 9, "backfil": 9, "content_publ": 9, "journal": [9, 10, 11, 13, 22, 40, 58], "24": [9, 22, 31], "1093_femsyr_foae026": 9, "m_foae026fig3": 9, "jpeg": 9, "expir": 9, "1730974846": 9, "signatur": 9, "ibkvkhkun1823iljq": 9, "1ufenko0vqwrwixadvcwqlz6yv8ydeafkgt": 9, "tslrxkftmgyiq3zincj5a5yngs4cp4necvrcqh7ad": 9, "1zejiwnrjqw51cjhgczwpzz": 9, "ndr93qvlzzd2re41cjnfkfmeu756kxrhqxwktqe2qpmpfikbvhvo8j28perj3vnjz3lqrsfp9quppdszeywiiny92jsuy448yyuagcgac2exgdleuartejmq8gtb0qntpv0dedtoxifzpgavdvo": 9, "qyqikjclj6hebuyu1lh7stus8oqcqe82cxo0iucjyf6m2lb0evxhqdldqe90m": 9, "nrkjznrmba0a__": 9, "pair": [9, 10, 14, 22, 31, 33, 42], "apkaie5g5crdk6rd3pga": 9, "assist": 9, "1a": 9, "1b": 9, "integr": 9, "lac12": 9, "strain": [9, 11], "knock": 9, "favourit": 9, "myself": 9, "email": [9, 19, 22, 40], "tell": [9, 22, 40], "who": [9, 22, 40], "x06997": 9, "kluyveromyc": 9, "lacti": 9, "lactos": 9, "permeas": 9, "size": [9, 10, 12, 15, 29, 30, 45], "7127": 9, "data_file_divis": [9, 10], "pln": [9, 11, 13], "jul": [9, 11], "2016": [9, 11], "sequence_vers": [9, 10], "unidentifi": 9, "frame": [9, 13, 52, 53, 58], "taxonomi": [9, 10, 53], "eukaryota": [9, 11, 13], "dikarya": [9, 11, 13], "ascomycota": [9, 11, 13], "saccharomycotina": [9, 13], "saccharomycet": [9, 13], "saccharomycetal": [9, 13], "saccharomycetacea": [9, 13], "titl": [9, 10, 11, 13, 22, 40], "structur": [9, 11, 22, 33], "yeast": [9, 11, 13], "presenc": [9, 22, 33, 38], "unusu": 9, "transcript": [9, 11], "submiss": [9, 10, 11, 13], "submit": [9, 10, 11, 13], "lac4": 9, "goe": 9, "opposit": 9, "1199": 9, "mol": [9, 11, 22, 33, 36, 45], "biol": [9, 11], "1987": [9, 11], "4369": 9, "4376": 9, "gcga": 9, "ttcg": 9, "cgct": 9, "aagc": 9, "choos": 9, "ccctaagtcctttgaagatt": 9, "tattattttgaggtgcttta": 9, "enzyme1": 9, "135": 9, "6992": 9, "6793": 9, "334": 9, "ko": 9, "60": [9, 16, 17, 56], "90mer": 9, "repair_oligo": 9, "45": [9, 14, 56], "length": [9, 12, 16, 17, 22, 23, 24, 27, 31, 33, 34, 36, 42, 45, 52, 56, 58], "aggtgaacacactctgatgtagtgcagtccctaagtcctttgaagttacggactcctcgaccgatgcccttgagagccttcaacccagtc": 9, "90": [9, 10], "case": [9, 16, 22, 27, 31, 33, 34, 42, 58], "my_ko": 9, "my_assembly_ko": 9, "rest": [9, 17], "showcas": [10, 11], "workflow": [10, 11, 12], "model": [10, 11, 12, 15], "pcc1bac": 10, "ruminiclostridium": 10, "clostridium": 10, "f1": 10, "f2": 10, "f3": 10, "alongsid": [10, 11], "along": [10, 11], "tm": [10, 11, 18, 22, 31], "tm_default": [10, 11, 14, 16, 22, 31, 56], "generuler_1kb_plu": 10, "cp001348": 10, "bct": 10, "aug": 10, "2017": 10, "aavc01000000": 10, "aavc01000001": 10, "aavc01000121": 10, "h10": 10, "bacteria": 10, "bacillota": 10, "clostridia": 10, "eubacterial": 10, "oscillospiracea": 10, "www": [10, 11, 53, 56], "jgi": 10, "gov": [10, 53, 56], "njgi": 10, "4002584": 10, "nsourc": 10, "jizhong": 10, "zhou": 10, "jzhou": 10, "rccc": 10, "ou": 10, "ncontact": 10, "david": [10, 58], "bruce": 10, "microb": 10, "cuba": 10, "psf": 10, "nannot": 10, "ornl": 10, "pgf": 10, "nfinish": 10, "lanl": 10, "microbi": 10, "curat": 10, "gap": [10, 22, 33, 52, 58], "ngreater": 10, "98": [10, 29, 56], "least": [10, 22, 31, 33], "independ": 10, "nbase": 10, "minimum": [10, 12, 16, 17, 22, 31], "q": 10, "qualiti": 10, "30": [10, 11, 19, 22, 33, 52, 56], "total": 10, "nrate": 10, "per": 10, "50000": 10, "nthe": 10, "collabor": 10, "endors": 10, "principl": 10, "ndistribut": 10, "scale": 10, "adopt": 10, "nlarger": 10, "commun": 10, "urg": 10, "nfollow": 10, "intent": 10, "publish": [10, 55], "nproject": 10, "fashion": 10, "welcom": 10, "ninteract": 10, "analysi": [10, 22, 25, 38], "cfm": 10, "pageid": 10, "10506376": 10, "syn": [10, 11, 22, 42], "29": [10, 11, 13, 14], "sgref": 10, "type": [10, 11, 13, 15, 16, 17, 19, 22, 23, 24, 27, 31, 33, 34, 48, 49, 51, 53, 56, 58], "journalnam": 10, "23": [10, 22, 31], "2007": [10, 11, 22, 40], "726": 10, "post": 10, "road": 10, "madison": 10, "wi": 10, "53713": 10, "usa": [10, 13], "nsgref": 10, "pylr": 10, "insert": [10, 11, 17, 22, 34], "f1_for": 10, "gcagcttcaagtcctgcaaacaaggtgtaccaggatcgtt": 10, "f1_rev": 10, "gatttcagtgtagttagggccagttgaattcaaacctgcc": 10, "f2_for": 10, "ggcaggtttgaattcaactggccctaactacactgaaatc": 10, "f2_rev": 10, "cttggtgccatcagcattgttctctgtaccgcccactgtc": 10, "f3_for": 10, "gacagtgggcggtacagagaacaatgctgatggcaccaag": 10, "f3_rev": 10, "cagttgaataatcatgtgttcctgcggcaaatgcagtacc": 10, "bacf1_for": 10, "aacgatcctggtacaccttgtttgcaggacttgaagctgcgcggccgcgatcctctagagtcgacctg": 10, "bacf3_rev": 10, "ggtactgcatttgccgcaggaacacatgattattcaactggcggccgccgggtaccgagctcgaattc": 10, "pcr_product_f1": 10, "pcr_product_f2": 10, "pcr_product_f3": 10, "pcr_product_bac": 10, "5210": 10, "5384": 10, "5172": 10, "8221": 10, "im": 10, "rotat": [10, 22, 34, 58], "expand": 10, "given": [10, 14, 15, 16, 19, 22, 25, 31, 33, 34, 38, 40, 48, 58], "assembl": [10, 12, 16, 22, 29, 31], "assembled_circ": 10, "23827": 10, "28": [10, 14], "o23827": 10, "gcag": 10, "ccgc": 10, "cgtc": 10, "ggcg": 10, "ligas": 11, "respons": 11, "mitot": 11, "spindl": 11, "pfa6a": 11, "kanmx6": 11, "portion": [11, 55], "cleav": 11, "asci": 11, "sali": 11, "pfa6akanmx6_path": 11, "ase1_path": 11, "cu329670": 11, "pombe_chromosome_i": 11, "3938": 11, "jun": [11, 22, 42], "2022": 11, "bahler": 11, "j": [11, 13, 58], "wu": 11, "jq": 11, "longtin": 11, "m": [11, 13, 22, 34, 36, 40, 52, 58], "shah": 11, "ng": 11, "mckenzi": 11, "3rd": 11, "steever": 11, "ab": 11, "wach": 11, "philippsen": 11, "p": [11, 22, 27, 38, 48], "pringl": 11, "jr": 11, "heterolog": 11, "effici": 11, "versatil": 11, "schizosaccharomyc": 11, "1998": 11, "14": [11, 12, 22, 25, 33, 34, 40], "943": 11, "51": [11, 14, 15, 22, 24, 56], "pubm": [11, 13, 56], "9717240": 11, "export": [11, 13], "58": 11, "qualifi": [11, 13, 14, 17, 22, 34, 40, 42, 53], "primer_bind": [11, 14], "35": [11, 22, 31], "52": [11, 56], "l4440": 11, "forward": [11, 14, 16, 17, 22, 23, 31], "rep_origin": 11, "794": 11, "ori": 11, "high": [11, 22, 25], "cole1": 11, "pmb1": 11, "pbr322": 11, "puc": 11, "replic": [11, 14], "286": 11, "305": 11, "pbr322ori": 11, "965": 11, "1825": 11, "bla": 11, "lactamas": [11, 22, 40], "ampr": 11, "confer": 11, "ampicillin": 11, "carbenicillin": 11, "relat": [11, 19, 25], "antibiot": 11, "msiqhfrvalipffaafclpvfahpetlvkvkdaedqlgarvgyi": 11, "eldlnsgkilesfrpeerfpmmstfkvllcgavlsridagqeqlgrrihysqndlvei": 11, "pvtekhltdgmtvrelcsaaitmsdntaanlllttiggpkeltaflhnmgdhvtrldrw": 11, "epelneaipnderdttmpvamattlrklltgelltlasrqqlidwmeadkvagpllrsa": 11, "lpagwfiadksgagergsrgiiaalgpdgkpsrivviyttgsqatmdernrqiaeiga": 11, "likhw": 11, "1588": 11, "1607": 11, "amp": 11, "1826": 11, "1930": 11, "pbrforeco": 11, "upsteam": 11, "ecori": [11, 14, 15, 16, 22, 33], "2054": 11, "2076": 11, "pgex": 11, "2176": 11, "2195": 11, "pr": [11, 22, 31], "select": [11, 13, 15], "2276": 11, "2294": 11, "sp6": 11, "bacteriophag": 11, "polymeras": [11, 22, 33, 56], "2293": 11, "2407": 11, "3763": 11, "kanmx": 11, "kanamycin": 11, "1994": 11, "2750": 11, "tef": 11, "ashbya": 11, "gossypii": 11, "2751": 11, "3560": 11, "aph": 11, "ia": 11, "aminoglycosid": 11, "phosphotransferas": 11, "kanr": 11, "mgkekthvsrprlnsnmdadlygykwardnvgqsgatiyrlygkp": 11, "dapelflkhgkgsvandvtdemvrlnwltefmplptikhfirtpddawllttaipgkta": 11, "fqvleeypdsgenivdalavflrrlhsipvcncpfnsdrvfrlaqaqsrmnnglvdasd": 11, "fdderngwpveqvwkemhkllpfspdsvvthgdfsldnlifdegkligcidvgrvgiad": 11, "ryqdlailwnclgefspslqkrlfqkygidnpdmnklqfhlmldeff": 11, "2818": 11, "2837": 11, "kan": 11, "3566": 11, "3867": 11, "3886": 11, "t7": 11, "3868": 11, "gaggcggttt": 11, "gcgtattggg": 11, "cgctcttccg": 11, "cttcctcgct": 11, "cactgactcg": 11, "ctgcgctcgg": 11, "61": [11, 13, 29], "tcgttcggct": 11, "gcggcgagcg": 11, "gtatcagctc": 11, "actcaaaggc": 11, "ggtaatacgg": 11, "ttatccacag": 11, "121": [11, 13], "aatcagggga": 11, "taacgcagga": 11, "aagaacatgt": 11, "gagcaaaagg": 11, "ccagcaaaag": 11, "gccaggaacc": 11, "181": [11, 13], "gtaaaaaggc": 11, "cgcgttgctg": 11, "gcgtttttcc": 11, "ataggctccg": 11, "cccccctgac": 11, "gagcatcaca": 11, "241": [11, 13], "aaaatcgacg": 11, "ctcaagtcag": 11, "aggtggcgaa": 11, "acccgacagg": 11, "actataaaga": 11, "taccaggcgt": 11, "301": [11, 13], "ttccccctgg": 11, "aagctccctc": 11, "gtgcgctctc": 11, "ctgttccgac": 11, "cctgccgctt": 11, "accggatacc": 11, "361": [11, 13], "tgtccgcctt": 11, "tctcccttcg": 11, "ggaagcgtgg": 11, "cgctttctca": 11, "tagctcacgc": 11, "tgtaggtatc": 11, "421": [11, 13], "tcagttcggt": 11, "gtaggtcgtt": 11, "cgctccaagc": 11, "tgggctgtgt": 11, "gcacgaaccc": 11, "cccgttcagc": 11, "481": [11, 13], "ccgaccgctg": 11, "cgccttatcc": 11, "ggtaactatc": 11, "gtcttgagtc": 11, "caacccggta": 11, "agacacgact": 11, "541": [11, 13], "tatcgccact": 11, "ggcagcagcc": 11, "actggtaaca": 11, "ggattagcag": 11, "agcgaggtat": 11, "gtaggcggtg": 11, "601": [11, 13], "ctacagagtt": 11, "cttgaagtgg": 11, "tggcctaact": 11, "acggctacac": 11, "tagaagaaca": 11, "gtatttggta": 11, "661": [11, 13], "tctgcgctct": 11, "gctgaagcca": 11, "gttaccttcg": 11, "gaaaaagagt": 11, "tggtagctct": 11, "tgatccggca": 11, "721": [11, 13], "aacaaaccac": 11, "cgctggtagc": 11, "ggtggttttt": 11, "ttgtttgcaa": 11, "gcagcagatt": 11, "acgcgcagaa": 11, "781": [11, 13], "aaaaaggatc": 11, "tcaagaagat": 11, "cctttgatct": 11, "tttctacggg": 11, "gtctgacgct": 11, "cagtggaacg": 11, "841": [11, 13], "aaaactcacg": 11, "ttaagggatt": 11, "ttggtcatga": 11, "gattatcaaa": 11, "aaggatcttc": 11, "acctagatcc": 11, "901": [11, 13], "ttttaaatta": 11, "aaaatgaagt": 11, "tttaaatcaa": 11, "tctaaagtat": 11, "atatgagtaa": 11, "acttggtctg": 11, "961": [11, 13], "acagttacca": 11, "atgcttaatc": 11, "agtgaggcac": 11, "ctatctcagc": 11, "gatctgtcta": 11, "tttcgttcat": 11, "1021": [11, 13], "ccatagttgc": 11, "ctgactcccc": 11, "gtcgtgtaga": 11, "taactacgat": 11, "acgggagggc": 11, "ttaccatctg": 11, "1081": [11, 13], "gccccagtgc": 11, "tgcaatgata": 11, "ccgcgagacc": 11, "cacgctcacc": 11, "ggctccagat": 11, "ttatcagcaa": 11, "1141": [11, 13], "taaaccagcc": 11, "agccggaagg": 11, "gccgagcgca": 11, "gaagtggtcc": 11, "tgcaacttta": 11, "tccgcctcca": 11, "1201": [11, 13], "tccagtctat": 11, "taattgttgc": 11, "cgggaagcta": 11, "gagtaagtag": 11, "ttcgccagtt": 11, "aatagtttgc": 11, "1261": [11, 13], "gcaacgttgt": 11, "tgccattgct": 11, "acaggcatcg": 11, "tggtgtcacg": 11, "ctcgtcgttt": 11, "ggtatggctt": 11, "1321": [11, 13], "cattcagctc": 11, "cggttcccaa": 11, "cgatcaaggc": 11, "gagttacatg": 11, "atcccccatg": 11, "ttgtgcaaaa": 11, "1381": [11, 13], "aagcggttag": 11, "ctccttcggt": 11, "cctccgatcg": 11, "ttgtcagaag": 11, "taagttggcc": 11, "gcagtgttat": 11, "1441": [11, 13], "cactcatggt": 11, "tatggcagca": 11, "ctgcataatt": 11, "ctcttactgt": 11, "catgccatcc": 11, "gtaagatgct": 11, "1501": [11, 13], "tttctgtgac": 11, "tggtgagtac": 11, "tcaaccaagt": 11, "cattctgaga": 11, "atagtgtatg": 11, "cggcgaccga": 11, "1561": [11, 13], "gttgctcttg": 11, "cccggcgtca": 11, "atacgggata": 11, "ataccgcgcc": 11, "acatagcaga": 11, "actttaaaag": 11, "1621": [11, 13], "tgctcatcat": 11, "tggaaaacgt": 11, "tcttcggggc": 11, "gaaaactctc": 11, "aaggatctta": 11, "ccgctgttga": 11, "1681": [11, 13], "gatccagttc": 11, "gatgtaaccc": 11, "actcgtgcac": 11, "ccaactgatc": 11, "ttcagcatct": 11, "tttactttca": 11, "1741": [11, 13], "ccagcgtttc": 11, "tgggtgagca": 11, "aaaacaggaa": 11, "ggcaaaatgc": 11, "cgcaaaaaag": 11, "ggaataaggg": 11, "1801": [11, 13], "cgacacggaa": 11, "atgttgaata": 11, "ctcatactct": 11, "tcctttttca": 11, "atattattga": 11, "agcatttatc": 11, "1861": [11, 13], "agggttattg": 11, "tctcatgagc": 11, "ggatacatat": 11, "ttgaatgtat": 11, "ttagaaaaat": 11, "aaacaaatag": 11, "1921": [11, 13], "gggttccgcg": 11, "cacatttccc": 11, "cgaaaagtgc": 11, "cacctgacgt": 11, "ctaagaaacc": 11, "attattatca": 11, "1981": [11, 13], "tgacattaac": 11, "ctataaaaat": 11, "aggcgtatca": 11, "cgaggccctt": 11, "tcgtctcgcg": 11, "cgtttcggtg": 11, "2041": [11, 13], "atgacggtga": 11, "aaacctctga": 11, "cacatgcagc": 11, "tcccggagac": 11, "ggtcacagct": 11, "tgtctgtaag": 11, "2101": [11, 13], "cggatgccgg": 11, "gagcagacaa": 11, "gcccgtcagg": 11, "gcgcgtcagc": 11, "gggtgttggc": 11, "gggtgtcggg": 11, "2161": [11, 13], "gctggcttaa": 11, "ctatgcggca": 11, "tcagagcaga": 11, "ttgtactgag": 11, "agtgcaccat": 11, "atggacatat": 11, "2221": [11, 13], "tgtcgttaga": 11, "acgcggctac": 11, "aattaataca": 11, "taaccttatg": 11, "tatcatacac": 11, "atacgattta": 11, "2281": [11, 13], "ggtgacacta": 11, "tagaacgcgg": 11, "ccgccagctg": 11, "aagcttcgta": 11, "cgctgcaggt": 11, "cgacggatcc": 11, "2341": [11, 13], "ccgggttaat": 11, "taaggcgcgc": 11, "cagatctgtt": 11, "tagcttgcct": 11, "cgtccccgcc": 11, "gggtcacccg": 11, "2401": [11, 13], "gccagcgaca": 11, "tggaggccca": 11, "gaataccctc": 11, "cttgacagtc": 11, "ttgacgtgcg": 11, "cagctcaggg": 11, "2461": [11, 13], "gcatgatgtg": 11, "actgtcgccc": 11, "gtacatttag": 11, "cccatacatc": 11, "cccatgtata": 11, "atcatttgca": 11, "2521": [11, 13], "tccatacatt": 11, "ttgatggccg": 11, "cacggcgcga": 11, "agcaaaaatt": 11, "acggctcctc": 11, "gctgcagacc": 11, "2581": [11, 13], "tgcgagcagg": 11, "gaaacgctcc": 11, "cctcacagac": 11, "gcgttgaatt": 11, "gtccccacgc": 11, "cgcgcccctg": 11, "2641": [11, 13], "tagagaaata": 11, "taaaaggtta": 11, "ggatttgcca": 11, "ctgaggttct": 11, "tctttcatat": 11, "acttcctttt": 11, "2701": [11, 13], "aaaatcttgc": 11, "taggatacag": 11, "ttctcacatc": 11, "acatccgaac": 11, "ataaacaacc": 11, "atgggtaagg": 11, "2761": [11, 13], "aaaagactca": 11, "cgtttcgagg": 11, "ccgcgattaa": 11, "attccaacat": 11, "ggatgctgat": 11, "ttatatgggt": 11, "2821": [11, 13], "ataaatgggc": 11, "tcgcgataat": 11, "gtcgggcaat": 11, "caggtgcgac": 11, "aatctatcga": 11, "ttgtatggga": 11, "2881": [11, 13], "agcccgatgc": 11, "gccagagttg": 11, "tttctgaaac": 11, "atggcaaagg": 11, "tagcgttgcc": 11, "aatgatgtta": 11, "2941": [11, 13], "cagatgagat": 11, "ggtcagacta": 11, "aactggctga": 11, "cggaatttat": 11, "gcctcttccg": 11, "accatcaagc": 11, "3001": [11, 13], "attttatccg": 11, "tactcctgat": 11, "gatgcatggt": 11, "tactcaccac": 11, "tgcgatcccc": 11, "ggcaaaacag": 11, "3061": [11, 13], "cattccaggt": 11, "attagaagaa": 11, "tatcctgatt": 11, "caggtgaaaa": 11, "tattgttgat": 11, "gcgctggcag": 11, "3121": [11, 13], "tgttcctgcg": 11, "ccggttgcat": 11, "tcgattcctg": 11, "tttgtaattg": 11, "tccttttaac": 11, "agcgatcgcg": 11, "3181": [11, 13], "tatttcgtct": 11, "cgctcaggcg": 11, "caatcacgaa": 11, "tgaataacgg": 11, "tttggttgat": 11, "gcgagtgatt": 11, "3241": [11, 13], "ttgatgacga": 11, "gcgtaatggc": 11, "tggcctgttg": 11, "aacaagtctg": 11, "gaaagaaatg": 11, "cataagcttt": 11, "3301": [11, 13], "tgccattctc": 11, "accggattca": 11, "gtcgtcactc": 11, "atggtgattt": 11, "ctcacttgat": 11, "aaccttattt": 11, "3361": [11, 13], "ttgacgaggg": 11, "gaaattaata": 11, "ggttgtattg": 11, "atgttggacg": 11, "agtcggaatc": 11, "gcagaccgat": 11, "3421": [11, 13], "accaggatct": 11, "tgccatccta": 11, "tggaactgcc": 11, "tcggtgagtt": 11, "ttctccttca": 11, "ttacagaaac": 11, "3481": [11, 13], "ggctttttca": 11, "aaaatatggt": 11, "attgataatc": 11, "ctgatatgaa": 11, "taaattgcag": 11, "tttcatttga": 11, "3541": [11, 13], "tgctcgatga": 11, "gtttttctaa": 11, "tcagtactga": 11, "caataaaaag": 11, "attcttgttt": 11, "tcaagaactt": 11, "3601": [11, 13], "gtcatttgta": 11, "tagttttttt": 11, "atattgtagt": 11, "tgttctattt": 11, "taatcaaatg": 11, "ttagcgtgat": 11, "3661": [11, 13], "ttatattttt": 11, "tttcgcctcg": 11, "acatcatctg": 11, "cccagatgcg": 11, "aagttaagtg": 11, "cgcagaaagt": 11, "3721": [11, 13], "aatatcatgc": 11, "gtcaatcgta": 11, "tgtgaatgct": 11, "ggtcgctata": 11, "ctgctgtcga": 11, "ttcgatacta": 11, "3781": [11, 13], "acgccgccat": 11, "ccagtttaaa": 11, "cgagctcgaa": 11, "ttcatcgatg": 11, "atatcagatc": 11, "cactagtggc": 11, "3841": [11, 13], "ctatgcggcc": 11, "gcggatctgc": 11, "cggtctccct": 11, "atagtgagtc": 11, "gtattaattt": 11, "cgataagcca": 11, "3901": [11, 13], "ggttaacctg": 11, "cattaatgaa": 11, "tcggccaacg": 11, "cgcgggga": 11, "4538": 11, "26": [11, 14], "apr": 11, "972h": 11, "dblink": 11, "bioproject": 11, "prjna13836": 11, "biosampl": 11, "samea3138176": 11, "fission": 11, "taphrinomycotina": 11, "schizosaccharomycet": 11, "schizosaccharomycetal": 11, "schizosaccharomycetacea": 11, "lang": 11, "b": [11, 22, 25, 31, 33, 34, 38, 52, 53, 55, 58], "mitochondri": 11, "highli": 11, "otherwis": [11, 22, 33, 53, 55], "cox1": 11, "aspergillu": 11, "nidulan": 11, "embo": 11, "2129": 11, "2136": 11, "1984": 11, "6092057": 11, "ahn": 11, "bonen": 11, "cytochrom": 11, "184": 11, "353": 11, "366": 11, "1985": 11, "4046021": 11, "cedergren": 11, "grai": 11, "subunit": 11, "ribosom": 11, "comparison": [11, 22, 58], "potenti": 11, "secondari": 11, "fungal": 11, "rrna": 11, "evolutionari": 11, "consider": 11, "eur": 11, "biochem": 11, "169": [11, 22, 33], "527": 11, "537": 11, "2446871": 11, "trinkl": 11, "h": 11, "wolf": 11, "nucleic": 11, "acid": [11, 52, 58], "re": 11, "6730": 11, "1989": 11, "2780299": 11, "wood": 11, "v": [11, 52, 58], "gwilliam": 11, "rajandream": 11, "lyne": 11, "stewart": 11, "sgouro": 11, "peat": 11, "hayl": 11, "baker": 11, "basham": 11, "bowman": 11, "brook": 11, "brown": 11, "chillingworth": 11, "churcher": 11, "collin": 11, "connor": 11, "cronin": 11, "davi": 11, "feltwel": 11, "fraser": 11, "gentl": 11, "gobl": 11, "hamlin": 11, "harri": 11, "hidalgo": 11, "hodgson": 11, "holroyd": 11, "hornsbi": 11, "howarth": 11, "huckl": 11, "hunt": 11, "jagel": 11, "jame": 11, "jone": 11, "leather": 11, "mcdonald": 11, "mclean": 11, "moonei": 11, "moul": 11, "mungal": 11, "murphi": 11, "niblett": 11, "odel": 11, "oliv": 11, "neil": 11, "pearson": 11, "quail": 11, "rabbinowitsch": 11, "rutherford": 11, "rutter": 11, "saunder": 11, "seeger": 11, "sharp": 11, "skelton": 11, "simmond": 11, "steven": 11, "taylor": 11, "tivei": 11, "walsh": 11, "warren": 11, "whitehead": 11, "woodward": 11, "volckaert": 11, "aert": 11, "robben": 11, "grymonprez": 11, "weltjen": 11, "vanstreel": 11, "rieger": 11, "schafer": 11, "muller": 11, "auer": 11, "gabel": 11, "fuch": 11, "dusterhoft": 11, "fritzc": 11, "holzer": 11, "moestl": 11, "hilbert": 11, "borzym": 11, "langer": 11, "beck": 11, "lehrach": 11, "reinhardt": 11, "pohl": 11, "eger": 11, "zimmermann": 11, "wedler": 11, "wambutt": 11, "purnel": 11, "goffeau": 11, "cadieu": 11, "dreano": 11, "gloux": 11, "lelaur": 11, "mottier": 11, "galibert": 11, "av": 11, "xiang": 11, "z": [11, 25], "moor": 11, "hurst": 11, "luca": 11, "rochet": 11, "gaillardin": 11, "tallada": 11, "garzon": 11, "thode": 11, "daga": 11, "cruzado": 11, "jimenez": 11, "sanchez": 11, "del": 11, "rei": 11, "benito": 11, "dominguez": 11, "revuelta": 11, "moreno": 11, "armstrong": 11, "forsburg": 11, "cerutti": 11, "low": 11, "mccombi": 11, "paulsen": 11, "potashkin": 11, "shpakovski": 11, "usseri": 11, "barrel": 11, "nurs": 11, "natur": 11, "415": 11, "6874": 11, "871": 11, "880": 11, "2002": 11, "11859360": 11, "remark": 11, "erratum": 11, "2003": 11, "6918": 11, "cerrutti": 11, "hansen": 11, "mitochondria": 11, "11": [11, 22, 33], "785": 11, "795": 11, "2005": 11, "15811919": 11, "consrtm": 11, "consortium": 11, "european": 11, "sanger": 11, "institut": 11, "wellcom": 11, "trust": 11, "campu": 11, "hinxton": 11, "cambridg": 11, "cb10": 11, "1sa": 11, "pombas": 11, "mar": [11, 22, 40], "univers": [11, 13, 22, 40], "hopkin": 11, "tenni": 11, "court": 11, "rd": 11, "unit": 11, "kingdom": 11, "On": 11, "2012": 11, "al672256": 11, "al009197": 11, "al009227": 11, "al021046": 11, "al021809": 11, "al021813": 11, "al021817": 11, "al031180": 11, "al034486": 11, "al034565": 11, "al034583": 11, "al035064": 11, "al035248": 11, "al035254": 11, "al035439": 11, "al096845": 11, "al109734": 11, "al109738": 11, "al109739": 11, "al109770": 11, "al109820": 11, "al109831": 11, "al109832": 11, "al109951": 11, "al109988": 11, "al110469": 11, "al110509": 11, "al117210": 11, "al117212": 11, "al117213": 11, "al117390": 11, "al121732": 11, "al121741": 11, "al121745": 11, "al121764": 11, "al121765": 11, "al121770": 11, "al122032": 11, "al132667": 11, "al132675": 11, "al132714": 11, "al132769": 11, "al132779": 11, "al132798": 11, "al132828": 11, "al132839": 11, "al132983": 11, "al132984": 11, "al133154": 11, "al133156": 11, "al133157": 11, "al133225": 11, "al133302": 11, "al133357": 11, "al133359": 11, "al133360": 11, "al133361": 11, "al133442": 11, "al133498": 11, "al133521": 11, "al133522": 11, "al135751": 11, "al136078": 11, "al136235": 11, "al136499": 11, "al136521": 11, "al136538": 11, "al137130": 11, "al138666": 11, "al138854": 11, "al139315": 11, "al157734": 11, "al157811": 11, "al157872": 11, "al157917": 11, "al157993": 11, "al157994": 11, "al158056": 11, "al159180": 11, "al159951": 11, "al162531": 11, "al162631": 11, "al163031": 11, "al163071": 11, "al163191": 11, "al163481": 11, "al163529": 11, "al353014": 11, "al353860": 11, "al355012": 11, "al355013": 11, "al355252": 11, "al355452": 11, "al355632": 11, "al355652": 11, "al355653": 11, "al356333": 11, "al356335": 11, "al357232": 11, "al358272": 11, "al360054": 11, "al360094": 11, "al390095": 11, "al390274": 11, "al390814": 11, "al391713": 11, "al391744": 11, "al391746": 11, "al391783": 11, "al441621": 11, "al441624": 11, "al512486": 11, "al512487": 11, "al512491": 11, "al512493": 11, "al512496": 11, "al512549": 11, "al512562": 11, "al583902": 11, "al590562": 11, "al590582": 11, "al590602": 11, "al590605": 11, "al590902": 11, "al590903": 11, "al691401": 11, "al691402": 11, "al691405": 11, "z49811": 11, "z50112": 11, "z50113": 11, "z50142": 11, "z50728": 11, "z54096": 11, "z54142": 11, "z54285": 11, "z54308": 11, "z54328": 11, "z54354": 11, "z54366": 11, "z56276": 11, "z64354": 11, "z66568": 11, "z67757": 11, "z67961": 11, "z67998": 11, "z67999": 11, "z68136": 11, "z68144": 11, "z68166": 11, "z68197": 11, "z68198": 11, "z68887": 11, "z69086": 11, "z69239": 11, "z69240": 11, "z69368": 11, "z69369": 11, "z69380": 11, "z69725": 11, "z69726": 11, "z69727": 11, "z69728": 11, "z69729": 11, "z69730": 11, "z69731": 11, "z69795": 11, "z69796": 11, "z69944": 11, "z70043": 11, "z70690": 11, "z70691": 11, "z70721": 11, "z73099": 11, "z73100": 11, "z81312": 11, "z81317": 11, "z94864": 11, "z95334": 11, "z95395": 11, "z95396": 11, "z97185": 11, "z97208": 11, "z97209": 11, "z97210": 11, "z98056": 11, "z98529": 11, "z98530": 11, "z98531": 11, "z98532": 11, "z98533": 11, "z98559": 11, "z98560": 11, "z98595": 11, "z98596": 11, "z98597": 11, "z98598": 11, "z98600": 11, "z98601": 11, "z98602": 11, "z98603": 11, "z98762": 11, "z98763": 11, "z98849": 11, "z98944": 11, "z98974": 11, "z98975": 11, "z98977": 11, "z98978": 11, "z98979": 11, "z98980": 11, "z98981": 11, "z99091": 11, "z99126": 11, "z99161": 11, "z99162": 11, "z99163": 11, "z99164": 11, "z99165": 11, "z99166": 11, "z99167": 11, "z99168": 11, "z99258": 11, "z99259": 11, "z99260": 11, "z99261": 11, "z99262": 11, "z99292": 11, "z99295": 11, "z99296": 11, "z99531": 11, "z99532": 11, "z99568": 11, "z99753": 11, "4896": 11, "676": 11, "locus_tag": 11, "spom_spapb1a10": 11, "393": 11, "cac21481": 11, "mmtrmelrpleigfskaltevapvtcqcecwdhnlcssqasemdl": 11, "iyqsqdthscaskqdavfqllsetkipvpnryrkishrlstlsnkktlksqldrflsss": 11, "kklhnddvnrgdycfllstpvecsastnshsydclwnfscnsfpeyssysasetssva": 11, "ysyysgpnpatpsssscnlvnansldiylninnlkksksvprlrgqfmepvehnhplsk": 11, "sleeqssfleqskdassnltacnrsgsslssnfyssrlskktslaslnksraslqhkim": 11, "slsrniirrvfhkpevhldpsasilnlssshgesnltngllcqnfklfqddwlmedcap": 11, "danftlytplqpwekrsvkpeirrprlnpnffrvfvleaqmrragklsantagraqlii": 11, "lpkpavtfstsplhvel": 11, "1972": 11, "spom_spncrna": 11, "2846": 11, "ncrna": 11, "ncrna_class": 11, "lncrna": 11, "394": 11, "1001": 11, "3538": 11, "1173": 11, "1174": 11, "1597": 11, "1645": 11, "3416": 11, "cac21482": 11, "mqtvmmddiqstdsiaekdnhsnnesnftwkafreqvekhfski": 11, "rlhqvlgtdgdnsslfelfttamnaqlhemeqcqkkleddcqqridsirflvsslkltd": 11, "dtsslkiespliqclnrlsmvegqymaqydqklstikemyhklesycnrlgspfvlpdf": 11, "ensflsdvsdafteslrgrineaekeidarlevinsfeeeilglwselgvepadvpqy": 11, "qlleshtnrpndvyvtqelidqlckqkevfsaekekrsdhlksiqsevsnlwnklqvsp": 11, "neqsqfgdssninqenislweteleklhqlkkehlpifledcrqqilqlwdslfyseeq": 11, "rksftpmyediiteqvltahenyikqleaevsanksflslinryasliegkkeleassn": 11, "dasrltqrgrrdpglllreekirkrlsrelpkvqsllipeitaweerngrtflfydepl": 11, "lkicqeatqpkslyrsasaaanrpktatttdsvnrtpsqrgrvavpstpsvrsasramt": 11, "sprtplprvkntqnpsrsisaeppsatstanrrhptanridinarlnsasrsrsanmir": 11, "qgangsdsnmssspvsgnsntpfnkfpnsvsrnthfesksphpnysrtphetyskassk": 11, "nvplsppkqrvvnehalnimseklqrtnlkeqtpemdienssqnlpfspmkispirasp": 11, "vktipsspspttnifsaplnnitnctpmedewgeegf": 11, "3417": 11, "3510": 11, "ypt71": 11, "10c": 11, "3690": 11, "3691": 11, "4137": 11, "4192": 11, "4290": 11, "gtpase": 11, "cac21483": 11, "msaqkrvflkvvilgdsgvgktclmnqfvnqkfsreykatigadf": 11, "ltkdvvvddklvtlqlwdtagqerfqslgmafyrgadccvivynvnnsksfdsvenwrq": 11, "eflyqtsqdecafpfiivgnqidkdaskravslhraldyckskhgsnmihfeasak": 11, "nvtdlfetvsrlalenessrddfvndfseplllskplnntsscnc": 11, "4049": 11, "2847": 11, "atcatcagac": 11, "gtgtatttca": 11, "caagccagaa": 11, "gtgcatttgg": 11, "atccaagtgc": 11, "ctccatttta": 11, "aatctctcat": 11, "cttcgcatgg": 11, "cgaaagcaac": 11, "ctgacaaatg": 11, "gtttgctttg": 11, "tcaaaatttc": 11, "aagctttttc": 11, "aggatgattg": 11, "gttgatggag": 11, "gattgtgcgc": 11, "cagatgccaa": 11, "tttcactttg": 11, "tacaccccgc": 11, "ttcaaccctg": 11, "ggaaaagcga": 11, "agtgtgaaac": 11, "ctgaaatcag": 11, "acgtcctcga": 11, "ttaaatccta": 11, "attttttccg": 11, "agtatttgtt": 11, "ttagaagctc": 11, "aaatgcgacg": 11, "agctggaaag": 11, "ctatcagcaa": 11, "acactgctgg": 11, "ccgagcccag": 11, "ttaatttacc": 11, "tcccaaagcc": 11, "tgccgttacc": 11, "ttctccacta": 11, "gccctttgca": 11, "tgttgaattg": 11, "taaaaattta": 11, "acgcatgact": 11, "tatatacatt": 11, "tgcattcttc": 11, "caagctggtt": 11, "atatttattt": 11, "tcattttttt": 11, "ctcacccaat": 11, "acttttttat": 11, "ccctactgtc": 11, "tttatggaca": 11, "atcgactcac": 11, "aattgtttct": 11, "ttttgttgta": 11, "tatgattttt": 11, "tttttaaagg": 11, "aaatgggttt": 11, "cgcgatactg": 11, "ggttgaatcc": 11, "caattgcggt": 11, "taatattaca": 11, "taaaataatt": 11, "ctcccatagt": 11, "cctagatcct": 11, "gtctttgaat": 11, "atgagcaaat": 11, "aaaagaattg": 11, "aacaaatcat": 11, "gaatgctttt": 11, "ctctcttaga": 11, "tgatattttg": 11, "tatgcataag": 11, "tctaattata": 11, "ttgattacga": 11, "taagacttaa": 11, "aaagtaagcc": 11, "tttgtatcct": 11, "tttaagcagt": 11, "atttgaattt": 11, "tcttgtatca": 11, "tattttaggt": 11, "agagcaaaag": 11, "ataccagttt": 11, "gtagaacttt": 11, "atgtgcttcc": 11, "ttacattggt": 11, "atatttcagg": 11, "cacataaata": 11, "ttcttcaact": 11, "tacaattcta": 11, "agtattttgt": 11, "ttatactaaa": 11, "aggagctgaa": 11, "taacgtttat": 11, "acagtgctga": 11, "cattgaaatc": 11, "tatttgcttt": 11, "ctttggaata": 11, "taagcgcatg": 11, "ctgagttact": 11, "ttcgcaggcc": 11, "aagccatatc": 11, "caaccaccat": 11, "ttttgtgcca": 11, "agcttttatg": 11, "caaggttaat": 11, "tccttgtact": 11, "gcttgttatg": 11, "ttataatata": 11, "tcaacatctt": 11, "aacagttttc": 11, "atatcttcct": 11, "ttatattcta": 11, "ttaattgaat": 11, "ttcaaacatc": 11, "gttttattga": 11, "gctcatttac": 11, "atcaaccggt": 11, "tcaatgcaaa": 11, "cagtaatgat": 11, "ggatgacatt": 11, "caaagcactg": 11, "attctattgc": 11, "tgaaaaagat": 11, "aatcactcta": 11, "ataatgaatc": 11, "taactttact": 11, "tggaaagcgt": 11, "ttcgtgaaca": 11, "agtggaaaag": 11, "catttttcta": 11, "aaattgaaag": 11, "gcttcaccaa": 11, "gtccttggaa": 11, "cagatggaga": 11, "caattcatca": 11, "ttatttgagt": 11, "tgtttacaac": 11, "ggcaatgaat": 11, "gcccagcttc": 11, "atgaaatgga": 11, "acagtgccag": 11, "aaaaaacttg": 11, "aagatgactg": 11, "tcagcaaaga": 11, "attgattcaa": 11, "tcagattttt": 11, "ggtttcctca": 11, "ttaaagttaa": 11, "cggatgatac": 11, "ttctagtctc": 11, "aaaattgagt": 11, "ctcctttaat": 11, "tcagtgtttg": 11, "aatcgtttgt": 11, "caatggtaga": 11, "aggacaatat": 11, "atggcacagt": 11, "atgatcaaaa": 11, "gttaagtacg": 11, "attaaaggta": 11, "tgtaatcgtc": 11, "tttaatttag": 11, "acttgtgttt": 11, "taactgatgt": 11, "atagaaatgt": 11, "atcacaaatt": 11, "ggagtcatat": 11, "tgtaaccgct": 11, "taggaagtcc": 11, "gttcgtttta": 11, "cctgattttg": 11, "agaattcatt": 11, "tttatctgat": 11, "gtatccgatg": 11, "cttttactga": 11, "atctttgaga": 11, "ggacgcatca": 11, "acgaagccga": 11, "aaaggagatt": 11, "gatgcgagat": 11, "tagaggttat": 11, "taattccttt": 11, "gaagaagaaa": 11, "ttttgggttt": 11, "gtggtctgaa": 11, "ctcggtgttg": 11, "agcccgctga": 11, "tgttccacaa": 11, "tacgaacaat": 11, "tgcttgaatc": 11, "ccatactaat": 11, "cgaccaaatg": 11, "atgtttatgt": 11, "tactcaagaa": 11, "cttatcgacc": 11, "aactttgcaa": 11, "gcaaaaagaa": 11, "gttttttccg": 11, "ctgaaaaaga": 11, "aaagagaagt": 11, "gatcatttaa": 11, "aaagtataca": 11, "atcagaagtt": 11, "agcaacttgt": 11, "ggaataagct": 11, "tcaagtttct": 11, "cccaatgaac": 11, "aaagtcaatt": 11, "tggcgattca": 11, "tcaaacatta": 11, "atcaagaaaa": 11, "tatttcatta": 11, "tgggaaactg": 11, "aacttgaaaa": 11, "acttcatcag": 11, "ttaaaaaagg": 11, "agcatttacc": 11, "cattttttta": 11, "gaagactgtc": 11, "gtcaacaaat": 11, "tcttcagctt": 11, "tgggattctc": 11, "tgttttattc": 11, "agaagaacaa": 11, "agaaagtcct": 11, "ttacacctat": 11, "gtatgaagac": 11, "attattacag": 11, "agcaggttct": 11, "tacggcccat": 11, "gaaaactata": 11, "taaagcaact": 11, "agaggccgaa": 11, "gtttctgcta": 11, "ataagtcctt": 11, "tttaagctta": 11, "attaatcgct": 11, "atgcctcttt": 11, "aatagaagga": 11, "aagaaagagc": 11, "ttgaagctag": 11, "ttctaatgat": 11, "gcctctcgtc": 11, "taacacaacg": 11, "gggacgccgg": 11, "gacccaggtt": 11, "tacttctacg": 11, "tgaagagaaa": 11, "atccgtaagc": 11, "gactttctag": 11, "agaacttcct": 11, "aaggttcagt": 11, "cgctgcttat": 11, "accagagatt": 11, "acagcatggg": 11, "aagaaagaaa": 11, "tggaaggacg": 11, "ttcctttttt": 11, "atgatgaacc": 11, "acttctcaag": 11, "atttgccaag": 11, "aggccactca": 11, "accaaaatca": 11, "ttatatagaa": 11, "gtgcaagtgc": 11, "tgccgcaaac": 11, "cgcccgaaaa": 11, "cagcaactac": 11, "aacggactct": 11, "gttaatagaa": 11, "caccttctca": 11, "acgagggcgt": 11, "gtagctgtac": 11, "cttcaacacc": 11, "aagtgttagg": 11, "tccgcttctc": 11, "gagctatgac": 11, "gagtccaagg": 11, "acaccgcttc": 11, "ctagagtaaa": 11, "aaacactcaa": 11, "aatccaagtc": 11, "gttccattag": 11, "tgcagaaccg": 11, "ccatcagcaa": 11, "ccagtaccgc": 11, "caatagaaga": 11, "caccccactg": 11, "ctaatcgaat": 11, "tgatataaac": 11, "gctagattaa": 11, "acagtgctag": 11, "tcggtctcga": 11, "agcgcgaaca": 11, "tgataagaca": 11, "aggggcaaat": 11, "ggtagtgaca": 11, "gcaatatgtc": 11, "ttcttcaccc": 11, "gtttctggaa": 11, "attccaatac": 11, "cccttttaac": 11, "aagtttccaa": 11, "attctgtatc": 11, "tcgcaataca": 11, "cattttgaat": 11, "ccaagtcacc": 11, "gcacccaaat": 11, "tactctcgaa": 11, "ctcctcatga": 11, "aacgtattca": 11, "aaggcttcat": 11, "ctaagaacgt": 11, "cccattaagt": 11, "cctccaaagc": 11, "agcgtgtagt": 11, "taatgaacac": 11, "gctttaaata": 11, "ttatgtcgga": 11, "aaaattgcaa": 11, "agaactaatc": 11, "tgaaagaaca": 11, "aacacccgag": 11, "atggacattg": 11, "aaaacagctc": 11, "gcagaacctt": 11, "cctttttctc": 11, "ctatgaagat": 11, "atcccccata": 11, "agagcatcac": 11, "ccgtaaagac": 11, "aattccatca": 11, "tcaccgtccc": 11, "ccactaccaa": 11, "cattttttct": 11, "gctccactca": 11, "acaatattac": 11, "aaattgtaca": 11, "ccgatggagg": 11, "atgaatgggg": 11, "agaagaaggc": 11, "ttttaagctt": 11, "cttatttacc": 11, "taatcgatca": 11, "aatttaaata": 11, "tacatatttt": 11, "tgcatatgaa": 11, "tacagcatat": 11, "agataattca": 11, "taaaagttta": 11, "ttaactgagg": 11, "tcataattaa": 11, "aagactattt": 11, "acacctaaaa": 11, "aaaaacgtgt": 11, "atcaatagag": 11, "ggaaaagaga": 11, "agaattaaga": 11, "acagaaagta": 11, "accatagttt": 11, "tgttaaaata": 11, "gcaatgtaaa": 11, "aaaatattat": 11, "gaaaagaaaa": 11, "cgtatagcac": 11, "attttgaaat": 11, "gtaaaagaat": 11, "ctgagagagc": 11, "gtgtgaatat": 11, "ctagcaatta": 11, "caagaagatg": 11, "tattattcaa": 11, "aggctttgaa": 11, "agaagcaaag": 11, "gttcagagaa": 11, "gtcattaaca": 11, "aagtcatctc": 11, "tcgagctttc": 11, "attttctaaa": 11, "gctaaacgac": 11, "tgactgtttc": 11, "gaaaaggtca": 11, "gtaacgtttg": 11, "tattttcttt": 11, "tgcactagct": 11, "tcaaaatgaa": 11, "tcatatttga": 11, "tccatgtttg": 11, "gatttgcaat": 11, "agtcaagagc": 11, "tcgatgaaga": 11, "gatacggctc": 11, "gtttagacgc": 11, "gtctttgtcg": 11, "atttgatttc": 11, "caacgataat": 11, "3961": [11, 13], "gaaagggaat": 11, "gcacattcat": 11, "cttgtgaagt": 11, "ttgatataaa": 11, "aattcttgcc": 11, "tccagttttc": 11, "4021": [11, 13], "tactgagtca": 11, "aaagacttcg": 11, "agttattcac": 11, "attataaaca": 11, "attacacaac": 11, "aatcggcccc": 11, "4081": [11, 13], "tctgtaaaaa": 11, "gccattccca": 11, "ggctttgaaa": 11, "tcgttcttga": 11, "ccagcagtat": 11, "cccaaagctg": 11, "4141": [11, 13], "tttataatta": 11, "gcaaacgaat": 11, "ttagatgggc": 11, "ggaacttata": 11, "ttggaactta": 11, "cctgtaatgt": 11, "4201": [11, 13], "gaccaatttg": 11, "tcgtcaacca": 11, "caacgtcctt": 11, "ggttaaaaaa": 11, "tcagcaccga": 11, "tggtagcttt": 11, "4261": [11, 13], "atattcgcga": 11, "ctaaactttt": 11, "gattgacgaa": 11, "ctaaaatgac": 11, "gatgttaaca": 11, "aattgccaaa": 11, "4321": [11, 13], "gcaatactca": 11, "tagagaagct": 11, "gatgtaaaga": 11, "tcgttaacca": 11, "tatttgagct": 11, "agtatttaat": 11, "4381": [11, 13], "aacaaagtga": 11, "ataaatttta": 11, "aaagcaatca": 11, "ccttgtagcg": 11, "acaaataaca": 11, "acttatcgac": 11, "4441": [11, 13], "ataaaatcaa": 11, "tgggaaattg": 11, "cagtattgga": 11, "ttttacagct": 11, "caatacaaaa": 11, "accaaaaaga": 11, "4501": [11, 13], "aaaatatact": 11, "gaacgtataa": 11, "aatttaacgc": 11, "ttcaattg": 11, "min": [11, 17, 20], "max": [11, 27], "rightmost": 11, "simpleloc": [11, 16, 22, 34, 53, 58], "target_tm": [11, 14, 16, 17, 22, 31], "55": [11, 14, 16, 17, 22, 31], "fwd_align": 11, "rvs_align": 11, "fwd_primer_ase1": 11, "accatgtcgac": 11, "ad": [11, 13, 14, 19, 22, 24, 31], "rvs_primer_ase1": 11, "ggcgcgccat": 11, "accatgtcgacatgcaaacagtaatgatgga": 11, "57": [11, 14, 16, 56], "24061148156318": 11, "ggcgcgccattaaaagccttcttctccc": 11, "56": 11, "64459495003314": 11, "pcr_product": [11, 14, 17], "2263bp_pcr_prod": 11, "2263": 11, "pcr_product_description_descript": [11, 14], "2263bp": 11, "435": 11, "483": 11, "2254": 11, "31": [11, 14], "pcr_condit": [11, 14], "apeinfo_fwdcolor": [11, 14], "baffa3": [11, 14], "apeinfo_revcolor": [11, 14], "ffbaba": [11, 14], "2236": 11, "accatgtcga": 11, "catgcaaaca": 11, "gtaatgatgg": 11, "atgacattca": 11, "aagcactgat": 11, "tctattgctg": 11, "aaaaagataa": 11, "tcactctaat": 11, "aatgaatcta": 11, "actttacttg": 11, "gaaagcgttt": 11, "cgtgaacaag": 11, "tggaaaagca": 11, "tttttctaaa": 11, "attgaaaggc": 11, "ttcaccaagt": 11, "ccttggaaca": 11, "gatggagaca": 11, "attcatcatt": 11, "atttgagttg": 11, "tttacaacgg": 11, "caatgaatgc": 11, "ccagcttcat": 11, "gaaatggaac": 11, "agtgccagaa": 11, "aaaacttgaa": 11, "gatgactgtc": 11, "agcaaagaat": 11, "tgattcaatc": 11, "agatttttgg": 11, "tttcctcatt": 11, "aaagttaacg": 11, "gatgatactt": 11, "ctagtctcaa": 11, "aattgagtct": 11, "cctttaattc": 11, "agtgtttgaa": 11, "tcgtttgtca": 11, "atggtagaag": 11, "gacaatatat": 11, "ggcacagtat": 11, "gatcaaaagt": 11, "taagtacgat": 11, "taaaggtatg": 11, "taatcgtctt": 11, "taatttagac": 11, "ttgtgtttta": 11, "actgatgtat": 11, "agaaatgtat": 11, "cacaaattgg": 11, "agtcatattg": 11, "taaccgctta": 11, "ggaagtccgt": 11, "tcgttttacc": 11, "tgattttgag": 11, "aattcatttt": 11, "tatctgatgt": 11, "atccgatgct": 11, "tttactgaat": 11, "ctttgagagg": 11, "acgcatcaac": 11, "gaagccgaaa": 11, "aggagattga": 11, "tgcgagatta": 11, "gaggttatta": 11, "attcctttga": 11, "agaagaaatt": 11, "ttgggtttgt": 11, "ggtctgaact": 11, "cggtgttgag": 11, "cccgctgatg": 11, "ttccacaata": 11, "cgaacaattg": 11, "cttgaatccc": 11, "atactaatcg": 11, "accaaatgat": 11, "gtttatgtta": 11, "ctcaagaact": 11, "tatcgaccaa": 11, "ctttgcaagc": 11, "aaaaagaagt": 11, "tttttccgct": 11, "gaaaaagaaa": 11, "agagaagtga": 11, "tcatttaaaa": 11, "agtatacaat": 11, "cagaagttag": 11, "caacttgtgg": 11, "aataagcttc": 11, "aagtttctcc": 11, "caatgaacaa": 11, "agtcaatttg": 11, "gcgattcatc": 11, "aaacattaat": 11, "caagaaaata": 11, "tttcattatg": 11, "ggaaactgaa": 11, "cttgaaaaac": 11, "ttcatcagtt": 11, "aaaaaaggag": 11, "catttaccca": 11, "tttttttaga": 11, "agactgtcgt": 11, "caacaaattc": 11, "ttcagctttg": 11, "ggattctctg": 11, "ttttattcag": 11, "aagaacaaag": 11, "aaagtccttt": 11, "acacctatgt": 11, "atgaagacat": 11, "tattacagag": 11, "caggttctta": 11, "cggcccatga": 11, "aaactatata": 11, "aagcaactag": 11, "aggccgaagt": 11, "ttctgctaat": 11, "aagtcctttt": 11, "taagcttaat": 11, "taatcgctat": 11, "gcctctttaa": 11, "tagaaggaaa": 11, "gaaagagctt": 11, "gaagctagtt": 11, "ctaatgatgc": 11, "ctctcgtcta": 11, "acacaacggg": 11, "gacgccggga": 11, "cccaggttta": 11, "cttctacgtg": 11, "aagagaaaat": 11, "ccgtaagcga": 11, "ctttctagag": 11, "aacttcctaa": 11, "ggttcagtcg": 11, "ctgcttatac": 11, "cagagattac": 11, "agcatgggaa": 11, "gaaggacgtt": 11, "ccttttttat": 11, "gatgaaccac": 11, "ttctcaagat": 11, "ttgccaagag": 11, "gccactcaac": 11, "caaaatcatt": 11, "atatagaagt": 11, "gcaagtgctg": 11, "ccgcaaaccg": 11, "cccgaaaaca": 11, "gcaactacaa": 11, "cggactctgt": 11, "taatagaaca": 11, "ccttctcaac": 11, "gagggcgtgt": 11, "agctgtacct": 11, "tcaacaccaa": 11, "gtgttaggtc": 11, "cgcttctcga": 11, "gctatgacga": 11, "gtccaaggac": 11, "accgcttcct": 11, "agagtaaaaa": 11, "acactcaaaa": 11, "tccaagtcgt": 11, "tccattagtg": 11, "cagaaccgcc": 11, "atcagcaacc": 11, "agtaccgcca": 11, "atagaagaca": 11, "ccccactgct": 11, "aatcgaattg": 11, "atataaacgc": 11, "tagattaaac": 11, "agtgctagtc": 11, "ggtctcgaag": 11, "cgcgaacatg": 11, "ataagacaag": 11, "gggcaaatgg": 11, "tagtgacagc": 11, "aatatgtctt": 11, "cttcacccgt": 11, "ttctggaaat": 11, "tccaataccc": 11, "cttttaacaa": 11, "gtttccaaat": 11, "tctgtatctc": 11, "gcaatacaca": 11, "ttttgaatcc": 11, "aagtcaccgc": 11, "acccaaatta": 11, "ctctcgaact": 11, "cctcatgaaa": 11, "cgtattcaaa": 11, "ggcttcatct": 11, "aagaacgtcc": 11, "cattaagtcc": 11, "tccaaagcag": 11, "cgtgtagtta": 11, "atgaacacgc": 11, "tttaaatatt": 11, "atgtcggaaa": 11, "aattgcaaag": 11, "aactaatctg": 11, "aaagaacaaa": 11, "cacccgagat": 11, "ggacattgaa": 11, "aacagctcgc": 11, "agaaccttcc": 11, "tttttctcct": 11, "atgaagatat": [11, 14], "cccccataag": 11, "agcatcaccc": 11, "gtaaagacaa": 11, "ttccatcatc": 11, "accgtccccc": 11, "actaccaaca": 11, "ttttttctgc": 11, "tccactcaac": 11, "aatattacaa": 11, "attgtacacc": 11, "gatggaggat": 11, "gaatggggag": 11, "aagaaggctt": 11, "ttaatggcgc": 11, "gcc": 11, "plasmid_digest": 11, "gene_digest": 11, "3916": 11, "2255": 11, "circularis": [11, 15], "synthetic_vector": 11, "6163": 11, "1408": 11, "395": 11, "396": 11, "1205": 11, "463": 11, "482": 11, "1211": 11, "1512": 11, "1531": 11, "1513": 11, "1618": 11, "1635": 11, "1789": 11, "2377": 11, "1869": 11, "1888": 11, "2548": 11, "3408": 11, "3171": 11, "3190": 11, "3409": 11, "3513": 11, "3581": 11, "3599": 11, "3637": 11, "3659": 11, "3759": 11, "3778": 11, "3859": 11, "3877": 11, "3876": 11, "3918": 11, "4341": 11, "4389": 11, "6160": 11, "3937": 11, "6142": 11, "cgcgccagat": 11, "ctgtttagct": 11, "tgcctcgtcc": 11, "ccgccgggtc": 11, "acccggccag": 11, "cgacatggag": 11, "gcccagaata": 11, "ccctccttga": 11, "cagtcttgac": 11, "gtgcgcagct": 11, "caggggcatg": 11, "atgtgactgt": 11, "cgcccgtaca": 11, "tttagcccat": 11, "acatccccat": 11, "gtataatcat": 11, "ttgcatccat": 11, "acattttgat": 11, "ggccgcacgg": 11, "cgcgaagcaa": 11, "aaattacggc": 11, "tcctcgctgc": 11, "agacctgcga": 11, "gcagggaaac": 11, "gctcccctca": 11, "cagacgcgtt": 11, "gaattgtccc": 11, "cacgccgcgc": 11, "ccctgtagag": 11, "aaatataaaa": 11, "ggttaggatt": 11, "tgccactgag": 11, "gttcttcttt": 11, "catatacttc": 11, "cttttaaaat": 11, "cttgctagga": 11, "tacagttctc": 11, "acatcacatc": 11, "cgaacataaa": 11, "caaccatggg": 11, "taaggaaaag": 11, "actcacgttt": 11, "cgaggccgcg": 11, "attaaattcc": 11, "aacatggatg": 11, "ctgatttata": 11, "tgggtataaa": 11, "tgggctcgcg": 11, "ataatgtcgg": 11, "gcaatcaggt": 11, "gcgacaatct": 11, "atcgattgta": 11, "tgggaagccc": 11, "gatgcgccag": 11, "agttgtttct": 11, "gaaacatggc": 11, "aaaggtagcg": 11, "ttgccaatga": 11, "tgttacagat": 11, "gagatggtca": 11, "gactaaactg": 11, "gctgacggaa": 11, "tttatgcctc": 11, "ttccgaccat": 11, "caagcatttt": 11, "atccgtactc": 11, "ctgatgatgc": 11, "atggttactc": 11, "accactgcga": 11, "tccccggcaa": 11, "aacagcattc": 11, "caggtattag": 11, "aagaatatcc": 11, "tgattcaggt": 11, "gaaaatattg": 11, "ttgatgcgct": 11, "ggcagtgttc": 11, "ctgcgccggt": 11, "tgcattcgat": 11, "tcctgtttgt": 11, "aattgtcctt": 11, "ttaacagcga": 11, "tcgcgtattt": 11, "cgtctcgctc": 11, "aggcgcaatc": 11, "acgaatgaat": 11, "aacggtttgg": 11, "ttgatgcgag": 11, "tgattttgat": 11, "gacgagcgta": 11, "atggctggcc": 11, "tgttgaacaa": 11, "gtctggaaag": 11, "aaatgcataa": 11, "gcttttgcca": 11, "ttctcaccgg": 11, "attcagtcgt": 11, "gatttctcac": 11, "ttgataacct": 11, "tatttttgac": 11, "gaggggaaat": 11, "taataggttg": 11, "tattgatgtt": 11, "ggacgagtcg": 11, "gaatcgcaga": 11, "ccgataccag": 11, "gatcttgcca": 11, "tcctatggaa": 11, "ctgcctcggt": 11, "gagttttctc": 11, "cttcattaca": 11, "gaaacggctt": 11, "tttcaaaaat": 11, "atggtattga": 11, "taatcctgat": 11, "atgaataaat": 11, "tgcagtttca": 11, "tttgatgctc": 11, "gatgagtttt": 11, "tctaatcagt": 11, "actgacaata": 11, "aaaagattct": 11, "tgttttcaag": 11, "aacttgtcat": 11, "ttgtatagtt": 11, "tttttatatt": 11, "gtagttgttc": 11, "tattttaatc": 11, "aaatgttagc": 11, "gtgatttata": 11, "ttttttttcg": 11, "cctcgacatc": 11, "atctgcccag": 11, "atgcgaagtt": 11, "aagtgcgcag": 11, "aaagtaatat": 11, "catgcgtcaa": 11, "tcgtatgtga": 11, "atgctggtcg": 11, "ctatactgct": 11, "gtcgattcga": 11, "tactaacgcc": 11, "gccatccagt": 11, "ttaaacgagc": 11, "tcgaattcat": 11, "cgatgatatc": 11, "agatccacta": 11, "gtggcctatg": 11, "cggccgcgga": 11, "tctgccggtc": 11, "tccctatagt": 11, "gagtcgtatt": 11, "aatttcgata": 11, "agccaggtta": 11, "acctgcatta": 11, "atgaatcggc": 11, "caacgcgcgg": 11, "ggagaggcgg": 11, "tttgcgtatt": 11, "gggcgctctt": 11, "ccgcttcctc": 11, "gctcactgac": 11, "tcgctgcgct": 11, "cggtcgttcg": 11, "gctgcggcga": 11, "gcggtatcag": 11, "ctcactcaaa": 11, "ggcggtaata": 11, "cggttatcca": 11, "cagaatcagg": 11, "ggataacgca": 11, "ggaaagaaca": 11, "tgtgagcaaa": 11, "aggccagcaa": 11, "aaggccagga": 11, "accgtaaaaa": 11, "ggccgcgttg": 11, "ctggcgtttt": 11, "tccataggct": 11, "ccgcccccct": 11, "gacgagcatc": 11, "acaaaaatcg": 11, "acgctcaagt": 11, "cagaggtggc": 11, "gaaacccgac": 11, "aggactataa": 11, "agataccagg": 11, "cgtttccccc": 11, "tggaagctcc": 11, "ctcgtgcgct": 11, "ctcctgttcc": 11, "gaccctgccg": 11, "cttaccggat": 11, "acctgtccgc": 11, "ctttctccct": 11, "tcgggaagcg": 11, "tggcgctttc": 11, "tcatagctca": 11, "cgctgtaggt": 11, "atctcagttc": 11, "ggtgtaggtc": 11, "gttcgctcca": 11, "agctgggctg": 11, "tgtgcacgaa": 11, "ccccccgttc": 11, "agcccgaccg": 11, "ctgcgcctta": 11, "tccggtaact": 11, "atcgtcttga": 11, "gtccaacccg": 11, "gtaagacacg": 11, "acttatcgcc": 11, "actggcagca": 11, "gccactggta": 11, "acaggattag": 11, "cagagcgagg": 11, "tatgtaggcg": 11, "gtgctacaga": 11, "gttcttgaag": 11, "tggtggccta": 11, "actacggcta": 11, "cactagaaga": 11, "acagtatttg": 11, "gtatctgcgc": 11, "tctgctgaag": 11, "ccagttacct": 11, "tcggaaaaag": 11, "agttggtagc": 11, "tcttgatccg": 11, "gcaaacaaac": 11, "caccgctggt": 11, "agcggtggtt": 11, "tttttgtttg": 11, "caagcagcag": 11, "attacgcgca": 11, "gaaaaaaagg": 11, "atctcaagaa": 11, "gatcctttga": 11, "tcttttctac": 11, "ggggtctgac": 11, "gctcagtgga": 11, "acgaaaactc": 11, "acgttaaggg": 11, "attttggtca": 11, "tgagattatc": 11, "ttcacctaga": 11, "tccttttaaa": 11, "ttaaaaatga": 11, "agttttaaat": 11, "caatctaaag": 11, "tatatatgag": 11, "taaacttggt": 11, "ctgacagtta": 11, "ccaatgctta": 11, "atcagtgagg": 11, "cacctatctc": 11, "agcgatctgt": 11, "ctatttcgtt": 11, "catccatagt": 11, "tgcctgactc": 11, "cccgtcgtgt": 11, "agataactac": 11, "gatacgggag": 11, "ggcttaccat": 11, "ctggccccag": 11, "tgctgcaatg": 11, "ataccgcgag": 11, "acccacgctc": 11, "accggctcca": 11, "gatttatcag": 11, "caataaacca": 11, "gccagccgga": 11, "agggccgagc": 11, "gcagaagtgg": 11, "tcctgcaact": 11, "ttatccgcct": 11, "ccatccagtc": 11, "tattaattgt": 11, "tgccgggaag": 11, "ctagagtaag": 11, "tagttcgcca": 11, "gttaatagtt": 11, "tgcgcaacgt": 11, "tgttgccatt": 11, "gctacaggca": 11, "tcgtggtgtc": 11, "acgctcgtcg": 11, "tttggtatgg": 11, "cttcattcag": 11, "ctccggttcc": 11, "caacgatcaa": 11, "ggcgagttac": 11, "atgatccccc": 11, "atgttgtgca": 11, "aaaaagcggt": 11, "tagctccttc": 11, "ggtcctccga": 11, "tcgttgtcag": 11, "aagtaagttg": 11, "gccgcagtgt": 11, "tatcactcat": 11, "ggttatggca": 11, "gcactgcata": 11, "attctcttac": 11, "tgtcatgcca": 11, "tccgtaagat": 11, "gcttttctgt": 11, "gactggtgag": 11, "tactcaacca": 11, "agtcattctg": 11, "agaatagtgt": 11, "atgcggcgac": 11, "cgagttgctc": 11, "ttgcccggcg": 11, "tcaatacggg": 11, "ataataccgc": 11, "gccacatagc": 11, "agaactttaa": 11, "aagtgctcat": 11, "cattggaaaa": 11, "cgttcttcgg": 11, "ggcgaaaact": 11, "ctcaaggatc": 11, "ttaccgctgt": 11, "tgagatccag": 11, "ttcgatgtaa": 11, "cccactcgtg": 11, "cacccaactg": 11, "atcttcagca": 11, "tcttttactt": 11, "tcaccagcgt": 11, "ttctgggtga": 11, "gcaaaaacag": 11, "gaaggcaaaa": 11, "tgccgcaaaa": 11, "aagggaataa": 11, "gggcgacacg": 11, "gaaatgttga": 11, "atactcatac": 11, "tcttcctttt": 11, "tcaatattat": 11, "tgaagcattt": 11, "atcagggtta": 11, "ttgtctcatg": 11, "agcggataca": 11, "tatttgaatg": 11, "tatttagaaa": 11, "aataaacaaa": 11, "taggggttcc": 11, "gcgcacattt": 11, "ccccgaaaag": 11, "tgccacctga": 11, "cgtctaagaa": 11, "accattatta": 11, "tcatgacatt": 11, "aacctataaa": 11, "aataggcgta": 11, "tcacgaggcc": 11, "ctttcgtctc": 11, "gcgcgtttcg": 11, "gtgatgacgg": 11, "tgaaaacctc": 11, "tgacacatgc": 11, "agctcccgga": 11, "gacggtcaca": 11, "gcttgtctgt": 11, "aagcggatgc": 11, "cgggagcaga": 11, "caagcccgtc": 11, "agggcgcgtc": 11, "agcgggtgtt": 11, "ggcgggtgtc": 11, "ggggctggct": 11, "taactatgcg": 11, "gcatcagagc": 11, "agattgtact": 11, "gagagtgcac": 11, "catatggaca": 11, "tattgtcgtt": 11, "agaacgcggc": 11, "tacaattaat": 11, "acataacctt": 11, "atgtatcata": 11, "cacatacgat": 11, "ttaggtgaca": 11, "ctatagaacg": 11, "cggccgccag": 11, "ctgaagcttc": 11, "gtacgctgca": 11, "ggtcgacatg": 11, "caaacagtaa": 11, "tgatggatga": 11, "cattcaaagc": 11, "actgattcta": 11, "ttgctgaaaa": 11, "agataatcac": 11, "tctaataatg": 11, "aatctaactt": 11, "tacttggaaa": 11, "gcgtttcgtg": 11, "aacaagtgga": 11, "aaagcatttt": 11, "tctaaaattg": 11, "aaaggcttca": 11, "ccaagtcctt": 11, "ggaacagatg": 11, "gagacaattc": 11, "atcattattt": 11, "gagttgttta": 11, "caacggcaat": 11, "gaatgcccag": 11, "cttcatgaaa": 11, "tggaacagtg": 11, "ccagaaaaaa": 11, "cttgaagatg": 11, "actgtcagca": 11, "aagaattgat": 11, "tcaatcagat": 11, "ttttggtttc": 11, "ctcattaaag": 11, "ttaacggatg": 11, "atacttctag": 11, "tctcaaaatt": 11, "gagtctcctt": 11, "taattcagtg": 11, "tttgaatcgt": 11, "ttgtcaatgg": 11, "tagaaggaca": 11, "atatatggca": 11, "cagtatgatc": 11, "aaaagttaag": 11, "tacgattaaa": 11, "ggtatgtaat": 11, "cgtctttaat": 11, "ttagacttgt": 11, "gttttaactg": 11, "atgtatagaa": 11, "atgtatcaca": 11, "aattggagtc": 11, "atattgtaac": 11, "cgcttaggaa": 11, "gtccgttcgt": 11, "tttacctgat": 11, "tttgagaatt": 11, "catttttatc": 11, "tgatgtatcc": 11, "gatgctttta": 11, "ctgaatcttt": 11, "gagaggacgc": 11, "atcaacgaag": 11, "ccgaaaagga": 11, "gattgatgcg": 11, "agattagagg": 11, "ttattaattc": 11, "4561": [11, 13], "ctttgaagaa": 11, "gaaattttgg": 11, "gtttgtggtc": 11, "tgaactcggt": 11, "gttgagcccg": 11, "ctgatgttcc": 11, "4621": [11, 13], "acaatacgaa": 11, "caattgcttg": 11, "aatcccatac": 11, "taatcgacca": 11, "aatgatgttt": 11, "atgttactca": 11, "4681": [11, 13], "agaacttatc": 11, "gaccaacttt": 11, "gcaagcaaaa": 11, "agaagttttt": 11, "tccgctgaaa": 11, "aagaaaagag": 11, "4741": [11, 13], "aagtgatcat": 11, "ttaaaaagta": 11, "tacaatcaga": 11, "agttagcaac": 11, "ttgtggaata": 11, "agcttcaagt": 11, "4801": [11, 13], "ttctcccaat": 11, "gaacaaagtc": 11, "aatttggcga": 11, "ttcatcaaac": 11, "attaatcaag": 11, "aaaatatttc": 11, "4861": [11, 13], "attatgggaa": 11, "actgaacttg": 11, "aaaaacttca": 11, "tcagttaaaa": 11, "aaggagcatt": 11, "tacccatttt": 11, "4921": [11, 13], "tttagaagac": 11, "tgtcgtcaac": 11, "aaattcttca": 11, "gctttgggat": 11, "tctctgtttt": 11, "attcagaaga": 11, "4981": [11, 13], "acaaagaaag": 11, "tcctttacac": 11, "ctatgtatga": 11, "agacattatt": 11, "acagagcagg": 11, "ttcttacggc": 11, "5041": 11, "ccatgaaaac": 11, "tatataaagc": 11, "aactagaggc": 11, "cgaagtttct": 11, "gctaataagt": 11, "cctttttaag": 11, "5101": 11, "cttaattaat": 11, "cgctatgcct": 11, "ctttaataga": 11, "aggaaagaaa": 11, "gagcttgaag": 11, "ctagttctaa": 11, "5161": 11, "tgatgcctct": 11, "cgtctaacac": 11, "aacggggacg": 11, "ccgggaccca": 11, "ggtttacttc": 11, "tacgtgaaga": 11, "5221": 11, "gaaaatccgt": 11, "aagcgacttt": 11, "ctagagaact": 11, "tcctaaggtt": 11, "cagtcgctgc": 11, "ttataccaga": 11, "5281": 11, "gattacagca": 11, "tgggaagaaa": 11, "gaaatggaag": 11, "gacgttcctt": 11, "ttttatgatg": 11, "aaccacttct": 11, "5341": 11, "caagatttgc": 11, "caagaggcca": 11, "ctcaaccaaa": 11, "atcattatat": 11, "agaagtgcaa": 11, "gtgctgccgc": 11, "5401": 11, "aaaccgcccg": 11, "aaaacagcaa": 11, "ctacaacgga": 11, "ctctgttaat": 11, "agaacacctt": 11, "ctcaacgagg": 11, "5461": 11, "gcgtgtagct": 11, "gtaccttcaa": 11, "caccaagtgt": 11, "taggtccgct": 11, "tctcgagcta": 11, "tgacgagtcc": 11, "5521": 11, "aaggacaccg": 11, "cttcctagag": 11, "taaaaaacac": 11, "tcaaaatcca": 11, "agtcgttcca": 11, "ttagtgcaga": 11, "5581": 11, "accgccatca": 11, "gcaaccagta": 11, "ccgccaatag": 11, "aagacacccc": 11, "actgctaatc": 11, "gaattgatat": 11, "5641": 11, "aaacgctaga": 11, "ttaaacagtg": 11, "ctagtcggtc": 11, "tcgaagcgcg": 11, "aacatgataa": 11, "gacaaggggc": 11, "5701": 11, "aaatggtagt": 11, "gacagcaata": 11, "tgtcttcttc": 11, "acccgtttct": 11, "ggaaattcca": 11, "ataccccttt": 11, "5761": 11, "taacaagttt": 11, "ccaaattctg": 11, "tatctcgcaa": 11, "tacacatttt": 11, "gaatccaagt": 11, "caccgcaccc": 11, "5821": 11, "aaattactct": 11, "cgaactcctc": 11, "atgaaacgta": 11, "ttcaaaggct": 11, "tcatctaaga": 11, "acgtcccatt": 11, "5881": 11, "aagtcctcca": 11, "aagcagcgtg": 11, "tagttaatga": 11, "acacgcttta": 11, "aatattatgt": 11, "cggaaaaatt": 11, "5941": 11, "gcaaagaact": 11, "aatctgaaag": 11, "aacaaacacc": 11, "cgagatggac": 11, "attgaaaaca": 11, "gctcgcagaa": 11, "6001": 11, "ccttcctttt": 11, "tctcctatga": 11, "agatatcccc": 11, "cataagagca": 11, "tcacccgtaa": 11, "agacaattcc": 11, "6061": 11, "atcatcaccg": 11, "tcccccacta": 11, "ccaacatttt": 11, "ttctgctcca": [11, 13], "ctcaacaata": 11, "ttacaaattg": 11, "6121": 11, "tacaccgatg": 11, "gaggatgaat": 11, "ggggagaaga": 11, "aggcttttaa": 11, "tgg": 11, "power": [12, 15, 22, 24], "continu": [12, 52], "seamless": 12, "reaction": [12, 23], "daniel": 12, "colleagu": 12, "2009": 12, "wide": 12, "biotechnologi": 12, "fpr": 12, "frag": [12, 15, 22, 25, 33], "homologi": [12, 17, 22, 25, 31], "terminal_overlap": [12, 16, 27], "anywher": 12, "happen": [12, 19], "event": [12, 55], "fragment1": 12, "acgatgctatactgccccctgtgctgtgctcta": [12, 22, 25, 29], "fragment2": 12, "tgtgctgtgctctattttttattctggctgtatc": [12, 22, 25, 29], "fragment3": 12, "tattctggctgtatcgggggtacgatgctatactg": [12, 22, 25, 29], "14bp": [12, 22, 40], "33bp": [12, 22, 25], "34bp": [12, 22, 25], "35bp": [12, 22, 25], "node": [12, 22, 25, 31, 38], "overlap": [12, 15, 16, 17, 22, 25, 31, 34, 38, 58], "element": [12, 13, 22, 49], "contig": [12, 18, 22, 25, 31], "assembly_circ": 12, "59": [12, 16, 56], "o59": [12, 22, 25], "acga": 12, "gggt": 12, "tgct": 12, "ccca": 12, "comput": [13, 58], "content": [13, 19, 52, 53, 56], "lcl": 13, "1_cds_aaa98665": 13, "1_1": 13, "gbkei": 13, "tcctccatatacaacggtatctccacctcaggtttagatctcaacaacggaaccattgcc": 13, "gacatgagacagttaggtatcgtcgagagttacaagctaaaacgagcagtagtcagctct": 13, "gcatctgaagccgctgaagttctactaagggtggataacatcatccgtgcaagaccaaga": 13, "accgccaatagacaacatatgtaa": 13, "accordingli": 13, "scu49845": 13, "oct": 13, "2018": 13, "partial": 13, "brewer": 13, "roemer": 13, "madden": 13, "snyder": 13, "axial": 13, "growth": 13, "novel": 13, "dev": 13, "777": 13, "793": 13, "1996": 13, "8846915": 13, "22": 13, "feb": [13, 22, 34], "yale": 13, "haven": 13, "ct": 13, "06520": 13, "ssiyngistsgldlnngtiadmrqlgivesyklkravvssaseaa": 13, "evllrvdniirarprtanrqhm": 13, "687": 13, "mtqlqisllltatisllhlvvatpyeaypigkqyppvarvnesft": 13, "fqisndtykssvdktaqityncfdlpswlsfdsssrtfsgepssdllsdanttlyfnvi": 13, "legtdsadstslnntyqfvvtnrpsislssdfnllallknygytngknalkldpnevfn": 13, "vtfdrsmftneesivsyygrsqlynaplpnwlffdsgelkftgtapvinsaiapetsi": 13, "fviiatdiegfsavevefelvigahqlttsiqnsliinvtdtgnvsydlplnyvylddd": 13, "pissdklgsinlldapdwvaldnatisgsvpdellgknsnpanfsvsiydtygdviyfn": 13, "fevvsttdlfaisslpninatrgewfsyyflpsqftdyvntnvsleftnssqdhdwvkf": 13, "qssnltlagevpknfdklslglkanqgsqsqelyfniigmdskithsnhsanatstrss": 13, "hhststssytsstytakisstsaaatssapaalpaanktsshnkkavaiacgvaiplgv": 13, "ilvalicflifwrrrrenpddenlphaisgpdlnnpankpnqenatplnnpfdddassi": 13, "ddtsiarrlaalntlkldnhsatesdissvdekrdslsgmntyndqfqsqskeellakp": 13, "pvqppespffdpqnrsssvymdsepavnkswrytgnlspvsdivrdsygsqktvdtekl": 13, "fdleapekekrtsrdvtmssldpwnsnispspvrksvtpspynvtkhrnrhlqniqdsq": 13, "sgkngitpttmstsssddfvpvkdgenfcwvhsmepdrrpskkrlvdfsnksnvnvgqv": 13, "kdihgripeml": 13, "3300": 13, "mnrwvekwlrvylkcyinlilfyrnvyppqsfdyttyqsfnlpqf": 13, "vpinrhpalidyieelildvlsklthvyrfsiciinkkndlciekyvldfselqhvdkd": 13, "dqiitetevfdefrsslnslimhleklpkvnddtitfeavinaielelghkldrnrrvd": 13, "sleekaeierdsnwvkcqedenlpdnngfqppkikltslvgsdvgpliihqfseklisg": 13, "ddkilngvysqyeegesifgslf": 13, "gatcctccat": 13, "atacaacggt": 13, "atctccacct": 13, "caggtttaga": 13, "tctcaacaac": 13, "ggaaccattg": 13, "ccgacatgag": 13, "acagttaggt": 13, "atcgtcgaga": 13, "gttacaagct": 13, "aaaacgagca": 13, "gtagtcagct": 13, "ctgcatctga": 13, "agccgctgaa": 13, "gttctactaa": 13, "gggtggataa": 13, "catcatccgt": 13, "gcaagaccaa": 13, "gaaccgccaa": 13, "tagacaacat": 13, "atgtaacata": 13, "tttaggatat": 13, "acctcgaaaa": 13, "taataaaccg": 13, "ccacactgtc": 13, "attattataa": 13, "ttagaaacag": 13, "aacgcaaaaa": 13, "ttatccacta": 13, "tataattcaa": 13, "agacgcgaaa": 13, "aaaaaagaac": 13, "aacgcgtcat": 13, "agaacttttg": 13, "gcaattcgcg": 13, "tcacaaataa": 13, "attttggcaa": 13, "cttatgtttc": 13, "ctcttcgagc": 13, "agtactcgag": 13, "ccctgtctca": 13, "agaatgtaat": 13, "aatacccatc": 13, "gtaggtatgg": 13, "ttaaagatag": 13, "catctccaca": 13, "acctcaaagc": 13, "tccttgccga": 13, "gagtcgccct": 13, "cctttgtcga": 13, "gtaattttca": 13, "cttttcatat": 13, "gagaacttat": 13, "tttcttattc": 13, "tttactctca": 13, "catcctgtag": 13, "tgattgacac": 13, "tgcaacagcc": 13, "accatcacta": 13, "gaagaacaga": 13, "acaattactt": 13, "aatagaaaaa": 13, "ttatatcttc": 13, "ctcgaaacga": 13, "tttcctgctt": 13, "ccaacatcta": 13, "cgtatatcaa": 13, "gaagcattca": 13, "cttaccatga": 13, "cacagcttca": 13, "gatttcatta": 13, "ttgctgacag": 13, "ctactatatc": 13, "actactccat": 13, "ctagtagtgg": 13, "ccacgcccta": 13, "tgaggcatat": 13, "cctatcggaa": 13, "aacaataccc": 13, "cccagtggca": 13, "agagtcaatg": 13, "aatcgtttac": 13, "atttcaaatt": 13, "tccaatgata": 13, "cctataaatc": 13, "gtctgtagac": 13, "aagacagctc": 13, "aaataacata": 13, "caattgcttc": 13, "gacttaccga": 13, "gctggctttc": 13, "gtttgactct": 13, "agttctagaa": 13, "cgttctcagg": 13, "tgaaccttct": 13, "tctgacttac": 13, "tatctgatgc": 13, "gaacaccacg": 13, "ttgtatttca": 13, "atgtaatact": 13, "cgagggtacg": 13, "gactctgccg": 13, "acagcacgtc": 13, "tttgaacaat": 13, "acataccaat": 13, "ttgttgttac": 13, "aaaccgtcca": 13, "tccatctcgc": 13, "tatcgtcaga": 13, "tttcaatcta": 13, "ttggcgttgt": 13, "taaaaaacta": 13, "tggttatact": 13, "aacggcaaaa": 13, "acgctctgaa": 13, "actagatcct": 13, "aatgaagtct": 13, "tcaacgtgac": 13, "ttttgaccgt": 13, "tcaatgttca": 13, "ctaacgaaga": 13, "atccattgtg": 13, "tcgtattacg": 13, "gacgttctca": 13, "gttgtataat": 13, "gcgccgttac": 13, "ccaattggct": 13, "gttcttcgat": 13, "tctggcgagt": 13, "tgaagtttac": 13, "tgggacggca": 13, "ccggtgataa": 13, "actcggcgat": 13, "tgctccagaa": 13, "acaagctaca": 13, "gttttgtcat": 13, "catcgctaca": 13, "gacattgaag": 13, "gattttctgc": 13, "cgttgaggta": 13, "gaattcgaat": 13, "tagtcatcgg": 13, "ggctcaccag": 13, "ttaactacct": 13, "ctattcaaaa": 13, "tagtttgata": 13, "atcaacgtta": 13, "ctgacacagg": 13, "taacgtttca": 13, "tatgacttac": 13, "ctctaaacta": 13, "tgtttatctc": 13, "gatgacgatc": 13, "ctatttcttc": 13, "tgataaattg": 13, "ggttctataa": 13, "acttattgga": 13, "tgctccagac": 13, "tgggtggcat": 13, "tagataatgc": 13, "taccatttcc": 13, "gggtctgtcc": 13, "cagatgaatt": 13, "actcggtaag": 13, "aactccaatc": 13, "ctgccaattt": 13, "ttctgtgtcc": 13, "atttatgata": 13, "cttatggtga": 13, "tgtgatttat": 13, "ttcaacttcg": 13, "aagttgtctc": 13, "cacaacggat": 13, "ttgtttgcca": 13, "ttagttctct": 13, "tcccaatatt": 13, "aacgctacaa": 13, "ggggtgaatg": 13, "gttctcctac": 13, "tattttttgc": 13, "cttctcagtt": 13, "tacagactac": 13, "gtgaatacaa": 13, "acgtttcatt": 13, "agagtttact": 13, "aattcaagcc": 13, "aagaccatga": 13, "ctgggtgaaa": 13, "ttccaatcat": 13, "ctaatttaac": 13, "attagctgga": 13, "gaagtgccca": 13, "agaatttcga": 13, "caagctttca": 13, "ttaggtttga": 13, "aagcgaacca": 13, "aggttcacaa": 13, "tctcaagagc": 13, "tatattttaa": 13, "catcattggc": 13, "atggattcaa": 13, "agataactca": 13, "ctcaaaccac": 13, "agtgcgaatg": 13, "caacgtccac": 13, "aagaagttct": 13, "caccactcca": 13, "cctcaacaag": 13, "ttcttacaca": 13, "tcttctactt": 13, "acactgcaaa": 13, "aatttcttct": 13, "acctccgctg": 13, "ctgctacttc": 13, "gcagcgctgc": 13, "cagcagccaa": 13, "taaaacttca": 13, "tctcacaata": 13, "aaaaagcagt": 13, "agcaattgcg": 13, "tgcggtgttg": 13, "ctatcccatt": 13, "aggcgttatc": 13, "ctagtagctc": 13, "tcatttgctt": 13, "cctaatattc": 13, "tggagacgca": 13, "gaagggaaaa": 13, "tccagacgat": 13, "gaaaacttac": 13, "cgcatgctat": 13, "tagtggacct": 13, "gatttgaata": 13, "atcctgcaaa": 13, "taaaccaaat": 13, "caagaaaacg": 13, "ctacaccttt": 13, "gaacaacccc": 13, "tttgatgatg": 13, "atgcttcctc": 13, "gtacgatgat": 13, "acttcaatag": 13, "caagaagatt": 13, "ggctgctttg": 13, "aacactttga": 13, "aattggataa": 13, "ccactctgcc": 13, "actgaatctg": 13, "atatttccag": 13, "cgtggatgaa": 13, "aagagagatt": 13, "ctctatcagg": 13, "tatgaataca": 13, "tacaatgatc": 13, "agttccaatc": 13, "ccaaagtaaa": 13, "gaagaattat": 13, "tagcaaaacc": 13, "cccagtacag": 13, "cctccagaga": 13, "gcccgttctt": 13, "tgacccacag": 13, "aataggtctt": 13, "cttctgtgta": 13, "tatggatagt": 13, "gaaccagcag": 13, "taaataaatc": 13, "ctggcgatat": 13, "actggcaacc": 13, "tgtcaccagt": 13, "ctctgatatt": 13, "gtcagagaca": 13, "gttacggatc": 13, "acaaaaaact": 13, "gttgatacag": 13, "aaaaactttt": 13, "cgatttagaa": 13, "gcaccagaga": 13, "aggaaaaacg": 13, "tacgtcaagg": 13, "gatgtcacta": 13, "tgtcttcact": 13, "ggacccttgg": 13, "aacagcaata": 13, "ttagcccttc": 13, "tcccgtaaga": 13, "aaatcagtaa": 13, "caccatcacc": 13, "atataacgta": 13, "acgaagcatc": 13, "gtaaccgcca": 13, "cttacaaaat": 13, "attcaagact": 13, "ctcaaagcgg": 13, "taaaaacgga": 13, "atcactccca": 13, "caacaatgtc": 13, "aacttcatct": 13, "tctgacgatt": 13, "ttgttccggt": 13, "taaagatggt": 13, "gaaaattttt": 13, "gctgggtcca": 13, "tagcatggaa": 13, "ccagacagaa": 13, "gaccaagtaa": 13, "gaaaaggtta": 13, "gtagattttt": 13, "caaataagag": 13, "taatgtcaat": 13, "gttggtcaag": 13, "ttaaggacat": 13, "tcacggacgc": 13, "atcccagaaa": 13, "tgctgtgatt": 13, "atacgcaacg": 13, "atattttgct": 13, "taattttatt": 13, "ttcctgtttt": 13, "attttttatt": 13, "agtggtttac": 13, "agatacccta": 13, "tattttattt": 13, "agtttttata": 13, "cttagagaca": 13, "tttaatttta": 13, "attccattct": 13, "tcaaatttca": 13, "tttttgcact": 13, "taaaacaaag": 13, "atccaaaaat": 13, "gctctcgccc": 13, "tcttcatatt": 13, "gagaatacac": 13, "tccattcaaa": 13, "attttgtcgt": 13, "caccgctgat": 13, "taatttttca": 13, "ctaaactgat": 13, "gaataatcaa": 13, "aggccccacg": 13, "tcagaaccga": 13, "ctaaagaagt": 13, "gagttttatt": 13, "ttaggaggtt": 13, "gaaaaccatt": 13, "attgtctggt": 13, "aaattttcat": 13, "cttcttgaca": 13, "tttaacccag": 13, "tttgaatccc": 13, "tttcaatttc": 13, "tgctttttcc": 13, "tccaaactat": 13, "cgaccctcct": 13, "gtttctgtcc": 13, "aacttatgtc": 13, "ctagttccaa": 13, "ttcgatcgca": 13, "ttaataactg": 13, "cttcaaatgt": 13, "tattgtgtca": 13, "tcgttgactt": 13, "taggtaattt": 13, "ctccaaatgc": 13, "ataatcaaac": 13, "tatttaagga": 13, "agatcggaat": 13, "tcgtcgaaca": 13, "cttcagtttc": 13, "cgtaatgatc": 13, "tgatcgtctt": 13, "tatccacatg": 13, "ttgtaattca": 13, "ctaaaatcta": 13, "aaacgtattt": 13, "ttcaatgcat": 13, "aaatcgttct": 13, "ttttattaat": 13, "aatgcagatg": 13, "gaaaatctgt": 13, "aaacgtgcgt": 13, "taatttagaa": 13, "agaacatcca": 13, "gtataagttc": 13, "ttctatatag": 13, "tcaattaaag": 13, "caggatgcct": 13, "attaatggga": 13, "acgaactgcg": 13, "gcaagttgaa": 13, "tgactggtaa": 13, "gtagtgtagt": 13, "cgaatgactg": 13, "aggtgggtat": 13, "acatttctat": 13, "aaaataaaat": 13, "caaattaatg": 13, "tagcatttta": 13, "agtataccct": 13, "cagccacttc": 13, "tctacccatc": 13, "tattcataaa": 13, "gctgacgcaa": 13, "cgattactat": 13, "tttttttttc": 13, "ttcttggatc": 13, "tcagtcgtcg": 13, "caaaaacgta": 13, "taccttcttt": 13, "ttccgacctt": 13, "ttttttagct": 13, "ttctggaaaa": 13, "gtttatatta": 13, "gttaaacagg": 13, "gtctagtctt": 13, "agtgtgaaag": 13, "ctagtggttt": 13, "cgattgactg": 13, "atattaagaa": 13, "agtggaaatt": 13, "aaattagtag": 13, "tgtagacgta": 13, "tatgcatatg": 13, "tatttctcgc": 13, "ctgtttatgt": 13, "ttctacgtac": 13, "ttttgattta": 13, "tagcaagggg": 13, "aaaagaaata": 13, "catactattt": 13, "tttggtaaag": 13, "gtgaaagcat": 13, "aatgtaaaag": 13, "ctagaataaa": 13, "atggacgaaa": 13, "taaagagagg": 13, "cttagttcat": 13, "cttttttcca": 13, "aaaagcaccc": 13, "aatgataata": 13, "actaaaatga": 13, "aaaggatttg": 13, "ccatctgtca": 13, "gcaacatcag": 13, "ttgtgtgagc": 13, "aataataaaa": 13, "tcatcacctc": 13, "cgttgccttt": 13, "agcgcgtttg": 13, "tcgtttgtat": 13, "cttccgtaat": 13, "tttagtctta": 13, "tcaatgggaa": 13, "tcataaattt": 13, "tccaatgaat": 13, "tagcaatttc": 13, "gtccaattct": 13, "ttttgagctt": 13, "cttcatattt": 13, "gctttggaat": 13, "tcttcgcact": 13, "tcttttccca": 13, "ttcatctctt": 13, "tcttcttcca": 13, "aagcaacgat": 13, "ccttctaccc": 13, "atttgctcag": 13, "agttcaaatc": 13, "ggcctctttc": 13, "agtttatcca": 13, "ttgcttcctt": 13, "cagtttggct": 13, "tcactgtctt": 13, "ctagctgttg": 13, "ttctagatcc": 13, "tggtttttct": 13, "tggtgtagtt": 13, "ctcattatta": 13, "gatctcaagt": 13, "tattggagtc": 13, "ttcagccaat": 13, "tgctttgtat": 13, "cagacaattg": 13, "actctctaac": 13, "ttctccactt": 13, "cactgtcgag": 13, "ttgctcgttt": 13, "ttagcggaca": 13, "aagatttaat": 13, "ctcgttttct": 13, "ttttcagtgt": 13, "tagattgctc": 13, "taattctttg": 13, "agctgttctc": 13, "tcagctcctc": 13, "atatttttct": 13, "tgccatgact": 13, "cagattctaa": 13, "ttttaagcta": 13, "ttcaatttct": 13, "ctttgatc": 13, "highlight": [13, 17, 22, 34], "alon": [13, 14, 22, 34], "obtain": [13, 19, 55], "1_cds_aaa98667": 13, "1_3": 13, "atgaatagatgggtagagaagtggctgagggtatacttaaaatgctacattaatttgattttattttata": 13, "gaaatgtatacccacctcagtcattcgactacactacttaccagtcattcaacttgccgcagttcgttcc": 13, "cattaataggcatcctgctttaattgactatatagaagaacttatactggatgttctttctaaattaacg": 13, "cacgtttacagattttccatctgcattattaataaaaagaacgatttatgcattgaaaaatacgttttag": 13, "attttagtgaattacaacatgtggataaagacgatcagatcattacggaaactgaagtgttcgacgaatt": 13, "ccgatcttccttaaatagtttgattatgcatttggagaaattacctaaagtcaacgatgacacaataaca": 13, "tttgaagcagttattaatgcgatcgaattggaactaggacataagttggacagaaacaggagggtcgata": 13, "gtttggaggaaaaagcagaaattgaaagggattcaaactgggttaaatgtcaagaagatgaaaatttacc": 13, "agacaataatggttttcaacctcctaaaataaaactcacttctttagtcggttctgacgtggggcctttg": 13, "attattcatcagtttagtgaaaaattaatcagcggtgacgacaaaattttgaatggagtgtattctcaat": 13, "atgaagagggcgagagcatttttggatctttgttttaa": 13, "atgaatagatgggtagagaagtggctgagggtatacttaaaatgctacattaatttgatt": 13, "ttattttatagaaatgtatacccacctcagtcattcgactacactacttaccagtcattc": 13, "aacttgccgcagttcgttcccattaataggcatcctgctttaattgactatatagaagaa": 13, "cttatactggatgttctttctaaattaacgcacgtttacagattttccatctgcattatt": 13, "aataaaaagaacgatttatgcattgaaaaatacgttttagattttagtgaattacaacat": 13, "gtggataaagacgatcagatcattacggaaactgaagtgttcgacgaattccgatcttcc": 13, "ttaaatagtttgattatgcatttggagaaattacctaaagtcaacgatgacacaataaca": 13, "tttgaagcagttattaatgcgatcgaattggaactaggacataagttggacagaaacagg": 13, "agggtcgatagtttggaggaaaaagcagaaattgaaagggattcaaactgggttaaatgt": 13, "caagaagatgaaaatttaccagacaataatggttttcaacctcctaaaataaaactcact": 13, "tctttagtcggttctgacgtggggcctttgattattcatcagtttagtgaaaaattaatc": 13, "agcggtgacgacaaaattttgaatggagtgtattctcaatatgaagagggcgagagcatt": 13, "tttggatctttgttttaa": 13, "guess": [13, 22, 31], "whether": [13, 55], "unexpect": 13, "seqio": [13, 22, 34], "seqio_pars": 13, "seq_record": 13, "is_circular": 13, "dseq_record": 13, "walk": 14, "stretch": [14, 22, 31], "ensur": [14, 22, 33, 52], "appropri": 14, "care": [14, 22, 24], "quick": [14, 15, 22, 33], "popular": 14, "web": 14, "servci": 14, "primer3plu": 14, "quickli": 14, "expect": [14, 22, 24, 48, 51], "300": [14, 22, 34], "18": [14, 22, 31, 34, 40], "sample_seq": [14, 15], "fwd_primer": [14, 16], "attcctgcagagtacatc": 14, "rvs_primer": [14, 16], "accatccgaagatatctt": 14, "45bp_pcr_prod": 14, "45bp": 14, "attcctgcag": 14, "agtacatcaa": 14, "ttctatgaag": 14, "atatcttcgg": 14, "atggt": 14, "section": [14, 53], "retain": [14, 15], "hindiii": 14, "aagctt": 14, "accident": 14, "hybridis": 14, "aagcttattcctgcagagtacatc": 14, "aagcttaccatccgaagatatctt": 14, "pcr_product_hindiii": 14, "57bp_pcr_prod": 14, "57bp": 14, "21": 14, "48": [14, 16, 17, 22, 34, 42], "aagcttattc": 14, "ctgcagagta": 14, "catcaattct": 14, "cttcggatgg": 14, "taagctt": 14, "attribut": [14, 22, 24, 58], "attcctgcagagtacatcaattctatgaagatatcttcggatggt": 14, "5attcctgcagagtacatc": 14, "aagatatcttcggatggt3": 14, "3ttctatagaagcctacca5": 14, "5attcctgcagagtacatc3": 14, "3taaggacgtctcatgtag": 14, "ttctatagaagcctacca5": 14, "suppli": [14, 22, 33], "mind": 14, "degre": 14, "celciu": 14, "50": [14, 22, 39, 42, 56], "pcr_product_f45": 14, "example_gene_r45": 14, "f45": 14, "attcctgcagagtaca": 14, "r45": 14, "accatccgaagatatct": 14, "formula": [14, 22, 33, 56], "rychlik": [14, 56], "1990": [14, 52, 56], "taken": 14, "fp": [14, 22, 31, 56], "rp": [14, 22, 31, 56], "aim": 14, "forward_prim": [14, 17, 22, 23, 24, 31], "gaattcattcctgcagagtacatca": 14, "primers_sixf": 14, "pcr_product_forward_prim": 14, "accatccgaagatatcttca": 14, "gaattcattc": 14, "come": 14, "mention": [14, 22, 31], "deriv": 14, "phusion": [14, 56], "concentr": [14, 16, 56], "buffer": 14, "strength": 14, "primer_f": 14, "attcctgcagagtacatca": 14, "primer_r": 14, "tm_f": 14, "tm_r": 14, "901005046706075": 14, "841913263215304": 14, "explor": [15, 19], "conjug": 15, "vast": 15, "varieti": 15, "recognis": 15, "blunt": [15, 22, 33, 34, 53], "genenr": 15, "338bp": 15, "cut_record": 15, "338": 15, "aattcttc": 15, "tgtg": 15, "gaag": 15, "acacttaa": 15, "recognit": [15, 16, 22, 33], "ecorv": 15, "multi_cut_record": 15, "214": 15, "tgat": 15, "acta": 15, "73": 15, "agat": 15, "tcta": 15, "coupl": 15, "10kb": 15, "togeth": [15, 16, 22, 33, 34, 45], "oper": 15, "occur": [15, 22, 42], "ligated_product": 15, "261": 15, "perfect": 15, "match": [15, 22, 31, 48], "realli": 15, "doesn": 15, "inde": 15, "oppos": 15, "roman": 15, "numer": [15, 22, 33], "spell": 15, "act": 15, "place": [15, 17, 19, 22, 33, 52], "o261": 15, "psti": 15, "within": [15, 47], "cutand": 15, "cut_record2": 15, "222": 15, "gagt": 15, "taactgca": 15, "acgtctca": 15, "attg": 15, "context": 16, "flexibl": [16, 24], "typic": [16, 19], "sequtil": [16, 58], "meltingtemp": 16, "nearest": 16, "neighbor": 16, "thermodynam": [16, 56], "santalucia": 16, "hick": 16, "2004": 16, "common": [16, 22, 27, 29, 33, 53], "salt": [16, 56], "cours": 16, "those": [16, 22, 33], "dive": 16, "atgcaaacagtaatgatgga": [16, 17], "attatctttttcagcaatagaatca": [16, 17], "047602641480864": 16, "54": [16, 56], "55481807340169": 16, "programmat": 16, "conc": [16, 56], "prodcod": [16, 56], "websit": 16, "slower": 16, "cannot": [16, 22, 33], "guarante": 16, "nor": 16, "tm_neb": [16, 22, 31, 56], "q5": [16, 56], "hybrid": 16, "ggttcaatgcaaacagtaatgatggatgacattcaaagcactgattctattgctgaataacatttacatca": 16, "align": [16, 17], "71997924024873": 16, "atgcaaacagtaatgatggatgac": 16, "22377911083646": 16, "ttattcagcaatagaatcagtgctttg": 16, "But": 16, "That": 16, "easi": 16, "fwd_primer_ecori": 16, "ttgaattc": 16, "rvs_primer_ecori": 16, "ttgaattcatgcaaacagtaatgatggatgac": 16, "ttgaattcttattcagcaatagaatcagtgctttg": 16, "bst4ci": 16, "acngt": 16, "iupacdata": 16, "ambiguous_dna_valu": 16, "concret": 16, "imagin": 16, "linearli": 16, "seq1": 16, "atgcaaacagtaatgatggatgacattcaaagcactgattctattgctgaaaaagataat": [16, 17], "seq2": 16, "cactctaataatgaatctaactttacttggaaagcgtttcgtgaacaagtggaaaagcat": 16, "pre_amplicon1": 16, "pre_amplicon2": 16, "Then": [16, 22, 33], "amplicon1": [16, 22, 31], "amplicon2": [16, 22, 31], "fwd_1": 16, "rvs_1": 16, "fwd_2": 16, "rvs_2": 16, "sep": 16, "gagtgattatctttttcagcaatagaatcagtgc": 16, "ataatcactctaataatgaatctaactttacttggaaa": 16, "atgcttttccacttgttcacg": 16, "atgcaaacagtaatgatggatgacattcaaagcactgattctattgctgaaaaagataatcactc": 16, "ataatcactctaataatgaatctaactttacttggaaagcgtttcgtgaacaagtggaaaagcat": 16, "onc": [16, 22, 33], "detail": [16, 22, 33, 56], "65bp_pcr_prod": 16, "120": 16, "11matgcaaacagtaatgatggatgac": 16, "0mattcaaagcactgattctattgctgaaaaagataatcactctaataatgaatctaactttacttggaaagcgtttcgtgaacaagtggaaaagcat": 16, "tacgtttgtcattactacctactgtaagtttcgtgactaagataacgactttttctattagtgagattattacttagattgaaatgaacctttcgcaaagcacttgttcaccttttcgta": 16, "agcatatgcaaacagtaatgatggatgac": 16, "tgcatatgcttttccacttgttcacg": 16, "70bp_pcr_prod": 16, "o120": 16, "agcat": 16, "0mattcaaagcactgattctattgctgaaaaagataatcactctaataatgaatctaactttacttggaaagcgtttcgtgaacaagtggaaa": 16, "tcgtatacgtttgtcattactacctactgtaagtttcgtgactaagataacgactttttctattagtgagattattacttagattgaaatgaacctttcgcaaagcacttgttcaccttt": 16, "shorter": 16, "maxlink": [16, 22, 31], "spacer1": 16, "aaa": [16, 22, 33, 34, 35, 42, 58], "spacer2": 16, "ttt": [16, 22, 33, 34, 58], "gcattttatgcaaacagtaatgatggatgacattcaaagcactgattctattgctgaaaaagataataaacactctaataatgaatctaactttacttggaaagcgtttcgtgaacaagtggaaaa": 16, "summaris": 16, "graphic": 16, "dsr": 17, "y": [17, 22, 25, 27, 34, 53], "my_gen": 17, "11matgcaaacagtaatgatggatgacattcaaagcactgattctattgctgaaaaagataat": 17, "0m": [17, 22, 34], "tacgtttgtcattactacctactgtaagtttcgtgactaagataacgactttttctatta": 17, "atgcaaacag": 17, "taatgatgga": 17, "tgacattcaa": 17, "agcactgatt": 17, "ctattgctga": 17, "aaaagataat": 17, "reverse_prim": [17, 22, 23, 24, 31], "5atgcaaacagtaatgatgga": 17, "tgattctattgctgaaaaagataat3": 17, "3actaagataacgactttttctatta5": 17, "5atgcaaacagtaatgatgga3": 17, "3tacgtttgtcattactacct": 17, "actaagataacgactttttctatta5": 17, "sai": 17, "just": [17, 22, 33, 52], "ccccggatcc": 17, "ttttggatcc": 17, "3actaagataacgactttttctattacctaggtttt5": 17, "5ccccggatccatgcaaacagtaatgatgga3": 17, "clearli": 17, "turn": [17, 52, 58], "0mggatccaaaa": 17, "ggggcctaggtacgtttgtcattactacctactgtaagtttcgtgactaagataacgactttttctattacctaggtttt": 17, "bamhi": [17, 22, 33, 34], "ggatcc": [17, 22, 31, 33, 34, 53, 58], "payload": 17, "11m": [17, 22, 34], "0mccccg": 17, "ggggcctag": 17, "70": 17, "gatcc": [17, 22, 33, 34], "0mg": 17, "gtacgtttgtcattactacctactgtaagtttcgtgactaagataacgactttttctattacctag": 17, "0mgatccaaaa": 17, "gtttt": 17, "aatgtttttccctcccgggcaaaatagatcttgctatgcatcatcgatct": 17, "vect": 17, "o50": 17, "0maatgtttttccctcccgggcaaaatagatcttgctatgcatcatcgatct": 17, "ttacaaaaagggagggcccgttttatctagaacgatacgtagtagctaga": 17, "bglii": 17, "agatct": 17, "linear_vector_bgl": 17, "coordin": 17, "rec_vector": 17, "o116": 17, "aatgtttttccctcccgggcaaaatagatcc": 17, "0mggatcttgctatgcatcatcgatct": 17, "ttacaaaaagggagggcccgttttatctaggtacgtttgtcattactacctactgtaagtttcgtgactaagataacgactttttctattacctagaacgatacgtagtagctaga": 17, "aatgtttttccctcactacgtgctatgcatcat": 17, "fragment_a": 17, "tgctatgcatcatctatggacactctaataatg": 17, "fragment_b": 17, "cactctaataatgttacataaatgtttttccct": 17, "fragment_c": 17, "asm": 17, "Or": 17, "o60": 17, "0maatgtttttccctcactacgtgctatgcatcatctatggacactctaataatgttacata": 17, "ttacaaaaagggagtgatgcacgatacgtagtagatacctgtgagattattacaatgtat": 17, "_pretti": 18, "_thermodynamic_data": 18, "fusionpcr": 18, "gatewai": 18, "genbankfil": 18, "goldeng": 18, "myenzym": 18, "reader": [18, 19, 22, 24, 34, 42], "sequence_pick": 18, "threading_timer_decorator_exit": 18, "user_clon": 18, "copyright": [19, 55], "2013": [19, 22, 34, 42], "bj\u00f6rn": 19, "johansson": 19, "reserv": 19, "licens": [19, 55], "govern": 19, "creation": 19, "amplif": [19, 22, 31, 56], "past": [19, 22, 48, 52], "agaros": [19, 45], "capac": 19, "capit": 19, "letter": [19, 58], "lowercas": [19, 22, 33, 34], "directli": [19, 22, 23, 29, 33, 34, 40], "view": 19, "doctr": 19, "automaticli": 19, "manual": [19, 45], "advanc": 19, "tab": 19, "introspect": 19, "capabl": 19, "open_config_fold": [19, 22, 40], "enter": 19, "spyder": 19, "cursor": 19, "press": 19, "ctrl": 19, "bring": 19, "snippet": 19, "greater": 19, "sign": [19, 52], "41": [19, 53], "42": 19, "itself": [19, 22, 58], "collect": [19, 57], "open_current_fold": 19, "getcwd": 19, "configur": 19, "pydna_config_dir": 19, "quicker": [19, 22, 40], "configpars": 19, "system": [19, 22, 40], "loglevel": 19, "myemail": 19, "data_dir": 19, "home": [19, 22, 35, 42], "bjorn": [19, 22, 35, 42], "log_dir": 19, "tclsh": 19, "appmain": [19, 35], "tcl": [19, 35], "cached_func": 19, "genbank_nucleotid": 19, "dropbox": 19, "wikidata": 19, "restrictionenzym": 19, "address": [19, 22, 40], "someon": 19, "own": 19, "explicitli": 19, "amplify_ann": 19, "assembly_assembli": 19, "dseqrecord_sync": 19, "comma": 19, "entri": [19, 22, 40, 47], "pydna_cached_func": 19, "open_log_fold": 19, "get_env": 19, "pydna_": [19, 22, 33], "logo": 19, "art": 19, "logotyp": 19, "nicer": [20, 52, 53], "str": [20, 22, 25, 27, 29, 33, 34, 35, 40, 42, 43, 48, 52, 53, 54, 56, 58], "_repr_pretty_": 20, "rk": 20, "uc": 20, "berkelei": 20, "prettyt": [20, 52], "field_nam": 20, "kwarg": [20, 22, 23, 24, 25, 29, 31, 33, 34, 35, 40, 41, 43, 48, 50, 52, 53, 55, 56, 58], "lol": 20, "__all__": 22, "circular_assembly_frag": [22, 31], "primerlist": [22, 48], "seqenc": [22, 24], "int": [22, 24, 25, 27, 31, 33, 34, 36, 52, 53, 56, 58], "option": [22, 24, 25, 27, 31, 33, 34, 35, 52, 56, 58], "arg": [22, 23, 24, 29, 33, 34, 35, 40, 41, 43, 48, 50, 52, 53, 55, 56, 58], "usag": [22, 24, 33, 51], "valueerror": [22, 24, 33, 42], "rais": [22, 24, 33, 42, 52], "greedili": [22, 24], "flatten": [22, 24, 58], "sublcass": [22, 24], "preceed": [22, 24], "tacactcaccgtctatcattatctactatcgactgtatcatctgatagcac": [22, 24], "p1": [22, 24, 33], "tacactcaccgtctatcattatc": [22, 24], "p2": [22, 24, 33], "cgactgtatcatctgatagcac": [22, 24], "reverse_compl": [22, 23, 24, 29, 33, 34, 41, 43, 50, 52, 53], "callabl": [22, 25], "tupl": [22, 25, 27, 33, 42, 52, 58], "meant": [22, 23, 25, 29, 38], "easier": [22, 25, 38, 40], "shortest": [22, 25, 27, 33], "consid": [22, 25, 34, 58], "determin": [22, 25], "max_nod": [22, 25], "maximum": [22, 25, 31, 34], "tweak": [22, 25], "acgatgctatactgccccctgtgctgtgctctattttttattctggctgtatcgggggt": [22, 25], "cs570233": [22, 40], "nuclotid": [22, 40], "parament": [22, 40], "func": [22, 31, 34, 40, 56], "pydna_email": [22, 40], "easiest": [22, 40], "permanantli": [22, 40], "connect": [22, 40, 55], "pat": [22, 40], "mai": [22, 31, 33, 34, 40], "patent": [22, 40], "wo2007025016": [22, 40], "artifici": [22, 40], "shaw": [22, 40], "cottenoir": [22, 40], "inhibit": [22, 40], "metallo": [22, 40], "wo": [22, 40], "2007025016": [22, 40], "a1": [22, 40], "texa": [22, 40], "tech": [22, 40], "u": [22, 30, 33, 40, 52, 58], "unassign": [22, 40], "32630": [22, 40], "aptam": [22, 40], "inhibitor": [22, 40], "atgttcctac": [22, 40], "atga": [22, 34, 40], "users_email": [22, 40], "facilit": [22, 33, 40], "valid": [22, 33, 40, 52, 58], "contact": [22, 40], "bjornjobb": [22, 40], "gmail": [22, 40], "rec": [22, 40], "lp002422": [22, 40], "5e": [22, 34], "hold": [22, 23, 29, 30, 33, 34], "addition": [22, 34], "meta": [22, 30, 33, 34], "o7": [22, 33, 34], "concept": [22, 34], "larger": [22, 34], "stagger": [22, 33, 34], "gatccttt": [22, 33, 34], "aaagcctag": [22, 33, 34], "bool": [22, 31, 33, 34, 49, 51, 52, 53, 56, 58], "reflect": [22, 34], "shape": [22, 33, 34], "wiki": [22, 33, 34, 49, 52, 53], "from_str": [22, 29, 33, 34, 43], "from_seqrecord": [22, 23, 29, 34, 41, 43], "mass": [22, 34, 36], "gram": [22, 34, 36], "atgtaa": [22, 34, 53], "gt": [22, 34, 53], "type_": [22, 34, 53], "exactposit": [22, 34, 53], "base64": [22, 34, 52, 53], "urlsaf": [22, 34, 52, 53], "ldseguid": [22, 34], "tewydy0ugvgxh3vjnvwgtxoydqa": [22, 34], "underli": [22, 34], "o3": [22, 33, 34, 42], "tolinear": [22, 33, 34], "deprec": [22, 31, 33, 34], "terminal_transferas": [22, 33, 34], "02": [22, 34], "sequec": [22, 34], "obj": [22, 34], "AND": [22, 34, 55], "lost": [22, 34], "_new": [22, 34], "find_aminoacid": [22, 34], "atgtacgatcgtatgctggttatattttag": [22, 34], "mydrmlvif": [22, 34], "rml": [22, 34], "mmm": [22, 34], "rc": [22, 23, 29, 33, 34, 41, 42, 43, 52, 53, 58], "lkynqhtivh": [22, 34], "qht": [22, 34], "slc": [22, 34], "find_aa": [22, 34], "cgtatgctg": [22, 34], "gcatacgac": [22, 34], "map_trace_fil": [22, 34], "pth": [22, 34, 58], "throw": [22, 34, 52], "except": [22, 33, 34, 42, 51, 52], "excactli": [22, 34], "no_cutt": [22, 33, 34], "batch": [22, 33, 34, 47], "restrictionbatch": [22, 33, 34, 47], "unique_cutt": [22, 33, 34], "once_cutt": [22, 33, 34], "twice_cutt": [22, 33, 34], "n_cutter": [22, 33, 34], "cutter": [22, 33, 34], "number_of_cut": [22, 34], "ggaatt": [22, 23, 29, 34, 41, 43], "ccttaa": [22, 23, 29, 34, 41, 43], "aattcc": [22, 23, 29, 34, 41, 43], "ttaagg": [22, 23, 29, 34, 41, 43], "ref": [22, 34], "gaat": [22, 34], "o4": [22, 34], "ctta": [22, 34], "tact": [22, 34], "ccc": [22, 34], "atgaccc": [22, 34], "tactggg": [22, 34], "gacccat": [22, 34], "ctgggta": [22, 34], "uppercas": [22, 33, 34], "minsiz": [22, 34, 52], "orfs_to_featur": [22, 34], "x1b": [22, 34], "plain": [22, 34], "gaaat": [22, 34], "cttta": [22, 34], "symbol": [22, 34, 52], "aaat": [22, 34, 58], "ttta": [22, 34], "aaatg": [22, 34], "tttac": [22, 34], "aata": [22, 34], "ttat": [22, 34], "param": [22, 34, 52], "xxx": [22, 33, 34], "dseqrecord_frag": [22, 34], "frag1": [22, 34], "frag2": [22, 34], "cctag": [22, 33, 34], "apply_cut": [22, 33, 34], "left_cut": [22, 33, 34, 58], "right_cut": [22, 33, 34, 58], "byte": [22, 33, 52, 58], "po": [22, 33], "antisens": [22, 23, 33], "explan": [22, 33], "interpret": [22, 33, 52], "gggaaat": [22, 33], "attempt": [22, 33], "half": [22, 31, 33, 52], "integ": [22, 33, 52], "five": [22, 33], "prime": [22, 33], "amount": [22, 33, 45], "agt": [22, 33], "actta": [22, 33], "attca": [22, 33], "traceback": [22, 33, 42, 52], "recent": [22, 33, 42, 52], "stdin": [22, 33, 42], "usr": [22, 33], "lib": [22, 33, 35, 42], "python2": [22, 33], "dist": [22, 33], "__init__": [22, 33], "els": [22, 33, 51], "tttcccc": [22, 33], "aaacccc": [22, 33], "ccccaaa": [22, 33], "ccccttt": [22, 33], "coerc": [22, 33], "ggggtttcccc": [22, 33], "aaagcccta": [22, 33], "mostli": [22, 30, 33, 53], "gac": [22, 33], "ta": [22, 33, 52, 56], "ctg": [22, 33], "o6": [22, 33], "cctagg": [22, 33], "ccgga": [22, 33], "ggcct": [22, 33], "tccgga": [22, 33], "aggcct": [22, 33], "trunc": [22, 33], "from_represent": [22, 33], "full_sequ": [22, 33], "order": [22, 31, 33, 58], "aaaaaa": [22, 33], "tttttt": [22, 33], "mw": [22, 33], "float": [22, 31, 33, 36, 45, 52, 56], "313": [22, 33], "304": [22, 33], "289": [22, 33], "329": [22, 33], "308": [22, 33], "79": [22, 33, 42], "dseqtyp": [22, 33], "_seqabstractbaseclass": [22, 33, 52], "_sy": [22, 33], "maxsiz": [22, 33], "behav": [22, 33, 52], "occurr": [22, 33], "NOT": [22, 33, 52, 55, 58], "atcgactgacgtgtt": [22, 33], "tagctgactgcacaa": [22, 33], "catcgatc": [22, 33], "gtagctag": [22, 33], "gatcgatg": [22, 33], "ctagctac": [22, 33], "typeerror": [22, 33, 52], "o8": [22, 33], "t4": [22, 33], "catcgat": [22, 33], "tagctag": [22, 33], "gtagcta": [22, 33], "catcga": [22, 33], "agctag": [22, 33], "357": [22, 33], "type5": [22, 33], "type3": [22, 33], "sticky5": [22, 33], "sticky3": [22, 33], "fill_in": [22, 33], "fill": [22, 33], "protrud": [22, 33], "activ": [22, 33], "exo": [22, 33], "klenow": [22, 33], "caaa": [22, 33], "cttt": [22, 33], "tttc": [22, 33], "caaag": [22, 33], "gtttc": [22, 33], "tac": [22, 33], "aaac": [22, 33], "tttg": [22, 33], "gttt": [22, 33], "en": [22, 33], "wikipedia": [22, 33], "klenow_frag": [22, 33], "the_exo": [22, 33], "_klenow_frag": [22, 33], "transcrib": [22, 33, 52], "helix": [22, 33, 52], "coding_dna": [22, 33, 52], "atggccattgtaatgggccgctgaaagggtgcccgatag": [22, 33, 52], "auggccauuguaaugggccgcugaaagggugcccgauag": [22, 33, 52], "inplac": [22, 33, 52], "mutableseq": [22, 33, 52], "immut": [22, 33, 52], "effect": [22, 33, 52], "mixtur": [22, 33, 52], "becom": [22, 33, 52], "threonin": [22, 33, 52], "selenocystein": [22, 33, 52], "plausibl": [22, 33, 52], "ration": [22, 33, 52], "my_protein": [22, 33, 52], "maivmgrt": [22, 33, 52], "maivmgru": [22, 33, 52], "stop_symbol": [22, 33, 52], "to_stop": [22, 33, 52], "mung": [22, 33], "treatment": [22, 33], "nucleas": [22, 33], "exonucleas": [22, 33], "bean": [22, 33], "ctaggg": [22, 33], "ctagg": [22, 33], "ggatc": [22, 33], "tcctag": [22, 33], "mung_bean_nucleas": [22, 33], "chew": [22, 33], "acitivti": [22, 33], "engin": [22, 33, 52], "gatcgatc": [22, 33], "ctagctag": [22, 33], "gatcgat": [22, 33], "gatcga": [22, 33], "gatcg": [22, 33], "gctag": [22, 33], "exo1_front": [22, 33], "resect": [22, 33], "exo1_end": [22, 33], "twice": [22, 31, 33], "isblunt": [22, 33], "gat": [22, 33], "cta": [22, 33], "gcta": [22, 33], "enzymestyp": [22, 33], "ggatccnnngaattc": [22, 33], "cctaggnnncttaag": [22, 33], "gatccnnngaattc": [22, 33], "gnnncttaag": [22, 33], "cutsite_is_valid": [22, 33], "cutsit": [22, 33], "_abstractcut": [22, 33], "fall": [22, 33], "outsid": [22, 33], "move": [22, 33], "get_cutsit": [22, 33], "cut_watson": [22, 33], "enz": [22, 33], "union": [22, 33], "_restrictionbatch": [22, 33], "aagaattcaagaattc": [22, 33], "aagaattcaa": [22, 33], "agaattcaa": [22, 33], "ttcttaagtt": [22, 33], "gaattc": [22, 33], "left_end_posit": [22, 33], "self": [22, 33], "aat": [22, 33], "right_end_posit": [22, 33], "get_cut_paramet": [22, 33], "is_left": [22, 33], "cut_crick": [22, 33], "subfrag": [22, 33], "get_cutsite_pair": [22, 33], "aagaattcaagaattcaa": [22, 33], "p3": [22, 33], "aag": [22, 33], "ttcttaa": [22, 33], "aattcaag": [22, 33], "gttcttaa": [22, 33], "aattcaa": [22, 33], "gtt": [22, 33], "ttcaagaa": [22, 33], "orient": [22, 33], "thrown": [22, 51], "greedi": [22, 49], "carefulli": [22, 49], "absolut": [22, 49], "mode": [22, 49, 53], "mix": [22, 49, 58], "tm_func": [22, 31], "_tm_default": [22, 31], "estimate_funct": [22, 31], "noth": [22, 31], "oligonuceotid": [22, 31], "substitut": [22, 31], "point": [22, 31], "reli": [22, 31], "extern": [22, 31, 35], "neb": [22, 31, 56], "estim": [22, 31], "dseqr": [22, 31], "atgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatg": [22, 31], "64": [22, 31, 53], "ampl": [22, 31], "f64": [22, 31], "mer": [22, 31], "atgactgctaacccttc": [22, 31], "r64": [22, 31], "catcgtaagtttcgaacg": [22, 31], "5atgactgctaacccttc": [22, 31], "cgttcgaaacttacgatg3": [22, 31], "3gcaagctttgaatgctac5": [22, 31], "5atgactgctaacccttc3": [22, 31], "3tactgacgattgggaag": [22, 31], "gcaagctttgaatgctac5": [22, 31], "pf": [22, 31], "ggatccatgactgct": [22, 31], "ttc": [22, 31], "ggatcccatcgtaag": [22, 31], "pcr_prod": [22, 31], "3gcaagctttgaatgctaccctagg5": [22, 31], "5ggatccatgactgctaacccttc3": [22, 31], "ggatccatgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatgggatcc": [22, 31], "atgactgctaacccttccttggtgttg": [22, 31], "27": [22, 31], "atgactgctaaccct": [22, 31], "ttg": [22, 31], "32": [22, 31, 56], "catcgtaagtttcga": [22, 31], "atc": [22, 31], "40": [22, 31, 52, 56], "fuse": [22, 31], "appear": [22, 31], "fusion": [22, 25, 31], "vivo": [22, 31], "_________": [22, 31], "agcctatcatcttggtctctgca": [22, 31], "gacgt": [22, 31], "agcct": [22, 31], "tcggatagtagaaccagagacgt": [22, 31], "__________": [22, 31], "________": [22, 31], "tttatatcgcatgactcttcttt": [22, 31], "agaaa": [22, 31], "tttat": [22, 31], "aaatatagcgtactgagaagaaa": [22, 31], "agcctatcatcttggtctctgcatttatatcgcatgactcttcttt": [22, 31], "tcggatagtagaaccagagacgtaaatatagcgtactgagaagaaa": [22, 31], "___________________": [22, 31], "______________________": [22, 31], "gagacgtaaatata": [22, 31], "ctctgcatttatat": [22, 31], "flank": [22, 27, 31], "agcctatcatcttggtctctgcatttatat": [22, 31], "tcggatagtagaaccagagacgtaaatata": [22, 31], "____________": [22, 31], "ctctgcatttatatcgcatgactcttcttt": [22, 31], "gagacgtaaatatagcgtactgagaagaaa": [22, 31], "earlier": [22, 31], "At": [22, 31], "everi": [22, 31], "whole": [22, 31], "tcttggtctctgcatttatat": [22, 31], "tcggatagtagaacca": [22, 31], "tcgcatgactcttcttt": [22, 31], "adjac": [22, 31], "junction": [22, 31], "closest": [22, 31], "dseqrecd1": [22, 31], "prinmer": [22, 31], "trick": [22, 31], "around": [22, 31], "depict": [22, 31], "off": [22, 31], "synhtes": [22, 31], "amplicon3": [22, 31], "amplicon4": [22, 31], "amplicon1amplicon2amplicon3amplicon4": [22, 31], "dseqrecd2": [22, 31], "amplicon1dseqrecd1amplicon2dseqrecd2": [22, 31], "dseqrecd1amplicon1dseqrecd2amplicon2": [22, 31], "dseqrecd1amplicon1amplicon2": [22, 31], "fwd": [22, 31, 42], "rev": [22, 31, 42], "amplicon1amplicon2amplicon3": [22, 31], "ccaaacccaccaggtaccttatgtaagtacttcaagtcgccagaagacttcttggtcaagttgcc": [22, 31], "tgtactggtgctgaaccttgtatcaagttgggtgttgacgccattgccccaggtggtcgtttcgtt": [22, 31], "repeat": [22, 31], "fa1": [22, 31], "fb": [22, 31], "fc": [22, 31], "fa2": [22, 31], "1st": [22, 31], "fa": [22, 31], "100": [22, 31, 52, 58], "101": [22, 31], "102": [22, 31], "assemblyobj": [22, 31], "100bp": [22, 31], "101bp": [22, 31], "102bp": [22, 31], "231": [22, 31], "166": [22, 31], "36": [22, 31], "cdseguid": [22, 31], "85t6tfcvwav0wnxeib": [22, 31], "lkutrl4": [22, 31], "kept": [22, 31], "backward": [22, 31], "compar": [22, 58], "equal": [22, 58], "considi": [22, 58], "insensit": [22, 58], "permut": [22, 58], "concaten": [22, 58], "deduc": [22, 58], "taaa": [22, 58], "ataa": [22, 58], "ggatcca": [22, 58], "tggatcc": [22, 58], "gbtext": [22, 42], "field": [22, 42], "jseq": [22, 42], "json": [22, 42], "new_dna": [22, 42], "apeinfo": [22, 42], "methyl": [22, 42], "anaconda3": [22, 42], "bjorn36": [22, 42], "python3": [22, 42], "scanner": [22, 42], "1388": [22, 42], "biopythonparserwarn": [22, 42], "python_packag": [22, 42], "pop": [22, 42], "indexerror": [22, 42], "dure": [22, 42], "No": [22, 42], "s2": [22, 42], "j2": [22, 42], "s3": [22, 42], "initlist": [22, 48], "pathlib": [22, 48], "userlist": [22, 48], "begin": [22, 48], "pydna_prim": [22, 48], "assign_numbers_to_new_prim": [22, 48], "rememb": [22, 48], "assign_numb": [22, 48], "lst": [22, 48], "pydna_code_from_list": [22, 48], "open_fold": [22, 48, 58], "involv": 23, "5tacactcaccgtctatcattatc": 23, "cgactgtatcatctgatagcac3": 23, "3gctgacatagtagactatcgtg5": 23, "5tacactcaccgtctatcattatc3": 23, "3atgtgagtggcagatagtaatag": 23, "gctgacatagtagactatcgtg5": 23, "set_forward_primer_footprint": 23, "set_reverse_primer_footprint": 23, "program": [23, 56], "dbd_program": [23, 56], "invers": 24, "correctli": 24, "analyz": [25, 38], "catgatctacgtatcgtgt": 25, "atcgtgtactgtcatattc": 25, "catattcaaagttct": 25, "atcgtgt": 25, "catattc": 25, "catgatctacgt": 25, "actgt": 25, "aaagttct": 25, "trace": [25, 38], "rstr": 27, "romain": 27, "brixtel": 27, "rbrixtel_at_gmail_dot_com": 27, "greyc": 27, "fr": 27, "gip0": 27, "mit": [27, 55], "licenc": [27, 42], "stringx": 27, "stringi": 27, "sort": [27, 53], "sensit": 27, "startx1": 27, "starty1": 27, "length1": 27, "startx2": 27, "starty2": 27, "length2": 27, "startposit": 27, "lenght": 27, "longest": [27, 53], "agctatgtatcttgcatcgta": 27, "gcatcgtagtctatttgcttac": 27, "nodemap": 29, "detailed_figur": 29, "tgtgctgtgctcta": 29, "tattctggctgtatc": 29, "acgatgctatactg": 29, "compact": 29, "frag20": 29, "frag23": 29, "frag14": 29, "2577": 29, "5681": 29, "2389": 29, "557": 29, "notion": [30, 33, 34], "_ca": 30, "fst3": 30, "fst5": 30, "nnggaagagtaatacacta": 30, "aaanggnn": 30, "nnccttctcattatgtgat": 30, "tttnccnn": 30, "ggaagagtaatacacta": 30, "aaag": 30, "tetraloop": 30, "gttttagagctagaaatagcaagttaaaataagg": 30, "gg": 30, "guide_construct": 30, "excel": 35, "shell_command_for_editor": 35, "tmpdir": 35, "temprari": 35, "tclsh8": 35, "apeextractor": 35, "vf": 35, "app": 35, "seq_to_open": 35, "50e": 36, "fuse_by_pcr": 37, "list_part": 37, "fusion_pcr_frag": 37, "interpol": [39, 45], "mwstd": 39, "gel_length": 39, "600": 39, "margin": 39, "_mwstd": 39, "enough": 42, "almost": 42, "lift": 42, "biojson": 42, "levskaya": 42, "anselm": 42, "accompani": 42, "softwar": [42, 55], "fring": 42, "surviv": 42, "roundtrip": 42, "parsegbloc": 42, "l_": 42, "retwingl": 42, "strip_multilin": 42, "toint": 42, "strip_ind": 42, "concat_dict": 42, "dlist": 42, "val": 42, "duplic": [42, 48], "tojson": 42, "gbkstring": 42, "wrapstr": 42, "str_": 42, "rowstart": 42, "rowend": 42, "padfirst": 42, "wrap": 42, "pad": 42, "locstr": 42, "loc": [42, 58], "combo": 42, "originstr": 42, "ala": 42, "togb": 42, "item": 43, "pydna_cod": 43, "biopython_cod": 43, "substanc": 45, "rel": 45, "mobil": 45, "000": 45, "cubic": 45, "spline": 45, "migart": 45, "distanc": 45, "exampel": 45, "molecular_weight_standard": 45, "od": 45, "establish": 47, "pydna_enzym": 47, "allenzym": 47, "convens": 48, "2_third_prim": 48, "tgagtagtcgtagtcgtcgtat": 48, "1_second_prim": 48, "tgatcgtcatgctgactatactat": 48, "0_first_prim": 48, "ctaggatcgtagatctagctg": 48, "funtion": 48, "primerdict": 48, "check_primer_numb": 48, "pl": 48, "undefined_sequ": 48, "find_duplicate_prim": 48, "extract_from_text": 49, "embl_gb_fasta": 49, "footprint": 50, "_pretty_str": [52, 53], "instread": [52, 53], "bytearrai": [52, 58], "sequencedataabstractbaseclass": 52, "gc": [52, 53, 56], "sce": [52, 53, 58], "rarecodon": [52, 53, 58], "startcodon": [52, 53, 58], "stopcodon": [52, 53, 58], "orfs2": 52, "lsseguid": [52, 53], "gbw0jp907tg_yx3jngs4qqwttju": [52, 53], "christophchamp": [52, 53], "php": [52, 53], "cga": 52, "tcg": 52, "treat": 52, "cgaut": 52, "aatcg": 52, "contrast": 52, "reverse_complement_rna": 52, "ucg": 52, "meaningless": 52, "ncbi": [52, 53, 56], "codont": 52, "asterisk": [52, 58], "boolean": 52, "methionin": 52, "regardless": 52, "fail": 52, "denot": 52, "pn": 52, "gtggccattgtaatgggccgctgaaagggtgcccgatag": 52, "vaivmgr": 52, "kgar": 52, "vaivmgrwkgar": 52, "fact": 52, "gtg": 52, "maivmgrwkgar": [52, 58], "isn": 52, "due": 52, "translationerror": 52, "coding_dna2": 52, "ttggccattgtaatgggccgc": 52, "laivmgr": 52, "tan": 52, "amino": [52, 58], "invalid": 52, "gct": 52, "gctaa": 52, "complement_rna": 52, "gcuaa": 52, "gcu": 52, "aaucg": 52, "back_transcrib": 52, "messenger_rna": 52, "molecular_weight": 52, "pi": 52, "instability_index": 52, "instabl": 52, "accord": [52, 53, 56], "guruprasad": 52, "reddi": 52, "pandit": 52, "155": 52, "161": 52, "from_bio_seqrecord": 53, "sr": 53, "pydnaseqrecord": 53, "detect": 53, "atgaaa": 53, "atttaa": 53, "nlm": [53, 56], "nih": [53, 56], "wprintgc": 53, "cgi": 53, "add_colors_to_features_for_ap": 53, "color": 53, "ft2": 53, "part_nam": 53, "dbxref": 53, "gattaca": 53, "bkgnebmkia5kng": 53, "gf7iorxmniu": 53, "tp2jzecm2e3w4yxtrrx09cmka_8": 53, "newcom": 53, "datefunct": 53, "fore": 53, "lseguid": 53, "gbw0jp907tg_yx3jngs4qqwttj": 53, "ccccc": 53, "dump": 53, "protocol": 53, "proteinseqrecord": 53, "genbank_access": 54, "2015": 55, "aaron": 55, "hall": 55, "permiss": 55, "herebi": 55, "grant": 55, "free": 55, "charg": 55, "person": 55, "sublicens": 55, "sell": 55, "whom": 55, "furnish": 55, "subject": 55, "notic": 55, "shall": 55, "substanti": 55, "THE": 55, "AS": 55, "warranti": 55, "OF": 55, "kind": 55, "OR": 55, "impli": 55, "BUT": 55, "TO": 55, "merchant": 55, "FOR": 55, "noninfring": 55, "IN": 55, "NO": 55, "holder": 55, "BE": 55, "liabl": 55, "claim": 55, "damag": 55, "liabil": 55, "contract": 55, "tort": 55, "aris": 55, "WITH": 55, "cdquit": 55, "fn_name": 55, "exit_aft": 55, "exit": 55, "countdown": 55, "strict": 56, "c_seq": 56, "nn_tabl": 56, "_mt": 56, "dna_nn4": 56, "tmm_tabl": 56, "imm_tabl": 56, "de_tabl": 56, "dnac1": 56, "500": 56, "dnac2": 56, "selfcomp": 56, "75": 56, "mg": 56, "dntp": 56, "saltcorr": 56, "tm_nn": 56, "tm_dbd": 56, "dna_nn3": 56, "250": 56, "tm_product": 56, "050": 56, "spencer": 56, "rhoad": 56, "optim": 56, "ing": 56, "vitro": 56, "2243783": 56, "ta_default": 56, "monoval": 56, "cation": 56, "ta_dbd": 56, "taq": 56, "tmf": 56, "____": 56, "_____": 56, "72": 56, "tmr": 56, "3min": 56, "kb": 56, "______": 56, "5min": 56, "1051bp": 56, "taq_program": 56, "pfu": 56, "sso7d": 56, "53": 56, "82": 56, "84": 56, "15058bp": 56, "pfu_sso7d_program": 56, "1c": 56, "72c": 56, "3c": 56, "tmbresluc": 56, "primerc": 56, "saltc": 56, "nm": 56, "mm": 56, "stdout": 56, "debug": 56, "temp": 56, "primer1": 56, "nebswebsit": 56, "tmapi": 56, "productcod": 56, "nick": 57, "cgaugtcgacttagatctcacaggcttttttcaagacggccttgaattcagtcatttggatccggccgatc": 57, "gctacagctgaatctagagtgtccgaaaaaagttctgccggaacttaagtcagtaaacctaggccggcuag": 57, "ssdna": 57, "ones": 57, "rank": 57, "stabil": 57, "miscellan": 58, "three_frame_orf": 58, "atg": 58, "tag": 58, "shift_loc": 58, "original_loc": 58, "lim": 58, "shift_featur": 58, "smallest": 58, "pierr": 58, "duval": 58, "jean": 58, "1983": 58, "alphabet": 58, "technologi": 58, "decemb": 58, "363": 58, "381": 58, "lyndon": 58, "eppstein": 58, "2011": 58, "gist": 58, "dvberkel": 58, "1950267": 58, "_weight": 58, "yet": 58, "strorbyt": 58, "memor": 58, "identifier_from_str": 58, "down": 58, "seq31": 58, "asx": 58, "xle": 58, "xaa": 58, "sel": 58, "pyl": 58, "plu": 58, "ter": 58, "unknown": 58, "seq3": 58, "metalailevalmetglyargtrplysglyalaargt": 58, "randomrna": 58, "maxlength": 58, "randomdna": 58, "randomorf": 58, "randomprot": 58, "cuts_overlap": 58, "seq_len": 58, "location_boundari": 58, "locations_overlap": 58, "loc1": 58, "loc2": 58}, "objects": {"": [[19, 0, 0, "-", "pydna"]], "pydna": [[20, 0, 0, "-", "_pretty"], [21, 0, 0, "-", "_thermodynamic_data"], [22, 0, 0, "-", "all"], [23, 0, 0, "-", "amplicon"], [24, 0, 0, "-", "amplify"], [25, 0, 0, "-", "assembly"], [26, 0, 0, "-", "codon"], [27, 0, 0, "-", "common_sub_strings"], [28, 0, 0, "-", "conftest"], [29, 0, 0, "-", "contig"], [30, 0, 0, "-", "crispr"], [31, 0, 0, "-", "design"], [32, 0, 0, "-", "download"], [33, 0, 0, "-", "dseq"], [34, 0, 0, "-", "dseqrecord"], [35, 0, 0, "-", "editor"], [36, 0, 0, "-", "fakeseq"], [37, 0, 0, "-", "fusionpcr"], [38, 0, 0, "-", "gateway"], [39, 0, 0, "-", "gel"], [40, 0, 0, "-", "genbank"], [41, 0, 0, "-", "genbankfile"], [42, 0, 0, "-", "genbankfixer"], [43, 0, 0, "-", "genbankrecord"], [19, 5, 1, "", "get_env"], [44, 0, 0, "-", "goldengate"], [45, 0, 0, "-", "ladders"], [46, 0, 0, "-", "ligate"], [19, 5, 1, "", "logo"], [47, 0, 0, "-", "myenzymes"], [48, 0, 0, "-", "myprimers"], [19, 5, 1, "", "open_cache_folder"], [19, 5, 1, "", "open_config_folder"], [19, 5, 1, "", "open_current_folder"], [19, 5, 1, "", "open_log_folder"], [49, 0, 0, "-", "parsers"], [50, 0, 0, "-", "primer"], [51, 0, 0, "-", "readers"], [52, 0, 0, "-", "seq"], [53, 0, 0, "-", "seqrecord"], [54, 0, 0, "-", "sequence_picker"], [55, 0, 0, "-", "threading_timer_decorator_exit"], [56, 0, 0, "-", "tm"], [57, 0, 0, "-", "user_cloning"], [58, 0, 0, "-", "utils"]], "pydna._pretty": [[20, 1, 1, "", "PrettyTable"], [20, 1, 1, "", "pretty_str"]], "pydna._pretty.PrettyTable": [[20, 2, 1, "", "lol"]], "pydna.all": [[22, 1, 1, "", "Anneal"], [22, 1, 1, "", "Assembly"], [22, 1, 1, "", "Dseq"], [22, 1, 1, "", "Dseqrecord"], [22, 1, 1, "", "Genbank"], [22, 1, 1, "", "PrimerList"], [22, 5, 1, "", "ape"], [22, 5, 1, "", "assembly_fragments"], [22, 5, 1, "", "circular_assembly_fragments"], [22, 5, 1, "", "download_text"], [22, 5, 1, "", "eq"], [22, 5, 1, "", "gbtext_clean"], [22, 5, 1, "", "genbank"], [22, 5, 1, "", "parse"], [22, 5, 1, "", "parse_primers"], [22, 5, 1, "", "pcr"], [22, 5, 1, "", "primer_design"], [22, 5, 1, "", "read"], [22, 5, 1, "", "read_primer"]], "pydna.all.Anneal": [[22, 3, 1, "", "forward_primers"], [22, 3, 1, "", "limit"], [22, 4, 1, "", "products"], [22, 2, 1, "", "report"], [22, 3, 1, "", "reverse_primers"], [22, 3, 1, "", "template"]], "pydna.all.Assembly": [[22, 2, 1, "", "assemble_circular"], [22, 2, 1, "", "assemble_linear"]], "pydna.all.Dseq": [[22, 2, 1, "", "T4"], [22, 2, 1, "", "apply_cut"], [22, 2, 1, "", "cas9"], [22, 2, 1, "", "cut"], [22, 2, 1, "", "cutsite_is_valid"], [22, 2, 1, "", "cutters"], [22, 2, 1, "", "exo1_end"], [22, 2, 1, "", "exo1_front"], [22, 2, 1, "", "fill_in"], [22, 2, 1, "", "find"], [22, 2, 1, "", "five_prime_end"], [22, 2, 1, "", "from_full_sequence_and_overhangs"], [22, 2, 1, "", "from_representation"], [22, 2, 1, "", "from_string"], [22, 2, 1, "", "get_cut_parameters"], [22, 2, 1, "", "get_cutsite_pairs"], [22, 2, 1, "", "get_cutsites"], [22, 2, 1, "", "isblunt"], [22, 2, 1, "", "left_end_position"], [22, 2, 1, "", "looped"], [22, 2, 1, "", "lower"], [22, 2, 1, "", "mung"], [22, 2, 1, "", "mw"], [22, 2, 1, "", "n_cutters"], [22, 2, 1, "", "no_cutters"], [22, 2, 1, "", "once_cutters"], [22, 2, 1, "", "quick"], [22, 2, 1, "", "rc"], [22, 2, 1, "", "reverse_complement"], [22, 2, 1, "", "right_end_position"], [22, 2, 1, "", "seguid"], [22, 2, 1, "", "shifted"], [22, 2, 1, "", "t4"], [22, 2, 1, "", "terminal_transferase"], [22, 2, 1, "", "three_prime_end"], [22, 2, 1, "", "tolinear"], [22, 2, 1, "", "transcribe"], [22, 2, 1, "", "translate"], [22, 3, 1, "", "trunc"], [22, 2, 1, "", "twice_cutters"], [22, 2, 1, "", "unique_cutters"], [22, 2, 1, "", "upper"], [22, 2, 1, "", "watson_ovhg"]], "pydna.all.Dseqrecord": [[22, 2, 1, "", "add_feature"], [22, 2, 1, "", "apply_cut"], [22, 2, 1, "", "cas9"], [22, 4, 1, "", "circular"], [22, 2, 1, "", "copy_fasta_to_clipboard"], [22, 2, 1, "", "copy_gb_to_clipboard"], [22, 2, 1, "", "cut"], [22, 2, 1, "", "cutters"], [22, 2, 1, "", "extract_feature"], [22, 2, 1, "", "figure"], [22, 2, 1, "", "find"], [22, 2, 1, "", "find_aa"], [22, 2, 1, "", "find_aminoacids"], [22, 2, 1, "", "format"], [22, 2, 1, "", "from_SeqRecord"], [22, 2, 1, "", "from_string"], [22, 2, 1, "", "linearize"], [22, 2, 1, "", "looped"], [22, 2, 1, "", "lower"], [22, 2, 1, "", "m"], [22, 2, 1, "", "map_trace_files"], [22, 2, 1, "", "n_cutters"], [22, 2, 1, "", "no_cutters"], [22, 2, 1, "", "number_of_cuts"], [22, 2, 1, "", "once_cutters"], [22, 2, 1, "", "orfs"], [22, 2, 1, "", "orfs_to_features"], [22, 2, 1, "", "rc"], [22, 2, 1, "", "reverse_complement"], [22, 2, 1, "", "seguid"], [22, 2, 1, "", "shifted"], [22, 2, 1, "", "synced"], [22, 2, 1, "", "terminal_transferase"], [22, 2, 1, "", "tolinear"], [22, 2, 1, "", "twice_cutters"], [22, 2, 1, "", "unique_cutters"], [22, 2, 1, "", "upper"], [22, 2, 1, "", "write"]], "pydna.all.Genbank": [[22, 2, 1, "", "nucleotide"]], "pydna.all.PrimerList": [[22, 4, 1, "", "accessed"], [22, 2, 1, "", "assign_numbers"], [22, 2, 1, "", "code"], [22, 2, 1, "", "open_folder"], [22, 2, 1, "", "pydna_code_from_list"]], "pydna.amplicon": [[23, 1, 1, "", "Amplicon"]], "pydna.amplicon.Amplicon": [[23, 2, 1, "", "dbd_program"], [23, 2, 1, "", "figure"], [23, 2, 1, "", "from_SeqRecord"], [23, 2, 1, "", "primers"], [23, 2, 1, "", "program"], [23, 2, 1, "", "rc"], [23, 2, 1, "", "reverse_complement"], [23, 2, 1, "", "set_forward_primer_footprint"], [23, 2, 1, "", "set_reverse_primer_footprint"]], "pydna.amplify": [[24, 1, 1, "", "Anneal"], [24, 5, 1, "", "pcr"]], "pydna.amplify.Anneal": [[24, 3, 1, "", "forward_primers"], [24, 3, 1, "", "limit"], [24, 4, 1, "", "products"], [24, 2, 1, "", "report"], [24, 3, 1, "", "reverse_primers"], [24, 3, 1, "", "template"]], "pydna.assembly": [[25, 1, 1, "", "Assembly"]], "pydna.assembly.Assembly": [[25, 2, 1, "", "assemble_circular"], [25, 2, 1, "", "assemble_linear"]], "pydna.common_sub_strings": [[27, 5, 1, "", "common_sub_strings"], [27, 5, 1, "", "terminal_overlap"]], "pydna.contig": [[29, 1, 1, "", "Contig"]], "pydna.contig.Contig": [[29, 2, 1, "", "detailed_figure"], [29, 2, 1, "", "figure"], [29, 2, 1, "", "from_SeqRecord"], [29, 2, 1, "", "from_string"], [29, 2, 1, "", "rc"], [29, 2, 1, "", "reverse_complement"]], "pydna.crispr": [[30, 1, 1, "", "cas9"], [30, 5, 1, "", "protospacer"]], "pydna.crispr.cas9": [[30, 3, 1, "", "fst3"], [30, 3, 1, "", "fst5"], [30, 3, 1, "", "ovhg"], [30, 3, 1, "", "pam"], [30, 3, 1, "", "scaffold"], [30, 2, 1, "", "search"], [30, 3, 1, "", "size"]], "pydna.design": [[31, 5, 1, "", "assembly_fragments"], [31, 5, 1, "", "circular_assembly_fragments"], [31, 5, 1, "", "primer_design"]], "pydna.dseq": [[33, 1, 1, "", "Dseq"]], "pydna.dseq.Dseq": [[33, 2, 1, "", "T4"], [33, 2, 1, "", "apply_cut"], [33, 2, 1, "", "cas9"], [33, 2, 1, "", "cut"], [33, 2, 1, "", "cutsite_is_valid"], [33, 2, 1, "", "cutters"], [33, 2, 1, "", "exo1_end"], [33, 2, 1, "", "exo1_front"], [33, 2, 1, "", "fill_in"], [33, 2, 1, "", "find"], [33, 2, 1, "", "five_prime_end"], [33, 2, 1, "", "from_full_sequence_and_overhangs"], [33, 2, 1, "", "from_representation"], [33, 2, 1, "", "from_string"], [33, 2, 1, "", "get_cut_parameters"], [33, 2, 1, "", "get_cutsite_pairs"], [33, 2, 1, "", "get_cutsites"], [33, 2, 1, "", "isblunt"], [33, 2, 1, "", "left_end_position"], [33, 2, 1, "", "looped"], [33, 2, 1, "", "lower"], [33, 2, 1, "", "mung"], [33, 2, 1, "", "mw"], [33, 2, 1, "", "n_cutters"], [33, 2, 1, "", "no_cutters"], [33, 2, 1, "", "once_cutters"], [33, 2, 1, "", "quick"], [33, 2, 1, "", "rc"], [33, 2, 1, "", "reverse_complement"], [33, 2, 1, "", "right_end_position"], [33, 2, 1, "", "seguid"], [33, 2, 1, "", "shifted"], [33, 2, 1, "", "t4"], [33, 2, 1, "", "terminal_transferase"], [33, 2, 1, "", "three_prime_end"], [33, 2, 1, "", "tolinear"], [33, 2, 1, "", "transcribe"], [33, 2, 1, "", "translate"], [33, 3, 1, "", "trunc"], [33, 2, 1, "", "twice_cutters"], [33, 2, 1, "", "unique_cutters"], [33, 2, 1, "", "upper"], [33, 2, 1, "", "watson_ovhg"]], "pydna.dseqrecord": [[34, 1, 1, "", "Dseqrecord"]], "pydna.dseqrecord.Dseqrecord": [[34, 2, 1, "", "add_feature"], [34, 2, 1, "", "apply_cut"], [34, 2, 1, "", "cas9"], [34, 4, 1, "", "circular"], [34, 2, 1, "", "copy_fasta_to_clipboard"], [34, 2, 1, "", "copy_gb_to_clipboard"], [34, 2, 1, "", "cut"], [34, 2, 1, "", "cutters"], [34, 2, 1, "", "extract_feature"], [34, 2, 1, "", "figure"], [34, 2, 1, "", "find"], [34, 2, 1, "", "find_aa"], [34, 2, 1, "", "find_aminoacids"], [34, 2, 1, "", "format"], [34, 2, 1, "", "from_SeqRecord"], [34, 2, 1, "", "from_string"], [34, 2, 1, "", "linearize"], [34, 2, 1, "", "looped"], [34, 2, 1, "", "lower"], [34, 2, 1, "", "m"], [34, 2, 1, "", "map_trace_files"], [34, 2, 1, "", "n_cutters"], [34, 2, 1, "", "no_cutters"], [34, 2, 1, "", "number_of_cuts"], [34, 2, 1, "", "once_cutters"], [34, 2, 1, "", "orfs"], [34, 2, 1, "", "orfs_to_features"], [34, 2, 1, "", "rc"], [34, 2, 1, "", "reverse_complement"], [34, 2, 1, "", "seguid"], [34, 2, 1, "", "shifted"], [34, 2, 1, "", "synced"], [34, 2, 1, "", "terminal_transferase"], [34, 2, 1, "", "tolinear"], [34, 2, 1, "", "twice_cutters"], [34, 2, 1, "", "unique_cutters"], [34, 2, 1, "", "upper"], [34, 2, 1, "", "write"]], "pydna.editor": [[35, 1, 1, "", "Editor"], [35, 5, 1, "", "ape"]], "pydna.editor.Editor": [[35, 2, 1, "", "open"]], "pydna.fakeseq": [[36, 1, 1, "", "FakeSeq"]], "pydna.fakeseq.FakeSeq": [[36, 2, 1, "", "M"], [36, 2, 1, "", "m"]], "pydna.fusionpcr": [[37, 5, 1, "", "fuse_by_pcr"], [37, 5, 1, "", "list_parts"]], "pydna.gateway": [[38, 1, 1, "", "Gateway"]], "pydna.gel": [[39, 5, 1, "", "gel"], [39, 5, 1, "", "interpolator"]], "pydna.genbank": [[40, 1, 1, "", "Genbank"], [40, 5, 1, "", "genbank"]], "pydna.genbank.Genbank": [[40, 2, 1, "", "nucleotide"]], "pydna.genbankfile": [[41, 1, 1, "", "GenbankFile"]], "pydna.genbankfile.GenbankFile": [[41, 2, 1, "", "from_SeqRecord"], [41, 2, 1, "", "rc"], [41, 2, 1, "", "reverse_complement"]], "pydna.genbankfixer": [[42, 5, 1, "", "concat_dict"], [42, 5, 1, "", "gbtext_clean"], [42, 5, 1, "", "locstr"], [42, 5, 1, "", "originstr"], [42, 5, 1, "", "parseGBLoc"], [42, 5, 1, "", "strip_indent"], [42, 5, 1, "", "strip_multiline"], [42, 5, 1, "", "toGB"], [42, 5, 1, "", "toInt"], [42, 5, 1, "", "toJSON"], [42, 5, 1, "", "wrapstring"]], "pydna.genbankrecord": [[43, 1, 1, "", "GenbankRecord"]], "pydna.genbankrecord.GenbankRecord": [[43, 2, 1, "", "biopython_code"], [43, 2, 1, "", "from_SeqRecord"], [43, 2, 1, "", "from_string"], [43, 2, 1, "", "pydna_code"], [43, 2, 1, "", "rc"], [43, 2, 1, "", "reverse_complement"]], "pydna.ligate": [[46, 5, 1, "", "ligate"]], "pydna.myprimers": [[48, 1, 1, "", "PrimerList"], [48, 5, 1, "", "check_primer_numbers"], [48, 5, 1, "", "find_duplicate_primers"], [48, 5, 1, "", "undefined_sequence"]], "pydna.myprimers.PrimerList": [[48, 4, 1, "", "accessed"], [48, 2, 1, "", "assign_numbers"], [48, 2, 1, "", "code"], [48, 2, 1, "", "open_folder"], [48, 2, 1, "", "pydna_code_from_list"]], "pydna.parsers": [[49, 5, 1, "", "embl_gb_fasta"], [49, 5, 1, "", "extract_from_text"], [49, 5, 1, "", "parse"], [49, 5, 1, "", "parse_primers"]], "pydna.primer": [[50, 1, 1, "", "Primer"]], "pydna.primer.Primer": [[50, 4, 1, "", "footprint"], [50, 2, 1, "", "reverse_complement"], [50, 4, 1, "", "tail"]], "pydna.readers": [[51, 5, 1, "", "read"], [51, 5, 1, "", "read_primer"]], "pydna.seq": [[52, 1, 1, "", "ProteinSeq"], [52, 1, 1, "", "Seq"]], "pydna.seq.ProteinSeq": [[52, 2, 1, "", "back_transcribe"], [52, 2, 1, "", "complement"], [52, 2, 1, "", "complement_rna"], [52, 2, 1, "", "instability_index"], [52, 2, 1, "", "molecular_weight"], [52, 2, 1, "", "pI"], [52, 2, 1, "", "rc"], [52, 2, 1, "", "reverse_complement"], [52, 2, 1, "", "reverse_complement_rna"], [52, 2, 1, "", "seguid"], [52, 2, 1, "", "transcribe"], [52, 2, 1, "", "translate"]], "pydna.seq.Seq": [[52, 2, 1, "", "cai"], [52, 2, 1, "", "express"], [52, 2, 1, "", "gc"], [52, 2, 1, "", "orfs"], [52, 2, 1, "", "orfs2"], [52, 2, 1, "", "rarecodons"], [52, 2, 1, "", "rc"], [52, 2, 1, "", "reverse_complement"], [52, 2, 1, "", "seguid"], [52, 2, 1, "", "startcodon"], [52, 2, 1, "", "stopcodon"], [52, 2, 1, "", "translate"]], "pydna.seqrecord": [[53, 1, 1, "", "ProteinSeqRecord"], [53, 1, 1, "", "SeqRecord"]], "pydna.seqrecord.ProteinSeqRecord": [[53, 2, 1, "", "cai"], [53, 2, 1, "", "express"], [53, 2, 1, "", "gc"], [53, 2, 1, "", "isorf"], [53, 2, 1, "", "rarecodons"], [53, 2, 1, "", "rc"], [53, 2, 1, "", "reverse_complement"], [53, 2, 1, "", "startcodon"], [53, 2, 1, "", "stopcodon"]], "pydna.seqrecord.SeqRecord": [[53, 4, 1, "", "accession"], [53, 2, 1, "", "add_colors_to_features_for_ape"], [53, 2, 1, "", "add_feature"], [53, 2, 1, "", "cai"], [53, 2, 1, "", "comment"], [53, 2, 1, "", "copy"], [53, 2, 1, "", "datefunction"], [53, 4, 1, "", "definition"], [53, 2, 1, "", "dump"], [53, 2, 1, "", "express"], [53, 2, 1, "", "extract_feature"], [53, 2, 1, "", "from_Bio_SeqRecord"], [53, 2, 1, "", "gc"], [53, 2, 1, "", "isorf"], [53, 2, 1, "", "lcs"], [53, 2, 1, "", "list_features"], [53, 4, 1, "", "locus"], [53, 2, 1, "", "rarecodons"], [53, 2, 1, "", "rc"], [53, 2, 1, "", "reverse_complement"], [53, 2, 1, "", "seguid"], [53, 2, 1, "", "sorted_features"], [53, 2, 1, "", "stamp"], [53, 2, 1, "", "startcodon"], [53, 2, 1, "", "stopcodon"], [53, 2, 1, "", "translate"]], "pydna.sequence_picker": [[54, 5, 1, "", "genbank_accession"]], "pydna.threading_timer_decorator_exit": [[55, 5, 1, "", "a"], [55, 5, 1, "", "b"], [55, 5, 1, "", "c"], [55, 5, 1, "", "cdquit"], [55, 5, 1, "", "countdown"], [55, 5, 1, "", "d"], [55, 5, 1, "", "exit_after"], [55, 5, 1, "", "main"]], "pydna.tm": [[56, 5, 1, "", "Q5"], [56, 5, 1, "", "dbd_program"], [56, 5, 1, "", "pfu_sso7d_program"], [56, 5, 1, "", "program"], [56, 5, 1, "", "ta_dbd"], [56, 5, 1, "", "ta_default"], [56, 5, 1, "", "taq_program"], [56, 5, 1, "", "tm_dbd"], [56, 5, 1, "", "tm_default"], [56, 5, 1, "", "tm_neb"], [56, 5, 1, "", "tm_product"], [56, 5, 1, "", "tmbresluc"]], "pydna.utils": [[58, 5, 1, "", "cai"], [58, 5, 1, "", "complement"], [58, 5, 1, "", "cuts_overlap"], [58, 5, 1, "", "eq"], [58, 5, 1, "", "express"], [58, 5, 1, "", "flatten"], [58, 5, 1, "", "identifier_from_string"], [58, 5, 1, "", "location_boundaries"], [58, 5, 1, "", "locations_overlap"], [58, 5, 1, "", "memorize"], [58, 5, 1, "", "open_folder"], [58, 5, 1, "", "randomDNA"], [58, 5, 1, "", "randomORF"], [58, 5, 1, "", "randomRNA"], [58, 5, 1, "", "randomprot"], [58, 5, 1, "", "rarecodons"], [58, 5, 1, "", "rc"], [58, 5, 1, "", "seq31"], [58, 5, 1, "", "shift_feature"], [58, 5, 1, "", "shift_location"], [58, 5, 1, "", "smallest_rotation"], [58, 5, 1, "", "three_frame_orfs"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:property", "5": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "property", "Python property"], "5": ["py", "function", "Python function"]}, "titleterms": {"changelog": 0, "unreleas": 0, "6": 0, "0": 0, "0a01": 0, "2023": 0, "05": 0, "04": 0, "ad": [0, 1, 8, 16], "chang": 0, "5": 0, "3": 0, "1": 0, "4": 0, "2020": 0, "10": 0, "2": 0, "09": 0, "28": 0, "25": 0, "16": 0, "2a1": 0, "2019": 0, "07": 0, "23": 0, "17": 0, "2017": 0, "12": 0, "14": 0, "3a1": 0, "3a0": 0, "03": 0, "08": 0, "26": 0, "24": 0, "06": 0, "0a4": 0, "0a3": 0, "0a2": 0, "0a1": 0, "0a0": 0, "15": 0, "2016": 0, "11": 0, "20": 0, "9": 0, "2015": 0, "8": 0, "02": 0, "7": 0, "2014": 0, "21": 0, "notpubl": 0, "31": 0, "13": 0, "18": 0, "2013": 0, "29": 0, "22": 0, "document": [1, 4, 19], "new": 1, "section": 1, "auto": 1, "gener": 1, "file": [1, 13], "text": 1, "import": [1, 9, 13], "from": [1, 13], "readm": [1, 17], "md": 1, "includ": 1, "notebook": 1, "get": [1, 3, 19], "start": [1, 3], "exampl": [1, 2, 10, 11, 17, 19], "custom": 1, "css": 1, "misc": 1, "galleri": 2, "pydna": [4, 6, 7, 10, 12, 13, 14, 16, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58], "welcom": 4, "": 4, "instal": 5, "option": 5, "depend": 5, "pip": 5, "poetri": 5, "how": [6, 14, 19], "model": [6, 14], "crispr": [6, 9, 30], "cas9": [6, 9], "experi": 6, "repres": 7, "sequenc": [7, 13], "dseq": [7, 33], "class": [7, 8], "getitem": 7, "repr": 7, "str": 7, "method": [7, 8], "slice": 7, "__getitem__": 7, "circular": [7, 15, 16], "print": 7, "consol": 7, "__repr__": 7, "__str__": 7, "edg": 7, "case": 7, "work": [8, 9], "featur": [8, 15], "us": [8, 16, 19], "dseqrecord": [8, 34], "qualifi": 8, "part": 8, "standard": 8, "type": 8, "handl": 8, "origin": 8, "span": 8, "other": [8, 14], "view": [8, 13], "remov": 8, "implement": 9, "oligonucleotid": 9, "base": 9, "toolbox": 9, "effici": 9, "engin": 9, "komagataella": 9, "phaffii": 9, "gene": 9, "we": 9, "ar": 9, "go": 9, "gibson": [10, 12, 16], "assembli": [10, 12, 16, 25], "plasmid": 11, "restrict": [11, 15, 16], "ligat": [11, 15, 46], "clone": 11, "string": 13, "extra": [13, 15], "info": 13, "perform": 14, "polymeras": 14, "chain": 14, "reaction": 14, "pcr": [14, 16], "known": 14, "primer": [14, 16, 50], "wai": 14, "visualis": 14, "product": 14, "design": [14, 16, 31], "calcul": [14, 16], "tm": [14, 16, 56], "cut": 15, "one": 15, "more": [15, 19], "enzym": [15, 16], "fragment": 15, "note": 15, "what": 15, "happen": 15, "when": 15, "check": 16, "neb": 16, "special": 16, "linear": 16, "spacer": 16, "linker": 16, "summari": 16, "assembly_frag": 16, "behaviour": 16, "modul": 18, "packag": 19, "layout": 19, "sourc": 19, "code": 19, "help": 19, "_pretti": 20, "_thermodynamic_data": 21, "all": 22, "amplicon": 23, "amplifi": 24, "codon": 26, "common_sub_str": 27, "conftest": 28, "contig": 29, "download": 32, "editor": 35, "fakeseq": 36, "fusionpcr": 37, "gatewai": 38, "gel": 39, "genbank": 40, "genbankfil": 41, "genbankfix": 42, "genbankrecord": 43, "goldeng": 44, "ladder": 45, "myenzym": 47, "myprim": 48, "parser": 49, "reader": 51, "seq": 52, "seqrecord": 53, "sequence_pick": 54, "threading_timer_decorator_exit": 55, "user_clon": 57, "util": 58}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx.ext.intersphinx": 1, "sphinx": 58}, "alltitles": {"Changelog": [[0, "changelog"]], "Unreleased": [[0, "unreleased"]], "[6.0.0a01] - 2023-05-04": [[0, "a01-2023-05-04"]], "Added": [[0, "added"], [0, "id2"], [0, "id7"], [0, "id10"]], "Changed": [[0, "changed"], [0, "id3"], [0, "id8"], [0, "id11"], [0, "id13"], [0, "id15"], [0, "id17"], [0, "id18"], [0, "id20"], [0, "id22"], [0, "id24"], [0, "id25"], [0, "id26"], [0, "id28"], [0, "id30"], [0, "id32"], [0, "id34"], [0, "id35"], [0, "id36"], [0, "id37"], [0, "id38"], [0, "id39"], [0, "id41"], [0, "id43"], [0, "id45"], [0, "id47"], [0, "id49"], [0, "id51"], [0, "id53"], [0, "id55"], [0, "id57"], [0, "id59"], [0, "id61"], [0, "id63"], [0, "id65"], [0, "id67"], [0, "id69"], [0, "id71"], [0, "id73"], [0, "id74"], [0, "id76"], [0, "id78"], [0, "id80"], [0, "id82"], [0, "id84"], [0, "id86"], [0, "id88"], [0, "id90"], [0, "id92"], [0, "id94"], [0, "id96"], [0, "id98"], [0, "id100"], [0, "id102"], [0, "id104"], [0, "id106"], [0, "id108"]], "[5.3.0] - 2023-05-04": [[0, "id1"]], "[5.0.1]": [[0, "id4"]], "[5.0.0]": [[0, "id5"]], "[4.0.0] - 2020-10-10": [[0, "id6"]], "3.1.3 - 2020-10-10": [[0, "id9"]], "3.1.2 - 2020-09-28": [[0, "id12"]], "3.1.1 - 2020-09-25": [[0, "id14"]], "3.1.0 - 2020-09-16": [[0, "id16"]], "3.0.2a1 - 2019-07-23": [[0, "a1-2019-07-23"]], "3.0.1 - 2019-05-28": [[0, "id19"]], "3.0.0 - 2019-05-17": [[0, "id21"]], "2.0.3 - 2017-12-14": [[0, "id23"]], "[2.0.3a1] - 2017-12-14": [[0, "a1-2017-12-14"]], "2.0.3a0 - 2017-12-03": [[0, "a0-2017-12-03"]], "2.0.2 - 2017-08-26": [[0, "id27"], [0, "id29"]], "2.0.1 - 2017-08-24": [[0, "id31"]], "2.0.0 - 2017-06-23": [[0, "id33"]], "2.0.0a4 - 2017-05-05": [[0, "a4-2017-05-05"]], "2.0.0a3 - 2017-04-04": [[0, "a3-2017-04-04"]], "2.0.0a2 - \u2014": [[0, "a2"]], "[2.0.0a1] -": [[0, "a1"]], "2.0.0a0 - 2017-03-15": [[0, "a0-2017-03-15"]], "1.2.0 - 2017-03-10": [[0, "id40"]], "1.1.5 - 2016-12-16": [[0, "id42"]], "1.1.4 - 2016-12-15": [[0, "id44"]], "1.1.1 - 2016-11-20": [[0, "id46"]], "1.0.2 - 2016-10-08": [[0, "id48"]], "1.0.1 - 2016-03-10": [[0, "id50"]], "1.0.0 - -": [[0, "id52"]], "0.9.3 - 2015-06-03": [[0, "id54"]], "0.9.2 - 2015-05-28": [[0, "id56"]], "0.9.1 - 2015-05-26": [[0, "id58"]], "0.9.0 - 2015-05-26": [[0, "id60"]], "0.8.4 - 2015-04-17": [[0, "id62"]], "0.8.3 - -": [[0, "id64"]], "0.8.2 - -": [[0, "id66"]], "0.8.1 - 2015-03-07": [[0, "id68"]], "[0.8.0] - 2015-02-06": [[0, "id70"]], "[0.7.2] - 2014-11-21": [[0, "id72"]], "[0.7.1] - notpublic": [[0, "notpublic"]], "[0.7.0] - notpublic": [[0, "id75"]], "[0.6.6] -": [[0, "id77"]], "[0.6.5] - 2014-07-31": [[0, "id79"]], "[0.6.4] - 2014-07-09": [[0, "id81"]], "[0.6.3] - 2014-07-06": [[0, "id83"]], "[0.6.2] - 2014-06-13": [[0, "id85"]], "[0.6.1] - 2014-04-25": [[0, "id87"]], "[0.6.0] - 2014-04-18": [[0, "id89"]], "[0.5.0] - 2013-12-16": [[0, "id91"]], "[0.2.2] - 2013-11-05": [[0, "id93"]], "[0.2.1] - 2013-08-18": [[0, "id95"]], "[0.1.8] - 2013-06-02": [[0, "id97"]], "[0.1.7] - 2013-05-29": [[0, "id99"]], "[0.1.6] - 2013-04-22": [[0, "id101"]], "[0.1.5] - 2013-04-18": [[0, "id103"]], "[0.1.4] - 2013-04-10": [[0, "id105"]], "[0.1.3] - 2013-04-09": [[0, "id107"]], "Documentation": [[1, "documentation"]], "Adding new sections to the documentation": [[1, "adding-new-sections-to-the-documentation"]], "Auto-generated files": [[1, "auto-generated-files"]], "Text imported from README.md": [[1, "text-imported-from-readme-md"]], "Including notebooks in the getting started and example sections": [[1, "including-notebooks-in-the-getting-started-and-example-sections"]], "Custom CSS": [[1, "custom-css"]], "Misc": [[1, "misc"]], "Example gallery": [[2, "example-gallery"]], "Getting started": [[3, "getting-started"]], "Pydna": [[4, "pydna"]], "Welcome to pydna\u2019s documentation!": [[4, "welcome-to-pydna-s-documentation"]], "Installation": [[5, "installation"]], "Optional dependencies": [[5, "optional-dependencies"]], "Installing with pip \ud83d\udc0d": [[5, "installing-with-pip"]], "Installing with poetry \ud83e\uddd9\u200d\u2642\ufe0f": [[5, "installing-with-poetry"]], "How to Model CRISPR-Cas9 Experiments in pydna": [[6, "how-to-model-crispr-cas9-experiments-in-pydna"]], "Representing sequences in pydna": [[7, "representing-sequences-in-pydna"]], "Dseq Class": [[7, "dseq-class"]], "getitem, repr, and str methods": [[7, "getitem-repr-and-str-methods"]], "Slicing sequences (__getitem__)": [[7, "slicing-sequences-getitem"]], "Slicing circular sequences": [[7, "slicing-circular-sequences"]], "Printing sequences to the console: __repr__ and __str__": [[7, "printing-sequences-to-the-console-repr-and-str"]], "Edge cases": [[7, "edge-cases"]], "Working with Features using the Dseqrecord class": [[8, "working-with-features-using-the-dseqrecord-class"]], "Adding Features and Qualifiers": [[8, "adding-features-and-qualifiers"]], "Adding a Feature with Parts": [[8, "adding-a-feature-with-parts"]], "Standard Feature Types and Qualifiers": [[8, "standard-feature-types-and-qualifiers"]], "Handling Origin Spanning Features": [[8, "handling-origin-spanning-features"]], "Other Methods to Viewing Features": [[8, "other-methods-to-viewing-features"]], "Removing Features": [[8, "removing-features"]], "Implementation of Oligonucleotide-based CRISPR-Cas9 toolbox for efficient engineering of Komagataella phaffii": [[9, "implementation-of-oligonucleotide-based-crispr-cas9-toolbox-for-efficient-engineering-of-komagataella-phaffii"]], "Import the gene we are going to work with": [[9, "import-the-gene-we-are-going-to-work-with"]], "Example of a Gibson Assembly in pydna": [[10, "example-of-a-gibson-assembly-in-pydna"]], "Example of a Plasmid Restriction/Ligation Cloning": [[11, "example-of-a-plasmid-restriction-ligation-cloning"]], "Gibson Assembly in pydna": [[12, "gibson-assembly-in-pydna"]], "Importing and viewing sequence files in pydna": [[13, "importing-and-viewing-sequence-files-in-pydna"]], "Importing Sequence Files": [[13, "importing-sequence-files"]], "Importing Sequences from Strings": [[13, "importing-sequences-from-strings"]], "Extra info": [[13, "extra-info"]], "How to Perform a Polymerase Chain Reaction (PCR)": [[14, "how-to-perform-a-polymerase-chain-reaction-pcr"]], "Modelling PCR with Known Primers": [[14, "modelling-pcr-with-known-primers"]], "Other ways of visualising the PCR products": [[14, "other-ways-of-visualising-the-pcr-products"]], "Designing Primers and Calculating Tm in pydna": [[14, "designing-primers-and-calculating-tm-in-pydna"]], "Calculating Tm": [[14, "calculating-tm"]], "Restriction and Ligation": [[15, "restriction-and-ligation"]], "Cutting with one or more restriction enzymes": [[15, "cutting-with-one-or-more-restriction-enzymes"]], "Ligating fragments": [[15, "ligating-fragments"]], "Circularizing fragments": [[15, "circularizing-fragments"]], "Extra Notes: What happens to features when cutting/ligating?": [[15, "extra-notes-what-happens-to-features-when-cutting-ligating"]], "Primer design in pydna": [[16, "primer-design-in-pydna"]], "Checking the Tm of a primer": [[16, "checking-the-tm-of-a-primer"]], "Using NEB Tm calculator": [[16, "using-neb-tm-calculator"]], "Designing primers for PCR": [[16, "designing-primers-for-pcr"]], "Special primers": [[16, "special-primers"]], "Restriction enzyme": [[16, "restriction-enzyme"]], "Gibson Assembly": [[16, "gibson-assembly"]], "Linear Gibson Assembly": [[16, "linear-gibson-assembly"]], "Circular Gibson Assembly": [[16, "circular-gibson-assembly"]], "Adding spacers / linkers to Gibson Assembly primers": [[16, "adding-spacers-linkers-to-gibson-assembly-primers"]], "Summary of assembly_fragments behaviour": [[16, "summary-of-assembly-fragments-behaviour"]], "README Example": [[17, "readme-example"]], "Modules": [[18, "modules"]], "Modules:": [[18, null]], "pydna": [[19, "module-pydna"], [19, "id1"]], "pydna package layout": [[19, "pydna-package-layout"]], "How to use the documentation": [[19, "how-to-use-the-documentation"]], "pydna source code": [[19, "pydna-source-code"]], "How to get more help": [[19, "how-to-get-more-help"]], "Examples of pydna in use": [[19, "examples-of-pydna-in-use"]], "pydna._pretty": [[20, "pydna-pretty"]], "pydna._thermodynamic_data": [[21, "pydna-thermodynamic-data"]], "pydna.all": [[22, "module-pydna.all"]], "pydna.amplicon": [[23, "pydna-amplicon"]], "pydna.amplify": [[24, "pydna-amplify"]], "pydna.assembly": [[25, "pydna-assembly"]], "pydna.codon": [[26, "pydna-codon"]], "pydna.common_sub_strings": [[27, "pydna-common-sub-strings"]], "pydna.conftest": [[28, "pydna-conftest"]], "pydna.contig": [[29, "pydna-contig"]], "pydna.crispr": [[30, "pydna-crispr"]], "pydna.design": [[31, "pydna-design"]], "pydna.download": [[32, "pydna-download"]], "pydna.dseq": [[33, "module-pydna.dseq"]], "pydna.dseqrecord": [[34, "pydna-dseqrecord"]], "pydna.editor": [[35, "pydna-editor"]], "pydna.fakeseq": [[36, "pydna-fakeseq"]], "pydna.fusionpcr": [[37, "pydna-fusionpcr"]], "pydna.gateway": [[38, "pydna-gateway"]], "pydna.gel": [[39, "module-pydna.gel"]], "pydna.genbank": [[40, "pydna-genbank"]], "pydna.genbankfile": [[41, "pydna-genbankfile"]], "pydna.genbankfixer": [[42, "pydna-genbankfixer"]], "pydna.genbankrecord": [[43, "pydna-genbankrecord"]], "pydna.goldengate": [[44, "pydna-goldengate"]], "pydna.ladders": [[45, "pydna-ladders"]], "pydna.ligate": [[46, "pydna-ligate"]], "pydna.myenzymes": [[47, "pydna-myenzymes"]], "pydna.myprimers": [[48, "pydna-myprimers"]], "pydna.parsers": [[49, "pydna-parsers"]], "pydna.primer": [[50, "pydna-primer"]], "pydna.readers": [[51, "pydna-readers"]], "pydna.seq": [[52, "module-pydna.seq"]], "pydna.seqrecord": [[53, "pydna-seqrecord"]], "pydna.sequence_picker": [[54, "pydna-sequence-picker"]], "pydna.threading_timer_decorator_exit": [[55, "pydna-threading-timer-decorator-exit"]], "pydna.tm": [[56, "module-pydna.tm"]], "pydna.user_cloning": [[57, "pydna-user-cloning"]], "pydna.utils": [[58, "pydna-utils"]]}, "indexentries": {"get_env() (in module pydna)": [[19, "pydna.get_env"]], "logo() (in module pydna)": [[19, "pydna.logo"]], "module": [[19, "module-pydna"], [20, "module-pydna._pretty"], [21, "module-pydna._thermodynamic_data"], [22, "module-pydna.all"], [23, "module-pydna.amplicon"], [24, "module-pydna.amplify"], [25, "module-pydna.assembly"], [26, "module-pydna.codon"], [27, "module-pydna.common_sub_strings"], [28, "module-pydna.conftest"], [29, "module-pydna.contig"], [30, "module-pydna.crispr"], [31, "module-pydna.design"], [32, "module-pydna.download"], [33, "module-pydna.dseq"], [34, "module-pydna.dseqrecord"], [35, "module-pydna.editor"], [36, "module-pydna.fakeseq"], [37, "module-pydna.fusionpcr"], [38, "module-pydna.gateway"], [39, "module-pydna.gel"], [40, "module-pydna.genbank"], [41, "module-pydna.genbankfile"], [42, "module-pydna.genbankfixer"], [43, "module-pydna.genbankrecord"], [44, "module-pydna.goldengate"], [45, "module-pydna.ladders"], [46, "module-pydna.ligate"], [47, "module-pydna.myenzymes"], [48, "module-pydna.myprimers"], [49, "module-pydna.parsers"], [50, "module-pydna.primer"], [51, "module-pydna.readers"], [52, "module-pydna.seq"], [53, "module-pydna.seqrecord"], [54, "module-pydna.sequence_picker"], [55, "module-pydna.threading_timer_decorator_exit"], [56, "module-pydna.tm"], [57, "module-pydna.user_cloning"], [58, "module-pydna.utils"]], "open_cache_folder() (in module pydna)": [[19, "pydna.open_cache_folder"]], "open_config_folder() (in module pydna)": [[19, "pydna.open_config_folder"]], "open_current_folder() (in module pydna)": [[19, "pydna.open_current_folder"]], "open_log_folder() (in module pydna)": [[19, "pydna.open_log_folder"]], "pydna": [[19, "module-pydna"]], "prettytable (class in pydna._pretty)": [[20, "pydna._pretty.PrettyTable"]], "lol() (pydna._pretty.prettytable method)": [[20, "pydna._pretty.PrettyTable.lol"]], "pretty_str (class in pydna._pretty)": [[20, "pydna._pretty.pretty_str"]], "pydna._pretty": [[20, "module-pydna._pretty"]], "pydna._thermodynamic_data": [[21, "module-pydna._thermodynamic_data"]], "anneal (class in pydna.all)": [[22, "pydna.all.Anneal"]], "assembly (class in pydna.all)": [[22, "pydna.all.Assembly"]], "dseq (class in pydna.all)": [[22, "pydna.all.Dseq"]], "dseqrecord (class in pydna.all)": [[22, "pydna.all.Dseqrecord"]], "genbank (class in pydna.all)": [[22, "pydna.all.Genbank"]], "primerlist (class in pydna.all)": [[22, "pydna.all.PrimerList"]], "t4() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.T4"], [22, "pydna.all.Dseq.t4"]], "accessed (pydna.all.primerlist property)": [[22, "pydna.all.PrimerList.accessed"]], "add_feature() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.add_feature"]], "ape() (in module pydna.all)": [[22, "pydna.all.ape"]], "apply_cut() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.apply_cut"]], "apply_cut() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.apply_cut"]], "assemble_circular() (pydna.all.assembly method)": [[22, "pydna.all.Assembly.assemble_circular"]], "assemble_linear() (pydna.all.assembly method)": [[22, "pydna.all.Assembly.assemble_linear"]], "assembly_fragments() (in module pydna.all)": [[22, "pydna.all.assembly_fragments"]], "assign_numbers() (pydna.all.primerlist method)": [[22, "pydna.all.PrimerList.assign_numbers"]], "cas9() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.cas9"]], "cas9() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.cas9"]], "circular (pydna.all.dseqrecord property)": [[22, "pydna.all.Dseqrecord.circular"]], "circular_assembly_fragments() (in module pydna.all)": [[22, "pydna.all.circular_assembly_fragments"]], "code() (pydna.all.primerlist method)": [[22, "pydna.all.PrimerList.code"]], "copy_fasta_to_clipboard() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.copy_fasta_to_clipboard"]], "copy_gb_to_clipboard() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.copy_gb_to_clipboard"]], "cut() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.cut"]], "cut() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.cut"]], "cutsite_is_valid() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.cutsite_is_valid"]], "cutters() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.cutters"]], "cutters() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.cutters"]], "download_text() (in module pydna.all)": [[22, "pydna.all.download_text"]], "eq() (in module pydna.all)": [[22, "pydna.all.eq"]], "exo1_end() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.exo1_end"]], "exo1_front() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.exo1_front"]], "extract_feature() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.extract_feature"]], "figure() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.figure"]], "fill_in() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.fill_in"]], "find() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.find"]], "find() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.find"]], "find_aa() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.find_aa"]], "find_aminoacids() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.find_aminoacids"]], "five_prime_end() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.five_prime_end"]], "format() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.format"]], "forward_primers (pydna.all.anneal attribute)": [[22, "pydna.all.Anneal.forward_primers"]], "from_seqrecord() (pydna.all.dseqrecord class method)": [[22, "pydna.all.Dseqrecord.from_SeqRecord"]], "from_full_sequence_and_overhangs() (pydna.all.dseq class method)": [[22, "pydna.all.Dseq.from_full_sequence_and_overhangs"]], "from_representation() (pydna.all.dseq class method)": [[22, "pydna.all.Dseq.from_representation"]], "from_string() (pydna.all.dseq class method)": [[22, "pydna.all.Dseq.from_string"]], "from_string() (pydna.all.dseqrecord class method)": [[22, "pydna.all.Dseqrecord.from_string"]], "gbtext_clean() (in module pydna.all)": [[22, "pydna.all.gbtext_clean"]], "genbank() (in module pydna.all)": [[22, "pydna.all.genbank"]], "get_cut_parameters() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.get_cut_parameters"]], "get_cutsite_pairs() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.get_cutsite_pairs"]], "get_cutsites() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.get_cutsites"]], "isblunt() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.isblunt"]], "left_end_position() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.left_end_position"]], "limit (pydna.all.anneal attribute)": [[22, "pydna.all.Anneal.limit"]], "linearize() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.linearize"]], "looped() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.looped"]], "looped() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.looped"]], "lower() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.lower"]], "lower() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.lower"]], "m() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.m"]], "map_trace_files() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.map_trace_files"]], "mung() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.mung"]], "mw() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.mw"]], "n_cutters() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.n_cutters"]], "n_cutters() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.n_cutters"]], "no_cutters() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.no_cutters"]], "no_cutters() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.no_cutters"]], "nucleotide() (pydna.all.genbank method)": [[22, "pydna.all.Genbank.nucleotide"]], "number_of_cuts() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.number_of_cuts"]], "once_cutters() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.once_cutters"]], "once_cutters() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.once_cutters"]], "open_folder() (pydna.all.primerlist method)": [[22, "pydna.all.PrimerList.open_folder"]], "orfs() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.orfs"]], "orfs_to_features() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.orfs_to_features"]], "parse() (in module pydna.all)": [[22, "pydna.all.parse"]], "parse_primers() (in module pydna.all)": [[22, "pydna.all.parse_primers"]], "pcr() (in module pydna.all)": [[22, "pydna.all.pcr"]], "primer_design() (in module pydna.all)": [[22, "pydna.all.primer_design"]], "products (pydna.all.anneal property)": [[22, "pydna.all.Anneal.products"]], "pydna.all": [[22, "module-pydna.all"]], "pydna_code_from_list() (pydna.all.primerlist method)": [[22, "pydna.all.PrimerList.pydna_code_from_list"]], "quick() (pydna.all.dseq class method)": [[22, "pydna.all.Dseq.quick"]], "rc() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.rc"]], "rc() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.rc"]], "read() (in module pydna.all)": [[22, "pydna.all.read"]], "read_primer() (in module pydna.all)": [[22, "pydna.all.read_primer"]], "report() (pydna.all.anneal method)": [[22, "pydna.all.Anneal.report"]], "reverse_complement() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.reverse_complement"]], "reverse_complement() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.reverse_complement"]], "reverse_primers (pydna.all.anneal attribute)": [[22, "pydna.all.Anneal.reverse_primers"]], "right_end_position() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.right_end_position"]], "seguid() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.seguid"]], "seguid() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.seguid"]], "shifted() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.shifted"]], "shifted() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.shifted"]], "synced() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.synced"]], "template (pydna.all.anneal attribute)": [[22, "pydna.all.Anneal.template"]], "terminal_transferase() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.terminal_transferase"]], "terminal_transferase() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.terminal_transferase"]], "three_prime_end() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.three_prime_end"]], "tolinear() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.tolinear"]], "tolinear() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.tolinear"]], "transcribe() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.transcribe"]], "translate() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.translate"]], "trunc (pydna.all.dseq attribute)": [[22, "pydna.all.Dseq.trunc"]], "twice_cutters() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.twice_cutters"]], "twice_cutters() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.twice_cutters"]], "unique_cutters() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.unique_cutters"]], "unique_cutters() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.unique_cutters"]], "upper() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.upper"]], "upper() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.upper"]], "watson_ovhg() (pydna.all.dseq method)": [[22, "pydna.all.Dseq.watson_ovhg"]], "write() (pydna.all.dseqrecord method)": [[22, "pydna.all.Dseqrecord.write"]], "amplicon (class in pydna.amplicon)": [[23, "pydna.amplicon.Amplicon"]], "dbd_program() (pydna.amplicon.amplicon method)": [[23, "pydna.amplicon.Amplicon.dbd_program"]], "figure() (pydna.amplicon.amplicon method)": [[23, "pydna.amplicon.Amplicon.figure"]], "from_seqrecord() (pydna.amplicon.amplicon class method)": [[23, "pydna.amplicon.Amplicon.from_SeqRecord"]], "primers() (pydna.amplicon.amplicon method)": [[23, "pydna.amplicon.Amplicon.primers"]], "program() (pydna.amplicon.amplicon method)": [[23, "pydna.amplicon.Amplicon.program"]], "pydna.amplicon": [[23, "module-pydna.amplicon"]], "rc() (pydna.amplicon.amplicon method)": [[23, "pydna.amplicon.Amplicon.rc"]], "reverse_complement() (pydna.amplicon.amplicon method)": [[23, "pydna.amplicon.Amplicon.reverse_complement"]], "set_forward_primer_footprint() (pydna.amplicon.amplicon method)": [[23, "pydna.amplicon.Amplicon.set_forward_primer_footprint"]], "set_reverse_primer_footprint() (pydna.amplicon.amplicon method)": [[23, "pydna.amplicon.Amplicon.set_reverse_primer_footprint"]], "anneal (class in pydna.amplify)": [[24, "pydna.amplify.Anneal"]], "forward_primers (pydna.amplify.anneal attribute)": [[24, "pydna.amplify.Anneal.forward_primers"]], "limit (pydna.amplify.anneal attribute)": [[24, "pydna.amplify.Anneal.limit"]], "pcr() (in module pydna.amplify)": [[24, "pydna.amplify.pcr"]], "products (pydna.amplify.anneal property)": [[24, "pydna.amplify.Anneal.products"]], "pydna.amplify": [[24, "module-pydna.amplify"]], "report() (pydna.amplify.anneal method)": [[24, "pydna.amplify.Anneal.report"]], "reverse_primers (pydna.amplify.anneal attribute)": [[24, "pydna.amplify.Anneal.reverse_primers"]], "template (pydna.amplify.anneal attribute)": [[24, "pydna.amplify.Anneal.template"]], "assembly (class in pydna.assembly)": [[25, "pydna.assembly.Assembly"]], "assemble_circular() (pydna.assembly.assembly method)": [[25, "pydna.assembly.Assembly.assemble_circular"]], "assemble_linear() (pydna.assembly.assembly method)": [[25, "pydna.assembly.Assembly.assemble_linear"]], "pydna.assembly": [[25, "module-pydna.assembly"]], "pydna.codon": [[26, "module-pydna.codon"]], "common_sub_strings() (in module pydna.common_sub_strings)": [[27, "pydna.common_sub_strings.common_sub_strings"]], "pydna.common_sub_strings": [[27, "module-pydna.common_sub_strings"]], "terminal_overlap() (in module pydna.common_sub_strings)": [[27, "pydna.common_sub_strings.terminal_overlap"]], "pydna.conftest": [[28, "module-pydna.conftest"]], "contig (class in pydna.contig)": [[29, "pydna.contig.Contig"]], "detailed_figure() (pydna.contig.contig method)": [[29, "pydna.contig.Contig.detailed_figure"]], "figure() (pydna.contig.contig method)": [[29, "pydna.contig.Contig.figure"]], "from_seqrecord() (pydna.contig.contig class method)": [[29, "pydna.contig.Contig.from_SeqRecord"]], "from_string() (pydna.contig.contig class method)": [[29, "pydna.contig.Contig.from_string"]], "pydna.contig": [[29, "module-pydna.contig"]], "rc() (pydna.contig.contig method)": [[29, "pydna.contig.Contig.rc"]], "reverse_complement() (pydna.contig.contig method)": [[29, "pydna.contig.Contig.reverse_complement"]], "cas9 (class in pydna.crispr)": [[30, "pydna.crispr.cas9"]], "fst3 (pydna.crispr.cas9 attribute)": [[30, "pydna.crispr.cas9.fst3"]], "fst5 (pydna.crispr.cas9 attribute)": [[30, "pydna.crispr.cas9.fst5"]], "ovhg (pydna.crispr.cas9 attribute)": [[30, "pydna.crispr.cas9.ovhg"]], "pam (pydna.crispr.cas9 attribute)": [[30, "pydna.crispr.cas9.pam"]], "protospacer() (in module pydna.crispr)": [[30, "pydna.crispr.protospacer"]], "pydna.crispr": [[30, "module-pydna.crispr"]], "scaffold (pydna.crispr.cas9 attribute)": [[30, "pydna.crispr.cas9.scaffold"]], "search() (pydna.crispr.cas9 method)": [[30, "pydna.crispr.cas9.search"]], "size (pydna.crispr.cas9 attribute)": [[30, "pydna.crispr.cas9.size"]], "assembly_fragments() (in module pydna.design)": [[31, "pydna.design.assembly_fragments"]], "circular_assembly_fragments() (in module pydna.design)": [[31, "pydna.design.circular_assembly_fragments"]], "primer_design() (in module pydna.design)": [[31, "pydna.design.primer_design"]], "pydna.design": [[31, "module-pydna.design"]], "pydna.download": [[32, "module-pydna.download"]], "dseq (class in pydna.dseq)": [[33, "pydna.dseq.Dseq"]], "t4() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.T4"], [33, "pydna.dseq.Dseq.t4"]], "apply_cut() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.apply_cut"]], "cas9() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.cas9"]], "cut() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.cut"]], "cutsite_is_valid() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.cutsite_is_valid"]], "cutters() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.cutters"]], "exo1_end() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.exo1_end"]], "exo1_front() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.exo1_front"]], "fill_in() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.fill_in"]], "find() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.find"]], "five_prime_end() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.five_prime_end"]], "from_full_sequence_and_overhangs() (pydna.dseq.dseq class method)": [[33, "pydna.dseq.Dseq.from_full_sequence_and_overhangs"]], "from_representation() (pydna.dseq.dseq class method)": [[33, "pydna.dseq.Dseq.from_representation"]], "from_string() (pydna.dseq.dseq class method)": [[33, "pydna.dseq.Dseq.from_string"]], "get_cut_parameters() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.get_cut_parameters"]], "get_cutsite_pairs() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.get_cutsite_pairs"]], "get_cutsites() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.get_cutsites"]], "isblunt() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.isblunt"]], "left_end_position() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.left_end_position"]], "looped() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.looped"]], "lower() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.lower"]], "mung() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.mung"]], "mw() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.mw"]], "n_cutters() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.n_cutters"]], "no_cutters() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.no_cutters"]], "once_cutters() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.once_cutters"]], "pydna.dseq": [[33, "module-pydna.dseq"]], "quick() (pydna.dseq.dseq class method)": [[33, "pydna.dseq.Dseq.quick"]], "rc() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.rc"]], "reverse_complement() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.reverse_complement"]], "right_end_position() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.right_end_position"]], "seguid() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.seguid"]], "shifted() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.shifted"]], "terminal_transferase() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.terminal_transferase"]], "three_prime_end() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.three_prime_end"]], "tolinear() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.tolinear"]], "transcribe() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.transcribe"]], "translate() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.translate"]], "trunc (pydna.dseq.dseq attribute)": [[33, "pydna.dseq.Dseq.trunc"]], "twice_cutters() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.twice_cutters"]], "unique_cutters() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.unique_cutters"]], "upper() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.upper"]], "watson_ovhg() (pydna.dseq.dseq method)": [[33, "pydna.dseq.Dseq.watson_ovhg"]], "dseqrecord (class in pydna.dseqrecord)": [[34, "pydna.dseqrecord.Dseqrecord"]], "add_feature() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.add_feature"]], "apply_cut() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.apply_cut"]], "cas9() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.cas9"]], "circular (pydna.dseqrecord.dseqrecord property)": [[34, "pydna.dseqrecord.Dseqrecord.circular"]], "copy_fasta_to_clipboard() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.copy_fasta_to_clipboard"]], "copy_gb_to_clipboard() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.copy_gb_to_clipboard"]], "cut() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.cut"]], "cutters() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.cutters"]], "extract_feature() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.extract_feature"]], "figure() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.figure"]], "find() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.find"]], "find_aa() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.find_aa"]], "find_aminoacids() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.find_aminoacids"]], "format() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.format"]], "from_seqrecord() (pydna.dseqrecord.dseqrecord class method)": [[34, "pydna.dseqrecord.Dseqrecord.from_SeqRecord"]], "from_string() (pydna.dseqrecord.dseqrecord class method)": [[34, "pydna.dseqrecord.Dseqrecord.from_string"]], "linearize() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.linearize"]], "looped() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.looped"]], "lower() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.lower"]], "m() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.m"]], "map_trace_files() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.map_trace_files"]], "n_cutters() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.n_cutters"]], "no_cutters() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.no_cutters"]], "number_of_cuts() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.number_of_cuts"]], "once_cutters() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.once_cutters"]], "orfs() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.orfs"]], "orfs_to_features() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.orfs_to_features"]], "pydna.dseqrecord": [[34, "module-pydna.dseqrecord"]], "rc() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.rc"]], "reverse_complement() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.reverse_complement"]], "seguid() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.seguid"]], "shifted() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.shifted"]], "synced() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.synced"]], "terminal_transferase() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.terminal_transferase"]], "tolinear() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.tolinear"]], "twice_cutters() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.twice_cutters"]], "unique_cutters() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.unique_cutters"]], "upper() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.upper"]], "write() (pydna.dseqrecord.dseqrecord method)": [[34, "pydna.dseqrecord.Dseqrecord.write"]], "editor (class in pydna.editor)": [[35, "pydna.editor.Editor"]], "ape() (in module pydna.editor)": [[35, "pydna.editor.ape"]], "open() (pydna.editor.editor method)": [[35, "pydna.editor.Editor.open"]], "pydna.editor": [[35, "module-pydna.editor"]], "fakeseq (class in pydna.fakeseq)": [[36, "pydna.fakeseq.FakeSeq"]], "m() (pydna.fakeseq.fakeseq method)": [[36, "pydna.fakeseq.FakeSeq.M"], [36, "pydna.fakeseq.FakeSeq.m"]], "pydna.fakeseq": [[36, "module-pydna.fakeseq"]], "fuse_by_pcr() (in module pydna.fusionpcr)": [[37, "pydna.fusionpcr.fuse_by_pcr"]], "list_parts() (in module pydna.fusionpcr)": [[37, "pydna.fusionpcr.list_parts"]], "pydna.fusionpcr": [[37, "module-pydna.fusionpcr"]], "gateway (class in pydna.gateway)": [[38, "pydna.gateway.Gateway"]], "pydna.gateway": [[38, "module-pydna.gateway"]], "gel() (in module pydna.gel)": [[39, "pydna.gel.gel"]], "interpolator() (in module pydna.gel)": [[39, "pydna.gel.interpolator"]], "pydna.gel": [[39, "module-pydna.gel"]], "genbank (class in pydna.genbank)": [[40, "pydna.genbank.Genbank"]], "genbank() (in module pydna.genbank)": [[40, "pydna.genbank.genbank"]], "nucleotide() (pydna.genbank.genbank method)": [[40, "pydna.genbank.Genbank.nucleotide"]], "pydna.genbank": [[40, "module-pydna.genbank"]], "genbankfile (class in pydna.genbankfile)": [[41, "pydna.genbankfile.GenbankFile"]], "from_seqrecord() (pydna.genbankfile.genbankfile class method)": [[41, "pydna.genbankfile.GenbankFile.from_SeqRecord"]], "pydna.genbankfile": [[41, "module-pydna.genbankfile"]], "rc() (pydna.genbankfile.genbankfile method)": [[41, "pydna.genbankfile.GenbankFile.rc"]], "reverse_complement() (pydna.genbankfile.genbankfile method)": [[41, "pydna.genbankfile.GenbankFile.reverse_complement"]], "concat_dict() (in module pydna.genbankfixer)": [[42, "pydna.genbankfixer.concat_dict"]], "gbtext_clean() (in module pydna.genbankfixer)": [[42, "pydna.genbankfixer.gbtext_clean"]], "locstr() (in module pydna.genbankfixer)": [[42, "pydna.genbankfixer.locstr"]], "originstr() (in module pydna.genbankfixer)": [[42, "pydna.genbankfixer.originstr"]], "parsegbloc() (in module pydna.genbankfixer)": [[42, "pydna.genbankfixer.parseGBLoc"]], "pydna.genbankfixer": [[42, "module-pydna.genbankfixer"]], "strip_indent() (in module pydna.genbankfixer)": [[42, "pydna.genbankfixer.strip_indent"]], "strip_multiline() (in module pydna.genbankfixer)": [[42, "pydna.genbankfixer.strip_multiline"]], "togb() (in module pydna.genbankfixer)": [[42, "pydna.genbankfixer.toGB"]], "toint() (in module pydna.genbankfixer)": [[42, "pydna.genbankfixer.toInt"]], "tojson() (in module pydna.genbankfixer)": [[42, "pydna.genbankfixer.toJSON"]], "wrapstring() (in module pydna.genbankfixer)": [[42, "pydna.genbankfixer.wrapstring"]], "genbankrecord (class in pydna.genbankrecord)": [[43, "pydna.genbankrecord.GenbankRecord"]], "biopython_code() (pydna.genbankrecord.genbankrecord method)": [[43, "pydna.genbankrecord.GenbankRecord.biopython_code"]], "from_seqrecord() (pydna.genbankrecord.genbankrecord class method)": [[43, "pydna.genbankrecord.GenbankRecord.from_SeqRecord"]], "from_string() (pydna.genbankrecord.genbankrecord class method)": [[43, "pydna.genbankrecord.GenbankRecord.from_string"]], "pydna.genbankrecord": [[43, "module-pydna.genbankrecord"]], "pydna_code() (pydna.genbankrecord.genbankrecord method)": [[43, "pydna.genbankrecord.GenbankRecord.pydna_code"]], "rc() (pydna.genbankrecord.genbankrecord method)": [[43, "pydna.genbankrecord.GenbankRecord.rc"]], "reverse_complement() (pydna.genbankrecord.genbankrecord method)": [[43, "pydna.genbankrecord.GenbankRecord.reverse_complement"]], "pydna.goldengate": [[44, "module-pydna.goldengate"]], "pydna.ladders": [[45, "module-pydna.ladders"]], "ligate() (in module pydna.ligate)": [[46, "pydna.ligate.ligate"]], "pydna.ligate": [[46, "module-pydna.ligate"]], "pydna.myenzymes": [[47, "module-pydna.myenzymes"]], "primerlist (class in pydna.myprimers)": [[48, "pydna.myprimers.PrimerList"]], "accessed (pydna.myprimers.primerlist property)": [[48, "pydna.myprimers.PrimerList.accessed"]], "assign_numbers() (pydna.myprimers.primerlist method)": [[48, "pydna.myprimers.PrimerList.assign_numbers"]], "check_primer_numbers() (in module pydna.myprimers)": [[48, "pydna.myprimers.check_primer_numbers"]], "code() (pydna.myprimers.primerlist method)": [[48, "pydna.myprimers.PrimerList.code"]], "find_duplicate_primers() (in module pydna.myprimers)": [[48, "pydna.myprimers.find_duplicate_primers"]], "open_folder() (pydna.myprimers.primerlist method)": [[48, "pydna.myprimers.PrimerList.open_folder"]], "pydna.myprimers": [[48, "module-pydna.myprimers"]], "pydna_code_from_list() (pydna.myprimers.primerlist method)": [[48, "pydna.myprimers.PrimerList.pydna_code_from_list"]], "undefined_sequence() (in module pydna.myprimers)": [[48, "pydna.myprimers.undefined_sequence"]], "embl_gb_fasta() (in module pydna.parsers)": [[49, "pydna.parsers.embl_gb_fasta"]], "extract_from_text() (in module pydna.parsers)": [[49, "pydna.parsers.extract_from_text"]], "parse() (in module pydna.parsers)": [[49, "pydna.parsers.parse"]], "parse_primers() (in module pydna.parsers)": [[49, "pydna.parsers.parse_primers"]], "pydna.parsers": [[49, "module-pydna.parsers"]], "primer (class in pydna.primer)": [[50, "pydna.primer.Primer"]], "footprint (pydna.primer.primer property)": [[50, "pydna.primer.Primer.footprint"]], "pydna.primer": [[50, "module-pydna.primer"]], "reverse_complement() (pydna.primer.primer method)": [[50, "pydna.primer.Primer.reverse_complement"]], "tail (pydna.primer.primer property)": [[50, "pydna.primer.Primer.tail"]], "pydna.readers": [[51, "module-pydna.readers"]], "read() (in module pydna.readers)": [[51, "pydna.readers.read"]], "read_primer() (in module pydna.readers)": [[51, "pydna.readers.read_primer"]], "proteinseq (class in pydna.seq)": [[52, "pydna.seq.ProteinSeq"]], "seq (class in pydna.seq)": [[52, "pydna.seq.Seq"]], "back_transcribe() (pydna.seq.proteinseq method)": [[52, "pydna.seq.ProteinSeq.back_transcribe"]], "cai() (pydna.seq.seq method)": [[52, "pydna.seq.Seq.cai"]], "complement() (pydna.seq.proteinseq method)": [[52, "pydna.seq.ProteinSeq.complement"]], "complement_rna() (pydna.seq.proteinseq method)": [[52, "pydna.seq.ProteinSeq.complement_rna"]], "express() (pydna.seq.seq method)": [[52, "pydna.seq.Seq.express"]], "gc() (pydna.seq.seq method)": [[52, "pydna.seq.Seq.gc"]], "instability_index() (pydna.seq.proteinseq method)": [[52, "pydna.seq.ProteinSeq.instability_index"]], "molecular_weight() (pydna.seq.proteinseq method)": [[52, "pydna.seq.ProteinSeq.molecular_weight"]], "orfs() (pydna.seq.seq method)": [[52, "pydna.seq.Seq.orfs"]], "orfs2() (pydna.seq.seq method)": [[52, "pydna.seq.Seq.orfs2"]], "pi() (pydna.seq.proteinseq method)": [[52, "pydna.seq.ProteinSeq.pI"]], "pydna.seq": [[52, "module-pydna.seq"]], "rarecodons() (pydna.seq.seq method)": [[52, "pydna.seq.Seq.rarecodons"]], "rc() (pydna.seq.proteinseq method)": [[52, "pydna.seq.ProteinSeq.rc"]], "rc() (pydna.seq.seq method)": [[52, "pydna.seq.Seq.rc"]], "reverse_complement() (pydna.seq.proteinseq method)": [[52, "pydna.seq.ProteinSeq.reverse_complement"]], "reverse_complement() (pydna.seq.seq method)": [[52, "pydna.seq.Seq.reverse_complement"]], "reverse_complement_rna() (pydna.seq.proteinseq method)": [[52, "pydna.seq.ProteinSeq.reverse_complement_rna"]], "seguid() (pydna.seq.proteinseq method)": [[52, "pydna.seq.ProteinSeq.seguid"]], "seguid() (pydna.seq.seq method)": [[52, "pydna.seq.Seq.seguid"]], "startcodon() (pydna.seq.seq method)": [[52, "pydna.seq.Seq.startcodon"]], "stopcodon() (pydna.seq.seq method)": [[52, "pydna.seq.Seq.stopcodon"]], "transcribe() (pydna.seq.proteinseq method)": [[52, "pydna.seq.ProteinSeq.transcribe"]], "translate() (pydna.seq.proteinseq method)": [[52, "pydna.seq.ProteinSeq.translate"]], "translate() (pydna.seq.seq method)": [[52, "pydna.seq.Seq.translate"]], "proteinseqrecord (class in pydna.seqrecord)": [[53, "pydna.seqrecord.ProteinSeqRecord"]], "seqrecord (class in pydna.seqrecord)": [[53, "pydna.seqrecord.SeqRecord"]], "accession (pydna.seqrecord.seqrecord property)": [[53, "pydna.seqrecord.SeqRecord.accession"]], "add_colors_to_features_for_ape() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.add_colors_to_features_for_ape"]], "add_feature() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.add_feature"]], "cai() (pydna.seqrecord.proteinseqrecord method)": [[53, "pydna.seqrecord.ProteinSeqRecord.cai"]], "cai() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.cai"]], "comment() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.comment"]], "copy() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.copy"]], "datefunction() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.datefunction"]], "definition (pydna.seqrecord.seqrecord property)": [[53, "pydna.seqrecord.SeqRecord.definition"]], "dump() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.dump"]], "express() (pydna.seqrecord.proteinseqrecord method)": [[53, "pydna.seqrecord.ProteinSeqRecord.express"]], "express() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.express"]], "extract_feature() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.extract_feature"]], "from_bio_seqrecord() (pydna.seqrecord.seqrecord class method)": [[53, "pydna.seqrecord.SeqRecord.from_Bio_SeqRecord"]], "gc() (pydna.seqrecord.proteinseqrecord method)": [[53, "pydna.seqrecord.ProteinSeqRecord.gc"]], "gc() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.gc"]], "isorf() (pydna.seqrecord.proteinseqrecord method)": [[53, "pydna.seqrecord.ProteinSeqRecord.isorf"]], "isorf() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.isorf"]], "lcs() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.lcs"]], "list_features() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.list_features"]], "locus (pydna.seqrecord.seqrecord property)": [[53, "pydna.seqrecord.SeqRecord.locus"]], "pydna.seqrecord": [[53, "module-pydna.seqrecord"]], "rarecodons() (pydna.seqrecord.proteinseqrecord method)": [[53, "pydna.seqrecord.ProteinSeqRecord.rarecodons"]], "rarecodons() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.rarecodons"]], "rc() (pydna.seqrecord.proteinseqrecord method)": [[53, "pydna.seqrecord.ProteinSeqRecord.rc"]], "rc() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.rc"]], "reverse_complement() (pydna.seqrecord.proteinseqrecord method)": [[53, "pydna.seqrecord.ProteinSeqRecord.reverse_complement"]], "reverse_complement() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.reverse_complement"]], "seguid() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.seguid"]], "sorted_features() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.sorted_features"]], "stamp() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.stamp"]], "startcodon() (pydna.seqrecord.proteinseqrecord method)": [[53, "pydna.seqrecord.ProteinSeqRecord.startcodon"]], "startcodon() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.startcodon"]], "stopcodon() (pydna.seqrecord.proteinseqrecord method)": [[53, "pydna.seqrecord.ProteinSeqRecord.stopcodon"]], "stopcodon() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.stopcodon"]], "translate() (pydna.seqrecord.seqrecord method)": [[53, "pydna.seqrecord.SeqRecord.translate"]], "genbank_accession() (in module pydna.sequence_picker)": [[54, "pydna.sequence_picker.genbank_accession"]], "pydna.sequence_picker": [[54, "module-pydna.sequence_picker"]], "a() (in module pydna.threading_timer_decorator_exit)": [[55, "pydna.threading_timer_decorator_exit.a"]], "b() (in module pydna.threading_timer_decorator_exit)": [[55, "pydna.threading_timer_decorator_exit.b"]], "c() (in module pydna.threading_timer_decorator_exit)": [[55, "pydna.threading_timer_decorator_exit.c"]], "cdquit() (in module pydna.threading_timer_decorator_exit)": [[55, "pydna.threading_timer_decorator_exit.cdquit"]], "countdown() (in module pydna.threading_timer_decorator_exit)": [[55, "pydna.threading_timer_decorator_exit.countdown"]], "d() (in module pydna.threading_timer_decorator_exit)": [[55, "pydna.threading_timer_decorator_exit.d"]], "exit_after() (in module pydna.threading_timer_decorator_exit)": [[55, "pydna.threading_timer_decorator_exit.exit_after"]], "main() (in module pydna.threading_timer_decorator_exit)": [[55, "pydna.threading_timer_decorator_exit.main"]], "pydna.threading_timer_decorator_exit": [[55, "module-pydna.threading_timer_decorator_exit"]], "q5() (in module pydna.tm)": [[56, "pydna.tm.Q5"]], "dbd_program() (in module pydna.tm)": [[56, "pydna.tm.dbd_program"]], "pfu_sso7d_program() (in module pydna.tm)": [[56, "pydna.tm.pfu_sso7d_program"]], "program() (in module pydna.tm)": [[56, "pydna.tm.program"]], "pydna.tm": [[56, "module-pydna.tm"]], "ta_dbd() (in module pydna.tm)": [[56, "pydna.tm.ta_dbd"]], "ta_default() (in module pydna.tm)": [[56, "pydna.tm.ta_default"]], "taq_program() (in module pydna.tm)": [[56, "pydna.tm.taq_program"]], "tm_dbd() (in module pydna.tm)": [[56, "pydna.tm.tm_dbd"]], "tm_default() (in module pydna.tm)": [[56, "pydna.tm.tm_default"]], "tm_neb() (in module pydna.tm)": [[56, "pydna.tm.tm_neb"]], "tm_product() (in module pydna.tm)": [[56, "pydna.tm.tm_product"]], "tmbresluc() (in module pydna.tm)": [[56, "pydna.tm.tmbresluc"]], "pydna.user_cloning": [[57, "module-pydna.user_cloning"]], "cai() (in module pydna.utils)": [[58, "pydna.utils.cai"]], "complement() (in module pydna.utils)": [[58, "pydna.utils.complement"]], "cuts_overlap() (in module pydna.utils)": [[58, "pydna.utils.cuts_overlap"]], "eq() (in module pydna.utils)": [[58, "pydna.utils.eq"]], "express() (in module pydna.utils)": [[58, "pydna.utils.express"]], "flatten() (in module pydna.utils)": [[58, "pydna.utils.flatten"]], "identifier_from_string() (in module pydna.utils)": [[58, "pydna.utils.identifier_from_string"]], "location_boundaries() (in module pydna.utils)": [[58, "pydna.utils.location_boundaries"]], "locations_overlap() (in module pydna.utils)": [[58, "pydna.utils.locations_overlap"]], "memorize() (in module pydna.utils)": [[58, "pydna.utils.memorize"]], "open_folder() (in module pydna.utils)": [[58, "pydna.utils.open_folder"]], "pydna.utils": [[58, "module-pydna.utils"]], "randomdna() (in module pydna.utils)": [[58, "pydna.utils.randomDNA"]], "randomorf() (in module pydna.utils)": [[58, "pydna.utils.randomORF"]], "randomrna() (in module pydna.utils)": [[58, "pydna.utils.randomRNA"]], "randomprot() (in module pydna.utils)": [[58, "pydna.utils.randomprot"]], "rarecodons() (in module pydna.utils)": [[58, "pydna.utils.rarecodons"]], "rc() (in module pydna.utils)": [[58, "pydna.utils.rc"]], "seq31() (in module pydna.utils)": [[58, "pydna.utils.seq31"]], "shift_feature() (in module pydna.utils)": [[58, "pydna.utils.shift_feature"]], "shift_location() (in module pydna.utils)": [[58, "pydna.utils.shift_location"]], "smallest_rotation() (in module pydna.utils)": [[58, "pydna.utils.smallest_rotation"]], "three_frame_orfs() (in module pydna.utils)": [[58, "pydna.utils.three_frame_orfs"]]}}) \ No newline at end of file