0

I am using this module to design primers https://pypi.python.org/pypi/primer3-py but I am getting unexpected results.

import primer3
input_seq = 'TAGTTTATGACTATATGGGGAGGTAAATAATGTATGTACTTCAAGAAAATAGGACAGTAGACTGACTCTAAATAATANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTTCTTTTTTTTTTTAANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCATTTCTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGATGGGTGATTTTCAAAGAACAAGCATGGGCATATATTATAATGTCATATCACACCACTTGTTGGCTCTTCAAAAAGCAGTGGGGGTTAAGAATAATGGAGGTTTTCAACTCAAGATAAATGTGCATAACCAGAAATAGGAATAGAATATAATGCCACAGGTTAATTTTTGGTATTAACAATGATGAGATACTGAGAAGTTTCAGAAAATACCTTTTAGCCTGAAGCACTCCTAAATGTTAGGTAGAAAGTCATGTTTTAAATTTACACATAAGTCAATGCCCAAAAATTCAAATATAATGTGGAAACAAATACATATGATTTTTTGATTAAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNACTTATTTGTTGCATTGATAAGTCTATATGAATATTAACTTGTGGAATTAGAAGGACATTCATGCATTTCCAATTCAAAAATAGAATCCATCGACTGATCTTCAGGGACATTAATAGAAGAATCATTGAAATATAAAGTCACTAGTAAGTGATAAGTAATTTTGTTGACTAGAAAACTGTAAAATGTTGGTAGAAATAAAGTAGAAAACATTAGAGTGTTGGTGAAGGGACTCTAGGAAAGGTTGGTTGAGAAAAGCAAACGTCACCAGTCGTGCCCTGGTTTGTAAGTGTACATGTAACTACTGTTTTAAAAAGTAGATATGAAATCATTTCATGTGCTATTAGTCATGTCAAGAGGAGCTTTCAATGTATTTCACAGTATGTATACATATATTATGTTCAATTAGCAGACTCTGACTCAGATACAAAAGGCTCTTTGTCCATATGTGGAAATACTGATACTGTTTTAATTAATATTCTTTTATGTTTTGTACCAATGAGGATTATTTTAGAGTTCGAGTCATGAATTCTTTACGTGGAGGCATGACTGGAGCATGTTTAAATGAAACAAGTAGTATAAAGACATGTAGATATTGGCACTATGAATGAGAATAAAAAGATATTCTCAAAATTTATGTAAGAAGTTGTCTTAAACTTGGGTAATGATCCCTTAGGTCTTTTCCTAATTGAATGTGTCAGTTATGAAAATTGTGACTAGCGCACTTAATATNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTAGTAATACCGAACNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCTGAACTTCCTCATAAAATTANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAATCTTCTTTAGCAAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTCCANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTACTTTACTTTGATGGTGAATAAGGGGGACACTTATCAGGCTAAACACTGTAGACNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAGA'
primer = (primer3.bindings.designPrimers(
            {
                'SEQUENCE_ID': 'hmhm',
                'SEQUENCE_TEMPLATE': input_seq,
                'SEQUENCE_EXCLUDED_REGION': [0, 0] 
            },
            {
                'PRIMER_TASK': 'generic',
                'PRIMER_PICK_LEFT_PRIMER': 1,
                'PRIMER_PICK_INTERNAL_OLIGO': 0,
                'PRIMER_PICK_RIGHT_PRIMER': 1,
                'PRIMER_NUM_RETURN': 5,
                'PRIMER_OPT_SIZE': 20,
                'PRIMER_MIN_SIZE': 18,
                'PRIMER_MAX_SIZE': 25,
                'PRIMER_OPT_TM': 60.0,
                'PRIMER_MIN_TM': 57.0,
                'PRIMER_MAX_TM': 63.0,
                'PRIMER_MIN_GC': 20.0,
                'PRIMER_MAX_GC': 80.0,
                'PRIMER_MAX_POLY_X': 5,
                'PRIMER_SALT_MONOVALENT': 50.0,
                'PRIMER_DNA_CONC': 50.0,
                'PRIMER_MAX_NS_ACCEPTED': 0,
                'PRIMER_MAX_SELF_ANY': 12,
                'PRIMER_MAX_SELF_END': 8,
                'PRIMER_PAIR_MAX_COMPL_ANY': 12,
                'PRIMER_PAIR_MAX_COMPL_END': 8,
                'PRIMER_PRODUCT_SIZE_RANGE': [[len(input_seq)-200,len(input_seq)]],}))
print primer

I want to design PCR primers, but for some reason it seems to be failing because no internal oligo was designed (as far as I can tell). It does say there are 5 ok right primers and 6 ok left primers. Why doesn't it just output them?

{'PRIMER_INTERNAL_NUM_RETURNED': 0L, 'PRIMER_RIGHT_EXPLAIN': 'considered 229, too many Ns 205, low tm 19, ok 5', 
 'PRIMER_INTERNAL_EXPLAIN': 'considered 1, unacceptable product size 1, ok 0',
 'PRIMER_PAIR_NUM_RETURNED': 0L, 'PRIMER_RIGHT_NUM_RETURNED': 0L, 'PRIMER_LEFT_NUM_RETURNED': 0L, 
'PRIMER_LEFT_EXPLAIN': 'considered 600, too many Ns 148, GC content failed 2, low tm 444, ok 6'}

