diff --git a/.buildinfo b/.buildinfo index 88ce134a..8e2cff9b 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: 2b03fdb29cb7f014b01d408c45b07c8c +config: dc32bed7db876789887fb362f92a7ad9 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/CHANGELOG.html b/CHANGELOG.html new file mode 100644 index 00000000..fe272592 --- /dev/null +++ b/CHANGELOG.html @@ -0,0 +1,939 @@ + + + + + + + + + Changelog — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Changelog

+

All notable changes to this project will be documented in this file.

+

The format is based on Keep a Changelog, +and this project adheres to Semantic Versioning.

+
+

Unreleased

+
+
+

[6.0.0a01] - 2023-05-04

+
+

Added

+

New common_sub_strings function. The previous version was implemented in pure python that was quite fast, but still a bottleneck in the code. +Thanks to @louisabraham, we now have code based on pydivsufsort which provide +bindings to libdivsufsort, a very fast suffix array construction algorithm written in c. As a consequence, the Assembly code is now much faster.

+

Poetry is now used for building pydna. I have removed the setup.py file. I also do not build +Anaconda packages anymore, as conda-build got too slow to work with. I have plans to update the Bioconda recipe for the new version. As pydna is pure Python, anyone can make a conda package using grayskull for example.

+
+
+

Changed

+

Dseq and Dseqrecord now only take a circular argument (True or False) to indicate topology. Previously, linear was also +accepted. This was a little used feature (by me) that made the init methods of both classes slow and complex. As this +was a violation of zen#13 (“There should be one– and preferably only one…”) This change could break code, +hence the bump of major version number.

+

Code formatting with Black (also suggested by @louisabraham). I now use a git pre-commit hook for this, so formatting should be more standardized.

+

Removed cache for all but download and genbank. Several functions and methods could previously be cached, something that saw very little use. The cache for genbank and download remain as this reduces the load on Genbank servers and also speed things up.

+

Environment variable pydna_assembly_limit sets the execution time in seconds (default 10) for +the assemble_linear and assemble_circular methods. There might be a better way to find out if an assembly is likely to take long, usually when there are many paths through the assembly graph.

+
17:01 $ git log --oneline --graph v5.2.0..a03c2a06a20afef95415f5f1786df2f71e921fd0
+* a03c2a06a2 (HEAD -> dev_bjorn, origin/dev_bjorn) only build on master
+* c7ce8582fa uppd action
+* ca4c969c28 fix tests and commented out unneeded code
+* 6539a1f076 added this as probably needed for a future bioconda package
+* c933ca5a7b added this as probably needed for a future bioconda package
+* c32fc5c9be fastes dseq init in dsecrecord init
+* 70ced77d24 added min_rotation from pydivsufsort
+* 2cc4edbc68 (origin/black, black) ws
+* 4888db36f3 all black
+* 0bf9fbd993 formatted with black precommit hook
+* 74e3e1c229 fromatted with black
+* f78dcb2fdd uppd poetry.lock
+*   769dc98d89 (mergeexp) merge
+|\
+| * d242459fc5 (speed_up_Dseqrecord) try to ignore prof dir
+| * bef4f6800c (origin/speed_up_Dseqrecord) edit
+| * e29ac49f8e prep for adding new dundermethods
+| * 2acbc5033c prep for implementing __copy__ and __deepcopy__ methods
+| * 9916a62c93 added pstats script
+| * 0b41671c1c mod tests
+| * 9f060a0dea ignore
+| * cbd4773605 added back test for iterable
+| * 9b93d8988c removed linear property
+| * 798899569a profiling
+| * 9b5e7a6c13 added back prof
+| * b1a8771323 add back profilig dir
+| * ae93cb340f added dep pydivsufsort
+| * 6f3f39398a Remover 'linear' method for Dseq and Dseqrecord - passes modified tests
+| * 694ea1b5d5 (smallest_rot) new faster common_sub_strings
+* | c57f5cb3c5 try fix profining error
+* | f82a5676d6 fix test
+* | 9d18ed4c03 gitignore
+|/
+* 28d8e98fd8 separated doctests
+* dacf9e1f3b whitespace
+* 6513a0bf85 removed cruft
+* c4a0265a12 removed profiling
+* 3c11115871 try ignore
+* 01999514c2 do not track profiling files
+* 6eb2154fff reformatted code
+* 4e08cb910d switched to array in smallest_rotation function and fixed a docstring
+* 014b40e20d reorganized common_sub_strings
+* 190541a51e fix pyproject.toml
+* 4c9d27042f added pytest-profiling to env
+* 733d83782a added profiling to run_test
+* 1db40a1bc7 added experiment files
+* 9ac4f4c6f2 added prof
+* b867cd2039 removed old file
+* 35f8eb03d1 added profiling
+* 4b4bafb272 changed badge
+* f496be825b url
+* a16e7a004d uppdate
+* 5190177811 removed python 2 code
+* 76a5930791 set timeout from env var pydna_assembly_limit
+* 3cf0bba9bc added assembly limit to default env vars
+* cd76b4a123 added urls
+* f4ef97dbc0 uppdated cheat sheet
+* c0f111c67a changed target branch for pull req
+* f0385b7981 New timeout for assembly
+* 5252df3cf4 switched from wrapt-timeout-decorator
+* 5d46b153e6 upd poetry deps
+* 436ae27381 removed cython notebook
+* ce9a919e15 fix dep
+* 2ce61667de fix deps
+* 8be47b5463 stuff
+*   75ea5dbee1 Merge branch 'dev_bjorn' of https://github.com/BjornFJohansson/pydna into dev_bjorn
+|\
+| *   5c2ec77539 Merge pull request #106 from BjornFJohansson/dependabot/pip/coverage-7.2.2
+| |\
+| | * b15fd0cbb4 Bump coverage from 7.2.1 to 7.2.2
+* | | 8e529ff1c7 remove cashing for some functions
+|/ /
+* / 8dd2ca19a0 bugfix: hardcoded strand set to 1
+|/
+* dacb024944 updated poetry.lock
+* a3c3791917 fix
+*   74d3850352 Merge pull request #94 from BjornFJohansson/dependabot/pip/ipython-8.10.0
+|\
+| * 66f20aa195 (origin/dependabot/pip/ipython-8.10.0) Bump ipython from 8.9.0 to 8.10.0
+* |   30d109bbb2 Merge pull request #95 from BjornFJohansson/dependabot/pip/biopython-1.81
+|\ \
+| * | bd0ef21a96 Bump biopython from 1.80 to 1.81
+| |/
+* |   879c81ccf7 Merge pull request #96 from BjornFJohansson/dependabot/pip/pyqt5-5.15.9
+|\ \
+| * | 5482b0788f Bump pyqt5 from 5.15.8 to 5.15.9
+| |/
+* | 813ac07394 fix gel image test
+* | 63de396a5f fix gel examples
+* | 1eb18bc709 new example w gel
+|/
+* c6d1fbda8c fix link
+*   ffda81e24e Merge branch 'master' of https://github.com/BjornFJohansson/pydna
+|\
+| * f8896ab27f Update README.md
+* |   546f357997 Merge branch 'dev_bjorn'
+|\ \
+| |/
+|/|
+| * 98b6eaa55f improve example
+| * 186dbff025 bugfix for slicing genbankrecords
+| * 10e79ccaba fix table
+* | c45913bee0 Merge branch 'dev_bjorn'
+|\|
+| * 593b1f4dfb simplify readme
+| * 9800fdf2bb whitespace
+| * 9276a054fa start to make a better figure for amplicon
+| * 0cb741bf84 better example with pcr
+* | a6fda7a276 Merge branch 'dev_bjorn'
+|\|
+| * c1ec911a22 fix example
+| * 5b53ffc9ff fix raw link
+* | 77f2121d76 Merge branch 'dev_bjorn'
+|/
+* fbcdb0bea4 fix link
+* b9ada45f20 (origin/poetry, LouisAbraham/poetry, poetry) new readme
+
+
+
+
+
+

[5.3.0] - 2023-05-04

+
+

Added

+
+
+

Changed

+
07:26 $ git log --oneline --graph v5.2.0..a16e7a004da1292f33db5a9a48f19c61b415dff6
+* a16e7a004d (HEAD -> dev_bjorn, origin/dev_bjorn) uppdate
+* 5190177811 removed python 2 code
+* 76a5930791 set timeout from env var pydna_assembly_limit
+* 3cf0bba9bc added assembly limit to default env vars
+* cd76b4a123 added urls
+* f4ef97dbc0 uppdated cheat sheet
+* c0f111c67a changed target branch for pull req
+* f0385b7981 New timeout for assembly
+* 5252df3cf4 switched from wrapt-timeout-decorator
+* 5d46b153e6 upd poetry deps
+* 436ae27381 removed cython notebook
+* ce9a919e15 fix dep
+* 2ce61667de fix deps
+* 8be47b5463 stuff
+*   75ea5dbee1 Merge branch 'dev_bjorn' of https://github.com/BjornFJohansson/pydna into dev_bjorn
+|\
+| *   5c2ec77539 Merge pull request #106 from BjornFJohansson/dependabot/pip/coverage-7.2.2
+| |\
+| | * b15fd0cbb4 Bump coverage from 7.2.1 to 7.2.2
+* | | 8e529ff1c7 remove cashing for some functions
+|/ /
+* / 8dd2ca19a0 bugfix: hardcoded strand set to 1
+|/
+* dacb024944 (origin/master, master) updated poetry.lock
+* a3c3791917 fix
+*   74d3850352 Merge pull request #94 from BjornFJohansson/dependabot/pip/ipython-8.10.0
+|\
+| * 66f20aa195 (origin/dependabot/pip/ipython-8.10.0) Bump ipython from 8.9.0 to 8.10.0
+* |   30d109bbb2 Merge pull request #95 from BjornFJohansson/dependabot/pip/biopython-1.81
+|\ \
+| * | bd0ef21a96 Bump biopython from 1.80 to 1.81
+| |/
+* |   879c81ccf7 Merge pull request #96 from BjornFJohansson/dependabot/pip/pyqt5-5.15.9
+|\ \
+| * | 5482b0788f Bump pyqt5 from 5.15.8 to 5.15.9
+| |/
+* | 813ac07394 fix gel image test
+* | 63de396a5f fix gel examples
+* | 1eb18bc709 new example w gel
+|/
+* c6d1fbda8c fix link
+*   ffda81e24e Merge branch 'master' of https://github.com/BjornFJohansson/pydna
+|\
+| * f8896ab27f Update README.md
+* |   546f357997 Merge branch 'dev_bjorn'
+|\ \
+| |/
+|/|
+| * 98b6eaa55f improve example
+| * 186dbff025 bugfix for slicing genbankrecords
+| * 10e79ccaba fix table
+* | c45913bee0 Merge branch 'dev_bjorn'
+|\|
+| * 593b1f4dfb simplify readme
+| * 9800fdf2bb whitespace
+| * 9276a054fa start to make a better figure for amplicon
+| * 0cb741bf84 better example with pcr
+* | a6fda7a276 Merge branch 'dev_bjorn'
+|\|
+| * c1ec911a22 fix example
+| * 5b53ffc9ff fix raw link
+* | 77f2121d76 Merge branch 'dev_bjorn'
+|/
+* fbcdb0bea4 fix link
+* b9ada45f20 (origin/poetry, poetry) new readme
+(END)
+
+
+
+
+
+

[5.0.1]

+
+
+

[5.0.0]

+
+
+

[4.0.0] - 2020-10-10

+
+

Added

+
    +
  • New gel module

  • +
  • New module myprimers_gdoc for storing primers in a google doc

  • +
  • New module fakeseq for making DNA ladders.

  • +
  • New module ladders containing DNA molecular weight markers.

  • +
+
+
+

Changed

+
    +
  • Changes to myprimer module.

  • +
+
+
+
+

3.1.3 - 2020-10-10

+
+

Added

+
    +
  • added .sorted_features method for SeqRecord

  • +
  • added a new lcs (longest common substring) method for SeqRecord and DseqRecord

  • +
+
+
+

Changed

+
    +
  • changed format for changelog

  • +
  • biopython 1.78 in requirements.txt

  • +
  • fix to scripts/check_my_primers.py

  • +
+
+
+
+

3.1.2 - 2020-09-28

+
+

Changed

+
    +
  • Bugfix release. There was a bug in stamping genbank files with cSEGUID.

  • +
+
+
+
+

3.1.1 - 2020-09-25

+
+

Changed

+
    +
  • Bugfix release. There was a bug in locating features in certain circular assemblies.

  • +
  • Added a test: “test_marker_replacement_on_plasmid” in test_module_assembly.py to test for this.

  • +
+
+
+
+

3.1.0 - 2020-09-16

+
+

Changed

+
    +
  • Changed to src layout for the package. Changed how melting temperature is calculated.

  • +
  • Changes to tests, added a conftest.py. Updated for comatibility with biopython 1.7.8.

  • +
  • Removed mysequences.py

  • +
  • Reformatted code with BLACK

  • +
  • Use github actions for building and testing

  • +
+
+
+
+

3.0.2a1 - 2019-07-23

+
+

Changed

+
    +
  • .upper() and .lower() methods for Dseq and Dseqrecord classes. Improved slicing

  • +
+
+
+
+

3.0.1 - 2019-05-28

+
+

Changed

+
    +
  • Many changes and improvements, especially for the Assembly class.

  • +
+
+
+
+

3.0.0 - 2019-05-17

+
+

Changed

+
+
+
+
+

2.0.3 - 2017-12-14

+
+

Changed

+
+
+
+
+

[2.0.3a1] - 2017-12-14

+
+

Changed

+
    +
  • pcr function now takes an amplicon. This way an amplicon can easily be rerun after modification of primers or template

  • +
+
+
+
+

2.0.3a0 - 2017-12-03

+
+

Changed

+
+
+
+
+

2.0.2 - 2017-08-26

+
+

Changed

+
+
+
+
+

2.0.2 - 2017-08-26

+
+

Changed

+
+
+
+
+

2.0.1 - 2017-08-24

+
+

Changed

+
+
+
+
+

2.0.0 - 2017-06-23

+
+

Changed

+
    +
  • First release of 2.0.0. This version adds changes in the alpha versions

  • +
+
+
+
+

2.0.0a4 - 2017-05-05

+
+

Changed

+

-Fixed bug in _multiply_circular

+
+
+
+

2.0.0a3 - 2017-04-04

+
+

Changed

+
    +
  • added the all module, from pydna.all import *, now imports a set of useful pydna modules into the main namespace.

  • +
  • Finer control over cache, genbank download is now on by default. Bug fix in assembly_fragments function that created too long primer tails.

  • +
+
+
+
+

2.0.0a2 - —

+
+

Changed

+
+
+
+
+

[2.0.0a1] -

+
+

Changed

+
    +
  • removed setting functions for cache in _init and the delete_cache function for simplicity

  • +
  • removed these functions

  • +
  • pydna.design.print_primer_pair

  • +
  • pydna.design.cloning_primers

  • +
  • pydna.design.integration_primers

  • +
  • pydna.design.assembly_primers

  • +
+
+
+
+

2.0.0a0 - 2017-03-15

+
+

Changed

+
    +
  • alpha release, removed imports in init

  • +
  • This version breaks compatibility.

  • +
+
+
+
+

1.2.0 - 2017-03-10

+
+

Changed

+
    +
  • New and simpler primer design api, especially for gibson assembly primers. See docstrings

  • +
  • Dseqrecord.find method that allows finding subsequences “over the edge” of circular sequences.

  • +
+
+
+
+

1.1.5 - 2016-12-16

+
+

Changed

+
    +
  • added message for Dseqrecord write

  • +
+
+
+
+

1.1.4 - 2016-12-15

+
+

Changed

+
    +
  • split some files into more logical and smaller chunks.

  • +
  • The Primer class is now the same in primer design and amplify modules

  • +
  • less modules are imported in init.py

  • +
  • pydna.getcache returns the pydna_cache environment variable

  • +
  • pydna.cached sets pydna_cache to “cached”

  • +
  • pydna.nocache sets pydna_cache to “nocache”

  • +
  • pydna.refresh sets pydna_cache to “refresh”

  • +
  • Many of the Classes have new repr methods compatible with the Jupyter notebook.

  • +
  • One Jupyter notebook is now run as a part of the test suite using pytest/nbval

  • +
  • pydna.parse_primers now return a list of Primer class objects

  • +
  • pydna.read_primer now a Primer class object

  • +
  • pydna.read_url and pydna.parse_url removed, since they are too risky.

  • +
  • it is better to use pydna.download_text in combination with read or parse. this way, the intermediate text can be inspected and genbankfixer can be applied if necessary

  • +
+
+
+
+

1.1.1 - 2016-11-20

+
+

Changed

+
    +
  • New module genbankfixer for salvaging broken genbank files (pydna.gbtext_clean).

  • +
  • New pydna.readprimer function (shortcut for reading to Biopython.SeqRecord).

  • +
  • Tests merged to pytest.

  • +
  • read_url function

  • +
  • parse_url function

  • +
  • download_text function

  • +
  • New key function for cache of Assemblies.

  • +
+
+
+
+

1.0.2 - 2016-10-08

+
+

Changed

+
    +
  • Python 3 only!

  • +
  • pydna.open_cache -> pydna.open_cache_folder; opens the cache folder in the file browser

  • +
  • logging level is not “info” +added the possiblity to specify a text file containing primers and +a path to the ApE plasmid editor (http://biologylabs.utah.edu/jorgensen/wayned/ape/) +These settings can be made in the pydna.ini file that is located in the +“user_config_dir” specified on each platform by the appdirs module. +on linux it is in ~/.config/pydna

  • +
  • Bugfix: invisible gel bands in the gel module.

  • +
+
+
+
+

1.0.1 - 2016-03-10

+
+

Changed

+
    +
  • Bugfix: for errors in IPython import if IPython is too old ( < 4.0)

  • +
  • Bugfix: Large genbank records were not downloaded completely.

  • +
+
+
+
+

1.0.0 - -

+
+

Changed

+
    +
  • Gel simulation added

  • +
+
+
+
+

0.9.3 - 2015-06-03

+
+

Changed

+
    +
  • Shelve does not work under MacOS under certain conditions.

  • +
  • This release tries to solve this by not specifying file extensions +for the cache files. Two functions are added, pydna.

  • +
+
+
+
+

0.9.2 - 2015-05-28

+
+

Changed

+
    +
  • pydna_data_dir is encoded to a string in init.py instead of +unicode. The Popen module does not accept environment variables that +are not strings.

  • +
+
+
+
+

0.9.1 - 2015-05-26

+
+

Changed

+
    +
  • fixed critical error in the calculation of seguid and cseguid +checksums

  • +
+
+
+
+

0.9.0 - 2015-05-26

+
+

Changed

+
    +
  • seguid and cseguid are now url safe so they can be part of urls and +file names.

  • +
  • Dseqrecord.locus is an alias of Dseqrecord.name

  • +
  • Dseqrecord.accession is an alias of Dseqrecord.id

  • +
  • Dseqrecord.definition is an alias of Dseqrecord.description

  • +
  • changed how circular assembly products are identified to use cseguid.

  • +
  • removed proxy handling when proxy not set in download module.

  • +
  • added CHANGELOG.md, currently empty.

  • +
  • environment variable datadir is now pydna_data_dir.

  • +
  • removed environmental variable pydna_dna_dir.

  • +
  • if Dseqrecord is initiated with a name property that is longer than +16 characters, it is truncated to 16 chars and a warning is issued.

  • +
  • Default Dseqrecord name property is “na”.

  • +
  • Default Dseqrecord id property is “-“.

  • +
  • Default Dseqrecord description property is “@”.

  • +
  • Dseqrecord eq and ne methods defined.

  • +
  • Dseqrecord.write now overwrites an old sequence with the same

  • +
  • filename if the primary sequence is the same.

  • +
  • Dseqrecord.read now only looks in current working directory.

  • +
  • fixed ipynb_import test code.

  • +
+
+
+
+

0.8.4 - 2015-04-17

+
+

Changed

+
    +
  • Bugfix for parsing text files with unicode characters.

  • +
+
+
+
+

0.8.3 - -

+
+

Changed

+
    +
  • +
+
+
+
+

0.8.2 - -

+
+

Changed

+
    +
  • +
+
+
+
+

0.8.1 - 2015-03-07

+
+

Changed

+
    +
  • Bugfix for windows. The data directory was not created.

  • +
+
+
+
+

[0.8.0] - 2015-02-06

+
+

Changed

+
    +
  • Mapping reads added.

  • +
+
+
+
+

[0.7.2] - 2014-11-21

+
+

Changed

+
    +
  • First public release with the changes from 0.7.0 and 0.7.1.

  • +
  • Added a Pretty_str class to beautify output of strings in +the IPython shell.

  • +
+
+
+
+

[0.7.1] - notpublic

+
+

Changed

+
    +
  • Short linkers can be incorporated in PCR primers in the +assembly_primers function.

  • +
+
+
+
+

[0.7.0] - notpublic

+
+

Changed

+
    +
  • Caching to speed up Amplify, Assembly, download and the

  • +
  • Desqrecord synced method. The data is stored in four shelf +files in the users application directory.

  • +
  • amplify.shelf

  • +
  • assembly.shelf

  • +
  • genbank.shelf

  • +
  • synced.shelf

  • +
  • The location is os specific.

  • +
  • See the documentation of appdirs https://pypi.python.org/pypi/appdirs/1.4.0

  • +
+
+
+
+

[0.6.6] -

+
+

Changed

+
    +
  • new function nopcr.

  • +
+
+
+
+

[0.6.5] - 2014-07-31

+
+

Changed

+
    +
  • bugfix: cutting an amplicon object now preserves features

  • +
  • Changed requirement for NetworkX to 1.8.1

  • +
+
+
+
+

[0.6.4] - 2014-07-09

+
+

Changed

+
    +
  • The pcr function and Anneal class can now deal with primers +with ambiguous codons like R = A or G. In the resulting PCR +product, the ambiguous nucleotides are preserved in the tails +i.e. the primer part not annealing. The annealing part will +have the sequence corresponding to the template.

  • +
+
+
+
+

[0.6.3] - 2014-07-06

+
+

Changed

+
    +
  • Dseqrecord.add_feature can now take a string or some other +sequence as input. The assembly primers function can now produce +primers for a circular assembly.

  • +
+
+
+
+

[0.6.2] - 2014-06-13

+
+

Changed

+
    +
  • Dseqrecord gained three new methods:

  • +
  • isorf() method returning True or False.

  • +
  • List_features() method returns a list of all features as a +formatted ASCII table.

  • +
  • Extract_feature() extracts a feature in the form os a new +Dseqrecord object.

  • +
  • Changes to how the primer_design functions work, especially +assembly primers.

  • +
+
+
+
+

[0.6.1] - 2014-04-25

+
+

Changed

+
    +
  • Fixed a bug in the Dseqrecord synced method and removed the +utils synced function.

  • +
+
+
+
+

[0.6.0] - 2014-04-18

+
+

Changed

+
    +
  • Bugfixes and improvements in documentation.

  • +
+
+
+
+

[0.5.0] - 2013-12-16

+
+

Changed

+
    +
  • Changes to how the amplify and assembly modules work +the Amplicon and Assembly classes are now subclasses of +Dseqrecord.

  • +
+
+
+
+

[0.2.2] - 2013-11-05

+
+

Changed

+
    +
  • bugfix: changed the handling of compound features +to fit with the new version of BioPython (1.62) which is +now a requirement.

  • +
+
+
+
+

[0.2.1] - 2013-08-18

+
+

Changed

+
+
+
+
+

[0.1.8] - 2013-06-02

+
+

Changed

+
    +
  • bugfix: changed the SeqFeatures added to PCR products in the

  • +
  • amplify module to a dict of list of strings instead of +a dict of strings.

  • +
+
+
+
+

[0.1.7] - 2013-05-29

+
+

Changed

+
    +
  • Changed the code in amplify.Amplicon to handle features +spanning the origin of circular sequences.

  • +
+
+
+
+

[0.1.6] - 2013-04-22

+
+

Changed

+
    +
  • Changed the behaviour of the find method of the Dseq object +to find substrings that span the origin. Slicing for circular +Dseq objects now works slightly different.

  • +
+
+
+
+

[0.1.5] - 2013-04-18

+
+

Changed

+
    +
  • Changed the setup.py script to permit installation +of the source installer without access to a c compiler.

  • +
+
+
+
+

[0.1.4] - 2013-04-10

+
+

Changed

+
    +
  • Cleaned up some docstrings

  • +
  • Renamed Drecord -> Dseqrecord to be more consistent with

  • +
  • Dseq and Biopython Seq/SeqRecord.

  • +
  • Changed name of keyword argument for read and parse.

  • +
  • ds=True returns Dseqrecord(s) while ds=False returns SeqRecords.

  • +
+
+
+
+

[0.1.3] - 2013-04-09

+
+

Changed

+
    +
  • pydna created from Python-dna.

  • +
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/index.html b/_modules/index.html index f55e13bc..8ccac693 100644 --- a/_modules/index.html +++ b/_modules/index.html @@ -1,20 +1,21 @@ - + - Overview: module code — pydna 0.0.0.post1+0f15ccd documentation + Overview: module code — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@ diff --git a/_modules/pydna.html b/_modules/pydna.html index e9807d72..e8b6aaad 100644 --- a/_modules/pydna.html +++ b/_modules/pydna.html @@ -1,20 +1,21 @@ - + - pydna — pydna 0.0.0.post1+0f15ccd documentation + pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@ @@ -218,7 +226,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+0f15ccd"
+__version__ = "0.0.0"
 
 
 # create config directory
@@ -372,9 +380,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 +389,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 +401,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 +445,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 +466,7 @@

Source code for pydna

     return _table
- -
@@ -93,9 +101,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 +130,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 +155,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 +163,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 +210,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 3013c4a1..91065c6f 100644 --- a/_modules/pydna/amplify.html +++ b/_modules/pydna/amplify.html @@ -1,20 +1,21 @@ - + - pydna.amplify — pydna 0.0.0.post1+0f15ccd documentation + pydna.amplify — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -193,9 +201,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 +508,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 +603,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 a68f9b1a..cf3d6ef9 100644 --- a/_modules/pydna/assembly.html +++ b/_modules/pydna/assembly.html @@ -1,20 +1,21 @@ - + - pydna.assembly — pydna 0.0.0.post1+0f15ccd documentation + pydna.assembly — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -144,9 +152,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 +574,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 496737c6..4875cb15 100644 --- a/_modules/pydna/common_sub_strings.html +++ b/_modules/pydna/common_sub_strings.html @@ -1,20 +1,21 @@ - + - pydna.common_sub_strings — pydna 0.0.0.post1+0f15ccd documentation + pydna.common_sub_strings — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -383,9 +391,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 +421,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 +470,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 9041f70b..f194bcf1 100644 --- a/_modules/pydna/contig.html +++ b/_modules/pydna/contig.html @@ -1,20 +1,21 @@ - + - pydna.contig — pydna 0.0.0.post1+0f15ccd documentation + pydna.contig — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -75,9 +83,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 +94,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 +118,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 +135,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 +191,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 +311,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/design.html b/_modules/pydna/design.html index f323c45d..e20c66f9 100644 --- a/_modules/pydna/design.html +++ b/_modules/pydna/design.html @@ -1,20 +1,21 @@ - + - pydna.design — pydna 0.0.0.post1+0f15ccd documentation + pydna.design — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -139,9 +147,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 +313,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): """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 @@ -637,9 +640,6 @@

Source code for pydna.design

     maxlink : int, optional
         Maximum length of spacer sequences that may be present in f. These will be included in tails for designed primers.
 
-    circular : bool, optional
-        If True, the assembly is circular. If False, the assembly is linear.
-
     Returns
     -------
     seqs : list of :mod:`pydna.amplicon.Amplicon` and other Dseqrecord like objects :mod:`pydna.amplicon.Amplicon` objects
@@ -697,15 +697,6 @@ 

Source code for pydna.design

     >>>
 
     """
-
-    # Recursive call for circular assemblies
-    if circular:
-        fragments = assembly_fragments(f + f[0:1], overlap=overlap, maxlink=maxlink, circular=False)
-
-        if hasattr(fragments[0], "template"):
-            fragments[0] = _pcr((fragments[-1].forward_primer, fragments[0].reverse_primer), fragments[0].template)
-        return fragments[:-1]
-
     # sanity check for arguments
     nf = [item for item in f if len(item) > maxlink]
     if not all(hasattr(i[0], "template") or hasattr(i[1], "template") for i in zip(nf, nf[1:])):
@@ -827,24 +818,12 @@ 

Source code for pydna.design

     ]
+
[docs]def circular_assembly_fragments(f, overlap=35, maxlink=40): + fragments = assembly_fragments(f + f[0:1], overlap=overlap, maxlink=maxlink) -
-[docs] -def circular_assembly_fragments(f, overlap=35, maxlink=40): - """ - Equivalent to `assembly_fragments` with `circular=True`. - - Deprecated, kept for backward compatibility. Use `assembly_fragments` with `circular=True` instead. - """ - import warnings - - warnings.warn( - "The circular_assembly_fragments function is deprecated. Use assembly_fragments with circular=True instead.", - DeprecationWarning, - stacklevel=2, - ) - return assembly_fragments(f, overlap=overlap, maxlink=maxlink, circular=True)
- + if hasattr(fragments[0], "template"): + fragments[0] = _pcr((fragments[-1].forward_primer, fragments[0].reverse_primer), fragments[0].template) + return fragments[:-1]
if __name__ == "__main__": diff --git a/_modules/pydna/dseq.html b/_modules/pydna/dseq.html index 4ee6672a..aed516b9 100644 --- a/_modules/pydna/dseq.html +++ b/_modules/pydna/dseq.html @@ -1,20 +1,21 @@ - + - pydna.dseq — pydna 0.0.0.post1+0f15ccd documentation + pydna.dseq — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -124,9 +132,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 +468,7 @@

Source code for pydna.dseq

         self.ovhg = ovhg
         self.pos = pos
 
-
-[docs] - @classmethod +
[docs] @classmethod def quick( cls, watson: str, @@ -485,10 +489,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 +509,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 +525,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 +588,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 +607,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 +626,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 +659,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 +691,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 +735,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 +872,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 +900,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 +912,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 +969,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 +1005,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 +1055,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 +1102,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 +1178,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 +1243,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 +1292,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 +1371,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 +1394,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 +1416,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 +1424,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 +1435,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 +1475,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 +1486,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 +1543,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 +1592,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 +1660,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 +1677,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 +1693,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 +1720,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 +1787,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 +1838,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 263c4f44..21edd855 100644 --- a/_modules/pydna/dseqrecord.html +++ b/_modules/pydna/dseqrecord.html @@ -1,20 +1,21 @@ - + - pydna.dseqrecord — pydna 0.0.0.post1+0f15ccd documentation + pydna.dseqrecord — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -119,9 +127,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 +278,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 +311,7 @@

Source code for pydna.dseqrecord

         obj.__dict__.update(kwargs)
         return obj
- -
-[docs] - @classmethod +
[docs] @classmethod def from_SeqRecord( cls, record: _SeqRecord, @@ -335,25 +336,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 +372,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 +418,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 +436,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 +482,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 +517,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 +525,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 +566,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 +679,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 +692,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 +710,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 +758,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 +833,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 +934,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 +952,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 +990,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 +1022,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 +1111,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 +1141,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 +1172,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 +1198,6 @@

Source code for pydna.dseqrecord

                 )
         return features
- def _copy_to_clipboard(self, sequence_format): """docstring.""" from pyperclip import copy @@ -1286,25 +1205,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 +1255,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 +1316,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 +1358,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 +1438,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 a98daf47..3dc727c0 100644 --- a/_modules/pydna/editor.html +++ b/_modules/pydna/editor.html @@ -1,20 +1,21 @@ - + - pydna.editor — pydna 0.0.0.post1+0f15ccd documentation + pydna.editor — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -97,9 +105,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 +136,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 +174,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/gel.html b/_modules/pydna/gel.html index ed1e7448..78304a8a 100644 --- a/_modules/pydna/gel.html +++ b/_modules/pydna/gel.html @@ -1,20 +1,21 @@ - + - pydna.gel — pydna 0.0.0.post1+0f15ccd documentation + pydna.gel — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -82,9 +90,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 +104,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 +167,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 b08cd9a0..ca94ae76 100644 --- a/_modules/pydna/genbank.html +++ b/_modules/pydna/genbank.html @@ -1,20 +1,21 @@ - + - pydna.genbank — pydna 0.0.0.post1+0f15ccd documentation + pydna.genbank — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -96,9 +104,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 +250,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 +303,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 c212d7f1..f3e0f6d9 100644 --- a/_modules/pydna/genbankfile.html +++ b/_modules/pydna/genbankfile.html @@ -1,20 +1,21 @@ - + - pydna.genbankfile — pydna 0.0.0.post1+0f15ccd documentation + pydna.genbankfile — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -76,22 +84,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 +106,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 6510d1be..b7ebf7fb 100644 --- a/_modules/pydna/genbankfixer.html +++ b/_modules/pydna/genbankfixer.html @@ -1,20 +1,21 @@ - + - pydna.genbankfixer — pydna 0.0.0.post1+0f15ccd documentation + pydna.genbankfixer — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -221,9 +229,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 +247,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 +340,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 +358,7 @@

Source code for pydna.genbankfixer

     return newdict
- -
-[docs] -def toJSON(gbkstring): +
[docs]def toJSON(gbkstring): parsed = multipleGB.parseString(gbkstring) jseqlist = [] @@ -416,10 +407,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 +437,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 +448,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 +476,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 +566,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 +649,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 ec64e2be..5b67fe63 100644 --- a/_modules/pydna/genbankrecord.html +++ b/_modules/pydna/genbankrecord.html @@ -1,20 +1,21 @@ - + - pydna.genbankrecord — pydna 0.0.0.post1+0f15ccd documentation + pydna.genbankrecord — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -79,9 +87,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 +108,7 @@

Source code for pydna.genbankrecord

             )
         )
 
-
-[docs] - @classmethod +
[docs] @classmethod def from_string( cls, record: str = "", @@ -136,10 +140,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 +162,6 @@

Source code for pydna.genbankrecord

         )
         return obj
- def __getitem__(self, sl): answer = super().__getitem__(sl) answer.item = self.item @@ -181,9 +181,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 +191,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 +213,7 @@

Source code for pydna.genbankrecord

 
         return _ps(code)
- -
-[docs] - def biopython_code(self): +
[docs] def biopython_code(self): """docstring.""" # FIXME code = ( @@ -244,9 +236,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/myprimers.html b/_modules/pydna/myprimers.html index 919ad0f9..1480c1f6 100644 --- a/_modules/pydna/myprimers.html +++ b/_modules/pydna/myprimers.html @@ -1,20 +1,21 @@ - + - pydna.myprimers — pydna 0.0.0.post1+0f15ccd documentation + pydna.myprimers — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -116,9 +124,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 +194,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 +224,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 +249,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 +270,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 +287,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 ea059e60..8bf11b17 100644 --- a/_modules/pydna/parsers.html +++ b/_modules/pydna/parsers.html @@ -1,20 +1,21 @@ - + - pydna.parsers — pydna 0.0.0.post1+0f15ccd documentation + pydna.parsers — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -116,9 +124,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 +146,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 +201,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 +280,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 09f9c495..d34c5176 100644 --- a/_modules/pydna/primer.html +++ b/_modules/pydna/primer.html @@ -1,20 +1,21 @@ - + - pydna.primer — pydna 0.0.0.post1+0f15ccd documentation + pydna.primer — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -80,9 +88,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 +127,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 410d3b01..1bf7d8a7 100644 --- a/_modules/pydna/readers.html +++ b/_modules/pydna/readers.html @@ -1,20 +1,21 @@ - + - pydna.readers — pydna 0.0.0.post1+0f15ccd documentation + pydna.readers — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -79,9 +87,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 +126,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/seqrecord.html b/_modules/pydna/seqrecord.html index ac045348..2e3f633e 100644 --- a/_modules/pydna/seqrecord.html +++ b/_modules/pydna/seqrecord.html @@ -1,20 +1,21 @@ - + - pydna.seqrecord — pydna 0.0.0.post1+0f15ccd documentation + pydna.seqrecord — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -110,9 +118,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 +147,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 +156,6 @@

Source code for pydna.seqrecord

         sr._fix_attributes()
         return sr
- @property def locus(self): """Alias for name property.""" @@ -194,20 +197,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 +248,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 +297,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 +369,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 +421,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 +441,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 +467,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 +488,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 +496,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 +541,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 +599,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 +621,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 +744,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 +753,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/threading_timer_decorator_exit.html b/_modules/pydna/threading_timer_decorator_exit.html index dd2a36a6..67a7c870 100644 --- a/_modules/pydna/threading_timer_decorator_exit.html +++ b/_modules/pydna/threading_timer_decorator_exit.html @@ -1,20 +1,21 @@ - + - pydna.threading_timer_decorator_exit — pydna 0.0.0.post1+0f15ccd documentation + pydna.threading_timer_decorator_exit — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
diff --git a/_modules/pydna/tm.html b/_modules/pydna/tm.html index a14ee6c9..cb4091db 100644 --- a/_modules/pydna/tm.html +++ b/_modules/pydna/tm.html @@ -1,20 +1,21 @@ - + - pydna.tm — pydna 0.0.0.post1+0f15ccd documentation + pydna.tm — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -94,9 +102,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 +145,7 @@

Source code for pydna.tm

     )
- -
-[docs] -def tm_dbd( +
[docs]def tm_dbd( seq, check=True, strict=True, @@ -185,10 +188,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 +201,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 +216,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 +266,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 +349,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 +360,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 +407,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 +454,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 967e287e..0f209c5d 100644 --- a/_modules/pydna/utils.html +++ b/_modules/pydna/utils.html @@ -1,20 +1,21 @@ - + - pydna.utils — pydna 0.0.0.post1+0f15ccd documentation + pydna.utils — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -111,9 +119,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 +153,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 +199,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 +208,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 +217,6 @@

Source code for pydna.utils

     return new_feature
- # def smallest_rotation(s): # """Smallest rotation of a string. @@ -258,9 +257,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 +278,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 +298,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 +326,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 +339,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 +347,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 +355,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 +400,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 +415,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 +435,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 +495,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 +585,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 +723,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 +755,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 +780,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 +812,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/CHANGELOG.md.txt b/_sources/CHANGELOG.md.txt new file mode 100644 index 00000000..72971cad --- /dev/null +++ b/_sources/CHANGELOG.md.txt @@ -0,0 +1,799 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com), +and this project adheres to [Semantic Versioning](https://semver.org). + + + +## [Unreleased] + +## [6.0.0a01] - 2023-05-04 + +### Added + +New common_sub_strings function. The previous version was implemented in pure python that was quite fast, but still a bottleneck in the code. +Thanks to @louisabraham, we now have code based on [pydivsufsort](https://github.com/louisabraham/pydivsufsort) which provide +bindings to libdivsufsort, a very fast suffix array construction algorithm written in c. As a consequence, the Assembly code is now much faster. + + +Poetry is now used for building pydna. I have removed the setup.py file. I also do not build +Anaconda packages anymore, as conda-build got too slow to work with. I have plans to update the Bioconda recipe for the new version. As pydna is pure Python, anyone can make a conda package using [grayskull](https://github.com/marcelotrevisani/grayskull) for example. + + +### Changed + +Dseq and Dseqrecord now only take a `circular` argument (True or False) to indicate topology. Previously, `linear` was also +accepted. This was a little used feature (by me) that made the __init__ methods of both classes slow and complex. As this +was a violation of zen#13 ("There should be one-- and preferably only one...") This change could break code, +hence the bump of major version number. + + +Code formatting with Black (also suggested by @louisabraham). I now use a git pre-commit hook for this, so formatting should be more standardized. + + +Removed cache for all but download and genbank. Several functions and methods could previously be cached, something that saw very little use. The cache for genbank and download remain as this reduces the load on Genbank servers and also speed things up. + + +Environment variable `pydna_assembly_limit` sets the execution time in seconds (default 10) for +the assemble_linear and assemble_circular methods. There might be a better way to find out if an assembly is likely to take long, usually when there are many paths through the assembly graph. + + + 17:01 $ git log --oneline --graph v5.2.0..a03c2a06a20afef95415f5f1786df2f71e921fd0 + * a03c2a06a2 (HEAD -> dev_bjorn, origin/dev_bjorn) only build on master + * c7ce8582fa uppd action + * ca4c969c28 fix tests and commented out unneeded code + * 6539a1f076 added this as probably needed for a future bioconda package + * c933ca5a7b added this as probably needed for a future bioconda package + * c32fc5c9be fastes dseq init in dsecrecord init + * 70ced77d24 added min_rotation from pydivsufsort + * 2cc4edbc68 (origin/black, black) ws + * 4888db36f3 all black + * 0bf9fbd993 formatted with black precommit hook + * 74e3e1c229 fromatted with black + * f78dcb2fdd uppd poetry.lock + * 769dc98d89 (mergeexp) merge + |\ + | * d242459fc5 (speed_up_Dseqrecord) try to ignore prof dir + | * bef4f6800c (origin/speed_up_Dseqrecord) edit + | * e29ac49f8e prep for adding new dundermethods + | * 2acbc5033c prep for implementing __copy__ and __deepcopy__ methods + | * 9916a62c93 added pstats script + | * 0b41671c1c mod tests + | * 9f060a0dea ignore + | * cbd4773605 added back test for iterable + | * 9b93d8988c removed linear property + | * 798899569a profiling + | * 9b5e7a6c13 added back prof + | * b1a8771323 add back profilig dir + | * ae93cb340f added dep pydivsufsort + | * 6f3f39398a Remover 'linear' method for Dseq and Dseqrecord - passes modified tests + | * 694ea1b5d5 (smallest_rot) new faster common_sub_strings + * | c57f5cb3c5 try fix profining error + * | f82a5676d6 fix test + * | 9d18ed4c03 gitignore + |/ + * 28d8e98fd8 separated doctests + * dacf9e1f3b whitespace + * 6513a0bf85 removed cruft + * c4a0265a12 removed profiling + * 3c11115871 try ignore + * 01999514c2 do not track profiling files + * 6eb2154fff reformatted code + * 4e08cb910d switched to array in smallest_rotation function and fixed a docstring + * 014b40e20d reorganized common_sub_strings + * 190541a51e fix pyproject.toml + * 4c9d27042f added pytest-profiling to env + * 733d83782a added profiling to run_test + * 1db40a1bc7 added experiment files + * 9ac4f4c6f2 added prof + * b867cd2039 removed old file + * 35f8eb03d1 added profiling + * 4b4bafb272 changed badge + * f496be825b url + * a16e7a004d uppdate + * 5190177811 removed python 2 code + * 76a5930791 set timeout from env var pydna_assembly_limit + * 3cf0bba9bc added assembly limit to default env vars + * cd76b4a123 added urls + * f4ef97dbc0 uppdated cheat sheet + * c0f111c67a changed target branch for pull req + * f0385b7981 New timeout for assembly + * 5252df3cf4 switched from wrapt-timeout-decorator + * 5d46b153e6 upd poetry deps + * 436ae27381 removed cython notebook + * ce9a919e15 fix dep + * 2ce61667de fix deps + * 8be47b5463 stuff + * 75ea5dbee1 Merge branch 'dev_bjorn' of https://github.com/BjornFJohansson/pydna into dev_bjorn + |\ + | * 5c2ec77539 Merge pull request #106 from BjornFJohansson/dependabot/pip/coverage-7.2.2 + | |\ + | | * b15fd0cbb4 Bump coverage from 7.2.1 to 7.2.2 + * | | 8e529ff1c7 remove cashing for some functions + |/ / + * / 8dd2ca19a0 bugfix: hardcoded strand set to 1 + |/ + * dacb024944 updated poetry.lock + * a3c3791917 fix + * 74d3850352 Merge pull request #94 from BjornFJohansson/dependabot/pip/ipython-8.10.0 + |\ + | * 66f20aa195 (origin/dependabot/pip/ipython-8.10.0) Bump ipython from 8.9.0 to 8.10.0 + * | 30d109bbb2 Merge pull request #95 from BjornFJohansson/dependabot/pip/biopython-1.81 + |\ \ + | * | bd0ef21a96 Bump biopython from 1.80 to 1.81 + | |/ + * | 879c81ccf7 Merge pull request #96 from BjornFJohansson/dependabot/pip/pyqt5-5.15.9 + |\ \ + | * | 5482b0788f Bump pyqt5 from 5.15.8 to 5.15.9 + | |/ + * | 813ac07394 fix gel image test + * | 63de396a5f fix gel examples + * | 1eb18bc709 new example w gel + |/ + * c6d1fbda8c fix link + * ffda81e24e Merge branch 'master' of https://github.com/BjornFJohansson/pydna + |\ + | * f8896ab27f Update README.md + * | 546f357997 Merge branch 'dev_bjorn' + |\ \ + | |/ + |/| + | * 98b6eaa55f improve example + | * 186dbff025 bugfix for slicing genbankrecords + | * 10e79ccaba fix table + * | c45913bee0 Merge branch 'dev_bjorn' + |\| + | * 593b1f4dfb simplify readme + | * 9800fdf2bb whitespace + | * 9276a054fa start to make a better figure for amplicon + | * 0cb741bf84 better example with pcr + * | a6fda7a276 Merge branch 'dev_bjorn' + |\| + | * c1ec911a22 fix example + | * 5b53ffc9ff fix raw link + * | 77f2121d76 Merge branch 'dev_bjorn' + |/ + * fbcdb0bea4 fix link + * b9ada45f20 (origin/poetry, LouisAbraham/poetry, poetry) new readme + + +## [5.3.0] - 2023-05-04 + +### Added + +### Changed + + 07:26 $ git log --oneline --graph v5.2.0..a16e7a004da1292f33db5a9a48f19c61b415dff6 + * a16e7a004d (HEAD -> dev_bjorn, origin/dev_bjorn) uppdate + * 5190177811 removed python 2 code + * 76a5930791 set timeout from env var pydna_assembly_limit + * 3cf0bba9bc added assembly limit to default env vars + * cd76b4a123 added urls + * f4ef97dbc0 uppdated cheat sheet + * c0f111c67a changed target branch for pull req + * f0385b7981 New timeout for assembly + * 5252df3cf4 switched from wrapt-timeout-decorator + * 5d46b153e6 upd poetry deps + * 436ae27381 removed cython notebook + * ce9a919e15 fix dep + * 2ce61667de fix deps + * 8be47b5463 stuff + * 75ea5dbee1 Merge branch 'dev_bjorn' of https://github.com/BjornFJohansson/pydna into dev_bjorn + |\ + | * 5c2ec77539 Merge pull request #106 from BjornFJohansson/dependabot/pip/coverage-7.2.2 + | |\ + | | * b15fd0cbb4 Bump coverage from 7.2.1 to 7.2.2 + * | | 8e529ff1c7 remove cashing for some functions + |/ / + * / 8dd2ca19a0 bugfix: hardcoded strand set to 1 + |/ + * dacb024944 (origin/master, master) updated poetry.lock + * a3c3791917 fix + * 74d3850352 Merge pull request #94 from BjornFJohansson/dependabot/pip/ipython-8.10.0 + |\ + | * 66f20aa195 (origin/dependabot/pip/ipython-8.10.0) Bump ipython from 8.9.0 to 8.10.0 + * | 30d109bbb2 Merge pull request #95 from BjornFJohansson/dependabot/pip/biopython-1.81 + |\ \ + | * | bd0ef21a96 Bump biopython from 1.80 to 1.81 + | |/ + * | 879c81ccf7 Merge pull request #96 from BjornFJohansson/dependabot/pip/pyqt5-5.15.9 + |\ \ + | * | 5482b0788f Bump pyqt5 from 5.15.8 to 5.15.9 + | |/ + * | 813ac07394 fix gel image test + * | 63de396a5f fix gel examples + * | 1eb18bc709 new example w gel + |/ + * c6d1fbda8c fix link + * ffda81e24e Merge branch 'master' of https://github.com/BjornFJohansson/pydna + |\ + | * f8896ab27f Update README.md + * | 546f357997 Merge branch 'dev_bjorn' + |\ \ + | |/ + |/| + | * 98b6eaa55f improve example + | * 186dbff025 bugfix for slicing genbankrecords + | * 10e79ccaba fix table + * | c45913bee0 Merge branch 'dev_bjorn' + |\| + | * 593b1f4dfb simplify readme + | * 9800fdf2bb whitespace + | * 9276a054fa start to make a better figure for amplicon + | * 0cb741bf84 better example with pcr + * | a6fda7a276 Merge branch 'dev_bjorn' + |\| + | * c1ec911a22 fix example + | * 5b53ffc9ff fix raw link + * | 77f2121d76 Merge branch 'dev_bjorn' + |/ + * fbcdb0bea4 fix link + * b9ada45f20 (origin/poetry, poetry) new readme + (END) + + +## [5.0.1] + +## [5.0.0] + + +## [4.0.0] - 2020-10-10 + +### Added + +- New gel module +- New module myprimers_gdoc for storing primers in a google doc +- New module fakeseq for making DNA ladders. +- New module ladders containing DNA molecular weight markers. + +### Changed + +- Changes to myprimer module. + +## [3.1.3] - 2020-10-10 + +### Added + +- added .sorted_features method for SeqRecord +- added a new lcs (*l*ongest *c*ommon *s*ubstring) method for SeqRecord and DseqRecord + +### Changed + +- changed format for changelog +- biopython 1.78 in requirements.txt +- fix to scripts/check_my_primers.py + +## [3.1.2] - 2020-09-28 + +### Changed + +- Bugfix release. There was a bug in stamping genbank files with cSEGUID. + +## [3.1.1] - 2020-09-25 + +### Changed + +- Bugfix release. There was a bug in locating features in certain circular assemblies. +- Added a test: "test_marker_replacement_on_plasmid" in test_module_assembly.py to test for this. + +## [3.1.0] - 2020-09-16 + +### Changed + +- Changed to src layout for the package. Changed how melting temperature is calculated. +- Changes to tests, added a conftest.py. Updated for comatibility with biopython 1.7.8. +- Removed mysequences.py +- Reformatted code with BLACK +- Use github actions for building and testing + + +## [3.0.2a1] - 2019-07-23 + +### Changed + +- .upper() and .lower() methods for Dseq and Dseqrecord classes. Improved slicing + +## [3.0.1] - 2019-05-28 + +### Changed + +- Many changes and improvements, especially for the Assembly class. + +## [3.0.0] - 2019-05-17 + +### Changed + + --- + +## [2.0.3] - 2017-12-14 + +### Changed + + --- + +## [2.0.3a1] - 2017-12-14 + +### Changed + +- pcr function now takes an amplicon. This way an amplicon can easily be rerun after modification of primers or template + +## [2.0.3a0] - 2017-12-03 + +### Changed + + --- + +## [2.0.2] - 2017-08-26 + +### Changed + + --- + +## [2.0.2] - 2017-08-26 + +### Changed + + --- + +## [2.0.1] - 2017-08-24 + +### Changed + + --- + +## [2.0.0] - 2017-06-23 + +### Changed + +- First release of 2.0.0. This version adds changes in the alpha versions + +## [2.0.0a4] - 2017-05-05 + +### Changed + +-Fixed bug in _multiply_circular + +## [2.0.0a3] - 2017-04-04 + +### Changed + +- added the all module, from pydna.all import *, now imports a set of useful pydna modules into the main namespace. +- Finer control over cache, genbank download is now on by default. Bug fix in assembly_fragments function that created too long primer tails. + +## [2.0.0a2] - --- + +### Changed + + ---- + + +## [2.0.0a1] - + +### Changed + +- removed setting functions for cache in __init_ and the delete_cache function for simplicity +- removed these functions +- pydna.design.print_primer_pair +- pydna.design.cloning_primers +- pydna.design.integration_primers +- pydna.design.assembly_primers + +## [2.0.0a0] - 2017-03-15 + +### Changed + +- alpha release, removed imports in __init__ +- This version breaks compatibility. + +## [1.2.0] - 2017-03-10 + +### Changed + +- New and simpler primer design api, especially for gibson assembly primers. See docstrings +- Dseqrecord.find method that allows finding subsequences "over the edge" of circular sequences. + +## [1.1.5] - 2016-12-16 + +### Changed + +- added message for Dseqrecord write + +## [1.1.4] - 2016-12-15 + +### Changed + +- split some files into more logical and smaller chunks. +- The Primer class is now the same in primer design and amplify modules +- less modules are imported in __init__.py +- pydna.getcache returns the pydna_cache environment variable +- pydna.cached sets pydna_cache to "cached" +- pydna.nocache sets pydna_cache to "nocache" +- pydna.refresh sets pydna_cache to "refresh" +- Many of the Classes have new __repr__ methods compatible with the Jupyter notebook. +- One Jupyter notebook is now run as a part of the test suite using pytest/nbval +- pydna.parse_primers now return a list of Primer class objects +- pydna.read_primer now a Primer class object +- pydna.read_url and pydna.parse_url removed, since they are too risky. +- it is better to use pydna.download_text in combination with read or parse. this way, the intermediate text can be inspected and genbankfixer can be applied if necessary + +## [1.1.1] - 2016-11-20 + +### Changed + +- New module genbankfixer for salvaging broken genbank files (pydna.gbtext_clean). +- New pydna.readprimer function (shortcut for reading to Biopython.SeqRecord). +- Tests merged to pytest. +- read_url function +- parse_url function +- download_text function +- New key function for cache of Assemblies. + +## [1.0.2] - 2016-10-08 + +### Changed + +- Python 3 only! +- pydna.open_cache -> pydna.open_cache_folder; opens the cache folder in the file browser +- logging level is not "info" + added the possiblity to specify a text file containing primers and + a path to the ApE plasmid editor (http://biologylabs.utah.edu/jorgensen/wayned/ape/) + These settings can be made in the pydna.ini file that is located in the + "user_config_dir" specified on each platform by the appdirs module. + on linux it is in ~/.config/pydna +- Bugfix: invisible gel bands in the gel module. + +## [1.0.1] - 2016-03-10 + +### Changed + +- Bugfix: for errors in IPython import if IPython is too old ( < 4.0) +- Bugfix: Large genbank records were not downloaded completely. + +## [1.0.0] - - + +### Changed + +- Gel simulation added + +## [0.9.3] - 2015-06-03 + +### Changed + +- Shelve does not work under MacOS under certain conditions. +- This release tries to solve this by not specifying file extensions + for the cache files. Two functions are added, pydna. + +## [0.9.2] - 2015-05-28 + +### Changed + +- pydna_data_dir is encoded to a string in __init__.py instead of + unicode. The Popen module does not accept environment variables that + are not strings. + +## [0.9.1] - 2015-05-26 + +### Changed + +- fixed critical error in the calculation of seguid and cseguid + checksums + +## [0.9.0] - 2015-05-26 + +### Changed + +- seguid and cseguid are now url safe so they can be part of urls and + file names. +- Dseqrecord.locus is an alias of Dseqrecord.name +- Dseqrecord.accession is an alias of Dseqrecord.id +- Dseqrecord.definition is an alias of Dseqrecord.description +- changed how circular assembly products are identified to use cseguid. +- removed proxy handling when proxy not set in download module. +- added CHANGELOG.md, currently empty. +- environment variable datadir is now pydna_data_dir. +- removed environmental variable pydna_dna_dir. +- if Dseqrecord is initiated with a name property that is longer than + 16 characters, it is truncated to 16 chars and a warning is issued. +- Default Dseqrecord name property is "na". +- Default Dseqrecord id property is "-". +- Default Dseqrecord description property is "@". +- Dseqrecord __eq__ and __ne__ methods defined. +- Dseqrecord.write now overwrites an old sequence with the same +- filename if the primary sequence is the same. +- Dseqrecord.read now only looks in current working directory. +- fixed ipynb_import test code. + +## [0.8.4] - 2015-04-17 + +### Changed + +- Bugfix for parsing text files with unicode characters. +## [0.8.3] - - + +### Changed + + - +## [0.8.2] - - + +### Changed + + - +## [0.8.1] - 2015-03-07 + +### Changed + +- Bugfix for windows. The data directory was not created. + +## [0.8.0] - 2015-02-06 + +### Changed + +- Mapping reads added. + +## [0.7.2] - 2014-11-21 + +### Changed + +- First public release with the changes from 0.7.0 and 0.7.1. +- Added a Pretty_str class to beautify output of strings in + the IPython shell. + +## [0.7.1] - notpublic + +### Changed + +- Short linkers can be incorporated in PCR primers in the + assembly_primers function. + +## [0.7.0] - notpublic + +### Changed + +- Caching to speed up Amplify, Assembly, download and the +- Desqrecord synced method. The data is stored in four shelf + files in the users application directory. + +- amplify.shelf +- assembly.shelf +- genbank.shelf +- synced.shelf + +- The location is os specific. +- See the documentation of appdirs https://pypi.python.org/pypi/appdirs/1.4.0 + +## [0.6.6] - + +### Changed + +- new function nopcr. + +## [0.6.5] - 2014-07-31 + +### Changed + +- bugfix: cutting an amplicon object now preserves features +- Changed requirement for NetworkX to 1.8.1 + +## [0.6.4] - 2014-07-09 + +### Changed + +- The pcr function and Anneal class can now deal with primers + with ambiguous codons like R = A or G. In the resulting PCR + product, the ambiguous nucleotides are preserved in the tails + i.e. the primer part not annealing. The annealing part will + have the sequence corresponding to the template. + +## [0.6.3] - 2014-07-06 + +### Changed + +- Dseqrecord.add_feature can now take a string or some other + sequence as input. The assembly primers function can now produce + primers for a circular assembly. + +## [0.6.2] - 2014-06-13 + +### Changed + +- Dseqrecord gained three new methods: + +- isorf() method returning True or False. + +- List_features() method returns a list of all features as a + formatted ASCII table. + +- Extract_feature() extracts a feature in the form os a new + Dseqrecord object. + +- Changes to how the primer_design functions work, especially + assembly primers. + +## [0.6.1] - 2014-04-25 + +### Changed + +- Fixed a bug in the Dseqrecord synced method and removed the + utils synced function. + +## [0.6.0] - 2014-04-18 + +### Changed + +- Bugfixes and improvements in documentation. + +## [0.5.0] - 2013-12-16 + +### Changed + +- Changes to how the amplify and assembly modules work + the Amplicon and Assembly classes are now subclasses of + Dseqrecord. + +## [0.2.2] - 2013-11-05 + +### Changed + +- bugfix: changed the handling of compound features + to fit with the new version of BioPython (1.62) which is + now a requirement. + +## [0.2.1] - 2013-08-18 + +### Changed + + --- + +## [0.1.8] - 2013-06-02 + +### Changed + +- bugfix: changed the SeqFeatures added to PCR products in the +- amplify module to a dict of list of strings instead of + a dict of strings. + +## [0.1.7] - 2013-05-29 + +### Changed + +- Changed the code in amplify.Amplicon to handle features + spanning the origin of circular sequences. + +## [0.1.6] - 2013-04-22 + +### Changed + +- Changed the behaviour of the find method of the Dseq object + to find substrings that span the origin. Slicing for circular + Dseq objects now works slightly different. + +## [0.1.5] - 2013-04-18 + +### Changed + +- Changed the setup.py script to permit installation + of the source installer without access to a c compiler. + +## [0.1.4] - 2013-04-10 + +### Changed + +- Cleaned up some docstrings +- Renamed Drecord -> Dseqrecord to be more consistent with +- Dseq and Biopython Seq/SeqRecord. + +- Changed name of keyword argument for read and parse. +- ds=True returns Dseqrecord(s) while ds=False returns SeqRecords. + +## [0.1.3] - 2013-04-09 + +### Changed + +- pydna created from Python-dna. + +[unreleased]: https://github.com/BjornFJohansson/pydna/compare/HEAD..3.1.3 +[3.1.3]: https://github.com/BjornFJohansson/pydna/compare/3.1.3..3.1.2 +[3.1.2]: https://github.com/BjornFJohansson/pydna/compare/3.1.2..3.1.1 +[3.1.1]: https://github.com/BjornFJohansson/pydna/compare/3.1.1..3.1.0a1 +[3.1.0a1]: https://github.com/BjornFJohansson/pydna/compare/3.1.0a1..3.1.0a0 +[3.1.0a0]: https://github.com/BjornFJohansson/pydna/compare/3.1.0a0..3.1.0 +[3.1.0]: https://github.com/BjornFJohansson/pydna/compare/3.1.0..3.0.2a5 +[3.0.2a5]: https://github.com/BjornFJohansson/pydna/compare/3.0.2a5..3.0.2a4 +[3.0.2a4]: https://github.com/BjornFJohansson/pydna/compare/3.0.2a4..3.0.2a3 +[3.0.2a3]: https://github.com/BjornFJohansson/pydna/compare/3.0.2a3..3.0.2a2 +[3.0.2a2]: https://github.com/BjornFJohansson/pydna/compare/3.0.2a2..3.0.2a1 +[3.0.2a1]: https://github.com/BjornFJohansson/pydna/compare/3.0.2a1..3.0.2 +[3.0.2]: https://github.com/BjornFJohansson/pydna/compare/3.0.2..3.0.1 +[3.0.1]: https://github.com/BjornFJohansson/pydna/compare/3.0.1..3.0.0a9 +[3.0.0a9]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a9..3.0.0a8 +[3.0.0a8]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a8..3.0.0a7 +[3.0.0a7]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a7..3.0.0a6 +[3.0.0a6]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a6..3.0.0a5 +[3.0.0a5]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a5..3.0.0a46 +[3.0.0a46]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a46..3.0.0a45 +[3.0.0a45]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a45..3.0.0a44 +[3.0.0a44]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a44..3.0.0a43 +[3.0.0a43]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a43..3.0.0a42 +[3.0.0a42]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a42..3.0.0a41 +[3.0.0a41]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a41..3.0.0a40 +[3.0.0a40]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a40..3.0.0a4 +[3.0.0a4]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a4..3.0.0a39 +[3.0.0a39]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a39..3.0.0a38 +[3.0.0a38]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a38..3.0.0a37 +[3.0.0a37]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a37..3.0.0a36 +[3.0.0a36]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a36..3.0.0a35 +[3.0.0a35]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a35..3.0.0a32 +[3.0.0a32]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a32..3.0.0a31 +[3.0.0a31]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a31..3.0.0a30 +[3.0.0a30]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a30..3.0.0a3 +[3.0.0a3]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a3..3.0.0a29 +[3.0.0a29]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a29..3.0.0a28 +[3.0.0a28]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a28..3.0.0a27 +[3.0.0a27]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a27..3.0.0a26 +[3.0.0a26]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a26..3.0.0a25 +[3.0.0a25]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a25..3.0.0a24 +[3.0.0a24]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a24..3.0.0a23 +[3.0.0a23]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a23..3.0.0a22 +[3.0.0a22]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a22..3.0.0a21 +[3.0.0a21]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a21..3.0.0a20 +[3.0.0a20]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a20..3.0.0a2 +[3.0.0a2]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a2..3.0.0a19 +[3.0.0a19]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a19..3.0.0a18 +[3.0.0a18]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a18..3.0.0a17 +[3.0.0a17]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a17..3.0.0a16 +[3.0.0a16]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a16..3.0.0a15 +[3.0.0a15]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a15..3.0.0a14 +[3.0.0a14]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a14..3.0.0a13 +[3.0.0a13]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a13..3.0.0a12 +[3.0.0a12]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a12..3.0.0a11 +[3.0.0a11]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a11..3.0.0a10 +[3.0.0a10]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a10..3.0.0a1 +[3.0.0a1]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a1..3.0.0a0 +[3.0.0a0]: https://github.com/BjornFJohansson/pydna/compare/3.0.0a0..3.0.0 +[3.0.0]: https://github.com/BjornFJohansson/pydna/compare/3.0.0..2.0.4a5 +[2.0.4a5]: https://github.com/BjornFJohansson/pydna/compare/2.0.4a5..2.0.4a4 +[2.0.4a4]: https://github.com/BjornFJohansson/pydna/compare/2.0.4a4..2.0.4a3 +[2.0.4a3]: https://github.com/BjornFJohansson/pydna/compare/2.0.4a3..2.0.4a2 +[2.0.4a2]: https://github.com/BjornFJohansson/pydna/compare/2.0.4a2..2.0.4a1 +[2.0.4a1]: https://github.com/BjornFJohansson/pydna/compare/2.0.4a1..2.0.4a0 +[2.0.4a0]: https://github.com/BjornFJohansson/pydna/compare/2.0.4a0..2.0.3a0 +[2.0.3a0]: https://github.com/BjornFJohansson/pydna/compare/2.0.3a0..2.0.3 +[2.0.3]: https://github.com/BjornFJohansson/pydna/compare/2.0.3..2.0.2a0 +[2.0.2a0]: https://github.com/BjornFJohansson/pydna/compare/2.0.2a0..2.0.2 +[2.0.2]: https://github.com/BjornFJohansson/pydna/compare/2.0.2..2.0.1 +[2.0.1]: https://github.com/BjornFJohansson/pydna/compare/2.0.1..2.0.0a8 +[2.0.0a8]: https://github.com/BjornFJohansson/pydna/compare/2.0.0a8..2.0.0a7 +[2.0.0a7]: https://github.com/BjornFJohansson/pydna/compare/2.0.0a7..2.0.0a6 +[2.0.0a6]: https://github.com/BjornFJohansson/pydna/compare/2.0.0a6..2.0.0a5 +[2.0.0a5]: https://github.com/BjornFJohansson/pydna/compare/2.0.0a5..2.0.0a4 +[2.0.0a4]: https://github.com/BjornFJohansson/pydna/compare/2.0.0a4..2.0.0a3 +[2.0.0a3]: https://github.com/BjornFJohansson/pydna/compare/2.0.0a3..2.0.0a2 +[2.0.0a2]: https://github.com/BjornFJohansson/pydna/compare/2.0.0a2..2.0.0a0 +[2.0.0a0]: https://github.com/BjornFJohansson/pydna/compare/2.0.0a0..2.0.0 +[2.0.0]: https://github.com/BjornFJohansson/pydna/compare/2.0.0..1.2.0a1 +[1.2.0a1]: https://github.com/BjornFJohansson/pydna/compare/1.2.0a1..1.2.0a0 +[1.2.0a0]: https://github.com/BjornFJohansson/pydna/compare/1.2.0a0..1.2.0 +[1.2.0]: https://github.com/BjornFJohansson/pydna/compare/1.2.0..1.1.6a4 +[1.1.6a4]: https://github.com/BjornFJohansson/pydna/compare/1.1.6a4..1.1.5 +[1.1.5]: https://github.com/BjornFJohansson/pydna/compare/1.1.5..1.1.4 +[1.1.4]: https://github.com/BjornFJohansson/pydna/compare/1.1.4..1.1.1 +[1.1.1]: https://github.com/BjornFJohansson/pydna/compare/1.1.1..1.0.2 +[1.0.2]: https://github.com/BjornFJohansson/pydna/compare/1.0.2..1.0.1 +[1.0.1]: https://github.com/BjornFJohansson/pydna/compare/1.0.1..1.0.0 +[1.0.0]: https://github.com/BjornFJohansson/pydna/compare/1.0.0..0.9.9 +[0.9.9]: https://github.com/BjornFJohansson/pydna/compare/0.9.9..0.9.8 +[0.9.8]: https://github.com/BjornFJohansson/pydna/compare/0.9.8..0.9.7 +[0.9.7]: https://github.com/BjornFJohansson/pydna/compare/0.9.7..0.9.6 +[0.9.6]: https://github.com/BjornFJohansson/pydna/compare/0.9.6..0.9.5 +[0.9.5]: https://github.com/BjornFJohansson/pydna/compare/0.9.5..0.9.4 +[0.9.4]: https://github.com/BjornFJohansson/pydna/compare/0.9.4..0.9.3 +[0.9.3]: https://github.com/BjornFJohansson/pydna/compare/0.9.3..0.9.2 +[0.9.2]: https://github.com/BjornFJohansson/pydna/compare/0.9.2..0.9.1 +[0.9.1]: https://github.com/BjornFJohansson/pydna/compare/0.9.1..0.9.0 +[0.9.0]: https://github.com/BjornFJohansson/pydna/compare/0.9.0..0.8.4 +[0.8.4]: https://github.com/BjornFJohansson/pydna/compare/0.8.4..0.8.3 +[0.8.3]: https://github.com/BjornFJohansson/pydna/compare/0.8.3..0.8.2 +[0.8.2]: https://github.com/BjornFJohansson/pydna/compare/0.8.2..0.8.1 +[0.8.1]: https://github.com/BjornFJohansson/pydna/compare/0.8.1..0.8.0 diff --git a/_sources/example_gallery.md.txt b/_sources/example_gallery.md.txt new file mode 100644 index 00000000..54cc1ebf --- /dev/null +++ b/_sources/example_gallery.md.txt @@ -0,0 +1,5 @@ +# Example gallery + +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. diff --git a/_sources/getting_started.md.txt b/_sources/getting_started.md.txt new file mode 100644 index 00000000..c1d8bc51 --- /dev/null +++ b/_sources/getting_started.md.txt @@ -0,0 +1,15 @@ +# Getting started + + +The best way to get started is to follow our tutorial notebooks, you can find them in the +repository folder [docs/notebooks](https://github.com/BjornFJohansson/pydna/tree/main/docs/notebooks) and +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: + +1. [Dseq](./markdown_notebooks/Dseq.md): Basic introduction to how sequences are handled in pydna. + +etc. diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt index 274878a0..d05943d8 100644 --- a/_sources/index.rst.txt +++ b/_sources/index.rst.txt @@ -1,205 +1,31 @@ -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: (https://github.com/BjornFJohansson/pydna/stargazers) | + :end-before: ## Acknowledgement +.. toctree:: + :caption: Contents: + :maxdepth: 1 + :hidden: + self + installation + module_contents + 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 new file mode 100644 index 00000000..98ee149e --- /dev/null +++ b/_sources/installation.rst.txt @@ -0,0 +1,7 @@ +Installation +============ + +.. include:: ../README.md + :parser: myst_parser.sphinx_ + :start-after: ## Installation 📦 + :end-before: ## Contributing and feedback 🛠️ diff --git a/_sources/markdown_notebooks/CRISPR.md.txt b/_sources/markdown_notebooks/CRISPR.md.txt new file mode 100644 index 00000000..b1e6acd1 --- /dev/null +++ b/_sources/markdown_notebooks/CRISPR.md.txt @@ -0,0 +1,77 @@ +# How to Model CRISPR-Cas9 Experiments in pydna + +> Visit the full library documentation [here](https://bjornfjohansson.github.io/pydna/) + +The pydna package can simulate CRISPR-Cas9 editing, which allows one to cut DNA sequences at specific sites using guide RNAs (gRNAs) that direct the Cas9 protein. This page will guide you through the process of using the `pydna.crispr` module to model a CRISPR-Cas9 cut on a DNA sequence. + +The `pydna.crispr` module contains the `cas9` class to simulate the biological activites of the Cas9 protein and the guideRNA, which should be imported. In addtion, the `Dseqrecord` class has also been imported to generate an example target_sequence. + + + Open In Colab + + + +```python +# Install pydna (only when running on Colab) +import sys +if 'google.colab' in sys.modules: + %%capture + # Install the current development version of pydna (comment to install pip version) + !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn + # Install pip version instead (uncomment to install) + # !pip install pydna + +``` + + +```python +from pydna.crispr import cas9, protospacer +from pydna.dseqrecord import Dseqrecord +``` + +The target sequence and guideRNA (gRNA) sequence needs to be generated. Note the the sequence can be passed as a `Dseqrecord` object. + + +```python +from pydna.dseqrecord import Dseqrecord +from pydna.crispr import cas9, protospacer + +# <----protospacer---><-------scaffold-----------------> +guide = "GTTACTTTACCCGACGTCCCgttttagagctagaaatagcaagttaaaataagg" +target = "GTTACTTTACCCGACGTCCCaGG" +# <-> +# PAM + +# Create an enzyme object with the protospacer +enzyme = cas9("GTTACTTTACCCGACGTCCC") + +target_dseq = Dseqrecord(target) + +# Cut using the enzyme +print('cutting with enzyme 1:', target_dseq.cut(enzyme)) + + +# Get the protospacer from the full gRNA sequence +gRNA_protospacers = protospacer(Dseqrecord(guide), cas=cas9) +# Print the protospacer (it's a list because often plasmids contain multiple gRNAs) +print('protospacer:', gRNA_protospacers[0]) +gRNA_protospacer = gRNA_protospacers[0] + +# Create an enzyme from the protospacer +enzyme2 = cas9(gRNA_protospacer) + +# Simulate the cut +print('cutting with enzyme 2:', target_dseq.cut(enzyme2)) + + +# Note that without the PAM, the cut will not be made. + +target_noPAM_dseq = Dseqrecord("GTTACTTTACCCGACGTCCCaaa") +print("cutting with no PAM in target:", target_noPAM_dseq.cut(enzyme2)) +``` + + cutting with enzyme 1: (Dseqrecord(-17), Dseqrecord(-6)) + protospacer: GTTACTTTACCCGACGTCCC + cutting with enzyme 2: (Dseqrecord(-17), Dseqrecord(-6)) + cutting with no PAM in target: () + diff --git a/_sources/markdown_notebooks/Dseq.md.txt b/_sources/markdown_notebooks/Dseq.md.txt new file mode 100644 index 00000000..9e74293e --- /dev/null +++ b/_sources/markdown_notebooks/Dseq.md.txt @@ -0,0 +1,465 @@ +# Representing sequences in pydna +> Visit the full library documentation [here](https://bjornfjohansson.github.io/pydna/) + + + Open In Colab + + + +```python +# Install pydna (only when running on Colab) +import sys +if 'google.colab' in sys.modules: + %%capture + # Install the current development version of pydna (comment to install pip version) + !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn + # Install pip version instead (uncomment to install) + # !pip install pydna + +``` + +Pydna contains classes to represent double stranded DNA sequences that can: + +* Be linear +* Be circular +* Contain overhangs (sticky ends). + +These sequences can be used to simulate molecular biology methods such as cloning and PCR. The main classes used to represent sequences are `Dseq` and `Dseqrecord`. +* `Dseq` represents the sequence only. Think of it as a FASTA file. +* `Dseqrecord` can contain sequence features and other info such as publication, authors, etc. Think of it as a Genbank file. + +> NOTE: The `Dseq` class is a subclass of biopython's `Seq`, whose documentation can be found [here](https://biopython.org/wiki/Seq). `Dseqrecord` is a subclass of biopython's `SeqRecord`, whose documentation can be found [here](https://biopython.org/wiki/SeqRecord). + + +## Dseq Class + +We can create a `Dseq` object in different ways. + +For a linear sequence without overhangs, we create a `Dseq` object passing a string with the sequence. For example: + + +```python +from pydna.dseq import Dseq +my_seq = Dseq("aatat") +my_seq +``` + + + + + Dseq(-5) + aatat + ttata + + + +In the console representation above, there are three lines: +1. `Dseq(-5)` indicates that the sequence is linear and has 5 basepairs. +2. `aatat`, the top / sense / watson strand, referred from now on as **watson** strand.. +3. `ttata`, the bottom / anti-sense / crick strand, referred from now on as **crick** strand. + +Now, let's create a circular sequence: + + +```python +my_seq = Dseq("aatat", circular=True) +my_seq +``` + + + + + Dseq(o5) + aatat + ttata + + + +> Note how `o5` indicates that the sequence is circular and has 5 basepairs. + +One way to represent a linear sequence with overhangs is to instantiate `Dseq` with the following arguments: +* The `watson` strand as a string in the 5'-3' direction. +* The `crick` strand as a string in the 5'-3' direction. +* The 5' overhang `ovhg` (overhang), which can be positive or negative, and represents the number of basepairs that the `watson` strand extends beyond the `crick` strand. + + +```python +Dseq("actag", "ctag", -1) +``` + + + + + Dseq(-5) + actag + gatc + + + +> Note how the bottom strand is passed in the 5'-3' direction, but it is represented in the 3'-5' direction in the console output. + +If you omit the `ovhg` argument, pydna will try to find the value that makes the `watson` and `crick` strands complementary. + + +```python +Dseq("actag", "ctag") +``` + + + + + Dseq(-5) + actag + gatc + + + +The best way to get a feeling for the meaning of `ovhg` is to visualise the possible scenarios as such: + +``` +dsDNA overhang + + nnn... 2 +nnnnn... + + nnnn... 1 +nnnnn... + +nnnnn... 0 +nnnnn... + +nnnnn... -1 + nnnn... + +nnnnn... -2 + nnn... +``` + +Of note, the DNA sequence can be passed in both lower case and upper case, and are not restricted to the conventional ATCG nucleotides (E.g ), The class supports the IUPAC ambiguous nucleotide code. + + +```python +Dseq("Actag", "Ctag", -1) +``` + + + + + Dseq(-5) + Actag + gatC + + + +Another way to pass the overhangs is to use the `from_full_sequence_and_overhangs` classmethod, which only needs the `watson`/sense strand. This is useful you can only store the entire sequence (e.g. in a FASTA file), or if you want to specify overhangs on both sides of the double stranded DNA when you create the object. + +Both the `watson_ovhg` and `crick_ovhg` can be passed following the same rules as above. Specifically, the `crick_ovhg` argument is identical to the conventional `ovhg` argument. The `watson_ovhg` argument is the `ovhg` argument applied to the reverse complementary sequence. + + +```python +my_seq = Dseq.from_full_sequence_and_overhangs("aaattaaa", crick_ovhg=-3, watson_ovhg=-2) +my_seq +``` + + + + + Dseq(-8) + aaatta + aattt + + + +A list of possible scenarios, applying positive and negative `crick_ovhg` and `watson_ovhg` to a `Dseq` object are visualised in the output of the code below: + + +```python +for crick_ovhg in [-2, 2]: + for watson_ovhg in [-3, 3]: + print("watson_ovhg is " + str(watson_ovhg) + ", crick_ovhg is " + str(crick_ovhg)) + my_seq = Dseq.from_full_sequence_and_overhangs("aaattaaa", crick_ovhg, watson_ovhg) + print(my_seq.__repr__() + "\n") +``` + + watson_ovhg is -3, crick_ovhg is -2 + Dseq(-8) + aaatt + taattt + + watson_ovhg is 3, crick_ovhg is -2 + Dseq(-8) + aaattaaa + taa + + watson_ovhg is -3, crick_ovhg is 2 + Dseq(-8) + att + tttaattt + + watson_ovhg is 3, crick_ovhg is 2 + Dseq(-8) + attaaa + tttaa + + + +The drawing below can help visualize the meaning of the overhangs. +``` + (-3)--(-2)--(-1)--(x)--(x)--(x)--(-1)--(-2) + +5'( a)--( a)--( a)--(t)--(t)--(a)--( a)--( a)3' +3'( a)--( a)--( a)--(t)--(t)--(a)--( a)--( a)5' + +5'( a)--( a)--( a)--(t)--(t)--(a)--( )--( )3' +3'( )--( )--( )--(t)--(t)--(a)--( a)--( a)5' +``` + +If you would like to check the overhangs for a `Dseq` object, it can be done by calling the methods `five_prime_end` and `three_prime_end` to show the 5' and 3' overhangs, respectively. An example of a `Dseq` object, and examples showing what the print-out of the methods looks like are demonstrated here: + + +```python +my_seq = Dseq("aatat", "ttata", ovhg=-2) +print(my_seq.__repr__()) +print(my_seq.five_prime_end()) +print(my_seq.three_prime_end()) +``` + + Dseq(-7) + aatat + atatt + ("5'", 'aa') + ("5'", 'tt') + + +If you now want to join your sequence's sticky ends to make a circular sequence (i.e Plasmid), you can use the `looped` method. The sticky ends must be compatible to do so. + + + +```python +my_seq = Dseq("aatat", "ttata", ovhg=-2) +my_seq.looped() +``` + + + + + Dseq(o5) + aatat + ttata + + + +If you want to change the circular origin of the sequence/plasmid, this can be easily done using the `shifted` method. This can be done by providing the number of bases between the original origin with the new origin: + + +```python +my_seq = Dseq("aatat", circular=True) +my_seq.shifted(2) +``` + + + + + Dseq(o5) + tataa + atatt + + + +## __getitem__, __repr__, and __str__ methods + + +### Slicing sequences (`__getitem__`) + +`__getitem__` is the method that is called when you use the square brackets `[]` after a python object. Below is an example of the builtin python `list`: + + +```python +my_list = [1, 2, 3] + +print('using square brackets:', my_list[1:]) +print('is the same as using __getitem__:', my_list.__getitem__(slice(1, None))) +``` + + using square brackets: [2, 3] + is the same as using __getitem__: [2, 3] + + +The `__getitem__` method is modified in pydna to deal with `Dseq` objects and returns a slice of the `Dseq` object, defined by the a start value and a stop value, similarly to string indexing. In other words, `__getitem__` indexes `Dseq`. Note that '__getitem__' (and, consequently, `[]`) uses zero-based indexing. + + +```python +my_seq = Dseq("aatataa") +my_seq[2:5] + +``` + + + + + Dseq(-3) + tat + ata + + + +`__getitem__` respects overhangs. + + +```python +my_seq = Dseq.from_full_sequence_and_overhangs("aatataa", crick_ovhg=0, watson_ovhg=-1) +my_seq[2:] +``` + + + + + Dseq(-5) + tata + atatt + + + +Note that index zero corresponds to the leftmost base of the sequence, which might not necessarily be on the `watson` strand. Let's create a sequence that has an overhang on the left side. + + +```python +sequence_with_overhangs = Dseq.from_full_sequence_and_overhangs("aatacgttcc", crick_ovhg=3, watson_ovhg=0) +sequence_with_overhangs +``` + + + + + Dseq(-10) + acgttcc + ttatgcaagg + + + +When we index starting from `2`, we don't start counting on the watson, but on the crick strand since it is the leftmost one. + + +```python +sequence_with_overhangs[2:] +``` + + + + + Dseq(-8) + acgt + atgcaagg + + + +#### Slicing circular sequences +When slicing circular `Dseq` objects we get linear sequences. + + +```python +circular_seq = Dseq("aatctaa", circular=True) +circular_seq[1:5] +``` + + + + + Dseq(-4) + atct + taga + + + +We can slice circular sequences across the origin (where index is zero) if the first index is bigger than the second index. This is demonstrated in the example below: + + +```python +circular_seq[5:2] +``` + + + + + Dseq(-4) + aaaa + tttt + + + +### Printing sequences to the console: `__repr__` and `__str__` + +`__repr__` and `__str__` are methods present in all python classes that return a string representation of an object. `__str__` is called by the `print` function, and `__repr__` is used by the console or notebook output when the object is not assigned to a variable. Below is an example with a `date` object: + + +```python +import datetime + +my_date = datetime.date(2023, 8, 15) + +print('> print statement:', my_date) +print('> repr:', repr(my_date)) +print('> repr from class method:', my_date.__repr__()) + +print() +print('> console output:') +my_date +``` + + > print statement: 2023-08-15 + > repr: datetime.date(2023, 8, 15) + > repr from class method: datetime.date(2023, 8, 15) + + > console output: + + + + + + datetime.date(2023, 8, 15) + + + +In a similar way, `__repr__` and `__str__` methods are used by pydna to represent sequences as strings for different purposes: + +* `__repr__` is used to make a figure-like representation that shows both strands and the overhangs. +* `__str__` is used to return the entire sequence as a string of characters (from the left-most to the right-most base of both strands), the way we would store it in a FASTA file. + + + +```python +my_seq = Dseq.from_full_sequence_and_overhangs("aaattaaa", crick_ovhg=-3, watson_ovhg=-2) +print('> figure-like representation:\n', my_seq.__repr__()) +print() +print('> string representation:\n', my_seq) + +``` + + > figure-like representation: + Dseq(-8) + aaatta + aattt + + > string representation: + aaattaaa + + +Note that on the string representation, the bases correspond to the entire sequence provided, even when they are only present on either the `watson` or `crick` strand. In the example above, the last two `aa` bases are missing from the `watson` strand, and that only the `crick` strand has them. + +## Edge cases + +You can create arbitrary double-stranded sequences that are not complementary if you specify both strands and an overhang, but you won't be able to use them for molecular biology simulations. For example: + + +```python +Dseq("xxxx", "atat", ovhg=2) +``` + + + + + Dseq(-6) + xxxx + tata + + diff --git a/_sources/markdown_notebooks/Dseq_Features.md.txt b/_sources/markdown_notebooks/Dseq_Features.md.txt new file mode 100644 index 00000000..cc09c685 --- /dev/null +++ b/_sources/markdown_notebooks/Dseq_Features.md.txt @@ -0,0 +1,601 @@ +# Working with Features using the Dseqrecord class + +> Before working with features, check how to import sequences from files in the [Importing_Seqs notebook](./Importing_Seqs.ipynb). +> +> For full library documentation, visit [here](https://bjornfjohansson.github.io/pydna/). + +Some sequence file formats (like Genbank) include features, describing key biological properties of sequence regions. In Genbank, features "include genes, gene products, as well as regions of biological significance reported in the sequence." (See [here](https://www.ncbi.nlm.nih.gov/genbank/samplerecord/) for a description of a Genbank file and associated terminologies/annotations) Examples include coding sequences (CDS), introns, promoters, etc. + +pydna offers many ways to easily view, add, extract, and write features into a Genbank file via the `Dseqrecord` class. After reading a file into a `Dseqrecord` object, we can check out the list of features in the record using the following code. This example uses the sample record [U49845](https://www.ncbi.nlm.nih.gov/genbank/samplerecord/). + + + Open In Colab + + + +```python +# Install pydna (only when running on Colab) +import sys +if 'google.colab' in sys.modules: + %%capture + # Install the current development version of pydna (comment to install pip version) + !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn + # Install pip version instead (uncomment to install) + # !pip install pydna + +``` + + +```python +from pydna.dseqrecord import Dseqrecord +from pydna.parsers import parse + +#Import your file into python. +file_path = "./U49845.gb" +records = parse(file_path) +sample_record = records[0] + +# List all features +for feature in sample_record.features: + print(feature) +``` + + type: source + location: [0:5028](+) + qualifiers: + Key: chromosome, Value: ['IX'] + Key: db_xref, Value: ['taxon:4932'] + Key: mol_type, Value: ['genomic DNA'] + Key: organism, Value: ['Saccharomyces cerevisiae'] + + type: mRNA + location: [<0:>206](+) + qualifiers: + Key: product, Value: ['TCP1-beta'] + + type: CDS + location: [<0:206](+) + qualifiers: + Key: codon_start, Value: ['3'] + Key: product, Value: ['TCP1-beta'] + Key: protein_id, Value: ['AAA98665.1'] + Key: translation, Value: ['SSIYNGISTSGLDLNNGTIADMRQLGIVESYKLKRAVVSSASEAAEVLLRVDNIIRARPRTANRQHM'] + + type: gene + location: [<686:>3158](+) + qualifiers: + Key: gene, Value: ['AXL2'] + + type: mRNA + location: [<686:>3158](+) + qualifiers: + Key: gene, Value: ['AXL2'] + Key: product, Value: ['Axl2p'] + + type: CDS + location: [686:3158](+) + qualifiers: + Key: codon_start, Value: ['1'] + Key: gene, Value: ['AXL2'] + Key: note, Value: ['plasma membrane glycoprotein'] + Key: product, Value: ['Axl2p'] + Key: protein_id, Value: ['AAA98666.1'] + Key: translation, Value: ['MTQLQISLLLTATISLLHLVVATPYEAYPIGKQYPPVARVNESFTFQISNDTYKSSVDKTAQITYNCFDLPSWLSFDSSSRTFSGEPSSDLLSDANTTLYFNVILEGTDSADSTSLNNTYQFVVTNRPSISLSSDFNLLALLKNYGYTNGKNALKLDPNEVFNVTFDRSMFTNEESIVSYYGRSQLYNAPLPNWLFFDSGELKFTGTAPVINSAIAPETSYSFVIIATDIEGFSAVEVEFELVIGAHQLTTSIQNSLIINVTDTGNVSYDLPLNYVYLDDDPISSDKLGSINLLDAPDWVALDNATISGSVPDELLGKNSNPANFSVSIYDTYGDVIYFNFEVVSTTDLFAISSLPNINATRGEWFSYYFLPSQFTDYVNTNVSLEFTNSSQDHDWVKFQSSNLTLAGEVPKNFDKLSLGLKANQGSQSQELYFNIIGMDSKITHSNHSANATSTRSSHHSTSTSSYTSSTYTAKISSTSAAATSSAPAALPAANKTSSHNKKAVAIACGVAIPLGVILVALICFLIFWRRRRENPDDENLPHAISGPDLNNPANKPNQENATPLNNPFDDDASSYDDTSIARRLAALNTLKLDNHSATESDISSVDEKRDSLSGMNTYNDQFQSQSKEELLAKPPVQPPESPFFDPQNRSSSVYMDSEPAVNKSWRYTGNLSPVSDIVRDSYGSQKTVDTEKLFDLEAPEKEKRTSRDVTMSSLDPWNSNISPSPVRKSVTPSPYNVTKHRNRHLQNIQDSQSGKNGITPTTMSTSSSDDFVPVKDGENFCWVHSMEPDRRPSKKRLVDFSNKSNVNVGQVKDIHGRIPEML'] + + type: gene + location: [<3299:>4037](-) + qualifiers: + Key: gene, Value: ['REV7'] + + type: mRNA + location: [<3299:>4037](-) + qualifiers: + Key: gene, Value: ['REV7'] + Key: product, Value: ['Rev7p'] + + type: CDS + location: [3299:4037](-) + qualifiers: + Key: codon_start, Value: ['1'] + Key: gene, Value: ['REV7'] + Key: product, Value: ['Rev7p'] + Key: protein_id, Value: ['AAA98667.1'] + Key: translation, Value: ['MNRWVEKWLRVYLKCYINLILFYRNVYPPQSFDYTTYQSFNLPQFVPINRHPALIDYIEELILDVLSKLTHVYRFSICIINKKNDLCIEKYVLDFSELQHVDKDDQIITETEVFDEFRSSLNSLIMHLEKLPKVNDDTITFEAVINAIELELGHKLDRNRRVDSLEEKAEIERDSNWVKCQEDENLPDNNGFQPPKIKLTSLVGSDVGPLIIHQFSEKLISGDDKILNGVYSQYEEGESIFGSLF'] + + + +Additional ways to view and search for particular features are shown at the bottom of the page under "Other Methods to Viewing Features" + +## Adding Features and Qualifiers + +To add new feature to describe a region of interest to a record, for instance a region that you would like to perform a PCR, you need to create a `SeqFeature` (sequence feature). The minimal information required is: +* A `FeatureLocation`: position of the feature in the sequence. +* The `type` of feature you want to add. + + +🚨🚨 **VERY IMPORTANT** 🚨🚨. Note that `FeatureLocation`s are like python ranges (zero-based open intervals), whereas in GenBank files, locations are one-based closed intervals. For instance, the following code adds a new feature from the 2nd to the 5th nucleotide (`FeatureLocation(3, 15)`), of the `gene` type, but in the GenBank file will be represented as `4..15`. + + +```python +from Bio.SeqFeature import FeatureLocation, SeqFeature + +# Create a dummy record +dummy_record = Dseqrecord("aaaATGCGTACGTGAacgt") + +# Define the locations of a CDS +location = FeatureLocation(3, 15) + +# Create a SeqFeature with the type mRNA +my_feature = SeqFeature(location=location, type="gene") + +# Add my_feature to dummy_record with .append +dummy_record.features.append(my_feature) + +# Confirm that my_feature has been added +print(dummy_record.features[-1]) + +# Print the feature in GenBank format (see how the location is `4..15`) +print(dummy_record.format("genbank")) +``` + + type: gene + location: [3:15] + qualifiers: + + LOCUS name 19 bp DNA linear UNK 01-JAN-1980 + DEFINITION description. + ACCESSION id + VERSION id + KEYWORDS . + SOURCE . + ORGANISM . + . + FEATURES Location/Qualifiers + gene 4..15 + ORIGIN + 1 aaaatgcgta cgtgaacgt + // + + +To give further information about a feature, we can add a qualifier using the `qualifiers` property of `SeqFeature`, which contains a dictionary of qualifiers. For instance, if I would like to note a new feature of type 'domain', between 3-9 bases as my region of interest, I can instantiate the `SeqFeature` class object as such. + +> Note that a new feature is always added to the last position of the features list. + + +```python +location = FeatureLocation(3, 9) + +# Create a SeqFeature with a qualifier +my_feature2 = SeqFeature(location=location, type="domain", qualifiers={"Note": ["Region of interest"]}) + +# Add my_feature to my_record with .append +dummy_record.features.append(my_feature2) + +# Confirm that my_feature has been added +print('>> Feature was added:') +print(dummy_record.features[-1]) +print() + +# Print the feature in GenBank format +print('>> GenBank format:') +print(dummy_record.format("genbank")) + + +``` + + >> Feature was added: + type: domain + location: [3:9] + qualifiers: + Key: Note, Value: ['Region of interest'] + + + >> GenBank format: + LOCUS name 19 bp DNA linear UNK 01-JAN-1980 + DEFINITION description. + ACCESSION id + VERSION id + KEYWORDS . + SOURCE . + ORGANISM . + . + FEATURES Location/Qualifiers + gene 4..15 + domain 4..9 + /Note="Region of interest" + ORIGIN + 1 aaaatgcgta cgtgaacgt + // + + +**🤔 Best practices for qualifiers:** + +The values in the `qualifiers` dictionary should be lists. The reason for this is that in a GenBank file, a single feature can have multiple values for a single qualifier. Below is a real world of the ase1 CDS example from the _S. pombe_ genome in EMBL format: + +``` +FT CDS join(1878362..1878785,1878833..1880604) +FT /colour=2 +FT /primary_name="ase1" +FT /product="antiparallel microtubule cross-linking factor +FT Ase1" +FT /systematic_id="SPAPB1A10.09" +FT /controlled_curation="term=species distribution, conserved +FT in eukaryotes; date=20081110" +FT /controlled_curation="term=species distribution, conserved +FT in metazoa; date=20081110" +FT /controlled_curation="term=species distribution, conserved +FT in vertebrates; date=20081110" +FT /controlled_curation="term=species distribution, +FT predominantly single copy (one to one); date=20081110" +FT /controlled_curation="term=species distribution, conserved +FT in fungi; date=20081110" +FT /controlled_curation="term=species distribution, conserved +FT in eukaryotes only; date=20081110" +``` + +Note how there are several `controlled_curation` qualifiers, therefore it makes sense to store them as a list. + +By default, you can add any type of object in the qualifiers dictionary, and most things will work if you add a string. However, you risk overwriting the existing value for a qualifier, so best practice is: +1. Check if the qualifier already exists using `if "qualifier_name" in feature.qualifiers` +2. If it exists, append to the existing list of values using `feature.qualifiers["qualifier_name"].append("new_value")` +3. If it does not exist, add it to the qualifiers dictionary using `feature.qualifiers["qualifier_name"] = ["new_value"]` + +Note that `Bio.SeqFeatures` does not automatically assume a sequence strand for the feature. If you would like to refer to a feature on the positive or minus strand, you can add a parameter in `FeatureLocation` specifying `strand=+1` or `strand=-1`. + + +```python +#Create a location specifying the minus strand +location = FeatureLocation(15, 19, strand=-1) + +my_feature3 = SeqFeature(location=location, type="domain", qualifiers={"gene":["example_domain"]}) + +dummy_record.features.append(my_feature3) + +print(dummy_record.features[-1]) + +print(dummy_record.format("genbank")) + + +``` + + type: domain + location: [15:19](-) + qualifiers: + Key: gene, Value: ['example_domain'] + + LOCUS name 19 bp DNA linear UNK 01-JAN-1980 + DEFINITION description. + ACCESSION id + VERSION id + KEYWORDS . + SOURCE . + ORGANISM . + . + FEATURES Location/Qualifiers + gene 4..15 + domain 4..9 + /Note="Region of interest" + domain complement(16..19) + /gene="example_domain" + ORIGIN + 1 aaaatgcgta cgtgaacgt + // + + +### Adding a Feature with Parts + +To add a feature with parts, like a CDS with introns, we need to use a `CompoundLocation` object when creating a `SeqFeature`. + +The example code below adds a CDS with two parts, between 3-9bp and 12-15bp, to my features list. In a real-world scenario this would represent a CDS with an intron that skips the `ACG` codon: ATGCGT~~ACG~~TGA + + +```python +from Bio.SeqFeature import CompoundLocation + +# Define the locations of the CDS +locations = [FeatureLocation(3, 9), FeatureLocation(12, 15)] + +# Create a compound location from these parts +compound_location = CompoundLocation(locations) + +# Create a SeqFeature with this compound location, including type and qualifiers. +cds_feature = SeqFeature(location=compound_location, type="CDS", qualifiers={"gene": ["example_gene"]}) + +# Add the feature to the Dseqrecord +dummy_record.features.append(cds_feature) + +print(dummy_record.features[-1]) + +print(dummy_record.format("genbank")) + +``` + + type: CDS + location: join{[3:9], [12:15]} + qualifiers: + Key: gene, Value: ['example_gene'] + + LOCUS name 19 bp DNA linear UNK 01-JAN-1980 + DEFINITION description. + ACCESSION id + VERSION id + KEYWORDS . + SOURCE . + ORGANISM . + . + FEATURES Location/Qualifiers + gene 4..15 + domain 4..9 + /Note="Region of interest" + domain complement(16..19) + /gene="example_domain" + CDS join(4..9,13..15) + /gene="example_gene" + ORIGIN + 1 aaaatgcgta cgtgaacgt + // + + +We can even extract a protein record as follows (see how the protein sequence is `MR`, skipping the intron): + + +```python +sub_record = dummy_record.features[-1].extract(dummy_record) + +print(sub_record.translate()) + +``` + + ID: id + Name: name + Description: description + Number of features: 0 + /molecule_type=DNA + ProteinSeq('MR') + + +### Standard Feature Types and Qualifiers + +`pydna` and `Bio.SeqFeature` suppports all the conventional feature types through the `type` parameters. A non-exhaustive list include gene, CDS, promoter, exon, intron, 5' UTR, 3' UTR, terminator, enhancer, and RBS. You can also define custom features, which could be useful for synthetic biology applications. For instance, you might want to have Bio_brick or spacer features to describe a synthetic standardised plasmid construct. + +It is important to note that while `pydna` and `Bio.SeqFeature` does not restrict the feature types you can use, sticking to standard types helps maintain compatibility with other bioinformatics tools and databases. Please refer to the official [GenBank_Feature_Table](https://www.insdc.org/submitting-standards/feature-table/#2), that lists the standard feature types and their associated qualifiers. + +Further documentation for `SeqFeature`, `CompoundLocation`, and `FeatureLocation` can be found in the `SeqFeature` module [here](https://biopython.org/docs/1.75/api/Bio.SeqFeature.html). + +### Handling Origin Spanning Features + +An origin spanning feature is a special type of feature that crosses over a circular sequence's origin. In pydna, such a feature is represented as a feature with parts, joining the part of the sequence immediately before the origin and immediately after the origin. They can be added using `CompoundLocation` as normal. + +An origin spanning feature, between base 19 to base 6, in a 25bp long circular sequence, is represented like so: + +``` +type: gene +location: join{[19:25](+), [0:6](+)} +qualifiers: gene, Value: example_gene +``` + +This feature will be displayed as a single feature in SnapGene viewer and Benchling, since they support this convention. + + +```python +circular_record = Dseqrecord('ACGTGAaaaaaaaaaaaaaATGCGT', circular=True) + +location = [FeatureLocation(19,25), FeatureLocation(0, 6)] +ori_feat_location = CompoundLocation(location) +ori_feature = SeqFeature(location=ori_feat_location, type="misc", qualifiers={"gene": ["example origin spanning gene"]}) +circular_record.features.append(ori_feature) + +print('>> Feature:') +print(circular_record.features[-1]) + +# Note how the feature sequence is extracted properly across the origin. +print('>> Feature sequence:') +print(circular_record.features[-1].extract(circular_record).seq) +print() + +print('>> GenBank format:') +print(circular_record.format("genbank")) +``` + + >> Feature: + type: misc + location: join{[19:25], [0:6]} + qualifiers: + Key: gene, Value: ['example origin spanning gene'] + + >> Feature sequence: + ATGCGTACGTGA + + >> GenBank format: + LOCUS name 25 bp DNA circular UNK 01-JAN-1980 + DEFINITION description. + ACCESSION id + VERSION id + KEYWORDS . + SOURCE . + ORGANISM . + . + FEATURES Location/Qualifiers + misc join(20..25,1..6) + /gene="example origin spanning gene" + ORIGIN + 1 acgtgaaaaa aaaaaaaaaa tgcgt + // + + +### Other Methods to Viewing Features + +pydna also provides the `list_features` method as a simple way to list all the features in a `Dseqrecord` object. + + +```python +print(sample_record.list_features()) +``` + + +-----+------------------+-----+-------+-------+------+--------+------+ + | Ft# | Label or Note | Dir | Sta | End | Len | type | orf? | + +-----+------------------+-----+-------+-------+------+--------+------+ + | 0 | nd | --> | 0 | 5028 | 5028 | source | no | + | 1 | nd | --> | <0 | >206 | 206 | mRNA | no | + | 2 | nd | --> | <0 | 206 | 206 | CDS | no | + | 3 | nd | --> | <686 | >3158 | 2472 | gene | yes | + | 4 | nd | --> | <686 | >3158 | 2472 | mRNA | yes | + | 5 | N:plasma membran | --> | 686 | 3158 | 2472 | CDS | yes | + | 6 | nd | <-- | <3299 | >4037 | 738 | gene | yes | + | 7 | nd | <-- | <3299 | >4037 | 738 | mRNA | yes | + | 8 | nd | <-- | 3299 | 4037 | 738 | CDS | yes | + +-----+------------------+-----+-------+-------+------+--------+------+ + + +This method is convenient for checking-out a brief overview of each feature, without reading through an entire sequence record. + +Alternatively, we can look for specific features using their qualifiers. For instance: + + +```python +# Filter based on feature type +print('Getting all CDS features:') +cds_features = [f for f in sample_record.features if f.type == "CDS"] +for feature in cds_features: + print(feature) +``` + + Getting all CDS features: + type: CDS + location: [<0:206](+) + qualifiers: + Key: codon_start, Value: ['3'] + Key: product, Value: ['TCP1-beta'] + Key: protein_id, Value: ['AAA98665.1'] + Key: translation, Value: ['SSIYNGISTSGLDLNNGTIADMRQLGIVESYKLKRAVVSSASEAAEVLLRVDNIIRARPRTANRQHM'] + + type: CDS + location: [686:3158](+) + qualifiers: + Key: codon_start, Value: ['1'] + Key: gene, Value: ['AXL2'] + Key: note, Value: ['plasma membrane glycoprotein'] + Key: product, Value: ['Axl2p'] + Key: protein_id, Value: ['AAA98666.1'] + Key: translation, Value: ['MTQLQISLLLTATISLLHLVVATPYEAYPIGKQYPPVARVNESFTFQISNDTYKSSVDKTAQITYNCFDLPSWLSFDSSSRTFSGEPSSDLLSDANTTLYFNVILEGTDSADSTSLNNTYQFVVTNRPSISLSSDFNLLALLKNYGYTNGKNALKLDPNEVFNVTFDRSMFTNEESIVSYYGRSQLYNAPLPNWLFFDSGELKFTGTAPVINSAIAPETSYSFVIIATDIEGFSAVEVEFELVIGAHQLTTSIQNSLIINVTDTGNVSYDLPLNYVYLDDDPISSDKLGSINLLDAPDWVALDNATISGSVPDELLGKNSNPANFSVSIYDTYGDVIYFNFEVVSTTDLFAISSLPNINATRGEWFSYYFLPSQFTDYVNTNVSLEFTNSSQDHDWVKFQSSNLTLAGEVPKNFDKLSLGLKANQGSQSQELYFNIIGMDSKITHSNHSANATSTRSSHHSTSTSSYTSSTYTAKISSTSAAATSSAPAALPAANKTSSHNKKAVAIACGVAIPLGVILVALICFLIFWRRRRENPDDENLPHAISGPDLNNPANKPNQENATPLNNPFDDDASSYDDTSIARRLAALNTLKLDNHSATESDISSVDEKRDSLSGMNTYNDQFQSQSKEELLAKPPVQPPESPFFDPQNRSSSVYMDSEPAVNKSWRYTGNLSPVSDIVRDSYGSQKTVDTEKLFDLEAPEKEKRTSRDVTMSSLDPWNSNISPSPVRKSVTPSPYNVTKHRNRHLQNIQDSQSGKNGITPTTMSTSSSDDFVPVKDGENFCWVHSMEPDRRPSKKRLVDFSNKSNVNVGQVKDIHGRIPEML'] + + type: CDS + location: [3299:4037](-) + qualifiers: + Key: codon_start, Value: ['1'] + Key: gene, Value: ['REV7'] + Key: product, Value: ['Rev7p'] + Key: protein_id, Value: ['AAA98667.1'] + Key: translation, Value: ['MNRWVEKWLRVYLKCYINLILFYRNVYPPQSFDYTTYQSFNLPQFVPINRHPALIDYIEELILDVLSKLTHVYRFSICIINKKNDLCIEKYVLDFSELQHVDKDDQIITETEVFDEFRSSLNSLIMHLEKLPKVNDDTITFEAVINAIELELGHKLDRNRRVDSLEEKAEIERDSNWVKCQEDENLPDNNGFQPPKIKLTSLVGSDVGPLIIHQFSEKLISGDDKILNGVYSQYEEGESIFGSLF'] + + + + +```python +# Find a particular feature by its qualifier (e.g. gene name) +rev7_cds_feature = next(f for f in sample_record.features if + f.type == "gene" and + "gene" in f.qualifiers and "REV7" in f.qualifiers["gene"] + ) + +print(rev7_cds_feature) + +``` + + type: gene + location: [<3299:>4037](-) + qualifiers: + Key: gene, Value: ['REV7'] + + + +If you would like to search for another type of features, simply replace the `"gene"` with your desired feature type in quotation marks. + +### Removing Features + +In pydna, we can search for the feature that we would like to remove using the feature's types or qualififers. For instance, we can modify the features list to exclude all CDS: + + +```python +#Remove all CDS type features from my feature list +sample_record.features = [f for f in sample_record.features if not (f.type == "CDS")] + +for feature in sample_record.features: + print(feature) +``` + + type: source + location: [0:5028](+) + qualifiers: + Key: chromosome, Value: ['IX'] + Key: db_xref, Value: ['taxon:4932'] + Key: mol_type, Value: ['genomic DNA'] + Key: organism, Value: ['Saccharomyces cerevisiae'] + + type: mRNA + location: [<0:>206](+) + qualifiers: + Key: product, Value: ['TCP1-beta'] + + type: gene + location: [<686:>3158](+) + qualifiers: + Key: gene, Value: ['AXL2'] + + type: mRNA + location: [<686:>3158](+) + qualifiers: + Key: gene, Value: ['AXL2'] + Key: product, Value: ['Axl2p'] + + type: gene + location: [<3299:>4037](-) + qualifiers: + Key: gene, Value: ['REV7'] + + type: mRNA + location: [<3299:>4037](-) + qualifiers: + Key: gene, Value: ['REV7'] + Key: product, Value: ['Rev7p'] + + + +We can also modify the features list to exclude a specific gene: + + +```python +#Exclude REV7 from my feature list +sample_record.features = [f for f in sample_record.features if not ('gene' in f.qualifiers and 'REV7' in f.qualifiers['gene'])] + +for feature in sample_record.features: + print(feature) +``` + + type: source + location: [0:5028](+) + qualifiers: + Key: chromosome, Value: ['IX'] + Key: db_xref, Value: ['taxon:4932'] + Key: mol_type, Value: ['genomic DNA'] + Key: organism, Value: ['Saccharomyces cerevisiae'] + + type: mRNA + location: [<0:>206](+) + qualifiers: + Key: product, Value: ['TCP1-beta'] + + type: gene + location: [<686:>3158](+) + qualifiers: + Key: gene, Value: ['AXL2'] + + type: mRNA + location: [<686:>3158](+) + qualifiers: + Key: gene, Value: ['AXL2'] + Key: product, Value: ['Axl2p'] + + + + diff --git a/_sources/markdown_notebooks/Example_CRISPR.md.txt b/_sources/markdown_notebooks/Example_CRISPR.md.txt new file mode 100644 index 00000000..1f77690f --- /dev/null +++ b/_sources/markdown_notebooks/Example_CRISPR.md.txt @@ -0,0 +1,158 @@ +# Implementation of Oligonucleotide-based CRISPR-Cas9 toolbox for efficient engineering of Komagataella phaffii + + +In this example we wanted to give a real life intuition on how to use the module in practice. + +For this purpose we have chosen to use the oligonucleotide-based CRISPR-Cas9 toolbox that i described +here by Strucko et al 2024, in the industrially relevant K. phaffi production organism: + +https://academic.oup.com/femsyr/article/doi/10.1093/femsyr/foae026/7740463?login=false + + +```python +from IPython.display import Image +Image(url="https://oup.silverchair-cdn.com/oup/backfile/Content_public/Journal/femsyr/24/10.1093_femsyr_foae026/1/m_foae026fig3.jpeg?Expires=1730974846&Signature=iBKvkhkUn1823IljQ~1uFEnKO0VqWrwiXADvCwQLz6Yv8yDEAFkgt~tsLrXKFTmGYIq3ZINcj5a5yNgs4cP4NeCvRcQh7Ad~1ZejIwNrjqw51CJhGcZWPzz~NDr93QVLZZd2Re41cJNFKFmEu756KxrHQxwKTQe2QPMPfiKBvhvo8J28PERj3vNjZ3LQRsFp9qUPpdsZEyWIiNY92jsuy448YyuaGCgaC2ExGDLeuArTEJmq8gtb0QnTPV0dEdtoxIfZpgavdvO~QyqikjCLj6hebUYU1lH7StuS8oqCQE82CXO0IUcjYF6m2Lb0evXhqdLDQe90M-NrKjzNRmBA0A__&Key-Pair-Id=APKAIE5G5CRDK6RD3PGA") +``` + + + + + + + + +Figure 1. oligo assisted repair in K. phaffi. + + +- Basically we can make two cuts in the genome, and repair it with an oligo (Figure 1A, 1B). + + +- We can start by loading in our target. Here we have integrated LAC12 in our K. phaffi strain but want to knock it out. + + +- Let's see how this can be implemented in pydna + + + + Open In Colab + + + +```python +# Install pydna (only when running on Colab) +import sys +if 'google.colab' in sys.modules: + %%capture + # Install the current development version of pydna (comment to install pip version) + !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn + # Install pip version instead (uncomment to install) + # !pip install pydna + +``` + +### Import the gene we are going to work with + + +```python +from pydna.dseqrecord import Dseqrecord +from pydna.crispr import cas9, protospacer +from pydna.genbank import Genbank + +# initalize your favourite gene +gb = Genbank("myself@email.com") # Tell Genbank who you are! +gene = gb.nucleotide("X06997") # Kluyveromyces lactis LAC12 gene for lactose permease that have been integrated into K. phaffi +target_dseq = Dseqrecord(gene) +print(target_dseq) + +``` + + Dseqrecord + circular: False + size: 7127 + ID: X06997.1 + Name: X06997 + Description: Kluyveromyces lactis LAC12 gene for lactose permease + Number of features: 8 + /molecule_type=DNA + /topology=linear + /data_file_division=PLN + /date=25-JUL-2016 + /accessions=['X06997'] + /sequence_version=1 + /keywords=['lactose permease', 'unidentified reading frame'] + /source=Kluyveromyces lactis + /organism=Kluyveromyces lactis + /taxonomy=['Eukaryota', 'Fungi', 'Dikarya', 'Ascomycota', 'Saccharomycotina', 'Saccharomycetes', 'Saccharomycetales', 'Saccharomycetaceae', 'Kluyveromyces'] + /references=[Reference(title='Primary structure of the lactose permease gene from the yeast Kluyveromyces lactis. Presence of an unusual transcript structure', ...), Reference(title='Direct Submission', ...)] + /comment=the sequence submitted starts from the 5'end of LAC4 gene but goes + to the opposite direction; therefore, base number 1 is -1199 of + LAC4 gene; for LAC4 gene seq. see + Mol. Cell. Biol. (1987)7,4369-4376. + Dseq(-7127) + GCGA..TTCG + CGCT..AAGC + + +Next we have chosen some guides and can add them to our cas9 enzymes and simulate the cuts. + + +```python + +# Choose guides +guides = ["CCCTAAGTCCTTTGAAGATT", "TATTATTTTGAGGTGCTTTA"] + +# Create an enzyme object with the protospacer +enzyme = cas9(guides[0]) + +# Simulate the cut with enzyme1 +print('cutting with guide 1:', target_dseq.cut(enzyme)) + +# Create an enzyme from the protospacer +enzyme2 = cas9(guides[1]) + +# Simulate the cut with enzyme2 +print('cutting with guide 2:', target_dseq.cut(enzyme2)) +``` + + cutting with guide 1: (Dseqrecord(-135), Dseqrecord(-6992)) + cutting with guide 2: (Dseqrecord(-6793), Dseqrecord(-334)) + + +With these guides I would be able to generate a stable KO with a repair 60/90mer oligo. + + +```python +repair_oligo = target_dseq.cut(enzyme)[0][-45:]+target_dseq.cut(enzyme2)[-1][:45] +repair_oligo.name = 'My repair oligo for this experiment' +print(f'{repair_oligo.name} : {repair_oligo.seq} ') +print(f'{repair_oligo.name} length : {len(repair_oligo.seq)} ') +``` + + My repair oligo for this experiment : AGGTGAACACACTCTGATGTAGTGCAGTCCCTAAGTCCTTTGAAGTTACGGACTCCTCGACCGATGCCCTTGAGAGCCTTCAACCCAGTC + My repair oligo for this experiment length : 90 + + +The final edit gene would look like this in a case of homologous recombination. + + + +```python +from pydna.assembly import Assembly + +my_KO = Assembly((target_dseq.cut(enzyme)[0],repair_oligo, target_dseq.cut(enzyme2)[-1]), limit = 20 ) +my_assembly_KO, *rest = my_KO.assemble_linear() +my_assembly_KO +``` + + + + +
name|45
+     \/
+     /\
+     45|My repair oligo for this experiment|45
+                                            \/
+                                            /\
+                                            45|name
+ + diff --git a/_sources/markdown_notebooks/Example_Gibson.md.txt b/_sources/markdown_notebooks/Example_Gibson.md.txt new file mode 100644 index 00000000..aef8d841 --- /dev/null +++ b/_sources/markdown_notebooks/Example_Gibson.md.txt @@ -0,0 +1,101 @@ +# Example of a Gibson Assembly in pydna +> Visit the full library documentation [here](https://bjornfjohansson.github.io/pydna/) + +This example showcases a workflow of modelling Gibson assembly to clone gene fragments into plasmids for synthetic biology. The biological example is sourced [here](https://www.nature.com/articles/nmeth.1318#MOESM319), from the original Gibson assembly paper. This example constructs a synthetic pCC1BAC plasmid by joining sequence fragments from Ruminiclostridium (Clostridium) cellulolyticum. The R. cellulolyticum fragments joined are termed F1, F2, and F3, as in the paper. + +Source files can be found alongside this notebook, if you would like to follow along. Annotations are made alongside the code to describe key steps. + + + + Open In Colab + + + +```python +# Install pydna (only when running on Colab) +import sys +if 'google.colab' in sys.modules: + %%capture + # Install the current development version of pydna (comment to install pip version) + !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn + # Install pip version instead (uncomment to install) + # !pip install pydna + +``` + + +```python +# Importing all necessary classes and methods + +from pydna.parsers import parse +from pydna.tm import tm_default +from pydna.amplify import pcr +from pydna.dseqrecord import Dseqrecord +from pydna.assembly import Assembly +``` + + +```python +# 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")) +``` + + +```python +# Importing pre-designed primers for the PylRS insert fragment. + +F1_For = "GCAGCTTCAAGTCCTGCAAACAAGGTGTACCAGGATCGTT" #Remember that all sequnces are written from 5'-3' +F1_Rev = "GATTTCAGTGTAGTTAGGGCCAGTTGAATTCAAACCTGCC" +F2_For = "GGCAGGTTTGAATTCAACTGGCCCTAACTACACTGAAATC" +F2_Rev = "CTTGGTGCCATCAGCATTGTTCTCTGTACCGCCCACTGTC" +F3_For = "GACAGTGGGCGGTACAGAGAACAATGCTGATGGCACCAAG" +F3_Rev = "CAGTTGAATAATCATGTGTTCCTGCGGCAAATGCAGTACC" +BACF1_For = "AACGATCCTGGTACACCTTGTTTGCAGGACTTGAAGCTGCgcggccgcgatcctctagagtcgacctg" +BACF3_Rev = "GGTACTGCATTTGCCGCAGGAACACATGATTATTCAACTGgcggccgccgggtaccgagctcgaattc" +``` + + +```python +# (Optional) Checking that the primer Tm are matching + +print(tm_default(F1_For)) # F1_For and F1_Rev have been used as examples here +print(tm_default(F1_Rev)) +``` + + +```python +# 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) + +# 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")) + +``` + + +```python +# Performing the Gibson Assembly. Note that the assembly class parameters should be given as a list. + +assembled = Assembly([Dseqrecord(pcr_product_F1), Dseqrecord(pcr_product_F2), Dseqrecord(pcr_product_F3), Dseqrecord(pcr_product_BAC)]) +assembled_circ = assembled.assemble_circular() + +# Printing out the Gibson Assembly product +print(assembled_circ[0]) +``` diff --git a/_sources/markdown_notebooks/Example_Restriction.md.txt b/_sources/markdown_notebooks/Example_Restriction.md.txt new file mode 100644 index 00000000..905c8130 --- /dev/null +++ b/_sources/markdown_notebooks/Example_Restriction.md.txt @@ -0,0 +1,903 @@ +# Example of a Plasmid Restriction/Ligation Cloning +> Visit the full library documentation [here](https://bjornfjohansson.github.io/pydna/) + +This example showcases a workflow of modelling molecular cloning with restriction enzymes, PCR, and ligases, to clone gene fragments into plasmids. This example constructs a synthetic plasmid by cloning the ase1 gene, which encodes a microtubule associated protein responsible for mitotic spindle assembly, into the pFA6a-kanMX6 cloning vector: + +1. The ase1 gene fragment is first cloned from a portion of the _S. pombe_ genome through PCR: +2. The pFA6a-kanMX6 cloning vector is then cleaved with AscI and SalI. The ase1 gene fragment is also cleaved with SalI and AscI +3. The fragment is ligated with the linearized pFA6a-kanMX6 vector. + +Source files can be found alongside this notebook, if you would like to follow along. Annotations are made alongside the code to describe key steps. + + + Open In Colab + + + +```python +# Install pydna (only when running on Colab) +import sys +if 'google.colab' in sys.modules: + %%capture + # Install the current development version of pydna (comment to install pip version) + !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn + # Install pip version instead (uncomment to install) + # !pip install pydna + +``` + + +```python +# Importing all necessary classes and methods + +from pydna.parsers import parse +from pydna.tm import tm_default +from pydna.amplify import pcr +from pydna.dseqrecord import Dseqrecord +from Bio.Restriction import SalI, AscI +``` + + +```python +# Parsing the files +pFA6akanMX6_path = "./pFA6a-kanMX6.gb" +ase1_path = "./CU329670.gb" +vector = parse(pFA6akanMX6_path)[0] +pombe_chromosome_I = parse(ase1_path)[0] + +# Printing the parsed files + +print(vector.format("gb")) +print(pombe_chromosome_I.format("gb")) +``` + + LOCUS pFA6a-kanMX6 3938 bp ds-DNA circular SYN 16-JUN-2022 + DEFINITION synthetic circular DNA. + ACCESSION . + VERSION . + KEYWORDS pFA6a-kanMX6. + SOURCE synthetic DNA construct + ORGANISM synthetic DNA construct + . + REFERENCE 1 (bases 1 to 3938) + AUTHORS Bahler J, Wu JQ, Longtine MS, Shah NG, McKenzie A 3rd, Steever AB, + Wach A, Philippsen P, Pringle JR + TITLE Heterologous modules for efficient and versatile PCR-based gene + targeting in Schizosaccharomyces pombe. + JOURNAL Yeast. 1998 Jul;14(10):943-51. + PUBMED 9717240 + REFERENCE 2 (bases 1 to 3938) + AUTHORS . + TITLE Direct Submission + JOURNAL Exported Jun 16, 2022 from SnapGene Server 1.1.58 + http://www.snapgene.com + FEATURES Location/Qualifiers + source 1..3938 + /organism="synthetic DNA construct" + /mol_type="other DNA" + primer_bind complement(35..52) + /label="L4440" + /note="L4440 vector, forward primer" + rep_origin complement(206..794) + /direction=LEFT + /label="ori" + /note="high-copy-number ColE1/pMB1/pBR322/pUC origin of + replication" + primer_bind complement(286..305) + /label="pBR322ori-F" + /note="pBR322 origin, forward primer" + CDS complement(965..1825) + /codon_start=1 + /gene="bla" + /product="beta-lactamase" + /label="AmpR" + /note="confers resistance to ampicillin, carbenicillin, and + related antibiotics" + /translation="MSIQHFRVALIPFFAAFCLPVFAHPETLVKVKDAEDQLGARVGYI + ELDLNSGKILESFRPEERFPMMSTFKVLLCGAVLSRIDAGQEQLGRRIHYSQNDLVEYS + PVTEKHLTDGMTVRELCSAAITMSDNTAANLLLTTIGGPKELTAFLHNMGDHVTRLDRW + EPELNEAIPNDERDTTMPVAMATTLRKLLTGELLTLASRQQLIDWMEADKVAGPLLRSA + LPAGWFIADKSGAGERGSRGIIAALGPDGKPSRIVVIYTTGSQATMDERNRQIAEIGAS + LIKHW" + primer_bind 1588..1607 + /label="Amp-R" + /note="Ampicillin resistance gene, reverse primer" + promoter complement(1826..1930) + /gene="bla" + /label="AmpR promoter" + primer_bind 1998..2016 + /label="pBRforEco" + /note="pBR322 vectors, upsteam of EcoRI site, forward + primer" + primer_bind complement(2054..2076) + /label="pGEX 3'" + /note="pGEX vectors, reverse primer" + primer_bind 2176..2195 + /label="pRS-marker" + /note="pRS vectors, use to sequence yeast selectable + marker" + promoter 2276..2294 + /label="SP6 promoter" + /note="promoter for bacteriophage SP6 RNA polymerase" + primer_bind 2276..2293 + /label="SP6" + /note="SP6 promoter, forward primer" + gene 2407..3763 + /label="kanMX" + /note="yeast selectable marker conferring kanamycin + resistance (Wach et al., 1994)" + promoter 2407..2750 + /label="TEF promoter" + /note="Ashbya gossypii TEF promoter" + CDS 2751..3560 + /codon_start=1 + /gene="aph(3')-Ia" + /product="aminoglycoside phosphotransferase" + /label="KanR" + /note="confers resistance to kanamycin" + /translation="MGKEKTHVSRPRLNSNMDADLYGYKWARDNVGQSGATIYRLYGKP + DAPELFLKHGKGSVANDVTDEMVRLNWLTEFMPLPTIKHFIRTPDDAWLLTTAIPGKTA + FQVLEEYPDSGENIVDALAVFLRRLHSIPVCNCPFNSDRVFRLAQAQSRMNNGLVDASD + FDDERNGWPVEQVWKEMHKLLPFSPDSVVTHGDFSLDNLIFDEGKLIGCIDVGRVGIAD + RYQDLAILWNCLGEFSPSLQKRLFQKYGIDNPDMNKLQFHLMLDEFF" + primer_bind complement(2818..2837) + /label="Kan-R" + /note="Kanamycin resistance gene, reverse primer" + terminator 3566..3763 + /label="TEF terminator" + /note="Ashbya gossypii TEF terminator" + primer_bind complement(3867..3886) + /label="T7" + /note="T7 promoter, forward primer" + promoter complement(3868..3886) + /label="T7 promoter" + /note="promoter for bacteriophage T7 RNA polymerase" + ORIGIN + 1 gaggcggttt gcgtattggg cgctcttccg cttcctcgct cactgactcg ctgcgctcgg + 61 tcgttcggct gcggcgagcg gtatcagctc actcaaaggc ggtaatacgg ttatccacag + 121 aatcagggga taacgcagga aagaacatgt gagcaaaagg ccagcaaaag gccaggaacc + 181 gtaaaaaggc cgcgttgctg gcgtttttcc ataggctccg cccccctgac gagcatcaca + 241 aaaatcgacg ctcaagtcag aggtggcgaa acccgacagg actataaaga taccaggcgt + 301 ttccccctgg aagctccctc gtgcgctctc ctgttccgac cctgccgctt accggatacc + 361 tgtccgcctt tctcccttcg ggaagcgtgg cgctttctca tagctcacgc tgtaggtatc + 421 tcagttcggt gtaggtcgtt cgctccaagc tgggctgtgt gcacgaaccc cccgttcagc + 481 ccgaccgctg cgccttatcc ggtaactatc gtcttgagtc caacccggta agacacgact + 541 tatcgccact ggcagcagcc actggtaaca ggattagcag agcgaggtat gtaggcggtg + 601 ctacagagtt cttgaagtgg tggcctaact acggctacac tagaagaaca gtatttggta + 661 tctgcgctct gctgaagcca gttaccttcg gaaaaagagt tggtagctct tgatccggca + 721 aacaaaccac cgctggtagc ggtggttttt ttgtttgcaa gcagcagatt acgcgcagaa + 781 aaaaaggatc tcaagaagat cctttgatct tttctacggg gtctgacgct cagtggaacg + 841 aaaactcacg ttaagggatt ttggtcatga gattatcaaa aaggatcttc acctagatcc + 901 ttttaaatta aaaatgaagt tttaaatcaa tctaaagtat atatgagtaa acttggtctg + 961 acagttacca atgcttaatc agtgaggcac ctatctcagc gatctgtcta tttcgttcat + 1021 ccatagttgc ctgactcccc gtcgtgtaga taactacgat acgggagggc ttaccatctg + 1081 gccccagtgc tgcaatgata ccgcgagacc cacgctcacc ggctccagat ttatcagcaa + 1141 taaaccagcc agccggaagg gccgagcgca gaagtggtcc tgcaacttta tccgcctcca + 1201 tccagtctat taattgttgc cgggaagcta gagtaagtag ttcgccagtt aatagtttgc + 1261 gcaacgttgt tgccattgct acaggcatcg tggtgtcacg ctcgtcgttt ggtatggctt + 1321 cattcagctc cggttcccaa cgatcaaggc gagttacatg atcccccatg ttgtgcaaaa + 1381 aagcggttag ctccttcggt cctccgatcg ttgtcagaag taagttggcc gcagtgttat + 1441 cactcatggt tatggcagca ctgcataatt ctcttactgt catgccatcc gtaagatgct + 1501 tttctgtgac tggtgagtac tcaaccaagt cattctgaga atagtgtatg cggcgaccga + 1561 gttgctcttg cccggcgtca atacgggata ataccgcgcc acatagcaga actttaaaag + 1621 tgctcatcat tggaaaacgt tcttcggggc gaaaactctc aaggatctta ccgctgttga + 1681 gatccagttc gatgtaaccc actcgtgcac ccaactgatc ttcagcatct tttactttca + 1741 ccagcgtttc tgggtgagca aaaacaggaa ggcaaaatgc cgcaaaaaag ggaataaggg + 1801 cgacacggaa atgttgaata ctcatactct tcctttttca atattattga agcatttatc + 1861 agggttattg tctcatgagc ggatacatat ttgaatgtat ttagaaaaat aaacaaatag + 1921 gggttccgcg cacatttccc cgaaaagtgc cacctgacgt ctaagaaacc attattatca + 1981 tgacattaac ctataaaaat aggcgtatca cgaggccctt tcgtctcgcg cgtttcggtg + 2041 atgacggtga aaacctctga cacatgcagc tcccggagac ggtcacagct tgtctgtaag + 2101 cggatgccgg gagcagacaa gcccgtcagg gcgcgtcagc gggtgttggc gggtgtcggg + 2161 gctggcttaa ctatgcggca tcagagcaga ttgtactgag agtgcaccat atggacatat + 2221 tgtcgttaga acgcggctac aattaataca taaccttatg tatcatacac atacgattta + 2281 ggtgacacta tagaacgcgg ccgccagctg aagcttcgta cgctgcaggt cgacggatcc + 2341 ccgggttaat taaggcgcgc cagatctgtt tagcttgcct cgtccccgcc gggtcacccg + 2401 gccagcgaca tggaggccca gaataccctc cttgacagtc ttgacgtgcg cagctcaggg + 2461 gcatgatgtg actgtcgccc gtacatttag cccatacatc cccatgtata atcatttgca + 2521 tccatacatt ttgatggccg cacggcgcga agcaaaaatt acggctcctc gctgcagacc + 2581 tgcgagcagg gaaacgctcc cctcacagac gcgttgaatt gtccccacgc cgcgcccctg + 2641 tagagaaata taaaaggtta ggatttgcca ctgaggttct tctttcatat acttcctttt + 2701 aaaatcttgc taggatacag ttctcacatc acatccgaac ataaacaacc atgggtaagg + 2761 aaaagactca cgtttcgagg ccgcgattaa attccaacat ggatgctgat ttatatgggt + 2821 ataaatgggc tcgcgataat gtcgggcaat caggtgcgac aatctatcga ttgtatggga + 2881 agcccgatgc gccagagttg tttctgaaac atggcaaagg tagcgttgcc aatgatgtta + 2941 cagatgagat ggtcagacta aactggctga cggaatttat gcctcttccg accatcaagc + 3001 attttatccg tactcctgat gatgcatggt tactcaccac tgcgatcccc ggcaaaacag + 3061 cattccaggt attagaagaa tatcctgatt caggtgaaaa tattgttgat gcgctggcag + 3121 tgttcctgcg ccggttgcat tcgattcctg tttgtaattg tccttttaac agcgatcgcg + 3181 tatttcgtct cgctcaggcg caatcacgaa tgaataacgg tttggttgat gcgagtgatt + 3241 ttgatgacga gcgtaatggc tggcctgttg aacaagtctg gaaagaaatg cataagcttt + 3301 tgccattctc accggattca gtcgtcactc atggtgattt ctcacttgat aaccttattt + 3361 ttgacgaggg gaaattaata ggttgtattg atgttggacg agtcggaatc gcagaccgat + 3421 accaggatct tgccatccta tggaactgcc tcggtgagtt ttctccttca ttacagaaac + 3481 ggctttttca aaaatatggt attgataatc ctgatatgaa taaattgcag tttcatttga + 3541 tgctcgatga gtttttctaa tcagtactga caataaaaag attcttgttt tcaagaactt + 3601 gtcatttgta tagttttttt atattgtagt tgttctattt taatcaaatg ttagcgtgat + 3661 ttatattttt tttcgcctcg acatcatctg cccagatgcg aagttaagtg cgcagaaagt + 3721 aatatcatgc gtcaatcgta tgtgaatgct ggtcgctata ctgctgtcga ttcgatacta + 3781 acgccgccat ccagtttaaa cgagctcgaa ttcatcgatg atatcagatc cactagtggc + 3841 ctatgcggcc gcggatctgc cggtctccct atagtgagtc gtattaattt cgataagcca + 3901 ggttaacctg cattaatgaa tcggccaacg cgcgggga + // + LOCUS CU329670 4538 bp DNA linear PLN 26-APR-2024 + DEFINITION Schizosaccharomyces pombe strain 972h- genome assembly, chromosome: + I. + ACCESSION CU329670 + VERSION CU329670.1 + DBLINK BioProject: PRJNA13836 + BioSample: SAMEA3138176 + KEYWORDS . + SOURCE Schizosaccharomyces pombe (fission yeast) + ORGANISM Schizosaccharomyces pombe + Eukaryota; Fungi; Dikarya; Ascomycota; Taphrinomycotina; + Schizosaccharomycetes; Schizosaccharomycetales; + Schizosaccharomycetaceae; Schizosaccharomyces. + REFERENCE 1 (bases 1 to 4538) + AUTHORS Lang,B.F. + TITLE The mitochondrial genome of the fission yeast Schizosaccharomyces + pombe: highly homologous introns are inserted at the same position + of the otherwise less conserved cox1 genes in Schizosaccharomyces + pombe and Aspergillus nidulans + JOURNAL EMBO J 3 (9), 2129-2136 (1984) + PUBMED 6092057 + REFERENCE 2 (bases 1 to 4538) + AUTHORS Lang,B.F., Ahne,F. and Bonen,L. + TITLE The mitochondrial genome of the fission yeast Schizosaccharomyces + pombe. The cytochrome b gene has an intron closely related to the + first two introns in the Saccharomyces cerevisiae cox1 gene + JOURNAL J Mol Biol 184 (3), 353-366 (1985) + PUBMED 4046021 + REFERENCE 3 (bases 1 to 4538) + AUTHORS Lang,B.F., Cedergren,R. and Gray,M.W. + TITLE The mitochondrial genome of the fission yeast, Schizosaccharomyces + pombe. Sequence of the large-subunit ribosomal RNA gene, comparison + of potential secondary structure in fungal mitochondrial + large-subunit rRNAs and evolutionary considerations + JOURNAL Eur J Biochem 169 (3), 527-537 (1987) + PUBMED 2446871 + REFERENCE 4 (bases 1 to 4538) + AUTHORS Trinkl,H., Lang,B.F. and Wolf,K. + TITLE Nucleotide sequence of the gene encoding the small ribosomal RNA in + the mitochondrial genome of the fission yeast Schizosaccharomyces + pombe + JOURNAL Nucleic Acids Res 17 (16), 6730 (1989) + PUBMED 2780299 + REFERENCE 5 (bases 1 to 4538) + AUTHORS Wood,V., Gwilliam,R., Rajandream,M.A., Lyne,M., Lyne,R., Stewart,A., + Sgouros,J., Peat,N., Hayles,J., Baker,S., Basham,D., Bowman,S., + Brooks,K., Brown,D., Brown,S., Chillingworth,T., Churcher,C., + Collins,M., Connor,R., Cronin,A., Davis,P., Feltwell,T., Fraser,A., + Gentles,S., Goble,A., Hamlin,N., Harris,D., Hidalgo,J., Hodgson,G., + Holroyd,S., Hornsby,T., Howarth,S., Huckle,E.J., Hunt,S., Jagels,K., + James,K., Jones,L., Jones,M., Leather,S., McDonald,S., McLean,J., + Mooney,P., Moule,S., Mungall,K., Murphy,L., Niblett,D., Odell,C., + Oliver,K., O'Neil,S., Pearson,D., Quail,M.A., Rabbinowitsch,E., + Rutherford,K., Rutter,S., Saunders,D., Seeger,K., Sharp,S., + Skelton,J., Simmonds,M., Squares,R., Squares,S., Stevens,K., + Taylor,K., Taylor,R.G., Tivey,A., Walsh,S., Warren,T., Whitehead,S., + Woodward,J., Volckaert,G., Aert,R., Robben,J., Grymonprez,B., + Weltjens,I., Vanstreels,E., Rieger,M., Schafer,M., Muller-Auer,S., + Gabel,C., Fuchs,M., Dusterhoft,A., Fritzc,C., Holzer,E., Moestl,D., + Hilbert,H., Borzym,K., Langer,I., Beck,A., Lehrach,H., Reinhardt,R., + Pohl,T.M., Eger,P., Zimmermann,W., Wedler,H., Wambutt,R., + Purnelle,B., Goffeau,A., Cadieu,E., Dreano,S., Gloux,S., Lelaure,V., + Mottier,S., Galibert,F., Aves,S.J., Xiang,Z., Hunt,C., Moore,K., + Hurst,S.M., Lucas,M., Rochet,M., Gaillardin,C., Tallada,V.A., + Garzon,A., Thode,G., Daga,R.R., Cruzado,L., Jimenez,J., Sanchez,M., + del Rey,F., Benito,J., Dominguez,A., Revuelta,J.L., Moreno,S., + Armstrong,J., Forsburg,S.L., Cerutti,L., Lowe,T., McCombie,W.R., + Paulsen,I., Potashkin,J., Shpakovski,G.V., Ussery,D., Barrell,B.G. + and Nurse,P. + TITLE The genome sequence of Schizosaccharomyces pombe + JOURNAL Nature 415 (6874), 871-880 (2002) + PUBMED 11859360 + REMARK Erratum:[Nature 2003 Jan 2;421(6918):94. Cerrutti L [corrected to + Cerutti L]] + REFERENCE 6 + AUTHORS Wood,V., Gwilliam,R., Rajandream,M.A., Lyne,M., Lyne,R., Stewart,A., + Sgouros,J., Peat,N., Hayles,J., Baker,S., Basham,D., Bowman,S., + Brooks,K., Brown,D., Brown,S., Chillingworth,T., Churcher,C., + Collins,M., Connor,R., Cronin,A., Davis,P., Feltwell,T., Fraser,A., + Gentles,S., Goble,A., Hamlin,N., Harris,D., Hidalgo,J., Hodgson,G., + Holroyd,S., Hornsby,T., Howarth,S., Huckle,E.J., Hunt,S., Jagels,K., + James,K., Jones,L., Jones,M., Leather,S., McDonald,S., McLean,J., + Mooney,P., Moule,S., Mungall,K., Murphy,L., Niblett,D., Odell,C., + Oliver,K., O'Neil,S., Pearson,D., Quail,M.A., Rabbinowitsch,E., + Rutherford,K., Rutter,S., Saunders,D., Seeger,K., Sharp,S., + Skelton,J., Simmonds,M., Squares,R., Squares,S., Stevens,K., + Taylor,K., Taylor,R.G., Tivey,A., Walsh,S., Warren,T., Whitehead,S., + Woodward,J., Volckaert,G., Aert,R., Robben,J., Grymonprez,B., + Weltjens,I., Vanstreels,E., Rieger,M., Schafer,M., Muller-Auer,S., + Gabel,C., Fuchs,M., Dusterhoft,A., Fritzc,C., Holzer,E., Moestl,D., + Hilbert,H., Borzym,K., Langer,I., Beck,A., Lehrach,H., Reinhardt,R., + Pohl,T.M., Eger,P., Zimmermann,W., Wedler,H., Wambutt,R., + Purnelle,B., Goffeau,A., Cadieu,E., Dreano,S., Gloux,S., Lelaure,V., + Mottier,S., Galibert,F., Aves,S.J., Xiang,Z., Hunt,C., Moore,K., + Hurst,S.M., Lucas,M., Rochet,M., Gaillardin,C., Tallada,V.A., + Garzon,A., Thode,G., Daga,R.R., Cruzado,L., Jimenez,J., Sanchez,M., + del Rey,F., Benito,J., Dominguez,A., Revuelta,J.L., Moreno,S., + Armstrong,J., Forsburg,S.L., Cerutti,L., Lowe,T., McCombie,W.R., + Paulsen,I., Potashkin,J., Shpakovski,G.V., Ussery,D., Barrell,B.G. + and Nurse,P. + TITLE The genome sequence of Schizosaccharomyces pombe + JOURNAL Nature 415 (6874), 871-880 (2002) + PUBMED 11859360 + REMARK Erratum:[Nature 2003 Jan 2;421(6918):94. Cerrutti L [corrected to + Cerutti L]] + REFERENCE 7 (bases 1 to 4538) + AUTHORS Schafer,B., Hansen,M. and Lang,B.F. + TITLE Transcription and RNA-processing in fission yeast mitochondria + JOURNAL RNA 11 (5), 785-795 (2005) + PUBMED 15811919 + REFERENCE 8 + AUTHORS Wood,V. + CONSRTM The Schizosaccharomyces pombe Genome Sequencing Consortium + TITLE Direct Submission + JOURNAL Submitted (29-JUN-2007) European Schizosaccharomyces genome + sequencing project, Sanger Institute, The Wellcome Trust Genome + Campus, Hinxton, Cambridge CB10 1SA + REFERENCE 9 + AUTHORS Wood,V. and Rutherford,K. + CONSRTM PomBase + TITLE Direct Submission + JOURNAL Submitted (13-MAR-2024) University of Cambridge, PomBase, Hopkins + building, Tennis Court Rd, Cambridge, United Kingdom + COMMENT On or before Jan 26, 2012 this sequence version replaced + AL672256.4, AL009197.1, AL009227.1, AL021046.4, AL021809.4, + AL021813.1, AL021817.2, AL031180.3, AL034486.1, AL034565.1, + AL034583.1, AL035064.1, AL035248.2, AL035254.1, AL035439.1, + AL096845.1, AL109734.1, AL109738.1, AL109739.1, AL109770.1, + AL109820.1, AL109831.1, AL109832.1, AL109951.1, AL109988.1, + AL110469.1, AL110509.2, AL117210.1, AL117212.1, AL117213.1, + AL117390.1, AL121732.1, AL121741.1, AL121745.2, AL121764.1, + AL121765.1, AL121770.1, AL122032.1, AL132667.1, AL132675.1, + AL132714.1, AL132769.1, AL132779.2, AL132798.2, AL132828.1, + AL132839.1, AL132983.1, AL132984.1, AL133154.2, AL133156.1, + AL133157.1, AL133225.2, AL133302.1, AL133357.1, AL133359.1, + AL133360.1, AL133361.1, AL133442.1, AL133498.1, AL133521.1, + AL133522.1, AL135751.1, AL136078.1, AL136235.1, AL136499.1, + AL136521.2, AL136538.1, AL137130.1, AL138666.2, AL138854.1, + AL139315.1, AL157734.1, AL157811.1, AL157872.1, AL157917.1, + AL157993.1, AL157994.1, AL158056.1, AL159180.1, AL159951.1, + AL162531.1, AL162631.1, AL163031.1, AL163071.1, AL163191.2, + AL163481.1, AL163529.1, AL353014.1, AL353860.2, AL355012.1, + AL355013.1, AL355252.1, AL355452.1, AL355632.1, AL355652.1, + AL355653.1, AL356333.1, AL356335.1, AL357232.1, AL358272.1, + AL360054.1, AL360094.1, AL390095.1, AL390274.1, AL390814.1, + AL391713.1, AL391744.1, AL391746.2, AL391783.1, AL441621.1, + AL441624.1, AL512486.1, AL512487.1, AL512491.1, AL512493.1, + AL512496.1, AL512549.1, AL512562.1, AL583902.1, AL590562.1, + AL590582.1, AL590602.1, AL590605.1, AL590902.2, AL590903.1, + AL691401.1, AL691402.1, AL691405.1, Z49811.1, Z50112.1, Z50113.1, + Z50142.1, Z50728.2, Z54096.1, Z54142.2, Z54285.2, Z54308.1, + Z54328.1, Z54354.1, Z54366.1, Z56276.2, Z64354.1, Z66568.2, + Z67757.1, Z67961.2, Z67998.1, Z67999.1, Z68136.2, Z68144.1, + Z68166.1, Z68197.2, Z68198.1, Z68887.1, Z69086.1, Z69239.1, + Z69240.1, Z69368.1, Z69369.1, Z69380.1, Z69725.1, Z69726.1, + Z69727.1, Z69728.1, Z69729.1, Z69730.1, Z69731.1, Z69795.1, + Z69796.1, Z69944.1, Z70043.1, Z70690.1, Z70691.1, Z70721.1, + Z73099.2, Z73100.2, Z81312.1, Z81317.1, Z94864.1, Z95334.1, + Z95395.1, Z95396.2, Z97185.1, Z97208.1, Z97209.1, Z97210.2, + Z98056.2, Z98529.1, Z98530.2, Z98531.2, Z98532.1, Z98533.1, + Z98559.1, Z98560.1, Z98595.1, Z98596.1, Z98597.1, Z98598.1, + Z98600.1, Z98601.1, Z98602.1, Z98603.1, Z98762.1, Z98763.1, + Z98849.1, Z98944.1, Z98974.2, Z98975.1, Z98977.4, Z98978.1, + Z98979.1, Z98980.1, Z98981.3, Z99091.2, Z99126.1, Z99161.1, + Z99162.1, Z99163.2, Z99164.2, Z99165.1, Z99166.1, Z99167.1, + Z99168.1, Z99258.1, Z99259.1, Z99260.2, Z99261.1, Z99262.1, + Z99292.1, Z99295.1, Z99296.2, Z99531.1, Z99532.2, Z99568.2, + Z99753.1. + FEATURES Location/Qualifiers + source 1..4538 + /organism="Schizosaccharomyces pombe" + /mol_type="genomic DNA" + /strain="972h-" + /db_xref="taxon:4896" + /chromosome="I" + gene <1..676 + /locus_tag="SPOM_SPAPB1A10.08" + CDS <1..393 + /locus_tag="SPOM_SPAPB1A10.08" + /codon_start=1 + /product="conserved fungal protein" + /protein_id="CAC21481.2" + /translation="MMTRMELRPLEIGFSKALTEVAPVTCQCECWDHNLCSSQASEMDL + IYQSQDTHSCASKQDAVFQLLSETKIPVPNRYRKISHRLSTLSNKKTLKSQLDRFLSSS + KKLHNDDVNRGDYCFLLSTPVECSASTNSHSYDCLWNFSCNSFPEYSSYSASETSSVAS + YSYYSGPNPATPSSSSCNLVNANSLDIYLNINNLKKSKSVPRLRGQFMEPVEHNHPLSK + SLEEQSSFLEQSKDASSNLTACNRSGSSLSSNFYSSRLSKKTSLASLNKSRASLQHKIM + SLSRNIIRRVFHKPEVHLDPSASILNLSSSHGESNLTNGLLCQNFKLFQDDWLMEDCAP + DANFTLYTPLQPWEKRSVKPEIRRPRLNPNFFRVFVLEAQMRRAGKLSANTAGRAQLIY + LPKPAVTFSTSPLHVEL" + gene complement(<1..1972) + /locus_tag="SPOM_SPNCRNA.2846" + ncRNA complement(<1..1972) + /ncRNA_class="lncRNA" + /locus_tag="SPOM_SPNCRNA.2846" + /product="non-coding RNA" + 3'UTR 394..676 + /locus_tag="SPOM_SPAPB1A10.08" + gene 1001..3538 + /gene="ase1" + /locus_tag="SPOM_SPAPB1A10.09" + 5'UTR 1001..1173 + /gene="ase1" + /locus_tag="SPOM_SPAPB1A10.09" + CDS join(1174..1597,1645..3416) + /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" + 3'UTR 3417..3538 + /gene="ase1" + /locus_tag="SPOM_SPAPB1A10.09" + gene complement(3510..>4538) + /gene="ypt71" + /locus_tag="SPOM_SPAPB1A10.10C" + 3'UTR complement(3510..3690) + /gene="ypt71" + /locus_tag="SPOM_SPAPB1A10.10C" + CDS complement(join(3691..4137,4192..>4290)) + /gene="ypt71" + /locus_tag="SPOM_SPAPB1A10.10C" + /codon_start=1 + /product="GTPase Ypt71" + /protein_id="CAC21483.1" + /translation="MSAQKRVFLKVVILGDSGVGKTCLMNQFVNQKFSREYKATIGADF + LTKDVVVDDKLVTLQLWDTAGQERFQSLGMAFYRGADCCVIVYNVNNSKSFDSVENWRQ + EFLYQTSQDECAFPFIIVGNQIDKDASKRAVSLHRALDYCKSKHGSNMIHFEASAKENT + NVTDLFETVSRLALENESSRDDFVNDFSEPLLLSKPLNNTSSCNC" + gene 4049..>4538 + /locus_tag="SPOM_SPNCRNA.2847" + ncRNA 4049..>4538 + /ncRNA_class="lncRNA" + /locus_tag="SPOM_SPNCRNA.2847" + /product="non-coding RNA" + ORIGIN + 1 atcatcagac gtgtatttca caagccagaa gtgcatttgg atccaagtgc ctccatttta + 61 aatctctcat cttcgcatgg cgaaagcaac ctgacaaatg gtttgctttg tcaaaatttc + 121 aagctttttc aggatgattg gttgatggag gattgtgcgc cagatgccaa tttcactttg + 181 tacaccccgc ttcaaccctg ggaaaagcga agtgtgaaac ctgaaatcag acgtcctcga + 241 ttaaatccta attttttccg agtatttgtt ttagaagctc aaatgcgacg agctggaaag + 301 ctatcagcaa acactgctgg ccgagcccag ttaatttacc tcccaaagcc tgccgttacc + 361 ttctccacta gccctttgca tgttgaattg taaaaattta acgcatgact tatatacatt + 421 tgcattcttc caagctggtt atatttattt tcattttttt ctcacccaat acttttttat + 481 ccctactgtc tttatggaca atcgactcac aattgtttct ttttgttgta tatgattttt + 541 tttttaaagg aaatgggttt cgcgatactg ggttgaatcc caattgcggt taatattaca + 601 taaaataatt ctcccatagt cctagatcct gtctttgaat atgagcaaat aaaagaattg + 661 aacaaatcat gaatgctttt ctctcttaga tgatattttg tatgcataag tctaattata + 721 ttgattacga taagacttaa aaagtaagcc tttgtatcct tttaagcagt atttgaattt + 781 tcttgtatca tattttaggt agagcaaaag ataccagttt gtagaacttt atgtgcttcc + 841 ttacattggt atatttcagg cacataaata ttcttcaact tacaattcta agtattttgt + 901 ttatactaaa aggagctgaa taacgtttat acagtgctga cattgaaatc tatttgcttt + 961 ctttggaata taagcgcatg ctgagttact ttcgcaggcc aagccatatc caaccaccat + 1021 ttttgtgcca agcttttatg caaggttaat tccttgtact gcttgttatg ttataatata + 1081 tcaacatctt aacagttttc atatcttcct ttatattcta ttaattgaat ttcaaacatc + 1141 gttttattga gctcatttac atcaaccggt tcaatgcaaa cagtaatgat ggatgacatt + 1201 caaagcactg attctattgc tgaaaaagat aatcactcta ataatgaatc taactttact + 1261 tggaaagcgt ttcgtgaaca agtggaaaag catttttcta aaattgaaag gcttcaccaa + 1321 gtccttggaa cagatggaga caattcatca ttatttgagt tgtttacaac ggcaatgaat + 1381 gcccagcttc atgaaatgga acagtgccag aaaaaacttg aagatgactg tcagcaaaga + 1441 attgattcaa tcagattttt ggtttcctca ttaaagttaa cggatgatac ttctagtctc + 1501 aaaattgagt ctcctttaat tcagtgtttg aatcgtttgt caatggtaga aggacaatat + 1561 atggcacagt atgatcaaaa gttaagtacg attaaaggta tgtaatcgtc tttaatttag + 1621 acttgtgttt taactgatgt atagaaatgt atcacaaatt ggagtcatat tgtaaccgct + 1681 taggaagtcc gttcgtttta cctgattttg agaattcatt tttatctgat gtatccgatg + 1741 cttttactga atctttgaga ggacgcatca acgaagccga aaaggagatt gatgcgagat + 1801 tagaggttat taattccttt gaagaagaaa ttttgggttt gtggtctgaa ctcggtgttg + 1861 agcccgctga tgttccacaa tacgaacaat tgcttgaatc ccatactaat cgaccaaatg + 1921 atgtttatgt tactcaagaa cttatcgacc aactttgcaa gcaaaaagaa gttttttccg + 1981 ctgaaaaaga aaagagaagt gatcatttaa aaagtataca atcagaagtt agcaacttgt + 2041 ggaataagct tcaagtttct cccaatgaac aaagtcaatt tggcgattca tcaaacatta + 2101 atcaagaaaa tatttcatta tgggaaactg aacttgaaaa acttcatcag ttaaaaaagg + 2161 agcatttacc cattttttta gaagactgtc gtcaacaaat tcttcagctt tgggattctc + 2221 tgttttattc agaagaacaa agaaagtcct ttacacctat gtatgaagac attattacag + 2281 agcaggttct tacggcccat gaaaactata taaagcaact agaggccgaa gtttctgcta + 2341 ataagtcctt tttaagctta attaatcgct atgcctcttt aatagaagga aagaaagagc + 2401 ttgaagctag ttctaatgat gcctctcgtc taacacaacg gggacgccgg gacccaggtt + 2461 tacttctacg tgaagagaaa atccgtaagc gactttctag agaacttcct aaggttcagt + 2521 cgctgcttat accagagatt acagcatggg aagaaagaaa tggaaggacg ttcctttttt + 2581 atgatgaacc acttctcaag atttgccaag aggccactca accaaaatca ttatatagaa + 2641 gtgcaagtgc tgccgcaaac cgcccgaaaa cagcaactac aacggactct gttaatagaa + 2701 caccttctca acgagggcgt gtagctgtac cttcaacacc aagtgttagg tccgcttctc + 2761 gagctatgac gagtccaagg acaccgcttc ctagagtaaa aaacactcaa aatccaagtc + 2821 gttccattag tgcagaaccg ccatcagcaa ccagtaccgc caatagaaga caccccactg + 2881 ctaatcgaat tgatataaac gctagattaa acagtgctag tcggtctcga agcgcgaaca + 2941 tgataagaca aggggcaaat ggtagtgaca gcaatatgtc ttcttcaccc gtttctggaa + 3001 attccaatac cccttttaac aagtttccaa attctgtatc tcgcaataca cattttgaat + 3061 ccaagtcacc gcacccaaat tactctcgaa ctcctcatga aacgtattca aaggcttcat + 3121 ctaagaacgt cccattaagt cctccaaagc agcgtgtagt taatgaacac gctttaaata + 3181 ttatgtcgga aaaattgcaa agaactaatc tgaaagaaca aacacccgag atggacattg + 3241 aaaacagctc gcagaacctt cctttttctc ctatgaagat atcccccata agagcatcac + 3301 ccgtaaagac aattccatca tcaccgtccc ccactaccaa cattttttct gctccactca + 3361 acaatattac aaattgtaca ccgatggagg atgaatgggg agaagaaggc ttttaagctt + 3421 cttatttacc taatcgatca aatttaaata tacatatttt tgcatatgaa tacagcatat + 3481 agataattca taaaagttta ttaactgagg tcataattaa aagactattt acacctaaaa + 3541 aaaaacgtgt atcaatagag ggaaaagaga agaattaaga acagaaagta accatagttt + 3601 tgttaaaata gcaatgtaaa aaaatattat gaaaagaaaa cgtatagcac attttgaaat + 3661 gtaaaagaat ctgagagagc gtgtgaatat ctagcaatta caagaagatg tattattcaa + 3721 aggctttgaa agaagcaaag gttcagagaa gtcattaaca aagtcatctc tcgagctttc + 3781 attttctaaa gctaaacgac tgactgtttc gaaaaggtca gtaacgtttg tattttcttt + 3841 tgcactagct tcaaaatgaa tcatatttga tccatgtttg gatttgcaat agtcaagagc + 3901 tcgatgaaga gatacggctc gtttagacgc gtctttgtcg atttgatttc caacgataat + 3961 gaaagggaat gcacattcat cttgtgaagt ttgatataaa aattcttgcc tccagttttc + 4021 tactgagtca aaagacttcg agttattcac attataaaca attacacaac aatcggcccc + 4081 tctgtaaaaa gccattccca ggctttgaaa tcgttcttga ccagcagtat cccaaagctg + 4141 tttataatta gcaaacgaat ttagatgggc ggaacttata ttggaactta cctgtaatgt + 4201 gaccaatttg tcgtcaacca caacgtcctt ggttaaaaaa tcagcaccga tggtagcttt + 4261 atattcgcga ctaaactttt gattgacgaa ctaaaatgac gatgttaaca aattgccaaa + 4321 gcaatactca tagagaagct gatgtaaaga tcgttaacca tatttgagct agtatttaat + 4381 aacaaagtga ataaatttta aaagcaatca ccttgtagcg acaaataaca acttatcgac + 4441 ataaaatcaa tgggaaattg cagtattgga ttttacagct caatacaaaa accaaaaaga + 4501 aaaatatact gaacgtataa aatttaacgc ttcaattg + // + + + +```python +from pydna.design import primer_design +#Finding the feature containing the CDS with ase1 as a type qualifier +gene = next(f for f in pombe_chromosome_I.features if f.type == "CDS" and + "gene" in f.qualifiers and + "ase1" in f.qualifiers["gene"]) + +# Using the primer_design function to design primers to amplify the CDS +# `min` and `max` can be used on a SeqFeature to get the start (leftmost) and end (rightmost) positions +# this works both on feature with SimpleLocation and CompoundLocation +amplicon = primer_design(pombe_chromosome_I[min(gene):max(gene)], target_tm=55) + +fwd_align, rvs_align = amplicon.primers() +fwd_primer_ase1 = Dseqrecord("ACCATGTCGAC") + fwd_align # Adding a SalI cut site +rvs_primer_ase1 = Dseqrecord("GGCGCGCCAT") + rvs_align # Adding a AscI cut site + +# Printing out the primers + +print(fwd_primer_ase1.seq, ', Tm: ', tm_default(fwd_align)) +print(rvs_primer_ase1.seq, ', Tm: ', tm_default(rvs_align)) +``` + + ACCATGTCGACATGCAAACAGTAATGATGGA , Tm: 57.24061148156318 + GGCGCGCCATTAAAAGCCTTCTTCTCCC , Tm: 56.64459495003314 + + + +```python +# Performing a PCR to check that the primers are specific. An error message is returned if otherwise. + +pcr_product = pcr(fwd_primer_ase1, rvs_primer_ase1, pombe_chromosome_I) + +# Printing out the PCR results + +print(pcr_product.format("gb")) +``` + + LOCUS 2263bp_PCR_prod 2263 bp DNA linear UNK 01-JAN-1980 + DEFINITION pcr_product_description_description. + ACCESSION 2263bp + VERSION 2263bp + DBLINK BioProject: PRJNA13836 + BioSample: SAMEA3138176 + KEYWORDS . + SOURCE . + ORGANISM . + . + FEATURES Location/Qualifiers + CDS join(1..424,472..2243) + /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 1..20 + /label="name" + /PCR_conditions="primer + sequence:ACCATGTCGACATGCAAACAGTAATGATGGA" + /ApEinfo_fwdcolor="#baffa3" + /ApEinfo_revcolor="#ffbaba" + primer_bind complement(2225..2243) + /label="name" + /PCR_conditions="primer + sequence:GGCGCGCCATTAAAAGCCTTCTTCTCCC" + /ApEinfo_fwdcolor="#baffa3" + /ApEinfo_revcolor="#ffbaba" + ORIGIN + 1 accatgtcga catgcaaaca gtaatgatgg atgacattca aagcactgat tctattgctg + 61 aaaaagataa tcactctaat aatgaatcta actttacttg gaaagcgttt cgtgaacaag + 121 tggaaaagca tttttctaaa attgaaaggc ttcaccaagt ccttggaaca gatggagaca + 181 attcatcatt atttgagttg tttacaacgg caatgaatgc ccagcttcat gaaatggaac + 241 agtgccagaa aaaacttgaa gatgactgtc agcaaagaat tgattcaatc agatttttgg + 301 tttcctcatt aaagttaacg gatgatactt ctagtctcaa aattgagtct cctttaattc + 361 agtgtttgaa tcgtttgtca atggtagaag gacaatatat ggcacagtat gatcaaaagt + 421 taagtacgat taaaggtatg taatcgtctt taatttagac ttgtgtttta actgatgtat + 481 agaaatgtat cacaaattgg agtcatattg taaccgctta ggaagtccgt tcgttttacc + 541 tgattttgag aattcatttt tatctgatgt atccgatgct tttactgaat ctttgagagg + 601 acgcatcaac gaagccgaaa aggagattga tgcgagatta gaggttatta attcctttga + 661 agaagaaatt ttgggtttgt ggtctgaact cggtgttgag cccgctgatg ttccacaata + 721 cgaacaattg cttgaatccc atactaatcg accaaatgat gtttatgtta ctcaagaact + 781 tatcgaccaa ctttgcaagc aaaaagaagt tttttccgct gaaaaagaaa agagaagtga + 841 tcatttaaaa agtatacaat cagaagttag caacttgtgg aataagcttc aagtttctcc + 901 caatgaacaa agtcaatttg gcgattcatc aaacattaat caagaaaata tttcattatg + 961 ggaaactgaa cttgaaaaac ttcatcagtt aaaaaaggag catttaccca tttttttaga + 1021 agactgtcgt caacaaattc ttcagctttg ggattctctg ttttattcag aagaacaaag + 1081 aaagtccttt acacctatgt atgaagacat tattacagag caggttctta cggcccatga + 1141 aaactatata aagcaactag aggccgaagt ttctgctaat aagtcctttt taagcttaat + 1201 taatcgctat gcctctttaa tagaaggaaa gaaagagctt gaagctagtt ctaatgatgc + 1261 ctctcgtcta acacaacggg gacgccggga cccaggttta cttctacgtg aagagaaaat + 1321 ccgtaagcga ctttctagag aacttcctaa ggttcagtcg ctgcttatac cagagattac + 1381 agcatgggaa gaaagaaatg gaaggacgtt ccttttttat gatgaaccac ttctcaagat + 1441 ttgccaagag gccactcaac caaaatcatt atatagaagt gcaagtgctg ccgcaaaccg + 1501 cccgaaaaca gcaactacaa cggactctgt taatagaaca ccttctcaac gagggcgtgt + 1561 agctgtacct tcaacaccaa gtgttaggtc cgcttctcga gctatgacga gtccaaggac + 1621 accgcttcct agagtaaaaa acactcaaaa tccaagtcgt tccattagtg cagaaccgcc + 1681 atcagcaacc agtaccgcca atagaagaca ccccactgct aatcgaattg atataaacgc + 1741 tagattaaac agtgctagtc ggtctcgaag cgcgaacatg ataagacaag gggcaaatgg + 1801 tagtgacagc aatatgtctt cttcacccgt ttctggaaat tccaataccc cttttaacaa + 1861 gtttccaaat tctgtatctc gcaatacaca ttttgaatcc aagtcaccgc acccaaatta + 1921 ctctcgaact cctcatgaaa cgtattcaaa ggcttcatct aagaacgtcc cattaagtcc + 1981 tccaaagcag cgtgtagtta atgaacacgc tttaaatatt atgtcggaaa aattgcaaag + 2041 aactaatctg aaagaacaaa cacccgagat ggacattgaa aacagctcgc agaaccttcc + 2101 tttttctcct atgaagatat cccccataag agcatcaccc gtaaagacaa ttccatcatc + 2161 accgtccccc actaccaaca ttttttctgc tccactcaac aatattacaa attgtacacc + 2221 gatggaggat gaatggggag aagaaggctt ttaatggcgc gcc + // + + + +```python +# Cleaving the cloning vector with restriction enzymes + +plasmid_digests = vector.cut(SalI, AscI) + +# Cleaving the gene fragment with restriction enzymes + +gene_digests = Dseqrecord(pcr_product).cut(SalI, AscI) + +# Printing out the digests +print(plasmid_digests) +print(gene_digests) +``` + + (Dseqrecord(-30), Dseqrecord(-3916)) + (Dseqrecord(-10), Dseqrecord(-2255), Dseqrecord(-6)) + + + +```python +# Ligating, then circularising the synthetic plasmid + +synthetic_vector = plasmid_digests[1] + gene_digests [1] +synthetic_vector = synthetic_vector.looped() + +# Printing out the completed cloning vector + +print(synthetic_vector.format("gb")) +``` + + LOCUS name 6163 bp DNA circular UNK 01-JAN-1980 + DEFINITION description. + ACCESSION id + VERSION id + KEYWORDS . + SOURCE . + ORGANISM . + . + FEATURES Location/Qualifiers + gene 52..1408 + /label="kanMX" + /note="yeast selectable marker conferring kanamycin + resistance (Wach et al., 1994)" + promoter 52..395 + /label="TEF promoter" + /note="Ashbya gossypii TEF promoter" + CDS 396..1205 + /codon_start=1 + /gene="aph(3')-Ia" + /product="aminoglycoside phosphotransferase" + /label="KanR" + /note="confers resistance to kanamycin" + /translation="MGKEKTHVSRPRLNSNMDADLYGYKWARDNVGQSGATIYRLYGKP + DAPELFLKHGKGSVANDVTDEMVRLNWLTEFMPLPTIKHFIRTPDDAWLLTTAIPGKTA + FQVLEEYPDSGENIVDALAVFLRRLHSIPVCNCPFNSDRVFRLAQAQSRMNNGLVDASD + FDDERNGWPVEQVWKEMHKLLPFSPDSVVTHGDFSLDNLIFDEGKLIGCIDVGRVGIAD + RYQDLAILWNCLGEFSPSLQKRLFQKYGIDNPDMNKLQFHLMLDEFF" + primer_bind complement(463..482) + /label="Kan-R" + /note="Kanamycin resistance gene, reverse primer" + terminator 1211..1408 + /label="TEF terminator" + /note="Ashbya gossypii TEF terminator" + primer_bind complement(1512..1531) + /label="T7" + /note="T7 promoter, forward primer" + promoter complement(1513..1531) + /label="T7 promoter" + /note="promoter for bacteriophage T7 RNA polymerase" + primer_bind complement(1618..1635) + /label="L4440" + /note="L4440 vector, forward primer" + rep_origin complement(1789..2377) + /direction=LEFT + /label="ori" + /note="high-copy-number ColE1/pMB1/pBR322/pUC origin of + replication" + primer_bind complement(1869..1888) + /label="pBR322ori-F" + /note="pBR322 origin, forward primer" + CDS complement(2548..3408) + /codon_start=1 + /gene="bla" + /product="beta-lactamase" + /label="AmpR" + /note="confers resistance to ampicillin, carbenicillin, and + related antibiotics" + /translation="MSIQHFRVALIPFFAAFCLPVFAHPETLVKVKDAEDQLGARVGYI + ELDLNSGKILESFRPEERFPMMSTFKVLLCGAVLSRIDAGQEQLGRRIHYSQNDLVEYS + PVTEKHLTDGMTVRELCSAAITMSDNTAANLLLTTIGGPKELTAFLHNMGDHVTRLDRW + EPELNEAIPNDERDTTMPVAMATTLRKLLTGELLTLASRQQLIDWMEADKVAGPLLRSA + LPAGWFIADKSGAGERGSRGIIAALGPDGKPSRIVVIYTTGSQATMDERNRQIAEIGAS + LIKHW" + primer_bind 3171..3190 + /label="Amp-R" + /note="Ampicillin resistance gene, reverse primer" + promoter complement(3409..3513) + /gene="bla" + /label="AmpR promoter" + primer_bind 3581..3599 + /label="pBRforEco" + /note="pBR322 vectors, upsteam of EcoRI site, forward + primer" + primer_bind complement(3637..3659) + /label="pGEX 3'" + /note="pGEX vectors, reverse primer" + primer_bind 3759..3778 + /label="pRS-marker" + /note="pRS vectors, use to sequence yeast selectable + marker" + promoter 3859..3877 + /label="SP6 promoter" + /note="promoter for bacteriophage SP6 RNA polymerase" + primer_bind 3859..3876 + /label="SP6" + /note="SP6 promoter, forward primer" + primer_bind complement(6131..6149) + /label="name" + /PCR_conditions="primer + sequence:GGCGCGCCATTAAAAGCCTTCTTCTCCC" + /ApEinfo_fwdcolor="#baffa3" + /ApEinfo_revcolor="#ffbaba" + ORIGIN + 1 cgcgccagat ctgtttagct tgcctcgtcc ccgccgggtc acccggccag cgacatggag + 61 gcccagaata ccctccttga cagtcttgac gtgcgcagct caggggcatg atgtgactgt + 121 cgcccgtaca tttagcccat acatccccat gtataatcat ttgcatccat acattttgat + 181 ggccgcacgg cgcgaagcaa aaattacggc tcctcgctgc agacctgcga gcagggaaac + 241 gctcccctca cagacgcgtt gaattgtccc cacgccgcgc ccctgtagag aaatataaaa + 301 ggttaggatt tgccactgag gttcttcttt catatacttc cttttaaaat cttgctagga + 361 tacagttctc acatcacatc cgaacataaa caaccatggg taaggaaaag actcacgttt + 421 cgaggccgcg attaaattcc aacatggatg ctgatttata tgggtataaa tgggctcgcg + 481 ataatgtcgg gcaatcaggt gcgacaatct atcgattgta tgggaagccc gatgcgccag + 541 agttgtttct gaaacatggc aaaggtagcg ttgccaatga tgttacagat gagatggtca + 601 gactaaactg gctgacggaa tttatgcctc ttccgaccat caagcatttt atccgtactc + 661 ctgatgatgc atggttactc accactgcga tccccggcaa aacagcattc caggtattag + 721 aagaatatcc tgattcaggt gaaaatattg ttgatgcgct ggcagtgttc ctgcgccggt + 781 tgcattcgat tcctgtttgt aattgtcctt ttaacagcga tcgcgtattt cgtctcgctc + 841 aggcgcaatc acgaatgaat aacggtttgg ttgatgcgag tgattttgat gacgagcgta + 901 atggctggcc tgttgaacaa gtctggaaag aaatgcataa gcttttgcca ttctcaccgg + 961 attcagtcgt cactcatggt gatttctcac ttgataacct tatttttgac gaggggaaat + 1021 taataggttg tattgatgtt ggacgagtcg gaatcgcaga ccgataccag gatcttgcca + 1081 tcctatggaa ctgcctcggt gagttttctc cttcattaca gaaacggctt tttcaaaaat + 1141 atggtattga taatcctgat atgaataaat tgcagtttca tttgatgctc gatgagtttt + 1201 tctaatcagt actgacaata aaaagattct tgttttcaag aacttgtcat ttgtatagtt + 1261 tttttatatt gtagttgttc tattttaatc aaatgttagc gtgatttata ttttttttcg + 1321 cctcgacatc atctgcccag atgcgaagtt aagtgcgcag aaagtaatat catgcgtcaa + 1381 tcgtatgtga atgctggtcg ctatactgct gtcgattcga tactaacgcc gccatccagt + 1441 ttaaacgagc tcgaattcat cgatgatatc agatccacta gtggcctatg cggccgcgga + 1501 tctgccggtc tccctatagt gagtcgtatt aatttcgata agccaggtta acctgcatta + 1561 atgaatcggc caacgcgcgg ggagaggcgg tttgcgtatt gggcgctctt ccgcttcctc + 1621 gctcactgac tcgctgcgct cggtcgttcg gctgcggcga gcggtatcag ctcactcaaa + 1681 ggcggtaata cggttatcca cagaatcagg ggataacgca ggaaagaaca tgtgagcaaa + 1741 aggccagcaa aaggccagga accgtaaaaa ggccgcgttg ctggcgtttt tccataggct + 1801 ccgcccccct gacgagcatc acaaaaatcg acgctcaagt cagaggtggc gaaacccgac + 1861 aggactataa agataccagg cgtttccccc tggaagctcc ctcgtgcgct ctcctgttcc + 1921 gaccctgccg cttaccggat acctgtccgc ctttctccct tcgggaagcg tggcgctttc + 1981 tcatagctca cgctgtaggt atctcagttc ggtgtaggtc gttcgctcca agctgggctg + 2041 tgtgcacgaa ccccccgttc agcccgaccg ctgcgcctta tccggtaact atcgtcttga + 2101 gtccaacccg gtaagacacg acttatcgcc actggcagca gccactggta acaggattag + 2161 cagagcgagg tatgtaggcg gtgctacaga gttcttgaag tggtggccta actacggcta + 2221 cactagaaga acagtatttg gtatctgcgc tctgctgaag ccagttacct tcggaaaaag + 2281 agttggtagc tcttgatccg gcaaacaaac caccgctggt agcggtggtt tttttgtttg + 2341 caagcagcag attacgcgca gaaaaaaagg atctcaagaa gatcctttga tcttttctac + 2401 ggggtctgac gctcagtgga acgaaaactc acgttaaggg attttggtca tgagattatc + 2461 aaaaaggatc ttcacctaga tccttttaaa ttaaaaatga agttttaaat caatctaaag + 2521 tatatatgag taaacttggt ctgacagtta ccaatgctta atcagtgagg cacctatctc + 2581 agcgatctgt ctatttcgtt catccatagt tgcctgactc cccgtcgtgt agataactac + 2641 gatacgggag ggcttaccat ctggccccag tgctgcaatg ataccgcgag acccacgctc + 2701 accggctcca gatttatcag caataaacca gccagccgga agggccgagc gcagaagtgg + 2761 tcctgcaact ttatccgcct ccatccagtc tattaattgt tgccgggaag ctagagtaag + 2821 tagttcgcca gttaatagtt tgcgcaacgt tgttgccatt gctacaggca tcgtggtgtc + 2881 acgctcgtcg tttggtatgg cttcattcag ctccggttcc caacgatcaa ggcgagttac + 2941 atgatccccc atgttgtgca aaaaagcggt tagctccttc ggtcctccga tcgttgtcag + 3001 aagtaagttg gccgcagtgt tatcactcat ggttatggca gcactgcata attctcttac + 3061 tgtcatgcca tccgtaagat gcttttctgt gactggtgag tactcaacca agtcattctg + 3121 agaatagtgt atgcggcgac cgagttgctc ttgcccggcg tcaatacggg ataataccgc + 3181 gccacatagc agaactttaa aagtgctcat cattggaaaa cgttcttcgg ggcgaaaact + 3241 ctcaaggatc ttaccgctgt tgagatccag ttcgatgtaa cccactcgtg cacccaactg + 3301 atcttcagca tcttttactt tcaccagcgt ttctgggtga gcaaaaacag gaaggcaaaa + 3361 tgccgcaaaa aagggaataa gggcgacacg gaaatgttga atactcatac tcttcctttt + 3421 tcaatattat tgaagcattt atcagggtta ttgtctcatg agcggataca tatttgaatg + 3481 tatttagaaa aataaacaaa taggggttcc gcgcacattt ccccgaaaag tgccacctga + 3541 cgtctaagaa accattatta tcatgacatt aacctataaa aataggcgta tcacgaggcc + 3601 ctttcgtctc gcgcgtttcg gtgatgacgg tgaaaacctc tgacacatgc agctcccgga + 3661 gacggtcaca gcttgtctgt aagcggatgc cgggagcaga caagcccgtc agggcgcgtc + 3721 agcgggtgtt ggcgggtgtc ggggctggct taactatgcg gcatcagagc agattgtact + 3781 gagagtgcac catatggaca tattgtcgtt agaacgcggc tacaattaat acataacctt + 3841 atgtatcata cacatacgat ttaggtgaca ctatagaacg cggccgccag ctgaagcttc + 3901 gtacgctgca ggtcgacatg caaacagtaa tgatggatga cattcaaagc actgattcta + 3961 ttgctgaaaa agataatcac tctaataatg aatctaactt tacttggaaa gcgtttcgtg + 4021 aacaagtgga aaagcatttt tctaaaattg aaaggcttca ccaagtcctt ggaacagatg + 4081 gagacaattc atcattattt gagttgttta caacggcaat gaatgcccag cttcatgaaa + 4141 tggaacagtg ccagaaaaaa cttgaagatg actgtcagca aagaattgat tcaatcagat + 4201 ttttggtttc ctcattaaag ttaacggatg atacttctag tctcaaaatt gagtctcctt + 4261 taattcagtg tttgaatcgt ttgtcaatgg tagaaggaca atatatggca cagtatgatc + 4321 aaaagttaag tacgattaaa ggtatgtaat cgtctttaat ttagacttgt gttttaactg + 4381 atgtatagaa atgtatcaca aattggagtc atattgtaac cgcttaggaa gtccgttcgt + 4441 tttacctgat tttgagaatt catttttatc tgatgtatcc gatgctttta ctgaatcttt + 4501 gagaggacgc atcaacgaag ccgaaaagga gattgatgcg agattagagg ttattaattc + 4561 ctttgaagaa gaaattttgg gtttgtggtc tgaactcggt gttgagcccg ctgatgttcc + 4621 acaatacgaa caattgcttg aatcccatac taatcgacca aatgatgttt atgttactca + 4681 agaacttatc gaccaacttt gcaagcaaaa agaagttttt tccgctgaaa aagaaaagag + 4741 aagtgatcat ttaaaaagta tacaatcaga agttagcaac ttgtggaata agcttcaagt + 4801 ttctcccaat gaacaaagtc aatttggcga ttcatcaaac attaatcaag aaaatatttc + 4861 attatgggaa actgaacttg aaaaacttca tcagttaaaa aaggagcatt tacccatttt + 4921 tttagaagac tgtcgtcaac aaattcttca gctttgggat tctctgtttt attcagaaga + 4981 acaaagaaag tcctttacac ctatgtatga agacattatt acagagcagg ttcttacggc + 5041 ccatgaaaac tatataaagc aactagaggc cgaagtttct gctaataagt cctttttaag + 5101 cttaattaat cgctatgcct ctttaataga aggaaagaaa gagcttgaag ctagttctaa + 5161 tgatgcctct cgtctaacac aacggggacg ccgggaccca ggtttacttc tacgtgaaga + 5221 gaaaatccgt aagcgacttt ctagagaact tcctaaggtt cagtcgctgc ttataccaga + 5281 gattacagca tgggaagaaa gaaatggaag gacgttcctt ttttatgatg aaccacttct + 5341 caagatttgc caagaggcca ctcaaccaaa atcattatat agaagtgcaa gtgctgccgc + 5401 aaaccgcccg aaaacagcaa ctacaacgga ctctgttaat agaacacctt ctcaacgagg + 5461 gcgtgtagct gtaccttcaa caccaagtgt taggtccgct tctcgagcta tgacgagtcc + 5521 aaggacaccg cttcctagag taaaaaacac tcaaaatcca agtcgttcca ttagtgcaga + 5581 accgccatca gcaaccagta ccgccaatag aagacacccc actgctaatc gaattgatat + 5641 aaacgctaga ttaaacagtg ctagtcggtc tcgaagcgcg aacatgataa gacaaggggc + 5701 aaatggtagt gacagcaata tgtcttcttc acccgtttct ggaaattcca ataccccttt + 5761 taacaagttt ccaaattctg tatctcgcaa tacacatttt gaatccaagt caccgcaccc + 5821 aaattactct cgaactcctc atgaaacgta ttcaaaggct tcatctaaga acgtcccatt + 5881 aagtcctcca aagcagcgtg tagttaatga acacgcttta aatattatgt cggaaaaatt + 5941 gcaaagaact aatctgaaag aacaaacacc cgagatggac attgaaaaca gctcgcagaa + 6001 ccttcctttt tctcctatga agatatcccc cataagagca tcacccgtaa agacaattcc + 6061 atcatcaccg tcccccacta ccaacatttt ttctgctcca ctcaacaata ttacaaattg + 6121 tacaccgatg gaggatgaat ggggagaaga aggcttttaa tgg + // + diff --git a/_sources/markdown_notebooks/Gibson.md.txt b/_sources/markdown_notebooks/Gibson.md.txt new file mode 100644 index 00000000..f7903e32 --- /dev/null +++ b/_sources/markdown_notebooks/Gibson.md.txt @@ -0,0 +1,102 @@ +# Gibson Assembly in pydna +> Visit the full library documentation [here](https://bjornfjohansson.github.io/pydna/) + +Gibson Assembly is a powerful method to assemble multiple DNA fragments into a single, continuous sequence in a seamless, one-step reaction. Developed by Daniel Gibson and colleagues in 2009, this method has been widely applied to work in molecular cloning, biotechnology, and synthetic biology. + +`pydna` provides the `Assembly` class to simulate the assembly of DNA sequences. Below is an example fpr performing Gibson Assembly with pre-existing DNA fragments, followed by primer design for generating these fragments via the `pcr` method, if needed. + +The `Assembly` takes the following arguments: + * `frags`: list of DNA fragments as `Dseqrecord` objects + * `limit`: the minimum sequence homology required. + * `algorithm`: the function used to find homology regions between DNA fragments. For Gibson Assembly, we use the `terminal_overlap` function, which finds homology regions only at the terminal regions. By default, the `Assembly` class uses the `common_sub_strings` function to find homology regions, which finds homology anywhere, as it could happen in a homologous recombination event. + + + + Open In Colab + + + +```python +# Install pydna (only when running on Colab) +import sys +if 'google.colab' in sys.modules: + %%capture + # Install the current development version of pydna (comment to install pip version) + !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn + # Install pip version instead (uncomment to install) + # !pip install pydna + +``` + + +```python +from pydna.dseqrecord import Dseqrecord +from pydna.assembly import Assembly +from pydna.common_sub_strings import terminal_overlap + +#Creating example Dseqrecord sequences +fragment1 = Dseqrecord("acgatgctatactgCCCCCtgtgctgtgctcta") +fragment2 = Dseqrecord("tgtgctgtgctctaTTTTTtattctggctgtatc") +fragment3 = Dseqrecord("tattctggctgtatcGGGGGtacgatgctatactg") + +#Creating a list of sequences to assemble +fragments = [fragment1, fragment2, fragment3] + +#Performing Gibson assembly, with a minimum shared homology of 14bp +assembly = Assembly(fragments, limit=14, algorithm=terminal_overlap) + +#Displaying the assembled product +print(assembly) +``` + + Assembly + fragments..: 33bp 34bp 35bp + limit(bp)..: 14 + G.nodes....: 6 + algorithm..: terminal_overlap + + +The printed output shows the length of each fragment provided to the assembly, the minimum length required for sequence homology search, the number of nodes (number of overlapping regions), and the algorithm used for sequence homology search. Please refer to the full `Assembly` module documentation for more information on the algorithm applied. + +To make a circular sequence from an `Assembly`, pydna provides the `assemble_circular` method. The assembled sequence can be printed as normal, as `Dseqrecord` objects. Note that the `assemble_circular` method returns a list, where the two elements are reverse complement of each other. + + +```python +from pydna.contig import Contig + +#Circularizing the assembled sequence +assembly_circ = assembly.assemble_circular() + +#Printing the sequence records +print(assembly_circ[0]) +print() +print(assembly_circ[1]) + +``` + + Dseqrecord + circular: True + size: 59 + ID: id + Name: name + Description: description + Number of features: 0 + /molecule_type=DNA + Dseq(o59) + acga..GGGt + tgct..CCCa + + Dseqrecord + circular: True + size: 59 + ID: id + Name: name + Description: description + Number of features: 0 + /molecule_type=DNA + Dseq(o59) + taga..AAAA + atct..TTTT + + +Please refer to the Example_Gibson page for an example of a completed workflow for modelling Gibson Assembly using pydna. diff --git a/_sources/markdown_notebooks/Importing_Seqs.md.txt b/_sources/markdown_notebooks/Importing_Seqs.md.txt new file mode 100644 index 00000000..f7e8624a --- /dev/null +++ b/_sources/markdown_notebooks/Importing_Seqs.md.txt @@ -0,0 +1,311 @@ +# Importing and viewing sequence files in pydna +> Visit the full library documentation [here](https://bjornfjohansson.github.io/pydna/) + +pydna can be used to work with FASTA, Genbank, EMBL, and snapgene files (.fasta, .gb, .embl, .dna). You can read these files into a `Dseqrecord` that one can view and work with. You can also instantiate `Dseqrecord` objects with strings. + +## Importing Sequence Files + +To import files into pydna is simple. pydna provides the `parse` method to read all DNA sequences in a file into a list. As an input, `parse` can take: + +* The path to a file from your computer +* A python string with the file content. + +The following code shows an example of how to use the `parse` function to import a FASTA file. + + + Open In Colab + + + +```python +# Install pydna (only when running on Colab) +import sys +if 'google.colab' in sys.modules: + %%capture + # Install the current development version of pydna (comment to install pip version) + !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn + # Install pip version instead (uncomment to install) + # !pip install pydna + +``` + + +```python +from pydna.parsers import parse + +#Import your file into python using its path +file_path = "./U49845.fasta" +files = parse(file_path) + +#Show your FASTA file in python +print(files[0].format("fasta")) +``` + + >lcl|U49845.1_cds_AAA98665.1_1 [protein=TCP1-beta] [frame=3] [protein_id=AAA98665.1] [location=<1..206] [gbkey=CDS] + TCCTCCATATACAACGGTATCTCCACCTCAGGTTTAGATCTCAACAACGGAACCATTGCC + GACATGAGACAGTTAGGTATCGTCGAGAGTTACAAGCTAAAACGAGCAGTAGTCAGCTCT + GCATCTGAAGCCGCTGAAGTTCTACTAAGGGTGGATAACATCATCCGTGCAAGACCAAGA + ACCGCCAATAGACAACATATGTAA + + +Note that `parse` returns a `list` object, hence requiring `[0]` to take the first element of the list. When you have a FASTA file that contains multiple sequences, you can index the list accordingly (e.g `[0]`, `[1]`, ...) + +The last line of code uses the `format` method to generate a string representation of the sequence as a FASTA file. + +Another example, using a GenBank file ([U49845](https://www.ncbi.nlm.nih.gov/nucleotide/U49845)), is shown below. + + +```python +from pydna.parsers import parse + +file_path = "./U49845.gb" +files = parse(file_path) + +# Convert the Dseqrecord object into a formatted string in GenBank format +files[0].format("gb") + +``` + + + + + LOCUS SCU49845 5028 bp DNA linear PLN 29-OCT-2018 + DEFINITION Saccharomyces cerevisiae TCP1-beta gene, partial cds; and Axl2p + (AXL2) and Rev7p (REV7) genes, complete cds. + ACCESSION U49845 + VERSION U49845.1 + KEYWORDS . + SOURCE Saccharomyces cerevisiae (brewer's yeast) + ORGANISM Saccharomyces cerevisiae + Eukaryota; Fungi; Dikarya; Ascomycota; Saccharomycotina; + Saccharomycetes; Saccharomycetales; Saccharomycetaceae; + Saccharomyces. + REFERENCE 1 (bases 1 to 5028) + AUTHORS Roemer,T., Madden,K., Chang,J. and Snyder,M. + TITLE Selection of axial growth sites in yeast requires Axl2p, a novel + plasma membrane glycoprotein + JOURNAL Genes Dev. 10 (7), 777-793 (1996) + PUBMED 8846915 + REFERENCE 2 (bases 1 to 5028) + AUTHORS Roemer,T. + TITLE Direct Submission + JOURNAL Submitted (22-FEB-1996) Biology, Yale University, New Haven, CT + 06520, USA + FEATURES Location/Qualifiers + source 1..5028 + /organism="Saccharomyces cerevisiae" + /mol_type="genomic DNA" + /db_xref="taxon:4932" + /chromosome="IX" + mRNA <1..>206 + /product="TCP1-beta" + CDS <1..206 + /codon_start=3 + /product="TCP1-beta" + /protein_id="AAA98665.1" + /translation="SSIYNGISTSGLDLNNGTIADMRQLGIVESYKLKRAVVSSASEAA + EVLLRVDNIIRARPRTANRQHM" + gene <687..>3158 + /gene="AXL2" + mRNA <687..>3158 + /gene="AXL2" + /product="Axl2p" + CDS 687..3158 + /gene="AXL2" + /note="plasma membrane glycoprotein" + /codon_start=1 + /product="Axl2p" + /protein_id="AAA98666.1" + /translation="MTQLQISLLLTATISLLHLVVATPYEAYPIGKQYPPVARVNESFT + FQISNDTYKSSVDKTAQITYNCFDLPSWLSFDSSSRTFSGEPSSDLLSDANTTLYFNVI + LEGTDSADSTSLNNTYQFVVTNRPSISLSSDFNLLALLKNYGYTNGKNALKLDPNEVFN + VTFDRSMFTNEESIVSYYGRSQLYNAPLPNWLFFDSGELKFTGTAPVINSAIAPETSYS + FVIIATDIEGFSAVEVEFELVIGAHQLTTSIQNSLIINVTDTGNVSYDLPLNYVYLDDD + PISSDKLGSINLLDAPDWVALDNATISGSVPDELLGKNSNPANFSVSIYDTYGDVIYFN + FEVVSTTDLFAISSLPNINATRGEWFSYYFLPSQFTDYVNTNVSLEFTNSSQDHDWVKF + QSSNLTLAGEVPKNFDKLSLGLKANQGSQSQELYFNIIGMDSKITHSNHSANATSTRSS + HHSTSTSSYTSSTYTAKISSTSAAATSSAPAALPAANKTSSHNKKAVAIACGVAIPLGV + ILVALICFLIFWRRRRENPDDENLPHAISGPDLNNPANKPNQENATPLNNPFDDDASSY + DDTSIARRLAALNTLKLDNHSATESDISSVDEKRDSLSGMNTYNDQFQSQSKEELLAKP + PVQPPESPFFDPQNRSSSVYMDSEPAVNKSWRYTGNLSPVSDIVRDSYGSQKTVDTEKL + FDLEAPEKEKRTSRDVTMSSLDPWNSNISPSPVRKSVTPSPYNVTKHRNRHLQNIQDSQ + SGKNGITPTTMSTSSSDDFVPVKDGENFCWVHSMEPDRRPSKKRLVDFSNKSNVNVGQV + KDIHGRIPEML" + gene complement(<3300..>4037) + /gene="REV7" + mRNA complement(<3300..>4037) + /gene="REV7" + /product="Rev7p" + CDS complement(3300..4037) + /gene="REV7" + /codon_start=1 + /product="Rev7p" + /protein_id="AAA98667.1" + /translation="MNRWVEKWLRVYLKCYINLILFYRNVYPPQSFDYTTYQSFNLPQF + VPINRHPALIDYIEELILDVLSKLTHVYRFSICIINKKNDLCIEKYVLDFSELQHVDKD + DQIITETEVFDEFRSSLNSLIMHLEKLPKVNDDTITFEAVINAIELELGHKLDRNRRVD + SLEEKAEIERDSNWVKCQEDENLPDNNGFQPPKIKLTSLVGSDVGPLIIHQFSEKLISG + DDKILNGVYSQYEEGESIFGSLF" + ORIGIN + 1 gatcctccat atacaacggt atctccacct caggtttaga tctcaacaac ggaaccattg + 61 ccgacatgag acagttaggt atcgtcgaga gttacaagct aaaacgagca gtagtcagct + 121 ctgcatctga agccgctgaa gttctactaa gggtggataa catcatccgt gcaagaccaa + 181 gaaccgccaa tagacaacat atgtaacata tttaggatat acctcgaaaa taataaaccg + 241 ccacactgtc attattataa ttagaaacag aacgcaaaaa ttatccacta tataattcaa + 301 agacgcgaaa aaaaaagaac aacgcgtcat agaacttttg gcaattcgcg tcacaaataa + 361 attttggcaa cttatgtttc ctcttcgagc agtactcgag ccctgtctca agaatgtaat + 421 aatacccatc gtaggtatgg ttaaagatag catctccaca acctcaaagc tccttgccga + 481 gagtcgccct cctttgtcga gtaattttca cttttcatat gagaacttat tttcttattc + 541 tttactctca catcctgtag tgattgacac tgcaacagcc accatcacta gaagaacaga + 601 acaattactt aatagaaaaa ttatatcttc ctcgaaacga tttcctgctt ccaacatcta + 661 cgtatatcaa gaagcattca cttaccatga cacagcttca gatttcatta ttgctgacag + 721 ctactatatc actactccat ctagtagtgg ccacgcccta tgaggcatat cctatcggaa + 781 aacaataccc cccagtggca agagtcaatg aatcgtttac atttcaaatt tccaatgata + 841 cctataaatc gtctgtagac aagacagctc aaataacata caattgcttc gacttaccga + 901 gctggctttc gtttgactct agttctagaa cgttctcagg tgaaccttct tctgacttac + 961 tatctgatgc gaacaccacg ttgtatttca atgtaatact cgagggtacg gactctgccg + 1021 acagcacgtc tttgaacaat acataccaat ttgttgttac aaaccgtcca tccatctcgc + 1081 tatcgtcaga tttcaatcta ttggcgttgt taaaaaacta tggttatact aacggcaaaa + 1141 acgctctgaa actagatcct aatgaagtct tcaacgtgac ttttgaccgt tcaatgttca + 1201 ctaacgaaga atccattgtg tcgtattacg gacgttctca gttgtataat gcgccgttac + 1261 ccaattggct gttcttcgat tctggcgagt tgaagtttac tgggacggca ccggtgataa + 1321 actcggcgat tgctccagaa acaagctaca gttttgtcat catcgctaca gacattgaag + 1381 gattttctgc cgttgaggta gaattcgaat tagtcatcgg ggctcaccag ttaactacct + 1441 ctattcaaaa tagtttgata atcaacgtta ctgacacagg taacgtttca tatgacttac + 1501 ctctaaacta tgtttatctc gatgacgatc ctatttcttc tgataaattg ggttctataa + 1561 acttattgga tgctccagac tgggtggcat tagataatgc taccatttcc gggtctgtcc + 1621 cagatgaatt actcggtaag aactccaatc ctgccaattt ttctgtgtcc atttatgata + 1681 cttatggtga tgtgatttat ttcaacttcg aagttgtctc cacaacggat ttgtttgcca + 1741 ttagttctct tcccaatatt aacgctacaa ggggtgaatg gttctcctac tattttttgc + 1801 cttctcagtt tacagactac gtgaatacaa acgtttcatt agagtttact aattcaagcc + 1861 aagaccatga ctgggtgaaa ttccaatcat ctaatttaac attagctgga gaagtgccca + 1921 agaatttcga caagctttca ttaggtttga aagcgaacca aggttcacaa tctcaagagc + 1981 tatattttaa catcattggc atggattcaa agataactca ctcaaaccac agtgcgaatg + 2041 caacgtccac aagaagttct caccactcca cctcaacaag ttcttacaca tcttctactt + 2101 acactgcaaa aatttcttct acctccgctg ctgctacttc ttctgctcca gcagcgctgc + 2161 cagcagccaa taaaacttca tctcacaata aaaaagcagt agcaattgcg tgcggtgttg + 2221 ctatcccatt aggcgttatc ctagtagctc tcatttgctt cctaatattc tggagacgca + 2281 gaagggaaaa tccagacgat gaaaacttac cgcatgctat tagtggacct gatttgaata + 2341 atcctgcaaa taaaccaaat caagaaaacg ctacaccttt gaacaacccc tttgatgatg + 2401 atgcttcctc gtacgatgat acttcaatag caagaagatt ggctgctttg aacactttga + 2461 aattggataa ccactctgcc actgaatctg atatttccag cgtggatgaa aagagagatt + 2521 ctctatcagg tatgaataca tacaatgatc agttccaatc ccaaagtaaa gaagaattat + 2581 tagcaaaacc cccagtacag cctccagaga gcccgttctt tgacccacag aataggtctt + 2641 cttctgtgta tatggatagt gaaccagcag taaataaatc ctggcgatat actggcaacc + 2701 tgtcaccagt ctctgatatt gtcagagaca gttacggatc acaaaaaact gttgatacag + 2761 aaaaactttt cgatttagaa gcaccagaga aggaaaaacg tacgtcaagg gatgtcacta + 2821 tgtcttcact ggacccttgg aacagcaata ttagcccttc tcccgtaaga aaatcagtaa + 2881 caccatcacc atataacgta acgaagcatc gtaaccgcca cttacaaaat attcaagact + 2941 ctcaaagcgg taaaaacgga atcactccca caacaatgtc aacttcatct tctgacgatt + 3001 ttgttccggt taaagatggt gaaaattttt gctgggtcca tagcatggaa ccagacagaa + 3061 gaccaagtaa gaaaaggtta gtagattttt caaataagag taatgtcaat gttggtcaag + 3121 ttaaggacat tcacggacgc atcccagaaa tgctgtgatt atacgcaacg atattttgct + 3181 taattttatt ttcctgtttt attttttatt agtggtttac agatacccta tattttattt + 3241 agtttttata cttagagaca tttaatttta attccattct tcaaatttca tttttgcact + 3301 taaaacaaag atccaaaaat gctctcgccc tcttcatatt gagaatacac tccattcaaa + 3361 attttgtcgt caccgctgat taatttttca ctaaactgat gaataatcaa aggccccacg + 3421 tcagaaccga ctaaagaagt gagttttatt ttaggaggtt gaaaaccatt attgtctggt + 3481 aaattttcat cttcttgaca tttaacccag tttgaatccc tttcaatttc tgctttttcc + 3541 tccaaactat cgaccctcct gtttctgtcc aacttatgtc ctagttccaa ttcgatcgca + 3601 ttaataactg cttcaaatgt tattgtgtca tcgttgactt taggtaattt ctccaaatgc + 3661 ataatcaaac tatttaagga agatcggaat tcgtcgaaca cttcagtttc cgtaatgatc + 3721 tgatcgtctt tatccacatg ttgtaattca ctaaaatcta aaacgtattt ttcaatgcat + 3781 aaatcgttct ttttattaat aatgcagatg gaaaatctgt aaacgtgcgt taatttagaa + 3841 agaacatcca gtataagttc ttctatatag tcaattaaag caggatgcct attaatggga + 3901 acgaactgcg gcaagttgaa tgactggtaa gtagtgtagt cgaatgactg aggtgggtat + 3961 acatttctat aaaataaaat caaattaatg tagcatttta agtataccct cagccacttc + 4021 tctacccatc tattcataaa gctgacgcaa cgattactat tttttttttc ttcttggatc + 4081 tcagtcgtcg caaaaacgta taccttcttt ttccgacctt ttttttagct ttctggaaaa + 4141 gtttatatta gttaaacagg gtctagtctt agtgtgaaag ctagtggttt cgattgactg + 4201 atattaagaa agtggaaatt aaattagtag tgtagacgta tatgcatatg tatttctcgc + 4261 ctgtttatgt ttctacgtac ttttgattta tagcaagggg aaaagaaata catactattt + 4321 tttggtaaag gtgaaagcat aatgtaaaag ctagaataaa atggacgaaa taaagagagg + 4381 cttagttcat cttttttcca aaaagcaccc aatgataata actaaaatga aaaggatttg + 4441 ccatctgtca gcaacatcag ttgtgtgagc aataataaaa tcatcacctc cgttgccttt + 4501 agcgcgtttg tcgtttgtat cttccgtaat tttagtctta tcaatgggaa tcataaattt + 4561 tccaatgaat tagcaatttc gtccaattct ttttgagctt cttcatattt gctttggaat + 4621 tcttcgcact tcttttccca ttcatctctt tcttcttcca aagcaacgat ccttctaccc + 4681 atttgctcag agttcaaatc ggcctctttc agtttatcca ttgcttcctt cagtttggct + 4741 tcactgtctt ctagctgttg ttctagatcc tggtttttct tggtgtagtt ctcattatta + 4801 gatctcaagt tattggagtc ttcagccaat tgctttgtat cagacaattg actctctaac + 4861 ttctccactt cactgtcgag ttgctcgttt ttagcggaca aagatttaat ctcgttttct + 4921 ttttcagtgt tagattgctc taattctttg agctgttctc tcagctcctc atatttttct + 4981 tgccatgact cagattctaa ttttaagcta ttcaatttct ctttgatc + // + + + +Now, you can work with the sequence record using pydna, using the `Dseqrecord` class. `Dseqrecord` provides ways to highlight regions of interest on the sequence, adding new features to the record, removing features, and creating new `Dseqrecord` objects to store and export your changes. Please refer to the `Dseq_Features` notebook for more information. + +## Importing Sequences from Strings + +`parse` also allows sequences to be read from a string alone. This could be useful to read FASTA sequences obtained from GenBank APIs. + + +```python +from pydna.parsers import parse + +my_record = parse( +''' +>lcl|U49845.1_cds_AAA98667.1_3 [gene=REV7] [protein=Rev7p] [protein_id=AAA98667.1] [location=complement(3300..4037)] [gbkey=CDS] +ATGAATAGATGGGTAGAGAAGTGGCTGAGGGTATACTTAAAATGCTACATTAATTTGATTTTATTTTATA +GAAATGTATACCCACCTCAGTCATTCGACTACACTACTTACCAGTCATTCAACTTGCCGCAGTTCGTTCC +CATTAATAGGCATCCTGCTTTAATTGACTATATAGAAGAACTTATACTGGATGTTCTTTCTAAATTAACG +CACGTTTACAGATTTTCCATCTGCATTATTAATAAAAAGAACGATTTATGCATTGAAAAATACGTTTTAG +ATTTTAGTGAATTACAACATGTGGATAAAGACGATCAGATCATTACGGAAACTGAAGTGTTCGACGAATT +CCGATCTTCCTTAAATAGTTTGATTATGCATTTGGAGAAATTACCTAAAGTCAACGATGACACAATAACA +TTTGAAGCAGTTATTAATGCGATCGAATTGGAACTAGGACATAAGTTGGACAGAAACAGGAGGGTCGATA +GTTTGGAGGAAAAAGCAGAAATTGAAAGGGATTCAAACTGGGTTAAATGTCAAGAAGATGAAAATTTACC +AGACAATAATGGTTTTCAACCTCCTAAAATAAAACTCACTTCTTTAGTCGGTTCTGACGTGGGGCCTTTG +ATTATTCATCAGTTTAGTGAAAAATTAATCAGCGGTGACGACAAAATTTTGAATGGAGTGTATTCTCAAT +ATGAAGAGGGCGAGAGCATTTTTGGATCTTTGTTTTAA +''' +) +print(my_record[0].format("fasta")) +``` + + >lcl|U49845.1_cds_AAA98667.1_3 [gene=REV7] [protein=Rev7p] [protein_id=AAA98667.1] [location=complement(3300..4037)] [gbkey=CDS] + ATGAATAGATGGGTAGAGAAGTGGCTGAGGGTATACTTAAAATGCTACATTAATTTGATT + TTATTTTATAGAAATGTATACCCACCTCAGTCATTCGACTACACTACTTACCAGTCATTC + AACTTGCCGCAGTTCGTTCCCATTAATAGGCATCCTGCTTTAATTGACTATATAGAAGAA + CTTATACTGGATGTTCTTTCTAAATTAACGCACGTTTACAGATTTTCCATCTGCATTATT + AATAAAAAGAACGATTTATGCATTGAAAAATACGTTTTAGATTTTAGTGAATTACAACAT + GTGGATAAAGACGATCAGATCATTACGGAAACTGAAGTGTTCGACGAATTCCGATCTTCC + TTAAATAGTTTGATTATGCATTTGGAGAAATTACCTAAAGTCAACGATGACACAATAACA + TTTGAAGCAGTTATTAATGCGATCGAATTGGAACTAGGACATAAGTTGGACAGAAACAGG + AGGGTCGATAGTTTGGAGGAAAAAGCAGAAATTGAAAGGGATTCAAACTGGGTTAAATGT + CAAGAAGATGAAAATTTACCAGACAATAATGGTTTTCAACCTCCTAAAATAAAACTCACT + TCTTTAGTCGGTTCTGACGTGGGGCCTTTGATTATTCATCAGTTTAGTGAAAAATTAATC + AGCGGTGACGACAAAATTTTGAATGGAGTGTATTCTCAATATGAAGAGGGCGAGAGCATT + TTTGGATCTTTGTTTTAA + + +## Extra info + +Note that pydna's `parse` guesses whether the argument passed is a file path or a string, and also guesses the file type based on the content, so it can give unexpected behaviour if your files are not well formatted. To have more control over the parsing of sequences, you can use biopython's `parse` from `Bio.SeqIO`, and then instantiate a `Dseqrecord` from the biopython's `SeqRecord` + + +```python +from Bio.SeqIO import parse as seqio_parse +from pydna.dseqrecord import Dseqrecord + +file_path = './U49845.gb' + +# Extract the first Seqrecord of the SeqIO.parse iterator +seq_record = next(seqio_parse(file_path, 'genbank')) + +# This is how circularity is stored in biopython's seqrecord +is_circular = 'topology' in seq_record.annotations.keys() and seq_record.annotations['topology'] == 'circular' + +# Convert into Dseqrecord +dseq_record = Dseqrecord(seq_record, circular=is_circular) + +dseq_record +``` + + + + + Dseqrecord(-5028) + + diff --git a/_sources/markdown_notebooks/PCR.md.txt b/_sources/markdown_notebooks/PCR.md.txt new file mode 100644 index 00000000..6dde40a0 --- /dev/null +++ b/_sources/markdown_notebooks/PCR.md.txt @@ -0,0 +1,269 @@ +# How to Perform a Polymerase Chain Reaction (PCR) + +> Visit the full library documentation [here](https://bjornfjohansson.github.io/pydna/) + +This page walks you through how to perform a PCR, and design PCR primers, using `pydna`. A PCR amplifies a specific stretch of DNA defined by the primers, and it is critical to ensure primer binding specificity and appropriate primer melting temperature (tm) through careful design. `pydna` provides tools for quick modelling of PCR to check for correct PCR products, and methods for calculating tm and primer design, as performed in other popular web servcies (e.g Primer3Plus). + +## Modelling PCR with Known Primers + +To perform PCR, `pydna` provides the `anneal` class and the `pcr` method to quickly generate expected primer products, on a `Dseqrecord` object. The `pcr` method needs only the forward and reverse primers, and the sequence. The primers must be passed from the 5' to the 3' end, following biological convention. More information on `Dseqrecord` and importing DNA sequences can be found in the other guide pages. + +The following example uses a 300+ bp custom sample circular DNA, containing an example gene that we would like to clone. 18 bp forward and reverse primers have been provided. + + + Open In Colab + + + +```python +# Install pydna (only when running on Colab) +import sys +if 'google.colab' in sys.modules: + %%capture + # Install the current development version of pydna (comment to install pip version) + !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn + # Install pip version instead (uncomment to install) + # !pip install pydna + +``` + + +```python +from pydna.amplify import pcr +from pydna.dseqrecord import Dseqrecord +from pydna.parsers import parse + +#Importing GenBank file containing sample sequence +path = "./sample_seq.gb" +record = parse(path)[0] + +#Defining forward and reverse primers +fwd_primer = "ATTCCTGCAGAGTACATC" +rvs_primer = "ACCATCCGAAGATATCTT" + +#Performing PCR +pcr_product = pcr(fwd_primer, rvs_primer, record) + +#Printing results +pcr_product.format("gb") +``` + + + + + LOCUS 45bp_PCR_prod 45 bp DNA linear UNK 01-JAN-1980 + DEFINITION pcr_product_description_description. + ACCESSION 45bp + VERSION 45bp + KEYWORDS . + SOURCE . + ORGANISM . + . + FEATURES Location/Qualifiers + gene 1..45 + /label="example_gene" + primer_bind 1..18 + /label="name" + /PCR_conditions="primer sequence:ATTCCTGCAGAGTACATC" + /ApEinfo_fwdcolor="#baffa3" + /ApEinfo_revcolor="#ffbaba" + primer_bind complement(28..45) + /label="name" + /PCR_conditions="primer sequence:ACCATCCGAAGATATCTT" + /ApEinfo_fwdcolor="#baffa3" + /ApEinfo_revcolor="#ffbaba" + ORIGIN + 1 attcctgcag agtacatcaa ttctatgaag atatcttcgg atggt + // + + + +The `pcr` method then returns a `Amplicon` class object (to model a PCR product), a subclass of `Dseqrecord` with some extra methods (e.g `.figure`. See "Other ways of visualising the PCR products" section below). All the features inside the PCR product has been retained. Note how the example gene has been retained as a feature in `pcr_product`. In addition, two new features have been added to the record to indicate the forward and reverse primer binding regions. + +`pydna` also allows modelling for PCR with extra bases on the 5' end of primers. This functionality is useful for modelling molecular cloning with multiple steps, where you might want to add different restriction sites to PCR products and ensure that the right sequences have been replicated. + +For instance, to make sure that I can add a HindIII restriction site (AAGCTT) at the end of my `example_gene` without accidental hybridisation with other parts of the circular sequence, I can perform PCR in the `pydna` package like so. + + +```python +fwd_primer = "AAGCTTATTCCTGCAGAGTACATC" +rvs_primer = "AAGCTTACCATCCGAAGATATCTT" + +#Performing PCR +pcr_product_HindIII = pcr(fwd_primer, rvs_primer, record) + +#Printing results +pcr_product_HindIII.format("gb") +``` + + + + + LOCUS 57bp_PCR_prod 57 bp DNA linear UNK 01-JAN-1980 + DEFINITION pcr_product_description_description. + ACCESSION 57bp + VERSION 57bp + KEYWORDS . + SOURCE . + ORGANISM . + . + FEATURES Location/Qualifiers + primer_bind 1..21 + /label="name" + /PCR_conditions="primer sequence:AAGCTTATTCCTGCAGAGTACATC" + /ApEinfo_fwdcolor="#baffa3" + /ApEinfo_revcolor="#ffbaba" + gene 4..48 + /label="example_gene" + primer_bind complement(31..48) + /label="name" + /PCR_conditions="primer sequence:AAGCTTACCATCCGAAGATATCTT" + /ApEinfo_fwdcolor="#baffa3" + /ApEinfo_revcolor="#ffbaba" + ORIGIN + 1 aagcttattc ctgcagagta catcaattct atgaagatat cttcggatgg taagctt + // + + + +For more information on restriction digests and ligation, please refer to the Restriction and Ligation page. + +## Other ways of visualising the PCR products + +In addition to the normal `print` function and the `.format()` method (More information can be found in Dseq and Importing_Seqs pages, respectively), pcr products can also be visualized in other ways. + +We can check the sequence of the pcr products alone using the `.seq` attribute on a PCR product: + + +```python +print(pcr_product.seq) +``` + + ATTCCTGCAGAGTACATCAATTCTATGAAGATATCTTCGGATGGT + + +We can also visualize the pcr products as a figure, using the `.figure` method. + + +```python +print(pcr_product.figure()) +``` + + 5ATTCCTGCAGAGTACATC...AAGATATCTTCGGATGGT3 + |||||||||||||||||| + 3TTCTATAGAAGCCTACCA5 + 5ATTCCTGCAGAGTACATC3 + |||||||||||||||||| + 3TAAGGACGTCTCATGTAG...TTCTATAGAAGCCTACCA5 + + +# Designing Primers and Calculating Tm in pydna + +`pydna` also provides the `primer_design` method to design primer sequences based on the desired pcr product and the template sequence's melting temperature (Tm). The `primer_design` method can be imported from the `pydna.design` module, and needs the user to supply the PCR template sequence (as a `Dseqrecord` object) and the Tm. The template sequence should be given as the first parameter, and the Tm give through the `target_tm=` argument, as demonstrated below. If you have no specific Tm in mind, the method uses the default Tm of 55 degrees celcius. + +Note that in the following example below, I used zero-based indexing on the `Dseqrecord` to find the sequence of my example gene, of which I would like to clone via PCR. Please refer to the `Dseq` page for more information on how to index a sequence. + + + +```python +from pydna.design import primer_design + +#Designing the primers +primers = primer_design(record[6:51], target_tm=50.0) + +#Printing the output +print(primers.format("gb")) +``` + + LOCUS example_gene 45 bp DNA linear UNK 01-JAN-1980 + DEFINITION pcr_product_f45 example_gene_r45 example_gene. + ACCESSION example_gene + VERSION example_gene + KEYWORDS . + SOURCE . + ORGANISM . + . + FEATURES Location/Qualifiers + gene 1..45 + /label="example_gene" + primer_bind 1..16 + /label="f45" + /PCR_conditions="primer sequence:ATTCCTGCAGAGTACA" + /ApEinfo_fwdcolor="#baffa3" + /ApEinfo_revcolor="#ffbaba" + primer_bind complement(29..45) + /label="r45" + /PCR_conditions="primer sequence:ACCATCCGAAGATATCT" + /ApEinfo_fwdcolor="#baffa3" + /ApEinfo_revcolor="#ffbaba" + ORIGIN + 1 attcctgcag agtacatcaa ttctatgaag atatcttcgg atggt + // + + +The formula for primer design in `pydna` is based on the Tm formula from Rychlik et al (1990), found [here](http://www.ncbi.nlm.nih.gov/pubmed/2243783). Additional information on calculating Tm can be found in the "Calculating Tm" section below. + +The forward and reverse primer sequences are printed in the features list of the `Amplicon` object. Note how the feature representing the example gene is retained, as appropriate. + +If you already have a forward / reverse primer, `primer_design` also allows this information to be taken as arguments. `fp` specifies the forward primer, `rp` specifies the reverse primers. `fp` and `rp` can be should be given as `Primer` class objects, which should be imported from `pydna` too. + +For instance, if I already have a forward primer containing an EcoRI restriction site, and I aim to to generate a reverse primer of a similar Tm, I can apply the following code: + + +```python +from pydna.primer import Primer + +forward_primer = Primer("GAATTCATTCCTGCAGAGTACATCA", id="forward_primer") + +primers_sixfive = primer_design(record[6:51], fp = forward_primer) + +print(primers_sixfive.format("gb")) +``` + + LOCUS example_gene 51 bp DNA linear UNK 01-JAN-1980 + DEFINITION pcr_product_forward_primer example_gene_r45 example_gene. + ACCESSION example_gene + VERSION example_gene + KEYWORDS . + SOURCE . + ORGANISM . + . + FEATURES Location/Qualifiers + gene 1..45 + /label="example_gene" + primer_bind 1..19 + /label="f45" + /PCR_conditions="primer sequence:GAATTCATTCCTGCAGAGTACATCA" + /ApEinfo_fwdcolor="#baffa3" + /ApEinfo_revcolor="#ffbaba" + primer_bind complement(26..45) + /label="r45" + /PCR_conditions="primer sequence:ACCATCCGAAGATATCTTCA" + /ApEinfo_fwdcolor="#baffa3" + /ApEinfo_revcolor="#ffbaba" + ORIGIN + 1 gaattcattc ctgcagagta catcaattct atgaagatat cttcggatgg t + // + + +## Calculating Tm + +`pydna` comes with some functions to calculate Tms. The default function `tm_default` used is the previously mentioned one by Rychlik et al (1990), which takes a string as input. Another function derive from the Tm calculation adapted for primers using polymerases with a DNA binding domain (e.g Phusion polymerase). The default values for Tm calculation, including primer concentration, buffer strengths, and more, can also be modified through arguments in the `tm_default` method. Please refer to the `pydna.tm` module docstring for more information. An example is provided with a pair of primers; the temperature is given in degrees celcius. + + +```python +from pydna.tm import tm_default + +# Example Tm calculation for a pair of primers +primer_f = "ATTCCTGCAGAGTACATCA" +primer_r = "ACCATCCGAAGATATCTTCA" +tm_f = tm_default(primer_f) +tm_r = tm_default(primer_r) + +print(tm_f) +print(tm_r) +``` + + 55.901005046706075 + 55.841913263215304 + diff --git a/_sources/markdown_notebooks/Restrict_Ligate_Cloning.md.txt b/_sources/markdown_notebooks/Restrict_Ligate_Cloning.md.txt new file mode 100644 index 00000000..0ad73c3a --- /dev/null +++ b/_sources/markdown_notebooks/Restrict_Ligate_Cloning.md.txt @@ -0,0 +1,209 @@ +# Restriction and Ligation +> Visit the full library documentation [here](https://bjornfjohansson.github.io/pydna/) + +In this page, we explore how to use pydna to cut, ligate, circularise DNA sequences. pydna works in conjugation with the `Bio.Restriction` module to apply a vast variety of restriction enzymes for cutting, whose module documentations can be found [here](https://biopython.org/DIST/docs/cookbook/Restriction.html). + +## Cutting with one or more restriction enzymes + +Restriction enzymes recognise specific DNA sequences and cut them, leaving sticky ends or blunt ends. To cut a sequence using `pydna`, we can use the `cut` method on a `Dseqrecord` object. Here is an example showing how to use the `cut` method to genenrate EcoRI restriction digests. The record includes a 338bp circular sequence, with an example gene feature. + + + Open In Colab + + + +```python +# Install pydna (only when running on Colab) +import sys +if 'google.colab' in sys.modules: + %%capture + # Install the current development version of pydna (comment to install pip version) + !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn + # Install pip version instead (uncomment to install) + # !pip install pydna + +``` + + +```python +from pydna.dseqrecord import Dseqrecord +from pydna.parsers import parse +from Bio.Restriction import EcoRI + +# Create a Dseqrecord with your FASTA/GenBank file +path = "./sample_seq.gb" +record = parse(path)[0] + +# Cut with a single enzyme +cut_records = record.cut(EcoRI) + +# Display the resulting fragments +for frag in cut_records: + print(frag) +``` + + Dseqrecord + circular: False + size: 338 + ID: id + Name: name + Description: description + Number of features: 1 + /molecule_type=DNA + Dseq(-338) + AATTCTTC..TGTG + GAAG..ACACTTAA + + +The circular `Dseqrecord` is cut into a linear `Dseqrecord` object, since there is only one EcoRI recognition site. `Dseqrecord` also shows the 5' sticky end after cutting. + +The sequence can also be cut with multiple restriction enzymes, into multiple linear DNA sequences. We can simply import all the restriction enzymes, and use the cut method as normal. + + +```python +from Bio.Restriction import EcoRV + +# Cut with a multiple enzymes +multi_cut_records = record.cut(EcoRI, EcoRV) + +# Display the resulting fragments +for frag in multi_cut_records: + print() + print(frag) + print() +``` + + + Dseqrecord + circular: False + size: 51 + ID: id + Name: name + Description: description + Number of features: 0 + /molecule_type=DNA + Dseq(-51) + ATCT..TGTG + TAGA..ACACTTAA + + + Dseqrecord + circular: False + size: 214 + ID: id + Name: name + Description: description + Number of features: 0 + /molecule_type=DNA + Dseq(-214) + AATTCTTC..TGAT + GAAG..ACTA + + + Dseqrecord + circular: False + size: 73 + ID: id + Name: name + Description: description + Number of features: 0 + /molecule_type=DNA + Dseq(-73) + ATCT..AGAT + TAGA..TCTA + + + +There are two EcoRV recognition sites in `sample_seq`, and coupled with the one EcoRI recognition site, three DNA fragments are returned. Note how `Dseqrecord` returns the blunt end after EcoRV cuts. + +You can model any, and and number of, enzymes with the `cut` method and `Bio.Restriction` module. This makes `pydna` a quick and powerful method to plan your molecular cloning experiments, for instance to check the restriction digests of a 10kb plasmid with multiple enzymes. `cut` is also a method of the `Dseq` class, so `Dseq`s can be used as well. + +## Ligating fragments + +After cutting a DNA sequence, you can ligate the fragments back together in `pydna` using the `+` operator on `Dseqrecord` or `Dseq` objects. Ligation can occur via complementary sticky ends or blunt ends. For instance, we can select the first and second fragments from `multi_cut_records` via indexing, and then ligate sticky ends produced by EcoRI to make a single linear sequence. + + +```python +ligated_product = multi_cut_records[0] + multi_cut_records[1] +print(ligated_product) +``` + + Dseqrecord + circular: False + size: 261 + ID: id + Name: name + Description: description + Number of features: 0 + /molecule_type=DNA + Dseq(-261) + ATCT..TGAT + TAGA..ACTA + + +We can also join blunt ends in a similar way. Note that the sticky-ends must be a perfect match to join. If `+` ligation (or any other method, really) doesn't work, make sure that: + +1. you are indeed performing the operation on `Dseqrecord` objects, as opposed to other data types (e.g lists, strings, etc) +2. `Dseqrecord` and the correct enzyme name (with correct roman numeral spelling) has been imported. + +## Circularizing fragments + +To circularize a cut DNA sequence use the `looped` method, which returns a new sequence object. + +🚨🚨 **VERY IMPORTANT** 🚨🚨 `.looped()` method does not act in place, so a new variable should be created to store the new circularised sequence, as shown in the following example. + + +```python +circular_record = ligated_product.looped() + +print('is ligated_product circular?', ligated_product.circular) +print('is circular_record circular?', circular_record.circular) +print() + +print(circular_record) +``` + + is ligated_product circular? False + is circular_record circular? True + + Dseqrecord + circular: True + size: 261 + ID: id + Name: name + Description: description + Number of features: 0 + /molecule_type=DNA + Dseq(o261) + ATCT..TGAT + TAGA..ACTA + + +## Extra Notes: What happens to features when cutting/ligating? + +A feature is removed from a `Dseqrecord` if the features is truncated by the cut. For instance, the example_gene feature is removed from the record after cutting `record` with PstI, which has recognition site within example_gene. within the cutand if the feature is completely within the cut, it is retained. + + +```python +from Bio.Restriction import PstI + +cut_record2 = record.cut(PstI) + +print(cut_record2[0]) + +``` + + Dseqrecord + circular: False + size: 222 + ID: id + Name: name + Description: description + Number of features: 0 + /molecule_type=DNA + Dseq(-222) + GAGT..TAACTGCA + ACGTCTCA..ATTG + + +However, if a cut does not overlap with the feature, the feature is retained on the `Dseqrecord`. For instance, if we go back to the first example given by the EcoRI cut, example_gene has been retained after cutting. For more information on Features, please refer to the `Dseq_Feature` documentations. diff --git a/_sources/markdown_notebooks/readme_example.md.txt b/_sources/markdown_notebooks/readme_example.md.txt new file mode 100644 index 00000000..b0b71d46 --- /dev/null +++ b/_sources/markdown_notebooks/readme_example.md.txt @@ -0,0 +1,252 @@ +## README Example + +This notebook contains the example shown in the README file. + + + Open In Colab + + + +```python +# Install pydna (only when running on Colab) +import sys +if 'google.colab' in sys.modules: + %%capture + # Install the current development version of pydna (comment to install pip version) + !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn + # Install pip version instead (uncomment to install) + # !pip install pydna +``` + + +```python +from pydna.dseqrecord import Dseqrecord +# Let's create a DNA sequence record, and add a feature to it +dsr = Dseqrecord("ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAAT") +dsr.add_feature(x=0, y=60,type="gene", label="my_gene") # We add a feature to highlight the sequence as a gene +dsr.figure() + +``` + + + + + Dseqrecord(-60) + ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAAT + TACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTA + + + + +```python +# This is how it would look as a genbank file +print(dsr.format("genbank")) +``` + + LOCUS name 60 bp DNA linear UNK 01-JAN-1980 + DEFINITION description. + ACCESSION id + VERSION id + KEYWORDS . + SOURCE . + ORGANISM . + . + FEATURES Location/Qualifiers + misc 1..60 + /type="gene" + /label="my_gene" + ORIGIN + 1 atgcaaacag taatgatgga tgacattcaa agcactgatt ctattgctga aaaagataat + // + + + +```python +# Now let's design primers to amplify it +from pydna.design import primer_design +# limit is the minimum length of the primer, target_tm is the desired melting temperature of the primer +amplicon = primer_design(dsr, limit=13, target_tm=55) +# Let's print the primers, and a figure that shows where they align with the template sequence +print("forward primer:", amplicon.forward_primer.seq) +print("reverse primer:", amplicon.reverse_primer.seq) +amplicon.figure() +``` + + forward primer: ATGCAAACAGTAATGATGGA + reverse primer: ATTATCTTTTTCAGCAATAGAATCA + + + + + + 5ATGCAAACAGTAATGATGGA...TGATTCTATTGCTGAAAAAGATAAT3 + ||||||||||||||||||||||||| + 3ACTAAGATAACGACTTTTTCTATTA5 + 5ATGCAAACAGTAATGATGGA3 + |||||||||||||||||||| + 3TACGTTTGTCATTACTACCT...ACTAAGATAACGACTTTTTCTATTA5 + + + + +```python +# Let's say we don't want to just amplify it, but we want to add restriction sites to it! + +from pydna.amplify import pcr +# We add the restriction sites to the primers +forward_primer = "ccccGGATCC" + amplicon.forward_primer +reverse_primer = "ttttGGATCC" + amplicon.reverse_primer + +# We do the PCR +pcr_product = pcr(forward_primer, reverse_primer, dsr) +# The PCR product is of class `Amplicon`, a subclass of `Dseqrecord`. +# When doing a figure, it shows where primers anneal. +pcr_product.figure() +``` + + + + + 5ATGCAAACAGTAATGATGGA...TGATTCTATTGCTGAAAAAGATAAT3 + ||||||||||||||||||||||||| + 3ACTAAGATAACGACTTTTTCTATTACCTAGGtttt5 + 5ccccGGATCCATGCAAACAGTAATGATGGA3 + |||||||||||||||||||| + 3TACGTTTGTCATTACTACCT...ACTAAGATAACGACTTTTTCTATTA5 + + + + +```python +# If we want to see the sequence more clearly, we can turn it into a `Dseqrecord` +pcr_product = Dseqrecord(pcr_product) +pcr_product.figure() +``` + + + + + Dseqrecord(-80) + ccccGGATCCATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATGGATCCaaaa + ggggCCTAGGTACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTACCTAGGtttt + + + + +```python +from Bio.Restriction import BamHI # cuts GGATCC +# a, payload, c are the cut fragments +a, payload, c = pcr_product.cut (BamHI) +print(a.figure()) +print() +print (payload.figure()) +print() +print(c.figure()) + + +``` + + Dseqrecord(-9) + ccccG + ggggCCTAG + + Dseqrecord(-70) + GATCCATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATG + GTACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTACCTAG + + Dseqrecord(-9) + GATCCaaaa + Gtttt + + + +```python +# We create a circular vector to insert the amplicon into +vector = Dseqrecord("aatgtttttccctCCCGGGcaaaatAGATCTtgctatgcatcatcgatct", circular=True, name="vect") +vector.figure() +``` + + + + + Dseqrecord(o50) + aatgtttttccctCCCGGGcaaaatAGATCTtgctatgcatcatcgatct + ttacaaaaagggaGGGCCCgttttaTCTAGAacgatacgtagtagctaga + + + + +```python +from Bio.Restriction import BglII # cuts AGATCT +linear_vector_bgl = vector.cut(BglII)[0] # Linearize the vector at BglII (produces only one fragment) + +# Ligate the fragment of interest to the vector, and call looped() to circularize it +# synced is used to place the origin coordinate (0) in the same place for rec_vector and vector +rec_vector= (linear_vector_bgl + payload).looped().synced(vector) +rec_vector.figure() + +``` + + + + + Dseqrecord(o116) + aatgtttttccctCCCGGGcaaaatAGATCCATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATGGATCTtgctatgcatcatcgatct + ttacaaaaagggaGGGCCCgttttaTCTAGGTACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTACCTAGAacgatacgtagtagctaga + + + + +```python +# Let's simulate a Gibson assembly +from pydna.assembly import Assembly + +fragments = [ + Dseqrecord('aatgtttttccctCACTACGtgctatgcatcat', name="fragment_A"), + Dseqrecord('tgctatgcatcatCTATGGAcactctaataatg', name="fragment_B"), + Dseqrecord('cactctaataatgTTACATAaatgtttttccct', name="fragment_C"), +] + +# limit is the min. homology length between fragments in the assembly +asm = Assembly(fragments, limit=10) + +# From the assembly object, which can generate all possible products, get a circular +product, *rest = asm.assemble_circular() + +# We can print a figure that shows the overlaps between fragments +product.figure() + +``` + + + + + -|fragment_A|13 + | \/ + | /\ + | 13|fragment_B|13 + | \/ + | /\ + | 13|fragment_C|13 + | \/ + | /\ + | 13- + | | + -------------------------------------------- + + + + +```python +# Or show the final sequence: +Dseqrecord(product).figure() +``` + + + + + Dseqrecord(o60) + aatgtttttccctCACTACGtgctatgcatcatCTATGGAcactctaataatgTTACATA + ttacaaaaagggaGTGATGCacgatacgtagtaGATACCTgtgagattattacAATGTAT + + diff --git a/_sources/module_contents.rst.txt b/_sources/module_contents.rst.txt new file mode 100644 index 00000000..8311da7b --- /dev/null +++ b/_sources/module_contents.rst.txt @@ -0,0 +1,188 @@ +Module contents +=============== + +pydna +----------------- + +.. automodule:: pydna + :members: + :undoc-members: + :show-inheritance: + +pydna.dseq +----------------- + +.. automodule:: pydna.dseq + :members: + :undoc-members: + :show-inheritance: + +pydna.dseqrecord +----------------------- + +.. automodule:: pydna.dseqrecord + :members: + :undoc-members: + :show-inheritance: + +pydna.amplicon +--------------------- + +.. automodule:: pydna.amplicon + :members: + :undoc-members: + :show-inheritance: + +pydna.amplify +-------------------- + +.. automodule:: pydna.amplify + :members: + :undoc-members: + :show-inheritance: + +pydna.assembly +--------------------- + +.. automodule:: pydna.assembly + :members: + :undoc-members: + :show-inheritance: + +pydna.common_sub_strings +------------------------------- + +.. automodule:: pydna.common_sub_strings + :members: + :undoc-members: + :show-inheritance: + +pydna.contig +------------------- + +.. automodule:: pydna.contig + :members: + :undoc-members: + :show-inheritance: + +pydna.design +------------------- + +.. automodule:: pydna.design + :members: + :undoc-members: + :show-inheritance: + +pydna.download +--------------------- + +.. automodule:: pydna.download + :members: + :undoc-members: + :show-inheritance: + + + +pydna.editor +------------------- + +.. automodule:: pydna.editor + :members: + :undoc-members: + :show-inheritance: + +pydna.gel +---------------- + +.. automodule:: pydna.gel + :members: + :undoc-members: + :show-inheritance: + +pydna.genbank +-------------------- + +.. automodule:: pydna.genbank + :members: + :undoc-members: + :show-inheritance: + +pydna.genbankfile +------------------------ + +.. automodule:: pydna.genbankfile + :members: + :undoc-members: + :show-inheritance: + +pydna.genbankfixer +------------------------- + +.. automodule:: pydna.genbankfixer + :members: + :undoc-members: + :show-inheritance: + +pydna.genbankrecord +-------------------------- + +.. automodule:: pydna.genbankrecord + :members: + :undoc-members: + :show-inheritance: + +pydna.myprimers +---------------------- + +.. automodule:: pydna.myprimers + :members: + :undoc-members: + :show-inheritance: + +pydna.parsers +-------------------- + +.. automodule:: pydna.parsers + :members: + :undoc-members: + :show-inheritance: + +pydna.primer +------------------- + +.. automodule:: pydna.primer + :members: + :undoc-members: + :show-inheritance: + +pydna.readers +-------------------- + +.. automodule:: pydna.readers + :members: + :undoc-members: + :show-inheritance: + +pydna.seqrecord +---------------------- + +.. automodule:: pydna.seqrecord + :members: + :undoc-members: + :show-inheritance: + +pydna.tm +--------------- + +.. automodule:: pydna.tm + :members: + :undoc-members: + :show-inheritance: + +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/custom.css b/_static/custom.css new file mode 100644 index 00000000..a77890ee --- /dev/null +++ b/_static/custom.css @@ -0,0 +1,5 @@ +/* Make output cells that are too long scrollable */ +.highlight-none pre { + max-height: 300px; + overflow-y: auto; +} 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 0a57c56b..b3e83ea4 100644 --- a/_static/documentation_options.js +++ b/_static/documentation_options.js @@ -1,5 +1,6 @@ -const DOCUMENTATION_OPTIONS = { - VERSION: '0.0.0.post1+0f15ccd', +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/language_data.js b/_static/language_data.js index 367b8ed8..250f5665 100644 --- a/_static/language_data.js +++ b/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :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. * */ @@ -13,7 +13,7 @@ var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; -/* Non-minified version is copied as a separate JS file, if available */ +/* Non-minified version is copied as a separate JS file, is available */ /** * Porter Stemmer diff --git a/_static/searchtools.js b/_static/searchtools.js index b08d58c9..97d56a74 100644 --- a/_static/searchtools.js +++ b/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :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. * */ @@ -57,12 +57,12 @@ const _removeChildren = (element) => { 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 new file mode 100644 index 00000000..be576deb --- /dev/null +++ b/example_gallery.html @@ -0,0 +1,116 @@ + + + + + + + + + Example gallery — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html index c38815f4..275349e1 100644 --- a/genindex.html +++ b/genindex.html @@ -1,20 +1,21 @@ - + - Index — pydna 0.0.0.post1+0f15ccd documentation + Index — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -39,8 +40,15 @@
@@ -92,41 +100,41 @@

Index

A

@@ -134,7 +142,7 @@

A

B

@@ -142,60 +150,60 @@

B

C

@@ -204,25 +212,25 @@

C

D

@@ -230,33 +238,33 @@

D

E

@@ -264,66 +272,66 @@

E

F

@@ -332,33 +340,33 @@

F

G

@@ -366,18 +374,18 @@

G

I

@@ -386,38 +394,38 @@

I

L

@@ -426,68 +434,68 @@

L

M

@@ -495,23 +503,23 @@

M

N

@@ -519,35 +527,35 @@

N

O

@@ -555,95 +563,95 @@

O

P

@@ -652,103 +660,103 @@

P

pydna.dseqrecord
  • pydna.editor
  • pydna.gel
  • pydna.genbank
  • pydna.genbankfile
  • pydna.genbankfixer
  • pydna.genbankrecord
  • pydna.myprimers
  • pydna.parsers
  • pydna.primer
  • pydna.readers
  • pydna.seqrecord
  • pydna.tm
  • 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.myprimers.PrimerList method)
  • @@ -756,11 +764,11 @@

    P

    Q

    @@ -768,73 +776,73 @@

    Q

    R

    @@ -842,57 +850,57 @@

    R

    S

    @@ -900,70 +908,70 @@

    S

    T

    @@ -972,20 +980,20 @@

    T

    U

    @@ -994,13 +1002,13 @@

    U

    W

    diff --git a/getting_started.html b/getting_started.html new file mode 100644 index 00000000..2ec78863 --- /dev/null +++ b/getting_started.html @@ -0,0 +1,124 @@ + + + + + + + + + Getting started — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Getting started

    +

    The best way to get started is to follow our tutorial notebooks, you can find them in the +repository folder docs/notebooks and +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:

    +
      +
    1. Dseq: Basic introduction to how sequences are handled in pydna.

    2. +
    +

    etc.

    +
    + + +
    +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/index.html b/index.html index d1ac1953..56d527dc 100644 --- a/index.html +++ b/index.html @@ -1,24 +1,26 @@ - + - Welcome to pydna’s documentation! — pydna 0.0.0.post1+0f15ccd documentation + Pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + - + + @@ -40,359 +42,15 @@
    @@ -407,7 +65,7 @@
    • - +
    • View page source
    • @@ -417,4608 +75,44 @@
      -
      -

      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!

      +

      Planning genetic constructs with many parts and assembly steps, such as recombinant +metabolic pathways :petri_dish:, are often difficult to properly document as is evident from the poor +state of documentation in the scientific literature :radioactive:.

      +

      The pydna python package provide a human-readable formal descriptions of :dna: cloning and genetic assembly +strategies in Python :snake: which allow for simulation and verification. +Pydna can be used as executable documentation for cloning.

      +

      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 new file mode 100644 index 00000000..4ed16c5a --- /dev/null +++ b/installation.html @@ -0,0 +1,220 @@ + + + + + + + + + Installation — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + +
      + + +
      + +
      +
      +
      + +
      +
      +
      +
      + +
      +

      Installation

      +

      By default, pydna is installed with minimal dependencies, but there are optional dependencies for additional functionality.

      +
      +Click here to see optional dependencies +
      +

      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.

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

      Dependency

      Function in pydna

      pyperclip

      copy sequence to clipboard

      +
      +
      +

      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.

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

      Dependency

      Function in pydna

      pyparsing

      fix corrupt Genbank files with pydna.genbankfixer

      requests

      download sequences with pydna.download

      +
      +
      +

      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

      +

      Scipy, matplotlib and pillow (PIL) enable the generation of gel images. Numpy is also +needed, but usually installed as a dependency of biopython.

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

      Dependency

      Function in pydna

      scipy

      gel simulation with pydna.gel

      matplotlib

      pillow

      +
      +
      +
      +

      Installing with pip 🐍

      +
      # use the `--pre` flag to get the latest version of pydna.
      +pip install --pre --upgrade pydna
      +
      +# to install the optional dependencies, you can use the following command:
      +pip install --pre --upgrade pydna[clipboard,download,express,gel]
      +
      +
      +

      Remove options inside the square brackets as required, but be sure not to leave spaces as pip will not recognize the options. See below under “Optional dependencies”.

      +
      +
      +

      Installing with poetry 🧙‍♂️

      +

      If your project uses poetry to manage dependencies, you can install pydna with the following commands:

      +
      # Basic installation
      +poetry add pydna
      +# With optional dependencies (ommit the options you don't want)
      +poetry add pydna --extras "clipboard download express gel"
      +
      +# If you already have it installed and you want to add or remove optional
      +# dependencies, you have to uninstall and install again
      +poetry remove pydna
      +poetry add pydna --extras "express gel"
      +
      +
      +
      +
      + + +
      +
    + +
    +
    + +
    + + + + \ No newline at end of file diff --git a/markdown_notebooks/CRISPR.html b/markdown_notebooks/CRISPR.html new file mode 100644 index 00000000..9145430e --- /dev/null +++ b/markdown_notebooks/CRISPR.html @@ -0,0 +1,176 @@ + + + + + + + + + How to Model CRISPR-Cas9 Experiments in pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    How to Model CRISPR-Cas9 Experiments in pydna

    +
    +

    Visit the full library documentation here

    +
    +

    The pydna package can simulate CRISPR-Cas9 editing, which allows one to cut DNA sequences at specific sites using guide RNAs (gRNAs) that direct the Cas9 protein. This page will guide you through the process of using the pydna.crispr module to model a CRISPR-Cas9 cut on a DNA sequence.

    +

    The pydna.crispr module contains the cas9 class to simulate the biological activites of the Cas9 protein and the guideRNA, which should be imported. In addtion, the Dseqrecord class has also been imported to generate an example target_sequence.

    + + Open In Colab + +
    # Install pydna (only when running on Colab)
    +import sys
    +if 'google.colab' in sys.modules:
    +    %%capture
    +    # Install the current development version of pydna (comment to install pip version)
    +    !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn
    +    # Install pip version instead (uncomment to install)
    +    # !pip install pydna
    +
    +
    +
    +
    from pydna.crispr import cas9, protospacer
    +from pydna.dseqrecord import Dseqrecord
    +
    +
    +

    The target sequence and guideRNA (gRNA) sequence needs to be generated. Note the the sequence can be passed as a Dseqrecord object.

    +
    from pydna.dseqrecord import Dseqrecord
    +from pydna.crispr import cas9, protospacer
    +
    +#         <----protospacer---><-------scaffold----------------->
    +guide =  "GTTACTTTACCCGACGTCCCgttttagagctagaaatagcaagttaaaataagg"
    +target = "GTTACTTTACCCGACGTCCCaGG"
    +#                             <->
    +#                             PAM
    +
    +# Create an enzyme object with the protospacer
    +enzyme = cas9("GTTACTTTACCCGACGTCCC")
    +
    +target_dseq = Dseqrecord(target)
    +
    +# Cut using the enzyme
    +print('cutting with enzyme 1:', target_dseq.cut(enzyme))
    +
    +
    +# Get the protospacer from the full gRNA sequence
    +gRNA_protospacers = protospacer(Dseqrecord(guide), cas=cas9)
    +# Print the protospacer (it's a list because often plasmids contain multiple gRNAs)
    +print('protospacer:', gRNA_protospacers[0])
    +gRNA_protospacer = gRNA_protospacers[0]
    +
    +# Create an enzyme from the protospacer
    +enzyme2 = cas9(gRNA_protospacer)
    +
    +# Simulate the cut
    +print('cutting with enzyme 2:', target_dseq.cut(enzyme2))
    +
    +
    +# Note that without the PAM, the cut will not be made.
    +
    +target_noPAM_dseq = Dseqrecord("GTTACTTTACCCGACGTCCCaaa")
    +print("cutting with no PAM in target:", target_noPAM_dseq.cut(enzyme2))
    +
    +
    +
    cutting with enzyme 1: (Dseqrecord(-17), Dseqrecord(-6))
    +protospacer: GTTACTTTACCCGACGTCCC
    +cutting with enzyme 2: (Dseqrecord(-17), Dseqrecord(-6))
    +cutting with no PAM in target: ()
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    +

    © 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/Dseq.html b/markdown_notebooks/Dseq.html new file mode 100644 index 00000000..1dd45224 --- /dev/null +++ b/markdown_notebooks/Dseq.html @@ -0,0 +1,455 @@ + + + + + + + + + Representing sequences in pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Representing sequences in pydna

    +
    +

    Visit the full library documentation here

    +
    + + Open In Colab + +
    # Install pydna (only when running on Colab)
    +import sys
    +if 'google.colab' in sys.modules:
    +    %%capture
    +    # Install the current development version of pydna (comment to install pip version)
    +    !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn
    +    # Install pip version instead (uncomment to install)
    +    # !pip install pydna
    +
    +
    +
    +

    Pydna contains classes to represent double stranded DNA sequences that can:

    +
      +
    • Be linear

    • +
    • Be circular

    • +
    • Contain overhangs (sticky ends).

    • +
    +

    These sequences can be used to simulate molecular biology methods such as cloning and PCR. The main classes used to represent sequences are Dseq and Dseqrecord.

    +
      +
    • Dseq represents the sequence only. Think of it as a FASTA file.

    • +
    • Dseqrecord can contain sequence features and other info such as publication, authors, etc. Think of it as a Genbank file.

    • +
    +
    +

    NOTE: The Dseq class is a subclass of biopython’s Seq, whose documentation can be found here. Dseqrecord is a subclass of biopython’s SeqRecord, whose documentation can be found here.

    +
    +
    +

    Dseq Class

    +

    We can create a Dseq object in different ways.

    +

    For a linear sequence without overhangs, we create a Dseq object passing a string with the sequence. For example:

    +
    from pydna.dseq import Dseq
    +my_seq = Dseq("aatat")
    +my_seq
    +
    +
    +
    Dseq(-5)
    +aatat
    +ttata
    +
    +
    +

    In the console representation above, there are three lines:

    +
      +
    1. Dseq(-5) indicates that the sequence is linear and has 5 basepairs.

    2. +
    3. aatat, the top / sense / watson strand, referred from now on as watson strand..

    4. +
    5. ttata, the bottom / anti-sense / crick strand, referred from now on as crick strand.

    6. +
    +

    Now, let’s create a circular sequence:

    +
    my_seq = Dseq("aatat", circular=True)
    +my_seq
    +
    +
    +
    Dseq(o5)
    +aatat
    +ttata
    +
    +
    +
    +

    Note how o5 indicates that the sequence is circular and has 5 basepairs.

    +
    +

    One way to represent a linear sequence with overhangs is to instantiate Dseq with the following arguments:

    +
      +
    • The watson strand as a string in the 5’-3’ direction.

    • +
    • The crick strand as a string in the 5’-3’ direction.

    • +
    • The 5’ overhang ovhg (overhang), which can be positive or negative, and represents the number of basepairs that the watson strand extends beyond the crick strand.

    • +
    +
    Dseq("actag", "ctag", -1)
    +
    +
    +
    Dseq(-5)
    +actag
    + gatc
    +
    +
    +
    +

    Note how the bottom strand is passed in the 5’-3’ direction, but it is represented in the 3’-5’ direction in the console output.

    +
    +

    If you omit the ovhg argument, pydna will try to find the value that makes the watson and crick strands complementary.

    +
    Dseq("actag", "ctag")
    +
    +
    +
    Dseq(-5)
    +actag
    + gatc
    +
    +
    +

    The best way to get a feeling for the meaning of ovhg is to visualise the possible scenarios as such:

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

    Of note, the DNA sequence can be passed in both lower case and upper case, and are not restricted to the conventional ATCG nucleotides (E.g ), The class supports the IUPAC ambiguous nucleotide code.

    +
    Dseq("Actag", "Ctag", -1)
    +
    +
    +
    Dseq(-5)
    +Actag
    + gatC
    +
    +
    +

    Another way to pass the overhangs is to use the from_full_sequence_and_overhangs classmethod, which only needs the watson/sense strand. This is useful you can only store the entire sequence (e.g. in a FASTA file), or if you want to specify overhangs on both sides of the double stranded DNA when you create the object.

    +

    Both the watson_ovhg and crick_ovhg can be passed following the same rules as above. Specifically, the crick_ovhg argument is identical to the conventional ovhg argument. The watson_ovhg argument is the ovhg argument applied to the reverse complementary sequence.

    +
    my_seq = Dseq.from_full_sequence_and_overhangs("aaattaaa", crick_ovhg=-3, watson_ovhg=-2)
    +my_seq
    +
    +
    +
    Dseq(-8)
    +aaatta
    +   aattt
    +
    +
    +

    A list of possible scenarios, applying positive and negative crick_ovhg and watson_ovhg to a Dseq object are visualised in the output of the code below:

    +
    for crick_ovhg in [-2, 2]:
    +    for watson_ovhg in [-3, 3]:
    +        print("watson_ovhg is " + str(watson_ovhg) + ", crick_ovhg is " + str(crick_ovhg))
    +        my_seq = Dseq.from_full_sequence_and_overhangs("aaattaaa", crick_ovhg, watson_ovhg)
    +        print(my_seq.__repr__() + "\n")
    +
    +
    +
    watson_ovhg is -3, crick_ovhg is -2
    +Dseq(-8)
    +aaatt
    +  taattt
    +
    +watson_ovhg is 3, crick_ovhg is -2
    +Dseq(-8)
    +aaattaaa
    +  taa
    +
    +watson_ovhg is -3, crick_ovhg is 2
    +Dseq(-8)
    +  att
    +tttaattt
    +
    +watson_ovhg is 3, crick_ovhg is 2
    +Dseq(-8)
    +  attaaa
    +tttaa
    +
    +
    +

    The drawing below can help visualize the meaning of the overhangs.

    +
      (-3)--(-2)--(-1)--(x)--(x)--(x)--(-1)--(-2)
    +
    +5'( a)--( a)--( a)--(t)--(t)--(a)--( a)--( a)3'
    +3'( a)--( a)--( a)--(t)--(t)--(a)--( a)--( a)5'
    +
    +5'( a)--( a)--( a)--(t)--(t)--(a)--(  )--(  )3'
    +3'(  )--(  )--(  )--(t)--(t)--(a)--( a)--( a)5'
    +
    +
    +

    If you would like to check the overhangs for a Dseq object, it can be done by calling the methods five_prime_end and three_prime_end to show the 5’ and 3’ overhangs, respectively. An example of a Dseq object, and examples showing what the print-out of the methods looks like are demonstrated here:

    +
    my_seq = Dseq("aatat", "ttata", ovhg=-2)
    +print(my_seq.__repr__())
    +print(my_seq.five_prime_end())
    +print(my_seq.three_prime_end())
    +
    +
    +
    Dseq(-7)
    +aatat
    +  atatt
    +("5'", 'aa')
    +("5'", 'tt')
    +
    +
    +

    If you now want to join your sequence’s sticky ends to make a circular sequence (i.e Plasmid), you can use the looped method. The sticky ends must be compatible to do so.

    +
    my_seq = Dseq("aatat", "ttata", ovhg=-2)
    +my_seq.looped()
    +
    +
    +
    Dseq(o5)
    +aatat
    +ttata
    +
    +
    +

    If you want to change the circular origin of the sequence/plasmid, this can be easily done using the shifted method. This can be done by providing the number of bases between the original origin with the new origin:

    +
    my_seq = Dseq("aatat", circular=True)
    +my_seq.shifted(2)
    +
    +
    +
    Dseq(o5)
    +tataa
    +atatt
    +
    +
    +
    +
    +

    getitem, repr, and str methods

    +
    +

    Slicing sequences (__getitem__)

    +

    __getitem__ is the method that is called when you use the square brackets [] after a python object. Below is an example of the builtin python list:

    +
    my_list = [1, 2, 3]
    +
    +print('using square brackets:', my_list[1:])
    +print('is the same as using __getitem__:', my_list.__getitem__(slice(1, None)))
    +
    +
    +
    using square brackets: [2, 3]
    +is the same as using __getitem__: [2, 3]
    +
    +
    +

    The __getitem__ method is modified in pydna to deal with Dseq objects and returns a slice of the Dseq object, defined by the a start value and a stop value, similarly to string indexing. In other words, __getitem__ indexes Dseq. Note that ‘getitem’ (and, consequently, []) uses zero-based indexing.

    +
    my_seq = Dseq("aatataa")
    +my_seq[2:5]
    +
    +
    +
    +
    Dseq(-3)
    +tat
    +ata
    +
    +
    +

    __getitem__ respects overhangs.

    +
    my_seq = Dseq.from_full_sequence_and_overhangs("aatataa", crick_ovhg=0, watson_ovhg=-1)
    +my_seq[2:]
    +
    +
    +
    Dseq(-5)
    +tata
    +atatt
    +
    +
    +

    Note that index zero corresponds to the leftmost base of the sequence, which might not necessarily be on the watson strand. Let’s create a sequence that has an overhang on the left side.

    +
    sequence_with_overhangs = Dseq.from_full_sequence_and_overhangs("aatacgttcc", crick_ovhg=3, watson_ovhg=0)
    +sequence_with_overhangs
    +
    +
    +
    Dseq(-10)
    +   acgttcc
    +ttatgcaagg
    +
    +
    +

    When we index starting from 2, we don’t start counting on the watson, but on the crick strand since it is the leftmost one.

    +
    sequence_with_overhangs[2:]
    +
    +
    +
    Dseq(-8)
    + acgt
    +atgcaagg
    +
    +
    +
    +

    Slicing circular sequences

    +

    When slicing circular Dseq objects we get linear sequences.

    +
    circular_seq = Dseq("aatctaa", circular=True)
    +circular_seq[1:5]
    +
    +
    +
    Dseq(-4)
    +atct
    +taga
    +
    +
    +

    We can slice circular sequences across the origin (where index is zero) if the first index is bigger than the second index. This is demonstrated in the example below:

    +
    circular_seq[5:2]
    +
    +
    +
    Dseq(-4)
    +aaaa
    +tttt
    +
    +
    +
    +
    +
    +

    Printing sequences to the console: __repr__ and __str__

    +

    __repr__ and __str__ are methods present in all python classes that return a string representation of an object. __str__ is called by the print function, and __repr__ is used by the console or notebook output when the object is not assigned to a variable. Below is an example with a date object:

    +
    import datetime
    +
    +my_date = datetime.date(2023, 8, 15)
    +
    +print('> print statement:', my_date)
    +print('> repr:', repr(my_date))
    +print('> repr from class method:', my_date.__repr__())
    +
    +print()
    +print('> console output:')
    +my_date
    +
    +
    +
    > print statement: 2023-08-15
    +> repr: datetime.date(2023, 8, 15)
    +> repr from class method: datetime.date(2023, 8, 15)
    +
    +> console output:
    +
    +
    +
    +
    +
    +datetime.date(2023, 8, 15)
    +
    +
    +

    In a similar way, __repr__ and __str__ methods are used by pydna to represent sequences as strings for different purposes:

    +
      +
    • __repr__ is used to make a figure-like representation that shows both strands and the overhangs.

    • +
    • __str__ is used to return the entire sequence as a string of characters (from the left-most to the right-most base of both strands), the way we would store it in a FASTA file.

    • +
    +
    my_seq = Dseq.from_full_sequence_and_overhangs("aaattaaa", crick_ovhg=-3, watson_ovhg=-2)
    +print('> figure-like representation:\n', my_seq.__repr__())
    +print()
    +print('> string representation:\n', my_seq)
    +
    +
    +
    +
    > figure-like representation:
    + Dseq(-8)
    +aaatta
    +   aattt
    +
    +> string representation:
    + aaattaaa
    +
    +
    +

    Note that on the string representation, the bases correspond to the entire sequence provided, even when they are only present on either the watson or crick strand. In the example above, the last two aa bases are missing from the watson strand, and that only the crick strand has them.

    +
    +
    +
    +

    Edge cases

    +

    You can create arbitrary double-stranded sequences that are not complementary if you specify both strands and an overhang, but you won’t be able to use them for molecular biology simulations. For example:

    +
    Dseq("xxxx", "atat", ovhg=2)
    +
    +
    +
    Dseq(-6)
    +  xxxx
    +tata
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    +

    © 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/Dseq_Features.html b/markdown_notebooks/Dseq_Features.html new file mode 100644 index 00000000..2726fece --- /dev/null +++ b/markdown_notebooks/Dseq_Features.html @@ -0,0 +1,657 @@ + + + + + + + + + Working with Features using the Dseqrecord class — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Working with Features using the Dseqrecord class

    +
    +

    Before working with features, check how to import sequences from files in the Importing_Seqs notebook.

    +

    For full library documentation, visit here.

    +
    +

    Some sequence file formats (like Genbank) include features, describing key biological properties of sequence regions. In Genbank, features “include genes, gene products, as well as regions of biological significance reported in the sequence.” (See here for a description of a Genbank file and associated terminologies/annotations) Examples include coding sequences (CDS), introns, promoters, etc.

    +

    pydna offers many ways to easily view, add, extract, and write features into a Genbank file via the Dseqrecord class. After reading a file into a Dseqrecord object, we can check out the list of features in the record using the following code. This example uses the sample record U49845.

    + + Open In Colab + +
    # Install pydna (only when running on Colab)
    +import sys
    +if 'google.colab' in sys.modules:
    +    %%capture
    +    # Install the current development version of pydna (comment to install pip version)
    +    !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn
    +    # Install pip version instead (uncomment to install)
    +    # !pip install pydna
    +
    +
    +
    +
    from pydna.dseqrecord import Dseqrecord
    +from pydna.parsers import parse
    +
    +#Import your file into python. 
    +file_path = "./U49845.gb"
    +records = parse(file_path)
    +sample_record = records[0]
    +
    +# List all features
    +for feature in sample_record.features:
    +    print(feature)
    +
    +
    +
    type: source
    +location: [0:5028](+)
    +qualifiers:
    +    Key: chromosome, Value: ['IX']
    +    Key: db_xref, Value: ['taxon:4932']
    +    Key: mol_type, Value: ['genomic DNA']
    +    Key: organism, Value: ['Saccharomyces cerevisiae']
    +
    +type: mRNA
    +location: [<0:>206](+)
    +qualifiers:
    +    Key: product, Value: ['TCP1-beta']
    +
    +type: CDS
    +location: [<0:206](+)
    +qualifiers:
    +    Key: codon_start, Value: ['3']
    +    Key: product, Value: ['TCP1-beta']
    +    Key: protein_id, Value: ['AAA98665.1']
    +    Key: translation, Value: ['SSIYNGISTSGLDLNNGTIADMRQLGIVESYKLKRAVVSSASEAAEVLLRVDNIIRARPRTANRQHM']
    +
    +type: gene
    +location: [<686:>3158](+)
    +qualifiers:
    +    Key: gene, Value: ['AXL2']
    +
    +type: mRNA
    +location: [<686:>3158](+)
    +qualifiers:
    +    Key: gene, Value: ['AXL2']
    +    Key: product, Value: ['Axl2p']
    +
    +type: CDS
    +location: [686:3158](+)
    +qualifiers:
    +    Key: codon_start, Value: ['1']
    +    Key: gene, Value: ['AXL2']
    +    Key: note, Value: ['plasma membrane glycoprotein']
    +    Key: product, Value: ['Axl2p']
    +    Key: protein_id, Value: ['AAA98666.1']
    +    Key: translation, Value: ['MTQLQISLLLTATISLLHLVVATPYEAYPIGKQYPPVARVNESFTFQISNDTYKSSVDKTAQITYNCFDLPSWLSFDSSSRTFSGEPSSDLLSDANTTLYFNVILEGTDSADSTSLNNTYQFVVTNRPSISLSSDFNLLALLKNYGYTNGKNALKLDPNEVFNVTFDRSMFTNEESIVSYYGRSQLYNAPLPNWLFFDSGELKFTGTAPVINSAIAPETSYSFVIIATDIEGFSAVEVEFELVIGAHQLTTSIQNSLIINVTDTGNVSYDLPLNYVYLDDDPISSDKLGSINLLDAPDWVALDNATISGSVPDELLGKNSNPANFSVSIYDTYGDVIYFNFEVVSTTDLFAISSLPNINATRGEWFSYYFLPSQFTDYVNTNVSLEFTNSSQDHDWVKFQSSNLTLAGEVPKNFDKLSLGLKANQGSQSQELYFNIIGMDSKITHSNHSANATSTRSSHHSTSTSSYTSSTYTAKISSTSAAATSSAPAALPAANKTSSHNKKAVAIACGVAIPLGVILVALICFLIFWRRRRENPDDENLPHAISGPDLNNPANKPNQENATPLNNPFDDDASSYDDTSIARRLAALNTLKLDNHSATESDISSVDEKRDSLSGMNTYNDQFQSQSKEELLAKPPVQPPESPFFDPQNRSSSVYMDSEPAVNKSWRYTGNLSPVSDIVRDSYGSQKTVDTEKLFDLEAPEKEKRTSRDVTMSSLDPWNSNISPSPVRKSVTPSPYNVTKHRNRHLQNIQDSQSGKNGITPTTMSTSSSDDFVPVKDGENFCWVHSMEPDRRPSKKRLVDFSNKSNVNVGQVKDIHGRIPEML']
    +
    +type: gene
    +location: [<3299:>4037](-)
    +qualifiers:
    +    Key: gene, Value: ['REV7']
    +
    +type: mRNA
    +location: [<3299:>4037](-)
    +qualifiers:
    +    Key: gene, Value: ['REV7']
    +    Key: product, Value: ['Rev7p']
    +
    +type: CDS
    +location: [3299:4037](-)
    +qualifiers:
    +    Key: codon_start, Value: ['1']
    +    Key: gene, Value: ['REV7']
    +    Key: product, Value: ['Rev7p']
    +    Key: protein_id, Value: ['AAA98667.1']
    +    Key: translation, Value: ['MNRWVEKWLRVYLKCYINLILFYRNVYPPQSFDYTTYQSFNLPQFVPINRHPALIDYIEELILDVLSKLTHVYRFSICIINKKNDLCIEKYVLDFSELQHVDKDDQIITETEVFDEFRSSLNSLIMHLEKLPKVNDDTITFEAVINAIELELGHKLDRNRRVDSLEEKAEIERDSNWVKCQEDENLPDNNGFQPPKIKLTSLVGSDVGPLIIHQFSEKLISGDDKILNGVYSQYEEGESIFGSLF']
    +
    +
    +

    Additional ways to view and search for particular features are shown at the bottom of the page under “Other Methods to Viewing Features”

    +
    +

    Adding Features and Qualifiers

    +

    To add new feature to describe a region of interest to a record, for instance a region that you would like to perform a PCR, you need to create a SeqFeature (sequence feature). The minimal information required is:

    +
      +
    • A FeatureLocation: position of the feature in the sequence.

    • +
    • The type of feature you want to add.

    • +
    +

    🚨🚨 VERY IMPORTANT 🚨🚨. Note that FeatureLocations are like python ranges (zero-based open intervals), whereas in GenBank files, locations are one-based closed intervals. For instance, the following code adds a new feature from the 2nd to the 5th nucleotide (FeatureLocation(3, 15)), of the gene type, but in the GenBank file will be represented as 4..15.

    +
    from Bio.SeqFeature import FeatureLocation, SeqFeature
    +
    +# Create a dummy record
    +dummy_record = Dseqrecord("aaaATGCGTACGTGAacgt")
    +
    +# Define the locations of a CDS
    +location = FeatureLocation(3, 15)
    +
    +# Create a SeqFeature with the type mRNA
    +my_feature = SeqFeature(location=location, type="gene")
    +
    +# Add my_feature to dummy_record with .append
    +dummy_record.features.append(my_feature)
    +
    +# Confirm that my_feature has been added
    +print(dummy_record.features[-1])
    +
    +# Print the feature in GenBank format (see how the location is `4..15`)
    +print(dummy_record.format("genbank"))
    +
    +
    +
    type: gene
    +location: [3:15]
    +qualifiers:
    +
    +LOCUS       name                      19 bp    DNA     linear   UNK 01-JAN-1980
    +DEFINITION  description.
    +ACCESSION   id
    +VERSION     id
    +KEYWORDS    .
    +SOURCE      .
    +  ORGANISM  .
    +            .
    +FEATURES             Location/Qualifiers
    +     gene            4..15
    +ORIGIN
    +        1 aaaatgcgta cgtgaacgt
    +//
    +
    +
    +

    To give further information about a feature, we can add a qualifier using the qualifiers property of SeqFeature, which contains a dictionary of qualifiers. For instance, if I would like to note a new feature of type ‘domain’, between 3-9 bases as my region of interest, I can instantiate the SeqFeature class object as such.

    +
    +

    Note that a new feature is always added to the last position of the features list.

    +
    +
    location = FeatureLocation(3, 9)
    +
    +# Create a SeqFeature with a qualifier
    +my_feature2 = SeqFeature(location=location, type="domain", qualifiers={"Note": ["Region of interest"]})
    +
    +# Add my_feature to my_record with .append
    +dummy_record.features.append(my_feature2)
    +
    +# Confirm that my_feature has been added
    +print('>> Feature was added:')
    +print(dummy_record.features[-1])
    +print()
    +
    +# Print the feature in GenBank format
    +print('>> GenBank format:')
    +print(dummy_record.format("genbank"))
    +
    +
    +
    +
    +
    >> Feature was added:
    +type: domain
    +location: [3:9]
    +qualifiers:
    +    Key: Note, Value: ['Region of interest']
    +
    +
    +>> GenBank format:
    +LOCUS       name                      19 bp    DNA     linear   UNK 01-JAN-1980
    +DEFINITION  description.
    +ACCESSION   id
    +VERSION     id
    +KEYWORDS    .
    +SOURCE      .
    +  ORGANISM  .
    +            .
    +FEATURES             Location/Qualifiers
    +     gene            4..15
    +     domain          4..9
    +                     /Note="Region of interest"
    +ORIGIN
    +        1 aaaatgcgta cgtgaacgt
    +//
    +
    +
    +

    🤔 Best practices for qualifiers:

    +

    The values in the qualifiers dictionary should be lists. The reason for this is that in a GenBank file, a single feature can have multiple values for a single qualifier. Below is a real world of the ase1 CDS example from the S. pombe genome in EMBL format:

    +
    FT   CDS             join(1878362..1878785,1878833..1880604)
    +FT                   /colour=2
    +FT                   /primary_name="ase1"
    +FT                   /product="antiparallel microtubule cross-linking factor
    +FT                   Ase1"
    +FT                   /systematic_id="SPAPB1A10.09"
    +FT                   /controlled_curation="term=species distribution, conserved
    +FT                   in eukaryotes; date=20081110"
    +FT                   /controlled_curation="term=species distribution, conserved
    +FT                   in metazoa; date=20081110"
    +FT                   /controlled_curation="term=species distribution, conserved
    +FT                   in vertebrates; date=20081110"
    +FT                   /controlled_curation="term=species distribution,
    +FT                   predominantly single copy (one to one); date=20081110"
    +FT                   /controlled_curation="term=species distribution, conserved
    +FT                   in fungi; date=20081110"
    +FT                   /controlled_curation="term=species distribution, conserved
    +FT                   in eukaryotes only; date=20081110"
    +
    +
    +

    Note how there are several controlled_curation qualifiers, therefore it makes sense to store them as a list.

    +

    By default, you can add any type of object in the qualifiers dictionary, and most things will work if you add a string. However, you risk overwriting the existing value for a qualifier, so best practice is:

    +
      +
    1. Check if the qualifier already exists using if "qualifier_name" in feature.qualifiers

    2. +
    3. If it exists, append to the existing list of values using feature.qualifiers["qualifier_name"].append("new_value")

    4. +
    5. If it does not exist, add it to the qualifiers dictionary using feature.qualifiers["qualifier_name"] = ["new_value"]

    6. +
    +

    Note that Bio.SeqFeatures does not automatically assume a sequence strand for the feature. If you would like to refer to a feature on the positive or minus strand, you can add a parameter in FeatureLocation specifying strand=+1 or strand=-1.

    +
    #Create a location specifying the minus strand
    +location = FeatureLocation(15, 19, strand=-1)
    +
    +my_feature3 = SeqFeature(location=location, type="domain", qualifiers={"gene":["example_domain"]})
    +
    +dummy_record.features.append(my_feature3)
    +
    +print(dummy_record.features[-1])
    +
    +print(dummy_record.format("genbank"))
    +
    +
    +
    +
    +
    type: domain
    +location: [15:19](-)
    +qualifiers:
    +    Key: gene, Value: ['example_domain']
    +
    +LOCUS       name                      19 bp    DNA     linear   UNK 01-JAN-1980
    +DEFINITION  description.
    +ACCESSION   id
    +VERSION     id
    +KEYWORDS    .
    +SOURCE      .
    +  ORGANISM  .
    +            .
    +FEATURES             Location/Qualifiers
    +     gene            4..15
    +     domain          4..9
    +                     /Note="Region of interest"
    +     domain          complement(16..19)
    +                     /gene="example_domain"
    +ORIGIN
    +        1 aaaatgcgta cgtgaacgt
    +//
    +
    +
    +
    +

    Adding a Feature with Parts

    +

    To add a feature with parts, like a CDS with introns, we need to use a CompoundLocation object when creating a SeqFeature.

    +

    The example code below adds a CDS with two parts, between 3-9bp and 12-15bp, to my features list. In a real-world scenario this would represent a CDS with an intron that skips the ACG codon: ATGCGT~~ACG~~TGA

    +
    from Bio.SeqFeature import CompoundLocation
    +
    +# Define the locations of the CDS
    +locations = [FeatureLocation(3, 9), FeatureLocation(12, 15)]
    +
    +# Create a compound location from these parts
    +compound_location = CompoundLocation(locations)
    +
    +# Create a SeqFeature with this compound location, including type and qualifiers. 
    +cds_feature = SeqFeature(location=compound_location, type="CDS", qualifiers={"gene": ["example_gene"]})
    +
    +# Add the feature to the Dseqrecord
    +dummy_record.features.append(cds_feature)
    +
    +print(dummy_record.features[-1])
    +
    +print(dummy_record.format("genbank"))
    +
    +
    +
    +
    type: CDS
    +location: join{[3:9], [12:15]}
    +qualifiers:
    +    Key: gene, Value: ['example_gene']
    +
    +LOCUS       name                      19 bp    DNA     linear   UNK 01-JAN-1980
    +DEFINITION  description.
    +ACCESSION   id
    +VERSION     id
    +KEYWORDS    .
    +SOURCE      .
    +  ORGANISM  .
    +            .
    +FEATURES             Location/Qualifiers
    +     gene            4..15
    +     domain          4..9
    +                     /Note="Region of interest"
    +     domain          complement(16..19)
    +                     /gene="example_domain"
    +     CDS             join(4..9,13..15)
    +                     /gene="example_gene"
    +ORIGIN
    +        1 aaaatgcgta cgtgaacgt
    +//
    +
    +
    +

    We can even extract a protein record as follows (see how the protein sequence is MR, skipping the intron):

    +
    sub_record = dummy_record.features[-1].extract(dummy_record)
    +
    +print(sub_record.translate())
    +
    +
    +
    +
    ID: id
    +Name: name
    +Description: description
    +Number of features: 0
    +/molecule_type=DNA
    +ProteinSeq('MR')
    +
    +
    +
    +
    +

    Standard Feature Types and Qualifiers

    +

    pydna and Bio.SeqFeature suppports all the conventional feature types through the type parameters. A non-exhaustive list include gene, CDS, promoter, exon, intron, 5’ UTR, 3’ UTR, terminator, enhancer, and RBS. You can also define custom features, which could be useful for synthetic biology applications. For instance, you might want to have Bio_brick or spacer features to describe a synthetic standardised plasmid construct.

    +

    It is important to note that while pydna and Bio.SeqFeature does not restrict the feature types you can use, sticking to standard types helps maintain compatibility with other bioinformatics tools and databases. Please refer to the official GenBank_Feature_Table, that lists the standard feature types and their associated qualifiers.

    +

    Further documentation for SeqFeature, CompoundLocation, and FeatureLocation can be found in the SeqFeature module here.

    +
    +
    +

    Handling Origin Spanning Features

    +

    An origin spanning feature is a special type of feature that crosses over a circular sequence’s origin. In pydna, such a feature is represented as a feature with parts, joining the part of the sequence immediately before the origin and immediately after the origin. They can be added using CompoundLocation as normal.

    +

    An origin spanning feature, between base 19 to base 6, in a 25bp long circular sequence, is represented like so:

    +
    type: gene 
    +location: join{[19:25](+), [0:6](+)}  
    +qualifiers: gene, Value: example_gene  
    +
    +
    +

    This feature will be displayed as a single feature in SnapGene viewer and Benchling, since they support this convention.

    +
    circular_record = Dseqrecord('ACGTGAaaaaaaaaaaaaaATGCGT', circular=True)
    +
    +location = [FeatureLocation(19,25), FeatureLocation(0, 6)]
    +ori_feat_location = CompoundLocation(location)
    +ori_feature = SeqFeature(location=ori_feat_location, type="misc", qualifiers={"gene": ["example origin spanning gene"]})
    +circular_record.features.append(ori_feature)
    +
    +print('>> Feature:')
    +print(circular_record.features[-1])
    +
    +# Note how the feature sequence is extracted properly across the origin.
    +print('>> Feature sequence:')
    +print(circular_record.features[-1].extract(circular_record).seq)
    +print()
    +
    +print('>> GenBank format:')
    +print(circular_record.format("genbank"))
    +
    +
    +
    >> Feature:
    +type: misc
    +location: join{[19:25], [0:6]}
    +qualifiers:
    +    Key: gene, Value: ['example origin spanning gene']
    +
    +>> Feature sequence:
    +ATGCGTACGTGA
    +
    +>> GenBank format:
    +LOCUS       name                      25 bp    DNA     circular UNK 01-JAN-1980
    +DEFINITION  description.
    +ACCESSION   id
    +VERSION     id
    +KEYWORDS    .
    +SOURCE      .
    +  ORGANISM  .
    +            .
    +FEATURES             Location/Qualifiers
    +     misc            join(20..25,1..6)
    +                     /gene="example origin spanning gene"
    +ORIGIN
    +        1 acgtgaaaaa aaaaaaaaaa tgcgt
    +//
    +
    +
    +
    +
    +

    Other Methods to Viewing Features

    +

    pydna also provides the list_features method as a simple way to list all the features in a Dseqrecord object.

    +
    print(sample_record.list_features())
    +
    +
    +
    +-----+------------------+-----+-------+-------+------+--------+------+
    +| Ft# | Label or Note    | Dir | Sta   | End   |  Len | type   | orf? |
    ++-----+------------------+-----+-------+-------+------+--------+------+
    +|   0 | nd               | --> | 0     | 5028  | 5028 | source |  no  |
    +|   1 | nd               | --> | <0    | >206  |  206 | mRNA   |  no  |
    +|   2 | nd               | --> | <0    | 206   |  206 | CDS    |  no  |
    +|   3 | nd               | --> | <686  | >3158 | 2472 | gene   | yes  |
    +|   4 | nd               | --> | <686  | >3158 | 2472 | mRNA   | yes  |
    +|   5 | N:plasma membran | --> | 686   | 3158  | 2472 | CDS    | yes  |
    +|   6 | nd               | <-- | <3299 | >4037 |  738 | gene   | yes  |
    +|   7 | nd               | <-- | <3299 | >4037 |  738 | mRNA   | yes  |
    +|   8 | nd               | <-- | 3299  | 4037  |  738 | CDS    | yes  |
    ++-----+------------------+-----+-------+-------+------+--------+------+
    +
    +
    +

    This method is convenient for checking-out a brief overview of each feature, without reading through an entire sequence record.

    +

    Alternatively, we can look for specific features using their qualifiers. For instance:

    +
    # Filter based on feature type
    +print('Getting all CDS features:')
    +cds_features = [f for f in sample_record.features if f.type == "CDS"]
    +for feature in cds_features:
    +    print(feature)
    +
    +
    +
    Getting all CDS features:
    +type: CDS
    +location: [<0:206](+)
    +qualifiers:
    +    Key: codon_start, Value: ['3']
    +    Key: product, Value: ['TCP1-beta']
    +    Key: protein_id, Value: ['AAA98665.1']
    +    Key: translation, Value: ['SSIYNGISTSGLDLNNGTIADMRQLGIVESYKLKRAVVSSASEAAEVLLRVDNIIRARPRTANRQHM']
    +
    +type: CDS
    +location: [686:3158](+)
    +qualifiers:
    +    Key: codon_start, Value: ['1']
    +    Key: gene, Value: ['AXL2']
    +    Key: note, Value: ['plasma membrane glycoprotein']
    +    Key: product, Value: ['Axl2p']
    +    Key: protein_id, Value: ['AAA98666.1']
    +    Key: translation, Value: ['MTQLQISLLLTATISLLHLVVATPYEAYPIGKQYPPVARVNESFTFQISNDTYKSSVDKTAQITYNCFDLPSWLSFDSSSRTFSGEPSSDLLSDANTTLYFNVILEGTDSADSTSLNNTYQFVVTNRPSISLSSDFNLLALLKNYGYTNGKNALKLDPNEVFNVTFDRSMFTNEESIVSYYGRSQLYNAPLPNWLFFDSGELKFTGTAPVINSAIAPETSYSFVIIATDIEGFSAVEVEFELVIGAHQLTTSIQNSLIINVTDTGNVSYDLPLNYVYLDDDPISSDKLGSINLLDAPDWVALDNATISGSVPDELLGKNSNPANFSVSIYDTYGDVIYFNFEVVSTTDLFAISSLPNINATRGEWFSYYFLPSQFTDYVNTNVSLEFTNSSQDHDWVKFQSSNLTLAGEVPKNFDKLSLGLKANQGSQSQELYFNIIGMDSKITHSNHSANATSTRSSHHSTSTSSYTSSTYTAKISSTSAAATSSAPAALPAANKTSSHNKKAVAIACGVAIPLGVILVALICFLIFWRRRRENPDDENLPHAISGPDLNNPANKPNQENATPLNNPFDDDASSYDDTSIARRLAALNTLKLDNHSATESDISSVDEKRDSLSGMNTYNDQFQSQSKEELLAKPPVQPPESPFFDPQNRSSSVYMDSEPAVNKSWRYTGNLSPVSDIVRDSYGSQKTVDTEKLFDLEAPEKEKRTSRDVTMSSLDPWNSNISPSPVRKSVTPSPYNVTKHRNRHLQNIQDSQSGKNGITPTTMSTSSSDDFVPVKDGENFCWVHSMEPDRRPSKKRLVDFSNKSNVNVGQVKDIHGRIPEML']
    +
    +type: CDS
    +location: [3299:4037](-)
    +qualifiers:
    +    Key: codon_start, Value: ['1']
    +    Key: gene, Value: ['REV7']
    +    Key: product, Value: ['Rev7p']
    +    Key: protein_id, Value: ['AAA98667.1']
    +    Key: translation, Value: ['MNRWVEKWLRVYLKCYINLILFYRNVYPPQSFDYTTYQSFNLPQFVPINRHPALIDYIEELILDVLSKLTHVYRFSICIINKKNDLCIEKYVLDFSELQHVDKDDQIITETEVFDEFRSSLNSLIMHLEKLPKVNDDTITFEAVINAIELELGHKLDRNRRVDSLEEKAEIERDSNWVKCQEDENLPDNNGFQPPKIKLTSLVGSDVGPLIIHQFSEKLISGDDKILNGVYSQYEEGESIFGSLF']
    +
    +
    +
    # Find a particular feature by its qualifier (e.g. gene name)
    +rev7_cds_feature = next(f for f in sample_record.features if 
    +     f.type == "gene" and
    +     "gene" in f.qualifiers and "REV7" in f.qualifiers["gene"]
    +     )
    +
    +print(rev7_cds_feature)
    +
    +
    +
    +
    type: gene
    +location: [<3299:>4037](-)
    +qualifiers:
    +    Key: gene, Value: ['REV7']
    +
    +
    +

    If you would like to search for another type of features, simply replace the "gene" with your desired feature type in quotation marks.

    +
    +
    +

    Removing Features

    +

    In pydna, we can search for the feature that we would like to remove using the feature’s types or qualififers. For instance, we can modify the features list to exclude all CDS:

    +
    #Remove all CDS type features from my feature list
    +sample_record.features = [f for f in sample_record.features if not (f.type == "CDS")]
    +
    +for feature in sample_record.features:
    +    print(feature)
    +
    +
    +
    type: source
    +location: [0:5028](+)
    +qualifiers:
    +    Key: chromosome, Value: ['IX']
    +    Key: db_xref, Value: ['taxon:4932']
    +    Key: mol_type, Value: ['genomic DNA']
    +    Key: organism, Value: ['Saccharomyces cerevisiae']
    +
    +type: mRNA
    +location: [<0:>206](+)
    +qualifiers:
    +    Key: product, Value: ['TCP1-beta']
    +
    +type: gene
    +location: [<686:>3158](+)
    +qualifiers:
    +    Key: gene, Value: ['AXL2']
    +
    +type: mRNA
    +location: [<686:>3158](+)
    +qualifiers:
    +    Key: gene, Value: ['AXL2']
    +    Key: product, Value: ['Axl2p']
    +
    +type: gene
    +location: [<3299:>4037](-)
    +qualifiers:
    +    Key: gene, Value: ['REV7']
    +
    +type: mRNA
    +location: [<3299:>4037](-)
    +qualifiers:
    +    Key: gene, Value: ['REV7']
    +    Key: product, Value: ['Rev7p']
    +
    +
    +

    We can also modify the features list to exclude a specific gene:

    +
    #Exclude REV7 from my feature list
    +sample_record.features = [f for f in sample_record.features if not ('gene' in f.qualifiers and 'REV7' in f.qualifiers['gene'])]
    +
    +for feature in sample_record.features:
    +    print(feature)
    +
    +
    +
    type: source
    +location: [0:5028](+)
    +qualifiers:
    +    Key: chromosome, Value: ['IX']
    +    Key: db_xref, Value: ['taxon:4932']
    +    Key: mol_type, Value: ['genomic DNA']
    +    Key: organism, Value: ['Saccharomyces cerevisiae']
    +
    +type: mRNA
    +location: [<0:>206](+)
    +qualifiers:
    +    Key: product, Value: ['TCP1-beta']
    +
    +type: gene
    +location: [<686:>3158](+)
    +qualifiers:
    +    Key: gene, Value: ['AXL2']
    +
    +type: mRNA
    +location: [<686:>3158](+)
    +qualifiers:
    +    Key: gene, Value: ['AXL2']
    +    Key: product, Value: ['Axl2p']
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    +

    © 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/Example_CRISPR.html b/markdown_notebooks/Example_CRISPR.html new file mode 100644 index 00000000..36ad1d7d --- /dev/null +++ b/markdown_notebooks/Example_CRISPR.html @@ -0,0 +1,228 @@ + + + + + + + + + Implementation of Oligonucleotide-based CRISPR-Cas9 toolbox for efficient engineering of Komagataella phaffii — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    +
      +
    • + +
    • + View page source +
    • +
    +
    +
    +
    +
    + +
    +

    Implementation of Oligonucleotide-based CRISPR-Cas9 toolbox for efficient engineering of Komagataella phaffii

    +

    In this example we wanted to give a real life intuition on how to use the module in practice.

    +

    For this purpose we have chosen to use the oligonucleotide-based CRISPR-Cas9 toolbox that i described +here by Strucko et al 2024, in the industrially relevant K. phaffi production organism:

    +

    https://academic.oup.com/femsyr/article/doi/10.1093/femsyr/foae026/7740463?login=false

    +
    from IPython.display import Image
    +Image(url="https://oup.silverchair-cdn.com/oup/backfile/Content_public/Journal/femsyr/24/10.1093_femsyr_foae026/1/m_foae026fig3.jpeg?Expires=1730974846&Signature=iBKvkhkUn1823IljQ~1uFEnKO0VqWrwiXADvCwQLz6Yv8yDEAFkgt~tsLrXKFTmGYIq3ZINcj5a5yNgs4cP4NeCvRcQh7Ad~1ZejIwNrjqw51CJhGcZWPzz~NDr93QVLZZd2Re41cJNFKFmEu756KxrHQxwKTQe2QPMPfiKBvhvo8J28PERj3vNjZ3LQRsFp9qUPpdsZEyWIiNY92jsuy448YyuaGCgaC2ExGDLeuArTEJmq8gtb0QnTPV0dEdtoxIfZpgavdvO~QyqikjCLj6hebUYU1lH7StuS8oqCQE82CXO0IUcjYF6m2Lb0evXhqdLDQe90M-NrKjzNRmBA0A__&Key-Pair-Id=APKAIE5G5CRDK6RD3PGA")
    +
    +
    + +

    Figure 1. oligo assisted repair in K. phaffi.

    +
      +
    • Basically we can make two cuts in the genome, and repair it with an oligo (Figure 1A, 1B).

    • +
    • We can start by loading in our target. Here we have integrated LAC12 in our K. phaffi strain but want to knock it out.

    • +
    • Let’s see how this can be implemented in pydna

    • +
    + + Open In Colab + +
    # Install pydna (only when running on Colab)
    +import sys
    +if 'google.colab' in sys.modules:
    +    %%capture
    +    # Install the current development version of pydna (comment to install pip version)
    +    !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn
    +    # Install pip version instead (uncomment to install)
    +    # !pip install pydna
    +
    +
    +
    +
    +

    Import the gene we are going to work with

    +
    from pydna.dseqrecord import Dseqrecord
    +from pydna.crispr import cas9, protospacer
    +from pydna.genbank import Genbank
    +
    +# initalize your favourite gene
    +gb = Genbank("myself@email.com") # Tell Genbank who you are!
    +gene = gb.nucleotide("X06997") # Kluyveromyces lactis LAC12 gene for lactose permease that have been integrated into K. phaffi
    +target_dseq = Dseqrecord(gene)
    +print(target_dseq)
    +
    +
    +
    +
    Dseqrecord
    +circular: False
    +size: 7127
    +ID: X06997.1
    +Name: X06997
    +Description: Kluyveromyces lactis LAC12 gene for lactose permease
    +Number of features: 8
    +/molecule_type=DNA
    +/topology=linear
    +/data_file_division=PLN
    +/date=25-JUL-2016
    +/accessions=['X06997']
    +/sequence_version=1
    +/keywords=['lactose permease', 'unidentified reading frame']
    +/source=Kluyveromyces lactis
    +/organism=Kluyveromyces lactis
    +/taxonomy=['Eukaryota', 'Fungi', 'Dikarya', 'Ascomycota', 'Saccharomycotina', 'Saccharomycetes', 'Saccharomycetales', 'Saccharomycetaceae', 'Kluyveromyces']
    +/references=[Reference(title='Primary structure of the lactose permease gene from the yeast Kluyveromyces lactis. Presence of an unusual transcript structure', ...), Reference(title='Direct Submission', ...)]
    +/comment=the sequence submitted starts from the 5'end of LAC4 gene but goes
    +to the opposite direction; therefore, base number 1 is -1199 of
    +LAC4 gene; for LAC4 gene seq. see
    +Mol. Cell. Biol. (1987)7,4369-4376.
    +Dseq(-7127)
    +GCGA..TTCG
    +CGCT..AAGC
    +
    +
    +

    Next we have chosen some guides and can add them to our cas9 enzymes and simulate the cuts.

    +
    
    +# Choose guides
    +guides =  ["CCCTAAGTCCTTTGAAGATT", "TATTATTTTGAGGTGCTTTA"]
    +
    +# Create an enzyme object with the protospacer
    +enzyme = cas9(guides[0])
    +
    +# Simulate the cut with enzyme1
    +print('cutting with guide 1:', target_dseq.cut(enzyme))
    +
    +# Create an enzyme from the protospacer
    +enzyme2 = cas9(guides[1])
    +
    +# Simulate the cut with enzyme2
    +print('cutting with guide 2:', target_dseq.cut(enzyme2))
    +
    +
    +
    cutting with guide 1: (Dseqrecord(-135), Dseqrecord(-6992))
    +cutting with guide 2: (Dseqrecord(-6793), Dseqrecord(-334))
    +
    +
    +

    With these guides I would be able to generate a stable KO with a repair 60/90mer oligo.

    +
    repair_oligo = target_dseq.cut(enzyme)[0][-45:]+target_dseq.cut(enzyme2)[-1][:45]
    +repair_oligo.name = 'My repair oligo for this experiment'
    +print(f'{repair_oligo.name} : {repair_oligo.seq} ')
    +print(f'{repair_oligo.name} length : {len(repair_oligo.seq)} ')
    +
    +
    +
    My repair oligo for this experiment : AGGTGAACACACTCTGATGTAGTGCAGTCCCTAAGTCCTTTGAAGTTACGGACTCCTCGACCGATGCCCTTGAGAGCCTTCAACCCAGTC 
    +My repair oligo for this experiment length : 90 
    +
    +
    +

    The final edit gene would look like this in a case of homologous recombination.

    +
    from pydna.assembly import Assembly
    +
    +my_KO = Assembly((target_dseq.cut(enzyme)[0],repair_oligo, target_dseq.cut(enzyme2)[-1]), limit = 20 )
    +my_assembly_KO, *rest = my_KO.assemble_linear()
    +my_assembly_KO
    +
    +
    +
    name|45
    +     \/
    +     /\
    +     45|My repair oligo for this experiment|45
    +                                            \/
    +                                            /\
    +                                            45|name
    +
    +
    + + +
    +
    +
    + +
    + +
    +

    © 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/Example_Gibson.html b/markdown_notebooks/Example_Gibson.html new file mode 100644 index 00000000..82d11da8 --- /dev/null +++ b/markdown_notebooks/Example_Gibson.html @@ -0,0 +1,193 @@ + + + + + + + + + Example of a Gibson Assembly in pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Example of a Gibson Assembly in pydna

    +
    +

    Visit the full library documentation here

    +
    +

    This example showcases a workflow of modelling Gibson assembly to clone gene fragments into plasmids for synthetic biology. The biological example is sourced here, from the original Gibson assembly paper. This example constructs a synthetic pCC1BAC plasmid by joining sequence fragments from Ruminiclostridium (Clostridium) cellulolyticum. The R. cellulolyticum fragments joined are termed F1, F2, and F3, as in the paper.

    +

    Source files can be found alongside this notebook, if you would like to follow along. Annotations are made alongside the code to describe key steps.

    + + Open In Colab + +
    # Install pydna (only when running on Colab)
    +import sys
    +if 'google.colab' in sys.modules:
    +    %%capture
    +    # Install the current development version of pydna (comment to install pip version)
    +    !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn
    +    # Install pip version instead (uncomment to install)
    +    # !pip install pydna
    +
    +
    +
    +
    # Importing all necessary classes and methods
    +
    +from pydna.parsers import parse
    +from pydna.tm import tm_default
    +from pydna.amplify import pcr
    +from pydna.dseqrecord import Dseqrecord
    +from pydna.assembly import Assembly
    +
    +
    +
    # 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"))
    +
    +
    +
    # Importing pre-designed primers for the PylRS insert fragment. 
    +
    +F1_For = "GCAGCTTCAAGTCCTGCAAACAAGGTGTACCAGGATCGTT" #Remember that all sequnces are written from 5'-3'
    +F1_Rev = "GATTTCAGTGTAGTTAGGGCCAGTTGAATTCAAACCTGCC"
    +F2_For = "GGCAGGTTTGAATTCAACTGGCCCTAACTACACTGAAATC"
    +F2_Rev = "CTTGGTGCCATCAGCATTGTTCTCTGTACCGCCCACTGTC"
    +F3_For = "GACAGTGGGCGGTACAGAGAACAATGCTGATGGCACCAAG"
    +F3_Rev = "CAGTTGAATAATCATGTGTTCCTGCGGCAAATGCAGTACC"
    +BACF1_For = "AACGATCCTGGTACACCTTGTTTGCAGGACTTGAAGCTGCgcggccgcgatcctctagagtcgacctg"
    +BACF3_Rev = "GGTACTGCATTTGCCGCAGGAACACATGATTATTCAACTGgcggccgccgggtaccgagctcgaattc"
    +
    +
    +
    # (Optional) Checking that the primer Tm are matching
    +
    +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)
    +
    +# 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"))
    +
    +
    +
    +
    # Performing the Gibson Assembly. Note that the assembly class parameters should be given as a list.
    +
    +assembled = Assembly([Dseqrecord(pcr_product_F1), Dseqrecord(pcr_product_F2), Dseqrecord(pcr_product_F3), Dseqrecord(pcr_product_BAC)])
    +assembled_circ = assembled.assemble_circular()
    +
    +# Printing out the Gibson Assembly product
    +print(assembled_circ[0])
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    +

    © 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/Example_Restriction.html b/markdown_notebooks/Example_Restriction.html new file mode 100644 index 00000000..d8f7f17d --- /dev/null +++ b/markdown_notebooks/Example_Restriction.html @@ -0,0 +1,997 @@ + + + + + + + + + Example of a Plasmid Restriction/Ligation Cloning — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Example of a Plasmid Restriction/Ligation Cloning

    +
    +

    Visit the full library documentation here

    +
    +

    This example showcases a workflow of modelling molecular cloning with restriction enzymes, PCR, and ligases, to clone gene fragments into plasmids. This example constructs a synthetic plasmid by cloning the ase1 gene, which encodes a microtubule associated protein responsible for mitotic spindle assembly, into the pFA6a-kanMX6 cloning vector:

    +
      +
    1. The ase1 gene fragment is first cloned from a portion of the S. pombe genome through PCR:

    2. +
    3. The pFA6a-kanMX6 cloning vector is then cleaved with AscI and SalI. The ase1 gene fragment is also cleaved with SalI and AscI

    4. +
    5. The fragment is ligated with the linearized pFA6a-kanMX6 vector.

    6. +
    +

    Source files can be found alongside this notebook, if you would like to follow along. Annotations are made alongside the code to describe key steps.

    + + Open In Colab + +
    # Install pydna (only when running on Colab)
    +import sys
    +if 'google.colab' in sys.modules:
    +    %%capture
    +    # Install the current development version of pydna (comment to install pip version)
    +    !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn
    +    # Install pip version instead (uncomment to install)
    +    # !pip install pydna
    +
    +
    +
    +
    # Importing all necessary classes and methods
    +
    +from pydna.parsers import parse
    +from pydna.tm import tm_default
    +from pydna.amplify import pcr
    +from pydna.dseqrecord import Dseqrecord
    +from Bio.Restriction import SalI, AscI
    +
    +
    +
    # Parsing the files
    +pFA6akanMX6_path = "./pFA6a-kanMX6.gb"
    +ase1_path = "./CU329670.gb"
    +vector = parse(pFA6akanMX6_path)[0]
    +pombe_chromosome_I = parse(ase1_path)[0]
    +
    +# Printing the parsed files
    +
    +print(vector.format("gb"))
    +print(pombe_chromosome_I.format("gb"))
    +
    +
    +
    LOCUS       pFA6a-kanMX6            3938 bp    ds-DNA  circular SYN 16-JUN-2022
    +DEFINITION  synthetic circular DNA.
    +ACCESSION   .
    +VERSION     .
    +KEYWORDS    pFA6a-kanMX6.
    +SOURCE      synthetic DNA construct
    +  ORGANISM  synthetic DNA construct
    +            .
    +REFERENCE   1  (bases 1 to 3938)
    +  AUTHORS   Bahler J, Wu JQ, Longtine MS, Shah NG, McKenzie A 3rd, Steever AB,
    +            Wach A, Philippsen P, Pringle JR
    +  TITLE     Heterologous modules for efficient and versatile PCR-based gene
    +            targeting in Schizosaccharomyces pombe.
    +  JOURNAL   Yeast. 1998 Jul;14(10):943-51.
    +   PUBMED   9717240
    +REFERENCE   2  (bases 1 to 3938)
    +  AUTHORS   .
    +  TITLE     Direct Submission
    +  JOURNAL   Exported Jun 16, 2022 from SnapGene Server 1.1.58
    +            http://www.snapgene.com
    +FEATURES             Location/Qualifiers
    +     source          1..3938
    +                     /organism="synthetic DNA construct"
    +                     /mol_type="other DNA"
    +     primer_bind     complement(35..52)
    +                     /label="L4440"
    +                     /note="L4440 vector, forward primer"
    +     rep_origin      complement(206..794)
    +                     /direction=LEFT
    +                     /label="ori"
    +                     /note="high-copy-number ColE1/pMB1/pBR322/pUC origin of
    +                     replication"
    +     primer_bind     complement(286..305)
    +                     /label="pBR322ori-F"
    +                     /note="pBR322 origin, forward primer"
    +     CDS             complement(965..1825)
    +                     /codon_start=1
    +                     /gene="bla"
    +                     /product="beta-lactamase"
    +                     /label="AmpR"
    +                     /note="confers resistance to ampicillin, carbenicillin, and
    +                     related antibiotics"
    +                     /translation="MSIQHFRVALIPFFAAFCLPVFAHPETLVKVKDAEDQLGARVGYI
    +                     ELDLNSGKILESFRPEERFPMMSTFKVLLCGAVLSRIDAGQEQLGRRIHYSQNDLVEYS
    +                     PVTEKHLTDGMTVRELCSAAITMSDNTAANLLLTTIGGPKELTAFLHNMGDHVTRLDRW
    +                     EPELNEAIPNDERDTTMPVAMATTLRKLLTGELLTLASRQQLIDWMEADKVAGPLLRSA
    +                     LPAGWFIADKSGAGERGSRGIIAALGPDGKPSRIVVIYTTGSQATMDERNRQIAEIGAS
    +                     LIKHW"
    +     primer_bind     1588..1607
    +                     /label="Amp-R"
    +                     /note="Ampicillin resistance gene, reverse primer"
    +     promoter        complement(1826..1930)
    +                     /gene="bla"
    +                     /label="AmpR promoter"
    +     primer_bind     1998..2016
    +                     /label="pBRforEco"
    +                     /note="pBR322 vectors, upsteam of EcoRI site, forward
    +                     primer"
    +     primer_bind     complement(2054..2076)
    +                     /label="pGEX 3'"
    +                     /note="pGEX vectors, reverse primer"
    +     primer_bind     2176..2195
    +                     /label="pRS-marker"
    +                     /note="pRS vectors, use to sequence yeast selectable
    +                     marker"
    +     promoter        2276..2294
    +                     /label="SP6 promoter"
    +                     /note="promoter for bacteriophage SP6 RNA polymerase"
    +     primer_bind     2276..2293
    +                     /label="SP6"
    +                     /note="SP6 promoter, forward primer"
    +     gene            2407..3763
    +                     /label="kanMX"
    +                     /note="yeast selectable marker conferring kanamycin
    +                     resistance (Wach et al., 1994)"
    +     promoter        2407..2750
    +                     /label="TEF promoter"
    +                     /note="Ashbya gossypii TEF promoter"
    +     CDS             2751..3560
    +                     /codon_start=1
    +                     /gene="aph(3')-Ia"
    +                     /product="aminoglycoside phosphotransferase"
    +                     /label="KanR"
    +                     /note="confers resistance to kanamycin"
    +                     /translation="MGKEKTHVSRPRLNSNMDADLYGYKWARDNVGQSGATIYRLYGKP
    +                     DAPELFLKHGKGSVANDVTDEMVRLNWLTEFMPLPTIKHFIRTPDDAWLLTTAIPGKTA
    +                     FQVLEEYPDSGENIVDALAVFLRRLHSIPVCNCPFNSDRVFRLAQAQSRMNNGLVDASD
    +                     FDDERNGWPVEQVWKEMHKLLPFSPDSVVTHGDFSLDNLIFDEGKLIGCIDVGRVGIAD
    +                     RYQDLAILWNCLGEFSPSLQKRLFQKYGIDNPDMNKLQFHLMLDEFF"
    +     primer_bind     complement(2818..2837)
    +                     /label="Kan-R"
    +                     /note="Kanamycin resistance gene, reverse primer"
    +     terminator      3566..3763
    +                     /label="TEF terminator"
    +                     /note="Ashbya gossypii TEF terminator"
    +     primer_bind     complement(3867..3886)
    +                     /label="T7"
    +                     /note="T7 promoter, forward primer"
    +     promoter        complement(3868..3886)
    +                     /label="T7 promoter"
    +                     /note="promoter for bacteriophage T7 RNA polymerase"
    +ORIGIN
    +        1 gaggcggttt gcgtattggg cgctcttccg cttcctcgct cactgactcg ctgcgctcgg
    +       61 tcgttcggct gcggcgagcg gtatcagctc actcaaaggc ggtaatacgg ttatccacag
    +      121 aatcagggga taacgcagga aagaacatgt gagcaaaagg ccagcaaaag gccaggaacc
    +      181 gtaaaaaggc cgcgttgctg gcgtttttcc ataggctccg cccccctgac gagcatcaca
    +      241 aaaatcgacg ctcaagtcag aggtggcgaa acccgacagg actataaaga taccaggcgt
    +      301 ttccccctgg aagctccctc gtgcgctctc ctgttccgac cctgccgctt accggatacc
    +      361 tgtccgcctt tctcccttcg ggaagcgtgg cgctttctca tagctcacgc tgtaggtatc
    +      421 tcagttcggt gtaggtcgtt cgctccaagc tgggctgtgt gcacgaaccc cccgttcagc
    +      481 ccgaccgctg cgccttatcc ggtaactatc gtcttgagtc caacccggta agacacgact
    +      541 tatcgccact ggcagcagcc actggtaaca ggattagcag agcgaggtat gtaggcggtg
    +      601 ctacagagtt cttgaagtgg tggcctaact acggctacac tagaagaaca gtatttggta
    +      661 tctgcgctct gctgaagcca gttaccttcg gaaaaagagt tggtagctct tgatccggca
    +      721 aacaaaccac cgctggtagc ggtggttttt ttgtttgcaa gcagcagatt acgcgcagaa
    +      781 aaaaaggatc tcaagaagat cctttgatct tttctacggg gtctgacgct cagtggaacg
    +      841 aaaactcacg ttaagggatt ttggtcatga gattatcaaa aaggatcttc acctagatcc
    +      901 ttttaaatta aaaatgaagt tttaaatcaa tctaaagtat atatgagtaa acttggtctg
    +      961 acagttacca atgcttaatc agtgaggcac ctatctcagc gatctgtcta tttcgttcat
    +     1021 ccatagttgc ctgactcccc gtcgtgtaga taactacgat acgggagggc ttaccatctg
    +     1081 gccccagtgc tgcaatgata ccgcgagacc cacgctcacc ggctccagat ttatcagcaa
    +     1141 taaaccagcc agccggaagg gccgagcgca gaagtggtcc tgcaacttta tccgcctcca
    +     1201 tccagtctat taattgttgc cgggaagcta gagtaagtag ttcgccagtt aatagtttgc
    +     1261 gcaacgttgt tgccattgct acaggcatcg tggtgtcacg ctcgtcgttt ggtatggctt
    +     1321 cattcagctc cggttcccaa cgatcaaggc gagttacatg atcccccatg ttgtgcaaaa
    +     1381 aagcggttag ctccttcggt cctccgatcg ttgtcagaag taagttggcc gcagtgttat
    +     1441 cactcatggt tatggcagca ctgcataatt ctcttactgt catgccatcc gtaagatgct
    +     1501 tttctgtgac tggtgagtac tcaaccaagt cattctgaga atagtgtatg cggcgaccga
    +     1561 gttgctcttg cccggcgtca atacgggata ataccgcgcc acatagcaga actttaaaag
    +     1621 tgctcatcat tggaaaacgt tcttcggggc gaaaactctc aaggatctta ccgctgttga
    +     1681 gatccagttc gatgtaaccc actcgtgcac ccaactgatc ttcagcatct tttactttca
    +     1741 ccagcgtttc tgggtgagca aaaacaggaa ggcaaaatgc cgcaaaaaag ggaataaggg
    +     1801 cgacacggaa atgttgaata ctcatactct tcctttttca atattattga agcatttatc
    +     1861 agggttattg tctcatgagc ggatacatat ttgaatgtat ttagaaaaat aaacaaatag
    +     1921 gggttccgcg cacatttccc cgaaaagtgc cacctgacgt ctaagaaacc attattatca
    +     1981 tgacattaac ctataaaaat aggcgtatca cgaggccctt tcgtctcgcg cgtttcggtg
    +     2041 atgacggtga aaacctctga cacatgcagc tcccggagac ggtcacagct tgtctgtaag
    +     2101 cggatgccgg gagcagacaa gcccgtcagg gcgcgtcagc gggtgttggc gggtgtcggg
    +     2161 gctggcttaa ctatgcggca tcagagcaga ttgtactgag agtgcaccat atggacatat
    +     2221 tgtcgttaga acgcggctac aattaataca taaccttatg tatcatacac atacgattta
    +     2281 ggtgacacta tagaacgcgg ccgccagctg aagcttcgta cgctgcaggt cgacggatcc
    +     2341 ccgggttaat taaggcgcgc cagatctgtt tagcttgcct cgtccccgcc gggtcacccg
    +     2401 gccagcgaca tggaggccca gaataccctc cttgacagtc ttgacgtgcg cagctcaggg
    +     2461 gcatgatgtg actgtcgccc gtacatttag cccatacatc cccatgtata atcatttgca
    +     2521 tccatacatt ttgatggccg cacggcgcga agcaaaaatt acggctcctc gctgcagacc
    +     2581 tgcgagcagg gaaacgctcc cctcacagac gcgttgaatt gtccccacgc cgcgcccctg
    +     2641 tagagaaata taaaaggtta ggatttgcca ctgaggttct tctttcatat acttcctttt
    +     2701 aaaatcttgc taggatacag ttctcacatc acatccgaac ataaacaacc atgggtaagg
    +     2761 aaaagactca cgtttcgagg ccgcgattaa attccaacat ggatgctgat ttatatgggt
    +     2821 ataaatgggc tcgcgataat gtcgggcaat caggtgcgac aatctatcga ttgtatggga
    +     2881 agcccgatgc gccagagttg tttctgaaac atggcaaagg tagcgttgcc aatgatgtta
    +     2941 cagatgagat ggtcagacta aactggctga cggaatttat gcctcttccg accatcaagc
    +     3001 attttatccg tactcctgat gatgcatggt tactcaccac tgcgatcccc ggcaaaacag
    +     3061 cattccaggt attagaagaa tatcctgatt caggtgaaaa tattgttgat gcgctggcag
    +     3121 tgttcctgcg ccggttgcat tcgattcctg tttgtaattg tccttttaac agcgatcgcg
    +     3181 tatttcgtct cgctcaggcg caatcacgaa tgaataacgg tttggttgat gcgagtgatt
    +     3241 ttgatgacga gcgtaatggc tggcctgttg aacaagtctg gaaagaaatg cataagcttt
    +     3301 tgccattctc accggattca gtcgtcactc atggtgattt ctcacttgat aaccttattt
    +     3361 ttgacgaggg gaaattaata ggttgtattg atgttggacg agtcggaatc gcagaccgat
    +     3421 accaggatct tgccatccta tggaactgcc tcggtgagtt ttctccttca ttacagaaac
    +     3481 ggctttttca aaaatatggt attgataatc ctgatatgaa taaattgcag tttcatttga
    +     3541 tgctcgatga gtttttctaa tcagtactga caataaaaag attcttgttt tcaagaactt
    +     3601 gtcatttgta tagttttttt atattgtagt tgttctattt taatcaaatg ttagcgtgat
    +     3661 ttatattttt tttcgcctcg acatcatctg cccagatgcg aagttaagtg cgcagaaagt
    +     3721 aatatcatgc gtcaatcgta tgtgaatgct ggtcgctata ctgctgtcga ttcgatacta
    +     3781 acgccgccat ccagtttaaa cgagctcgaa ttcatcgatg atatcagatc cactagtggc
    +     3841 ctatgcggcc gcggatctgc cggtctccct atagtgagtc gtattaattt cgataagcca
    +     3901 ggttaacctg cattaatgaa tcggccaacg cgcgggga
    +//
    +LOCUS       CU329670                4538 bp    DNA     linear   PLN 26-APR-2024
    +DEFINITION  Schizosaccharomyces pombe strain 972h- genome assembly, chromosome:
    +            I.
    +ACCESSION   CU329670
    +VERSION     CU329670.1
    +DBLINK      BioProject: PRJNA13836
    +            BioSample: SAMEA3138176
    +KEYWORDS    .
    +SOURCE      Schizosaccharomyces pombe (fission yeast)
    +  ORGANISM  Schizosaccharomyces pombe
    +            Eukaryota; Fungi; Dikarya; Ascomycota; Taphrinomycotina;
    +            Schizosaccharomycetes; Schizosaccharomycetales;
    +            Schizosaccharomycetaceae; Schizosaccharomyces.
    +REFERENCE   1  (bases 1 to 4538)
    +  AUTHORS   Lang,B.F.
    +  TITLE     The mitochondrial genome of the fission yeast Schizosaccharomyces
    +            pombe: highly homologous introns are inserted at the same position
    +            of the otherwise less conserved cox1 genes in Schizosaccharomyces
    +            pombe and Aspergillus nidulans
    +  JOURNAL   EMBO J 3 (9), 2129-2136 (1984)
    +   PUBMED   6092057
    +REFERENCE   2  (bases 1 to 4538)
    +  AUTHORS   Lang,B.F., Ahne,F. and Bonen,L.
    +  TITLE     The mitochondrial genome of the fission yeast Schizosaccharomyces
    +            pombe. The cytochrome b gene has an intron closely related to the
    +            first two introns in the Saccharomyces cerevisiae cox1 gene
    +  JOURNAL   J Mol Biol 184 (3), 353-366 (1985)
    +   PUBMED   4046021
    +REFERENCE   3  (bases 1 to 4538)
    +  AUTHORS   Lang,B.F., Cedergren,R. and Gray,M.W.
    +  TITLE     The mitochondrial genome of the fission yeast, Schizosaccharomyces
    +            pombe. Sequence of the large-subunit ribosomal RNA gene, comparison
    +            of potential secondary structure in fungal mitochondrial
    +            large-subunit rRNAs and evolutionary considerations
    +  JOURNAL   Eur J Biochem 169 (3), 527-537 (1987)
    +   PUBMED   2446871
    +REFERENCE   4  (bases 1 to 4538)
    +  AUTHORS   Trinkl,H., Lang,B.F. and Wolf,K.
    +  TITLE     Nucleotide sequence of the gene encoding the small ribosomal RNA in
    +            the mitochondrial genome of the fission yeast Schizosaccharomyces
    +            pombe
    +  JOURNAL   Nucleic Acids Res 17 (16), 6730 (1989)
    +   PUBMED   2780299
    +REFERENCE   5  (bases 1 to 4538)
    +  AUTHORS   Wood,V., Gwilliam,R., Rajandream,M.A., Lyne,M., Lyne,R., Stewart,A.,
    +            Sgouros,J., Peat,N., Hayles,J., Baker,S., Basham,D., Bowman,S.,
    +            Brooks,K., Brown,D., Brown,S., Chillingworth,T., Churcher,C.,
    +            Collins,M., Connor,R., Cronin,A., Davis,P., Feltwell,T., Fraser,A.,
    +            Gentles,S., Goble,A., Hamlin,N., Harris,D., Hidalgo,J., Hodgson,G.,
    +            Holroyd,S., Hornsby,T., Howarth,S., Huckle,E.J., Hunt,S., Jagels,K.,
    +            James,K., Jones,L., Jones,M., Leather,S., McDonald,S., McLean,J.,
    +            Mooney,P., Moule,S., Mungall,K., Murphy,L., Niblett,D., Odell,C.,
    +            Oliver,K., O'Neil,S., Pearson,D., Quail,M.A., Rabbinowitsch,E.,
    +            Rutherford,K., Rutter,S., Saunders,D., Seeger,K., Sharp,S.,
    +            Skelton,J., Simmonds,M., Squares,R., Squares,S., Stevens,K.,
    +            Taylor,K., Taylor,R.G., Tivey,A., Walsh,S., Warren,T., Whitehead,S.,
    +            Woodward,J., Volckaert,G., Aert,R., Robben,J., Grymonprez,B.,
    +            Weltjens,I., Vanstreels,E., Rieger,M., Schafer,M., Muller-Auer,S.,
    +            Gabel,C., Fuchs,M., Dusterhoft,A., Fritzc,C., Holzer,E., Moestl,D.,
    +            Hilbert,H., Borzym,K., Langer,I., Beck,A., Lehrach,H., Reinhardt,R.,
    +            Pohl,T.M., Eger,P., Zimmermann,W., Wedler,H., Wambutt,R.,
    +            Purnelle,B., Goffeau,A., Cadieu,E., Dreano,S., Gloux,S., Lelaure,V.,
    +            Mottier,S., Galibert,F., Aves,S.J., Xiang,Z., Hunt,C., Moore,K.,
    +            Hurst,S.M., Lucas,M., Rochet,M., Gaillardin,C., Tallada,V.A.,
    +            Garzon,A., Thode,G., Daga,R.R., Cruzado,L., Jimenez,J., Sanchez,M.,
    +            del Rey,F., Benito,J., Dominguez,A., Revuelta,J.L., Moreno,S.,
    +            Armstrong,J., Forsburg,S.L., Cerutti,L., Lowe,T., McCombie,W.R.,
    +            Paulsen,I., Potashkin,J., Shpakovski,G.V., Ussery,D., Barrell,B.G.
    +            and Nurse,P.
    +  TITLE     The genome sequence of Schizosaccharomyces pombe
    +  JOURNAL   Nature 415 (6874), 871-880 (2002)
    +   PUBMED   11859360
    +  REMARK    Erratum:[Nature 2003 Jan 2;421(6918):94. Cerrutti L [corrected to
    +            Cerutti L]]
    +REFERENCE   6
    +  AUTHORS   Wood,V., Gwilliam,R., Rajandream,M.A., Lyne,M., Lyne,R., Stewart,A.,
    +            Sgouros,J., Peat,N., Hayles,J., Baker,S., Basham,D., Bowman,S.,
    +            Brooks,K., Brown,D., Brown,S., Chillingworth,T., Churcher,C.,
    +            Collins,M., Connor,R., Cronin,A., Davis,P., Feltwell,T., Fraser,A.,
    +            Gentles,S., Goble,A., Hamlin,N., Harris,D., Hidalgo,J., Hodgson,G.,
    +            Holroyd,S., Hornsby,T., Howarth,S., Huckle,E.J., Hunt,S., Jagels,K.,
    +            James,K., Jones,L., Jones,M., Leather,S., McDonald,S., McLean,J.,
    +            Mooney,P., Moule,S., Mungall,K., Murphy,L., Niblett,D., Odell,C.,
    +            Oliver,K., O'Neil,S., Pearson,D., Quail,M.A., Rabbinowitsch,E.,
    +            Rutherford,K., Rutter,S., Saunders,D., Seeger,K., Sharp,S.,
    +            Skelton,J., Simmonds,M., Squares,R., Squares,S., Stevens,K.,
    +            Taylor,K., Taylor,R.G., Tivey,A., Walsh,S., Warren,T., Whitehead,S.,
    +            Woodward,J., Volckaert,G., Aert,R., Robben,J., Grymonprez,B.,
    +            Weltjens,I., Vanstreels,E., Rieger,M., Schafer,M., Muller-Auer,S.,
    +            Gabel,C., Fuchs,M., Dusterhoft,A., Fritzc,C., Holzer,E., Moestl,D.,
    +            Hilbert,H., Borzym,K., Langer,I., Beck,A., Lehrach,H., Reinhardt,R.,
    +            Pohl,T.M., Eger,P., Zimmermann,W., Wedler,H., Wambutt,R.,
    +            Purnelle,B., Goffeau,A., Cadieu,E., Dreano,S., Gloux,S., Lelaure,V.,
    +            Mottier,S., Galibert,F., Aves,S.J., Xiang,Z., Hunt,C., Moore,K.,
    +            Hurst,S.M., Lucas,M., Rochet,M., Gaillardin,C., Tallada,V.A.,
    +            Garzon,A., Thode,G., Daga,R.R., Cruzado,L., Jimenez,J., Sanchez,M.,
    +            del Rey,F., Benito,J., Dominguez,A., Revuelta,J.L., Moreno,S.,
    +            Armstrong,J., Forsburg,S.L., Cerutti,L., Lowe,T., McCombie,W.R.,
    +            Paulsen,I., Potashkin,J., Shpakovski,G.V., Ussery,D., Barrell,B.G.
    +            and Nurse,P.
    +  TITLE     The genome sequence of Schizosaccharomyces pombe
    +  JOURNAL   Nature 415 (6874), 871-880 (2002)
    +   PUBMED   11859360
    +  REMARK    Erratum:[Nature 2003 Jan 2;421(6918):94. Cerrutti L [corrected to
    +            Cerutti L]]
    +REFERENCE   7  (bases 1 to 4538)
    +  AUTHORS   Schafer,B., Hansen,M. and Lang,B.F.
    +  TITLE     Transcription and RNA-processing in fission yeast mitochondria
    +  JOURNAL   RNA 11 (5), 785-795 (2005)
    +   PUBMED   15811919
    +REFERENCE   8
    +  AUTHORS   Wood,V.
    +  CONSRTM   The Schizosaccharomyces pombe Genome Sequencing Consortium
    +  TITLE     Direct Submission
    +  JOURNAL   Submitted (29-JUN-2007) European Schizosaccharomyces genome
    +            sequencing project, Sanger Institute, The Wellcome Trust Genome
    +            Campus, Hinxton, Cambridge CB10 1SA
    +REFERENCE   9
    +  AUTHORS   Wood,V. and Rutherford,K.
    +  CONSRTM   PomBase
    +  TITLE     Direct Submission
    +  JOURNAL   Submitted (13-MAR-2024) University of Cambridge, PomBase, Hopkins
    +            building, Tennis Court Rd, Cambridge, United Kingdom
    +COMMENT     On or before Jan 26, 2012 this sequence version replaced
    +            AL672256.4, AL009197.1, AL009227.1, AL021046.4, AL021809.4,
    +            AL021813.1, AL021817.2, AL031180.3, AL034486.1, AL034565.1,
    +            AL034583.1, AL035064.1, AL035248.2, AL035254.1, AL035439.1,
    +            AL096845.1, AL109734.1, AL109738.1, AL109739.1, AL109770.1,
    +            AL109820.1, AL109831.1, AL109832.1, AL109951.1, AL109988.1,
    +            AL110469.1, AL110509.2, AL117210.1, AL117212.1, AL117213.1,
    +            AL117390.1, AL121732.1, AL121741.1, AL121745.2, AL121764.1,
    +            AL121765.1, AL121770.1, AL122032.1, AL132667.1, AL132675.1,
    +            AL132714.1, AL132769.1, AL132779.2, AL132798.2, AL132828.1,
    +            AL132839.1, AL132983.1, AL132984.1, AL133154.2, AL133156.1,
    +            AL133157.1, AL133225.2, AL133302.1, AL133357.1, AL133359.1,
    +            AL133360.1, AL133361.1, AL133442.1, AL133498.1, AL133521.1,
    +            AL133522.1, AL135751.1, AL136078.1, AL136235.1, AL136499.1,
    +            AL136521.2, AL136538.1, AL137130.1, AL138666.2, AL138854.1,
    +            AL139315.1, AL157734.1, AL157811.1, AL157872.1, AL157917.1,
    +            AL157993.1, AL157994.1, AL158056.1, AL159180.1, AL159951.1,
    +            AL162531.1, AL162631.1, AL163031.1, AL163071.1, AL163191.2,
    +            AL163481.1, AL163529.1, AL353014.1, AL353860.2, AL355012.1,
    +            AL355013.1, AL355252.1, AL355452.1, AL355632.1, AL355652.1,
    +            AL355653.1, AL356333.1, AL356335.1, AL357232.1, AL358272.1,
    +            AL360054.1, AL360094.1, AL390095.1, AL390274.1, AL390814.1,
    +            AL391713.1, AL391744.1, AL391746.2, AL391783.1, AL441621.1,
    +            AL441624.1, AL512486.1, AL512487.1, AL512491.1, AL512493.1,
    +            AL512496.1, AL512549.1, AL512562.1, AL583902.1, AL590562.1,
    +            AL590582.1, AL590602.1, AL590605.1, AL590902.2, AL590903.1,
    +            AL691401.1, AL691402.1, AL691405.1, Z49811.1, Z50112.1, Z50113.1,
    +            Z50142.1, Z50728.2, Z54096.1, Z54142.2, Z54285.2, Z54308.1,
    +            Z54328.1, Z54354.1, Z54366.1, Z56276.2, Z64354.1, Z66568.2,
    +            Z67757.1, Z67961.2, Z67998.1, Z67999.1, Z68136.2, Z68144.1,
    +            Z68166.1, Z68197.2, Z68198.1, Z68887.1, Z69086.1, Z69239.1,
    +            Z69240.1, Z69368.1, Z69369.1, Z69380.1, Z69725.1, Z69726.1,
    +            Z69727.1, Z69728.1, Z69729.1, Z69730.1, Z69731.1, Z69795.1,
    +            Z69796.1, Z69944.1, Z70043.1, Z70690.1, Z70691.1, Z70721.1,
    +            Z73099.2, Z73100.2, Z81312.1, Z81317.1, Z94864.1, Z95334.1,
    +            Z95395.1, Z95396.2, Z97185.1, Z97208.1, Z97209.1, Z97210.2,
    +            Z98056.2, Z98529.1, Z98530.2, Z98531.2, Z98532.1, Z98533.1,
    +            Z98559.1, Z98560.1, Z98595.1, Z98596.1, Z98597.1, Z98598.1,
    +            Z98600.1, Z98601.1, Z98602.1, Z98603.1, Z98762.1, Z98763.1,
    +            Z98849.1, Z98944.1, Z98974.2, Z98975.1, Z98977.4, Z98978.1,
    +            Z98979.1, Z98980.1, Z98981.3, Z99091.2, Z99126.1, Z99161.1,
    +            Z99162.1, Z99163.2, Z99164.2, Z99165.1, Z99166.1, Z99167.1,
    +            Z99168.1, Z99258.1, Z99259.1, Z99260.2, Z99261.1, Z99262.1,
    +            Z99292.1, Z99295.1, Z99296.2, Z99531.1, Z99532.2, Z99568.2,
    +            Z99753.1.
    +FEATURES             Location/Qualifiers
    +     source          1..4538
    +                     /organism="Schizosaccharomyces pombe"
    +                     /mol_type="genomic DNA"
    +                     /strain="972h-"
    +                     /db_xref="taxon:4896"
    +                     /chromosome="I"
    +     gene            <1..676
    +                     /locus_tag="SPOM_SPAPB1A10.08"
    +     CDS             <1..393
    +                     /locus_tag="SPOM_SPAPB1A10.08"
    +                     /codon_start=1
    +                     /product="conserved fungal protein"
    +                     /protein_id="CAC21481.2"
    +                     /translation="MMTRMELRPLEIGFSKALTEVAPVTCQCECWDHNLCSSQASEMDL
    +                     IYQSQDTHSCASKQDAVFQLLSETKIPVPNRYRKISHRLSTLSNKKTLKSQLDRFLSSS
    +                     KKLHNDDVNRGDYCFLLSTPVECSASTNSHSYDCLWNFSCNSFPEYSSYSASETSSVAS
    +                     YSYYSGPNPATPSSSSCNLVNANSLDIYLNINNLKKSKSVPRLRGQFMEPVEHNHPLSK
    +                     SLEEQSSFLEQSKDASSNLTACNRSGSSLSSNFYSSRLSKKTSLASLNKSRASLQHKIM
    +                     SLSRNIIRRVFHKPEVHLDPSASILNLSSSHGESNLTNGLLCQNFKLFQDDWLMEDCAP
    +                     DANFTLYTPLQPWEKRSVKPEIRRPRLNPNFFRVFVLEAQMRRAGKLSANTAGRAQLIY
    +                     LPKPAVTFSTSPLHVEL"
    +     gene            complement(<1..1972)
    +                     /locus_tag="SPOM_SPNCRNA.2846"
    +     ncRNA           complement(<1..1972)
    +                     /ncRNA_class="lncRNA"
    +                     /locus_tag="SPOM_SPNCRNA.2846"
    +                     /product="non-coding RNA"
    +     3'UTR           394..676
    +                     /locus_tag="SPOM_SPAPB1A10.08"
    +     gene            1001..3538
    +                     /gene="ase1"
    +                     /locus_tag="SPOM_SPAPB1A10.09"
    +     5'UTR           1001..1173
    +                     /gene="ase1"
    +                     /locus_tag="SPOM_SPAPB1A10.09"
    +     CDS             join(1174..1597,1645..3416)
    +                     /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"
    +     3'UTR           3417..3538
    +                     /gene="ase1"
    +                     /locus_tag="SPOM_SPAPB1A10.09"
    +     gene            complement(3510..>4538)
    +                     /gene="ypt71"
    +                     /locus_tag="SPOM_SPAPB1A10.10C"
    +     3'UTR           complement(3510..3690)
    +                     /gene="ypt71"
    +                     /locus_tag="SPOM_SPAPB1A10.10C"
    +     CDS             complement(join(3691..4137,4192..>4290))
    +                     /gene="ypt71"
    +                     /locus_tag="SPOM_SPAPB1A10.10C"
    +                     /codon_start=1
    +                     /product="GTPase Ypt71"
    +                     /protein_id="CAC21483.1"
    +                     /translation="MSAQKRVFLKVVILGDSGVGKTCLMNQFVNQKFSREYKATIGADF
    +                     LTKDVVVDDKLVTLQLWDTAGQERFQSLGMAFYRGADCCVIVYNVNNSKSFDSVENWRQ
    +                     EFLYQTSQDECAFPFIIVGNQIDKDASKRAVSLHRALDYCKSKHGSNMIHFEASAKENT
    +                     NVTDLFETVSRLALENESSRDDFVNDFSEPLLLSKPLNNTSSCNC"
    +     gene            4049..>4538
    +                     /locus_tag="SPOM_SPNCRNA.2847"
    +     ncRNA           4049..>4538
    +                     /ncRNA_class="lncRNA"
    +                     /locus_tag="SPOM_SPNCRNA.2847"
    +                     /product="non-coding RNA"
    +ORIGIN
    +        1 atcatcagac gtgtatttca caagccagaa gtgcatttgg atccaagtgc ctccatttta
    +       61 aatctctcat cttcgcatgg cgaaagcaac ctgacaaatg gtttgctttg tcaaaatttc
    +      121 aagctttttc aggatgattg gttgatggag gattgtgcgc cagatgccaa tttcactttg
    +      181 tacaccccgc ttcaaccctg ggaaaagcga agtgtgaaac ctgaaatcag acgtcctcga
    +      241 ttaaatccta attttttccg agtatttgtt ttagaagctc aaatgcgacg agctggaaag
    +      301 ctatcagcaa acactgctgg ccgagcccag ttaatttacc tcccaaagcc tgccgttacc
    +      361 ttctccacta gccctttgca tgttgaattg taaaaattta acgcatgact tatatacatt
    +      421 tgcattcttc caagctggtt atatttattt tcattttttt ctcacccaat acttttttat
    +      481 ccctactgtc tttatggaca atcgactcac aattgtttct ttttgttgta tatgattttt
    +      541 tttttaaagg aaatgggttt cgcgatactg ggttgaatcc caattgcggt taatattaca
    +      601 taaaataatt ctcccatagt cctagatcct gtctttgaat atgagcaaat aaaagaattg
    +      661 aacaaatcat gaatgctttt ctctcttaga tgatattttg tatgcataag tctaattata
    +      721 ttgattacga taagacttaa aaagtaagcc tttgtatcct tttaagcagt atttgaattt
    +      781 tcttgtatca tattttaggt agagcaaaag ataccagttt gtagaacttt atgtgcttcc
    +      841 ttacattggt atatttcagg cacataaata ttcttcaact tacaattcta agtattttgt
    +      901 ttatactaaa aggagctgaa taacgtttat acagtgctga cattgaaatc tatttgcttt
    +      961 ctttggaata taagcgcatg ctgagttact ttcgcaggcc aagccatatc caaccaccat
    +     1021 ttttgtgcca agcttttatg caaggttaat tccttgtact gcttgttatg ttataatata
    +     1081 tcaacatctt aacagttttc atatcttcct ttatattcta ttaattgaat ttcaaacatc
    +     1141 gttttattga gctcatttac atcaaccggt tcaatgcaaa cagtaatgat ggatgacatt
    +     1201 caaagcactg attctattgc tgaaaaagat aatcactcta ataatgaatc taactttact
    +     1261 tggaaagcgt ttcgtgaaca agtggaaaag catttttcta aaattgaaag gcttcaccaa
    +     1321 gtccttggaa cagatggaga caattcatca ttatttgagt tgtttacaac ggcaatgaat
    +     1381 gcccagcttc atgaaatgga acagtgccag aaaaaacttg aagatgactg tcagcaaaga
    +     1441 attgattcaa tcagattttt ggtttcctca ttaaagttaa cggatgatac ttctagtctc
    +     1501 aaaattgagt ctcctttaat tcagtgtttg aatcgtttgt caatggtaga aggacaatat
    +     1561 atggcacagt atgatcaaaa gttaagtacg attaaaggta tgtaatcgtc tttaatttag
    +     1621 acttgtgttt taactgatgt atagaaatgt atcacaaatt ggagtcatat tgtaaccgct
    +     1681 taggaagtcc gttcgtttta cctgattttg agaattcatt tttatctgat gtatccgatg
    +     1741 cttttactga atctttgaga ggacgcatca acgaagccga aaaggagatt gatgcgagat
    +     1801 tagaggttat taattccttt gaagaagaaa ttttgggttt gtggtctgaa ctcggtgttg
    +     1861 agcccgctga tgttccacaa tacgaacaat tgcttgaatc ccatactaat cgaccaaatg
    +     1921 atgtttatgt tactcaagaa cttatcgacc aactttgcaa gcaaaaagaa gttttttccg
    +     1981 ctgaaaaaga aaagagaagt gatcatttaa aaagtataca atcagaagtt agcaacttgt
    +     2041 ggaataagct tcaagtttct cccaatgaac aaagtcaatt tggcgattca tcaaacatta
    +     2101 atcaagaaaa tatttcatta tgggaaactg aacttgaaaa acttcatcag ttaaaaaagg
    +     2161 agcatttacc cattttttta gaagactgtc gtcaacaaat tcttcagctt tgggattctc
    +     2221 tgttttattc agaagaacaa agaaagtcct ttacacctat gtatgaagac attattacag
    +     2281 agcaggttct tacggcccat gaaaactata taaagcaact agaggccgaa gtttctgcta
    +     2341 ataagtcctt tttaagctta attaatcgct atgcctcttt aatagaagga aagaaagagc
    +     2401 ttgaagctag ttctaatgat gcctctcgtc taacacaacg gggacgccgg gacccaggtt
    +     2461 tacttctacg tgaagagaaa atccgtaagc gactttctag agaacttcct aaggttcagt
    +     2521 cgctgcttat accagagatt acagcatggg aagaaagaaa tggaaggacg ttcctttttt
    +     2581 atgatgaacc acttctcaag atttgccaag aggccactca accaaaatca ttatatagaa
    +     2641 gtgcaagtgc tgccgcaaac cgcccgaaaa cagcaactac aacggactct gttaatagaa
    +     2701 caccttctca acgagggcgt gtagctgtac cttcaacacc aagtgttagg tccgcttctc
    +     2761 gagctatgac gagtccaagg acaccgcttc ctagagtaaa aaacactcaa aatccaagtc
    +     2821 gttccattag tgcagaaccg ccatcagcaa ccagtaccgc caatagaaga caccccactg
    +     2881 ctaatcgaat tgatataaac gctagattaa acagtgctag tcggtctcga agcgcgaaca
    +     2941 tgataagaca aggggcaaat ggtagtgaca gcaatatgtc ttcttcaccc gtttctggaa
    +     3001 attccaatac cccttttaac aagtttccaa attctgtatc tcgcaataca cattttgaat
    +     3061 ccaagtcacc gcacccaaat tactctcgaa ctcctcatga aacgtattca aaggcttcat
    +     3121 ctaagaacgt cccattaagt cctccaaagc agcgtgtagt taatgaacac gctttaaata
    +     3181 ttatgtcgga aaaattgcaa agaactaatc tgaaagaaca aacacccgag atggacattg
    +     3241 aaaacagctc gcagaacctt cctttttctc ctatgaagat atcccccata agagcatcac
    +     3301 ccgtaaagac aattccatca tcaccgtccc ccactaccaa cattttttct gctccactca
    +     3361 acaatattac aaattgtaca ccgatggagg atgaatgggg agaagaaggc ttttaagctt
    +     3421 cttatttacc taatcgatca aatttaaata tacatatttt tgcatatgaa tacagcatat
    +     3481 agataattca taaaagttta ttaactgagg tcataattaa aagactattt acacctaaaa
    +     3541 aaaaacgtgt atcaatagag ggaaaagaga agaattaaga acagaaagta accatagttt
    +     3601 tgttaaaata gcaatgtaaa aaaatattat gaaaagaaaa cgtatagcac attttgaaat
    +     3661 gtaaaagaat ctgagagagc gtgtgaatat ctagcaatta caagaagatg tattattcaa
    +     3721 aggctttgaa agaagcaaag gttcagagaa gtcattaaca aagtcatctc tcgagctttc
    +     3781 attttctaaa gctaaacgac tgactgtttc gaaaaggtca gtaacgtttg tattttcttt
    +     3841 tgcactagct tcaaaatgaa tcatatttga tccatgtttg gatttgcaat agtcaagagc
    +     3901 tcgatgaaga gatacggctc gtttagacgc gtctttgtcg atttgatttc caacgataat
    +     3961 gaaagggaat gcacattcat cttgtgaagt ttgatataaa aattcttgcc tccagttttc
    +     4021 tactgagtca aaagacttcg agttattcac attataaaca attacacaac aatcggcccc
    +     4081 tctgtaaaaa gccattccca ggctttgaaa tcgttcttga ccagcagtat cccaaagctg
    +     4141 tttataatta gcaaacgaat ttagatgggc ggaacttata ttggaactta cctgtaatgt
    +     4201 gaccaatttg tcgtcaacca caacgtcctt ggttaaaaaa tcagcaccga tggtagcttt
    +     4261 atattcgcga ctaaactttt gattgacgaa ctaaaatgac gatgttaaca aattgccaaa
    +     4321 gcaatactca tagagaagct gatgtaaaga tcgttaacca tatttgagct agtatttaat
    +     4381 aacaaagtga ataaatttta aaagcaatca ccttgtagcg acaaataaca acttatcgac
    +     4441 ataaaatcaa tgggaaattg cagtattgga ttttacagct caatacaaaa accaaaaaga
    +     4501 aaaatatact gaacgtataa aatttaacgc ttcaattg
    +//
    +
    +
    +
    from pydna.design import primer_design
    +#Finding the feature containing the CDS with ase1 as a type qualifier
    +gene = next(f for f in pombe_chromosome_I.features if f.type == "CDS" and
    +                "gene" in f.qualifiers and
    +                "ase1" in f.qualifiers["gene"])
    +
    +# Using the primer_design function to design primers to amplify the CDS
    +# `min` and `max` can be used on a SeqFeature to get the start (leftmost) and end (rightmost) positions
    +# this works both on feature with SimpleLocation and CompoundLocation
    +amplicon = primer_design(pombe_chromosome_I[min(gene):max(gene)], target_tm=55)
    +
    +fwd_align, rvs_align = amplicon.primers()
    +fwd_primer_ase1 = Dseqrecord("ACCATGTCGAC") + fwd_align # Adding a SalI cut site
    +rvs_primer_ase1 = Dseqrecord("GGCGCGCCAT") + rvs_align # Adding a AscI cut site
    +
    +# Printing out the primers
    +
    +print(fwd_primer_ase1.seq, ', Tm: ', tm_default(fwd_align))
    +print(rvs_primer_ase1.seq, ', Tm: ', tm_default(rvs_align))
    +
    +
    +
    ACCATGTCGACATGCAAACAGTAATGATGGA , Tm:  57.24061148156318
    +GGCGCGCCATTAAAAGCCTTCTTCTCCC , Tm:  56.64459495003314
    +
    +
    +
    # Performing a PCR to check that the primers are specific. An error message is returned if otherwise.
    +
    +pcr_product = pcr(fwd_primer_ase1, rvs_primer_ase1, pombe_chromosome_I)
    +
    +# Printing out the PCR results
    +
    +print(pcr_product.format("gb"))
    +
    +
    +
    LOCUS       2263bp_PCR_prod         2263 bp    DNA     linear   UNK 01-JAN-1980
    +DEFINITION  pcr_product_description_description.
    +ACCESSION   2263bp
    +VERSION     2263bp
    +DBLINK      BioProject: PRJNA13836
    +            BioSample: SAMEA3138176
    +KEYWORDS    .
    +SOURCE      .
    +  ORGANISM  .
    +            .
    +FEATURES             Location/Qualifiers
    +     CDS             join(1..424,472..2243)
    +                     /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     1..20
    +                     /label="name"
    +                     /PCR_conditions="primer
    +                     sequence:ACCATGTCGACATGCAAACAGTAATGATGGA"
    +                     /ApEinfo_fwdcolor="#baffa3"
    +                     /ApEinfo_revcolor="#ffbaba"
    +     primer_bind     complement(2225..2243)
    +                     /label="name"
    +                     /PCR_conditions="primer
    +                     sequence:GGCGCGCCATTAAAAGCCTTCTTCTCCC"
    +                     /ApEinfo_fwdcolor="#baffa3"
    +                     /ApEinfo_revcolor="#ffbaba"
    +ORIGIN
    +        1 accatgtcga catgcaaaca gtaatgatgg atgacattca aagcactgat tctattgctg
    +       61 aaaaagataa tcactctaat aatgaatcta actttacttg gaaagcgttt cgtgaacaag
    +      121 tggaaaagca tttttctaaa attgaaaggc ttcaccaagt ccttggaaca gatggagaca
    +      181 attcatcatt atttgagttg tttacaacgg caatgaatgc ccagcttcat gaaatggaac
    +      241 agtgccagaa aaaacttgaa gatgactgtc agcaaagaat tgattcaatc agatttttgg
    +      301 tttcctcatt aaagttaacg gatgatactt ctagtctcaa aattgagtct cctttaattc
    +      361 agtgtttgaa tcgtttgtca atggtagaag gacaatatat ggcacagtat gatcaaaagt
    +      421 taagtacgat taaaggtatg taatcgtctt taatttagac ttgtgtttta actgatgtat
    +      481 agaaatgtat cacaaattgg agtcatattg taaccgctta ggaagtccgt tcgttttacc
    +      541 tgattttgag aattcatttt tatctgatgt atccgatgct tttactgaat ctttgagagg
    +      601 acgcatcaac gaagccgaaa aggagattga tgcgagatta gaggttatta attcctttga
    +      661 agaagaaatt ttgggtttgt ggtctgaact cggtgttgag cccgctgatg ttccacaata
    +      721 cgaacaattg cttgaatccc atactaatcg accaaatgat gtttatgtta ctcaagaact
    +      781 tatcgaccaa ctttgcaagc aaaaagaagt tttttccgct gaaaaagaaa agagaagtga
    +      841 tcatttaaaa agtatacaat cagaagttag caacttgtgg aataagcttc aagtttctcc
    +      901 caatgaacaa agtcaatttg gcgattcatc aaacattaat caagaaaata tttcattatg
    +      961 ggaaactgaa cttgaaaaac ttcatcagtt aaaaaaggag catttaccca tttttttaga
    +     1021 agactgtcgt caacaaattc ttcagctttg ggattctctg ttttattcag aagaacaaag
    +     1081 aaagtccttt acacctatgt atgaagacat tattacagag caggttctta cggcccatga
    +     1141 aaactatata aagcaactag aggccgaagt ttctgctaat aagtcctttt taagcttaat
    +     1201 taatcgctat gcctctttaa tagaaggaaa gaaagagctt gaagctagtt ctaatgatgc
    +     1261 ctctcgtcta acacaacggg gacgccggga cccaggttta cttctacgtg aagagaaaat
    +     1321 ccgtaagcga ctttctagag aacttcctaa ggttcagtcg ctgcttatac cagagattac
    +     1381 agcatgggaa gaaagaaatg gaaggacgtt ccttttttat gatgaaccac ttctcaagat
    +     1441 ttgccaagag gccactcaac caaaatcatt atatagaagt gcaagtgctg ccgcaaaccg
    +     1501 cccgaaaaca gcaactacaa cggactctgt taatagaaca ccttctcaac gagggcgtgt
    +     1561 agctgtacct tcaacaccaa gtgttaggtc cgcttctcga gctatgacga gtccaaggac
    +     1621 accgcttcct agagtaaaaa acactcaaaa tccaagtcgt tccattagtg cagaaccgcc
    +     1681 atcagcaacc agtaccgcca atagaagaca ccccactgct aatcgaattg atataaacgc
    +     1741 tagattaaac agtgctagtc ggtctcgaag cgcgaacatg ataagacaag gggcaaatgg
    +     1801 tagtgacagc aatatgtctt cttcacccgt ttctggaaat tccaataccc cttttaacaa
    +     1861 gtttccaaat tctgtatctc gcaatacaca ttttgaatcc aagtcaccgc acccaaatta
    +     1921 ctctcgaact cctcatgaaa cgtattcaaa ggcttcatct aagaacgtcc cattaagtcc
    +     1981 tccaaagcag cgtgtagtta atgaacacgc tttaaatatt atgtcggaaa aattgcaaag
    +     2041 aactaatctg aaagaacaaa cacccgagat ggacattgaa aacagctcgc agaaccttcc
    +     2101 tttttctcct atgaagatat cccccataag agcatcaccc gtaaagacaa ttccatcatc
    +     2161 accgtccccc actaccaaca ttttttctgc tccactcaac aatattacaa attgtacacc
    +     2221 gatggaggat gaatggggag aagaaggctt ttaatggcgc gcc
    +//
    +
    +
    +
    # Cleaving the cloning vector with restriction enzymes
    +
    +plasmid_digests = vector.cut(SalI, AscI)
    +
    +# Cleaving the gene fragment with restriction enzymes
    +
    +gene_digests = Dseqrecord(pcr_product).cut(SalI, AscI)
    +
    +# Printing out the digests
    +print(plasmid_digests) 
    +print(gene_digests)
    +
    +
    +
    (Dseqrecord(-30), Dseqrecord(-3916))
    +(Dseqrecord(-10), Dseqrecord(-2255), Dseqrecord(-6))
    +
    +
    +
    # Ligating, then circularising the synthetic plasmid
    +
    +synthetic_vector = plasmid_digests[1] + gene_digests [1]
    +synthetic_vector = synthetic_vector.looped()
    +
    +# Printing out the completed cloning vector
    +
    +print(synthetic_vector.format("gb"))
    +
    +
    +
    LOCUS       name                    6163 bp    DNA     circular UNK 01-JAN-1980
    +DEFINITION  description.
    +ACCESSION   id
    +VERSION     id
    +KEYWORDS    .
    +SOURCE      .
    +  ORGANISM  .
    +            .
    +FEATURES             Location/Qualifiers
    +     gene            52..1408
    +                     /label="kanMX"
    +                     /note="yeast selectable marker conferring kanamycin
    +                     resistance (Wach et al., 1994)"
    +     promoter        52..395
    +                     /label="TEF promoter"
    +                     /note="Ashbya gossypii TEF promoter"
    +     CDS             396..1205
    +                     /codon_start=1
    +                     /gene="aph(3')-Ia"
    +                     /product="aminoglycoside phosphotransferase"
    +                     /label="KanR"
    +                     /note="confers resistance to kanamycin"
    +                     /translation="MGKEKTHVSRPRLNSNMDADLYGYKWARDNVGQSGATIYRLYGKP
    +                     DAPELFLKHGKGSVANDVTDEMVRLNWLTEFMPLPTIKHFIRTPDDAWLLTTAIPGKTA
    +                     FQVLEEYPDSGENIVDALAVFLRRLHSIPVCNCPFNSDRVFRLAQAQSRMNNGLVDASD
    +                     FDDERNGWPVEQVWKEMHKLLPFSPDSVVTHGDFSLDNLIFDEGKLIGCIDVGRVGIAD
    +                     RYQDLAILWNCLGEFSPSLQKRLFQKYGIDNPDMNKLQFHLMLDEFF"
    +     primer_bind     complement(463..482)
    +                     /label="Kan-R"
    +                     /note="Kanamycin resistance gene, reverse primer"
    +     terminator      1211..1408
    +                     /label="TEF terminator"
    +                     /note="Ashbya gossypii TEF terminator"
    +     primer_bind     complement(1512..1531)
    +                     /label="T7"
    +                     /note="T7 promoter, forward primer"
    +     promoter        complement(1513..1531)
    +                     /label="T7 promoter"
    +                     /note="promoter for bacteriophage T7 RNA polymerase"
    +     primer_bind     complement(1618..1635)
    +                     /label="L4440"
    +                     /note="L4440 vector, forward primer"
    +     rep_origin      complement(1789..2377)
    +                     /direction=LEFT
    +                     /label="ori"
    +                     /note="high-copy-number ColE1/pMB1/pBR322/pUC origin of
    +                     replication"
    +     primer_bind     complement(1869..1888)
    +                     /label="pBR322ori-F"
    +                     /note="pBR322 origin, forward primer"
    +     CDS             complement(2548..3408)
    +                     /codon_start=1
    +                     /gene="bla"
    +                     /product="beta-lactamase"
    +                     /label="AmpR"
    +                     /note="confers resistance to ampicillin, carbenicillin, and
    +                     related antibiotics"
    +                     /translation="MSIQHFRVALIPFFAAFCLPVFAHPETLVKVKDAEDQLGARVGYI
    +                     ELDLNSGKILESFRPEERFPMMSTFKVLLCGAVLSRIDAGQEQLGRRIHYSQNDLVEYS
    +                     PVTEKHLTDGMTVRELCSAAITMSDNTAANLLLTTIGGPKELTAFLHNMGDHVTRLDRW
    +                     EPELNEAIPNDERDTTMPVAMATTLRKLLTGELLTLASRQQLIDWMEADKVAGPLLRSA
    +                     LPAGWFIADKSGAGERGSRGIIAALGPDGKPSRIVVIYTTGSQATMDERNRQIAEIGAS
    +                     LIKHW"
    +     primer_bind     3171..3190
    +                     /label="Amp-R"
    +                     /note="Ampicillin resistance gene, reverse primer"
    +     promoter        complement(3409..3513)
    +                     /gene="bla"
    +                     /label="AmpR promoter"
    +     primer_bind     3581..3599
    +                     /label="pBRforEco"
    +                     /note="pBR322 vectors, upsteam of EcoRI site, forward
    +                     primer"
    +     primer_bind     complement(3637..3659)
    +                     /label="pGEX 3'"
    +                     /note="pGEX vectors, reverse primer"
    +     primer_bind     3759..3778
    +                     /label="pRS-marker"
    +                     /note="pRS vectors, use to sequence yeast selectable
    +                     marker"
    +     promoter        3859..3877
    +                     /label="SP6 promoter"
    +                     /note="promoter for bacteriophage SP6 RNA polymerase"
    +     primer_bind     3859..3876
    +                     /label="SP6"
    +                     /note="SP6 promoter, forward primer"
    +     primer_bind     complement(6131..6149)
    +                     /label="name"
    +                     /PCR_conditions="primer
    +                     sequence:GGCGCGCCATTAAAAGCCTTCTTCTCCC"
    +                     /ApEinfo_fwdcolor="#baffa3"
    +                     /ApEinfo_revcolor="#ffbaba"
    +ORIGIN
    +        1 cgcgccagat ctgtttagct tgcctcgtcc ccgccgggtc acccggccag cgacatggag
    +       61 gcccagaata ccctccttga cagtcttgac gtgcgcagct caggggcatg atgtgactgt
    +      121 cgcccgtaca tttagcccat acatccccat gtataatcat ttgcatccat acattttgat
    +      181 ggccgcacgg cgcgaagcaa aaattacggc tcctcgctgc agacctgcga gcagggaaac
    +      241 gctcccctca cagacgcgtt gaattgtccc cacgccgcgc ccctgtagag aaatataaaa
    +      301 ggttaggatt tgccactgag gttcttcttt catatacttc cttttaaaat cttgctagga
    +      361 tacagttctc acatcacatc cgaacataaa caaccatggg taaggaaaag actcacgttt
    +      421 cgaggccgcg attaaattcc aacatggatg ctgatttata tgggtataaa tgggctcgcg
    +      481 ataatgtcgg gcaatcaggt gcgacaatct atcgattgta tgggaagccc gatgcgccag
    +      541 agttgtttct gaaacatggc aaaggtagcg ttgccaatga tgttacagat gagatggtca
    +      601 gactaaactg gctgacggaa tttatgcctc ttccgaccat caagcatttt atccgtactc
    +      661 ctgatgatgc atggttactc accactgcga tccccggcaa aacagcattc caggtattag
    +      721 aagaatatcc tgattcaggt gaaaatattg ttgatgcgct ggcagtgttc ctgcgccggt
    +      781 tgcattcgat tcctgtttgt aattgtcctt ttaacagcga tcgcgtattt cgtctcgctc
    +      841 aggcgcaatc acgaatgaat aacggtttgg ttgatgcgag tgattttgat gacgagcgta
    +      901 atggctggcc tgttgaacaa gtctggaaag aaatgcataa gcttttgcca ttctcaccgg
    +      961 attcagtcgt cactcatggt gatttctcac ttgataacct tatttttgac gaggggaaat
    +     1021 taataggttg tattgatgtt ggacgagtcg gaatcgcaga ccgataccag gatcttgcca
    +     1081 tcctatggaa ctgcctcggt gagttttctc cttcattaca gaaacggctt tttcaaaaat
    +     1141 atggtattga taatcctgat atgaataaat tgcagtttca tttgatgctc gatgagtttt
    +     1201 tctaatcagt actgacaata aaaagattct tgttttcaag aacttgtcat ttgtatagtt
    +     1261 tttttatatt gtagttgttc tattttaatc aaatgttagc gtgatttata ttttttttcg
    +     1321 cctcgacatc atctgcccag atgcgaagtt aagtgcgcag aaagtaatat catgcgtcaa
    +     1381 tcgtatgtga atgctggtcg ctatactgct gtcgattcga tactaacgcc gccatccagt
    +     1441 ttaaacgagc tcgaattcat cgatgatatc agatccacta gtggcctatg cggccgcgga
    +     1501 tctgccggtc tccctatagt gagtcgtatt aatttcgata agccaggtta acctgcatta
    +     1561 atgaatcggc caacgcgcgg ggagaggcgg tttgcgtatt gggcgctctt ccgcttcctc
    +     1621 gctcactgac tcgctgcgct cggtcgttcg gctgcggcga gcggtatcag ctcactcaaa
    +     1681 ggcggtaata cggttatcca cagaatcagg ggataacgca ggaaagaaca tgtgagcaaa
    +     1741 aggccagcaa aaggccagga accgtaaaaa ggccgcgttg ctggcgtttt tccataggct
    +     1801 ccgcccccct gacgagcatc acaaaaatcg acgctcaagt cagaggtggc gaaacccgac
    +     1861 aggactataa agataccagg cgtttccccc tggaagctcc ctcgtgcgct ctcctgttcc
    +     1921 gaccctgccg cttaccggat acctgtccgc ctttctccct tcgggaagcg tggcgctttc
    +     1981 tcatagctca cgctgtaggt atctcagttc ggtgtaggtc gttcgctcca agctgggctg
    +     2041 tgtgcacgaa ccccccgttc agcccgaccg ctgcgcctta tccggtaact atcgtcttga
    +     2101 gtccaacccg gtaagacacg acttatcgcc actggcagca gccactggta acaggattag
    +     2161 cagagcgagg tatgtaggcg gtgctacaga gttcttgaag tggtggccta actacggcta
    +     2221 cactagaaga acagtatttg gtatctgcgc tctgctgaag ccagttacct tcggaaaaag
    +     2281 agttggtagc tcttgatccg gcaaacaaac caccgctggt agcggtggtt tttttgtttg
    +     2341 caagcagcag attacgcgca gaaaaaaagg atctcaagaa gatcctttga tcttttctac
    +     2401 ggggtctgac gctcagtgga acgaaaactc acgttaaggg attttggtca tgagattatc
    +     2461 aaaaaggatc ttcacctaga tccttttaaa ttaaaaatga agttttaaat caatctaaag
    +     2521 tatatatgag taaacttggt ctgacagtta ccaatgctta atcagtgagg cacctatctc
    +     2581 agcgatctgt ctatttcgtt catccatagt tgcctgactc cccgtcgtgt agataactac
    +     2641 gatacgggag ggcttaccat ctggccccag tgctgcaatg ataccgcgag acccacgctc
    +     2701 accggctcca gatttatcag caataaacca gccagccgga agggccgagc gcagaagtgg
    +     2761 tcctgcaact ttatccgcct ccatccagtc tattaattgt tgccgggaag ctagagtaag
    +     2821 tagttcgcca gttaatagtt tgcgcaacgt tgttgccatt gctacaggca tcgtggtgtc
    +     2881 acgctcgtcg tttggtatgg cttcattcag ctccggttcc caacgatcaa ggcgagttac
    +     2941 atgatccccc atgttgtgca aaaaagcggt tagctccttc ggtcctccga tcgttgtcag
    +     3001 aagtaagttg gccgcagtgt tatcactcat ggttatggca gcactgcata attctcttac
    +     3061 tgtcatgcca tccgtaagat gcttttctgt gactggtgag tactcaacca agtcattctg
    +     3121 agaatagtgt atgcggcgac cgagttgctc ttgcccggcg tcaatacggg ataataccgc
    +     3181 gccacatagc agaactttaa aagtgctcat cattggaaaa cgttcttcgg ggcgaaaact
    +     3241 ctcaaggatc ttaccgctgt tgagatccag ttcgatgtaa cccactcgtg cacccaactg
    +     3301 atcttcagca tcttttactt tcaccagcgt ttctgggtga gcaaaaacag gaaggcaaaa
    +     3361 tgccgcaaaa aagggaataa gggcgacacg gaaatgttga atactcatac tcttcctttt
    +     3421 tcaatattat tgaagcattt atcagggtta ttgtctcatg agcggataca tatttgaatg
    +     3481 tatttagaaa aataaacaaa taggggttcc gcgcacattt ccccgaaaag tgccacctga
    +     3541 cgtctaagaa accattatta tcatgacatt aacctataaa aataggcgta tcacgaggcc
    +     3601 ctttcgtctc gcgcgtttcg gtgatgacgg tgaaaacctc tgacacatgc agctcccgga
    +     3661 gacggtcaca gcttgtctgt aagcggatgc cgggagcaga caagcccgtc agggcgcgtc
    +     3721 agcgggtgtt ggcgggtgtc ggggctggct taactatgcg gcatcagagc agattgtact
    +     3781 gagagtgcac catatggaca tattgtcgtt agaacgcggc tacaattaat acataacctt
    +     3841 atgtatcata cacatacgat ttaggtgaca ctatagaacg cggccgccag ctgaagcttc
    +     3901 gtacgctgca ggtcgacatg caaacagtaa tgatggatga cattcaaagc actgattcta
    +     3961 ttgctgaaaa agataatcac tctaataatg aatctaactt tacttggaaa gcgtttcgtg
    +     4021 aacaagtgga aaagcatttt tctaaaattg aaaggcttca ccaagtcctt ggaacagatg
    +     4081 gagacaattc atcattattt gagttgttta caacggcaat gaatgcccag cttcatgaaa
    +     4141 tggaacagtg ccagaaaaaa cttgaagatg actgtcagca aagaattgat tcaatcagat
    +     4201 ttttggtttc ctcattaaag ttaacggatg atacttctag tctcaaaatt gagtctcctt
    +     4261 taattcagtg tttgaatcgt ttgtcaatgg tagaaggaca atatatggca cagtatgatc
    +     4321 aaaagttaag tacgattaaa ggtatgtaat cgtctttaat ttagacttgt gttttaactg
    +     4381 atgtatagaa atgtatcaca aattggagtc atattgtaac cgcttaggaa gtccgttcgt
    +     4441 tttacctgat tttgagaatt catttttatc tgatgtatcc gatgctttta ctgaatcttt
    +     4501 gagaggacgc atcaacgaag ccgaaaagga gattgatgcg agattagagg ttattaattc
    +     4561 ctttgaagaa gaaattttgg gtttgtggtc tgaactcggt gttgagcccg ctgatgttcc
    +     4621 acaatacgaa caattgcttg aatcccatac taatcgacca aatgatgttt atgttactca
    +     4681 agaacttatc gaccaacttt gcaagcaaaa agaagttttt tccgctgaaa aagaaaagag
    +     4741 aagtgatcat ttaaaaagta tacaatcaga agttagcaac ttgtggaata agcttcaagt
    +     4801 ttctcccaat gaacaaagtc aatttggcga ttcatcaaac attaatcaag aaaatatttc
    +     4861 attatgggaa actgaacttg aaaaacttca tcagttaaaa aaggagcatt tacccatttt
    +     4921 tttagaagac tgtcgtcaac aaattcttca gctttgggat tctctgtttt attcagaaga
    +     4981 acaaagaaag tcctttacac ctatgtatga agacattatt acagagcagg ttcttacggc
    +     5041 ccatgaaaac tatataaagc aactagaggc cgaagtttct gctaataagt cctttttaag
    +     5101 cttaattaat cgctatgcct ctttaataga aggaaagaaa gagcttgaag ctagttctaa
    +     5161 tgatgcctct cgtctaacac aacggggacg ccgggaccca ggtttacttc tacgtgaaga
    +     5221 gaaaatccgt aagcgacttt ctagagaact tcctaaggtt cagtcgctgc ttataccaga
    +     5281 gattacagca tgggaagaaa gaaatggaag gacgttcctt ttttatgatg aaccacttct
    +     5341 caagatttgc caagaggcca ctcaaccaaa atcattatat agaagtgcaa gtgctgccgc
    +     5401 aaaccgcccg aaaacagcaa ctacaacgga ctctgttaat agaacacctt ctcaacgagg
    +     5461 gcgtgtagct gtaccttcaa caccaagtgt taggtccgct tctcgagcta tgacgagtcc
    +     5521 aaggacaccg cttcctagag taaaaaacac tcaaaatcca agtcgttcca ttagtgcaga
    +     5581 accgccatca gcaaccagta ccgccaatag aagacacccc actgctaatc gaattgatat
    +     5641 aaacgctaga ttaaacagtg ctagtcggtc tcgaagcgcg aacatgataa gacaaggggc
    +     5701 aaatggtagt gacagcaata tgtcttcttc acccgtttct ggaaattcca ataccccttt
    +     5761 taacaagttt ccaaattctg tatctcgcaa tacacatttt gaatccaagt caccgcaccc
    +     5821 aaattactct cgaactcctc atgaaacgta ttcaaaggct tcatctaaga acgtcccatt
    +     5881 aagtcctcca aagcagcgtg tagttaatga acacgcttta aatattatgt cggaaaaatt
    +     5941 gcaaagaact aatctgaaag aacaaacacc cgagatggac attgaaaaca gctcgcagaa
    +     6001 ccttcctttt tctcctatga agatatcccc cataagagca tcacccgtaa agacaattcc
    +     6061 atcatcaccg tcccccacta ccaacatttt ttctgctcca ctcaacaata ttacaaattg
    +     6121 tacaccgatg gaggatgaat ggggagaaga aggcttttaa tgg
    +//
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    +

    © 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/Gibson.html b/markdown_notebooks/Gibson.html new file mode 100644 index 00000000..383f2a8d --- /dev/null +++ b/markdown_notebooks/Gibson.html @@ -0,0 +1,200 @@ + + + + + + + + + Gibson Assembly in pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Gibson Assembly in pydna

    +
    +

    Visit the full library documentation here

    +
    +

    Gibson Assembly is a powerful method to assemble multiple DNA fragments into a single, continuous sequence in a seamless, one-step reaction. Developed by Daniel Gibson and colleagues in 2009, this method has been widely applied to work in molecular cloning, biotechnology, and synthetic biology.

    +

    pydna provides the Assembly class to simulate the assembly of DNA sequences. Below is an example fpr performing Gibson Assembly with pre-existing DNA fragments, followed by primer design for generating these fragments via the pcr method, if needed.

    +

    The Assembly takes the following arguments:

    +
      +
    • frags: list of DNA fragments as Dseqrecord objects

    • +
    • limit: the minimum sequence homology required.

    • +
    • algorithm: the function used to find homology regions between DNA fragments. For Gibson Assembly, we use the terminal_overlap function, which finds homology regions only at the terminal regions. By default, the Assembly class uses the common_sub_strings function to find homology regions, which finds homology anywhere, as it could happen in a homologous recombination event.

    • +
    + + Open In Colab + +
    # Install pydna (only when running on Colab)
    +import sys
    +if 'google.colab' in sys.modules:
    +    %%capture
    +    # Install the current development version of pydna (comment to install pip version)
    +    !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn
    +    # Install pip version instead (uncomment to install)
    +    # !pip install pydna
    +
    +
    +
    +
    from pydna.dseqrecord import Dseqrecord
    +from pydna.assembly import Assembly
    +from pydna.common_sub_strings import terminal_overlap
    +
    +#Creating example Dseqrecord sequences
    +fragment1 = Dseqrecord("acgatgctatactgCCCCCtgtgctgtgctcta")
    +fragment2 = Dseqrecord("tgtgctgtgctctaTTTTTtattctggctgtatc")
    +fragment3 = Dseqrecord("tattctggctgtatcGGGGGtacgatgctatactg")
    +
    +#Creating a list of sequences to assemble
    +fragments = [fragment1, fragment2, fragment3]
    +
    +#Performing Gibson assembly, with a minimum shared homology of 14bp
    +assembly = Assembly(fragments, limit=14, algorithm=terminal_overlap)
    +
    +#Displaying the assembled product
    +print(assembly)
    +
    +
    +
    Assembly
    +fragments..: 33bp 34bp 35bp
    +limit(bp)..: 14
    +G.nodes....: 6
    +algorithm..: terminal_overlap
    +
    +
    +

    The printed output shows the length of each fragment provided to the assembly, the minimum length required for sequence homology search, the number of nodes (number of overlapping regions), and the algorithm used for sequence homology search. Please refer to the full Assembly module documentation for more information on the algorithm applied.

    +

    To make a circular sequence from an Assembly, pydna provides the assemble_circular method. The assembled sequence can be printed as normal, as Dseqrecord objects. Note that the assemble_circular method returns a list, where the two elements are reverse complement of each other.

    +
    from pydna.contig import Contig
    +
    +#Circularizing the assembled sequence
    +assembly_circ = assembly.assemble_circular()
    +
    +#Printing the sequence records
    +print(assembly_circ[0])
    +print()
    +print(assembly_circ[1])
    +
    +
    +
    +
    Dseqrecord
    +circular: True
    +size: 59
    +ID: id
    +Name: name
    +Description: description
    +Number of features: 0
    +/molecule_type=DNA
    +Dseq(o59)
    +acga..GGGt
    +tgct..CCCa
    +
    +Dseqrecord
    +circular: True
    +size: 59
    +ID: id
    +Name: name
    +Description: description
    +Number of features: 0
    +/molecule_type=DNA
    +Dseq(o59)
    +taga..AAAA
    +atct..TTTT
    +
    +
    +

    Please refer to the Example_Gibson page for an example of a completed workflow for modelling Gibson Assembly using pydna.

    +
    + + +
    +
    +
    + +
    + +
    +

    © 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/Importing_Seqs.html b/markdown_notebooks/Importing_Seqs.html new file mode 100644 index 00000000..4ab00b47 --- /dev/null +++ b/markdown_notebooks/Importing_Seqs.html @@ -0,0 +1,397 @@ + + + + + + + + + Importing and viewing sequence files in pydna — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Importing and viewing sequence files in pydna

    +
    +

    Visit the full library documentation here

    +
    +

    pydna can be used to work with FASTA, Genbank, EMBL, and snapgene files (.fasta, .gb, .embl, .dna). You can read these files into a Dseqrecord that one can view and work with. You can also instantiate Dseqrecord objects with strings.

    +
    +

    Importing Sequence Files

    +

    To import files into pydna is simple. pydna provides the parse method to read all DNA sequences in a file into a list. As an input, parse can take:

    +
      +
    • The path to a file from your computer

    • +
    • A python string with the file content.

    • +
    +

    The following code shows an example of how to use the parse function to import a FASTA file.

    + + Open In Colab + +
    # Install pydna (only when running on Colab)
    +import sys
    +if 'google.colab' in sys.modules:
    +    %%capture
    +    # Install the current development version of pydna (comment to install pip version)
    +    !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn
    +    # Install pip version instead (uncomment to install)
    +    # !pip install pydna
    +
    +
    +
    +
    from pydna.parsers import parse
    +
    +#Import your file into python using its path
    +file_path = "./U49845.fasta"
    +files = parse(file_path)
    +
    +#Show your FASTA file in python
    +print(files[0].format("fasta"))
    +
    +
    +
    >lcl|U49845.1_cds_AAA98665.1_1 [protein=TCP1-beta] [frame=3] [protein_id=AAA98665.1] [location=<1..206] [gbkey=CDS]
    +TCCTCCATATACAACGGTATCTCCACCTCAGGTTTAGATCTCAACAACGGAACCATTGCC
    +GACATGAGACAGTTAGGTATCGTCGAGAGTTACAAGCTAAAACGAGCAGTAGTCAGCTCT
    +GCATCTGAAGCCGCTGAAGTTCTACTAAGGGTGGATAACATCATCCGTGCAAGACCAAGA
    +ACCGCCAATAGACAACATATGTAA
    +
    +
    +

    Note that parse returns a list object, hence requiring [0] to take the first element of the list. When you have a FASTA file that contains multiple sequences, you can index the list accordingly (e.g [0], [1], …)

    +

    The last line of code uses the format method to generate a string representation of the sequence as a FASTA file.

    +

    Another example, using a GenBank file (U49845), is shown below.

    +
    from pydna.parsers import parse
    +
    +file_path = "./U49845.gb"
    +files = parse(file_path)
    +
    +# Convert the Dseqrecord object into a formatted string in GenBank format
    +files[0].format("gb")
    +
    +
    +
    +
    LOCUS       SCU49845                5028 bp    DNA     linear   PLN 29-OCT-2018
    +DEFINITION  Saccharomyces cerevisiae TCP1-beta gene, partial cds; and Axl2p
    +            (AXL2) and Rev7p (REV7) genes, complete cds.
    +ACCESSION   U49845
    +VERSION     U49845.1
    +KEYWORDS    .
    +SOURCE      Saccharomyces cerevisiae (brewer's yeast)
    +  ORGANISM  Saccharomyces cerevisiae
    +            Eukaryota; Fungi; Dikarya; Ascomycota; Saccharomycotina;
    +            Saccharomycetes; Saccharomycetales; Saccharomycetaceae;
    +            Saccharomyces.
    +REFERENCE   1  (bases 1 to 5028)
    +  AUTHORS   Roemer,T., Madden,K., Chang,J. and Snyder,M.
    +  TITLE     Selection of axial growth sites in yeast requires Axl2p, a novel
    +            plasma membrane glycoprotein
    +  JOURNAL   Genes Dev. 10 (7), 777-793 (1996)
    +   PUBMED   8846915
    +REFERENCE   2  (bases 1 to 5028)
    +  AUTHORS   Roemer,T.
    +  TITLE     Direct Submission
    +  JOURNAL   Submitted (22-FEB-1996) Biology, Yale University, New Haven, CT
    +            06520, USA
    +FEATURES             Location/Qualifiers
    +     source          1..5028
    +                     /organism="Saccharomyces cerevisiae"
    +                     /mol_type="genomic DNA"
    +                     /db_xref="taxon:4932"
    +                     /chromosome="IX"
    +     mRNA            <1..>206
    +                     /product="TCP1-beta"
    +     CDS             <1..206
    +                     /codon_start=3
    +                     /product="TCP1-beta"
    +                     /protein_id="AAA98665.1"
    +                     /translation="SSIYNGISTSGLDLNNGTIADMRQLGIVESYKLKRAVVSSASEAA
    +                     EVLLRVDNIIRARPRTANRQHM"
    +     gene            <687..>3158
    +                     /gene="AXL2"
    +     mRNA            <687..>3158
    +                     /gene="AXL2"
    +                     /product="Axl2p"
    +     CDS             687..3158
    +                     /gene="AXL2"
    +                     /note="plasma membrane glycoprotein"
    +                     /codon_start=1
    +                     /product="Axl2p"
    +                     /protein_id="AAA98666.1"
    +                     /translation="MTQLQISLLLTATISLLHLVVATPYEAYPIGKQYPPVARVNESFT
    +                     FQISNDTYKSSVDKTAQITYNCFDLPSWLSFDSSSRTFSGEPSSDLLSDANTTLYFNVI
    +                     LEGTDSADSTSLNNTYQFVVTNRPSISLSSDFNLLALLKNYGYTNGKNALKLDPNEVFN
    +                     VTFDRSMFTNEESIVSYYGRSQLYNAPLPNWLFFDSGELKFTGTAPVINSAIAPETSYS
    +                     FVIIATDIEGFSAVEVEFELVIGAHQLTTSIQNSLIINVTDTGNVSYDLPLNYVYLDDD
    +                     PISSDKLGSINLLDAPDWVALDNATISGSVPDELLGKNSNPANFSVSIYDTYGDVIYFN
    +                     FEVVSTTDLFAISSLPNINATRGEWFSYYFLPSQFTDYVNTNVSLEFTNSSQDHDWVKF
    +                     QSSNLTLAGEVPKNFDKLSLGLKANQGSQSQELYFNIIGMDSKITHSNHSANATSTRSS
    +                     HHSTSTSSYTSSTYTAKISSTSAAATSSAPAALPAANKTSSHNKKAVAIACGVAIPLGV
    +                     ILVALICFLIFWRRRRENPDDENLPHAISGPDLNNPANKPNQENATPLNNPFDDDASSY
    +                     DDTSIARRLAALNTLKLDNHSATESDISSVDEKRDSLSGMNTYNDQFQSQSKEELLAKP
    +                     PVQPPESPFFDPQNRSSSVYMDSEPAVNKSWRYTGNLSPVSDIVRDSYGSQKTVDTEKL
    +                     FDLEAPEKEKRTSRDVTMSSLDPWNSNISPSPVRKSVTPSPYNVTKHRNRHLQNIQDSQ
    +                     SGKNGITPTTMSTSSSDDFVPVKDGENFCWVHSMEPDRRPSKKRLVDFSNKSNVNVGQV
    +                     KDIHGRIPEML"
    +     gene            complement(<3300..>4037)
    +                     /gene="REV7"
    +     mRNA            complement(<3300..>4037)
    +                     /gene="REV7"
    +                     /product="Rev7p"
    +     CDS             complement(3300..4037)
    +                     /gene="REV7"
    +                     /codon_start=1
    +                     /product="Rev7p"
    +                     /protein_id="AAA98667.1"
    +                     /translation="MNRWVEKWLRVYLKCYINLILFYRNVYPPQSFDYTTYQSFNLPQF
    +                     VPINRHPALIDYIEELILDVLSKLTHVYRFSICIINKKNDLCIEKYVLDFSELQHVDKD
    +                     DQIITETEVFDEFRSSLNSLIMHLEKLPKVNDDTITFEAVINAIELELGHKLDRNRRVD
    +                     SLEEKAEIERDSNWVKCQEDENLPDNNGFQPPKIKLTSLVGSDVGPLIIHQFSEKLISG
    +                     DDKILNGVYSQYEEGESIFGSLF"
    +ORIGIN
    +        1 gatcctccat atacaacggt atctccacct caggtttaga tctcaacaac ggaaccattg
    +       61 ccgacatgag acagttaggt atcgtcgaga gttacaagct aaaacgagca gtagtcagct
    +      121 ctgcatctga agccgctgaa gttctactaa gggtggataa catcatccgt gcaagaccaa
    +      181 gaaccgccaa tagacaacat atgtaacata tttaggatat acctcgaaaa taataaaccg
    +      241 ccacactgtc attattataa ttagaaacag aacgcaaaaa ttatccacta tataattcaa
    +      301 agacgcgaaa aaaaaagaac aacgcgtcat agaacttttg gcaattcgcg tcacaaataa
    +      361 attttggcaa cttatgtttc ctcttcgagc agtactcgag ccctgtctca agaatgtaat
    +      421 aatacccatc gtaggtatgg ttaaagatag catctccaca acctcaaagc tccttgccga
    +      481 gagtcgccct cctttgtcga gtaattttca cttttcatat gagaacttat tttcttattc
    +      541 tttactctca catcctgtag tgattgacac tgcaacagcc accatcacta gaagaacaga
    +      601 acaattactt aatagaaaaa ttatatcttc ctcgaaacga tttcctgctt ccaacatcta
    +      661 cgtatatcaa gaagcattca cttaccatga cacagcttca gatttcatta ttgctgacag
    +      721 ctactatatc actactccat ctagtagtgg ccacgcccta tgaggcatat cctatcggaa
    +      781 aacaataccc cccagtggca agagtcaatg aatcgtttac atttcaaatt tccaatgata
    +      841 cctataaatc gtctgtagac aagacagctc aaataacata caattgcttc gacttaccga
    +      901 gctggctttc gtttgactct agttctagaa cgttctcagg tgaaccttct tctgacttac
    +      961 tatctgatgc gaacaccacg ttgtatttca atgtaatact cgagggtacg gactctgccg
    +     1021 acagcacgtc tttgaacaat acataccaat ttgttgttac aaaccgtcca tccatctcgc
    +     1081 tatcgtcaga tttcaatcta ttggcgttgt taaaaaacta tggttatact aacggcaaaa
    +     1141 acgctctgaa actagatcct aatgaagtct tcaacgtgac ttttgaccgt tcaatgttca
    +     1201 ctaacgaaga atccattgtg tcgtattacg gacgttctca gttgtataat gcgccgttac
    +     1261 ccaattggct gttcttcgat tctggcgagt tgaagtttac tgggacggca ccggtgataa
    +     1321 actcggcgat tgctccagaa acaagctaca gttttgtcat catcgctaca gacattgaag
    +     1381 gattttctgc cgttgaggta gaattcgaat tagtcatcgg ggctcaccag ttaactacct
    +     1441 ctattcaaaa tagtttgata atcaacgtta ctgacacagg taacgtttca tatgacttac
    +     1501 ctctaaacta tgtttatctc gatgacgatc ctatttcttc tgataaattg ggttctataa
    +     1561 acttattgga tgctccagac tgggtggcat tagataatgc taccatttcc gggtctgtcc
    +     1621 cagatgaatt actcggtaag aactccaatc ctgccaattt ttctgtgtcc atttatgata
    +     1681 cttatggtga tgtgatttat ttcaacttcg aagttgtctc cacaacggat ttgtttgcca
    +     1741 ttagttctct tcccaatatt aacgctacaa ggggtgaatg gttctcctac tattttttgc
    +     1801 cttctcagtt tacagactac gtgaatacaa acgtttcatt agagtttact aattcaagcc
    +     1861 aagaccatga ctgggtgaaa ttccaatcat ctaatttaac attagctgga gaagtgccca
    +     1921 agaatttcga caagctttca ttaggtttga aagcgaacca aggttcacaa tctcaagagc
    +     1981 tatattttaa catcattggc atggattcaa agataactca ctcaaaccac agtgcgaatg
    +     2041 caacgtccac aagaagttct caccactcca cctcaacaag ttcttacaca tcttctactt
    +     2101 acactgcaaa aatttcttct acctccgctg ctgctacttc ttctgctcca gcagcgctgc
    +     2161 cagcagccaa taaaacttca tctcacaata aaaaagcagt agcaattgcg tgcggtgttg
    +     2221 ctatcccatt aggcgttatc ctagtagctc tcatttgctt cctaatattc tggagacgca
    +     2281 gaagggaaaa tccagacgat gaaaacttac cgcatgctat tagtggacct gatttgaata
    +     2341 atcctgcaaa taaaccaaat caagaaaacg ctacaccttt gaacaacccc tttgatgatg
    +     2401 atgcttcctc gtacgatgat acttcaatag caagaagatt ggctgctttg aacactttga
    +     2461 aattggataa ccactctgcc actgaatctg atatttccag cgtggatgaa aagagagatt
    +     2521 ctctatcagg tatgaataca tacaatgatc agttccaatc ccaaagtaaa gaagaattat
    +     2581 tagcaaaacc cccagtacag cctccagaga gcccgttctt tgacccacag aataggtctt
    +     2641 cttctgtgta tatggatagt gaaccagcag taaataaatc ctggcgatat actggcaacc
    +     2701 tgtcaccagt ctctgatatt gtcagagaca gttacggatc acaaaaaact gttgatacag
    +     2761 aaaaactttt cgatttagaa gcaccagaga aggaaaaacg tacgtcaagg gatgtcacta
    +     2821 tgtcttcact ggacccttgg aacagcaata ttagcccttc tcccgtaaga aaatcagtaa
    +     2881 caccatcacc atataacgta acgaagcatc gtaaccgcca cttacaaaat attcaagact
    +     2941 ctcaaagcgg taaaaacgga atcactccca caacaatgtc aacttcatct tctgacgatt
    +     3001 ttgttccggt taaagatggt gaaaattttt gctgggtcca tagcatggaa ccagacagaa
    +     3061 gaccaagtaa gaaaaggtta gtagattttt caaataagag taatgtcaat gttggtcaag
    +     3121 ttaaggacat tcacggacgc atcccagaaa tgctgtgatt atacgcaacg atattttgct
    +     3181 taattttatt ttcctgtttt attttttatt agtggtttac agatacccta tattttattt
    +     3241 agtttttata cttagagaca tttaatttta attccattct tcaaatttca tttttgcact
    +     3301 taaaacaaag atccaaaaat gctctcgccc tcttcatatt gagaatacac tccattcaaa
    +     3361 attttgtcgt caccgctgat taatttttca ctaaactgat gaataatcaa aggccccacg
    +     3421 tcagaaccga ctaaagaagt gagttttatt ttaggaggtt gaaaaccatt attgtctggt
    +     3481 aaattttcat cttcttgaca tttaacccag tttgaatccc tttcaatttc tgctttttcc
    +     3541 tccaaactat cgaccctcct gtttctgtcc aacttatgtc ctagttccaa ttcgatcgca
    +     3601 ttaataactg cttcaaatgt tattgtgtca tcgttgactt taggtaattt ctccaaatgc
    +     3661 ataatcaaac tatttaagga agatcggaat tcgtcgaaca cttcagtttc cgtaatgatc
    +     3721 tgatcgtctt tatccacatg ttgtaattca ctaaaatcta aaacgtattt ttcaatgcat
    +     3781 aaatcgttct ttttattaat aatgcagatg gaaaatctgt aaacgtgcgt taatttagaa
    +     3841 agaacatcca gtataagttc ttctatatag tcaattaaag caggatgcct attaatggga
    +     3901 acgaactgcg gcaagttgaa tgactggtaa gtagtgtagt cgaatgactg aggtgggtat
    +     3961 acatttctat aaaataaaat caaattaatg tagcatttta agtataccct cagccacttc
    +     4021 tctacccatc tattcataaa gctgacgcaa cgattactat tttttttttc ttcttggatc
    +     4081 tcagtcgtcg caaaaacgta taccttcttt ttccgacctt ttttttagct ttctggaaaa
    +     4141 gtttatatta gttaaacagg gtctagtctt agtgtgaaag ctagtggttt cgattgactg
    +     4201 atattaagaa agtggaaatt aaattagtag tgtagacgta tatgcatatg tatttctcgc
    +     4261 ctgtttatgt ttctacgtac ttttgattta tagcaagggg aaaagaaata catactattt
    +     4321 tttggtaaag gtgaaagcat aatgtaaaag ctagaataaa atggacgaaa taaagagagg
    +     4381 cttagttcat cttttttcca aaaagcaccc aatgataata actaaaatga aaaggatttg
    +     4441 ccatctgtca gcaacatcag ttgtgtgagc aataataaaa tcatcacctc cgttgccttt
    +     4501 agcgcgtttg tcgtttgtat cttccgtaat tttagtctta tcaatgggaa tcataaattt
    +     4561 tccaatgaat tagcaatttc gtccaattct ttttgagctt cttcatattt gctttggaat
    +     4621 tcttcgcact tcttttccca ttcatctctt tcttcttcca aagcaacgat ccttctaccc
    +     4681 atttgctcag agttcaaatc ggcctctttc agtttatcca ttgcttcctt cagtttggct
    +     4741 tcactgtctt ctagctgttg ttctagatcc tggtttttct tggtgtagtt ctcattatta
    +     4801 gatctcaagt tattggagtc ttcagccaat tgctttgtat cagacaattg actctctaac
    +     4861 ttctccactt cactgtcgag ttgctcgttt ttagcggaca aagatttaat ctcgttttct
    +     4921 ttttcagtgt tagattgctc taattctttg agctgttctc tcagctcctc atatttttct
    +     4981 tgccatgact cagattctaa ttttaagcta ttcaatttct ctttgatc
    +//
    +
    +
    +

    Now, you can work with the sequence record using pydna, using the Dseqrecord class. Dseqrecord provides ways to highlight regions of interest on the sequence, adding new features to the record, removing features, and creating new Dseqrecord objects to store and export your changes. Please refer to the Dseq_Features notebook for more information.

    +
    +
    +

    Importing Sequences from Strings

    +

    parse also allows sequences to be read from a string alone. This could be useful to read FASTA sequences obtained from GenBank APIs.

    +
    from pydna.parsers import parse
    +
    +my_record = parse(
    +'''
    +>lcl|U49845.1_cds_AAA98667.1_3 [gene=REV7] [protein=Rev7p] [protein_id=AAA98667.1] [location=complement(3300..4037)] [gbkey=CDS]
    +ATGAATAGATGGGTAGAGAAGTGGCTGAGGGTATACTTAAAATGCTACATTAATTTGATTTTATTTTATA
    +GAAATGTATACCCACCTCAGTCATTCGACTACACTACTTACCAGTCATTCAACTTGCCGCAGTTCGTTCC
    +CATTAATAGGCATCCTGCTTTAATTGACTATATAGAAGAACTTATACTGGATGTTCTTTCTAAATTAACG
    +CACGTTTACAGATTTTCCATCTGCATTATTAATAAAAAGAACGATTTATGCATTGAAAAATACGTTTTAG
    +ATTTTAGTGAATTACAACATGTGGATAAAGACGATCAGATCATTACGGAAACTGAAGTGTTCGACGAATT
    +CCGATCTTCCTTAAATAGTTTGATTATGCATTTGGAGAAATTACCTAAAGTCAACGATGACACAATAACA
    +TTTGAAGCAGTTATTAATGCGATCGAATTGGAACTAGGACATAAGTTGGACAGAAACAGGAGGGTCGATA
    +GTTTGGAGGAAAAAGCAGAAATTGAAAGGGATTCAAACTGGGTTAAATGTCAAGAAGATGAAAATTTACC
    +AGACAATAATGGTTTTCAACCTCCTAAAATAAAACTCACTTCTTTAGTCGGTTCTGACGTGGGGCCTTTG
    +ATTATTCATCAGTTTAGTGAAAAATTAATCAGCGGTGACGACAAAATTTTGAATGGAGTGTATTCTCAAT
    +ATGAAGAGGGCGAGAGCATTTTTGGATCTTTGTTTTAA
    +'''
    +)
    +print(my_record[0].format("fasta"))
    +
    +
    +
    >lcl|U49845.1_cds_AAA98667.1_3 [gene=REV7] [protein=Rev7p] [protein_id=AAA98667.1] [location=complement(3300..4037)] [gbkey=CDS]
    +ATGAATAGATGGGTAGAGAAGTGGCTGAGGGTATACTTAAAATGCTACATTAATTTGATT
    +TTATTTTATAGAAATGTATACCCACCTCAGTCATTCGACTACACTACTTACCAGTCATTC
    +AACTTGCCGCAGTTCGTTCCCATTAATAGGCATCCTGCTTTAATTGACTATATAGAAGAA
    +CTTATACTGGATGTTCTTTCTAAATTAACGCACGTTTACAGATTTTCCATCTGCATTATT
    +AATAAAAAGAACGATTTATGCATTGAAAAATACGTTTTAGATTTTAGTGAATTACAACAT
    +GTGGATAAAGACGATCAGATCATTACGGAAACTGAAGTGTTCGACGAATTCCGATCTTCC
    +TTAAATAGTTTGATTATGCATTTGGAGAAATTACCTAAAGTCAACGATGACACAATAACA
    +TTTGAAGCAGTTATTAATGCGATCGAATTGGAACTAGGACATAAGTTGGACAGAAACAGG
    +AGGGTCGATAGTTTGGAGGAAAAAGCAGAAATTGAAAGGGATTCAAACTGGGTTAAATGT
    +CAAGAAGATGAAAATTTACCAGACAATAATGGTTTTCAACCTCCTAAAATAAAACTCACT
    +TCTTTAGTCGGTTCTGACGTGGGGCCTTTGATTATTCATCAGTTTAGTGAAAAATTAATC
    +AGCGGTGACGACAAAATTTTGAATGGAGTGTATTCTCAATATGAAGAGGGCGAGAGCATT
    +TTTGGATCTTTGTTTTAA
    +
    +
    +
    +
    +

    Extra info

    +

    Note that pydna’s parse guesses whether the argument passed is a file path or a string, and also guesses the file type based on the content, so it can give unexpected behaviour if your files are not well formatted. To have more control over the parsing of sequences, you can use biopython’s parse from Bio.SeqIO, and then instantiate a Dseqrecord from the biopython’s SeqRecord

    +
    from Bio.SeqIO import parse as seqio_parse
    +from pydna.dseqrecord import Dseqrecord
    +
    +file_path = './U49845.gb'
    +
    +# Extract the first Seqrecord of the SeqIO.parse iterator
    +seq_record = next(seqio_parse(file_path, 'genbank'))
    +
    +# This is how circularity is stored in biopython's seqrecord
    +is_circular = 'topology' in seq_record.annotations.keys() and seq_record.annotations['topology'] == 'circular'
    +
    +# Convert into Dseqrecord
    +dseq_record = Dseqrecord(seq_record, circular=is_circular)
    +
    +dseq_record
    +
    +
    +
    Dseqrecord(-5028)
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    +

    © 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/PCR.html b/markdown_notebooks/PCR.html new file mode 100644 index 00000000..b980e36e --- /dev/null +++ b/markdown_notebooks/PCR.html @@ -0,0 +1,339 @@ + + + + + + + + + How to Perform a Polymerase Chain Reaction (PCR) — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    How to Perform a Polymerase Chain Reaction (PCR)

    +
    +

    Visit the full library documentation here

    +
    +

    This page walks you through how to perform a PCR, and design PCR primers, using pydna. A PCR amplifies a specific stretch of DNA defined by the primers, and it is critical to ensure primer binding specificity and appropriate primer melting temperature (tm) through careful design. pydna provides tools for quick modelling of PCR to check for correct PCR products, and methods for calculating tm and primer design, as performed in other popular web servcies (e.g Primer3Plus).

    +
    +

    Modelling PCR with Known Primers

    +

    To perform PCR, pydna provides the anneal class and the pcr method to quickly generate expected primer products, on a Dseqrecord object. The pcr method needs only the forward and reverse primers, and the sequence. The primers must be passed from the 5’ to the 3’ end, following biological convention. More information on Dseqrecord and importing DNA sequences can be found in the other guide pages.

    +

    The following example uses a 300+ bp custom sample circular DNA, containing an example gene that we would like to clone. 18 bp forward and reverse primers have been provided.

    + + Open In Colab + +
    # Install pydna (only when running on Colab)
    +import sys
    +if 'google.colab' in sys.modules:
    +    %%capture
    +    # Install the current development version of pydna (comment to install pip version)
    +    !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn
    +    # Install pip version instead (uncomment to install)
    +    # !pip install pydna
    +
    +
    +
    +
    from pydna.amplify import pcr
    +from pydna.dseqrecord import Dseqrecord
    +from pydna.parsers import parse
    +
    +#Importing GenBank file containing sample sequence 
    +path = "./sample_seq.gb"
    +record = parse(path)[0]
    +
    +#Defining forward and reverse primers
    +fwd_primer = "ATTCCTGCAGAGTACATC"
    +rvs_primer = "ACCATCCGAAGATATCTT"
    +
    +#Performing PCR
    +pcr_product = pcr(fwd_primer, rvs_primer, record)
    +
    +#Printing results
    +pcr_product.format("gb")
    +
    +
    +
    LOCUS       45bp_PCR_prod             45 bp    DNA     linear   UNK 01-JAN-1980
    +DEFINITION  pcr_product_description_description.
    +ACCESSION   45bp
    +VERSION     45bp
    +KEYWORDS    .
    +SOURCE      .
    +  ORGANISM  .
    +            .
    +FEATURES             Location/Qualifiers
    +     gene            1..45
    +                     /label="example_gene"
    +     primer_bind     1..18
    +                     /label="name"
    +                     /PCR_conditions="primer sequence:ATTCCTGCAGAGTACATC"
    +                     /ApEinfo_fwdcolor="#baffa3"
    +                     /ApEinfo_revcolor="#ffbaba"
    +     primer_bind     complement(28..45)
    +                     /label="name"
    +                     /PCR_conditions="primer sequence:ACCATCCGAAGATATCTT"
    +                     /ApEinfo_fwdcolor="#baffa3"
    +                     /ApEinfo_revcolor="#ffbaba"
    +ORIGIN
    +        1 attcctgcag agtacatcaa ttctatgaag atatcttcgg atggt
    +//
    +
    +
    +

    The pcr method then returns a Amplicon class object (to model a PCR product), a subclass of Dseqrecord with some extra methods (e.g .figure. See “Other ways of visualising the PCR products” section below). All the features inside the PCR product has been retained. Note how the example gene has been retained as a feature in pcr_product. In addition, two new features have been added to the record to indicate the forward and reverse primer binding regions.

    +

    pydna also allows modelling for PCR with extra bases on the 5’ end of primers. This functionality is useful for modelling molecular cloning with multiple steps, where you might want to add different restriction sites to PCR products and ensure that the right sequences have been replicated.

    +

    For instance, to make sure that I can add a HindIII restriction site (AAGCTT) at the end of my example_gene without accidental hybridisation with other parts of the circular sequence, I can perform PCR in the pydna package like so.

    +
    fwd_primer = "AAGCTTATTCCTGCAGAGTACATC"
    +rvs_primer = "AAGCTTACCATCCGAAGATATCTT"
    +
    +#Performing PCR
    +pcr_product_HindIII = pcr(fwd_primer, rvs_primer, record)
    +
    +#Printing results
    +pcr_product_HindIII.format("gb")
    +
    +
    +
    LOCUS       57bp_PCR_prod             57 bp    DNA     linear   UNK 01-JAN-1980
    +DEFINITION  pcr_product_description_description.
    +ACCESSION   57bp
    +VERSION     57bp
    +KEYWORDS    .
    +SOURCE      .
    +  ORGANISM  .
    +            .
    +FEATURES             Location/Qualifiers
    +     primer_bind     1..21
    +                     /label="name"
    +                     /PCR_conditions="primer sequence:AAGCTTATTCCTGCAGAGTACATC"
    +                     /ApEinfo_fwdcolor="#baffa3"
    +                     /ApEinfo_revcolor="#ffbaba"
    +     gene            4..48
    +                     /label="example_gene"
    +     primer_bind     complement(31..48)
    +                     /label="name"
    +                     /PCR_conditions="primer sequence:AAGCTTACCATCCGAAGATATCTT"
    +                     /ApEinfo_fwdcolor="#baffa3"
    +                     /ApEinfo_revcolor="#ffbaba"
    +ORIGIN
    +        1 aagcttattc ctgcagagta catcaattct atgaagatat cttcggatgg taagctt
    +//
    +
    +
    +

    For more information on restriction digests and ligation, please refer to the Restriction and Ligation page.

    +
    +
    +

    Other ways of visualising the PCR products

    +

    In addition to the normal print function and the .format() method (More information can be found in Dseq and Importing_Seqs pages, respectively), pcr products can also be visualized in other ways.

    +

    We can check the sequence of the pcr products alone using the .seq attribute on a PCR product:

    +
    print(pcr_product.seq)
    +
    +
    +
    ATTCCTGCAGAGTACATCAATTCTATGAAGATATCTTCGGATGGT
    +
    +
    +

    We can also visualize the pcr products as a figure, using the .figure method.

    +
    print(pcr_product.figure())
    +
    +
    +
    5ATTCCTGCAGAGTACATC...AAGATATCTTCGGATGGT3
    +                      ||||||||||||||||||
    +                     3TTCTATAGAAGCCTACCA5
    +5ATTCCTGCAGAGTACATC3
    + ||||||||||||||||||
    +3TAAGGACGTCTCATGTAG...TTCTATAGAAGCCTACCA5
    +
    +
    +
    +
    +
    +

    Designing Primers and Calculating Tm in pydna

    +

    pydna also provides the primer_design method to design primer sequences based on the desired pcr product and the template sequence’s melting temperature (Tm). The primer_design method can be imported from the pydna.design module, and needs the user to supply the PCR template sequence (as a Dseqrecord object) and the Tm. The template sequence should be given as the first parameter, and the Tm give through the target_tm= argument, as demonstrated below. If you have no specific Tm in mind, the method uses the default Tm of 55 degrees celcius.

    +

    Note that in the following example below, I used zero-based indexing on the Dseqrecord to find the sequence of my example gene, of which I would like to clone via PCR. Please refer to the Dseq page for more information on how to index a sequence.

    +
    from pydna.design import primer_design
    +
    +#Designing the primers
    +primers = primer_design(record[6:51], target_tm=50.0)
    +
    +#Printing the output
    +print(primers.format("gb"))
    +
    +
    +
    LOCUS       example_gene              45 bp    DNA     linear   UNK 01-JAN-1980
    +DEFINITION  pcr_product_f45 example_gene_r45 example_gene.
    +ACCESSION   example_gene
    +VERSION     example_gene
    +KEYWORDS    .
    +SOURCE      .
    +  ORGANISM  .
    +            .
    +FEATURES             Location/Qualifiers
    +     gene            1..45
    +                     /label="example_gene"
    +     primer_bind     1..16
    +                     /label="f45"
    +                     /PCR_conditions="primer sequence:ATTCCTGCAGAGTACA"
    +                     /ApEinfo_fwdcolor="#baffa3"
    +                     /ApEinfo_revcolor="#ffbaba"
    +     primer_bind     complement(29..45)
    +                     /label="r45"
    +                     /PCR_conditions="primer sequence:ACCATCCGAAGATATCT"
    +                     /ApEinfo_fwdcolor="#baffa3"
    +                     /ApEinfo_revcolor="#ffbaba"
    +ORIGIN
    +        1 attcctgcag agtacatcaa ttctatgaag atatcttcgg atggt
    +//
    +
    +
    +

    The formula for primer design in pydna is based on the Tm formula from Rychlik et al (1990), found here. Additional information on calculating Tm can be found in the “Calculating Tm” section below.

    +

    The forward and reverse primer sequences are printed in the features list of the Amplicon object. Note how the feature representing the example gene is retained, as appropriate.

    +

    If you already have a forward / reverse primer, primer_design also allows this information to be taken as arguments. fp specifies the forward primer, rp specifies the reverse primers. fp and rp can be should be given as Primer class objects, which should be imported from pydna too.

    +

    For instance, if I already have a forward primer containing an EcoRI restriction site, and I aim to to generate a reverse primer of a similar Tm, I can apply the following code:

    +
    from pydna.primer import Primer
    +
    +forward_primer = Primer("GAATTCATTCCTGCAGAGTACATCA", id="forward_primer")
    +
    +primers_sixfive = primer_design(record[6:51], fp = forward_primer)
    +
    +print(primers_sixfive.format("gb"))
    +
    +
    +
    LOCUS       example_gene              51 bp    DNA     linear   UNK 01-JAN-1980
    +DEFINITION  pcr_product_forward_primer example_gene_r45 example_gene.
    +ACCESSION   example_gene
    +VERSION     example_gene
    +KEYWORDS    .
    +SOURCE      .
    +  ORGANISM  .
    +            .
    +FEATURES             Location/Qualifiers
    +     gene            1..45
    +                     /label="example_gene"
    +     primer_bind     1..19
    +                     /label="f45"
    +                     /PCR_conditions="primer sequence:GAATTCATTCCTGCAGAGTACATCA"
    +                     /ApEinfo_fwdcolor="#baffa3"
    +                     /ApEinfo_revcolor="#ffbaba"
    +     primer_bind     complement(26..45)
    +                     /label="r45"
    +                     /PCR_conditions="primer sequence:ACCATCCGAAGATATCTTCA"
    +                     /ApEinfo_fwdcolor="#baffa3"
    +                     /ApEinfo_revcolor="#ffbaba"
    +ORIGIN
    +        1 gaattcattc ctgcagagta catcaattct atgaagatat cttcggatgg t
    +//
    +
    +
    +
    +

    Calculating Tm

    +

    pydna comes with some functions to calculate Tms. The default function tm_default used is the previously mentioned one by Rychlik et al (1990), which takes a string as input. Another function derive from the Tm calculation adapted for primers using polymerases with a DNA binding domain (e.g Phusion polymerase). The default values for Tm calculation, including primer concentration, buffer strengths, and more, can also be modified through arguments in the tm_default method. Please refer to the pydna.tm module docstring for more information. An example is provided with a pair of primers; the temperature is given in degrees celcius.

    +
    from pydna.tm import tm_default
    +
    +# Example Tm calculation for a pair of primers
    +primer_f = "ATTCCTGCAGAGTACATCA"
    +primer_r = "ACCATCCGAAGATATCTTCA"
    +tm_f = tm_default(primer_f)
    +tm_r = tm_default(primer_r)
    +
    +print(tm_f)
    +print(tm_r)
    +
    +
    +
    55.901005046706075
    +55.841913263215304
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    +

    © 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/Restrict_Ligate_Cloning.html b/markdown_notebooks/Restrict_Ligate_Cloning.html new file mode 100644 index 00000000..06729705 --- /dev/null +++ b/markdown_notebooks/Restrict_Ligate_Cloning.html @@ -0,0 +1,297 @@ + + + + + + + + + Restriction and Ligation — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Restriction and Ligation

    +
    +

    Visit the full library documentation here

    +
    +

    In this page, we explore how to use pydna to cut, ligate, circularise DNA sequences. pydna works in conjugation with the Bio.Restriction module to apply a vast variety of restriction enzymes for cutting, whose module documentations can be found here.

    +
    +

    Cutting with one or more restriction enzymes

    +

    Restriction enzymes recognise specific DNA sequences and cut them, leaving sticky ends or blunt ends. To cut a sequence using pydna, we can use the cut method on a Dseqrecord object. Here is an example showing how to use the cut method to genenrate EcoRI restriction digests. The record includes a 338bp circular sequence, with an example gene feature.

    + + Open In Colab + +
    # Install pydna (only when running on Colab)
    +import sys
    +if 'google.colab' in sys.modules:
    +    %%capture
    +    # Install the current development version of pydna (comment to install pip version)
    +    !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn
    +    # Install pip version instead (uncomment to install)
    +    # !pip install pydna
    +
    +
    +
    +
    from pydna.dseqrecord import Dseqrecord
    +from pydna.parsers import parse
    +from Bio.Restriction import EcoRI
    +
    +# Create a Dseqrecord with your FASTA/GenBank file
    +path = "./sample_seq.gb"
    +record = parse(path)[0]
    +
    +# Cut with a single enzyme
    +cut_records = record.cut(EcoRI)
    +
    +# Display the resulting fragments
    +for frag in cut_records:
    +    print(frag)
    +
    +
    +
    Dseqrecord
    +circular: False
    +size: 338
    +ID: id
    +Name: name
    +Description: description
    +Number of features: 1
    +/molecule_type=DNA
    +Dseq(-338)
    +AATTCTTC..TGTG    
    +    GAAG..ACACTTAA
    +
    +
    +

    The circular Dseqrecord is cut into a linear Dseqrecord object, since there is only one EcoRI recognition site. Dseqrecord also shows the 5’ sticky end after cutting.

    +

    The sequence can also be cut with multiple restriction enzymes, into multiple linear DNA sequences. We can simply import all the restriction enzymes, and use the cut method as normal.

    +
    from Bio.Restriction import EcoRV
    +
    +# Cut with a multiple enzymes
    +multi_cut_records = record.cut(EcoRI, EcoRV)
    +
    +# Display the resulting fragments
    +for frag in multi_cut_records:
    +    print()
    +    print(frag)
    +    print()
    +
    +
    +
    Dseqrecord
    +circular: False
    +size: 51
    +ID: id
    +Name: name
    +Description: description
    +Number of features: 0
    +/molecule_type=DNA
    +Dseq(-51)
    +ATCT..TGTG    
    +TAGA..ACACTTAA
    +
    +
    +Dseqrecord
    +circular: False
    +size: 214
    +ID: id
    +Name: name
    +Description: description
    +Number of features: 0
    +/molecule_type=DNA
    +Dseq(-214)
    +AATTCTTC..TGAT
    +    GAAG..ACTA
    +
    +
    +Dseqrecord
    +circular: False
    +size: 73
    +ID: id
    +Name: name
    +Description: description
    +Number of features: 0
    +/molecule_type=DNA
    +Dseq(-73)
    +ATCT..AGAT
    +TAGA..TCTA
    +
    +
    +

    There are two EcoRV recognition sites in sample_seq, and coupled with the one EcoRI recognition site, three DNA fragments are returned. Note how Dseqrecord returns the blunt end after EcoRV cuts.

    +

    You can model any, and and number of, enzymes with the cut method and Bio.Restriction module. This makes pydna a quick and powerful method to plan your molecular cloning experiments, for instance to check the restriction digests of a 10kb plasmid with multiple enzymes. cut is also a method of the Dseq class, so Dseqs can be used as well.

    +
    +
    +

    Ligating fragments

    +

    After cutting a DNA sequence, you can ligate the fragments back together in pydna using the + operator on Dseqrecord or Dseq objects. Ligation can occur via complementary sticky ends or blunt ends. For instance, we can select the first and second fragments from multi_cut_records via indexing, and then ligate sticky ends produced by EcoRI to make a single linear sequence.

    +
    ligated_product = multi_cut_records[0] + multi_cut_records[1]
    +print(ligated_product)
    +
    +
    +
    Dseqrecord
    +circular: False
    +size: 261
    +ID: id
    +Name: name
    +Description: description
    +Number of features: 0
    +/molecule_type=DNA
    +Dseq(-261)
    +ATCT..TGAT
    +TAGA..ACTA
    +
    +
    +

    We can also join blunt ends in a similar way. Note that the sticky-ends must be a perfect match to join. If + ligation (or any other method, really) doesn’t work, make sure that:

    +
      +
    1. you are indeed performing the operation on Dseqrecord objects, as opposed to other data types (e.g lists, strings, etc)

    2. +
    3. Dseqrecord and the correct enzyme name (with correct roman numeral spelling) has been imported.

    4. +
    +
    +
    +

    Circularizing fragments

    +

    To circularize a cut DNA sequence use the looped method, which returns a new sequence object.

    +

    🚨🚨 VERY IMPORTANT 🚨🚨 .looped() method does not act in place, so a new variable should be created to store the new circularised sequence, as shown in the following example.

    +
    circular_record = ligated_product.looped()
    +
    +print('is ligated_product circular?', ligated_product.circular)
    +print('is circular_record circular?', circular_record.circular)
    +print()
    +
    +print(circular_record)
    +
    +
    +
    is ligated_product circular? False
    +is circular_record circular? True
    +
    +Dseqrecord
    +circular: True
    +size: 261
    +ID: id
    +Name: name
    +Description: description
    +Number of features: 0
    +/molecule_type=DNA
    +Dseq(o261)
    +ATCT..TGAT
    +TAGA..ACTA
    +
    +
    +
    +
    +

    Extra Notes: What happens to features when cutting/ligating?

    +

    A feature is removed from a Dseqrecord if the features is truncated by the cut. For instance, the example_gene feature is removed from the record after cutting record with PstI, which has recognition site within example_gene. within the cutand if the feature is completely within the cut, it is retained.

    +
    from Bio.Restriction import PstI
    +
    +cut_record2 = record.cut(PstI)
    +
    +print(cut_record2[0])
    +
    +
    +
    +
    Dseqrecord
    +circular: False
    +size: 222
    +ID: id
    +Name: name
    +Description: description
    +Number of features: 0
    +/molecule_type=DNA
    +Dseq(-222)
    +    GAGT..TAACTGCA
    +ACGTCTCA..ATTG    
    +
    +
    +

    However, if a cut does not overlap with the feature, the feature is retained on the Dseqrecord. For instance, if we go back to the first example given by the EcoRI cut, example_gene has been retained after cutting. For more information on Features, please refer to the Dseq_Feature documentations.

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

    © 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 new file mode 100644 index 00000000..1ea81be6 --- /dev/null +++ b/markdown_notebooks/readme_example.html @@ -0,0 +1,307 @@ + + + + + + + + + README Example — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    README Example

    +

    This notebook contains the example shown in the README file.

    + + Open In Colab + +
    # Install pydna (only when running on Colab)
    +import sys
    +if 'google.colab' in sys.modules:
    +    %%capture
    +    # Install the current development version of pydna (comment to install pip version)
    +    !pip install git+https://github.com/BjornFJohansson/pydna@dev_bjorn
    +    # Install pip version instead (uncomment to install)
    +    # !pip install pydna
    +
    +
    +
    from pydna.dseqrecord import Dseqrecord
    +# Let's create a DNA sequence record, and add a feature to it
    +dsr = Dseqrecord("ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAAT")
    +dsr.add_feature(x=0, y=60,type="gene", label="my_gene") # We add a feature to highlight the sequence as a gene
    +dsr.figure()
    +
    +
    +
    +
    Dseqrecord(-60)
    +ATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAAT
    +TACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTA
    +
    +
    +
    # This is how it would look as a genbank file
    +print(dsr.format("genbank"))
    +
    +
    +
    LOCUS       name                      60 bp    DNA     linear   UNK 01-JAN-1980
    +DEFINITION  description.
    +ACCESSION   id
    +VERSION     id
    +KEYWORDS    .
    +SOURCE      .
    +  ORGANISM  .
    +            .
    +FEATURES             Location/Qualifiers
    +     misc            1..60
    +                     /type="gene"
    +                     /label="my_gene"
    +ORIGIN
    +        1 atgcaaacag taatgatgga tgacattcaa agcactgatt ctattgctga aaaagataat
    +//
    +
    +
    +
    # Now let's design primers to amplify it
    +from pydna.design import primer_design
    +# limit is the minimum length of the primer, target_tm is the desired melting temperature of the primer
    +amplicon = primer_design(dsr, limit=13, target_tm=55)
    +# Let's print the primers, and a figure that shows where they align with the template sequence
    +print("forward primer:", amplicon.forward_primer.seq)
    +print("reverse primer:", amplicon.reverse_primer.seq)
    +amplicon.figure()
    +
    +
    +
    forward primer: ATGCAAACAGTAATGATGGA
    +reverse primer: ATTATCTTTTTCAGCAATAGAATCA
    +
    +
    +
    +
    +
    +5ATGCAAACAGTAATGATGGA...TGATTCTATTGCTGAAAAAGATAAT3
    +                        |||||||||||||||||||||||||
    +                       3ACTAAGATAACGACTTTTTCTATTA5
    +5ATGCAAACAGTAATGATGGA3
    + ||||||||||||||||||||
    +3TACGTTTGTCATTACTACCT...ACTAAGATAACGACTTTTTCTATTA5
    +
    +
    +
    # Let's say we don't want to just amplify it, but we want to add restriction sites to it!
    +
    +from pydna.amplify import pcr
    +# We add the restriction sites to the primers
    +forward_primer = "ccccGGATCC" + amplicon.forward_primer
    +reverse_primer = "ttttGGATCC" + amplicon.reverse_primer
    +
    +# We do the PCR
    +pcr_product = pcr(forward_primer, reverse_primer, dsr)
    +# The PCR product is of class `Amplicon`, a subclass of `Dseqrecord`.
    +# When doing a figure, it shows where primers anneal.
    +pcr_product.figure()
    +
    +
    +
              5ATGCAAACAGTAATGATGGA...TGATTCTATTGCTGAAAAAGATAAT3
    +                                  |||||||||||||||||||||||||
    +                                 3ACTAAGATAACGACTTTTTCTATTACCTAGGtttt5
    +5ccccGGATCCATGCAAACAGTAATGATGGA3
    +           ||||||||||||||||||||
    +          3TACGTTTGTCATTACTACCT...ACTAAGATAACGACTTTTTCTATTA5
    +
    +
    +
    # If we want to see the sequence more clearly, we can turn it into a `Dseqrecord`
    +pcr_product = Dseqrecord(pcr_product)
    +pcr_product.figure()
    +
    +
    +
    Dseqrecord(-80)
    +ccccGGATCCATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATGGATCCaaaa
    +ggggCCTAGGTACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTACCTAGGtttt
    +
    +
    +
    from Bio.Restriction import BamHI # cuts GGATCC
    +# a, payload, c are the cut fragments
    +a, payload, c = pcr_product.cut (BamHI)
    +print(a.figure())
    +print()
    +print (payload.figure())
    +print()
    +print(c.figure())
    +
    +
    +
    +
    +
    Dseqrecord(-9)
    +ccccG    
    +ggggCCTAG
    +
    +Dseqrecord(-70)
    +GATCCATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATG    
    +    GTACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTACCTAG
    +
    +Dseqrecord(-9)
    +GATCCaaaa
    +    Gtttt
    +
    +
    +
    # We create a circular vector to insert the amplicon into
    +vector = Dseqrecord("aatgtttttccctCCCGGGcaaaatAGATCTtgctatgcatcatcgatct", circular=True, name="vect")
    +vector.figure()
    +
    +
    +
    Dseqrecord(o50)
    +aatgtttttccctCCCGGGcaaaatAGATCTtgctatgcatcatcgatct
    +ttacaaaaagggaGGGCCCgttttaTCTAGAacgatacgtagtagctaga
    +
    +
    +
    from Bio.Restriction import BglII # cuts AGATCT
    +linear_vector_bgl = vector.cut(BglII)[0] # Linearize the vector at BglII (produces only one fragment)
    +
    +# Ligate the fragment of interest to the vector, and call looped() to circularize it
    +# synced is used to place the origin coordinate (0) in the same place for rec_vector and vector
    +rec_vector= (linear_vector_bgl + payload).looped().synced(vector)
    +rec_vector.figure()
    +
    +
    +
    +
    Dseqrecord(o116)
    +aatgtttttccctCCCGGGcaaaatAGATCCATGCAAACAGTAATGATGGATGACATTCAAAGCACTGATTCTATTGCTGAAAAAGATAATGGATCTtgctatgcatcatcgatct
    +ttacaaaaagggaGGGCCCgttttaTCTAGGTACGTTTGTCATTACTACCTACTGTAAGTTTCGTGACTAAGATAACGACTTTTTCTATTACCTAGAacgatacgtagtagctaga
    +
    +
    +
    # Let's simulate a Gibson assembly
    +from pydna.assembly import Assembly
    +
    +fragments = [
    +    Dseqrecord('aatgtttttccctCACTACGtgctatgcatcat', name="fragment_A"),
    +    Dseqrecord('tgctatgcatcatCTATGGAcactctaataatg', name="fragment_B"),
    +    Dseqrecord('cactctaataatgTTACATAaatgtttttccct', name="fragment_C"),
    +]
    +
    +# limit is the min. homology length between fragments in the assembly
    +asm = Assembly(fragments, limit=10)
    +
    +# From the assembly object, which can generate all possible products, get a circular
    +product, *rest = asm.assemble_circular()
    +
    +# We can print a figure that shows the overlaps between fragments
    +product.figure()
    +
    +
    +
    +
     -|fragment_A|13
    +|             \/
    +|             /\
    +|             13|fragment_B|13
    +|                           \/
    +|                           /\
    +|                           13|fragment_C|13
    +|                                         \/
    +|                                         /\
    +|                                         13-
    +|                                            |
    + --------------------------------------------
    +
    +
    +
    # Or show the final sequence:
    +Dseqrecord(product).figure()
    +
    +
    +
    Dseqrecord(o60)
    +aatgtttttccctCACTACGtgctatgcatcatCTATGGAcactctaataatgTTACATA
    +ttacaaaaagggaGTGATGCacgatacgtagtaGATACCTgtgagattattacAATGTAT
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    +

    © 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/module_contents.html b/module_contents.html new file mode 100644 index 00000000..3a107994 --- /dev/null +++ b/module_contents.html @@ -0,0 +1,5043 @@ + + + + + + + + + Module contents — pydna 6.0.0a24.post17+b7b559bd66 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Module contents

    +
    +

    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.

    +
    + +
    +
    +

    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))]
    +
    +
    +
    + +
    + +
    +
    +

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

    +

    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]
    +
    + +
    + +
    +
    +

    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)
    +>>>
    +
    +
    +
    + +
    +
    +

    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)
    +
    + +
    + +
    +
    +

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

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

    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)[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.

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

    pydna.download

    +

    Provides a function for downloading online text files.

    +
    +
    +

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

    +

    docstring.

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

    docstring.

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

    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
    +//
    +
    +
    +
    + +
    +
    +

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

    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
    +//
    +
    +
    +
    + +
    +
    +

    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.

    +
    + +
    + +
    +
    +

    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.

    +
    + +
    +
    +

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

    +

    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

    +

    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

    +

    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

    +

    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

    +

    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 013f9abb..8dd4a49b 100644 Binary files a/objects.inv and b/objects.inv differ diff --git a/py-modindex.html b/py-modindex.html index c4aa904d..ead5096f 100644 --- a/py-modindex.html +++ b/py-modindex.html @@ -1,20 +1,21 @@ - + - Python Module Index — pydna 0.0.0.post1+0f15ccd documentation + Python Module Index — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -42,8 +43,15 @@
    @@ -82,117 +90,117 @@

    Python Module Index

    - pydna + pydna     - pydna.amplicon + pydna.amplicon     - pydna.amplify + pydna.amplify     - pydna.assembly + pydna.assembly     - pydna.common_sub_strings + pydna.common_sub_strings     - pydna.contig + pydna.contig     - pydna.design + pydna.design     - pydna.download + pydna.download     - pydna.dseq + pydna.dseq     - pydna.dseqrecord + pydna.dseqrecord     - pydna.editor + pydna.editor     - pydna.gel + pydna.gel     - pydna.genbank + pydna.genbank     - pydna.genbankfile + pydna.genbankfile     - pydna.genbankfixer + pydna.genbankfixer     - pydna.genbankrecord + pydna.genbankrecord     - pydna.myprimers + pydna.myprimers     - pydna.parsers + pydna.parsers     - pydna.primer + pydna.primer     - pydna.readers + pydna.readers     - pydna.seqrecord + pydna.seqrecord     - pydna.tm + pydna.tm     - pydna.utils + pydna.utils diff --git a/search.html b/search.html index 3d86d461..3a298646 100644 --- a/search.html +++ b/search.html @@ -1,21 +1,22 @@ - + - Search — pydna 0.0.0.post1+0f15ccd documentation + Search — pydna 6.0.0a24.post17+b7b559bd66 documentation + - - - + + + @@ -42,8 +43,15 @@
    diff --git a/searchindex.js b/searchindex.js index 5b463542..b5101993 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", "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/readme_example", "module_contents"], "filenames": ["CHANGELOG.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/readme_example.md", "module_contents.rst"], "titles": ["Changelog", "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", "README Example", "Module contents"], "terms": {"all": [0, 6, 7, 9, 10, 12, 13, 14, 15, 16], "notabl": 0, "thi": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "project": [0, 4, 10], "document": [0, 2, 5, 6, 7, 9, 10, 11, 12, 13, 14], "file": [0, 4, 6, 7, 9, 10, 13, 14, 15, 16], "The": [0, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "format": [0, 4, 7, 9, 10, 12, 13, 15, 16], "i": [0, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "base": [0, 6, 7, 10, 12, 13, 16], "keep": [0, 16], "adher": 0, "semant": 0, "version": [0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "new": [0, 6, 7, 12, 13, 14, 16], "common_sub_str": [0, 11], "function": [0, 1, 4, 6, 9, 10, 11, 12, 13, 16], "previou": [0, 16], "wa": [0, 7, 16], "implement": [0, 16], "pure": 0, "python": [0, 3, 6, 7, 12, 16], "quit": [0, 16], "fast": 0, "still": 0, "bottleneck": 0, "code": [0, 6, 7, 9, 10, 12, 13], "thank": 0, "louisabraham": 0, "we": [0, 2, 6, 7, 11, 13, 14, 15, 16], "now": [0, 6, 12, 15, 16], "have": [0, 4, 7, 8, 9, 12, 13, 16], "pydivsufsort": 0, "which": [0, 3, 4, 5, 6, 7, 10, 11, 13, 14, 15, 16], "provid": [0, 3, 6, 7, 11, 12, 13, 16], "bind": [0, 13, 16], "libdivsufsort": 0, "veri": [0, 7, 14, 16], "suffix": 0, "arrai": 0, "construct": [0, 3, 7, 9, 10, 16], "algorithm": [0, 11, 16], "written": [0, 9, 16], "c": [0, 10, 15, 16], "As": [0, 12, 16], "consequ": [0, 6], "assembli": [0, 3, 8, 10, 15], "much": 0, "faster": [0, 16], "poetri": 0, "us": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15], "build": [0, 10], "pydna": [0, 1, 2, 4, 7, 8, 10, 14, 15], "remov": [0, 4, 12, 14, 16], "setup": 0, "py": [0, 16], "also": [0, 2, 4, 5, 7, 10, 12, 13, 14, 16], "do": [0, 1, 6, 15, 16], "anaconda": 0, "packag": [0, 3, 5, 13], "anymor": 0, "conda": 0, "got": 0, "too": [0, 13], "slow": [0, 16], "work": [0, 10, 11, 12, 14, 16], "plan": [0, 3, 14], "updat": 0, "bioconda": 0, "recip": 0, "anyon": 0, "can": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "make": [0, 6, 7, 8, 11, 13, 14, 16], "grayskul": 0, "exampl": [0, 5, 6, 7, 8, 11, 12, 13, 14], "dseq": [0, 2, 8, 11, 13, 14], "dseqrecord": [0, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15], "onli": [0, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "take": [0, 11, 12, 13, 16], "circular": [0, 7, 8, 10, 11, 12, 13, 15, 16], "argument": [0, 6, 11, 12, 13, 16], "true": [0, 6, 7, 11, 14, 15, 16], "fals": [0, 8, 14, 16], "indic": [0, 6, 13, 16], "topologi": [0, 8, 12, 16], "previous": [0, 13], "linear": [0, 6, 7, 8, 10, 12, 13, 14, 15, 16], "accept": [0, 16], "littl": 0, "featur": [0, 6, 8, 10, 11, 12, 13, 15, 16], "me": 0, "made": [0, 5, 9, 10, 16], "init": [0, 8], "method": [0, 4, 9, 10, 11, 12, 13, 14, 16], "both": [0, 6, 10, 16], "class": [0, 5, 9, 10, 11, 12, 13, 14, 15, 16], "complex": [0, 3], "violat": 0, "zen": 0, "There": [0, 14, 16], "should": [0, 5, 7, 9, 13, 14, 16], "one": [0, 5, 6, 7, 11, 12, 13, 15, 16], "prefer": [0, 16], "could": [0, 7, 11, 12, 16], "break": 0, "henc": [0, 12], "bump": 0, "major": 0, "number": [0, 6, 7, 8, 10, 11, 14, 16], "black": 0, "suggest": [0, 16], "git": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "pre": [0, 4, 9, 11], "commit": 0, "hook": 0, "so": [0, 2, 4, 6, 7, 12, 13, 14, 16], "more": [0, 11, 12, 13, 15], "standard": [0, 16], "cach": [0, 16], "download": 0, "genbank": [0, 4, 6, 7, 8, 12, 13, 14, 15], "sever": [0, 4, 7, 16], "someth": 0, "saw": 0, "remain": 0, "reduc": 0, "load": [0, 8], "server": [0, 10], "speed": 0, "thing": [0, 7, 16], "up": [0, 4, 16], "environ": [0, 16], "variabl": [0, 6, 14, 16], "pydna_assembly_limit": 0, "set": [0, 16], "execut": [0, 3], "time": [0, 16], "second": [0, 6, 14, 16], "default": [0, 4, 7, 11, 13, 16], "assemble_linear": [0, 8, 16], "assemble_circular": [0, 9, 11, 15, 16], "might": [0, 6, 7, 13, 16], "better": 0, "wai": [0, 2, 6, 7, 12, 14, 16], "find": [0, 2, 6, 7, 10, 11, 13, 16], "out": [0, 6, 7, 8, 9, 10, 16], "an": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16], "like": [0, 6, 7, 8, 9, 10, 13, 16], "long": [0, 7, 16], "usual": [0, 4, 16], "when": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16], "ar": [0, 1, 2, 3, 4, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16], "mani": [0, 3, 7, 16], "path": [0, 12, 13, 14, 16], "through": [0, 5, 7, 10, 13, 16], "graph": [0, 16], "01": [0, 7, 10, 13, 15, 16], "log": [0, 16], "onelin": 0, "v5": 0, "a03c2a06a20afef95415f5f1786df2f71e921fd0": 0, "a03c2a06a2": 0, "head": 0, "dev_bjorn": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "origin": [0, 6, 9, 10, 12, 13, 15, 16], "master": 0, "c7ce8582fa": 0, "uppd": 0, "action": 0, "ca4c969c28": 0, "fix": [0, 4, 16], "test": [0, 16], "comment": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "unneed": 0, "6539a1f076": 0, "probabl": [0, 16], "need": [0, 4, 5, 6, 7, 11, 13, 16], "futur": 0, "c933ca5a7b": 0, "c32fc5c9be": 0, "dsecrecord": 0, "70ced77d24": 0, "min_rot": 0, "from": [0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16], "2cc4edbc68": 0, "w": [0, 10, 16], "4888db36f3": 0, "0bf9fbd993": 0, "precommit": 0, "74e3e1c229": 0, "fromat": 0, "f78dcb2fdd": 0, "lock": 0, "769dc98d89": 0, "mergeexp": 0, "merg": [0, 16], "d242459fc5": 0, "speed_up_dseqrecord": 0, "try": [0, 6, 16], "ignor": [0, 16], "prof": 0, "dir": [0, 7, 16], "bef4f6800c": 0, "edit": [0, 5, 8, 16], "e29ac49f8": 0, "prep": 0, "dundermethod": 0, "2acbc5033c": 0, "__copy__": 0, "__deepcopy__": 0, "9916a62c93": 0, "pstat": 0, "script": 0, "0b41671c1c": 0, "mod": 0, "9f060a0dea": 0, "cbd4773605": 0, "back": [0, 14, 16], "iter": [0, 12, 16], "9b93d8988c": 0, "properti": [0, 7, 16], "798899569a": 0, "profil": 0, "9b5e7a6c13": 0, "b1a8771323": 0, "add": [0, 4, 7, 8, 13, 15, 16], "profilig": 0, "ae93cb340f": 0, "dep": 0, "6f3f39398a": 0, "pass": [0, 5, 6, 12, 13, 16], "modifi": [0, 6, 7, 13, 16], "694ea1b5d5": 0, "smallest_rot": [0, 16], "c57f5cb3c5": 0, "profin": 0, "error": [0, 9, 10], "f82a5676d6": 0, "9d18ed4c03": 0, "gitignor": 0, "28d8e98fd8": 0, "separ": [0, 16], "doctest": 0, "dacf9e1f3b": 0, "whitespac": 0, "6513a0bf85": 0, "cruft": 0, "c4a0265a12": 0, "3c11115871": 0, "01999514c2": 0, "track": [0, 16], "6eb2154fff": 0, "reformat": 0, "4e08cb910d": 0, "switch": [0, 16], "docstr": [0, 13, 16], "014b40e20d": 0, "reorgan": 0, "190541a51": 0, "pyproject": 0, "toml": 0, "4c9d27042f": 0, "pytest": 0, "env": [0, 16], "733d83782a": 0, "run_test": 0, "1db40a1bc7": 0, "experi": [0, 3, 8, 14], "9ac4f4c6f2": 0, "b867cd2039": 0, "old": [0, 16], "35f8eb03d1": 0, "4b4bafb272": 0, "badg": [0, 2], "f496be825b": 0, "url": [0, 4, 8, 16], "a16e7a004d": 0, "uppdat": 0, "5190177811": 0, "76a5930791": 0, "timeout": 0, "var": 0, "3cf0bba9bc": 0, "limit": [0, 8, 9, 11, 15, 16], "cd76b4a123": 0, "f4ef97dbc0": 0, "cheat": 0, "sheet": 0, "c0f111c67a": 0, "target": [0, 5, 8, 10, 16], "branch": 0, "pull": 0, "req": 0, "f0385b7981": 0, "5252df3cf4": 0, "wrapt": 0, "decor": 0, "5d46b153e6": 0, "upd": 0, "436ae27381": 0, "cython": 0, "notebook": [0, 2, 6, 7, 9, 10, 12, 15], "ce9a919e15": 0, "2ce61667d": 0, "8be47b5463": 0, "stuff": 0, "75ea5dbee1": 0, "http": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "github": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "com": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "bjornfjohansson": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "5c2ec77539": 0, "request": [0, 4], "106": 0, "dependabot": 0, "pip": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "coverag": 0, "b15fd0cbb4": 0, "8e529ff1c7": 0, "cash": 0, "some": [0, 1, 3, 7, 8, 13, 16], "8dd2ca19a0": 0, "bugfix": 0, "hardcod": 0, "strand": [0, 6, 7, 16], "dacb024944": 0, "a3c3791917": 0, "74d3850352": 0, "94": [0, 10], "ipython": [0, 8, 16], "66f20aa195": 0, "30d109bbb2": 0, "95": [0, 16], "biopython": [0, 4, 6, 12, 16], "81": 0, "bd0ef21a96": 0, "80": [0, 15], "879c81ccf7": 0, "96": 0, "pyqt5": 0, "5482b0788f": 0, "813ac07394": 0, "gel": [0, 3], "imag": [0, 3, 4, 8], "63de396a5f": 0, "1eb18bc709": 0, "c6d1fbda8c": 0, "link": [0, 7, 10, 16], "ffda81e24": 0, "f8896ab27f": 0, "readm": 0, "md": 0, "546f357997": 0, "98b6eaa55f": 0, "improv": 0, "186dbff025": 0, "slice": [0, 16], "genbankrecord": 0, "10e79ccaba": 0, "tabl": [0, 16], "c45913bee0": 0, "593b1f4dfb": 0, "simplifi": [0, 16], "9800fdf2bb": 0, "9276a054fa": 0, "start": [0, 6, 8, 10, 16], "figur": [0, 6, 8, 13, 15, 16], "amplicon": [0, 10, 13, 15], "0cb741bf84": 0, "pcr": [0, 3, 6, 7, 9, 10, 11, 15, 16], "a6fda7a276": 0, "c1ec911a22": 0, "5b53ffc9ff": 0, "raw": 0, "77f2121d76": 0, "fbcdb0bea4": 0, "b9ada45f20": 0, "a16e7a004da1292f33db5a9a48f19c61b415dff6": 0, "end": [0, 6, 7, 8, 10, 13, 14, 16], "modul": [0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "myprimers_gdoc": 0, "store": [0, 6, 7, 12, 14, 16], "primer": [0, 3, 9, 10, 11, 15], "googl": [0, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "doc": [0, 2, 16], "fakeseq": 0, "dna": [0, 3, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "ladder": 0, "contain": [0, 5, 6, 7, 10, 12, 13, 15, 16], "molecular": [0, 6, 10, 11, 13, 14, 16], "weight": [0, 16], "marker": [0, 10], "myprim": 0, "sorted_featur": [0, 16], "seqrecord": [0, 4, 6, 12], "lc": [0, 16], "l": [0, 10, 16], "ongest": 0, "ommon": 0, "": [0, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16], "ubstr": 0, "78": 0, "requir": [0, 4, 7, 11, 12, 16], "txt": [0, 16], "check_my_prim": 0, "releas": 0, "bug": [0, 16], "stamp": [0, 16], "cseguid": [0, 16], "locat": [0, 7, 10, 12, 13, 15, 16], "certain": 0, "test_marker_replacement_on_plasmid": 0, "test_module_assembli": 0, "src": 0, "layout": 0, "how": [0, 2, 6, 7, 8, 12, 14, 15], "melt": [0, 13, 15, 16], "temperatur": [0, 13, 15, 16], "calcul": [0, 4, 16], "conftest": 0, "comat": 0, "mysequ": 0, "upper": [0, 6, 16], "lower": [0, 6, 16], "especi": [0, 3, 16], "easili": [0, 6, 7], "rerun": 0, "after": [0, 6, 7, 14, 16], "modif": [0, 16], "templat": [0, 13, 15, 16], "first": [0, 6, 10, 12, 13, 14, 16], "alpha": 0, "_multiply_circular": 0, "import": [0, 5, 6, 7, 9, 10, 11, 13, 14, 15, 16], "main": [0, 6, 16], "namespac": 0, "finer": 0, "control": [0, 12, 16], "over": [0, 7, 12, 16], "assembly_frag": [0, 16], "creat": [0, 5, 6, 7, 8, 11, 12, 14, 15, 16], "tail": [0, 16], "_": [0, 16], "delete_cach": 0, "simplic": 0, "design": [0, 3, 9, 10, 11, 15], "print_primer_pair": 0, "cloning_prim": 0, "integration_prim": 0, "assembly_prim": 0, "compat": [0, 6, 7, 16], "simpler": [0, 16], "api": [0, 12, 16], "gibson": [0, 3, 15, 16], "see": [0, 4, 7, 8, 13, 15, 16], "allow": [0, 3, 5, 12, 13, 16], "subsequ": [0, 16], "edg": [0, 16], "sequenc": [0, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16], "messag": [0, 9, 10], "write": [0, 7, 16], "split": [0, 16], "logic": 0, "smaller": 0, "chunk": 0, "same": [0, 6, 10, 15, 16], "amplifi": [0, 9, 10, 13, 15], "less": [0, 10, 16], "getcach": 0, "return": [0, 6, 9, 10, 11, 12, 13, 14, 16], "pydna_cach": 0, "nocach": 0, "refresh": 0, "repr": [0, 16], "jupyt": 0, "One": [0, 6, 16], "run": [0, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "part": [0, 3, 13, 16], "suit": 0, "nbval": 0, "parse_prim": [0, 16], "list": [0, 5, 6, 7, 9, 11, 12, 13, 14, 16], "object": [0, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16], "read_prim": [0, 16], "read_url": 0, "parse_url": 0, "sinc": [0, 6, 7, 14, 16], "thei": [0, 2, 6, 7, 15, 16], "riski": 0, "download_text": [0, 4, 16], "combin": [0, 16], "read": [0, 7, 8, 12, 16], "pars": [0, 7, 9, 10, 12, 13, 14, 16], "intermedi": [0, 3, 16], "text": [0, 4, 16], "inspect": [0, 16], "genbankfix": [0, 4], "appli": [0, 6, 11, 13, 14], "necessari": [0, 9, 10, 16], "salvag": 0, "broken": [0, 16], "gbtext_clean": [0, 4, 16], "readprim": 0, "shortcut": 0, "kei": [0, 7, 8, 9, 10, 12, 16], "open_cach": 0, "open_cache_fold": [0, 16], "open": [0, 2, 7, 16], "folder": [0, 2, 16], "browser": [0, 2], "level": 0, "info": [0, 6], "possibl": [0, 6, 15, 16], "specifi": [0, 6, 7, 13, 16], "ap": [0, 16], "plasmid": [0, 5, 6, 7, 9, 14, 16], "editor": 0, "biologylab": [0, 16], "utah": [0, 16], "edu": [0, 16], "jorgensen": [0, 16], "wayn": [0, 16], "These": [0, 4, 6, 16], "ini": [0, 16], "user_config_dir": 0, "each": [0, 7, 11, 16], "platform": 0, "appdir": 0, "linux": [0, 16], "config": 0, "invis": 0, "band": 0, "larg": [0, 10], "record": [0, 7, 11, 12, 13, 14, 15, 16], "were": 0, "complet": [0, 3, 10, 11, 12, 14, 16], "simul": [0, 3, 4, 5, 6, 8, 11, 15, 16], "shelv": 0, "doe": [0, 7, 14, 16], "under": [0, 4, 7], "maco": 0, "condit": 0, "tri": [0, 16], "solv": 0, "extens": 0, "two": [0, 6, 7, 8, 10, 11, 13, 14, 16], "pydna_data_dir": [0, 16], "encod": [0, 10, 16], "string": [0, 6, 7, 13, 14, 16], "instead": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "unicod": 0, "popen": 0, "critic": [0, 13], "seguid": [0, 16], "checksum": [0, 16], "safe": [0, 16], "name": [0, 7, 8, 10, 11, 13, 14, 15, 16], "locu": [0, 7, 10, 12, 13, 15, 16], "alia": [0, 16], "access": [0, 7, 8, 10, 12, 13, 15, 16], "id": [0, 7, 8, 10, 11, 13, 14, 15, 16], "definit": [0, 7, 10, 12, 13, 15, 16], "descript": [0, 3, 7, 8, 10, 11, 14, 15, 16], "product": [0, 7, 8, 9, 10, 11, 12, 15, 16], "identifi": [0, 16], "proxi": 0, "handl": [0, 2, 16], "current": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "empti": [0, 16], "datadir": 0, "environment": [0, 16], "pydna_dna_dir": 0, "initi": [0, 16], "longer": [0, 16], "than": [0, 6, 16], "charact": [0, 6, 16], "truncat": [0, 14], "char": 0, "warn": 0, "issu": [0, 16], "na": [0, 16], "eq": [0, 16], "ne": 0, "defin": [0, 6, 7, 13, 16], "overwrit": [0, 7], "filenam": [0, 16], "primari": [0, 8], "look": [0, 6, 7, 8, 15, 16], "directori": [0, 16], "ipynb_import": 0, "window": [0, 16], "data": [0, 14, 16], "map": [0, 16], "public": [0, 6], "pretty_str": [0, 16], "beautifi": 0, "output": [0, 6, 11, 13, 16], "shell": [0, 16], "short": [0, 16], "linker": 0, "incorpor": [0, 16], "desqrecord": 0, "sync": [0, 15, 16], "four": [0, 16], "shelf": 0, "user": [0, 13, 16], "applic": [0, 7], "o": [0, 10, 16], "specif": [0, 5, 6, 7, 9, 10, 13, 14, 16], "pypi": 0, "org": [0, 16], "nopcr": 0, "cut": [0, 5, 8, 10, 15, 16], "preserv": 0, "networkx": [0, 16], "anneal": [0, 13, 15, 16], "deal": [0, 6, 16], "ambigu": [0, 6, 16], "codon": [0, 4, 7], "r": [0, 9, 10, 16], "A": [0, 3, 6, 7, 10, 12, 13, 14, 16], "g": [0, 6, 7, 10, 11, 12, 13, 14, 16], "In": [0, 5, 6, 7, 8, 13, 14, 16], "result": [0, 9, 10, 13, 14, 16], "nucleotid": [0, 6, 7, 8, 10, 16], "e": [0, 6, 7, 10, 12, 13, 14, 16], "correspond": [0, 6], "add_featur": [0, 15, 16], "other": [0, 6, 10, 11, 14, 16], "input": [0, 12, 13, 16], "produc": [0, 14, 15, 16], "gain": 0, "three": [0, 6, 14, 16], "isorf": [0, 16], "list_featur": [0, 7, 16], "ascii": [0, 16], "extract_featur": [0, 16], "extract": [0, 7, 12, 16], "form": [0, 16], "primer_design": [0, 10, 13, 15, 16], "util": [0, 4], "subclass": [0, 4, 6, 13, 15, 16], "compound": [0, 7], "fit": [0, 16], "62": 0, "seqfeatur": [0, 7, 10, 16], "dict": [0, 16], "span": 0, "behaviour": [0, 12], "substr": [0, 16], "slightli": [0, 16], "differ": [0, 6, 13, 16], "permit": 0, "instal": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "sourc": [0, 7, 8, 9, 10, 12, 13, 15], "without": [0, 5, 6, 7, 13, 16], "compil": 0, "clean": [0, 4, 16], "renam": 0, "drecord": 0, "consist": 0, "seq": [0, 6, 7, 8, 10, 13, 15, 16], "keyword": [0, 7, 8, 10, 12, 13, 15, 16], "d": [0, 10, 16], "while": [0, 7, 16], "below": [1, 4, 6, 7, 11, 12, 13, 16], "show": [1, 6, 11, 12, 14, 15, 16], "real": [1, 7, 8], "world": [1, 7], "scenario": [1, 6, 7], "example_restrict": 1, "restrict": [1, 3, 6, 7, 13, 15, 16], "ligat": [1, 3, 13, 15], "xyz": 1, "best": [2, 6, 7, 16], "follow": [2, 4, 6, 7, 9, 10, 11, 12, 13, 14, 16], "our": [2, 8], "tutori": 2, "you": [2, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 16], "them": [2, 6, 7, 8, 14, 16], "repositori": [2, 16], "reproduc": 2, "here": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "serv": 2, "local": [2, 16], "colab": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "simpli": [2, 7, 14], "click": [2, 4], "recommend": 2, "order": [2, 16], "basic": [2, 3, 4, 8, 16], "introduct": 2, "etc": [2, 6, 7, 14], "genet": 3, "step": [3, 9, 10, 11, 13], "recombin": [3, 8, 11, 16], "metabol": 3, "pathwai": 3, "petri_dish": 3, "often": [3, 4, 5], "difficult": [3, 16], "properli": [3, 7], "evid": 3, "poor": 3, "state": 3, "scientif": 3, "literatur": 3, "radioact": 3, "human": 3, "readabl": [3, 16], "formal": 3, "clone": [3, 6, 9, 11, 13, 14, 16], "strategi": 3, "snake": 3, "verif": 3, "express": [3, 16], "unambigu": 3, "stabl": [3, 8], "digest": [3, 10, 13, 14, 16], "electrophoresi": 3, "gener": [3, 4, 5, 8, 11, 12, 13, 15, 16], "homolog": [3, 8, 10, 11, 16], "golden": 3, "gate": 3, "progress": 3, "virtual": 3, "ani": [3, 7, 14, 16], "sub": [3, 16], "describ": [3, 7, 8, 9, 10, 16], "its": [3, 7, 12, 16], "yield": 3, "final": [3, 8, 15, 16], "molecul": [3, 16], "ha": [3, 5, 6, 7, 10, 11, 13, 14, 16], "been": [3, 5, 7, 8, 9, 11, 13, 14, 16], "goal": 3, "being": 3, "understand": 3, "biologist": 3, "share": [3, 11, 16], "combinatori": 3, "By": [4, 7, 11, 16], "minim": [4, 7], "depend": 4, "option": [4, 9, 16], "addit": [4, 7, 13], "enabl": 4, "copy_gb_to_clipboard": [4, 16], "copy_fasta_to_clipboard": [4, 16], "put": [4, 16], "copi": [4, 7, 10, 16], "either": [4, 6, 16], "gb": [4, 7, 8, 9, 10, 12, 13, 14, 16], "fasta": [4, 6, 9, 12, 14, 16], "pyperclip": 4, "pypars": [4, 16], "automat": [4, 7, 16], "correct": [4, 10, 13, 14, 16], "malform": [4, 16], "found": [4, 6, 7, 9, 10, 13, 14, 16], "onlin": [4, 16], "get": [4, 5, 6, 7, 10, 15], "corrupt": 4, "cai": [4, 16], "avail": [4, 16], "cai2": 4, "adapt": [4, 13, 16], "index": [4, 6, 12, 13, 14, 16], "scipi": 4, "matplotlib": 4, "pillow": 4, "pil": 4, "numpi": 4, "flag": 4, "latest": 4, "upgrad": 4, "command": [4, 16], "insid": [4, 13], "squar": [4, 6, 10], "bracket": [4, 6], "sure": [4, 13, 14], "leav": [4, 14], "space": 4, "recogn": 4, "If": [4, 6, 7, 13, 14, 15, 16], "your": [4, 6, 7, 8, 12, 14], "manag": [4, 16], "With": [4, 8], "ommit": 4, "don": [4, 6, 15], "t": [4, 6, 10, 12, 13, 14, 15, 16], "want": [4, 6, 7, 8, 13, 15], "extra": [4, 13, 16], "alreadi": [4, 7, 13, 16], "uninstal": 4, "again": 4, "visit": [5, 6, 7, 9, 10, 11, 12, 13, 14], "full": [5, 6, 7, 9, 10, 11, 12, 13, 14, 16], "librari": [5, 6, 7, 9, 10, 11, 12, 13, 14], "site": [5, 10, 12, 13, 14, 15, 16], "guid": [5, 8, 13], "rna": [5, 10, 16], "grna": 5, "direct": [5, 6, 8, 10, 12, 16], "protein": [5, 7, 10, 12, 16], "page": [5, 7, 11, 13, 14], "process": [5, 10, 16], "biolog": [5, 7, 9, 13, 16], "activit": 5, "guiderna": 5, "addtion": 5, "target_sequ": 5, "sy": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "captur": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "develop": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "uncom": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "protospac": [5, 8], "note": [5, 6, 7, 9, 10, 11, 12, 13, 16], "scaffold": 5, "gttactttacccgacgtcccgttttagagctagaaatagcaagttaaaataagg": 5, "gttactttacccgacgtcccagg": 5, "pam": 5, "enzym": [5, 8, 10, 16], "gttactttacccgacgtccc": 5, "target_dseq": [5, 8], "print": [5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "1": [5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "grna_protospac": 5, "ca": [5, 16], "becaus": [5, 16], "multipl": [5, 7, 11, 12, 13, 14], "0": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "enzyme2": [5, 8], "2": [5, 6, 7, 8, 10, 12, 16], "target_nopam_dseq": 5, "gttactttacccgacgtcccaaa": 5, "17": [5, 10, 16], "6": [5, 6, 7, 10, 11, 13, 16], "doubl": [6, 16], "Be": 6, "overhang": [6, 16], "sticki": [6, 14, 16], "biologi": [6, 7, 9, 11, 12, 16], "think": 6, "author": [6, 10, 12, 16], "whose": [6, 14, 16], "For": [6, 7, 8, 11, 13, 14, 16], "my_seq": [6, 16], "aatat": 6, "5": [6, 7, 8, 9, 10, 13, 14, 15, 16], "ttata": 6, "represent": [6, 12, 16], "abov": [6, 16], "line": [6, 12, 16], "basepair": 6, "top": [6, 16], "sens": [6, 7, 16], "watson": [6, 16], "refer": [6, 7, 8, 10, 11, 12, 13, 14, 16], "bottom": [6, 7], "anti": 6, "crick": [6, 16], "let": [6, 8, 15], "o5": 6, "instanti": [6, 7, 12, 16], "3": [6, 7, 9, 10, 12, 13, 16], "ovhg": [6, 16], "posit": [6, 7, 10, 16], "neg": [6, 16], "extend": 6, "beyond": 6, "actag": 6, "ctag": [6, 16], "gatc": [6, 16], "omit": 6, "valu": [6, 7, 13, 16], "complementari": [6, 14], "feel": 6, "mean": [6, 16], "visualis": 6, "dsdna": [6, 16], "nnn": [6, 16], "nnnnn": [6, 16], "nnnn": [6, 16], "Of": 6, "convent": [6, 7, 13, 16], "atcg": [6, 16], "support": [6, 7, 16], "iupac": [6, 16], "anoth": [6, 7, 12, 13, 16], "from_full_sequence_and_overhang": [6, 16], "classmethod": [6, 16], "entir": [6, 7, 16], "side": [6, 16], "watson_ovhg": [6, 16], "crick_ovhg": [6, 16], "rule": [6, 16], "ident": [6, 16], "revers": [6, 10, 11, 13, 15, 16], "aaattaaa": 6, "8": [6, 7, 8, 10, 16], "aaatta": 6, "aattt": 6, "n": [6, 7, 10, 16], "aaatt": 6, "taattt": 6, "taa": [6, 16], "att": 6, "tttaattt": 6, "attaaa": 6, "tttaa": 6, "draw": 6, "help": [6, 7], "visual": [6, 13, 16], "x": [6, 15, 16], "would": [6, 7, 8, 9, 10, 13, 15, 16], "check": [6, 7, 9, 10, 13, 14, 16], "done": [6, 16], "call": [6, 15, 16], "five_prime_end": [6, 16], "three_prime_end": [6, 16], "respect": [6, 13, 16], "what": 6, "demonstr": [6, 13], "7": [6, 7, 8, 10, 12, 16], "atatt": 6, "aa": [6, 16], "tt": [6, 16], "join": [6, 7, 9, 10, 14, 16], "loop": [6, 10, 14, 15, 16], "must": [6, 13, 14, 16], "chang": [6, 12, 16], "shift": [6, 16], "between": [6, 7, 11, 15, 16], "tataa": 6, "builtin": 6, "my_list": 6, "none": [6, 16], "stop": [6, 16], "similarli": 6, "word": [6, 16], "zero": [6, 7, 13], "aatataa": 6, "tat": 6, "ata": 6, "tata": 6, "leftmost": [6, 10], "necessarili": 6, "left": [6, 10, 16], "sequence_with_overhang": 6, "aatacgttcc": 6, "10": [6, 8, 10, 12, 15, 16], "acgttcc": 6, "ttatgcaagg": 6, "count": 6, "acgt": 6, "atgcaagg": 6, "circular_seq": 6, "aatctaa": 6, "4": [6, 7, 10, 13, 16], "atct": [6, 11, 14], "taga": [6, 11, 14], "across": [6, 7], "where": [6, 11, 13, 15, 16], "bigger": 6, "aaaa": [6, 11, 16], "tttt": [6, 11, 16], "present": [6, 16], "assign": [6, 16], "date": [6, 7, 8, 16], "datetim": 6, "my_dat": 6, "2023": [6, 16], "15": [6, 7, 16], "statement": 6, "08": [6, 10], "similar": [6, 13, 14, 16], "purpos": [6, 8, 16], "most": [6, 7, 16], "right": [6, 13, 16], "even": [6, 7, 16], "last": [6, 7, 12, 16], "miss": 6, "arbitrari": 6, "won": 6, "abl": [6, 8], "xxxx": 6, "atat": 6, "befor": [7, 10, 16], "importing_seq": [7, 13], "includ": [7, 13, 14, 16], "region": [7, 11, 12, 13, 16], "gene": [7, 9, 10, 12, 13, 14, 15], "well": [7, 12, 14, 16], "signific": 7, "report": [7, 16], "associ": [7, 10, 16], "terminologi": 7, "annot": [7, 9, 10, 12, 16], "cd": [7, 10, 12, 16], "intron": [7, 10], "promot": [7, 10], "offer": 7, "via": [7, 11, 13, 14], "sampl": [7, 13, 16], "u49845": [7, 12], "parser": [7, 9, 10, 12, 13, 14], "file_path": [7, 12], "sample_record": 7, "5028": [7, 12], "chromosom": [7, 10, 12], "ix": [7, 12], "db_xref": [7, 10, 12, 16], "taxon": [7, 10, 12, 16], "4932": [7, 12], "mol_typ": [7, 10, 12, 16], "genom": [7, 8, 10, 12], "organ": [7, 8, 10, 12, 13, 15, 16], "saccharomyc": [7, 10, 12], "cerevisia": [7, 10, 12], "mrna": [7, 12], "206": [7, 10, 12], "tcp1": [7, 12], "beta": [7, 10, 12, 16], "codon_start": [7, 10, 12], "protein_id": [7, 10, 12], "aaa98665": [7, 12], "translat": [7, 10, 12, 16], "ssiyngistsgldlnngtiadmrqlgivesyklkravvssaseaaevllrvdniirarprtanrqhm": 7, "686": 7, "3158": [7, 12], "axl2": [7, 12], "axl2p": [7, 12], "plasma": [7, 12], "membran": [7, 12], "glycoprotein": [7, 12], "aaa98666": [7, 12], "mtqlqisllltatisllhlvvatpyeaypigkqyppvarvnesftfqisndtykssvdktaqityncfdlpswlsfdsssrtfsgepssdllsdanttlyfnvilegtdsadstslnntyqfvvtnrpsislssdfnllallknygytngknalkldpnevfnvtfdrsmftneesivsyygrsqlynaplpnwlffdsgelkftgtapvinsaiapetsysfviiatdiegfsavevefelvigahqlttsiqnsliinvtdtgnvsydlplnyvyldddpissdklgsinlldapdwvaldnatisgsvpdellgknsnpanfsvsiydtygdviyfnfevvsttdlfaisslpninatrgewfsyyflpsqftdyvntnvsleftnssqdhdwvkfqssnltlagevpknfdklslglkanqgsqsqelyfniigmdskithsnhsanatstrsshhststssytsstytakisstsaaatssapaalpaanktsshnkkavaiacgvaiplgvilvalicflifwrrrrenpddenlphaisgpdlnnpankpnqenatplnnpfdddassyddtsiarrlaalntlkldnhsatesdissvdekrdslsgmntyndqfqsqskeellakppvqppespffdpqnrsssvymdsepavnkswrytgnlspvsdivrdsygsqktvdteklfdleapekekrtsrdvtmssldpwnsnispspvrksvtpspynvtkhrnrhlqniqdsqsgkngitpttmstsssddfvpvkdgenfcwvhsmepdrrpskkrlvdfsnksnvnvgqvkdihgripeml": 7, "3299": 7, "4037": [7, 12], "rev7": [7, 12], "rev7p": [7, 12], "aaa98667": [7, 12], "mnrwvekwlrvylkcyinlilfyrnvyppqsfdyttyqsfnlpqfvpinrhpalidyieelildvlsklthvyrfsiciinkkndlciekyvldfselqhvdkddqiitetevfdefrsslnslimhleklpkvnddtitfeavinaielelghkldrnrrvdsleekaeierdsnwvkcqedenlpdnngfqppkikltslvgsdvgpliihqfseklisgddkilngvysqyeegesifgslf": 7, "search": [7, 11], "particular": 7, "shown": [7, 12, 14, 15], "To": [7, 11, 12, 13, 14, 16], "interest": [7, 12, 15], "instanc": [7, 13, 14, 16], "perform": [7, 9, 10, 11, 14, 16], "inform": [7, 11, 12, 13, 14, 16], "featureloc": 7, "rang": 7, "interv": 7, "wherea": 7, "close": [7, 10], "2nd": 7, "5th": 7, "repres": [7, 13, 16], "bio": [7, 10, 12, 14, 15, 16], "dummi": 7, "dummy_record": 7, "aaaatgcgtacgtgaacgt": 7, "my_featur": 7, "append": 7, "confirm": 7, "19": [7, 13, 16], "bp": [7, 10, 11, 12, 13, 15, 16], "unk": [7, 10, 13, 15, 16], "jan": [7, 10, 13, 15], "1980": [7, 10, 13, 15], "aaaatgcgta": 7, "cgtgaacgt": 7, "give": [7, 8, 12, 13], "further": [7, 16], "about": [7, 16], "dictionari": 7, "domain": [7, 13, 16], "9": [7, 10, 15, 16], "my": [7, 8, 13], "alwai": [7, 16], "my_feature2": 7, "my_record": [7, 12], "practic": [7, 8, 16], "reason": [7, 16], "singl": [7, 11, 14, 16], "ase1": [7, 10], "pomb": [7, 10], "embl": [7, 12, 16], "ft": [7, 16], "1878362": 7, "1878785": 7, "1878833": 7, "1880604": 7, "colour": 7, "primary_nam": 7, "antiparallel": [7, 10], "microtubul": [7, 10], "cross": [7, 10], "factor": [7, 10, 16], "systematic_id": 7, "spapb1a10": 7, "09": [7, 10], "controlled_cur": 7, "term": [7, 9, 16], "speci": 7, "distribut": 7, "conserv": [7, 10], "eukaryot": 7, "20081110": 7, "metazoa": 7, "vertebr": 7, "predominantli": 7, "fungi": [7, 8, 10, 12], "therefor": [7, 8], "howev": [7, 14], "risk": 7, "exist": [7, 11, 16], "qualifier_nam": 7, "new_valu": 7, "assum": [7, 16], "minu": 7, "paramet": [7, 9, 13, 16], "my_feature3": 7, "example_domain": 7, "complement": [7, 10, 11, 12, 13, 16], "16": [7, 10, 13], "compoundloc": [7, 10, 16], "9bp": 7, "12": [7, 16], "15bp": 7, "skip": 7, "acg": [7, 16], "atgcgt": 7, "tga": [7, 16], "compound_loc": 7, "cds_featur": 7, "example_gen": [7, 13, 14], "13": [7, 10, 15, 16], "mr": 7, "sub_record": 7, "molecule_typ": [7, 8, 11, 14, 16], "proteinseq": 7, "suppport": 7, "non": [7, 10, 16], "exhaust": 7, "exon": 7, "utr": [7, 10], "termin": [7, 10, 11, 16], "enhanc": 7, "rb": 7, "custom": [7, 13, 16], "synthet": [7, 9, 10, 11, 16], "bio_brick": 7, "spacer": [7, 16], "standardis": 7, "It": [7, 16], "stick": 7, "maintain": 7, "bioinformat": 7, "tool": [7, 13, 16], "databas": 7, "pleas": [7, 11, 12, 13, 14, 16], "offici": 7, "genbank_feature_t": 7, "special": 7, "immedi": [7, 16], "normal": [7, 11, 13, 14, 16], "25bp": 7, "25": [7, 8, 16], "displai": [7, 8, 11, 14], "snapgen": [7, 10, 12], "viewer": 7, "benchl": 7, "circular_record": [7, 14], "acgtgaaaaaaaaaaaaaaatgcgt": 7, "ori_feat_loc": 7, "ori_featur": 7, "misc": [7, 15, 16], "atgcgtacgtga": 7, "20": [7, 8, 10], "acgtgaaaaa": 7, "aaaaaaaaaa": 7, "tgcgt": 7, "simpl": [7, 12, 16], "label": [7, 10, 13, 15, 16], "sta": [7, 16], "len": [7, 8, 16], "orf": [7, 16], "nd": 7, "2472": 7, "ye": 7, "738": 7, "conveni": [7, 16], "brief": 7, "overview": 7, "altern": [7, 16], "filter": 7, "f": [7, 8, 10, 16], "rev7_cds_featur": 7, "next": [7, 8, 10, 12, 16], "replac": [7, 10, 16], "desir": [7, 13, 15], "quotat": 7, "mark": 7, "qualifif": 7, "exclud": 7, "life": 8, "intuit": 8, "chosen": 8, "strucko": 8, "et": [8, 10, 13], "al": [8, 10, 13], "2024": [8, 10], "industri": 8, "relev": 8, "k": [8, 10, 12, 16], "phaffi": 8, "academ": 8, "oup": 8, "femsyr": 8, "articl": 8, "doi": 8, "1093": 8, "foae026": 8, "7740463": 8, "login": 8, "silverchair": 8, "cdn": 8, "backfil": 8, "content_publ": 8, "journal": [8, 10, 12, 16], "24": [8, 16], "1093_femsyr_foae026": 8, "m_foae026fig3": 8, "jpeg": 8, "expir": 8, "1730974846": 8, "signatur": 8, "ibkvkhkun1823iljq": 8, "1ufenko0vqwrwixadvcwqlz6yv8ydeafkgt": 8, "tslrxkftmgyiq3zincj5a5yngs4cp4necvrcqh7ad": 8, "1zejiwnrjqw51cjhgczwpzz": 8, "ndr93qvlzzd2re41cjnfkfmeu756kxrhqxwktqe2qpmpfikbvhvo8j28perj3vnjz3lqrsfp9quppdszeywiiny92jsuy448yyuagcgac2exgdleuartejmq8gtb0qntpv0dedtoxifzpgavdvo": 8, "qyqikjclj6hebuyu1lh7stus8oqcqe82cxo0iucjyf6m2lb0evxhqdldqe90m": 8, "nrkjznrmba0a__": 8, "pair": [8, 13, 16], "apkaie5g5crdk6rd3pga": 8, "oligo": 8, "assist": 8, "repair": 8, "1a": 8, "1b": 8, "integr": 8, "lac12": 8, "strain": [8, 10], "knock": 8, "favourit": 8, "myself": 8, "email": [8, 16], "tell": [8, 16], "who": [8, 16], "x06997": 8, "kluyveromyc": 8, "lacti": 8, "lactos": 8, "permeas": 8, "size": [8, 11, 14, 16], "7127": 8, "data_file_divis": 8, "pln": [8, 10, 12], "jul": [8, 10], "2016": [8, 10], "sequence_vers": 8, "unidentifi": 8, "frame": [8, 12, 16], "taxonomi": [8, 16], "eukaryota": [8, 10, 12], "dikarya": [8, 10, 12], "ascomycota": [8, 10, 12], "saccharomycotina": [8, 12], "saccharomycet": [8, 12], "saccharomycetal": [8, 12], "saccharomycetacea": [8, 12], "titl": [8, 10, 12, 16], "structur": [8, 10, 16], "yeast": [8, 10, 12], "presenc": [8, 16], "unusu": 8, "transcript": [8, 10], "submiss": [8, 10, 12], "submit": [8, 10, 12], "lac4": 8, "goe": 8, "opposit": 8, "1199": 8, "mol": [8, 10, 16], "cell": 8, "biol": [8, 10], "1987": [8, 10], "4369": 8, "4376": 8, "gcga": 8, "ttcg": 8, "cgct": 8, "aagc": 8, "choos": 8, "ccctaagtcctttgaagatt": 8, "tattattttgaggtgcttta": 8, "enzyme1": 8, "135": 8, "6992": 8, "6793": 8, "334": 8, "ko": 8, "60": [8, 15, 16], "90mer": 8, "repair_oligo": 8, "45": [8, 13, 16], "length": [8, 11, 15, 16], "aggtgaacacactctgatgtagtgcagtccctaagtcctttgaagttacggactcctcgaccgatgcccttgagagccttcaacccagtc": 8, "90": 8, "case": [8, 16], "my_ko": 8, "my_assembly_ko": 8, "rest": [8, 15], "showcas": [9, 10], "workflow": [9, 10, 11], "model": [9, 10, 11, 14], "fragment": [9, 10, 11, 15, 16], "paper": 9, "pcc1bac": 9, "ruminiclostridium": 9, "clostridium": 9, "cellulolyticum": 9, "f1": 9, "f2": 9, "f3": 9, "alongsid": [9, 10], "along": [9, 10], "tm": [9, 10], "tm_default": [9, 10, 13, 16], "pcc1bac_path": 9, "gene_path": 9, "r_cellulolyticum": 9, "pcc1bac_doc": 9, "gene_doc": 9, "pylr": 9, "insert": [9, 10, 15, 16], "f1_for": 9, "gcagcttcaagtcctgcaaacaaggtgtaccaggatcgtt": 9, "rememb": [9, 16], "sequnc": 9, "f1_rev": 9, "gatttcagtgtagttagggccagttgaattcaaacctgcc": 9, "f2_for": 9, "ggcaggtttgaattcaactggccctaactacactgaaatc": 9, "f2_rev": 9, "cttggtgccatcagcattgttctctgtaccgcccactgtc": 9, "f3_for": 9, "gacagtgggcggtacagagaacaatgctgatggcaccaag": 9, "f3_rev": 9, "cagttgaataatcatgtgttcctgcggcaaatgcagtacc": 9, "bacf1_for": 9, "aacgatcctggtacaccttgtttgcaggacttgaagctgcgcggccgcgatcctctagagtcgacctg": 9, "bacf3_rev": 9, "ggtactgcatttgccgcaggaacacatgattattcaactggcggccgccgggtaccgagctcgaattc": 9, "match": [9, 14, 16], "otherwis": [9, 10, 16], "pcr_product_f1": 9, "40": [9, 16], "pcr_product_f2": 9, "pcr_product_f3": 9, "pcr_product_bac": 9, "69": 9, "given": [9, 13, 14, 16], "assembl": [9, 11, 16], "assembled_circ": 9, "ligas": 10, "respons": 10, "mitot": 10, "spindl": 10, "pfa6a": 10, "kanmx6": 10, "vector": [10, 15, 16], "portion": 10, "cleav": 10, "asci": 10, "sali": 10, "pfa6akanmx6_path": 10, "ase1_path": 10, "cu329670": 10, "pombe_chromosome_i": 10, "3938": 10, "syn": [10, 16], "jun": [10, 16], "2022": 10, "bahler": 10, "j": [10, 12, 16], "wu": 10, "jq": 10, "longtin": 10, "m": [10, 12, 16], "shah": 10, "ng": 10, "mckenzi": 10, "3rd": 10, "steever": 10, "ab": 10, "wach": 10, "philippsen": 10, "p": [10, 16], "pringl": 10, "jr": 10, "heterolog": 10, "effici": 10, "versatil": 10, "schizosaccharomyc": 10, "1998": 10, "14": [10, 11, 16], "943": 10, "51": [10, 13, 14, 16], "pubm": [10, 12, 16], "9717240": 10, "export": [10, 12], "58": 10, "www": [10, 16], "qualifi": [10, 12, 13, 15, 16], "primer_bind": [10, 13], "35": [10, 16], "52": [10, 16], "l4440": 10, "forward": [10, 13, 15, 16], "rep_origin": 10, "794": 10, "ori": 10, "high": [10, 16], "cole1": 10, "pmb1": 10, "pbr322": 10, "puc": 10, "replic": [10, 13], "286": 10, "305": 10, "pbr322ori": 10, "965": 10, "1825": 10, "bla": 10, "lactamas": [10, 16], "ampr": 10, "confer": 10, "resist": 10, "ampicillin": 10, "carbenicillin": 10, "relat": [10, 16], "antibiot": 10, "msiqhfrvalipffaafclpvfahpetlvkvkdaedqlgarvgyi": 10, "eldlnsgkilesfrpeerfpmmstfkvllcgavlsridagqeqlgrrihysqndlvei": 10, "pvtekhltdgmtvrelcsaaitmsdntaanlllttiggpkeltaflhnmgdhvtrldrw": 10, "epelneaipnderdttmpvamattlrklltgelltlasrqqlidwmeadkvagpllrsa": 10, "lpagwfiadksgagergsrgiiaalgpdgkpsrivviyttgsqatmdernrqiaeiga": 10, "likhw": 10, "1588": 10, "1607": 10, "amp": 10, "1826": 10, "1930": 10, "pbrforeco": 10, "upsteam": 10, "ecori": [10, 13, 14, 16], "2054": 10, "2076": 10, "pgex": 10, "2176": 10, "2195": 10, "pr": [10, 16], "select": [10, 12, 14], "2276": 10, "2294": 10, "sp6": 10, "bacteriophag": 10, "polymeras": [10, 16], "2293": 10, "2407": 10, "3763": 10, "kanmx": 10, "kanamycin": 10, "1994": 10, "2750": 10, "tef": 10, "ashbya": 10, "gossypii": 10, "2751": 10, "3560": 10, "aph": 10, "ia": 10, "aminoglycosid": 10, "phosphotransferas": 10, "kanr": 10, "mgkekthvsrprlnsnmdadlygykwardnvgqsgatiyrlygkp": 10, "dapelflkhgkgsvandvtdemvrlnwltefmplptikhfirtpddawllttaipgkta": 10, "fqvleeypdsgenivdalavflrrlhsipvcncpfnsdrvfrlaqaqsrmnnglvdasd": 10, "fdderngwpveqvwkemhkllpfspdsvvthgdfsldnlifdegkligcidvgrvgiad": 10, "ryqdlailwnclgefspslqkrlfqkygidnpdmnklqfhlmldeff": 10, "2818": 10, "2837": 10, "kan": 10, "3566": 10, "3867": 10, "3886": 10, "t7": 10, "3868": 10, "gaggcggttt": 10, "gcgtattggg": 10, "cgctcttccg": 10, "cttcctcgct": 10, "cactgactcg": 10, "ctgcgctcgg": 10, "61": [10, 12, 16], "tcgttcggct": 10, "gcggcgagcg": 10, "gtatcagctc": 10, "actcaaaggc": 10, "ggtaatacgg": 10, "ttatccacag": 10, "121": [10, 12], "aatcagggga": 10, "taacgcagga": 10, "aagaacatgt": 10, "gagcaaaagg": 10, "ccagcaaaag": 10, "gccaggaacc": 10, "181": [10, 12], "gtaaaaaggc": 10, "cgcgttgctg": 10, "gcgtttttcc": 10, "ataggctccg": 10, "cccccctgac": 10, "gagcatcaca": 10, "241": [10, 12], "aaaatcgacg": 10, "ctcaagtcag": 10, "aggtggcgaa": 10, "acccgacagg": 10, "actataaaga": 10, "taccaggcgt": 10, "301": [10, 12], "ttccccctgg": 10, "aagctccctc": 10, "gtgcgctctc": 10, "ctgttccgac": 10, "cctgccgctt": 10, "accggatacc": 10, "361": [10, 12], "tgtccgcctt": 10, "tctcccttcg": 10, "ggaagcgtgg": 10, "cgctttctca": 10, "tagctcacgc": 10, "tgtaggtatc": 10, "421": [10, 12], "tcagttcggt": 10, "gtaggtcgtt": 10, "cgctccaagc": 10, "tgggctgtgt": 10, "gcacgaaccc": 10, "cccgttcagc": 10, "481": [10, 12], "ccgaccgctg": 10, "cgccttatcc": 10, "ggtaactatc": 10, "gtcttgagtc": 10, "caacccggta": 10, "agacacgact": 10, "541": [10, 12], "tatcgccact": 10, "ggcagcagcc": 10, "actggtaaca": 10, "ggattagcag": 10, "agcgaggtat": 10, "gtaggcggtg": 10, "601": [10, 12], "ctacagagtt": 10, "cttgaagtgg": 10, "tggcctaact": 10, "acggctacac": 10, "tagaagaaca": 10, "gtatttggta": 10, "661": [10, 12], "tctgcgctct": 10, "gctgaagcca": 10, "gttaccttcg": 10, "gaaaaagagt": 10, "tggtagctct": 10, "tgatccggca": 10, "721": [10, 12], "aacaaaccac": 10, "cgctggtagc": 10, "ggtggttttt": 10, "ttgtttgcaa": 10, "gcagcagatt": 10, "acgcgcagaa": 10, "781": [10, 12], "aaaaaggatc": 10, "tcaagaagat": 10, "cctttgatct": 10, "tttctacggg": 10, "gtctgacgct": 10, "cagtggaacg": 10, "841": [10, 12], "aaaactcacg": 10, "ttaagggatt": 10, "ttggtcatga": 10, "gattatcaaa": 10, "aaggatcttc": 10, "acctagatcc": 10, "901": [10, 12], "ttttaaatta": 10, "aaaatgaagt": 10, "tttaaatcaa": 10, "tctaaagtat": 10, "atatgagtaa": 10, "acttggtctg": 10, "961": [10, 12], "acagttacca": 10, "atgcttaatc": 10, "agtgaggcac": 10, "ctatctcagc": 10, "gatctgtcta": 10, "tttcgttcat": 10, "1021": [10, 12], "ccatagttgc": 10, "ctgactcccc": 10, "gtcgtgtaga": 10, "taactacgat": 10, "acgggagggc": 10, "ttaccatctg": 10, "1081": [10, 12], "gccccagtgc": 10, "tgcaatgata": 10, "ccgcgagacc": 10, "cacgctcacc": 10, "ggctccagat": 10, "ttatcagcaa": 10, "1141": [10, 12], "taaaccagcc": 10, "agccggaagg": 10, "gccgagcgca": 10, "gaagtggtcc": 10, "tgcaacttta": 10, "tccgcctcca": 10, "1201": [10, 12], "tccagtctat": 10, "taattgttgc": 10, "cgggaagcta": 10, "gagtaagtag": 10, "ttcgccagtt": 10, "aatagtttgc": 10, "1261": [10, 12], "gcaacgttgt": 10, "tgccattgct": 10, "acaggcatcg": 10, "tggtgtcacg": 10, "ctcgtcgttt": 10, "ggtatggctt": 10, "1321": [10, 12], "cattcagctc": 10, "cggttcccaa": 10, "cgatcaaggc": 10, "gagttacatg": 10, "atcccccatg": 10, "ttgtgcaaaa": 10, "1381": [10, 12], "aagcggttag": 10, "ctccttcggt": 10, "cctccgatcg": 10, "ttgtcagaag": 10, "taagttggcc": 10, "gcagtgttat": 10, "1441": [10, 12], "cactcatggt": 10, "tatggcagca": 10, "ctgcataatt": 10, "ctcttactgt": 10, "catgccatcc": 10, "gtaagatgct": 10, "1501": [10, 12], "tttctgtgac": 10, "tggtgagtac": 10, "tcaaccaagt": 10, "cattctgaga": 10, "atagtgtatg": 10, "cggcgaccga": 10, "1561": [10, 12], "gttgctcttg": 10, "cccggcgtca": 10, "atacgggata": 10, "ataccgcgcc": 10, "acatagcaga": 10, "actttaaaag": 10, "1621": [10, 12], "tgctcatcat": 10, "tggaaaacgt": 10, "tcttcggggc": 10, "gaaaactctc": 10, "aaggatctta": 10, "ccgctgttga": 10, "1681": [10, 12], "gatccagttc": 10, "gatgtaaccc": 10, "actcgtgcac": 10, "ccaactgatc": 10, "ttcagcatct": 10, "tttactttca": 10, "1741": [10, 12], "ccagcgtttc": 10, "tgggtgagca": 10, "aaaacaggaa": 10, "ggcaaaatgc": 10, "cgcaaaaaag": 10, "ggaataaggg": 10, "1801": [10, 12], "cgacacggaa": 10, "atgttgaata": 10, "ctcatactct": 10, "tcctttttca": 10, "atattattga": 10, "agcatttatc": 10, "1861": [10, 12], "agggttattg": 10, "tctcatgagc": 10, "ggatacatat": 10, "ttgaatgtat": 10, "ttagaaaaat": 10, "aaacaaatag": 10, "1921": [10, 12], "gggttccgcg": 10, "cacatttccc": 10, "cgaaaagtgc": 10, "cacctgacgt": 10, "ctaagaaacc": 10, "attattatca": 10, "1981": [10, 12], "tgacattaac": 10, "ctataaaaat": 10, "aggcgtatca": 10, "cgaggccctt": 10, "tcgtctcgcg": 10, "cgtttcggtg": 10, "2041": [10, 12], "atgacggtga": 10, "aaacctctga": 10, "cacatgcagc": 10, "tcccggagac": 10, "ggtcacagct": 10, "tgtctgtaag": 10, "2101": [10, 12], "cggatgccgg": 10, "gagcagacaa": 10, "gcccgtcagg": 10, "gcgcgtcagc": 10, "gggtgttggc": 10, "gggtgtcggg": 10, "2161": [10, 12], "gctggcttaa": 10, "ctatgcggca": 10, "tcagagcaga": 10, "ttgtactgag": 10, "agtgcaccat": 10, "atggacatat": 10, "2221": [10, 12], "tgtcgttaga": 10, "acgcggctac": 10, "aattaataca": 10, "taaccttatg": 10, "tatcatacac": 10, "atacgattta": 10, "2281": [10, 12], "ggtgacacta": 10, "tagaacgcgg": 10, "ccgccagctg": 10, "aagcttcgta": 10, "cgctgcaggt": 10, "cgacggatcc": 10, "2341": [10, 12], "ccgggttaat": 10, "taaggcgcgc": 10, "cagatctgtt": 10, "tagcttgcct": 10, "cgtccccgcc": 10, "gggtcacccg": 10, "2401": [10, 12], "gccagcgaca": 10, "tggaggccca": 10, "gaataccctc": 10, "cttgacagtc": 10, "ttgacgtgcg": 10, "cagctcaggg": 10, "2461": [10, 12], "gcatgatgtg": 10, "actgtcgccc": 10, "gtacatttag": 10, "cccatacatc": 10, "cccatgtata": 10, "atcatttgca": 10, "2521": [10, 12], "tccatacatt": 10, "ttgatggccg": 10, "cacggcgcga": 10, "agcaaaaatt": 10, "acggctcctc": 10, "gctgcagacc": 10, "2581": [10, 12], "tgcgagcagg": 10, "gaaacgctcc": 10, "cctcacagac": 10, "gcgttgaatt": 10, "gtccccacgc": 10, "cgcgcccctg": 10, "2641": [10, 12], "tagagaaata": 10, "taaaaggtta": 10, "ggatttgcca": 10, "ctgaggttct": 10, "tctttcatat": 10, "acttcctttt": 10, "2701": [10, 12], "aaaatcttgc": 10, "taggatacag": 10, "ttctcacatc": 10, "acatccgaac": 10, "ataaacaacc": 10, "atgggtaagg": 10, "2761": [10, 12], "aaaagactca": 10, "cgtttcgagg": 10, "ccgcgattaa": 10, "attccaacat": 10, "ggatgctgat": 10, "ttatatgggt": 10, "2821": [10, 12], "ataaatgggc": 10, "tcgcgataat": 10, "gtcgggcaat": 10, "caggtgcgac": 10, "aatctatcga": 10, "ttgtatggga": 10, "2881": [10, 12], "agcccgatgc": 10, "gccagagttg": 10, "tttctgaaac": 10, "atggcaaagg": 10, "tagcgttgcc": 10, "aatgatgtta": 10, "2941": [10, 12], "cagatgagat": 10, "ggtcagacta": 10, "aactggctga": 10, "cggaatttat": 10, "gcctcttccg": 10, "accatcaagc": 10, "3001": [10, 12], "attttatccg": 10, "tactcctgat": 10, "gatgcatggt": 10, "tactcaccac": 10, "tgcgatcccc": 10, "ggcaaaacag": 10, "3061": [10, 12], "cattccaggt": 10, "attagaagaa": 10, "tatcctgatt": 10, "caggtgaaaa": 10, "tattgttgat": 10, "gcgctggcag": 10, "3121": [10, 12], "tgttcctgcg": 10, "ccggttgcat": 10, "tcgattcctg": 10, "tttgtaattg": 10, "tccttttaac": 10, "agcgatcgcg": 10, "3181": [10, 12], "tatttcgtct": 10, "cgctcaggcg": 10, "caatcacgaa": 10, "tgaataacgg": 10, "tttggttgat": 10, "gcgagtgatt": 10, "3241": [10, 12], "ttgatgacga": 10, "gcgtaatggc": 10, "tggcctgttg": 10, "aacaagtctg": 10, "gaaagaaatg": 10, "cataagcttt": 10, "3301": [10, 12], "tgccattctc": 10, "accggattca": 10, "gtcgtcactc": 10, "atggtgattt": 10, "ctcacttgat": 10, "aaccttattt": 10, "3361": [10, 12], "ttgacgaggg": 10, "gaaattaata": 10, "ggttgtattg": 10, "atgttggacg": 10, "agtcggaatc": 10, "gcagaccgat": 10, "3421": [10, 12], "accaggatct": 10, "tgccatccta": 10, "tggaactgcc": 10, "tcggtgagtt": 10, "ttctccttca": 10, "ttacagaaac": 10, "3481": [10, 12], "ggctttttca": 10, "aaaatatggt": 10, "attgataatc": 10, "ctgatatgaa": 10, "taaattgcag": 10, "tttcatttga": 10, "3541": [10, 12], "tgctcgatga": 10, "gtttttctaa": 10, "tcagtactga": 10, "caataaaaag": 10, "attcttgttt": 10, "tcaagaactt": 10, "3601": [10, 12], "gtcatttgta": 10, "tagttttttt": 10, "atattgtagt": 10, "tgttctattt": 10, "taatcaaatg": 10, "ttagcgtgat": 10, "3661": [10, 12], "ttatattttt": 10, "tttcgcctcg": 10, "acatcatctg": 10, "cccagatgcg": 10, "aagttaagtg": 10, "cgcagaaagt": 10, "3721": [10, 12], "aatatcatgc": 10, "gtcaatcgta": 10, "tgtgaatgct": 10, "ggtcgctata": 10, "ctgctgtcga": 10, "ttcgatacta": 10, "3781": [10, 12], "acgccgccat": 10, "ccagtttaaa": 10, "cgagctcgaa": 10, "ttcatcgatg": 10, "atatcagatc": 10, "cactagtggc": 10, "3841": [10, 12], "ctatgcggcc": 10, "gcggatctgc": 10, "cggtctccct": 10, "atagtgagtc": 10, "gtattaattt": 10, "cgataagcca": 10, "3901": [10, 12], "ggttaacctg": 10, "cattaatgaa": 10, "tcggccaacg": 10, "cgcgggga": 10, "4538": 10, "26": [10, 13], "apr": 10, "972h": 10, "dblink": 10, "bioproject": 10, "prjna13836": 10, "biosampl": 10, "samea3138176": 10, "fission": 10, "taphrinomycotina": 10, "schizosaccharomycet": 10, "schizosaccharomycetal": 10, "schizosaccharomycetacea": 10, "lang": 10, "b": [10, 16], "mitochondri": 10, "highli": 10, "cox1": 10, "aspergillu": 10, "nidulan": 10, "embo": 10, "2129": 10, "2136": 10, "1984": 10, "6092057": 10, "ahn": 10, "bonen": 10, "cytochrom": 10, "184": 10, "353": 10, "366": 10, "1985": 10, "4046021": 10, "cedergren": 10, "grai": 10, "subunit": 10, "ribosom": 10, "comparison": [10, 16], "potenti": 10, "secondari": 10, "fungal": 10, "rrna": 10, "evolutionari": 10, "consider": 10, "eur": 10, "biochem": 10, "169": [10, 16], "527": 10, "537": 10, "2446871": 10, "trinkl": 10, "h": 10, "wolf": 10, "small": 10, "nucleic": 10, "acid": [10, 16], "re": 10, "6730": 10, "1989": 10, "2780299": 10, "wood": 10, "v": [10, 16], "gwilliam": 10, "rajandream": 10, "lyne": 10, "stewart": 10, "sgouro": 10, "peat": 10, "hayl": 10, "baker": 10, "basham": 10, "bowman": 10, "brook": 10, "brown": 10, "chillingworth": 10, "churcher": 10, "collin": 10, "connor": 10, "cronin": 10, "davi": 10, "feltwel": 10, "fraser": 10, "gentl": 10, "gobl": 10, "hamlin": 10, "harri": 10, "hidalgo": 10, "hodgson": 10, "holroyd": 10, "hornsbi": 10, "howarth": 10, "huckl": 10, "hunt": 10, "jagel": 10, "jame": 10, "jone": 10, "leather": 10, "mcdonald": 10, "mclean": 10, "moonei": 10, "moul": 10, "mungal": 10, "murphi": 10, "niblett": 10, "odel": 10, "oliv": 10, "neil": 10, "pearson": 10, "quail": 10, "rabbinowitsch": 10, "rutherford": 10, "rutter": 10, "saunder": 10, "seeger": 10, "sharp": 10, "skelton": 10, "simmond": 10, "steven": 10, "taylor": 10, "tivei": 10, "walsh": 10, "warren": 10, "whitehead": 10, "woodward": 10, "volckaert": 10, "aert": 10, "robben": 10, "grymonprez": 10, "weltjen": 10, "vanstreel": 10, "rieger": 10, "schafer": 10, "muller": 10, "auer": 10, "gabel": 10, "fuch": 10, "dusterhoft": 10, "fritzc": 10, "holzer": 10, "moestl": 10, "hilbert": 10, "borzym": 10, "langer": 10, "beck": 10, "lehrach": 10, "reinhardt": 10, "pohl": 10, "eger": 10, "zimmermann": 10, "wedler": 10, "wambutt": 10, "purnel": 10, "goffeau": 10, "cadieu": 10, "dreano": 10, "gloux": 10, "lelaur": 10, "mottier": 10, "galibert": 10, "av": 10, "xiang": 10, "z": [10, 16], "moor": 10, "hurst": 10, "luca": 10, "rochet": 10, "gaillardin": 10, "tallada": 10, "garzon": 10, "thode": 10, "daga": 10, "cruzado": 10, "jimenez": 10, "sanchez": 10, "del": 10, "rei": 10, "benito": 10, "dominguez": 10, "revuelta": 10, "moreno": 10, "armstrong": 10, "forsburg": 10, "cerutti": 10, "low": 10, "mccombi": 10, "paulsen": 10, "potashkin": 10, "shpakovski": 10, "usseri": 10, "barrel": 10, "nurs": 10, "natur": 10, "415": 10, "6874": 10, "871": 10, "880": 10, "2002": 10, "11859360": 10, "remark": 10, "erratum": 10, "2003": 10, "6918": 10, "cerrutti": 10, "hansen": 10, "mitochondria": 10, "11": [10, 16], "785": 10, "795": 10, "2005": 10, "15811919": 10, "consrtm": 10, "consortium": 10, "29": [10, 12, 13], "2007": [10, 16], "european": 10, "sanger": 10, "institut": 10, "wellcom": 10, "trust": 10, "campu": 10, "hinxton": 10, "cambridg": 10, "cb10": 10, "1sa": 10, "pombas": 10, "mar": [10, 16], "univers": [10, 12, 16], "hopkin": 10, "tenni": 10, "court": 10, "rd": 10, "unit": 10, "kingdom": 10, "On": 10, "2012": 10, "al672256": 10, "al009197": 10, "al009227": 10, "al021046": 10, "al021809": 10, "al021813": 10, "al021817": 10, "al031180": 10, "al034486": 10, "al034565": 10, "al034583": 10, "al035064": 10, "al035248": 10, "al035254": 10, "al035439": 10, "al096845": 10, "al109734": 10, "al109738": 10, "al109739": 10, "al109770": 10, "al109820": 10, "al109831": 10, "al109832": 10, "al109951": 10, "al109988": 10, "al110469": 10, "al110509": 10, "al117210": 10, "al117212": 10, "al117213": 10, "al117390": 10, "al121732": 10, "al121741": 10, "al121745": 10, "al121764": 10, "al121765": 10, "al121770": 10, "al122032": 10, "al132667": 10, "al132675": 10, "al132714": 10, "al132769": 10, "al132779": 10, "al132798": 10, "al132828": 10, "al132839": 10, "al132983": 10, "al132984": 10, "al133154": 10, "al133156": 10, "al133157": 10, "al133225": 10, "al133302": 10, "al133357": 10, "al133359": 10, "al133360": 10, "al133361": 10, "al133442": 10, "al133498": 10, "al133521": 10, "al133522": 10, "al135751": 10, "al136078": 10, "al136235": 10, "al136499": 10, "al136521": 10, "al136538": 10, "al137130": 10, "al138666": 10, "al138854": 10, "al139315": 10, "al157734": 10, "al157811": 10, "al157872": 10, "al157917": 10, "al157993": 10, "al157994": 10, "al158056": 10, "al159180": 10, "al159951": 10, "al162531": 10, "al162631": 10, "al163031": 10, "al163071": 10, "al163191": 10, "al163481": 10, "al163529": 10, "al353014": 10, "al353860": 10, "al355012": 10, "al355013": 10, "al355252": 10, "al355452": 10, "al355632": 10, "al355652": 10, "al355653": 10, "al356333": 10, "al356335": 10, "al357232": 10, "al358272": 10, "al360054": 10, "al360094": 10, "al390095": 10, "al390274": 10, "al390814": 10, "al391713": 10, "al391744": 10, "al391746": 10, "al391783": 10, "al441621": 10, "al441624": 10, "al512486": 10, "al512487": 10, "al512491": 10, "al512493": 10, "al512496": 10, "al512549": 10, "al512562": 10, "al583902": 10, "al590562": 10, "al590582": 10, "al590602": 10, "al590605": 10, "al590902": 10, "al590903": 10, "al691401": 10, "al691402": 10, "al691405": 10, "z49811": 10, "z50112": 10, "z50113": 10, "z50142": 10, "z50728": 10, "z54096": 10, "z54142": 10, "z54285": 10, "z54308": 10, "z54328": 10, "z54354": 10, "z54366": 10, "z56276": 10, "z64354": 10, "z66568": 10, "z67757": 10, "z67961": 10, "z67998": 10, "z67999": 10, "z68136": 10, "z68144": 10, "z68166": 10, "z68197": 10, "z68198": 10, "z68887": 10, "z69086": 10, "z69239": 10, "z69240": 10, "z69368": 10, "z69369": 10, "z69380": 10, "z69725": 10, "z69726": 10, "z69727": 10, "z69728": 10, "z69729": 10, "z69730": 10, "z69731": 10, "z69795": 10, "z69796": 10, "z69944": 10, "z70043": 10, "z70690": 10, "z70691": 10, "z70721": 10, "z73099": 10, "z73100": 10, "z81312": 10, "z81317": 10, "z94864": 10, "z95334": 10, "z95395": 10, "z95396": 10, "z97185": 10, "z97208": 10, "z97209": 10, "z97210": 10, "z98056": 10, "z98529": 10, "z98530": 10, "z98531": 10, "z98532": 10, "z98533": 10, "z98559": 10, "z98560": 10, "z98595": 10, "z98596": 10, "z98597": 10, "z98598": 10, "z98600": 10, "z98601": 10, "z98602": 10, "z98603": 10, "z98762": 10, "z98763": 10, "z98849": 10, "z98944": 10, "z98974": 10, "z98975": 10, "z98977": 10, "z98978": 10, "z98979": 10, "z98980": 10, "z98981": 10, "z99091": 10, "z99126": 10, "z99161": 10, "z99162": 10, "z99163": 10, "z99164": 10, "z99165": 10, "z99166": 10, "z99167": 10, "z99168": 10, "z99258": 10, "z99259": 10, "z99260": 10, "z99261": 10, "z99262": 10, "z99292": 10, "z99295": 10, "z99296": 10, "z99531": 10, "z99532": 10, "z99568": 10, "z99753": 10, "4896": 10, "676": 10, "locus_tag": 10, "spom_spapb1a10": 10, "393": 10, "cac21481": 10, "mmtrmelrpleigfskaltevapvtcqcecwdhnlcssqasemdl": 10, "iyqsqdthscaskqdavfqllsetkipvpnryrkishrlstlsnkktlksqldrflsss": 10, "kklhnddvnrgdycfllstpvecsastnshsydclwnfscnsfpeyssysasetssva": 10, "ysyysgpnpatpsssscnlvnansldiylninnlkksksvprlrgqfmepvehnhplsk": 10, "sleeqssfleqskdassnltacnrsgsslssnfyssrlskktslaslnksraslqhkim": 10, "slsrniirrvfhkpevhldpsasilnlssshgesnltngllcqnfklfqddwlmedcap": 10, "danftlytplqpwekrsvkpeirrprlnpnffrvfvleaqmrragklsantagraqlii": 10, "lpkpavtfstsplhvel": 10, "1972": 10, "spom_spncrna": 10, "2846": 10, "ncrna": 10, "ncrna_class": 10, "lncrna": 10, "394": 10, "1001": 10, "3538": 10, "1173": 10, "1174": 10, "1597": 10, "1645": 10, "3416": 10, "cac21482": 10, "mqtvmmddiqstdsiaekdnhsnnesnftwkafreqvekhfski": 10, "rlhqvlgtdgdnsslfelfttamnaqlhemeqcqkkleddcqqridsirflvsslkltd": 10, "dtsslkiespliqclnrlsmvegqymaqydqklstikemyhklesycnrlgspfvlpdf": 10, "ensflsdvsdafteslrgrineaekeidarlevinsfeeeilglwselgvepadvpqy": 10, "qlleshtnrpndvyvtqelidqlckqkevfsaekekrsdhlksiqsevsnlwnklqvsp": 10, "neqsqfgdssninqenislweteleklhqlkkehlpifledcrqqilqlwdslfyseeq": 10, "rksftpmyediiteqvltahenyikqleaevsanksflslinryasliegkkeleassn": 10, "dasrltqrgrrdpglllreekirkrlsrelpkvqsllipeitaweerngrtflfydepl": 10, "lkicqeatqpkslyrsasaaanrpktatttdsvnrtpsqrgrvavpstpsvrsasramt": 10, "sprtplprvkntqnpsrsisaeppsatstanrrhptanridinarlnsasrsrsanmir": 10, "qgangsdsnmssspvsgnsntpfnkfpnsvsrnthfesksphpnysrtphetyskassk": 10, "nvplsppkqrvvnehalnimseklqrtnlkeqtpemdienssqnlpfspmkispirasp": 10, "vktipsspspttnifsaplnnitnctpmedewgeegf": 10, "3417": 10, "3510": 10, "ypt71": 10, "10c": 10, "3690": 10, "3691": 10, "4137": 10, "4192": 10, "4290": 10, "gtpase": 10, "cac21483": 10, "msaqkrvflkvvilgdsgvgktclmnqfvnqkfsreykatigadf": 10, "ltkdvvvddklvtlqlwdtagqerfqslgmafyrgadccvivynvnnsksfdsvenwrq": 10, "eflyqtsqdecafpfiivgnqidkdaskravslhraldyckskhgsnmihfeasak": 10, "nvtdlfetvsrlalenessrddfvndfseplllskplnntsscnc": 10, "4049": 10, "2847": 10, "atcatcagac": 10, "gtgtatttca": 10, "caagccagaa": 10, "gtgcatttgg": 10, "atccaagtgc": 10, "ctccatttta": 10, "aatctctcat": 10, "cttcgcatgg": 10, "cgaaagcaac": 10, "ctgacaaatg": 10, "gtttgctttg": 10, "tcaaaatttc": 10, "aagctttttc": 10, "aggatgattg": 10, "gttgatggag": 10, "gattgtgcgc": 10, "cagatgccaa": 10, "tttcactttg": 10, "tacaccccgc": 10, "ttcaaccctg": 10, "ggaaaagcga": 10, "agtgtgaaac": 10, "ctgaaatcag": 10, "acgtcctcga": 10, "ttaaatccta": 10, "attttttccg": 10, "agtatttgtt": 10, "ttagaagctc": 10, "aaatgcgacg": 10, "agctggaaag": 10, "ctatcagcaa": 10, "acactgctgg": 10, "ccgagcccag": 10, "ttaatttacc": 10, "tcccaaagcc": 10, "tgccgttacc": 10, "ttctccacta": 10, "gccctttgca": 10, "tgttgaattg": 10, "taaaaattta": 10, "acgcatgact": 10, "tatatacatt": 10, "tgcattcttc": 10, "caagctggtt": 10, "atatttattt": 10, "tcattttttt": 10, "ctcacccaat": 10, "acttttttat": 10, "ccctactgtc": 10, "tttatggaca": 10, "atcgactcac": 10, "aattgtttct": 10, "ttttgttgta": 10, "tatgattttt": 10, "tttttaaagg": 10, "aaatgggttt": 10, "cgcgatactg": 10, "ggttgaatcc": 10, "caattgcggt": 10, "taatattaca": 10, "taaaataatt": 10, "ctcccatagt": 10, "cctagatcct": 10, "gtctttgaat": 10, "atgagcaaat": 10, "aaaagaattg": 10, "aacaaatcat": 10, "gaatgctttt": 10, "ctctcttaga": 10, "tgatattttg": 10, "tatgcataag": 10, "tctaattata": 10, "ttgattacga": 10, "taagacttaa": 10, "aaagtaagcc": 10, "tttgtatcct": 10, "tttaagcagt": 10, "atttgaattt": 10, "tcttgtatca": 10, "tattttaggt": 10, "agagcaaaag": 10, "ataccagttt": 10, "gtagaacttt": 10, "atgtgcttcc": 10, "ttacattggt": 10, "atatttcagg": 10, "cacataaata": 10, "ttcttcaact": 10, "tacaattcta": 10, "agtattttgt": 10, "ttatactaaa": 10, "aggagctgaa": 10, "taacgtttat": 10, "acagtgctga": 10, "cattgaaatc": 10, "tatttgcttt": 10, "ctttggaata": 10, "taagcgcatg": 10, "ctgagttact": 10, "ttcgcaggcc": 10, "aagccatatc": 10, "caaccaccat": 10, "ttttgtgcca": 10, "agcttttatg": 10, "caaggttaat": 10, "tccttgtact": 10, "gcttgttatg": 10, "ttataatata": 10, "tcaacatctt": 10, "aacagttttc": 10, "atatcttcct": 10, "ttatattcta": 10, "ttaattgaat": 10, "ttcaaacatc": 10, "gttttattga": 10, "gctcatttac": 10, "atcaaccggt": 10, "tcaatgcaaa": 10, "cagtaatgat": 10, "ggatgacatt": 10, "caaagcactg": 10, "attctattgc": 10, "tgaaaaagat": 10, "aatcactcta": 10, "ataatgaatc": 10, "taactttact": 10, "tggaaagcgt": 10, "ttcgtgaaca": 10, "agtggaaaag": 10, "catttttcta": 10, "aaattgaaag": 10, "gcttcaccaa": 10, "gtccttggaa": 10, "cagatggaga": 10, "caattcatca": 10, "ttatttgagt": 10, "tgtttacaac": 10, "ggcaatgaat": 10, "gcccagcttc": 10, "atgaaatgga": 10, "acagtgccag": 10, "aaaaaacttg": 10, "aagatgactg": 10, "tcagcaaaga": 10, "attgattcaa": 10, "tcagattttt": 10, "ggtttcctca": 10, "ttaaagttaa": 10, "cggatgatac": 10, "ttctagtctc": 10, "aaaattgagt": 10, "ctcctttaat": 10, "tcagtgtttg": 10, "aatcgtttgt": 10, "caatggtaga": 10, "aggacaatat": 10, "atggcacagt": 10, "atgatcaaaa": 10, "gttaagtacg": 10, "attaaaggta": 10, "tgtaatcgtc": 10, "tttaatttag": 10, "acttgtgttt": 10, "taactgatgt": 10, "atagaaatgt": 10, "atcacaaatt": 10, "ggagtcatat": 10, "tgtaaccgct": 10, "taggaagtcc": 10, "gttcgtttta": 10, "cctgattttg": 10, "agaattcatt": 10, "tttatctgat": 10, "gtatccgatg": 10, "cttttactga": 10, "atctttgaga": 10, "ggacgcatca": 10, "acgaagccga": 10, "aaaggagatt": 10, "gatgcgagat": 10, "tagaggttat": 10, "taattccttt": 10, "gaagaagaaa": 10, "ttttgggttt": 10, "gtggtctgaa": 10, "ctcggtgttg": 10, "agcccgctga": 10, "tgttccacaa": 10, "tacgaacaat": 10, "tgcttgaatc": 10, "ccatactaat": 10, "cgaccaaatg": 10, "atgtttatgt": 10, "tactcaagaa": 10, "cttatcgacc": 10, "aactttgcaa": 10, "gcaaaaagaa": 10, "gttttttccg": 10, "ctgaaaaaga": 10, "aaagagaagt": 10, "gatcatttaa": 10, "aaagtataca": 10, "atcagaagtt": 10, "agcaacttgt": 10, "ggaataagct": 10, "tcaagtttct": 10, "cccaatgaac": 10, "aaagtcaatt": 10, "tggcgattca": 10, "tcaaacatta": 10, "atcaagaaaa": 10, "tatttcatta": 10, "tgggaaactg": 10, "aacttgaaaa": 10, "acttcatcag": 10, "ttaaaaaagg": 10, "agcatttacc": 10, "cattttttta": 10, "gaagactgtc": 10, "gtcaacaaat": 10, "tcttcagctt": 10, "tgggattctc": 10, "tgttttattc": 10, "agaagaacaa": 10, "agaaagtcct": 10, "ttacacctat": 10, "gtatgaagac": 10, "attattacag": 10, "agcaggttct": 10, "tacggcccat": 10, "gaaaactata": 10, "taaagcaact": 10, "agaggccgaa": 10, "gtttctgcta": 10, "ataagtcctt": 10, "tttaagctta": 10, "attaatcgct": 10, "atgcctcttt": 10, "aatagaagga": 10, "aagaaagagc": 10, "ttgaagctag": 10, "ttctaatgat": 10, "gcctctcgtc": 10, "taacacaacg": 10, "gggacgccgg": 10, "gacccaggtt": 10, "tacttctacg": 10, "tgaagagaaa": 10, "atccgtaagc": 10, "gactttctag": 10, "agaacttcct": 10, "aaggttcagt": 10, "cgctgcttat": 10, "accagagatt": 10, "acagcatggg": 10, "aagaaagaaa": 10, "tggaaggacg": 10, "ttcctttttt": 10, "atgatgaacc": 10, "acttctcaag": 10, "atttgccaag": 10, "aggccactca": 10, "accaaaatca": 10, "ttatatagaa": 10, "gtgcaagtgc": 10, "tgccgcaaac": 10, "cgcccgaaaa": 10, "cagcaactac": 10, "aacggactct": 10, "gttaatagaa": 10, "caccttctca": 10, "acgagggcgt": 10, "gtagctgtac": 10, "cttcaacacc": 10, "aagtgttagg": 10, "tccgcttctc": 10, "gagctatgac": 10, "gagtccaagg": 10, "acaccgcttc": 10, "ctagagtaaa": 10, "aaacactcaa": 10, "aatccaagtc": 10, "gttccattag": 10, "tgcagaaccg": 10, "ccatcagcaa": 10, "ccagtaccgc": 10, "caatagaaga": 10, "caccccactg": 10, "ctaatcgaat": 10, "tgatataaac": 10, "gctagattaa": 10, "acagtgctag": 10, "tcggtctcga": 10, "agcgcgaaca": 10, "tgataagaca": 10, "aggggcaaat": 10, "ggtagtgaca": 10, "gcaatatgtc": 10, "ttcttcaccc": 10, "gtttctggaa": 10, "attccaatac": 10, "cccttttaac": 10, "aagtttccaa": 10, "attctgtatc": 10, "tcgcaataca": 10, "cattttgaat": 10, "ccaagtcacc": 10, "gcacccaaat": 10, "tactctcgaa": 10, "ctcctcatga": 10, "aacgtattca": 10, "aaggcttcat": 10, "ctaagaacgt": 10, "cccattaagt": 10, "cctccaaagc": 10, "agcgtgtagt": 10, "taatgaacac": 10, "gctttaaata": 10, "ttatgtcgga": 10, "aaaattgcaa": 10, "agaactaatc": 10, "tgaaagaaca": 10, "aacacccgag": 10, "atggacattg": 10, "aaaacagctc": 10, "gcagaacctt": 10, "cctttttctc": 10, "ctatgaagat": 10, "atcccccata": 10, "agagcatcac": 10, "ccgtaaagac": 10, "aattccatca": 10, "tcaccgtccc": 10, "ccactaccaa": 10, "cattttttct": 10, "gctccactca": 10, "acaatattac": 10, "aaattgtaca": 10, "ccgatggagg": 10, "atgaatgggg": 10, "agaagaaggc": 10, "ttttaagctt": 10, "cttatttacc": 10, "taatcgatca": 10, "aatttaaata": 10, "tacatatttt": 10, "tgcatatgaa": 10, "tacagcatat": 10, "agataattca": 10, "taaaagttta": 10, "ttaactgagg": 10, "tcataattaa": 10, "aagactattt": 10, "acacctaaaa": 10, "aaaaacgtgt": 10, "atcaatagag": 10, "ggaaaagaga": 10, "agaattaaga": 10, "acagaaagta": 10, "accatagttt": 10, "tgttaaaata": 10, "gcaatgtaaa": 10, "aaaatattat": 10, "gaaaagaaaa": 10, "cgtatagcac": 10, "attttgaaat": 10, "gtaaaagaat": 10, "ctgagagagc": 10, "gtgtgaatat": 10, "ctagcaatta": 10, "caagaagatg": 10, "tattattcaa": 10, "aggctttgaa": 10, "agaagcaaag": 10, "gttcagagaa": 10, "gtcattaaca": 10, "aagtcatctc": 10, "tcgagctttc": 10, "attttctaaa": 10, "gctaaacgac": 10, "tgactgtttc": 10, "gaaaaggtca": 10, "gtaacgtttg": 10, "tattttcttt": 10, "tgcactagct": 10, "tcaaaatgaa": 10, "tcatatttga": 10, "tccatgtttg": 10, "gatttgcaat": 10, "agtcaagagc": 10, "tcgatgaaga": 10, "gatacggctc": 10, "gtttagacgc": 10, "gtctttgtcg": 10, "atttgatttc": 10, "caacgataat": 10, "3961": [10, 12], "gaaagggaat": 10, "gcacattcat": 10, "cttgtgaagt": 10, "ttgatataaa": 10, "aattcttgcc": 10, "tccagttttc": 10, "4021": [10, 12], "tactgagtca": 10, "aaagacttcg": 10, "agttattcac": 10, "attataaaca": 10, "attacacaac": 10, "aatcggcccc": 10, "4081": [10, 12], "tctgtaaaaa": 10, "gccattccca": 10, "ggctttgaaa": 10, "tcgttcttga": 10, "ccagcagtat": 10, "cccaaagctg": 10, "4141": [10, 12], "tttataatta": 10, "gcaaacgaat": 10, "ttagatgggc": 10, "ggaacttata": 10, "ttggaactta": 10, "cctgtaatgt": 10, "4201": [10, 12], "gaccaatttg": 10, "tcgtcaacca": 10, "caacgtcctt": 10, "ggttaaaaaa": 10, "tcagcaccga": 10, "tggtagcttt": 10, "4261": [10, 12], "atattcgcga": 10, "ctaaactttt": 10, "gattgacgaa": 10, "ctaaaatgac": 10, "gatgttaaca": 10, "aattgccaaa": 10, "4321": [10, 12], "gcaatactca": 10, "tagagaagct": 10, "gatgtaaaga": 10, "tcgttaacca": 10, "tatttgagct": 10, "agtatttaat": 10, "4381": [10, 12], "aacaaagtga": 10, "ataaatttta": 10, "aaagcaatca": 10, "ccttgtagcg": 10, "acaaataaca": 10, "acttatcgac": 10, "4441": [10, 12], "ataaaatcaa": 10, "tgggaaattg": 10, "cagtattgga": 10, "ttttacagct": 10, "caatacaaaa": 10, "accaaaaaga": 10, "4501": [10, 12], "aaaatatact": 10, "gaacgtataa": 10, "aatttaacgc": 10, "ttcaattg": 10, "type": [10, 12, 14, 15, 16], "min": [10, 15], "max": [10, 16], "rightmost": 10, "simpleloc": [10, 16], "target_tm": [10, 13, 15, 16], "55": [10, 13, 15, 16], "fwd_align": 10, "rvs_align": 10, "fwd_primer_ase1": 10, "accatgtcgac": 10, "ad": [10, 12, 13, 16], "rvs_primer_ase1": 10, "ggcgcgccat": 10, "accatgtcgacatgcaaacagtaatgatgga": 10, "57": [10, 13, 16], "24061148156318": 10, "ggcgcgccattaaaagccttcttctccc": 10, "56": 10, "64459495003314": 10, "pcr_product": [10, 13, 15], "2263bp_pcr_prod": 10, "2263": 10, "pcr_product_description_descript": [10, 13], "2263bp": 10, "424": 10, "472": 10, "2243": 10, "pcr_condit": [10, 13], "apeinfo_fwdcolor": [10, 13], "baffa3": [10, 13], "apeinfo_revcolor": [10, 13], "ffbaba": [10, 13], "2225": 10, "accatgtcga": 10, "catgcaaaca": 10, "gtaatgatgg": 10, "atgacattca": 10, "aagcactgat": 10, "tctattgctg": 10, "aaaaagataa": 10, "tcactctaat": 10, "aatgaatcta": 10, "actttacttg": 10, "gaaagcgttt": 10, "cgtgaacaag": 10, "tggaaaagca": 10, "tttttctaaa": 10, "attgaaaggc": 10, "ttcaccaagt": 10, "ccttggaaca": 10, "gatggagaca": 10, "attcatcatt": 10, "atttgagttg": 10, "tttacaacgg": 10, "caatgaatgc": 10, "ccagcttcat": 10, "gaaatggaac": 10, "agtgccagaa": 10, "aaaacttgaa": 10, "gatgactgtc": 10, "agcaaagaat": 10, "tgattcaatc": 10, "agatttttgg": 10, "tttcctcatt": 10, "aaagttaacg": 10, "gatgatactt": 10, "ctagtctcaa": 10, "aattgagtct": 10, "cctttaattc": 10, "agtgtttgaa": 10, "tcgtttgtca": 10, "atggtagaag": 10, "gacaatatat": 10, "ggcacagtat": 10, "gatcaaaagt": 10, "taagtacgat": 10, "taaaggtatg": 10, "taatcgtctt": 10, "taatttagac": 10, "ttgtgtttta": 10, "actgatgtat": 10, "agaaatgtat": 10, "cacaaattgg": 10, "agtcatattg": 10, "taaccgctta": 10, "ggaagtccgt": 10, "tcgttttacc": 10, "tgattttgag": 10, "aattcatttt": 10, "tatctgatgt": 10, "atccgatgct": 10, "tttactgaat": 10, "ctttgagagg": 10, "acgcatcaac": 10, "gaagccgaaa": 10, "aggagattga": 10, "tgcgagatta": 10, "gaggttatta": 10, "attcctttga": 10, "agaagaaatt": 10, "ttgggtttgt": 10, "ggtctgaact": 10, "cggtgttgag": 10, "cccgctgatg": 10, "ttccacaata": 10, "cgaacaattg": 10, "cttgaatccc": 10, "atactaatcg": 10, "accaaatgat": 10, "gtttatgtta": 10, "ctcaagaact": 10, "tatcgaccaa": 10, "ctttgcaagc": 10, "aaaaagaagt": 10, "tttttccgct": 10, "gaaaaagaaa": 10, "agagaagtga": 10, "tcatttaaaa": 10, "agtatacaat": 10, "cagaagttag": 10, "caacttgtgg": 10, "aataagcttc": 10, "aagtttctcc": 10, "caatgaacaa": 10, "agtcaatttg": 10, "gcgattcatc": 10, "aaacattaat": 10, "caagaaaata": 10, "tttcattatg": 10, "ggaaactgaa": 10, "cttgaaaaac": 10, "ttcatcagtt": 10, "aaaaaaggag": 10, "catttaccca": 10, "tttttttaga": 10, "agactgtcgt": 10, "caacaaattc": 10, "ttcagctttg": 10, "ggattctctg": 10, "ttttattcag": 10, "aagaacaaag": 10, "aaagtccttt": 10, "acacctatgt": 10, "atgaagacat": 10, "tattacagag": 10, "caggttctta": 10, "cggcccatga": 10, "aaactatata": 10, "aagcaactag": 10, "aggccgaagt": 10, "ttctgctaat": 10, "aagtcctttt": 10, "taagcttaat": 10, "taatcgctat": 10, "gcctctttaa": 10, "tagaaggaaa": 10, "gaaagagctt": 10, "gaagctagtt": 10, "ctaatgatgc": 10, "ctctcgtcta": 10, "acacaacggg": 10, "gacgccggga": 10, "cccaggttta": 10, "cttctacgtg": 10, "aagagaaaat": 10, "ccgtaagcga": 10, "ctttctagag": 10, "aacttcctaa": 10, "ggttcagtcg": 10, "ctgcttatac": 10, "cagagattac": 10, "agcatgggaa": 10, "gaaggacgtt": 10, "ccttttttat": 10, "gatgaaccac": 10, "ttctcaagat": 10, "ttgccaagag": 10, "gccactcaac": 10, "caaaatcatt": 10, "atatagaagt": 10, "gcaagtgctg": 10, "ccgcaaaccg": 10, "cccgaaaaca": 10, "gcaactacaa": 10, "cggactctgt": 10, "taatagaaca": 10, "ccttctcaac": 10, "gagggcgtgt": 10, "agctgtacct": 10, "tcaacaccaa": 10, "gtgttaggtc": 10, "cgcttctcga": 10, "gctatgacga": 10, "gtccaaggac": 10, "accgcttcct": 10, "agagtaaaaa": 10, "acactcaaaa": 10, "tccaagtcgt": 10, "tccattagtg": 10, "cagaaccgcc": 10, "atcagcaacc": 10, "agtaccgcca": 10, "atagaagaca": 10, "ccccactgct": 10, "aatcgaattg": 10, "atataaacgc": 10, "tagattaaac": 10, "agtgctagtc": 10, "ggtctcgaag": 10, "cgcgaacatg": 10, "ataagacaag": 10, "gggcaaatgg": 10, "tagtgacagc": 10, "aatatgtctt": 10, "cttcacccgt": 10, "ttctggaaat": 10, "tccaataccc": 10, "cttttaacaa": 10, "gtttccaaat": 10, "tctgtatctc": 10, "gcaatacaca": 10, "ttttgaatcc": 10, "aagtcaccgc": 10, "acccaaatta": 10, "ctctcgaact": 10, "cctcatgaaa": 10, "cgtattcaaa": 10, "ggcttcatct": 10, "aagaacgtcc": 10, "cattaagtcc": 10, "tccaaagcag": 10, "cgtgtagtta": 10, "atgaacacgc": 10, "tttaaatatt": 10, "atgtcggaaa": 10, "aattgcaaag": 10, "aactaatctg": 10, "aaagaacaaa": 10, "cacccgagat": 10, "ggacattgaa": 10, "aacagctcgc": 10, "agaaccttcc": 10, "tttttctcct": 10, "atgaagatat": [10, 13], "cccccataag": 10, "agcatcaccc": 10, "gtaaagacaa": 10, "ttccatcatc": 10, "accgtccccc": 10, "actaccaaca": 10, "ttttttctgc": 10, "tccactcaac": 10, "aatattacaa": 10, "attgtacacc": 10, "gatggaggat": 10, "gaatggggag": 10, "aagaaggctt": 10, "ttaatggcgc": 10, "gcc": 10, "plasmid_digest": 10, "gene_digest": 10, "30": [10, 16], "3916": 10, "2255": 10, "circularis": [10, 14], "synthetic_vector": 10, "6163": 10, "1408": 10, "395": 10, "396": 10, "1205": 10, "463": 10, "482": 10, "1211": 10, "1512": 10, "1531": 10, "1513": 10, "1618": 10, "1635": 10, "1789": 10, "2377": 10, "1869": 10, "1888": 10, "2548": 10, "3408": 10, "3171": 10, "3190": 10, "3409": 10, "3513": 10, "3581": 10, "3599": 10, "3637": 10, "3659": 10, "3759": 10, "3778": 10, "3859": 10, "3877": 10, "3876": 10, "6131": 10, "6149": 10, "cgcgccagat": 10, "ctgtttagct": 10, "tgcctcgtcc": 10, "ccgccgggtc": 10, "acccggccag": 10, "cgacatggag": 10, "gcccagaata": 10, "ccctccttga": 10, "cagtcttgac": 10, "gtgcgcagct": 10, "caggggcatg": 10, "atgtgactgt": 10, "cgcccgtaca": 10, "tttagcccat": 10, "acatccccat": 10, "gtataatcat": 10, "ttgcatccat": 10, "acattttgat": 10, "ggccgcacgg": 10, "cgcgaagcaa": 10, "aaattacggc": 10, "tcctcgctgc": 10, "agacctgcga": 10, "gcagggaaac": 10, "gctcccctca": 10, "cagacgcgtt": 10, "gaattgtccc": 10, "cacgccgcgc": 10, "ccctgtagag": 10, "aaatataaaa": 10, "ggttaggatt": 10, "tgccactgag": 10, "gttcttcttt": 10, "catatacttc": 10, "cttttaaaat": 10, "cttgctagga": 10, "tacagttctc": 10, "acatcacatc": 10, "cgaacataaa": 10, "caaccatggg": 10, "taaggaaaag": 10, "actcacgttt": 10, "cgaggccgcg": 10, "attaaattcc": 10, "aacatggatg": 10, "ctgatttata": 10, "tgggtataaa": 10, "tgggctcgcg": 10, "ataatgtcgg": 10, "gcaatcaggt": 10, "gcgacaatct": 10, "atcgattgta": 10, "tgggaagccc": 10, "gatgcgccag": 10, "agttgtttct": 10, "gaaacatggc": 10, "aaaggtagcg": 10, "ttgccaatga": 10, "tgttacagat": 10, "gagatggtca": 10, "gactaaactg": 10, "gctgacggaa": 10, "tttatgcctc": 10, "ttccgaccat": 10, "caagcatttt": 10, "atccgtactc": 10, "ctgatgatgc": 10, "atggttactc": 10, "accactgcga": 10, "tccccggcaa": 10, "aacagcattc": 10, "caggtattag": 10, "aagaatatcc": 10, "tgattcaggt": 10, "gaaaatattg": 10, "ttgatgcgct": 10, "ggcagtgttc": 10, "ctgcgccggt": 10, "tgcattcgat": 10, "tcctgtttgt": 10, "aattgtcctt": 10, "ttaacagcga": 10, "tcgcgtattt": 10, "cgtctcgctc": 10, "aggcgcaatc": 10, "acgaatgaat": 10, "aacggtttgg": 10, "ttgatgcgag": 10, "tgattttgat": 10, "gacgagcgta": 10, "atggctggcc": 10, "tgttgaacaa": 10, "gtctggaaag": 10, "aaatgcataa": 10, "gcttttgcca": 10, "ttctcaccgg": 10, "attcagtcgt": 10, "gatttctcac": 10, "ttgataacct": 10, "tatttttgac": 10, "gaggggaaat": 10, "taataggttg": 10, "tattgatgtt": 10, "ggacgagtcg": 10, "gaatcgcaga": 10, "ccgataccag": 10, "gatcttgcca": 10, "tcctatggaa": 10, "ctgcctcggt": 10, "gagttttctc": 10, "cttcattaca": 10, "gaaacggctt": 10, "tttcaaaaat": 10, "atggtattga": 10, "taatcctgat": 10, "atgaataaat": 10, "tgcagtttca": 10, "tttgatgctc": 10, "gatgagtttt": 10, "tctaatcagt": 10, "actgacaata": 10, "aaaagattct": 10, "tgttttcaag": 10, "aacttgtcat": 10, "ttgtatagtt": 10, "tttttatatt": 10, "gtagttgttc": 10, "tattttaatc": 10, "aaatgttagc": 10, "gtgatttata": 10, "ttttttttcg": 10, "cctcgacatc": 10, "atctgcccag": 10, "atgcgaagtt": 10, "aagtgcgcag": 10, "aaagtaatat": 10, "catgcgtcaa": 10, "tcgtatgtga": 10, "atgctggtcg": 10, "ctatactgct": 10, "gtcgattcga": 10, "tactaacgcc": 10, "gccatccagt": 10, "ttaaacgagc": 10, "tcgaattcat": 10, "cgatgatatc": 10, "agatccacta": 10, "gtggcctatg": 10, "cggccgcgga": 10, "tctgccggtc": 10, "tccctatagt": 10, "gagtcgtatt": 10, "aatttcgata": 10, "agccaggtta": 10, "acctgcatta": 10, "atgaatcggc": 10, "caacgcgcgg": 10, "ggagaggcgg": 10, "tttgcgtatt": 10, "gggcgctctt": 10, "ccgcttcctc": 10, "gctcactgac": 10, "tcgctgcgct": 10, "cggtcgttcg": 10, "gctgcggcga": 10, "gcggtatcag": 10, "ctcactcaaa": 10, "ggcggtaata": 10, "cggttatcca": 10, "cagaatcagg": 10, "ggataacgca": 10, "ggaaagaaca": 10, "tgtgagcaaa": 10, "aggccagcaa": 10, "aaggccagga": 10, "accgtaaaaa": 10, "ggccgcgttg": 10, "ctggcgtttt": 10, "tccataggct": 10, "ccgcccccct": 10, "gacgagcatc": 10, "acaaaaatcg": 10, "acgctcaagt": 10, "cagaggtggc": 10, "gaaacccgac": 10, "aggactataa": 10, "agataccagg": 10, "cgtttccccc": 10, "tggaagctcc": 10, "ctcgtgcgct": 10, "ctcctgttcc": 10, "gaccctgccg": 10, "cttaccggat": 10, "acctgtccgc": 10, "ctttctccct": 10, "tcgggaagcg": 10, "tggcgctttc": 10, "tcatagctca": 10, "cgctgtaggt": 10, "atctcagttc": 10, "ggtgtaggtc": 10, "gttcgctcca": 10, "agctgggctg": 10, "tgtgcacgaa": 10, "ccccccgttc": 10, "agcccgaccg": 10, "ctgcgcctta": 10, "tccggtaact": 10, "atcgtcttga": 10, "gtccaacccg": 10, "gtaagacacg": 10, "acttatcgcc": 10, "actggcagca": 10, "gccactggta": 10, "acaggattag": 10, "cagagcgagg": 10, "tatgtaggcg": 10, "gtgctacaga": 10, "gttcttgaag": 10, "tggtggccta": 10, "actacggcta": 10, "cactagaaga": 10, "acagtatttg": 10, "gtatctgcgc": 10, "tctgctgaag": 10, "ccagttacct": 10, "tcggaaaaag": 10, "agttggtagc": 10, "tcttgatccg": 10, "gcaaacaaac": 10, "caccgctggt": 10, "agcggtggtt": 10, "tttttgtttg": 10, "caagcagcag": 10, "attacgcgca": 10, "gaaaaaaagg": 10, "atctcaagaa": 10, "gatcctttga": 10, "tcttttctac": 10, "ggggtctgac": 10, "gctcagtgga": 10, "acgaaaactc": 10, "acgttaaggg": 10, "attttggtca": 10, "tgagattatc": 10, "ttcacctaga": 10, "tccttttaaa": 10, "ttaaaaatga": 10, "agttttaaat": 10, "caatctaaag": 10, "tatatatgag": 10, "taaacttggt": 10, "ctgacagtta": 10, "ccaatgctta": 10, "atcagtgagg": 10, "cacctatctc": 10, "agcgatctgt": 10, "ctatttcgtt": 10, "catccatagt": 10, "tgcctgactc": 10, "cccgtcgtgt": 10, "agataactac": 10, "gatacgggag": 10, "ggcttaccat": 10, "ctggccccag": 10, "tgctgcaatg": 10, "ataccgcgag": 10, "acccacgctc": 10, "accggctcca": 10, "gatttatcag": 10, "caataaacca": 10, "gccagccgga": 10, "agggccgagc": 10, "gcagaagtgg": 10, "tcctgcaact": 10, "ttatccgcct": 10, "ccatccagtc": 10, "tattaattgt": 10, "tgccgggaag": 10, "ctagagtaag": 10, "tagttcgcca": 10, "gttaatagtt": 10, "tgcgcaacgt": 10, "tgttgccatt": 10, "gctacaggca": 10, "tcgtggtgtc": 10, "acgctcgtcg": 10, "tttggtatgg": 10, "cttcattcag": 10, "ctccggttcc": 10, "caacgatcaa": 10, "ggcgagttac": 10, "atgatccccc": 10, "atgttgtgca": 10, "aaaaagcggt": 10, "tagctccttc": 10, "ggtcctccga": 10, "tcgttgtcag": 10, "aagtaagttg": 10, "gccgcagtgt": 10, "tatcactcat": 10, "ggttatggca": 10, "gcactgcata": 10, "attctcttac": 10, "tgtcatgcca": 10, "tccgtaagat": 10, "gcttttctgt": 10, "gactggtgag": 10, "tactcaacca": 10, "agtcattctg": 10, "agaatagtgt": 10, "atgcggcgac": 10, "cgagttgctc": 10, "ttgcccggcg": 10, "tcaatacggg": 10, "ataataccgc": 10, "gccacatagc": 10, "agaactttaa": 10, "aagtgctcat": 10, "cattggaaaa": 10, "cgttcttcgg": 10, "ggcgaaaact": 10, "ctcaaggatc": 10, "ttaccgctgt": 10, "tgagatccag": 10, "ttcgatgtaa": 10, "cccactcgtg": 10, "cacccaactg": 10, "atcttcagca": 10, "tcttttactt": 10, "tcaccagcgt": 10, "ttctgggtga": 10, "gcaaaaacag": 10, "gaaggcaaaa": 10, "tgccgcaaaa": 10, "aagggaataa": 10, "gggcgacacg": 10, "gaaatgttga": 10, "atactcatac": 10, "tcttcctttt": 10, "tcaatattat": 10, "tgaagcattt": 10, "atcagggtta": 10, "ttgtctcatg": 10, "agcggataca": 10, "tatttgaatg": 10, "tatttagaaa": 10, "aataaacaaa": 10, "taggggttcc": 10, "gcgcacattt": 10, "ccccgaaaag": 10, "tgccacctga": 10, "cgtctaagaa": 10, "accattatta": 10, "tcatgacatt": 10, "aacctataaa": 10, "aataggcgta": 10, "tcacgaggcc": 10, "ctttcgtctc": 10, "gcgcgtttcg": 10, "gtgatgacgg": 10, "tgaaaacctc": 10, "tgacacatgc": 10, "agctcccgga": 10, "gacggtcaca": 10, "gcttgtctgt": 10, "aagcggatgc": 10, "cgggagcaga": 10, "caagcccgtc": 10, "agggcgcgtc": 10, "agcgggtgtt": 10, "ggcgggtgtc": 10, "ggggctggct": 10, "taactatgcg": 10, "gcatcagagc": 10, "agattgtact": 10, "gagagtgcac": 10, "catatggaca": 10, "tattgtcgtt": 10, "agaacgcggc": 10, "tacaattaat": 10, "acataacctt": 10, "atgtatcata": 10, "cacatacgat": 10, "ttaggtgaca": 10, "ctatagaacg": 10, "cggccgccag": 10, "ctgaagcttc": 10, "gtacgctgca": 10, "ggtcgacatg": 10, "caaacagtaa": 10, "tgatggatga": 10, "cattcaaagc": 10, "actgattcta": 10, "ttgctgaaaa": 10, "agataatcac": 10, "tctaataatg": 10, "aatctaactt": 10, "tacttggaaa": 10, "gcgtttcgtg": 10, "aacaagtgga": 10, "aaagcatttt": 10, "tctaaaattg": 10, "aaaggcttca": 10, "ccaagtcctt": 10, "ggaacagatg": 10, "gagacaattc": 10, "atcattattt": 10, "gagttgttta": 10, "caacggcaat": 10, "gaatgcccag": 10, "cttcatgaaa": 10, "tggaacagtg": 10, "ccagaaaaaa": 10, "cttgaagatg": 10, "actgtcagca": 10, "aagaattgat": 10, "tcaatcagat": 10, "ttttggtttc": 10, "ctcattaaag": 10, "ttaacggatg": 10, "atacttctag": 10, "tctcaaaatt": 10, "gagtctcctt": 10, "taattcagtg": 10, "tttgaatcgt": 10, "ttgtcaatgg": 10, "tagaaggaca": 10, "atatatggca": 10, "cagtatgatc": 10, "aaaagttaag": 10, "tacgattaaa": 10, "ggtatgtaat": 10, "cgtctttaat": 10, "ttagacttgt": 10, "gttttaactg": 10, "atgtatagaa": 10, "atgtatcaca": 10, "aattggagtc": 10, "atattgtaac": 10, "cgcttaggaa": 10, "gtccgttcgt": 10, "tttacctgat": 10, "tttgagaatt": 10, "catttttatc": 10, "tgatgtatcc": 10, "gatgctttta": 10, "ctgaatcttt": 10, "gagaggacgc": 10, "atcaacgaag": 10, "ccgaaaagga": 10, "gattgatgcg": 10, "agattagagg": 10, "ttattaattc": 10, "4561": [10, 12], "ctttgaagaa": 10, "gaaattttgg": 10, "gtttgtggtc": 10, "tgaactcggt": 10, "gttgagcccg": 10, "ctgatgttcc": 10, "4621": [10, 12], "acaatacgaa": 10, "caattgcttg": 10, "aatcccatac": 10, "taatcgacca": 10, "aatgatgttt": 10, "atgttactca": 10, "4681": [10, 12], "agaacttatc": 10, "gaccaacttt": 10, "gcaagcaaaa": 10, "agaagttttt": 10, "tccgctgaaa": 10, "aagaaaagag": 10, "4741": [10, 12], "aagtgatcat": 10, "ttaaaaagta": 10, "tacaatcaga": 10, "agttagcaac": 10, "ttgtggaata": 10, "agcttcaagt": 10, "4801": [10, 12], "ttctcccaat": 10, "gaacaaagtc": 10, "aatttggcga": 10, "ttcatcaaac": 10, "attaatcaag": 10, "aaaatatttc": 10, "4861": [10, 12], "attatgggaa": 10, "actgaacttg": 10, "aaaaacttca": 10, "tcagttaaaa": 10, "aaggagcatt": 10, "tacccatttt": 10, "4921": [10, 12], "tttagaagac": 10, "tgtcgtcaac": 10, "aaattcttca": 10, "gctttgggat": 10, "tctctgtttt": 10, "attcagaaga": 10, "4981": [10, 12], "acaaagaaag": 10, "tcctttacac": 10, "ctatgtatga": 10, "agacattatt": 10, "acagagcagg": 10, "ttcttacggc": 10, "5041": 10, "ccatgaaaac": 10, "tatataaagc": 10, "aactagaggc": 10, "cgaagtttct": 10, "gctaataagt": 10, "cctttttaag": 10, "5101": 10, "cttaattaat": 10, "cgctatgcct": 10, "ctttaataga": 10, "aggaaagaaa": 10, "gagcttgaag": 10, "ctagttctaa": 10, "5161": 10, "tgatgcctct": 10, "cgtctaacac": 10, "aacggggacg": 10, "ccgggaccca": 10, "ggtttacttc": 10, "tacgtgaaga": 10, "5221": 10, "gaaaatccgt": 10, "aagcgacttt": 10, "ctagagaact": 10, "tcctaaggtt": 10, "cagtcgctgc": 10, "ttataccaga": 10, "5281": 10, "gattacagca": 10, "tgggaagaaa": 10, "gaaatggaag": 10, "gacgttcctt": 10, "ttttatgatg": 10, "aaccacttct": 10, "5341": 10, "caagatttgc": 10, "caagaggcca": 10, "ctcaaccaaa": 10, "atcattatat": 10, "agaagtgcaa": 10, "gtgctgccgc": 10, "5401": 10, "aaaccgcccg": 10, "aaaacagcaa": 10, "ctacaacgga": 10, "ctctgttaat": 10, "agaacacctt": 10, "ctcaacgagg": 10, "5461": 10, "gcgtgtagct": 10, "gtaccttcaa": 10, "caccaagtgt": 10, "taggtccgct": 10, "tctcgagcta": 10, "tgacgagtcc": 10, "5521": 10, "aaggacaccg": 10, "cttcctagag": 10, "taaaaaacac": 10, "tcaaaatcca": 10, "agtcgttcca": 10, "ttagtgcaga": 10, "5581": 10, "accgccatca": 10, "gcaaccagta": 10, "ccgccaatag": 10, "aagacacccc": 10, "actgctaatc": 10, "gaattgatat": 10, "5641": 10, "aaacgctaga": 10, "ttaaacagtg": 10, "ctagtcggtc": 10, "tcgaagcgcg": 10, "aacatgataa": 10, "gacaaggggc": 10, "5701": 10, "aaatggtagt": 10, "gacagcaata": 10, "tgtcttcttc": 10, "acccgtttct": 10, "ggaaattcca": 10, "ataccccttt": 10, "5761": 10, "taacaagttt": 10, "ccaaattctg": 10, "tatctcgcaa": 10, "tacacatttt": 10, "gaatccaagt": 10, "caccgcaccc": 10, "5821": 10, "aaattactct": 10, "cgaactcctc": 10, "atgaaacgta": 10, "ttcaaaggct": 10, "tcatctaaga": 10, "acgtcccatt": 10, "5881": 10, "aagtcctcca": 10, "aagcagcgtg": 10, "tagttaatga": 10, "acacgcttta": 10, "aatattatgt": 10, "cggaaaaatt": 10, "5941": 10, "gcaaagaact": 10, "aatctgaaag": 10, "aacaaacacc": 10, "cgagatggac": 10, "attgaaaaca": 10, "gctcgcagaa": 10, "6001": 10, "ccttcctttt": 10, "tctcctatga": 10, "agatatcccc": 10, "cataagagca": 10, "tcacccgtaa": 10, "agacaattcc": 10, "6061": 10, "atcatcaccg": 10, "tcccccacta": 10, "ccaacatttt": 10, "ttctgctcca": [10, 12], "ctcaacaata": 10, "ttacaaattg": 10, "6121": 10, "tacaccgatg": 10, "gaggatgaat": 10, "ggggagaaga": 10, "aggcttttaa": 10, "tgg": 10, "power": [11, 14, 16], "continu": 11, "seamless": 11, "reaction": [11, 16], "daniel": 11, "colleagu": 11, "2009": 11, "wide": 11, "biotechnologi": 11, "fpr": 11, "frag": [11, 14, 16], "minimum": [11, 15, 16], "homologi": [11, 15, 16], "terminal_overlap": [11, 16], "anywher": 11, "happen": [11, 16], "event": 11, "fragment1": 11, "acgatgctatactgccccctgtgctgtgctcta": [11, 16], "fragment2": 11, "tgtgctgtgctctattttttattctggctgtatc": [11, 16], "fragment3": 11, "tattctggctgtatcgggggtacgatgctatactg": [11, 16], "14bp": [11, 16], "33bp": [11, 16], "34bp": [11, 16], "35bp": [11, 16], "node": [11, 16], "overlap": [11, 14, 15, 16], "element": [11, 12, 16], "contig": 11, "assembly_circ": 11, "59": [11, 16], "o59": [11, 16], "acga": 11, "gggt": 11, "tgct": 11, "ccca": 11, "example_gibson": 11, "comput": [12, 16], "content": 12, "lcl": 12, "1_cds_aaa98665": 12, "1_1": 12, "gbkei": 12, "tcctccatatacaacggtatctccacctcaggtttagatctcaacaacggaaccattgcc": 12, "gacatgagacagttaggtatcgtcgagagttacaagctaaaacgagcagtagtcagctct": 12, "gcatctgaagccgctgaagttctactaagggtggataacatcatccgtgcaagaccaaga": 12, "accgccaatagacaacatatgtaa": 12, "accordingli": 12, "convert": 12, "scu49845": 12, "oct": 12, "2018": 12, "partial": 12, "brewer": 12, "roemer": 12, "madden": 12, "snyder": 12, "axial": 12, "growth": 12, "novel": 12, "dev": 12, "777": 12, "793": 12, "1996": 12, "8846915": 12, "22": 12, "feb": [12, 16], "yale": 12, "haven": 12, "ct": 12, "06520": 12, "usa": 12, "ssiyngistsgldlnngtiadmrqlgivesyklkravvssaseaa": 12, "evllrvdniirarprtanrqhm": 12, "687": 12, "mtqlqisllltatisllhlvvatpyeaypigkqyppvarvnesft": 12, "fqisndtykssvdktaqityncfdlpswlsfdsssrtfsgepssdllsdanttlyfnvi": 12, "legtdsadstslnntyqfvvtnrpsislssdfnllallknygytngknalkldpnevfn": 12, "vtfdrsmftneesivsyygrsqlynaplpnwlffdsgelkftgtapvinsaiapetsi": 12, "fviiatdiegfsavevefelvigahqlttsiqnsliinvtdtgnvsydlplnyvylddd": 12, "pissdklgsinlldapdwvaldnatisgsvpdellgknsnpanfsvsiydtygdviyfn": 12, "fevvsttdlfaisslpninatrgewfsyyflpsqftdyvntnvsleftnssqdhdwvkf": 12, "qssnltlagevpknfdklslglkanqgsqsqelyfniigmdskithsnhsanatstrss": 12, "hhststssytsstytakisstsaaatssapaalpaanktsshnkkavaiacgvaiplgv": 12, "ilvalicflifwrrrrenpddenlphaisgpdlnnpankpnqenatplnnpfdddassi": 12, "ddtsiarrlaalntlkldnhsatesdissvdekrdslsgmntyndqfqsqskeellakp": 12, "pvqppespffdpqnrsssvymdsepavnkswrytgnlspvsdivrdsygsqktvdtekl": 12, "fdleapekekrtsrdvtmssldpwnsnispspvrksvtpspynvtkhrnrhlqniqdsq": 12, "sgkngitpttmstsssddfvpvkdgenfcwvhsmepdrrpskkrlvdfsnksnvnvgqv": 12, "kdihgripeml": 12, "3300": 12, "mnrwvekwlrvylkcyinlilfyrnvyppqsfdyttyqsfnlpqf": 12, "vpinrhpalidyieelildvlsklthvyrfsiciinkkndlciekyvldfselqhvdkd": 12, "dqiitetevfdefrsslnslimhleklpkvnddtitfeavinaielelghkldrnrrvd": 12, "sleekaeierdsnwvkcqedenlpdnngfqppkikltslvgsdvgpliihqfseklisg": 12, "ddkilngvysqyeegesifgslf": 12, "gatcctccat": 12, "atacaacggt": 12, "atctccacct": 12, "caggtttaga": 12, "tctcaacaac": 12, "ggaaccattg": 12, "ccgacatgag": 12, "acagttaggt": 12, "atcgtcgaga": 12, "gttacaagct": 12, "aaaacgagca": 12, "gtagtcagct": 12, "ctgcatctga": 12, "agccgctgaa": 12, "gttctactaa": 12, "gggtggataa": 12, "catcatccgt": 12, "gcaagaccaa": 12, "gaaccgccaa": 12, "tagacaacat": 12, "atgtaacata": 12, "tttaggatat": 12, "acctcgaaaa": 12, "taataaaccg": 12, "ccacactgtc": 12, "attattataa": 12, "ttagaaacag": 12, "aacgcaaaaa": 12, "ttatccacta": 12, "tataattcaa": 12, "agacgcgaaa": 12, "aaaaaagaac": 12, "aacgcgtcat": 12, "agaacttttg": 12, "gcaattcgcg": 12, "tcacaaataa": 12, "attttggcaa": 12, "cttatgtttc": 12, "ctcttcgagc": 12, "agtactcgag": 12, "ccctgtctca": 12, "agaatgtaat": 12, "aatacccatc": 12, "gtaggtatgg": 12, "ttaaagatag": 12, "catctccaca": 12, "acctcaaagc": 12, "tccttgccga": 12, "gagtcgccct": 12, "cctttgtcga": 12, "gtaattttca": 12, "cttttcatat": 12, "gagaacttat": 12, "tttcttattc": 12, "tttactctca": 12, "catcctgtag": 12, "tgattgacac": 12, "tgcaacagcc": 12, "accatcacta": 12, "gaagaacaga": 12, "acaattactt": 12, "aatagaaaaa": 12, "ttatatcttc": 12, "ctcgaaacga": 12, "tttcctgctt": 12, "ccaacatcta": 12, "cgtatatcaa": 12, "gaagcattca": 12, "cttaccatga": 12, "cacagcttca": 12, "gatttcatta": 12, "ttgctgacag": 12, "ctactatatc": 12, "actactccat": 12, "ctagtagtgg": 12, "ccacgcccta": 12, "tgaggcatat": 12, "cctatcggaa": 12, "aacaataccc": 12, "cccagtggca": 12, "agagtcaatg": 12, "aatcgtttac": 12, "atttcaaatt": 12, "tccaatgata": 12, "cctataaatc": 12, "gtctgtagac": 12, "aagacagctc": 12, "aaataacata": 12, "caattgcttc": 12, "gacttaccga": 12, "gctggctttc": 12, "gtttgactct": 12, "agttctagaa": 12, "cgttctcagg": 12, "tgaaccttct": 12, "tctgacttac": 12, "tatctgatgc": 12, "gaacaccacg": 12, "ttgtatttca": 12, "atgtaatact": 12, "cgagggtacg": 12, "gactctgccg": 12, "acagcacgtc": 12, "tttgaacaat": 12, "acataccaat": 12, "ttgttgttac": 12, "aaaccgtcca": 12, "tccatctcgc": 12, "tatcgtcaga": 12, "tttcaatcta": 12, "ttggcgttgt": 12, "taaaaaacta": 12, "tggttatact": 12, "aacggcaaaa": 12, "acgctctgaa": 12, "actagatcct": 12, "aatgaagtct": 12, "tcaacgtgac": 12, "ttttgaccgt": 12, "tcaatgttca": 12, "ctaacgaaga": 12, "atccattgtg": 12, "tcgtattacg": 12, "gacgttctca": 12, "gttgtataat": 12, "gcgccgttac": 12, "ccaattggct": 12, "gttcttcgat": 12, "tctggcgagt": 12, "tgaagtttac": 12, "tgggacggca": 12, "ccggtgataa": 12, "actcggcgat": 12, "tgctccagaa": 12, "acaagctaca": 12, "gttttgtcat": 12, "catcgctaca": 12, "gacattgaag": 12, "gattttctgc": 12, "cgttgaggta": 12, "gaattcgaat": 12, "tagtcatcgg": 12, "ggctcaccag": 12, "ttaactacct": 12, "ctattcaaaa": 12, "tagtttgata": 12, "atcaacgtta": 12, "ctgacacagg": 12, "taacgtttca": 12, "tatgacttac": 12, "ctctaaacta": 12, "tgtttatctc": 12, "gatgacgatc": 12, "ctatttcttc": 12, "tgataaattg": 12, "ggttctataa": 12, "acttattgga": 12, "tgctccagac": 12, "tgggtggcat": 12, "tagataatgc": 12, "taccatttcc": 12, "gggtctgtcc": 12, "cagatgaatt": 12, "actcggtaag": 12, "aactccaatc": 12, "ctgccaattt": 12, "ttctgtgtcc": 12, "atttatgata": 12, "cttatggtga": 12, "tgtgatttat": 12, "ttcaacttcg": 12, "aagttgtctc": 12, "cacaacggat": 12, "ttgtttgcca": 12, "ttagttctct": 12, "tcccaatatt": 12, "aacgctacaa": 12, "ggggtgaatg": 12, "gttctcctac": 12, "tattttttgc": 12, "cttctcagtt": 12, "tacagactac": 12, "gtgaatacaa": 12, "acgtttcatt": 12, "agagtttact": 12, "aattcaagcc": 12, "aagaccatga": 12, "ctgggtgaaa": 12, "ttccaatcat": 12, "ctaatttaac": 12, "attagctgga": 12, "gaagtgccca": 12, "agaatttcga": 12, "caagctttca": 12, "ttaggtttga": 12, "aagcgaacca": 12, "aggttcacaa": 12, "tctcaagagc": 12, "tatattttaa": 12, "catcattggc": 12, "atggattcaa": 12, "agataactca": 12, "ctcaaaccac": 12, "agtgcgaatg": 12, "caacgtccac": 12, "aagaagttct": 12, "caccactcca": 12, "cctcaacaag": 12, "ttcttacaca": 12, "tcttctactt": 12, "acactgcaaa": 12, "aatttcttct": 12, "acctccgctg": 12, "ctgctacttc": 12, "gcagcgctgc": 12, "cagcagccaa": 12, "taaaacttca": 12, "tctcacaata": 12, "aaaaagcagt": 12, "agcaattgcg": 12, "tgcggtgttg": 12, "ctatcccatt": 12, "aggcgttatc": 12, "ctagtagctc": 12, "tcatttgctt": 12, "cctaatattc": 12, "tggagacgca": 12, "gaagggaaaa": 12, "tccagacgat": 12, "gaaaacttac": 12, "cgcatgctat": 12, "tagtggacct": 12, "gatttgaata": 12, "atcctgcaaa": 12, "taaaccaaat": 12, "caagaaaacg": 12, "ctacaccttt": 12, "gaacaacccc": 12, "tttgatgatg": 12, "atgcttcctc": 12, "gtacgatgat": 12, "acttcaatag": 12, "caagaagatt": 12, "ggctgctttg": 12, "aacactttga": 12, "aattggataa": 12, "ccactctgcc": 12, "actgaatctg": 12, "atatttccag": 12, "cgtggatgaa": 12, "aagagagatt": 12, "ctctatcagg": 12, "tatgaataca": 12, "tacaatgatc": 12, "agttccaatc": 12, "ccaaagtaaa": 12, "gaagaattat": 12, "tagcaaaacc": 12, "cccagtacag": 12, "cctccagaga": 12, "gcccgttctt": 12, "tgacccacag": 12, "aataggtctt": 12, "cttctgtgta": 12, "tatggatagt": 12, "gaaccagcag": 12, "taaataaatc": 12, "ctggcgatat": 12, "actggcaacc": 12, "tgtcaccagt": 12, "ctctgatatt": 12, "gtcagagaca": 12, "gttacggatc": 12, "acaaaaaact": 12, "gttgatacag": 12, "aaaaactttt": 12, "cgatttagaa": 12, "gcaccagaga": 12, "aggaaaaacg": 12, "tacgtcaagg": 12, "gatgtcacta": 12, "tgtcttcact": 12, "ggacccttgg": 12, "aacagcaata": 12, "ttagcccttc": 12, "tcccgtaaga": 12, "aaatcagtaa": 12, "caccatcacc": 12, "atataacgta": 12, "acgaagcatc": 12, "gtaaccgcca": 12, "cttacaaaat": 12, "attcaagact": 12, "ctcaaagcgg": 12, "taaaaacgga": 12, "atcactccca": 12, "caacaatgtc": 12, "aacttcatct": 12, "tctgacgatt": 12, "ttgttccggt": 12, "taaagatggt": 12, "gaaaattttt": 12, "gctgggtcca": 12, "tagcatggaa": 12, "ccagacagaa": 12, "gaccaagtaa": 12, "gaaaaggtta": 12, "gtagattttt": 12, "caaataagag": 12, "taatgtcaat": 12, "gttggtcaag": 12, "ttaaggacat": 12, "tcacggacgc": 12, "atcccagaaa": 12, "tgctgtgatt": 12, "atacgcaacg": 12, "atattttgct": 12, "taattttatt": 12, "ttcctgtttt": 12, "attttttatt": 12, "agtggtttac": 12, "agatacccta": 12, "tattttattt": 12, "agtttttata": 12, "cttagagaca": 12, "tttaatttta": 12, "attccattct": 12, "tcaaatttca": 12, "tttttgcact": 12, "taaaacaaag": 12, "atccaaaaat": 12, "gctctcgccc": 12, "tcttcatatt": 12, "gagaatacac": 12, "tccattcaaa": 12, "attttgtcgt": 12, "caccgctgat": 12, "taatttttca": 12, "ctaaactgat": 12, "gaataatcaa": 12, "aggccccacg": 12, "tcagaaccga": 12, "ctaaagaagt": 12, "gagttttatt": 12, "ttaggaggtt": 12, "gaaaaccatt": 12, "attgtctggt": 12, "aaattttcat": 12, "cttcttgaca": 12, "tttaacccag": 12, "tttgaatccc": 12, "tttcaatttc": 12, "tgctttttcc": 12, "tccaaactat": 12, "cgaccctcct": 12, "gtttctgtcc": 12, "aacttatgtc": 12, "ctagttccaa": 12, "ttcgatcgca": 12, "ttaataactg": 12, "cttcaaatgt": 12, "tattgtgtca": 12, "tcgttgactt": 12, "taggtaattt": 12, "ctccaaatgc": 12, "ataatcaaac": 12, "tatttaagga": 12, "agatcggaat": 12, "tcgtcgaaca": 12, "cttcagtttc": 12, "cgtaatgatc": 12, "tgatcgtctt": 12, "tatccacatg": 12, "ttgtaattca": 12, "ctaaaatcta": 12, "aaacgtattt": 12, "ttcaatgcat": 12, "aaatcgttct": 12, "ttttattaat": 12, "aatgcagatg": 12, "gaaaatctgt": 12, "aaacgtgcgt": 12, "taatttagaa": 12, "agaacatcca": 12, "gtataagttc": 12, "ttctatatag": 12, "tcaattaaag": 12, "caggatgcct": 12, "attaatggga": 12, "acgaactgcg": 12, "gcaagttgaa": 12, "tgactggtaa": 12, "gtagtgtagt": 12, "cgaatgactg": 12, "aggtgggtat": 12, "acatttctat": 12, "aaaataaaat": 12, "caaattaatg": 12, "tagcatttta": 12, "agtataccct": 12, "cagccacttc": 12, "tctacccatc": 12, "tattcataaa": 12, "gctgacgcaa": 12, "cgattactat": 12, "tttttttttc": 12, "ttcttggatc": 12, "tcagtcgtcg": 12, "caaaaacgta": 12, "taccttcttt": 12, "ttccgacctt": 12, "ttttttagct": 12, "ttctggaaaa": 12, "gtttatatta": 12, "gttaaacagg": 12, "gtctagtctt": 12, "agtgtgaaag": 12, "ctagtggttt": 12, "cgattgactg": 12, "atattaagaa": 12, "agtggaaatt": 12, "aaattagtag": 12, "tgtagacgta": 12, "tatgcatatg": 12, "tatttctcgc": 12, "ctgtttatgt": 12, "ttctacgtac": 12, "ttttgattta": 12, "tagcaagggg": 12, "aaaagaaata": 12, "catactattt": 12, "tttggtaaag": 12, "gtgaaagcat": 12, "aatgtaaaag": 12, "ctagaataaa": 12, "atggacgaaa": 12, "taaagagagg": 12, "cttagttcat": 12, "cttttttcca": 12, "aaaagcaccc": 12, "aatgataata": 12, "actaaaatga": 12, "aaaggatttg": 12, "ccatctgtca": 12, "gcaacatcag": 12, "ttgtgtgagc": 12, "aataataaaa": 12, "tcatcacctc": 12, "cgttgccttt": 12, "agcgcgtttg": 12, "tcgtttgtat": 12, "cttccgtaat": 12, "tttagtctta": 12, "tcaatgggaa": 12, "tcataaattt": 12, "tccaatgaat": 12, "tagcaatttc": 12, "gtccaattct": 12, "ttttgagctt": 12, "cttcatattt": 12, "gctttggaat": 12, "tcttcgcact": 12, "tcttttccca": 12, "ttcatctctt": 12, "tcttcttcca": 12, "aagcaacgat": 12, "ccttctaccc": 12, "atttgctcag": 12, "agttcaaatc": 12, "ggcctctttc": 12, "agtttatcca": 12, "ttgcttcctt": 12, "cagtttggct": 12, "tcactgtctt": 12, "ctagctgttg": 12, "ttctagatcc": 12, "tggtttttct": 12, "tggtgtagtt": 12, "ctcattatta": 12, "gatctcaagt": 12, "tattggagtc": 12, "ttcagccaat": 12, "tgctttgtat": 12, "cagacaattg": 12, "actctctaac": 12, "ttctccactt": 12, "cactgtcgag": 12, "ttgctcgttt": 12, "ttagcggaca": 12, "aagatttaat": 12, "ctcgttttct": 12, "ttttcagtgt": 12, "tagattgctc": 12, "taattctttg": 12, "agctgttctc": 12, "tcagctcctc": 12, "atatttttct": 12, "tgccatgact": 12, "cagattctaa": 12, "ttttaagcta": 12, "ttcaatttct": 12, "ctttgatc": 12, "highlight": [12, 15, 16], "dseq_featur": [12, 14], "alon": [12, 13, 16], "obtain": [12, 16], "1_cds_aaa98667": 12, "1_3": 12, "atgaatagatgggtagagaagtggctgagggtatacttaaaatgctacattaatttgattttattttata": 12, "gaaatgtatacccacctcagtcattcgactacactacttaccagtcattcaacttgccgcagttcgttcc": 12, "cattaataggcatcctgctttaattgactatatagaagaacttatactggatgttctttctaaattaacg": 12, "cacgtttacagattttccatctgcattattaataaaaagaacgatttatgcattgaaaaatacgttttag": 12, "attttagtgaattacaacatgtggataaagacgatcagatcattacggaaactgaagtgttcgacgaatt": 12, "ccgatcttccttaaatagtttgattatgcatttggagaaattacctaaagtcaacgatgacacaataaca": 12, "tttgaagcagttattaatgcgatcgaattggaactaggacataagttggacagaaacaggagggtcgata": 12, "gtttggaggaaaaagcagaaattgaaagggattcaaactgggttaaatgtcaagaagatgaaaatttacc": 12, "agacaataatggttttcaacctcctaaaataaaactcacttctttagtcggttctgacgtggggcctttg": 12, "attattcatcagtttagtgaaaaattaatcagcggtgacgacaaaattttgaatggagtgtattctcaat": 12, "atgaagagggcgagagcatttttggatctttgttttaa": 12, "atgaatagatgggtagagaagtggctgagggtatacttaaaatgctacattaatttgatt": 12, "ttattttatagaaatgtatacccacctcagtcattcgactacactacttaccagtcattc": 12, "aacttgccgcagttcgttcccattaataggcatcctgctttaattgactatatagaagaa": 12, "cttatactggatgttctttctaaattaacgcacgtttacagattttccatctgcattatt": 12, "aataaaaagaacgatttatgcattgaaaaatacgttttagattttagtgaattacaacat": 12, "gtggataaagacgatcagatcattacggaaactgaagtgttcgacgaattccgatcttcc": 12, "ttaaatagtttgattatgcatttggagaaattacctaaagtcaacgatgacacaataaca": 12, "tttgaagcagttattaatgcgatcgaattggaactaggacataagttggacagaaacagg": 12, "agggtcgatagtttggaggaaaaagcagaaattgaaagggattcaaactgggttaaatgt": 12, "caagaagatgaaaatttaccagacaataatggttttcaacctcctaaaataaaactcact": 12, "tctttagtcggttctgacgtggggcctttgattattcatcagtttagtgaaaaattaatc": 12, "agcggtgacgacaaaattttgaatggagtgtattctcaatatgaagagggcgagagcatt": 12, "tttggatctttgttttaa": 12, "guess": [12, 16], "whether": 12, "unexpect": 12, "seqio": [12, 16], "seqio_pars": 12, "seq_record": 12, "is_circular": 12, "dseq_record": 12, "walk": 13, "stretch": [13, 16], "ensur": [13, 16], "appropri": 13, "care": [13, 16], "quick": [13, 14, 16], "popular": 13, "web": 13, "servci": 13, "primer3plu": 13, "quickli": 13, "expect": [13, 16], "300": [13, 16], "18": [13, 16], "sample_seq": [13, 14], "fwd_primer": 13, "attcctgcagagtacatc": 13, "rvs_primer": 13, "accatccgaagatatctt": 13, "45bp_pcr_prod": 13, "45bp": 13, "28": 13, "attcctgcag": 13, "agtacatcaa": 13, "ttctatgaag": 13, "atatcttcgg": 13, "atggt": 13, "section": [13, 16], "retain": [13, 14], "hindiii": 13, "aagctt": 13, "accident": 13, "hybridis": 13, "aagcttattcctgcagagtacatc": 13, "aagcttaccatccgaagatatctt": 13, "pcr_product_hindiii": 13, "57bp_pcr_prod": 13, "57bp": 13, "21": 13, "48": [13, 15, 16], "31": 13, "aagcttattc": 13, "ctgcagagta": 13, "catcaattct": 13, "cttcggatgg": 13, "taagctt": 13, "attribut": [13, 16], "attcctgcagagtacatcaattctatgaagatatcttcggatggt": 13, "5attcctgcagagtacatc": 13, "aagatatcttcggatggt3": 13, "3ttctatagaagcctacca5": 13, "5attcctgcagagtacatc3": 13, "3taaggacgtctcatgtag": 13, "ttctatagaagcctacca5": 13, "suppli": [13, 16], "mind": 13, "degre": 13, "celciu": 13, "50": [13, 16], "pcr_product_f45": 13, "example_gene_r45": 13, "f45": 13, "attcctgcagagtaca": 13, "r45": 13, "accatccgaagatatct": 13, "formula": [13, 16], "rychlik": [13, 16], "1990": [13, 16], "taken": 13, "fp": [13, 16], "rp": [13, 16], "aim": 13, "forward_prim": [13, 15, 16], "gaattcattcctgcagagtacatca": 13, "primers_sixf": 13, "pcr_product_forward_prim": 13, "accatccgaagatatcttca": 13, "gaattcattc": 13, "come": 13, "mention": [13, 16], "deriv": 13, "phusion": [13, 16], "concentr": [13, 16], "buffer": 13, "strength": 13, "primer_f": 13, "attcctgcagagtacatca": 13, "primer_r": 13, "tm_f": 13, "tm_r": 13, "901005046706075": 13, "841913263215304": 13, "explor": [14, 16], "conjug": 14, "vast": 14, "varieti": 14, "recognis": 14, "blunt": [14, 16], "genenr": 14, "338bp": 14, "cut_record": 14, "338": 14, "aattcttc": 14, "tgtg": 14, "gaag": 14, "acacttaa": 14, "recognit": [14, 16], "ecorv": 14, "multi_cut_record": 14, "214": 14, "tgat": 14, "acta": 14, "73": 14, "agat": 14, "tcta": 14, "coupl": 14, "10kb": 14, "togeth": [14, 16], "oper": 14, "occur": [14, 16], "ligated_product": 14, "261": 14, "perfect": 14, "realli": 14, "doesn": 14, "inde": 14, "oppos": 14, "roman": 14, "numer": [14, 16], "spell": 14, "act": 14, "place": [14, 15, 16], "o261": 14, "psti": 14, "within": 14, "cutand": 14, "cut_record2": 14, "222": 14, "gagt": 14, "taactgca": 14, "acgtctca": 14, "attg": 14, "go": 14, "dsr": 15, "atgcaaacagtaatgatggatgacattcaaagcactgattctattgctgaaaaagataat": 15, "y": [15, 16], "my_gen": 15, "11matgcaaacagtaatgatggatgacattcaaagcactgattctattgctgaaaaagataat": 15, "0m": [15, 16], "tacgtttgtcattactacctactgtaagtttcgtgactaagataacgactttttctatta": 15, "atgcaaacag": 15, "taatgatgga": 15, "tgacattcaa": 15, "agcactgatt": 15, "ctattgctga": 15, "aaaagataat": 15, "align": 15, "reverse_prim": [15, 16], "atgcaaacagtaatgatgga": 15, "attatctttttcagcaatagaatca": 15, "5atgcaaacagtaatgatgga": 15, "tgattctattgctgaaaaagataat3": 15, "3actaagataacgactttttctatta5": 15, "5atgcaaacagtaatgatgga3": 15, "3tacgtttgtcattactacct": 15, "actaagataacgactttttctatta5": 15, "sai": 15, "just": [15, 16], "ccccggatcc": 15, "ttttggatcc": 15, "3actaagataacgactttttctattacctaggtttt5": 15, "5ccccggatccatgcaaacagtaatgatgga3": 15, "clearli": 15, "turn": [15, 16], "0mggatccaaaa": 15, "ggggcctaggtacgtttgtcattactacctactgtaagtttcgtgactaagataacgactttttctattacctaggtttt": 15, "bamhi": [15, 16], "ggatcc": [15, 16], "payload": 15, "11m": [15, 16], "0mccccg": 15, "ggggcctag": 15, "70": 15, "gatcc": [15, 16], "0mg": 15, "gtacgtttgtcattactacctactgtaagtttcgtgactaagataacgactttttctattacctag": 15, "0mgatccaaaa": 15, "gtttt": 15, "aatgtttttccctcccgggcaaaatagatcttgctatgcatcatcgatct": 15, "vect": 15, "o50": 15, "0maatgtttttccctcccgggcaaaatagatcttgctatgcatcatcgatct": 15, "ttacaaaaagggagggcccgttttatctagaacgatacgtagtagctaga": 15, "bglii": 15, "agatct": 15, "linear_vector_bgl": 15, "coordin": 15, "rec_vector": 15, "o116": 15, "aatgtttttccctcccgggcaaaatagatcc": 15, "0mggatcttgctatgcatcatcgatct": 15, "ttacaaaaagggagggcccgttttatctaggtacgtttgtcattactacctactgtaagtttcgtgactaagataacgactttttctattacctagaacgatacgtagtagctaga": 15, "aatgtttttccctcactacgtgctatgcatcat": 15, "fragment_a": 15, "tgctatgcatcatctatggacactctaataatg": 15, "fragment_b": 15, "cactctaataatgttacataaatgtttttccct": 15, "fragment_c": 15, "asm": 15, "Or": 15, "o60": 15, "0maatgtttttccctcactacgtgctatgcatcatctatggacactctaataatgttacata": 15, "ttacaaaaagggagtgatgcacgatacgtagtagatacctgtgagattattacaatgtat": 15, "copyright": 16, "2013": 16, "bj\u00f6rn": 16, "johansson": 16, "reserv": 16, "licens": 16, "govern": 16, "creation": 16, "techniqu": 16, "amplif": 16, "past": 16, "agaros": 16, "variou": 16, "capac": 16, "capit": 16, "letter": 16, "lowercas": 16, "directli": 16, "built": 16, "view": 16, "doctr": 16, "automaticli": 16, "manual": 16, "advanc": 16, "tab": 16, "introspect": 16, "capabl": 16, "open_config_fold": 16, "enter": 16, "spyder": 16, "cursor": 16, "press": 16, "ctrl": 16, "bring": 16, "snippet": 16, "greater": 16, "sign": 16, "41": 16, "42": 16, "group": 16, "itself": 16, "collect": 16, "open_current_fold": 16, "getcwd": 16, "configur": 16, "pydna_config_dir": 16, "quicker": 16, "configpars": 16, "typic": 16, "system": 16, "loglevel": 16, "myemail": 16, "data_dir": 16, "home": 16, "bjorn": 16, "log_dir": 16, "tclsh": 16, "appmain": 16, "tcl": 16, "cached_func": 16, "genbank_nucleotid": 16, "dropbox": 16, "wikidata": 16, "restrictionenzym": 16, "address": 16, "someon": 16, "own": 16, "explicitli": 16, "amplify_ann": 16, "assembly_assembli": 16, "dseqrecord_sync": 16, "comma": 16, "entri": 16, "pydna_cached_func": 16, "open_log_fold": 16, "get_env": 16, "pydna_": 16, "logo": 16, "art": 16, "logotyp": 16, "mostli": 16, "hold": 16, "meta": 16, "notion": 16, "str": 16, "byte": 16, "po": 16, "antisens": 16, "int": 16, "stagger": 16, "detail": 16, "explan": 16, "bool": 16, "common": 16, "usag": 16, "aaa": 16, "ttt": 16, "interpret": 16, "gggaaat": 16, "attempt": 16, "least": 16, "half": 16, "shortest": 16, "integ": 16, "five": 16, "prime": 16, "amount": 16, "agt": 16, "actta": 16, "attca": 16, "except": 16, "rais": 16, "traceback": 16, "recent": 16, "stdin": 16, "usr": 16, "lib": 16, "python2": 16, "dist": 16, "__init__": 16, "els": 16, "valueerror": 16, "shape": 16, "o3": 16, "tttcccc": 16, "aaacccc": 16, "ccccaaa": 16, "ccccttt": 16, "coerc": 16, "ggggtttcccc": 16, "gatccttt": 16, "aaagcctag": 16, "aaagcccta": 16, "gac": 16, "ta": 16, "ctg": 16, "o6": 16, "cctagg": 16, "ccgga": 16, "ggcct": 16, "tccgga": 16, "aggcct": 16, "trunc": 16, "from_str": 16, "arg": 16, "kwarg": 16, "from_represent": 16, "full_sequ": 16, "equival": 16, "aaaaaa": 16, "tttttt": 16, "mw": 16, "float": 16, "313": 16, "304": 16, "289": 16, "329": 16, "308": 16, "79": 16, "dseqtyp": 16, "uppercas": 16, "_seqabstractbaseclass": 16, "_sy": 16, "maxsiz": 16, "behav": 16, "occurr": 16, "NOT": 16, "atcgactgacgtgtt": 16, "tagctgactgcacaa": 16, "reverse_compl": 16, "catcgatc": 16, "gtagctag": 16, "gatcgatg": 16, "ctagctac": 16, "rc": 16, "typeerror": 16, "o8": 16, "t4": 16, "catcgat": 16, "tagctag": 16, "o7": 16, "gtagcta": 16, "catcga": 16, "agctag": 16, "357": 16, "type5": 16, "type3": 16, "sticky5": 16, "sticky3": 16, "cannot": 16, "tolinear": 16, "deprec": 16, "tupl": 16, "fill_in": 16, "fill": 16, "protrud": 16, "activ": 16, "exo": 16, "klenow": 16, "caaa": 16, "cttt": 16, "tttc": 16, "caaag": 16, "gtttc": 16, "tac": 16, "aaac": 16, "tttg": 16, "gttt": 16, "en": 16, "wikipedia": 16, "wiki": 16, "klenow_frag": 16, "the_exo": 16, "_klenow_frag": 16, "transcrib": 16, "helix": 16, "u": 16, "coding_dna": 16, "atggccattgtaatgggccgctgaaagggtgcccgatag": 16, "auggccauuguaaugggccgcugaaagggugcccgauag": 16, "inplac": 16, "mutableseq": 16, "immut": 16, "effect": 16, "mixtur": 16, "becom": 16, "threonin": 16, "selenocystein": 16, "plausibl": 16, "ration": 16, "my_protein": 16, "maivmgrt": 16, "maivmgru": 16, "stop_symbol": 16, "to_stop": 16, "gap": 16, "mung": 16, "treatment": 16, "nucleas": 16, "exonucleas": 16, "bean": 16, "ctaggg": 16, "ctagg": 16, "ggatc": 16, "tcctag": 16, "cctag": 16, "mung_bean_nucleas": 16, "chew": 16, "acitivti": 16, "facilit": 16, "engin": 16, "gatcgatc": 16, "ctagctag": 16, "gatcgat": 16, "gatcga": 16, "gatcg": 16, "gctag": 16, "exo1_front": 16, "resect": 16, "exo1_end": 16, "no_cutt": 16, "batch": 16, "restrictionbatch": 16, "unique_cutt": 16, "onc": 16, "once_cutt": 16, "twice_cutt": 16, "twice": 16, "n_cutter": 16, "cutter": 16, "isblunt": 16, "gat": 16, "cta": 16, "gcta": 16, "cas9": 16, "terminal_transferas": 16, "enzymestyp": 16, "xxx": 16, "ggatccnnngaattc": 16, "cctaggnnncttaag": 16, "gatccnnngaattc": 16, "gnnncttaag": 16, "cutsite_is_valid": 16, "cutsit": 16, "_abstractcut": 16, "fall": 16, "outsid": 16, "move": 16, "valid": 16, "get_cutsit": 16, "cut_watson": 16, "enz": 16, "union": 16, "_restrictionbatch": 16, "aagaattcaagaattc": 16, "aagaattcaa": 16, "agaattcaa": 16, "ttcttaagtt": 16, "gaattc": 16, "left_end_posit": 16, "self": 16, "aat": 16, "right_end_posit": 16, "get_cut_paramet": 16, "is_left": 16, "cut_crick": 16, "Then": 16, "apply_cut": 16, "left_cut": 16, "right_cut": 16, "subfrag": 16, "get_cutsite_pair": 16, "aagaattcaagaattcaa": 16, "p1": 16, "p2": 16, "p3": 16, "aag": 16, "ttcttaa": 16, "aattcaag": 16, "gttcttaa": 16, "aattcaa": 16, "gtt": 16, "ttcaagaa": 16, "render": 16, "mai": 16, "those": 16, "orient": 16, "5e": 16, "addition": 16, "concept": 16, "larger": 16, "reflect": 16, "from_seqrecord": 16, "mass": 16, "gram": 16, "atgtaa": 16, "gt": 16, "type_": 16, "exactposit": 16, "base64": 16, "urlsaf": 16, "ldseguid": 16, "tewydy0ugvgxh3vjnvwgtxoydqa": 16, "underli": 16, "02": 16, "sequec": 16, "obj": 16, "AND": 16, "lost": 16, "_new": 16, "find_aminoacid": 16, "atgtacgatcgtatgctggttatattttag": 16, "mydrmlvif": 16, "rml": 16, "mmm": 16, "lkynqhtivh": 16, "qht": 16, "slc": 16, "find_aa": 16, "cgtatgctg": 16, "gcatacgac": 16, "map_trace_fil": 16, "pth": 16, "func": 16, "throw": 16, "excactli": 16, "number_of_cut": 16, "ggaatt": 16, "ccttaa": 16, "aattcc": 16, "ttaagg": 16, "ref": 16, "rotat": 16, "maximum": 16, "gaat": 16, "o4": 16, "ctta": 16, "atga": 16, "tact": 16, "ccc": 16, "atgaccc": 16, "tactggg": 16, "gacccat": 16, "ctgggta": 16, "minsiz": 16, "orfs_to_featur": 16, "x1b": 16, "plain": 16, "consid": 16, "gaaat": 16, "cttta": 16, "symbol": 16, "aaat": 16, "ttta": 16, "aaatg": 16, "tttac": 16, "aata": 16, "ttat": 16, "param": 16, "dseqrecord_frag": 16, "frag1": 16, "frag2": 16, "meant": 16, "involv": 16, "5tacactcaccgtctatcattatc": 16, "cgactgtatcatctgatagcac3": 16, "3gctgacatagtagactatcgtg5": 16, "5tacactcaccgtctatcattatc3": 16, "3atgtgagtggcagatagtaatag": 16, "gctgacatagtagactatcgtg5": 16, "set_forward_primer_footprint": 16, "set_reverse_primer_footprint": 16, "program": 16, "dbd_program": 16, "flexibl": 16, "invers": 16, "correctli": 16, "seqenc": 16, "greedili": 16, "flatten": 16, "sublcass": 16, "preceed": 16, "tacactcaccgtctatcattatctactatcgactgtatcatctgatagcac": 16, "tacactcaccgtctatcattatc": 16, "cgactgtatcatctgatagcac": 16, "fusion": 16, "analyz": 16, "catgatctacgtatcgtgt": 16, "atcgtgtactgtcatattc": 16, "catattcaaagttct": 16, "atcgtgt": 16, "catattc": 16, "catgatctacgt": 16, "actgt": 16, "aaagttct": 16, "trace": 16, "callabl": 16, "easier": 16, "analysi": 16, "determin": 16, "max_nod": 16, "tweak": 16, "acgatgctatactgccccctgtgctgtgctctattttttattctggctgtatcgggggt": 16, "rstr": 16, "romain": 16, "brixtel": 16, "rbrixtel_at_gmail_dot_com": 16, "greyc": 16, "fr": 16, "gip0": 16, "cover": 16, "mit": 16, "licenc": 16, "stringx": 16, "stringi": 16, "sort": 16, "sensit": 16, "startx1": 16, "starty1": 16, "length1": 16, "startx2": 16, "starty2": 16, "length2": 16, "startposit": 16, "lenght": 16, "flank": 16, "longest": 16, "agctatgtatcttgcatcgta": 16, "gcatcgtagtctatttgcttac": 16, "nodemap": 16, "detailed_figur": 16, "tgtgctgtgctcta": 16, "tattctggctgtatc": 16, "acgatgctatactg": 16, "compact": 16, "frag20": 16, "frag23": 16, "frag14": 16, "2577": 16, "5681": 16, "98": 16, "2389": 16, "557": 16, "circular_assembly_frag": 16, "tm_func": 16, "_tm_default": 16, "estimate_funct": 16, "noth": 16, "oligonuceotid": 16, "substitut": 16, "point": 16, "reli": 16, "extern": 16, "neb": 16, "estim": 16, "dseqr": 16, "tm_neb": 16, "atgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatg": 16, "64": 16, "ampl": 16, "f64": 16, "mer": 16, "atgactgctaacccttc": 16, "r64": 16, "catcgtaagtttcgaacg": 16, "5atgactgctaacccttc": 16, "cgttcgaaacttacgatg3": 16, "3gcaagctttgaatgctac5": 16, "5atgactgctaacccttc3": 16, "3tactgacgattgggaag": 16, "gcaagctttgaatgctac5": 16, "pf": 16, "23": 16, "ggatccatgactgct": 16, "ttc": 16, "ggatcccatcgtaag": 16, "pcr_prod": 16, "3gcaagctttgaatgctaccctagg5": 16, "5ggatccatgactgctaacccttc3": 16, "ggatccatgactgctaacccttccttggtgttgaacaagatcgacgacatttcgttcgaaacttacgatgggatcc": 16, "atgactgctaacccttccttggtgttg": 16, "27": 16, "atgactgctaaccct": 16, "ttg": 16, "32": 16, "catcgtaagtttcga": 16, "atc": 16, "maxlink": 16, "fuse": 16, "appear": 16, "vivo": 16, "_________": 16, "agcctatcatcttggtctctgca": 16, "gacgt": 16, "agcct": 16, "tcggatagtagaaccagagacgt": 16, "__________": 16, "________": 16, "tttatatcgcatgactcttcttt": 16, "agaaa": 16, "tttat": 16, "aaatatagcgtactgagaagaaa": 16, "agcctatcatcttggtctctgcatttatatcgcatgactcttcttt": 16, "tcggatagtagaaccagagacgtaaatatagcgtactgagaagaaa": 16, "___________________": 16, "______________________": 16, "gagacgtaaatata": 16, "ctctgcatttatat": 16, "agcctatcatcttggtctctgcatttatat": 16, "tcggatagtagaaccagagacgtaaatata": 16, "____________": 16, "ctctgcatttatatcgcatgactcttcttt": 16, "gagacgtaaatatagcgtactgagaagaaa": 16, "earlier": 16, "At": 16, "everi": 16, "whole": 16, "tcttggtctctgcatttatat": 16, "tcggatagtagaacca": 16, "tcgcatgactcttcttt": 16, "adjac": 16, "junction": 16, "closest": 16, "amplicon1": 16, "amplicon2": 16, "dseqrecd1": 16, "prinmer": 16, "trick": 16, "around": 16, "depict": 16, "off": 16, "synhtes": 16, "amplicon3": 16, "amplicon4": 16, "amplicon1amplicon2amplicon3amplicon4": 16, "dseqrecd2": 16, "amplicon1dseqrecd1amplicon2dseqrecd2": 16, "dseqrecd1amplicon1dseqrecd2amplicon2": 16, "dseqrecd1amplicon1amplicon2": 16, "fwd": 16, "rev": 16, "amplicon1amplicon2amplicon3": 16, "ccaaacccaccaggtaccttatgtaagtacttcaagtcgccagaagacttcttggtcaagttgcc": 16, "tgtactggtgctgaaccttgtatcaagttgggtgttgacgccattgccccaggtggtcgtttcgtt": 16, "repeat": 16, "fa1": 16, "fb": 16, "fc": 16, "fa2": 16, "1st": 16, "fa": 16, "100": 16, "101": 16, "102": 16, "assemblyobj": 16, "100bp": 16, "101bp": 16, "102bp": 16, "231": 16, "166": 16, "36": 16, "cdseguid": 16, "85t6tfcvwav0wnxeib": 16, "lkutrl4": 16, "excel": 16, "shell_command_for_editor": 16, "tmpdir": 16, "temprari": 16, "tclsh8": 16, "apeextractor": 16, "vf": 16, "app": 16, "seq_to_open": 16, "interpol": 16, "mwstd": 16, "gel_length": 16, "600": 16, "margin": 16, "_mwstd": 16, "pydna_email": 16, "easiest": 16, "permanantli": 16, "users_email": 16, "contact": 16, "bjornjobb": 16, "gmail": 16, "rec": 16, "lp002422": 16, "cs570233": 16, "nuclotid": 16, "parament": 16, "connect": 16, "pat": 16, "patent": 16, "wo2007025016": 16, "artifici": 16, "shaw": 16, "cottenoir": 16, "inhibit": 16, "metallo": 16, "wo": 16, "2007025016": 16, "a1": 16, "texa": 16, "tech": 16, "unassign": 16, "32630": 16, "aptam": 16, "inhibitor": 16, "atgttcctac": 16, "enough": 16, "almost": 16, "lift": 16, "biojson": 16, "levskaya": 16, "anselm": 16, "accompani": 16, "softwar": 16, "fring": 16, "json": 16, "field": 16, "surviv": 16, "roundtrip": 16, "jseq": 16, "gbtext": 16, "parsegbloc": 16, "l_": 16, "retwingl": 16, "strip_multilin": 16, "toint": 16, "strip_ind": 16, "concat_dict": 16, "dlist": 16, "val": 16, "duplic": 16, "tojson": 16, "gbkstring": 16, "wrapstr": 16, "str_": 16, "rowstart": 16, "rowend": 16, "padfirst": 16, "wrap": 16, "pad": 16, "locstr": 16, "loc": 16, "combo": 16, "originstr": 16, "ala": 16, "togb": 16, "new_dna": 16, "apeinfo": 16, "methyl": 16, "anaconda3": 16, "bjorn36": 16, "python3": 16, "scanner": 16, "1388": 16, "biopythonparserwarn": 16, "python_packag": 16, "pop": 16, "indexerror": 16, "dure": 16, "No": 16, "s2": 16, "j2": 16, "s3": 16, "item": 16, "pydna_cod": 16, "biopython_cod": 16, "pydna_prim": 16, "convens": 16, "begin": 16, "2_third_prim": 16, "tgagtagtcgtagtcgtcgtat": 16, "1_second_prim": 16, "tgatcgtcatgctgactatactat": 16, "0_first_prim": 16, "ctaggatcgtagatctagctg": 16, "primerlist": 16, "funtion": 16, "primerdict": 16, "initlist": 16, "pathlib": 16, "userlist": 16, "assign_numbers_to_new_prim": 16, "assign_numb": 16, "lst": 16, "pydna_code_from_list": 16, "open_fold": 16, "check_primer_numb": 16, "pl": 16, "undefined_sequ": 16, "find_duplicate_prim": 16, "extract_from_text": 16, "embl_gb_fasta": 16, "greedi": 16, "carefulli": 16, "absolut": 16, "mode": 16, "mix": 16, "footprint": 16, "thrown": 16, "_pretty_str": 16, "instread": 16, "nicer": 16, "from_bio_seqrecord": 16, "sr": 16, "pydnaseqrecord": 16, "detect": 16, "accord": 16, "ncbi": 16, "atgaaa": 16, "atttaa": 16, "nlm": 16, "nih": 16, "gov": 16, "wprintgc": 16, "cgi": 16, "add_colors_to_features_for_ap": 16, "color": 16, "ft2": 16, "part_nam": 16, "dbxref": 16, "gattaca": 16, "bkgnebmkia5kng": 16, "gf7iorxmniu": 16, "lsseguid": 16, "tp2jzecm2e3w4yxtrrx09cmka_8": 16, "christophchamp": 16, "php": 16, "newcom": 16, "datefunct": 16, "fore": 16, "lseguid": 16, "gbw0jp907tg_yx3jngs4qqwttju": 16, "gbw0jp907tg_yx3jngs4qqwttj": 16, "ccccc": 16, "gc": 16, "sce": 16, "rarecodon": 16, "startcodon": 16, "stopcodon": 16, "dump": 16, "protocol": 16, "proteinseqrecord": 16, "strict": 16, "c_seq": 16, "nn_tabl": 16, "_mt": 16, "dna_nn4": 16, "tmm_tabl": 16, "imm_tabl": 16, "de_tabl": 16, "dnac1": 16, "500": 16, "dnac2": 16, "selfcomp": 16, "75": 16, "mg": 16, "dntp": 16, "saltcorr": 16, "tm_nn": 16, "tm_dbd": 16, "dna_nn3": 16, "250": 16, "tm_product": 16, "050": 16, "spencer": 16, "rhoad": 16, "optim": 16, "ing": 16, "vitro": 16, "2243783": 16, "ta_default": 16, "salt": 16, "monoval": 16, "cation": 16, "ta_dbd": 16, "taq": 16, "tmf": 16, "____": 16, "_____": 16, "72": 16, "tmr": 16, "3min": 16, "kb": 16, "______": 16, "5min": 16, "1051bp": 16, "taq_program": 16, "pfu": 16, "sso7d": 16, "53": 16, "54": 16, "82": 16, "84": 16, "15058bp": 16, "pfu_sso7d_program": 16, "q5": 16, "1c": 16, "72c": 16, "3c": 16, "tmbresluc": 16, "primerc": 16, "saltc": 16, "nm": 16, "mm": 16, "thermodynam": 16, "stdout": 16, "debug": 16, "conc": 16, "prodcod": 16, "temp": 16, "primer1": 16, "nebswebsit": 16, "tmapi": 16, "productcod": 16, "miscellan": 16, "three_frame_orf": 16, "atg": 16, "tag": 16, "shift_loc": 16, "original_loc": 16, "lim": 16, "shift_featur": 16, "smallest": 16, "pierr": 16, "duval": 16, "jean": 16, "1983": 16, "alphabet": 16, "technologi": 16, "decemb": 16, "363": 16, "381": 16, "lyndon": 16, "david": 16, "eppstein": 16, "2011": 16, "gist": 16, "dvberkel": 16, "1950267": 16, "taaa": 16, "_weight": 16, "yet": 16, "strorbyt": 16, "memor": 16, "identifier_from_str": 16, "down": 16, "bytearrai": 16, "seq31": 16, "amino": 16, "asx": 16, "xle": 16, "xaa": 16, "sel": 16, "pyl": 16, "plu": 16, "ter": 16, "asterisk": 16, "unknown": 16, "sequtil": 16, "seq3": 16, "maivmgrwkgar": 16, "metalailevalmetglyargtrplysglyalaargt": 16, "randomrna": 16, "maxlength": 16, "randomdna": 16, "randomorf": 16, "randomprot": 16, "compar": 16, "equal": 16, "considi": 16, "insensit": 16, "permut": 16, "concaten": 16, "deduc": 16, "ataa": 16, "ggatcca": 16, "tggatcc": 16, "cuts_overlap": 16, "seq_len": 16, "location_boundari": 16, "locations_overlap": 16, "loc1": 16, "loc2": 16}, "objects": {"": [[16, 0, 0, "-", "pydna"]], "pydna": [[16, 0, 0, "-", "amplicon"], [16, 0, 0, "-", "amplify"], [16, 0, 0, "-", "assembly"], [16, 0, 0, "-", "common_sub_strings"], [16, 0, 0, "-", "contig"], [16, 0, 0, "-", "design"], [16, 0, 0, "-", "download"], [16, 0, 0, "-", "dseq"], [16, 0, 0, "-", "dseqrecord"], [16, 0, 0, "-", "editor"], [16, 0, 0, "-", "gel"], [16, 0, 0, "-", "genbank"], [16, 0, 0, "-", "genbankfile"], [16, 0, 0, "-", "genbankfixer"], [16, 0, 0, "-", "genbankrecord"], [16, 5, 1, "", "get_env"], [16, 5, 1, "", "logo"], [16, 0, 0, "-", "myprimers"], [16, 5, 1, "", "open_cache_folder"], [16, 5, 1, "", "open_config_folder"], [16, 5, 1, "", "open_current_folder"], [16, 5, 1, "", "open_log_folder"], [16, 0, 0, "-", "parsers"], [16, 0, 0, "-", "primer"], [16, 0, 0, "-", "readers"], [16, 0, 0, "-", "seqrecord"], [16, 0, 0, "-", "tm"], [16, 0, 0, "-", "utils"]], "pydna.amplicon": [[16, 1, 1, "", "Amplicon"]], "pydna.amplicon.Amplicon": [[16, 2, 1, "", "dbd_program"], [16, 2, 1, "", "figure"], [16, 2, 1, "", "from_SeqRecord"], [16, 2, 1, "", "primers"], [16, 2, 1, "", "program"], [16, 2, 1, "", "rc"], [16, 2, 1, "", "reverse_complement"], [16, 2, 1, "", "set_forward_primer_footprint"], [16, 2, 1, "", "set_reverse_primer_footprint"]], "pydna.amplify": [[16, 1, 1, "", "Anneal"], [16, 5, 1, "", "pcr"]], "pydna.amplify.Anneal": [[16, 3, 1, "", "forward_primers"], [16, 3, 1, "", "limit"], [16, 4, 1, "", "products"], [16, 2, 1, "", "report"], [16, 3, 1, "", "reverse_primers"], [16, 3, 1, "", "template"]], "pydna.assembly": [[16, 1, 1, "", "Assembly"]], "pydna.assembly.Assembly": [[16, 2, 1, "", "assemble_circular"], [16, 2, 1, "", "assemble_linear"]], "pydna.common_sub_strings": [[16, 5, 1, "", "common_sub_strings"], [16, 5, 1, "", "terminal_overlap"]], "pydna.contig": [[16, 1, 1, "", "Contig"]], "pydna.contig.Contig": [[16, 2, 1, "", "detailed_figure"], [16, 2, 1, "", "figure"], [16, 2, 1, "", "from_SeqRecord"], [16, 2, 1, "", "from_string"], [16, 2, 1, "", "rc"], [16, 2, 1, "", "reverse_complement"]], "pydna.design": [[16, 5, 1, "", "assembly_fragments"], [16, 5, 1, "", "circular_assembly_fragments"], [16, 5, 1, "", "primer_design"]], "pydna.dseq": [[16, 1, 1, "", "Dseq"]], "pydna.dseq.Dseq": [[16, 2, 1, "", "T4"], [16, 2, 1, "", "apply_cut"], [16, 2, 1, "", "cas9"], [16, 2, 1, "", "cut"], [16, 2, 1, "", "cutsite_is_valid"], [16, 2, 1, "", "cutters"], [16, 2, 1, "", "exo1_end"], [16, 2, 1, "", "exo1_front"], [16, 2, 1, "", "fill_in"], [16, 2, 1, "", "find"], [16, 2, 1, "", "five_prime_end"], [16, 2, 1, "", "from_full_sequence_and_overhangs"], [16, 2, 1, "", "from_representation"], [16, 2, 1, "", "from_string"], [16, 2, 1, "", "get_cut_parameters"], [16, 2, 1, "", "get_cutsite_pairs"], [16, 2, 1, "", "get_cutsites"], [16, 2, 1, "", "isblunt"], [16, 2, 1, "", "left_end_position"], [16, 2, 1, "", "looped"], [16, 2, 1, "", "lower"], [16, 2, 1, "", "mung"], [16, 2, 1, "", "mw"], [16, 2, 1, "", "n_cutters"], [16, 2, 1, "", "no_cutters"], [16, 2, 1, "", "once_cutters"], [16, 2, 1, "", "quick"], [16, 2, 1, "", "rc"], [16, 2, 1, "", "reverse_complement"], [16, 2, 1, "", "right_end_position"], [16, 2, 1, "", "seguid"], [16, 2, 1, "", "shifted"], [16, 2, 1, "", "t4"], [16, 2, 1, "", "terminal_transferase"], [16, 2, 1, "", "three_prime_end"], [16, 2, 1, "", "tolinear"], [16, 2, 1, "", "transcribe"], [16, 2, 1, "", "translate"], [16, 3, 1, "", "trunc"], [16, 2, 1, "", "twice_cutters"], [16, 2, 1, "", "unique_cutters"], [16, 2, 1, "", "upper"], [16, 2, 1, "", "watson_ovhg"]], "pydna.dseqrecord": [[16, 1, 1, "", "Dseqrecord"]], "pydna.dseqrecord.Dseqrecord": [[16, 2, 1, "", "add_feature"], [16, 2, 1, "", "apply_cut"], [16, 2, 1, "", "cas9"], [16, 4, 1, "", "circular"], [16, 2, 1, "", "copy_fasta_to_clipboard"], [16, 2, 1, "", "copy_gb_to_clipboard"], [16, 2, 1, "", "cut"], [16, 2, 1, "", "cutters"], [16, 2, 1, "", "extract_feature"], [16, 2, 1, "", "figure"], [16, 2, 1, "", "find"], [16, 2, 1, "", "find_aa"], [16, 2, 1, "", "find_aminoacids"], [16, 2, 1, "", "format"], [16, 2, 1, "", "from_SeqRecord"], [16, 2, 1, "", "from_string"], [16, 2, 1, "", "linearize"], [16, 2, 1, "", "looped"], [16, 2, 1, "", "lower"], [16, 2, 1, "", "m"], [16, 2, 1, "", "map_trace_files"], [16, 2, 1, "", "n_cutters"], [16, 2, 1, "", "no_cutters"], [16, 2, 1, "", "number_of_cuts"], [16, 2, 1, "", "once_cutters"], [16, 2, 1, "", "orfs"], [16, 2, 1, "", "orfs_to_features"], [16, 2, 1, "", "rc"], [16, 2, 1, "", "reverse_complement"], [16, 2, 1, "", "seguid"], [16, 2, 1, "", "shifted"], [16, 2, 1, "", "synced"], [16, 2, 1, "", "terminal_transferase"], [16, 2, 1, "", "tolinear"], [16, 2, 1, "", "twice_cutters"], [16, 2, 1, "", "unique_cutters"], [16, 2, 1, "", "upper"], [16, 2, 1, "", "write"]], "pydna.editor": [[16, 1, 1, "", "Editor"], [16, 5, 1, "", "ape"]], "pydna.editor.Editor": [[16, 2, 1, "", "open"]], "pydna.gel": [[16, 5, 1, "", "gel"], [16, 5, 1, "", "interpolator"]], "pydna.genbank": [[16, 1, 1, "", "Genbank"], [16, 5, 1, "", "genbank"]], "pydna.genbank.Genbank": [[16, 2, 1, "", "nucleotide"]], "pydna.genbankfile": [[16, 1, 1, "", "GenbankFile"]], "pydna.genbankfile.GenbankFile": [[16, 2, 1, "", "from_SeqRecord"], [16, 2, 1, "", "rc"], [16, 2, 1, "", "reverse_complement"]], "pydna.genbankfixer": [[16, 5, 1, "", "concat_dict"], [16, 5, 1, "", "gbtext_clean"], [16, 5, 1, "", "locstr"], [16, 5, 1, "", "originstr"], [16, 5, 1, "", "parseGBLoc"], [16, 5, 1, "", "strip_indent"], [16, 5, 1, "", "strip_multiline"], [16, 5, 1, "", "toGB"], [16, 5, 1, "", "toInt"], [16, 5, 1, "", "toJSON"], [16, 5, 1, "", "wrapstring"]], "pydna.genbankrecord": [[16, 1, 1, "", "GenbankRecord"]], "pydna.genbankrecord.GenbankRecord": [[16, 2, 1, "", "biopython_code"], [16, 2, 1, "", "from_SeqRecord"], [16, 2, 1, "", "from_string"], [16, 2, 1, "", "pydna_code"], [16, 2, 1, "", "rc"], [16, 2, 1, "", "reverse_complement"]], "pydna.myprimers": [[16, 1, 1, "", "PrimerList"], [16, 5, 1, "", "check_primer_numbers"], [16, 5, 1, "", "find_duplicate_primers"], [16, 5, 1, "", "undefined_sequence"]], "pydna.myprimers.PrimerList": [[16, 4, 1, "", "accessed"], [16, 2, 1, "", "assign_numbers"], [16, 2, 1, "", "code"], [16, 2, 1, "", "open_folder"], [16, 2, 1, "", "pydna_code_from_list"]], "pydna.parsers": [[16, 5, 1, "", "embl_gb_fasta"], [16, 5, 1, "", "extract_from_text"], [16, 5, 1, "", "parse"], [16, 5, 1, "", "parse_primers"]], "pydna.primer": [[16, 1, 1, "", "Primer"]], "pydna.primer.Primer": [[16, 4, 1, "", "footprint"], [16, 2, 1, "", "reverse_complement"], [16, 4, 1, "", "tail"]], "pydna.readers": [[16, 5, 1, "", "read"], [16, 5, 1, "", "read_primer"]], "pydna.seqrecord": [[16, 1, 1, "", "ProteinSeqRecord"], [16, 1, 1, "", "SeqRecord"]], "pydna.seqrecord.ProteinSeqRecord": [[16, 2, 1, "", "cai"], [16, 2, 1, "", "express"], [16, 2, 1, "", "gc"], [16, 2, 1, "", "isorf"], [16, 2, 1, "", "rarecodons"], [16, 2, 1, "", "rc"], [16, 2, 1, "", "reverse_complement"], [16, 2, 1, "", "startcodon"], [16, 2, 1, "", "stopcodon"]], "pydna.seqrecord.SeqRecord": [[16, 4, 1, "", "accession"], [16, 2, 1, "", "add_colors_to_features_for_ape"], [16, 2, 1, "", "add_feature"], [16, 2, 1, "", "cai"], [16, 2, 1, "", "comment"], [16, 2, 1, "", "copy"], [16, 2, 1, "", "datefunction"], [16, 4, 1, "", "definition"], [16, 2, 1, "", "dump"], [16, 2, 1, "", "express"], [16, 2, 1, "", "extract_feature"], [16, 2, 1, "", "from_Bio_SeqRecord"], [16, 2, 1, "", "gc"], [16, 2, 1, "", "isorf"], [16, 2, 1, "", "lcs"], [16, 2, 1, "", "list_features"], [16, 4, 1, "", "locus"], [16, 2, 1, "", "rarecodons"], [16, 2, 1, "", "rc"], [16, 2, 1, "", "reverse_complement"], [16, 2, 1, "", "seguid"], [16, 2, 1, "", "sorted_features"], [16, 2, 1, "", "stamp"], [16, 2, 1, "", "startcodon"], [16, 2, 1, "", "stopcodon"], [16, 2, 1, "", "translate"]], "pydna.tm": [[16, 5, 1, "", "Q5"], [16, 5, 1, "", "dbd_program"], [16, 5, 1, "", "pfu_sso7d_program"], [16, 5, 1, "", "program"], [16, 5, 1, "", "ta_dbd"], [16, 5, 1, "", "ta_default"], [16, 5, 1, "", "taq_program"], [16, 5, 1, "", "tm_dbd"], [16, 5, 1, "", "tm_default"], [16, 5, 1, "", "tm_neb"], [16, 5, 1, "", "tm_product"], [16, 5, 1, "", "tmbresluc"]], "pydna.utils": [[16, 5, 1, "", "cai"], [16, 5, 1, "", "complement"], [16, 5, 1, "", "cuts_overlap"], [16, 5, 1, "", "eq"], [16, 5, 1, "", "express"], [16, 5, 1, "", "flatten"], [16, 5, 1, "", "identifier_from_string"], [16, 5, 1, "", "location_boundaries"], [16, 5, 1, "", "locations_overlap"], [16, 5, 1, "", "memorize"], [16, 5, 1, "", "open_folder"], [16, 5, 1, "", "randomDNA"], [16, 5, 1, "", "randomORF"], [16, 5, 1, "", "randomRNA"], [16, 5, 1, "", "randomprot"], [16, 5, 1, "", "rarecodons"], [16, 5, 1, "", "rc"], [16, 5, 1, "", "seq31"], [16, 5, 1, "", "shift_feature"], [16, 5, 1, "", "shift_location"], [16, 5, 1, "", "smallest_rotation"], [16, 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, 7], "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, "exampl": [1, 9, 10, 15, 16], "galleri": 1, "get": [2, 16], "start": 2, "pydna": [3, 5, 6, 9, 11, 12, 13, 16], "welcom": 3, "": 3, "document": [3, 16], "instal": 4, "clipboard": 4, "download": [4, 16], "express": 4, "gel": [4, 16], "pip": 4, "poetri": 4, "how": [5, 13, 16], "model": [5, 13], "crispr": [5, 8], "cas9": [5, 8], "experi": 5, "repres": 6, "sequenc": [6, 12], "dseq": [6, 16], "class": [6, 7], "getitem": 6, "repr": 6, "str": 6, "method": [6, 7], "slice": 6, "__getitem__": 6, "circular": [6, 14], "print": 6, "consol": 6, "__repr__": 6, "__str__": 6, "edg": 6, "case": 6, "work": [7, 8], "featur": [7, 14], "us": [7, 16], "dseqrecord": [7, 16], "qualifi": 7, "part": 7, "standard": 7, "type": 7, "handl": 7, "origin": 7, "span": 7, "other": [7, 13], "view": [7, 12], "remov": 7, "implement": 8, "oligonucleotid": 8, "base": 8, "toolbox": 8, "effici": 8, "engin": 8, "komagataella": 8, "phaffii": 8, "import": [8, 12], "gene": 8, "we": 8, "ar": 8, "go": 8, "gibson": [9, 11], "assembli": [9, 11, 16], "plasmid": 10, "restrict": [10, 14], "ligat": [10, 14], "clone": 10, "file": 12, "from": 12, "string": 12, "extra": [12, 14], "info": 12, "perform": 13, "polymeras": 13, "chain": 13, "reaction": 13, "pcr": 13, "known": 13, "primer": [13, 16], "wai": 13, "visualis": 13, "product": 13, "design": [13, 16], "calcul": 13, "tm": [13, 16], "cut": 14, "one": 14, "more": [14, 16], "enzym": 14, "fragment": 14, "note": 14, "what": 14, "happen": 14, "when": 14, "readm": 15, "modul": 16, "content": 16, "packag": 16, "layout": 16, "sourc": 16, "code": 16, "help": 16, "amplicon": 16, "amplifi": 16, "common_sub_str": 16, "contig": 16, "editor": 16, "genbank": 16, "genbankfil": 16, "genbankfix": 16, "genbankrecord": 16, "myprim": 16, "parser": 16, "reader": 16, "seqrecord": 16, "util": 16}, "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"]], "Example gallery": [[1, "example-gallery"]], "Getting started": [[2, "getting-started"]], "Pydna": [[3, "pydna"]], "Welcome to pydna\u2019s documentation!": [[3, "welcome-to-pydna-s-documentation"]], "Installation": [[4, "installation"]], "clipboard": [[4, "clipboard"]], "download": [[4, "download"]], "express": [[4, "express"]], "gel": [[4, "gel"]], "Installing with pip \ud83d\udc0d": [[4, "installing-with-pip"]], "Installing with poetry \ud83e\uddd9\u200d\u2642\ufe0f": [[4, "installing-with-poetry"]], "How to Model CRISPR-Cas9 Experiments in pydna": [[5, "how-to-model-crispr-cas9-experiments-in-pydna"]], "Representing sequences in pydna": [[6, "representing-sequences-in-pydna"]], "Dseq Class": [[6, "dseq-class"]], "getitem, repr, and str methods": [[6, "getitem-repr-and-str-methods"]], "Slicing sequences (__getitem__)": [[6, "slicing-sequences-getitem"]], "Slicing circular sequences": [[6, "slicing-circular-sequences"]], "Printing sequences to the console: __repr__ and __str__": [[6, "printing-sequences-to-the-console-repr-and-str"]], "Edge cases": [[6, "edge-cases"]], "Working with Features using the Dseqrecord class": [[7, "working-with-features-using-the-dseqrecord-class"]], "Adding Features and Qualifiers": [[7, "adding-features-and-qualifiers"]], "Adding a Feature with Parts": [[7, "adding-a-feature-with-parts"]], "Standard Feature Types and Qualifiers": [[7, "standard-feature-types-and-qualifiers"]], "Handling Origin Spanning Features": [[7, "handling-origin-spanning-features"]], "Other Methods to Viewing Features": [[7, "other-methods-to-viewing-features"]], "Removing Features": [[7, "removing-features"]], "Implementation of Oligonucleotide-based CRISPR-Cas9 toolbox for efficient engineering of Komagataella phaffii": [[8, "implementation-of-oligonucleotide-based-crispr-cas9-toolbox-for-efficient-engineering-of-komagataella-phaffii"]], "Import the gene we are going to work with": [[8, "import-the-gene-we-are-going-to-work-with"]], "Example of a Gibson Assembly in pydna": [[9, "example-of-a-gibson-assembly-in-pydna"]], "Example of a Plasmid Restriction/Ligation Cloning": [[10, "example-of-a-plasmid-restriction-ligation-cloning"]], "Gibson Assembly in pydna": [[11, "gibson-assembly-in-pydna"]], "Importing and viewing sequence files in pydna": [[12, "importing-and-viewing-sequence-files-in-pydna"]], "Importing Sequence Files": [[12, "importing-sequence-files"]], "Importing Sequences from Strings": [[12, "importing-sequences-from-strings"]], "Extra info": [[12, "extra-info"]], "How to Perform a Polymerase Chain Reaction (PCR)": [[13, "how-to-perform-a-polymerase-chain-reaction-pcr"]], "Modelling PCR with Known Primers": [[13, "modelling-pcr-with-known-primers"]], "Other ways of visualising the PCR products": [[13, "other-ways-of-visualising-the-pcr-products"]], "Designing Primers and Calculating Tm in pydna": [[13, "designing-primers-and-calculating-tm-in-pydna"]], "Calculating Tm": [[13, "calculating-tm"]], "Restriction and Ligation": [[14, "restriction-and-ligation"]], "Cutting with one or more restriction enzymes": [[14, "cutting-with-one-or-more-restriction-enzymes"]], "Ligating fragments": [[14, "ligating-fragments"]], "Circularizing fragments": [[14, "circularizing-fragments"]], "Extra Notes: What happens to features when cutting/ligating?": [[14, "extra-notes-what-happens-to-features-when-cutting-ligating"]], "README Example": [[15, "readme-example"]], "Module contents": [[16, "module-contents"]], "pydna": [[16, "module-pydna"], [16, "id1"]], "pydna package layout": [[16, "pydna-package-layout"]], "How to use the documentation": [[16, "how-to-use-the-documentation"]], "pydna source code": [[16, "pydna-source-code"]], "How to get more help": [[16, "how-to-get-more-help"]], "Examples of pydna in use": [[16, "examples-of-pydna-in-use"]], "pydna.dseq": [[16, "module-pydna.dseq"]], "pydna.dseqrecord": [[16, "module-pydna.dseqrecord"]], "pydna.amplicon": [[16, "module-pydna.amplicon"]], "pydna.amplify": [[16, "module-pydna.amplify"]], "pydna.assembly": [[16, "module-pydna.assembly"]], "pydna.common_sub_strings": [[16, "module-pydna.common_sub_strings"]], "pydna.contig": [[16, "module-pydna.contig"]], "pydna.design": [[16, "module-pydna.design"]], "pydna.download": [[16, "module-pydna.download"]], "pydna.editor": [[16, "module-pydna.editor"]], "pydna.gel": [[16, "module-pydna.gel"]], "pydna.genbank": [[16, "module-pydna.genbank"]], "pydna.genbankfile": [[16, "module-pydna.genbankfile"]], "pydna.genbankfixer": [[16, "module-pydna.genbankfixer"]], "pydna.genbankrecord": [[16, "module-pydna.genbankrecord"]], "pydna.myprimers": [[16, "module-pydna.myprimers"]], "pydna.parsers": [[16, "module-pydna.parsers"]], "pydna.primer": [[16, "module-pydna.primer"]], "pydna.readers": [[16, "module-pydna.readers"]], "pydna.seqrecord": [[16, "module-pydna.seqrecord"]], "pydna.tm": [[16, "module-pydna.tm"]], "pydna.utils": [[16, "module-pydna.utils"]]}, "indexentries": {"amplicon (class in pydna.amplicon)": [[16, "pydna.amplicon.Amplicon"]], "anneal (class in pydna.amplify)": [[16, "pydna.amplify.Anneal"]], "assembly (class in pydna.assembly)": [[16, "pydna.assembly.Assembly"]], "contig (class in pydna.contig)": [[16, "pydna.contig.Contig"]], "dseq (class in pydna.dseq)": [[16, "pydna.dseq.Dseq"]], "dseqrecord (class in pydna.dseqrecord)": [[16, "pydna.dseqrecord.Dseqrecord"]], "editor (class in pydna.editor)": [[16, "pydna.editor.Editor"]], "genbank (class in pydna.genbank)": [[16, "pydna.genbank.Genbank"]], "genbankfile (class in pydna.genbankfile)": [[16, "pydna.genbankfile.GenbankFile"]], "genbankrecord (class in pydna.genbankrecord)": [[16, "pydna.genbankrecord.GenbankRecord"]], "primer (class in pydna.primer)": [[16, "pydna.primer.Primer"]], "primerlist (class in pydna.myprimers)": [[16, "pydna.myprimers.PrimerList"]], "proteinseqrecord (class in pydna.seqrecord)": [[16, "pydna.seqrecord.ProteinSeqRecord"]], "q5() (in module pydna.tm)": [[16, "pydna.tm.Q5"]], "seqrecord (class in pydna.seqrecord)": [[16, "pydna.seqrecord.SeqRecord"]], "t4() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.T4"], [16, "pydna.dseq.Dseq.t4"]], "accessed (pydna.myprimers.primerlist property)": [[16, "pydna.myprimers.PrimerList.accessed"]], "accession (pydna.seqrecord.seqrecord property)": [[16, "pydna.seqrecord.SeqRecord.accession"]], "add_colors_to_features_for_ape() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.add_colors_to_features_for_ape"]], "add_feature() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.add_feature"]], "add_feature() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.add_feature"]], "ape() (in module pydna.editor)": [[16, "pydna.editor.ape"]], "apply_cut() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.apply_cut"]], "apply_cut() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.apply_cut"]], "assemble_circular() (pydna.assembly.assembly method)": [[16, "pydna.assembly.Assembly.assemble_circular"]], "assemble_linear() (pydna.assembly.assembly method)": [[16, "pydna.assembly.Assembly.assemble_linear"]], "assembly_fragments() (in module pydna.design)": [[16, "pydna.design.assembly_fragments"]], "assign_numbers() (pydna.myprimers.primerlist method)": [[16, "pydna.myprimers.PrimerList.assign_numbers"]], "biopython_code() (pydna.genbankrecord.genbankrecord method)": [[16, "pydna.genbankrecord.GenbankRecord.biopython_code"]], "cai() (in module pydna.utils)": [[16, "pydna.utils.cai"]], "cai() (pydna.seqrecord.proteinseqrecord method)": [[16, "pydna.seqrecord.ProteinSeqRecord.cai"]], "cai() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.cai"]], "cas9() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.cas9"]], "cas9() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.cas9"]], "check_primer_numbers() (in module pydna.myprimers)": [[16, "pydna.myprimers.check_primer_numbers"]], "circular (pydna.dseqrecord.dseqrecord property)": [[16, "pydna.dseqrecord.Dseqrecord.circular"]], "circular_assembly_fragments() (in module pydna.design)": [[16, "pydna.design.circular_assembly_fragments"]], "code() (pydna.myprimers.primerlist method)": [[16, "pydna.myprimers.PrimerList.code"]], "comment() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.comment"]], "common_sub_strings() (in module pydna.common_sub_strings)": [[16, "pydna.common_sub_strings.common_sub_strings"]], "complement() (in module pydna.utils)": [[16, "pydna.utils.complement"]], "concat_dict() (in module pydna.genbankfixer)": [[16, "pydna.genbankfixer.concat_dict"]], "copy() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.copy"]], "copy_fasta_to_clipboard() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.copy_fasta_to_clipboard"]], "copy_gb_to_clipboard() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.copy_gb_to_clipboard"]], "cut() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.cut"]], "cut() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.cut"]], "cuts_overlap() (in module pydna.utils)": [[16, "pydna.utils.cuts_overlap"]], "cutsite_is_valid() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.cutsite_is_valid"]], "cutters() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.cutters"]], "cutters() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.cutters"]], "datefunction() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.datefunction"]], "dbd_program() (in module pydna.tm)": [[16, "pydna.tm.dbd_program"]], "dbd_program() (pydna.amplicon.amplicon method)": [[16, "pydna.amplicon.Amplicon.dbd_program"]], "definition (pydna.seqrecord.seqrecord property)": [[16, "pydna.seqrecord.SeqRecord.definition"]], "detailed_figure() (pydna.contig.contig method)": [[16, "pydna.contig.Contig.detailed_figure"]], "dump() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.dump"]], "embl_gb_fasta() (in module pydna.parsers)": [[16, "pydna.parsers.embl_gb_fasta"]], "eq() (in module pydna.utils)": [[16, "pydna.utils.eq"]], "exo1_end() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.exo1_end"]], "exo1_front() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.exo1_front"]], "express() (in module pydna.utils)": [[16, "pydna.utils.express"]], "express() (pydna.seqrecord.proteinseqrecord method)": [[16, "pydna.seqrecord.ProteinSeqRecord.express"]], "express() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.express"]], "extract_feature() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.extract_feature"]], "extract_feature() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.extract_feature"]], "extract_from_text() (in module pydna.parsers)": [[16, "pydna.parsers.extract_from_text"]], "figure() (pydna.amplicon.amplicon method)": [[16, "pydna.amplicon.Amplicon.figure"]], "figure() (pydna.contig.contig method)": [[16, "pydna.contig.Contig.figure"]], "figure() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.figure"]], "fill_in() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.fill_in"]], "find() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.find"]], "find() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.find"]], "find_aa() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.find_aa"]], "find_aminoacids() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.find_aminoacids"]], "find_duplicate_primers() (in module pydna.myprimers)": [[16, "pydna.myprimers.find_duplicate_primers"]], "five_prime_end() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.five_prime_end"]], "flatten() (in module pydna.utils)": [[16, "pydna.utils.flatten"]], "footprint (pydna.primer.primer property)": [[16, "pydna.primer.Primer.footprint"]], "format() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.format"]], "forward_primers (pydna.amplify.anneal attribute)": [[16, "pydna.amplify.Anneal.forward_primers"]], "from_bio_seqrecord() (pydna.seqrecord.seqrecord class method)": [[16, "pydna.seqrecord.SeqRecord.from_Bio_SeqRecord"]], "from_seqrecord() (pydna.amplicon.amplicon class method)": [[16, "pydna.amplicon.Amplicon.from_SeqRecord"]], "from_seqrecord() (pydna.contig.contig class method)": [[16, "pydna.contig.Contig.from_SeqRecord"]], "from_seqrecord() (pydna.dseqrecord.dseqrecord class method)": [[16, "pydna.dseqrecord.Dseqrecord.from_SeqRecord"]], "from_seqrecord() (pydna.genbankfile.genbankfile class method)": [[16, "pydna.genbankfile.GenbankFile.from_SeqRecord"]], "from_seqrecord() (pydna.genbankrecord.genbankrecord class method)": [[16, "pydna.genbankrecord.GenbankRecord.from_SeqRecord"]], "from_full_sequence_and_overhangs() (pydna.dseq.dseq class method)": [[16, "pydna.dseq.Dseq.from_full_sequence_and_overhangs"]], "from_representation() (pydna.dseq.dseq class method)": [[16, "pydna.dseq.Dseq.from_representation"]], "from_string() (pydna.contig.contig class method)": [[16, "pydna.contig.Contig.from_string"]], "from_string() (pydna.dseq.dseq class method)": [[16, "pydna.dseq.Dseq.from_string"]], "from_string() (pydna.dseqrecord.dseqrecord class method)": [[16, "pydna.dseqrecord.Dseqrecord.from_string"]], "from_string() (pydna.genbankrecord.genbankrecord class method)": [[16, "pydna.genbankrecord.GenbankRecord.from_string"]], "gbtext_clean() (in module pydna.genbankfixer)": [[16, "pydna.genbankfixer.gbtext_clean"]], "gc() (pydna.seqrecord.proteinseqrecord method)": [[16, "pydna.seqrecord.ProteinSeqRecord.gc"]], "gc() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.gc"]], "gel() (in module pydna.gel)": [[16, "pydna.gel.gel"]], "genbank() (in module pydna.genbank)": [[16, "pydna.genbank.genbank"]], "get_cut_parameters() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.get_cut_parameters"]], "get_cutsite_pairs() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.get_cutsite_pairs"]], "get_cutsites() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.get_cutsites"]], "get_env() (in module pydna)": [[16, "pydna.get_env"]], "identifier_from_string() (in module pydna.utils)": [[16, "pydna.utils.identifier_from_string"]], "interpolator() (in module pydna.gel)": [[16, "pydna.gel.interpolator"]], "isblunt() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.isblunt"]], "isorf() (pydna.seqrecord.proteinseqrecord method)": [[16, "pydna.seqrecord.ProteinSeqRecord.isorf"]], "isorf() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.isorf"]], "lcs() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.lcs"]], "left_end_position() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.left_end_position"]], "limit (pydna.amplify.anneal attribute)": [[16, "pydna.amplify.Anneal.limit"]], "linearize() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.linearize"]], "list_features() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.list_features"]], "location_boundaries() (in module pydna.utils)": [[16, "pydna.utils.location_boundaries"]], "locations_overlap() (in module pydna.utils)": [[16, "pydna.utils.locations_overlap"]], "locstr() (in module pydna.genbankfixer)": [[16, "pydna.genbankfixer.locstr"]], "locus (pydna.seqrecord.seqrecord property)": [[16, "pydna.seqrecord.SeqRecord.locus"]], "logo() (in module pydna)": [[16, "pydna.logo"]], "looped() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.looped"]], "looped() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.looped"]], "lower() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.lower"]], "lower() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.lower"]], "m() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.m"]], "map_trace_files() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.map_trace_files"]], "memorize() (in module pydna.utils)": [[16, "pydna.utils.memorize"]], "module": [[16, "module-pydna"], [16, "module-pydna.amplicon"], [16, "module-pydna.amplify"], [16, "module-pydna.assembly"], [16, "module-pydna.common_sub_strings"], [16, "module-pydna.contig"], [16, "module-pydna.design"], [16, "module-pydna.download"], [16, "module-pydna.dseq"], [16, "module-pydna.dseqrecord"], [16, "module-pydna.editor"], [16, "module-pydna.gel"], [16, "module-pydna.genbank"], [16, "module-pydna.genbankfile"], [16, "module-pydna.genbankfixer"], [16, "module-pydna.genbankrecord"], [16, "module-pydna.myprimers"], [16, "module-pydna.parsers"], [16, "module-pydna.primer"], [16, "module-pydna.readers"], [16, "module-pydna.seqrecord"], [16, "module-pydna.tm"], [16, "module-pydna.utils"]], "mung() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.mung"]], "mw() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.mw"]], "n_cutters() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.n_cutters"]], "n_cutters() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.n_cutters"]], "no_cutters() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.no_cutters"]], "no_cutters() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.no_cutters"]], "nucleotide() (pydna.genbank.genbank method)": [[16, "pydna.genbank.Genbank.nucleotide"]], "number_of_cuts() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.number_of_cuts"]], "once_cutters() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.once_cutters"]], "once_cutters() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.once_cutters"]], "open() (pydna.editor.editor method)": [[16, "pydna.editor.Editor.open"]], "open_cache_folder() (in module pydna)": [[16, "pydna.open_cache_folder"]], "open_config_folder() (in module pydna)": [[16, "pydna.open_config_folder"]], "open_current_folder() (in module pydna)": [[16, "pydna.open_current_folder"]], "open_folder() (in module pydna.utils)": [[16, "pydna.utils.open_folder"]], "open_folder() (pydna.myprimers.primerlist method)": [[16, "pydna.myprimers.PrimerList.open_folder"]], "open_log_folder() (in module pydna)": [[16, "pydna.open_log_folder"]], "orfs() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.orfs"]], "orfs_to_features() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.orfs_to_features"]], "originstr() (in module pydna.genbankfixer)": [[16, "pydna.genbankfixer.originstr"]], "parse() (in module pydna.parsers)": [[16, "pydna.parsers.parse"]], "parsegbloc() (in module pydna.genbankfixer)": [[16, "pydna.genbankfixer.parseGBLoc"]], "parse_primers() (in module pydna.parsers)": [[16, "pydna.parsers.parse_primers"]], "pcr() (in module pydna.amplify)": [[16, "pydna.amplify.pcr"]], "pfu_sso7d_program() (in module pydna.tm)": [[16, "pydna.tm.pfu_sso7d_program"]], "primer_design() (in module pydna.design)": [[16, "pydna.design.primer_design"]], "primers() (pydna.amplicon.amplicon method)": [[16, "pydna.amplicon.Amplicon.primers"]], "products (pydna.amplify.anneal property)": [[16, "pydna.amplify.Anneal.products"]], "program() (in module pydna.tm)": [[16, "pydna.tm.program"]], "program() (pydna.amplicon.amplicon method)": [[16, "pydna.amplicon.Amplicon.program"]], "pydna": [[16, "module-pydna"]], "pydna.amplicon": [[16, "module-pydna.amplicon"]], "pydna.amplify": [[16, "module-pydna.amplify"]], "pydna.assembly": [[16, "module-pydna.assembly"]], "pydna.common_sub_strings": [[16, "module-pydna.common_sub_strings"]], "pydna.contig": [[16, "module-pydna.contig"]], "pydna.design": [[16, "module-pydna.design"]], "pydna.download": [[16, "module-pydna.download"]], "pydna.dseq": [[16, "module-pydna.dseq"]], "pydna.dseqrecord": [[16, "module-pydna.dseqrecord"]], "pydna.editor": [[16, "module-pydna.editor"]], "pydna.gel": [[16, "module-pydna.gel"]], "pydna.genbank": [[16, "module-pydna.genbank"]], "pydna.genbankfile": [[16, "module-pydna.genbankfile"]], "pydna.genbankfixer": [[16, "module-pydna.genbankfixer"]], "pydna.genbankrecord": [[16, "module-pydna.genbankrecord"]], "pydna.myprimers": [[16, "module-pydna.myprimers"]], "pydna.parsers": [[16, "module-pydna.parsers"]], "pydna.primer": [[16, "module-pydna.primer"]], "pydna.readers": [[16, "module-pydna.readers"]], "pydna.seqrecord": [[16, "module-pydna.seqrecord"]], "pydna.tm": [[16, "module-pydna.tm"]], "pydna.utils": [[16, "module-pydna.utils"]], "pydna_code() (pydna.genbankrecord.genbankrecord method)": [[16, "pydna.genbankrecord.GenbankRecord.pydna_code"]], "pydna_code_from_list() (pydna.myprimers.primerlist method)": [[16, "pydna.myprimers.PrimerList.pydna_code_from_list"]], "quick() (pydna.dseq.dseq class method)": [[16, "pydna.dseq.Dseq.quick"]], "randomdna() (in module pydna.utils)": [[16, "pydna.utils.randomDNA"]], "randomorf() (in module pydna.utils)": [[16, "pydna.utils.randomORF"]], "randomrna() (in module pydna.utils)": [[16, "pydna.utils.randomRNA"]], "randomprot() (in module pydna.utils)": [[16, "pydna.utils.randomprot"]], "rarecodons() (in module pydna.utils)": [[16, "pydna.utils.rarecodons"]], "rarecodons() (pydna.seqrecord.proteinseqrecord method)": [[16, "pydna.seqrecord.ProteinSeqRecord.rarecodons"]], "rarecodons() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.rarecodons"]], "rc() (in module pydna.utils)": [[16, "pydna.utils.rc"]], "rc() (pydna.amplicon.amplicon method)": [[16, "pydna.amplicon.Amplicon.rc"]], "rc() (pydna.contig.contig method)": [[16, "pydna.contig.Contig.rc"]], "rc() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.rc"]], "rc() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.rc"]], "rc() (pydna.genbankfile.genbankfile method)": [[16, "pydna.genbankfile.GenbankFile.rc"]], "rc() (pydna.genbankrecord.genbankrecord method)": [[16, "pydna.genbankrecord.GenbankRecord.rc"]], "rc() (pydna.seqrecord.proteinseqrecord method)": [[16, "pydna.seqrecord.ProteinSeqRecord.rc"]], "rc() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.rc"]], "read() (in module pydna.readers)": [[16, "pydna.readers.read"]], "read_primer() (in module pydna.readers)": [[16, "pydna.readers.read_primer"]], "report() (pydna.amplify.anneal method)": [[16, "pydna.amplify.Anneal.report"]], "reverse_complement() (pydna.amplicon.amplicon method)": [[16, "pydna.amplicon.Amplicon.reverse_complement"]], "reverse_complement() (pydna.contig.contig method)": [[16, "pydna.contig.Contig.reverse_complement"]], "reverse_complement() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.reverse_complement"]], "reverse_complement() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.reverse_complement"]], "reverse_complement() (pydna.genbankfile.genbankfile method)": [[16, "pydna.genbankfile.GenbankFile.reverse_complement"]], "reverse_complement() (pydna.genbankrecord.genbankrecord method)": [[16, "pydna.genbankrecord.GenbankRecord.reverse_complement"]], "reverse_complement() (pydna.primer.primer method)": [[16, "pydna.primer.Primer.reverse_complement"]], "reverse_complement() (pydna.seqrecord.proteinseqrecord method)": [[16, "pydna.seqrecord.ProteinSeqRecord.reverse_complement"]], "reverse_complement() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.reverse_complement"]], "reverse_primers (pydna.amplify.anneal attribute)": [[16, "pydna.amplify.Anneal.reverse_primers"]], "right_end_position() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.right_end_position"]], "seguid() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.seguid"]], "seguid() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.seguid"]], "seguid() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.seguid"]], "seq31() (in module pydna.utils)": [[16, "pydna.utils.seq31"]], "set_forward_primer_footprint() (pydna.amplicon.amplicon method)": [[16, "pydna.amplicon.Amplicon.set_forward_primer_footprint"]], "set_reverse_primer_footprint() (pydna.amplicon.amplicon method)": [[16, "pydna.amplicon.Amplicon.set_reverse_primer_footprint"]], "shift_feature() (in module pydna.utils)": [[16, "pydna.utils.shift_feature"]], "shift_location() (in module pydna.utils)": [[16, "pydna.utils.shift_location"]], "shifted() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.shifted"]], "shifted() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.shifted"]], "smallest_rotation() (in module pydna.utils)": [[16, "pydna.utils.smallest_rotation"]], "sorted_features() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.sorted_features"]], "stamp() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.stamp"]], "startcodon() (pydna.seqrecord.proteinseqrecord method)": [[16, "pydna.seqrecord.ProteinSeqRecord.startcodon"]], "startcodon() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.startcodon"]], "stopcodon() (pydna.seqrecord.proteinseqrecord method)": [[16, "pydna.seqrecord.ProteinSeqRecord.stopcodon"]], "stopcodon() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.stopcodon"]], "strip_indent() (in module pydna.genbankfixer)": [[16, "pydna.genbankfixer.strip_indent"]], "strip_multiline() (in module pydna.genbankfixer)": [[16, "pydna.genbankfixer.strip_multiline"]], "synced() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.synced"]], "ta_dbd() (in module pydna.tm)": [[16, "pydna.tm.ta_dbd"]], "ta_default() (in module pydna.tm)": [[16, "pydna.tm.ta_default"]], "tail (pydna.primer.primer property)": [[16, "pydna.primer.Primer.tail"]], "taq_program() (in module pydna.tm)": [[16, "pydna.tm.taq_program"]], "template (pydna.amplify.anneal attribute)": [[16, "pydna.amplify.Anneal.template"]], "terminal_overlap() (in module pydna.common_sub_strings)": [[16, "pydna.common_sub_strings.terminal_overlap"]], "terminal_transferase() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.terminal_transferase"]], "terminal_transferase() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.terminal_transferase"]], "three_frame_orfs() (in module pydna.utils)": [[16, "pydna.utils.three_frame_orfs"]], "three_prime_end() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.three_prime_end"]], "tm_dbd() (in module pydna.tm)": [[16, "pydna.tm.tm_dbd"]], "tm_default() (in module pydna.tm)": [[16, "pydna.tm.tm_default"]], "tm_neb() (in module pydna.tm)": [[16, "pydna.tm.tm_neb"]], "tm_product() (in module pydna.tm)": [[16, "pydna.tm.tm_product"]], "tmbresluc() (in module pydna.tm)": [[16, "pydna.tm.tmbresluc"]], "togb() (in module pydna.genbankfixer)": [[16, "pydna.genbankfixer.toGB"]], "toint() (in module pydna.genbankfixer)": [[16, "pydna.genbankfixer.toInt"]], "tojson() (in module pydna.genbankfixer)": [[16, "pydna.genbankfixer.toJSON"]], "tolinear() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.tolinear"]], "tolinear() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.tolinear"]], "transcribe() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.transcribe"]], "translate() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.translate"]], "translate() (pydna.seqrecord.seqrecord method)": [[16, "pydna.seqrecord.SeqRecord.translate"]], "trunc (pydna.dseq.dseq attribute)": [[16, "pydna.dseq.Dseq.trunc"]], "twice_cutters() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.twice_cutters"]], "twice_cutters() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.twice_cutters"]], "undefined_sequence() (in module pydna.myprimers)": [[16, "pydna.myprimers.undefined_sequence"]], "unique_cutters() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.unique_cutters"]], "unique_cutters() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.unique_cutters"]], "upper() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.upper"]], "upper() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.upper"]], "watson_ovhg() (pydna.dseq.dseq method)": [[16, "pydna.dseq.Dseq.watson_ovhg"]], "wrapstring() (in module pydna.genbankfixer)": [[16, "pydna.genbankfixer.wrapstring"]], "write() (pydna.dseqrecord.dseqrecord method)": [[16, "pydna.dseqrecord.Dseqrecord.write"]]}}) \ No newline at end of file