Primerize (previously named NA_thermo), is an archive of Python and MATLAB scripts for primer design and nucleic acid thermodynamic scripts developed by the Das Lab at Stanford University for high-throughput RNA synthesis and design.
The algorithm designs forward (sense strand) and reverse (anti-sense strand) primers that minimize the total length, and therefore the total synthesis cost, of the oligonucleotides. Although developed independently, Primerize is a special case of the general ‘Gapped Oligo Design’ algorithm, optimizing the mispriming score and sequence span instead of Tm.
An online user-friendly GUI is available as the Primerize Server.
To install Primerize, simply:
cd path/to/Primerize/
python setup.py installFor system-wide installation, you must have permissions and use with sudo.
Primerize requires the following Python packages as dependencies, all of which can be installed through pip.
matplotlib >= 1.5.0
numpy >= 1.10.1
xlwt >= 1.0.0To speed up Primerize code, we take advantage of @jit decorator of numba on loop optimization. This is totally optional. Enabling such feature may speed up the run for up to 10x.
numba requires llvm, which can be installed through apt-get on Linux or brew on Mac OSX. It also requires llvmlite, which can be installed through pip. The compatibility between numba, llvmlite, and llvm needs to pay special attention to. The below specified numba and llvmlite versions have been tested to work with llvm 3.6.2 on Linux machines.
llvmlite == 0.8.0
numba == 0.23.1Or the following works with llvm 3.7.1.
llvmlite == 0.12.1
numba == 0.27.0Newer version combinations may work, but we haven't test since.
To test if Primerize is functioning properly in local installation, run the unit test scripts:
cd path/to/Primerize/tests/
python -m unittest discoverAll test cases should pass.
For simple Primer Design tasks, follow this example:
import primerize
prm_1d = primerize.Primerize_1D
job_1d = prm_1d.design('TTCTAATACGACTCACTATAGGCCAAAGGCGUCGAGUAGACGCCAACAACGGAAUUGCGGGAAAGGGGUCAACAGCCGUUCAGUACCAAGUCUCAGGGGAAACUUUGAGAUGGCCUUGCAAAGGGUAUGGUAAUAAGCUGACGGACAUGGUCCUAACCACGCAGCCAAGUCCUAAGUCAACAGAUCUUCUGUUGAUAUGGAUGCAGUUCAAAACCAAACCGUCAGCGAGUAGCUGACAAAAAGAAACAACAACAACAAC', MIN_TM=60.0, NUM_PRIMERS=None, MIN_LENGTH=15, MAX_LENGTH=60, prefix='P4P6_2HP')
if job_1d.is_success:
print job_1d
job_2d = primerize.Primerize_2D.design(job_1d, offset=-51, which_muts=range(102, 261 + 1), which_lib=1)
if job_2d.is_success:
print job_2d
job_2d.save()
job_3d = primerize.Primerize_3D.design(job_1d, offset=-51, structures=['...........................((((((.....))))))...........((((((...((((((.....(((.((((.(((..(((((((((....)))))))))..((.......))....)))......)))))))....))))))..)).))))((...((((...(((((((((...)))))))))..))))...)).............((((((.....))))))......................'], N_mutations=1, which_lib=1, is_single=True, is_fillWT=True)
if job_3d.is_success:
print job_3d
job_3d.save()For advanced users, the returned Design_Single and Design_Plate result classes (refer to the Documentation) offer methods for get(), save() and echo():
MIN_TM = job_1d.get('MIN_TM')
print job_1d.get('MISPRIME')
print job_1d.echo('WARNING')
if job_1d.is_success:
job_1d.save(path='result/', name='Primer')
LIB = job_2d.get('which_lib')
N_PRIMER = job_2d.get('N_PRIMER')
print job_2d.get('CONSTRUCT')
if job_2d.is_success:
print job_2d.echo('region')
job_2d.save('assembly', path='result/', name='Lib')
N_PLATE = job_3d.get('N_PLATE')
if job_3d.is_success:
print job_3d.echo('plate')
print repr(job_3d)Besides design(), the Primerize_1D, Primerize_2D, and Primerize_3D factory instances offer methods for get(), set(), and reset():
COL_SIZE = prm_1d.get('COL_SIZE')
prm_1d.set('MIN_LENGTH', 30)
prm_1d.reset()There are also Assembly, Mutation, Construct_List, and Plate_96Well helper classes. For more details, please refer to the Documentation.
Additionally, you can specify your customized list of mutations through the Primerize_Custom factory instance:
mut_list = primerize.util.Construct_List()
mut_list.push(['T120C'])
job_cm = primerize.Primerize_Custom.design(job_1d, offset=-51, mut_list=mut_list)More importantly, you can use the merge() method of Construct_List to combine multiple results into one:
mut_list = job_2d.get('CONSTRUCT')
mut_list.merge(job_3d.get('CONSTRUCT'))
job_cm = primerize.Primerize_Custom.design(job_1d, offset=-51, mut_list=mut_list)
if job_cm.is_success:
print job_2d
job_2d.save()Instructions on MATLAB usage is available at old README.md. Please note that MATLAB code is no longer actively under development or fully maintained.
Code Documentation is available at https://ribokit.github.io/Primerize/ or https://primerize.stanford.edu/docs/.
Experimental Protocol is available at https://primerize.stanford.edu/protocol/.
Copyright © of Primerize Source Code is described in LICENSE.md.
Tian, S., et al. (2015)
Primerize: Automated Primer Assembly for Transcribing Interesting RNAs.
Nucleic Acid Research 43 (W1): W522-W526.
Tian, S., and Das, R. (2017)
Primerize-2D: automated primer design for RNA multidimensional chemical mapping.
Bioinformatics 33 (9): 1405-1406.
Developed by Das lab, Leland Stanford Junior University.
README by t47, January 2016.
