Skip to content

Commit 69c0def

Browse files
committed
expose the user config file to primerdesign.py
1 parent ad85e0c commit 69c0def

6 files changed

Lines changed: 99 additions & 14 deletions

File tree

bin/primerdesign.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@
99
"""
1010

1111
import argparse
12-
import os,sys
12+
import os
13+
import sys
14+
import json
1315

1416
#currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
1517
#parentdir = os.path.dirname(os.path.dirname(currentdir))
1618
#sys.path.insert(0,parentdir)
1719

1820
# self import
19-
from primerdiffer.walk_chr import flow_walk_chr
21+
from primerdiffer.walk_chr import flow_walk_chr, primer3_general_settings
2022

2123
parser=argparse.ArgumentParser()
2224
parser.add_argument("-d", "--wkdir", default=None,
@@ -53,11 +55,25 @@
5355
parser.add_argument("--prefix", default="primers",
5456
help="prefix of output file, default is primers")
5557

58+
# add user settings
59+
parser.add_argument("--primer3config", default=None,
60+
help="the config file for the primer3 ")
5661

5762
# default handler
5863
args = parser.parse_args(args=None if sys.argv[1:] else ['--help'])
5964
wkdir=os.getcwd() if args.wkdir is None else args.wkdir
6065

66+
67+
# deal with config
68+
primer3_setting = primer3_general_settings
69+
if args.primer3config is None:
70+
pass
71+
else: # update the primer3 setting from the givien parameters
72+
with open(args.primer3config, "r") as f:
73+
primer3_user_setting = eval(f.read()) # read the config as a dict
74+
primer3_setting.update(primer3_user_setting)
75+
76+
6177
flow_walk_chr(wkdir=wkdir,
6278
genome1=args.genome1,
6379
genome2=args.genome2,
@@ -69,4 +85,5 @@
6985
db2_maxhit=args.hit2,
7086
interval=args.interval,
7187
jump=args.jump,
72-
out_prefix=args.prefix)
88+
out_prefix=args.prefix,
89+
primer3_settings=primer3_setting)

primerdiffer/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__= "0.1.2"
1+
__version__= "0.1.4"

primerdiffer/walk_chr.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@
1212

1313
from primerdiffer.primer_check import my_design_primer, primer_check
1414
from primerdiffer.utils import dic2dic, fasta2dic, chr_select, tuple_to_pos_str, pos_str_to_tuple, checkblastdb
15+
from primerdiffer.general_settings import primer3_general_settings
1516

1617

1718
def walk_chr_dense(genome, chro, start, end, db1, db2,
1819
cutoff_alignlength=16, cutoff_free3=2, product_cutoff=2000,
1920
db1_maxhit=1, db2_maxhit=0,
20-
interval=500000, jump=4000, out_prefix="primers", debugmod=False):
21+
interval=500000, jump=4000, out_prefix="primers", debugmod=False,
22+
primer3_settings=primer3_general_settings
23+
):
2124
"""
2225
:param genome: genome is a dict in name:seq,
2326
:param chro:
@@ -41,7 +44,7 @@ def walk_chr_dense(genome, chro, start, end, db1, db2,
4144
if "N" in seq.upper():
4245
offset += 1
4346
else:
44-
myprimer = my_design_primer(name=name, seq=seq)
47+
myprimer = my_design_primer(name=name, seq=seq, primer3_settings=primer3_settings)
4548
primer_used = primer_check(myprimer,db1,db2,
4649
cutoff_alignlength, cutoff_free3, product_cutoff,
4750
db1_maxhit, db2_maxhit,
@@ -67,7 +70,8 @@ def walk_chr_dense(genome, chro, start, end, db1, db2,
6770
def flow_walk_chr(wkdir, genome1, genome2, pos_str,
6871
cutoff_alignlength=16, cutoff_free3=2, product_cutoff=2000,
6972
db1_maxhit=1, db2_maxhit=0,
70-
interval=4000, jump=400, out_prefix="primers"):
73+
interval=4000, jump=400, out_prefix="primers",
74+
primer3_settings = primer3_general_settings):
7175
"""
7276
7377
genome1: the genome fasta file used to design primers
@@ -94,5 +98,6 @@ def flow_walk_chr(wkdir, genome1, genome2, pos_str,
9498
product_cutoff=product_cutoff,
9599
db1_maxhit=db1_maxhit,
96100
db2_maxhit=db2_maxhit,
97-
interval=interval, jump=jump, out_prefix=out_prefix)
101+
interval=interval, jump=jump, out_prefix=out_prefix,
102+
primer3_settings=primer3_settings)
98103
print(primer_dict)

readme.md

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pip install primerdiffer # will also install primer3-py and biopython
1818
conda install -c bioconda blast # install ncbi blast, which is not included in pip installation
1919
```
2020

21-
## Case example: primerdesign.py for primerdiffer
21+
## Case example: used primerdesign.py to design primers for two haplotypes
2222
Design genome-wide specific primers for two species/sub-species/divergent sequences:
2323
- Greedy design primers for a region in genome1 and make a specificity check using genome2
2424
- The dis-similarity between genome1 and genome2 >= 5%.
@@ -63,8 +63,8 @@ from [cb5.fa](https://github.com/Runsheng/cbgenome/releases/download/cb5pre_cn3p
6363

6464
The _C. nigoni_ genome is cn3_new.fa and _C. briggsae_ genome is cb5.fa. To design _C. briggsae_ unique primer,
6565
which would not amplify any region in _C. nigoni_, and amplify only one region in _C. briggsae_.
66-
The targeted region for C. briggsae is ChrX:12881200-15106660 (-pos),
67-
one primer is designed for every 4kb interval (--interval).
66+
The targeted region for C. briggsae is ChrX:12881200-15106660 (-pos or --position),
67+
one primer is designed for every 4kb interval (-i or --interval).
6868
```bash
6969
primerdesign.py -g1 cb5.fa -g2 cn3_new.fa -pos "ChrX:12881200-15106660" --interval 4000
7070
```
@@ -119,9 +119,47 @@ head ispcr.fa
119119
#ATGATGATGATGATGGTGGGGTGAGAATAGAGT
120120
```
121121

122+
## Case example: Design general purpose primers with given parameters
123+
The default primer design parameter is as described in [general_setting.py](https://github.com/Runsheng/primerdiffer/blob/master/primerdiffer/general_settings.py):
124+
```python
125+
primer3_general_settings = {
126+
'PRIMER_OPT_SIZE': 20,
127+
'PRIMER_PICK_LEFT_PRIMER':1,
128+
'PRIMER_PICK_RIGHT_PRIMER':1,
129+
'PRIMER_PICK_INTERNAL_OLIGO': 0,
130+
'PRIMER_MIN_SIZE': 18,
131+
'PRIMER_MAX_SIZE': 23,
132+
'PRIMER_OPT_TM': 57.0,
133+
'PRIMER_MIN_TM': 46.0,
134+
'PRIMER_MAX_TM': 63.0,
135+
'PRIMER_MIN_GC': 20.0,
136+
'PRIMER_MAX_GC': 80.0,
137+
'PRIMER_PRODUCT_SIZE_RANGE': [[250, 650]],
138+
'PRIMER_NUM_RETURN':10,
139+
'PRIMER_MIN_THREE_PRIME_DISTANCE':10,
140+
'PRIMER_LIB_AMBIGUITY_CODES_CONSENSUS':0
141+
}
142+
```
143+
The new parameter can be supplemnted as a file with the terms which need to be changed, for example, create a file with name of config.txt
144+
```python
145+
# content of config.txt
146+
# only changed the product size, the others are the same the default
147+
{'PRIMER_PRODUCT_SIZE_RANGE': [[100, 200]]}
148+
```
149+
Run primerdesign.py to design a qPCR primer(product size 100-20bp, use the config.txt for primer3config) for _C. briggsae_ mitochondrial DNA sequence
150+
[NC_009885.1](https://www.ncbi.nlm.nih.gov/nuccore/NC_009885.1?report=fasta) in any region (use 0:-1 means from the first
151+
nucleotide to the last); check the _C. briggsae_ genome cb5.fa for false priming, make sure the hit is 0.
152+
```bash
153+
primerdesign.py -g1 NC_009885.fa -g2 cb5.fa -pos "NC_009885.1:0:-1" \
154+
--interval 1000 --hit1 1 --hit2 0 \
155+
--primer3config config.txt
156+
```
157+
158+
159+
160+
122161
## Roadmap for other functions:
123-
1. To use user-provided primer parameters.Primer design parameter now is fine-tuned for general purpose PCR, which can be found in "general_settings.py".This file may need be modified to generate primers for specific purpose PCR like real-time qPCR.
124-
2. To update the RFLP method for primer design to differ sequences with almost identical sequence.
125-
3. To update the primer design using VCF file for closely related haplotypes.
162+
1. To update the RFLP method for primer design to differ sequences with almost identical sequence.
163+
2. To update the primer design using VCF file for closely related haplotypes.
126164

127165

test/test_walk_chr.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ def setUp(self):
2727
self.cb4_genome = "/t1/ref_BN/cb5.fa"
2828
#self.name, self.seq = chr_select(self.cb4_genome, "ChrX", 19424476,19655212)
2929

30+
def test_config_dump_load(self):
31+
import json
32+
from primerdiffer.general_settings import primer3_general_settings
33+
with open("./test/primer3config", "w") as fw:
34+
json.dump(primer3_general_settings, )
35+
3036

3137
def test_walk_chr_dense(self):
3238
wkdir=os.getcwd()

test/user_settings.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# use the user setting
2+
# a minimal config can keep only the terms which need to be changed, like
3+
# {'PRIMER_PRODUCT_SIZE_RANGE': [[100,200]]}
4+
{ 'PRIMER_OPT_SIZE': 20,
5+
'PRIMER_PICK_LEFT_PRIMER':1,
6+
'PRIMER_PICK_RIGHT_PRIMER':1,
7+
'PRIMER_PICK_INTERNAL_OLIGO': 0,
8+
'PRIMER_MIN_SIZE': 18,
9+
'PRIMER_MAX_SIZE': 23,
10+
'PRIMER_OPT_TM': 57.0,
11+
'PRIMER_MIN_TM': 46.0,
12+
'PRIMER_MAX_TM': 63.0,
13+
'PRIMER_MIN_GC': 20.0,
14+
'PRIMER_MAX_GC': 80.0,
15+
'PRIMER_PRODUCT_SIZE_RANGE': [[100,200]],
16+
'PRIMER_NUM_RETURN':10,
17+
'PRIMER_MIN_THREE_PRIME_DISTANCE':10,
18+
'PRIMER_LIB_AMBIGUITY_CODES_CONSENSUS':0
19+
}

0 commit comments

Comments
 (0)