EDIT: I use a while loop to keep designing primers if there are no primers for the target region. To determine which side to expand i.e. which side failed to make primer I use the value from 'PRIMER_LEFT_EXPLAIN' and 'PRIMER_RIGHT_EXPLAIN'. This doesn't work for the example I posted, and since I am not getting the primer pair output that primer3 standalone gives you I am not sure how to get around this.

 while len(primer.keys())/20 == 0:

        if int(primer['PRIMER_LEFT_EXPLAIN'].split(' ')[-1]) == 0:
            print 'Expanding Left', primer['PRIMER_LEFT_EXPLAIN'].split(' ')[-1]
            start += -50

        elif int(primer['PRIMER_RIGHT_EXPLAIN'].split(' ')[-1]) == 0:
            print 'Expanding Right', primer['PRIMER_RIGHT_EXPLAIN'].split(' ')[-1]
            end += 50

        else:
            print primer
            raise Warning('Both sides have primers')

        input_primer3 = str(mm10_chr14_rec.seq[start:end].upper())
        primer = (primer3.bindings.designPrimers(
            {
                'SEQUENCE_ID': 'hmhm',
                'SEQUENCE_TEMPLATE': input_primer3,
                'SEQUENCE_EXCLUDED_REGION': [excl_start, excl_length] #start, length; might want to extend region?
            },
            {
                'PRIMER_OPT_SIZE': 20,
                'PRIMER_PICK_INTERNAL_OLIGO': 0,
                'PRIMER_MIN_SIZE': 18,
                'PRIMER_MAX_SIZE': 25,
                'PRIMER_OPT_TM': 60.0,
                'PRIMER_MIN_TM': 57.0,
                'PRIMER_MAX_TM': 63.0,
                'PRIMER_MIN_GC': 20.0,
                'PRIMER_MAX_GC': 80.0,
                'PRIMER_MAX_POLY_X': 100,
                'PRIMER_SALT_MONOVALENT': 50.0,
                'PRIMER_DNA_CONC': 50.0,
                'PRIMER_MAX_NS_ACCEPTED': 0,
                'PRIMER_MAX_SELF_ANY': 12,
                'PRIMER_MAX_SELF_END': 8,
                'PRIMER_PAIR_MAX_COMPL_ANY': 12,
                'PRIMER_PAIR_MAX_COMPL_END': 8,
                'PRIMER_PRODUCT_SIZE_RANGE': [[len(input_primer3)-200,len(input_primer3)]],}))

        if end-start > 8000:
            print 'PCR fragment is bigger than 8000 bp after extending bounds'
#         raise Exception('PCR fragment is bigger than 8000 bp after extending bounds')
    if end-start > 8000:
        print input_primer3
    print 'size', end-start
crysis405
  • 1,121
  • 2
  • 13
  • 26
  • Is your problem solved? – Maximilian Peters May 19 '16 at 18:29
  • As you pointed out the standalone versions produces additional error messages. I am looping the primer construction coordinates based on the error messages so I still have a problem, although you did answer why. If you want I can accept you answer. – crysis405 May 20 '16 at 09:17
  • What is your current problem? – Maximilian Peters May 20 '16 at 09:18
  • @Ashafix Please see edit. – crysis405 May 20 '16 at 10:03
  • A couple of questions about your edit: What is the purpose of `len(primer.keys())/20 == 0:`? Do you want to check if primer pairs were returned? while `int(primer['PRIMER_PAIR_NUM_RETURNED']) == 0:`? If you change the input sequence with `input_primer3 = str(mm10_chr14_rec.seq[start:end].upper())` shouldn't the `'SEQUENCE_EXCLUDED_REGION'` also be changed? I still think the main problem is the line: `[[len(input_primer3)-200,len(input_primer3)]]` which only accepts really long amplicons. – Maximilian Peters May 21 '16 at 11:00
  • I guess `int(primer['PRIMER_PAIR_NUM_RETURNED']) == 0:` makes more sense. I left the `'SEQUENCE_EXCLUDED_REGION'` the same because my aim is to get a primer pair that is large (I think I set it to 5kb) and overlaps with the previous primer pair. The excluded region which I set just to get the initial primer size doesn't matter any more as the distance between primer pairs only increases after this point. The aim of the script was to design a primer tile path along a section of the masked genome with primer pairs spanning 5kb intervals (or larger). – crysis405 May 23 '16 at 14:13

2 Answers2

1

With the primer3 standalone the error message is a bit more verbose:

PRIMER_LEFT_EXPLAIN=considered 600, too many Ns 148, GC content failed 2, low tm 444, ok 6
PRIMER_RIGHT_EXPLAIN=considered 229, too many Ns 205, low tm 19, ok 5
PRIMER_PAIR_EXPLAIN=considered 1, unacceptable product size 1, ok 0

The problems seems to be your function here:

'PRIMER_PRODUCT_SIZE_RANGE': [[len(input_seq)-200,len(input_seq)]]

Your sequence has a length of 5318 bases and primer3 is told to get a product which has a length between 5118 and 5318 bases which is quite difficult considering the many Ns in the sequence.

Try removing PRIMER_PRODUCT_SIZE_RANGE and you should get some results.

Maximilian Peters
  • 30,348
  • 12
  • 86
  • 99
0

There were no internal oligo designed because you used parameter,['PRIMER_PICK_INTERNAL_OLIGO': 0]. The main reason for empty primer pairs is "too many Ns" in your input sequence so that the program can not calculate a GC value and estimate Tm.

  • I don't want any internal oligos. There are 6 ok left primers and 5 ok right primers. From this I gather that I have primer pairs... – crysis405 Mar 09 '16 at 11:05