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