1 package SGN
::Controller
::Primer3
;
5 Primer3 picks primers for PCR reactions, considering as criteria: oligonucleotide melting temperature, size, GC content, primer-dimer possibilities, PCR product size, positional contraints within the source (template) sequence, possibilities for ectopic priming (amplifying the wrong sequence), and many other contraints.
10 use namespace
::autoclean
;
11 use YAML
::Any qw
/LoadFile/;
13 use URI
::FromHash
'uri';
15 use File
::Temp qw
/ tempfile /;
21 BEGIN { extends
'Catalyst::Controller' }
27 Public path: /primer3/create
29 Display a Primer3 input form.
33 sub create
:Path
('/primer3/') :Args
(0) {
34 my ( $self, $c ) = @_;
35 my $form = HTML
::FormFu
->new(LoadFile
($c->path_to(qw{forms primer3 formfu_create
.yaml
})));
38 $c->stash(template
=> 'primer3/primer3form.mas',
45 Submit input and return results.
49 sub update
:Path
('/primer3/update') :Args
(0) {
52 # Get all parameters from the form and store them in their respective variables.
53 my $SEQUENCE_EXCLUDED_REGION = $c->request->params->{SEQUENCE_EXCLUDED_REGION
};
54 my $SEQUENCE_INCLUDED_REGION = $c->request->params->{SEQUENCE_INCLUDED_REGION
};
55 my $SEQUENCE_PRIMER_REVCOMP = $c->request->params->{SEQUENCE_PRIMER_REVCOMP
};
56 my $SEQUENCE_FORCE_LEFT_END = $c->request->params->{SEQUENCE_FORCE_LEFT_END
};
57 my $SEQUENCE_INTERNAL_EXCLUDED_REGION = $c->request->params->{SEQUENCE_INTERNAL_EXCLUDED_REGION
};
58 my $SEQUENCE_QUALITY = $c->request->params->{SEQUENCE_QUALITY
};
59 my $SEQUENCE_FORCE_LEFT_START = $c->request->params->{SEQUENCE_FORCE_LEFT_START
};
60 my $SEQUENCE_INTERNAL_OLIGO = $c->request->params->{SEQUENCE_INTERNAL_OLIGO
};
61 my $SEQUENCE_START_CODON_POSITION = $c->request->params->{SEQUENCE_START_CODON_POSITION
};
62 my $SEQUENCE_FORCE_RIGHT_END = $c->request->params->{SEQUENCE_FORCE_RIGHT_END
};
63 my $SEQUENCE_OVERLAP_JUNCTION_LIST = $c->request->params->{SEQUENCE_OVERLAP_JUNCTION_LIST
};
64 my $SEQUENCE_TARGET = $c->request->params->{SEQUENCE_TARGET
};
65 my $SEQUENCE_FORCE_RIGHT_START = $c->request->params->{SEQUENCE_FORCE_RIGHT_START
};
66 my $SEQUENCE_PRIMER = $c->request->params->{SEQUENCE_PRIMER
};
67 my $SEQUENCE_TEMPLATE = $c->request->params->{SEQUENCE_TEMPLATE
};
68 my $SEQUENCE_ID = $c->request->params->{SEQUENCE_ID
};
69 my $SEQUENCE_PRIMER_PAIR_OK_REGION_LIST = $c->request->params->{SEQUENCE_PRIMER_PAIR_OK_REGION_LIST
};
70 my $PRIMER_DNA_CONC = $c->request->params->{PRIMER_DNA_CONC
};
71 my $PRIMER_LIB_AMBIGUITY_CODES_CONSENSUS = $c->request->params->{PRIMER_LIB_AMBIGUITY_CODES_CONSENSUS
};
72 my $PRIMER_PAIR_WT_PRODUCT_SIZE_GT = $c->request->params->{PRIMER_PAIR_WT_PRODUCT_SIZE_GT
};
73 my $PRIMER_DNTP_CONC = $c->request->params->{PRIMER_DNTP_CONC
};
74 my $PRIMER_LOWERCASE_MASKING = $c->request->params->{PRIMER_LOWERCASE_MASKING
};
75 my $PRIMER_PAIR_WT_PRODUCT_SIZE_LT = $c->request->params->{PRIMER_PAIR_WT_PRODUCT_SIZE_LT
};
76 my $PRIMER_EXPLAIN_FLAG = $c->request->params->{PRIMER_EXPLAIN_FLAG
};
77 my $PRIMER_MAX_END_GC = $c->request->params->{PRIMER_MAX_END_GC
};
78 my $PRIMER_PAIR_WT_PRODUCT_TM_GT = $c->request->params->{PRIMER_PAIR_WT_PRODUCT_TM_GT
};
79 my $PRIMER_FIRST_BASE_INDEX = $c->request->params->{PRIMER_FIRST_BASE_INDEX
};
80 my $PRIMER_MAX_END_STABILITY = $c->request->params->{PRIMER_MAX_END_STABILITY
};
81 my $PRIMER_PAIR_WT_PRODUCT_TM_LT = $c->request->params->{PRIMER_PAIR_WT_PRODUCT_TM_LT
};
82 my $PRIMER_GC_CLAMP = $c->request->params->{PRIMER_GC_CLAMP
};
83 my $PRIMER_MAX_GC = $c->request->params->{PRIMER_MAX_GC
};
84 my $PRIMER_PAIR_WT_PR_PENALTY = $c->request->params->{PRIMER_PAIR_WT_PR_PENALTY
};
85 my $PRIMER_INSIDE_PENALTY = $c->request->params->{PRIMER_INSIDE_PENALTY
};
86 my $PRIMER_MAX_HAIRPIN_TH = $c->request->params->{PRIMER_MAX_HAIRPIN_TH
};
87 my $PRIMER_PAIR_WT_TEMPLATE_MISPRIMING = $c->request->params->{PRIMER_PAIR_WT_TEMPLATE_MISPRIMING
};
88 my $PRIMER_INTERNAL_DNA_CONC = $c->request->params->{PRIMER_INTERNAL_DNA_CONC
};
89 my $PRIMER_MAX_LIBRARY_MISPRIMING = $c->request->params->{PRIMER_MAX_LIBRARY_MISPRIMING
};
90 my $PRIMER_PAIR_WT_TEMPLATE_MISPRIMING_TH = $c->request->params->{PRIMER_PAIR_WT_TEMPLATE_MISPRIMING_TH
};
91 my $PRIMER_INTERNAL_DNTP_CONC = $c->request->params->{PRIMER_INTERNAL_DNTP_CONC
};
92 my $PRIMER_MAX_NS_ACCEPTED = $c->request->params->{PRIMER_MAX_NS_ACCEPTED
};
93 my $PRIMER_PICK_ANYWAY = $c->request->params->{PRIMER_PICK_ANYWAY
};
94 my $PRIMER_INTERNAL_MAX_GC = $c->request->params->{PRIMER_INTERNAL_MAX_GC
};
95 my $PRIMER_MAX_POLY_X = $c->request->params->{PRIMER_MAX_POLY_X
};
96 my $PRIMER_PICK_INTERNAL_OLIGO = $c->request->params->{PRIMER_PICK_INTERNAL_OLIGO
};
97 my $PRIMER_INTERNAL_MAX_HAIRPIN_TH = $c->request->params->{PRIMER_INTERNAL_MAX_HAIRPIN_TH
};
98 my $PRIMER_MAX_SELF_ANY = $c->request->params->{PRIMER_MAX_SELF_ANY
};
99 my $PRIMER_PICK_LEFT_PRIMER = $c->request->params->{PRIMER_PICK_LEFT_PRIMER
};
100 my $PRIMER_INTERNAL_MAX_LIBRARY_MISHYB = $c->request->params->{PRIMER_INTERNAL_MAX_LIBRARY_MISHYB
};
101 my $PRIMER_MAX_SELF_ANY_TH = $c->request->params->{PRIMER_MAX_SELF_ANY_TH
};
102 my $PRIMER_PICK_RIGHT_PRIMER = $c->request->params->{PRIMER_PICK_RIGHT_PRIMER
};
103 my $PRIMER_INTERNAL_MAX_NS_ACCEPTED = $c->request->params->{PRIMER_INTERNAL_MAX_NS_ACCEPTED
};
104 my $PRIMER_MAX_SELF_END = $c->request->params->{PRIMER_MAX_SELF_END
};
105 my $PRIMER_PRODUCT_MAX_TM = $c->request->params->{PRIMER_PRODUCT_MAX_TM
};
106 my $PRIMER_INTERNAL_MAX_POLY_X = $c->request->params->{PRIMER_INTERNAL_MAX_POLY_X
};
107 my $PRIMER_MAX_SELF_END_TH = $c->request->params->{PRIMER_MAX_SELF_END_TH
};
108 my $PRIMER_PRODUCT_MIN_TM = $c->request->params->{PRIMER_PRODUCT_MIN_TM
};
109 my $PRIMER_INTERNAL_MAX_SELF_ANY = $c->request->params->{PRIMER_INTERNAL_MAX_SELF_ANY
};
110 my $PRIMER_MAX_SIZE = $c->request->params->{PRIMER_MAX_SIZE
};
111 my $PRIMER_PRODUCT_OPT_SIZE = $c->request->params->{PRIMER_PRODUCT_OPT_SIZE
};
112 my $PRIMER_INTERNAL_MAX_SELF_ANY_TH = $c->request->params->{PRIMER_INTERNAL_MAX_SELF_ANY_TH
};
113 my $PRIMER_MAX_TEMPLATE_MISPRIMING = $c->request->params->{PRIMER_MAX_TEMPLATE_MISPRIMING
};
114 my $PRIMER_PRODUCT_OPT_TM = $c->request->params->{PRIMER_PRODUCT_OPT_TM
};
115 my $PRIMER_INTERNAL_MAX_SELF_END = $c->request->params->{PRIMER_INTERNAL_MAX_SELF_END
};
116 my $PRIMER_MAX_TEMPLATE_MISPRIMING_TH = $c->request->params->{PRIMER_MAX_TEMPLATE_MISPRIMING_TH
};
117 my $PRIMER_PRODUCT_SIZE_RANGE = $c->request->params->{PRIMER_PRODUCT_SIZE_RANGE
};
118 my $PRIMER_INTERNAL_MAX_SELF_END_TH = $c->request->params->{PRIMER_INTERNAL_MAX_SELF_END_TH
};
119 my $PRIMER_MAX_TM = $c->request->params->{PRIMER_MAX_TM
};
120 my $PRIMER_QUALITY_RANGE_MAX = $c->request->params->{PRIMER_QUALITY_RANGE_MAX
};
121 my $PRIMER_INTERNAL_MAX_SIZE = $c->request->params->{PRIMER_INTERNAL_MAX_SIZE
};
122 my $PRIMER_MIN_3_PRIME_OVERLAP_OF_JUNCTION = $c->request->params->{PRIMER_MIN_3_PRIME_OVERLAP_OF_JUNCTION
};
123 my $PRIMER_QUALITY_RANGE_MIN = $c->request->params->{PRIMER_QUALITY_RANGE_MIN
};
124 my $PRIMER_MIN_5_PRIME_OVERLAP_OF_JUNCTION = $c->request->params->{PRIMER_MIN_5_PRIME_OVERLAP_OF_JUNCTION
};
125 my $PRIMER_SALT_CORRECTIONS = $c->request->params->{PRIMER_SALT_CORRECTIONS
};
126 my $PRIMER_MIN_END_QUALITY = $c->request->params->{PRIMER_MIN_END_QUALITY
};
127 my $PRIMER_SALT_DIVALENT = $c->request->params->{PRIMER_SALT_DIVALENT
};
128 my $PRIMER_INTERNAL_MAX_TM = $c->request->params->{PRIMER_INTERNAL_MAX_TM
};
129 my $PRIMER_MIN_GC = $c->request->params->{PRIMER_MIN_GC
};
130 my $PRIMER_SALT_MONOVALENT = $c->request->params->{PRIMER_SALT_MONOVALENT
};
131 my $PRIMER_INTERNAL_MIN_GC = $c->request->params->{PRIMER_INTERNAL_MIN_GC
};
132 my $PRIMER_MIN_LEFT_THREE_PRIME_DISTANCE = $c->request->params->{PRIMER_MIN_LEFT_THREE_PRIME_DISTANCE
};
133 my $PRIMER_SEQUENCING_ACCURACY = $c->request->params->{PRIMER_SEQUENCING_ACCURACY
};
134 my $PRIMER_INTERNAL_MIN_QUALITY = $c->request->params->{PRIMER_INTERNAL_MIN_QUALITY
};
135 my $PRIMER_MIN_QUALITY = $c->request->params->{PRIMER_MIN_QUALITY
};
136 my $PRIMER_SEQUENCING_INTERVAL = $c->request->params->{PRIMER_SEQUENCING_INTERVAL
};
137 my $PRIMER_INTERNAL_MIN_SIZE = $c->request->params->{PRIMER_INTERNAL_MIN_SIZE
};
138 my $PRIMER_MIN_RIGHT_THREE_PRIME_DISTANCE = $c->request->params->{PRIMER_MIN_RIGHT_THREE_PRIME_DISTANCE
};
139 my $PRIMER_SEQUENCING_LEAD = $c->request->params->{PRIMER_SEQUENCING_LEAD
};
140 my $PRIMER_INTERNAL_MIN_TM = $c->request->params->{PRIMER_INTERNAL_MIN_TM
};
141 my $PRIMER_MIN_SIZE = $c->request->params->{PRIMER_MIN_SIZE
};
142 my $PRIMER_SEQUENCING_SPACING = $c->request->params->{PRIMER_SEQUENCING_SPACING
};
143 my $PRIMER_INTERNAL_MISHYB_LIBRARY = $c->request->params->{PRIMER_INTERNAL_MISHYB_LIBRARY
};
144 my $PRIMER_MIN_THREE_PRIME_DISTANCE = $c->request->params->{PRIMER_MIN_THREE_PRIME_DISTANCE
};
145 my $PRIMER_TASK = $c->request->params->{PRIMER_TASK
};
146 my $PRIMER_INTERNAL_OPT_GC_PERCENT = $c->request->params->{PRIMER_INTERNAL_OPT_GC_PERCENT
};
147 my $PRIMER_MIN_TM = $c->request->params->{PRIMER_MIN_TM
};
148 my $PRIMER_THERMODYNAMIC_ALIGNMENT = $c->request->params->{PRIMER_THERMODYNAMIC_ALIGNMENT
};
149 my $PRIMER_INTERNAL_OPT_SIZE = $c->request->params->{PRIMER_INTERNAL_OPT_SIZE
};
150 my $PRIMER_MISPRIMING_LIBRARY = $c->request->params->{PRIMER_MISPRIMING_LIBRARY
};
151 my $PRIMER_THERMODYNAMIC_PARAMETERS_PATH = $c->request->params->{PRIMER_THERMODYNAMIC_PARAMETERS_PATH
};
152 my $PRIMER_INTERNAL_OPT_TM = $c->request->params->{PRIMER_INTERNAL_OPT_TM
};
153 my $PRIMER_NUM_RETURN = $c->request->params->{PRIMER_NUM_RETURN
};
154 my $PRIMER_TM_FORMULA = $c->request->params->{PRIMER_TM_FORMULA
};
155 my $PRIMER_INTERNAL_SALT_DIVALENT = $c->request->params->{PRIMER_INTERNAL_SALT_DIVALENT
};
156 my $PRIMER_OPT_GC_PERCENT = $c->request->params->{PRIMER_OPT_GC_PERCENT
};
157 my $PRIMER_WT_END_QUAL = $c->request->params->{PRIMER_WT_END_QUAL
};
158 my $PRIMER_INTERNAL_SALT_MONOVALENT = $c->request->params->{PRIMER_INTERNAL_SALT_MONOVALENT
};
159 my $PRIMER_OPT_SIZE = $c->request->params->{PRIMER_OPT_SIZE
};
160 my $PRIMER_WT_END_STABILITY = $c->request->params->{PRIMER_WT_END_STABILITY
};
161 my $PRIMER_INTERNAL_WT_END_QUAL = $c->request->params->{PRIMER_INTERNAL_WT_END_QUAL
};
162 my $PRIMER_OPT_TM = $c->request->params->{PRIMER_OPT_TM
};
163 my $PRIMER_WT_GC_PERCENT_GT = $c->request->params->{PRIMER_WT_GC_PERCENT_GT
};
164 my $PRIMER_INTERNAL_WT_GC_PERCENT_GT = $c->request->params->{PRIMER_INTERNAL_WT_GC_PERCENT_GT
};
165 my $PRIMER_OUTSIDE_PENALTY = $c->request->params->{PRIMER_OUTSIDE_PENALTY
};
166 my $PRIMER_WT_GC_PERCENT_LT = $c->request->params->{PRIMER_WT_GC_PERCENT_LT
};
167 my $PRIMER_INTERNAL_WT_GC_PERCENT_LT = $c->request->params->{PRIMER_INTERNAL_WT_GC_PERCENT_LT
};
168 my $PRIMER_PAIR_MAX_COMPL_ANY = $c->request->params->{PRIMER_PAIR_MAX_COMPL_ANY
};
169 my $PRIMER_WT_HAIRPIN_TH = $c->request->params->{PRIMER_WT_HAIRPIN_TH
};
170 my $PRIMER_INTERNAL_WT_HAIRPIN_TH = $c->request->params->{PRIMER_INTERNAL_WT_HAIRPIN_TH
};
171 my $PRIMER_PAIR_MAX_COMPL_ANY_TH = $c->request->params->{PRIMER_PAIR_MAX_COMPL_ANY_TH
};
172 my $PRIMER_WT_LIBRARY_MISPRIMING = $c->request->params->{PRIMER_WT_LIBRARY_MISPRIMING
};
173 my $PRIMER_INTERNAL_WT_LIBRARY_MISHYB = $c->request->params->{PRIMER_INTERNAL_WT_LIBRARY_MISHYB
};
174 my $PRIMER_PAIR_MAX_COMPL_END = $c->request->params->{PRIMER_PAIR_MAX_COMPL_END
};
175 my $PRIMER_WT_NUM_NS = $c->request->params->{PRIMER_WT_NUM_NS
};
176 my $PRIMER_INTERNAL_WT_NUM_NS = $c->request->params->{PRIMER_INTERNAL_WT_NUM_NS
};
177 my $PRIMER_PAIR_MAX_COMPL_END_TH = $c->request->params->{PRIMER_PAIR_MAX_COMPL_END_TH
};
178 my $PRIMER_WT_POS_PENALTY = $c->request->params->{PRIMER_WT_POS_PENALTY
};
179 my $PRIMER_INTERNAL_WT_SELF_ANY = $c->request->params->{PRIMER_INTERNAL_WT_SELF_ANY
};
180 my $PRIMER_PAIR_MAX_DIFF_TM = $c->request->params->{PRIMER_PAIR_MAX_DIFF_TM
};
181 my $PRIMER_WT_SELF_ANY = $c->request->params->{PRIMER_WT_SELF_ANY
};
182 my $PRIMER_INTERNAL_WT_SELF_ANY_TH = $c->request->params->{PRIMER_INTERNAL_WT_SELF_ANY_TH
};
183 my $PRIMER_WT_SELF_ANY_TH = $c->request->params->{PRIMER_WT_SELF_ANY_TH
};
184 my $PRIMER_INTERNAL_WT_SELF_END = $c->request->params->{PRIMER_INTERNAL_WT_SELF_END
};
185 my $PRIMER_PAIR_MAX_LIBRARY_MISPRIMING = $c->request->params->{PRIMER_PAIR_MAX_LIBRARY_MISPRIMING
};
186 my $PRIMER_WT_SELF_END = $c->request->params->{PRIMER_WT_SELF_END
};
187 my $PRIMER_INTERNAL_WT_SELF_END_TH = $c->request->params->{PRIMER_INTERNAL_WT_SELF_END_TH
};
188 my $PRIMER_PAIR_MAX_TEMPLATE_MISPRIMING = $c->request->params->{PRIMER_PAIR_MAX_TEMPLATE_MISPRIMING
};
189 my $PRIMER_WT_SELF_END_TH = $c->request->params->{PRIMER_WT_SELF_END_TH
};
190 my $PRIMER_INTERNAL_WT_SEQ_QUAL = $c->request->params->{PRIMER_INTERNAL_WT_SEQ_QUAL
};
191 my $PRIMER_PAIR_MAX_TEMPLATE_MISPRIMING_TH = $c->request->params->{PRIMER_PAIR_MAX_TEMPLATE_MISPRIMING_TH
};
192 my $PRIMER_WT_SEQ_QUAL = $c->request->params->{PRIMER_WT_SEQ_QUAL
};
193 my $PRIMER_INTERNAL_WT_SIZE_GT = $c->request->params->{PRIMER_INTERNAL_WT_SIZE_GT
};
194 my $PRIMER_PAIR_WT_COMPL_ANY = $c->request->params->{PRIMER_PAIR_WT_COMPL_ANY
};
195 my $PRIMER_WT_SIZE_GT = $c->request->params->{PRIMER_WT_SIZE_GT
};
196 my $PRIMER_INTERNAL_WT_SIZE_LT = $c->request->params->{PRIMER_INTERNAL_WT_SIZE_LT
};
197 my $PRIMER_PAIR_WT_COMPL_ANY_TH = $c->request->params->{PRIMER_PAIR_WT_COMPL_ANY_TH
};
198 my $PRIMER_WT_SIZE_LT = $c->request->params->{PRIMER_WT_SIZE_LT
};
199 my $PRIMER_PAIR_WT_COMPL_END = $c->request->params->{PRIMER_PAIR_WT_COMPL_END
};
200 my $PRIMER_WT_TEMPLATE_MISPRIMING = $c->request->params->{PRIMER_WT_TEMPLATE_MISPRIMING
};
201 my $PRIMER_PAIR_WT_COMPL_END_TH = $c->request->params->{PRIMER_PAIR_WT_COMPL_END_TH
};
202 my $PRIMER_WT_TEMPLATE_MISPRIMING_TH = $c->request->params->{PRIMER_WT_TEMPLATE_MISPRIMING_TH
};
203 my $PRIMER_INTERNAL_WT_TM_GT = $c->request->params->{PRIMER_INTERNAL_WT_TM_GT
};
204 my $PRIMER_PAIR_WT_DIFF_TM = $c->request->params->{PRIMER_PAIR_WT_DIFF_TM
};
205 my $PRIMER_WT_TM_GT = $c->request->params->{PRIMER_WT_TM_GT
};
206 my $PRIMER_INTERNAL_WT_TM_LT = $c->request->params->{PRIMER_INTERNAL_WT_TM_LT
};
207 my $PRIMER_PAIR_WT_IO_PENALTY = $c->request->params->{PRIMER_PAIR_WT_IO_PENALTY
};
208 my $PRIMER_WT_TM_LT = $c->request->params->{PRIMER_WT_TM_LT
};
209 my $PRIMER_LIBERAL_BASE = $c->request->params->{PRIMER_LIBERAL_BASE
};
210 my $PRIMER_PAIR_WT_LIBRARY_MISPRIMING = $c->request->params->{PRIMER_PAIR_WT_LIBRARY_MISPRIMING
};
213 # Remove all non-alphabetic characters (makes FASTA input ok)
214 $SEQUENCE_TEMPLATE =~ s/[^a-zA-Z]*//g;
216 # Store Boulder-IO formatted input in text variable.
218 my $text = qq(SEQUENCE_EXCLUDED_REGION
=$SEQUENCE_EXCLUDED_REGION
219 SEQUENCE_INCLUDED_REGION
=$SEQUENCE_INCLUDED_REGION
220 SEQUENCE_PRIMER_REVCOMP
=$SEQUENCE_PRIMER_REVCOMP
221 SEQUENCE_FORCE_LEFT_END
=$SEQUENCE_FORCE_LEFT_END
222 SEQUENCE_INTERNAL_EXCLUDED_REGION
=$SEQUENCE_INTERNAL_EXCLUDED_REGION
223 SEQUENCE_QUALITY
=$SEQUENCE_QUALITY
224 SEQUENCE_FORCE_LEFT_START
=$SEQUENCE_FORCE_LEFT_START
225 SEQUENCE_INTERNAL_OLIGO
=$SEQUENCE_INTERNAL_OLIGO
226 SEQUENCE_START_CODON_POSITION
=$SEQUENCE_START_CODON_POSITION
227 SEQUENCE_FORCE_RIGHT_END
=$SEQUENCE_FORCE_RIGHT_END
228 SEQUENCE_OVERLAP_JUNCTION_LIST
=$SEQUENCE_OVERLAP_JUNCTION_LIST
229 SEQUENCE_TARGET
=$SEQUENCE_TARGET
230 SEQUENCE_FORCE_RIGHT_START
=$SEQUENCE_FORCE_RIGHT_START
231 SEQUENCE_PRIMER
=$SEQUENCE_PRIMER
232 SEQUENCE_TEMPLATE
=$SEQUENCE_TEMPLATE
233 SEQUENCE_ID
=$SEQUENCE_ID
234 SEQUENCE_PRIMER_PAIR_OK_REGION_LIST
=$SEQUENCE_PRIMER_PAIR_OK_REGION_LIST
235 PRIMER_DNA_CONC
=$PRIMER_DNA_CONC
236 PRIMER_LIB_AMBIGUITY_CODES_CONSENSUS
=$PRIMER_LIB_AMBIGUITY_CODES_CONSENSUS
237 PRIMER_PAIR_WT_PRODUCT_SIZE_GT
=$PRIMER_PAIR_WT_PRODUCT_SIZE_GT
238 PRIMER_DNTP_CONC
=$PRIMER_DNTP_CONC
239 PRIMER_LOWERCASE_MASKING
=$PRIMER_LOWERCASE_MASKING
240 PRIMER_PAIR_WT_PRODUCT_SIZE_LT
=$PRIMER_PAIR_WT_PRODUCT_SIZE_LT
241 PRIMER_EXPLAIN_FLAG
=$PRIMER_EXPLAIN_FLAG
242 PRIMER_MAX_END_GC
=$PRIMER_MAX_END_GC
243 PRIMER_PAIR_WT_PRODUCT_TM_GT
=$PRIMER_PAIR_WT_PRODUCT_TM_GT
244 PRIMER_FIRST_BASE_INDEX
=$PRIMER_FIRST_BASE_INDEX
245 PRIMER_MAX_END_STABILITY
=$PRIMER_MAX_END_STABILITY
246 PRIMER_PAIR_WT_PRODUCT_TM_LT
=$PRIMER_PAIR_WT_PRODUCT_TM_LT
247 PRIMER_GC_CLAMP
=$PRIMER_GC_CLAMP
248 PRIMER_MAX_GC
=$PRIMER_MAX_GC
249 PRIMER_PAIR_WT_PR_PENALTY
=$PRIMER_PAIR_WT_PR_PENALTY
250 PRIMER_INSIDE_PENALTY
=$PRIMER_INSIDE_PENALTY
251 PRIMER_MAX_HAIRPIN_TH
=$PRIMER_MAX_HAIRPIN_TH
252 PRIMER_PAIR_WT_TEMPLATE_MISPRIMING
=$PRIMER_PAIR_WT_TEMPLATE_MISPRIMING
253 PRIMER_INTERNAL_DNA_CONC
=$PRIMER_INTERNAL_DNA_CONC
254 PRIMER_MAX_LIBRARY_MISPRIMING
=$PRIMER_MAX_LIBRARY_MISPRIMING
255 PRIMER_PAIR_WT_TEMPLATE_MISPRIMING_TH
=$PRIMER_PAIR_WT_TEMPLATE_MISPRIMING_TH
256 PRIMER_INTERNAL_DNTP_CONC
=$PRIMER_INTERNAL_DNTP_CONC
257 PRIMER_MAX_NS_ACCEPTED
=$PRIMER_MAX_NS_ACCEPTED
258 PRIMER_PICK_ANYWAY
=$PRIMER_PICK_ANYWAY
259 PRIMER_INTERNAL_MAX_GC
=$PRIMER_INTERNAL_MAX_GC
260 PRIMER_MAX_POLY_X
=$PRIMER_MAX_POLY_X
261 PRIMER_PICK_INTERNAL_OLIGO
=$PRIMER_PICK_INTERNAL_OLIGO
262 PRIMER_INTERNAL_MAX_HAIRPIN_TH
=$PRIMER_INTERNAL_MAX_HAIRPIN_TH
263 PRIMER_MAX_SELF_ANY
=$PRIMER_MAX_SELF_ANY
264 PRIMER_PICK_LEFT_PRIMER
=$PRIMER_PICK_LEFT_PRIMER
265 PRIMER_INTERNAL_MAX_LIBRARY_MISHYB
=$PRIMER_INTERNAL_MAX_LIBRARY_MISHYB
266 PRIMER_MAX_SELF_ANY_TH
=$PRIMER_MAX_SELF_ANY_TH
267 PRIMER_PICK_RIGHT_PRIMER
=$PRIMER_PICK_RIGHT_PRIMER
268 PRIMER_INTERNAL_MAX_NS_ACCEPTED
=$PRIMER_INTERNAL_MAX_NS_ACCEPTED
269 PRIMER_MAX_SELF_END
=$PRIMER_MAX_SELF_END
270 PRIMER_PRODUCT_MAX_TM
=$PRIMER_PRODUCT_MAX_TM
271 PRIMER_INTERNAL_MAX_POLY_X
=$PRIMER_INTERNAL_MAX_POLY_X
272 PRIMER_MAX_SELF_END_TH
=$PRIMER_MAX_SELF_END_TH
273 PRIMER_PRODUCT_MIN_TM
=$PRIMER_PRODUCT_MIN_TM
274 PRIMER_INTERNAL_MAX_SELF_ANY
=$PRIMER_INTERNAL_MAX_SELF_ANY
275 PRIMER_MAX_SIZE
=$PRIMER_MAX_SIZE
276 PRIMER_PRODUCT_OPT_SIZE
=$PRIMER_PRODUCT_OPT_SIZE
277 PRIMER_INTERNAL_MAX_SELF_ANY_TH
=$PRIMER_INTERNAL_MAX_SELF_ANY_TH
278 PRIMER_MAX_TEMPLATE_MISPRIMING
=$PRIMER_MAX_TEMPLATE_MISPRIMING
279 PRIMER_PRODUCT_OPT_TM
=$PRIMER_PRODUCT_OPT_TM
280 PRIMER_INTERNAL_MAX_SELF_END
=$PRIMER_INTERNAL_MAX_SELF_END
281 PRIMER_MAX_TEMPLATE_MISPRIMING_TH
=$PRIMER_MAX_TEMPLATE_MISPRIMING_TH
282 PRIMER_PRODUCT_SIZE_RANGE
=$PRIMER_PRODUCT_SIZE_RANGE
283 PRIMER_INTERNAL_MAX_SELF_END_TH
=$PRIMER_INTERNAL_MAX_SELF_END_TH
284 PRIMER_MAX_TM
=$PRIMER_MAX_TM
285 PRIMER_QUALITY_RANGE_MAX
=$PRIMER_QUALITY_RANGE_MAX
286 PRIMER_INTERNAL_MAX_SIZE
=$PRIMER_INTERNAL_MAX_SIZE
287 PRIMER_MIN_3_PRIME_OVERLAP_OF_JUNCTION
=$PRIMER_MIN_3_PRIME_OVERLAP_OF_JUNCTION
288 PRIMER_QUALITY_RANGE_MIN
=$PRIMER_QUALITY_RANGE_MIN
289 PRIMER_MIN_5_PRIME_OVERLAP_OF_JUNCTION
=$PRIMER_MIN_5_PRIME_OVERLAP_OF_JUNCTION
290 PRIMER_SALT_CORRECTIONS
=$PRIMER_SALT_CORRECTIONS
291 PRIMER_MIN_END_QUALITY
=$PRIMER_MIN_END_QUALITY
292 PRIMER_SALT_DIVALENT
=$PRIMER_SALT_DIVALENT
293 PRIMER_INTERNAL_MAX_TM
=$PRIMER_INTERNAL_MAX_TM
294 PRIMER_MIN_GC
=$PRIMER_MIN_GC
295 PRIMER_SALT_MONOVALENT
=$PRIMER_SALT_MONOVALENT
296 PRIMER_INTERNAL_MIN_GC
=$PRIMER_INTERNAL_MIN_GC
297 PRIMER_MIN_LEFT_THREE_PRIME_DISTANCE
=$PRIMER_MIN_LEFT_THREE_PRIME_DISTANCE
298 PRIMER_SEQUENCING_ACCURACY
=$PRIMER_SEQUENCING_ACCURACY
299 PRIMER_INTERNAL_MIN_QUALITY
=$PRIMER_INTERNAL_MIN_QUALITY
300 PRIMER_MIN_QUALITY
=$PRIMER_MIN_QUALITY
301 PRIMER_SEQUENCING_INTERVAL
=$PRIMER_SEQUENCING_INTERVAL
302 PRIMER_INTERNAL_MIN_SIZE
=$PRIMER_INTERNAL_MIN_SIZE
303 PRIMER_MIN_RIGHT_THREE_PRIME_DISTANCE
=$PRIMER_MIN_RIGHT_THREE_PRIME_DISTANCE
304 PRIMER_SEQUENCING_LEAD
=$PRIMER_SEQUENCING_LEAD
305 PRIMER_INTERNAL_MIN_TM
=$PRIMER_INTERNAL_MIN_TM
306 PRIMER_MIN_SIZE
=$PRIMER_MIN_SIZE
307 PRIMER_SEQUENCING_SPACING
=$PRIMER_SEQUENCING_SPACING
308 PRIMER_INTERNAL_MISHYB_LIBRARY
=$PRIMER_INTERNAL_MISHYB_LIBRARY
309 PRIMER_MIN_THREE_PRIME_DISTANCE
=$PRIMER_MIN_THREE_PRIME_DISTANCE
310 PRIMER_TASK
=$PRIMER_TASK
311 PRIMER_INTERNAL_OPT_GC_PERCENT
=$PRIMER_INTERNAL_OPT_GC_PERCENT
312 PRIMER_MIN_TM
=$PRIMER_MIN_TM
313 PRIMER_THERMODYNAMIC_ALIGNMENT
=$PRIMER_THERMODYNAMIC_ALIGNMENT
314 PRIMER_INTERNAL_OPT_SIZE
=$PRIMER_INTERNAL_OPT_SIZE
315 PRIMER_MISPRIMING_LIBRARY
=$PRIMER_MISPRIMING_LIBRARY
316 PRIMER_THERMODYNAMIC_PARAMETERS_PATH
=$PRIMER_THERMODYNAMIC_PARAMETERS_PATH
317 PRIMER_INTERNAL_OPT_TM
=$PRIMER_INTERNAL_OPT_TM
318 PRIMER_NUM_RETURN
=$PRIMER_NUM_RETURN
319 PRIMER_TM_FORMULA
=$PRIMER_TM_FORMULA
320 PRIMER_INTERNAL_SALT_DIVALENT
=$PRIMER_INTERNAL_SALT_DIVALENT
321 PRIMER_OPT_GC_PERCENT
=$PRIMER_OPT_GC_PERCENT
322 PRIMER_WT_END_QUAL
=$PRIMER_WT_END_QUAL
323 PRIMER_INTERNAL_SALT_MONOVALENT
=$PRIMER_INTERNAL_SALT_MONOVALENT
324 PRIMER_OPT_SIZE
=$PRIMER_OPT_SIZE
325 PRIMER_WT_END_STABILITY
=$PRIMER_WT_END_STABILITY
326 PRIMER_INTERNAL_WT_END_QUAL
=$PRIMER_INTERNAL_WT_END_QUAL
327 PRIMER_OPT_TM
=$PRIMER_OPT_TM
328 PRIMER_WT_GC_PERCENT_GT
=$PRIMER_WT_GC_PERCENT_GT
329 PRIMER_INTERNAL_WT_GC_PERCENT_GT
=$PRIMER_INTERNAL_WT_GC_PERCENT_GT
330 PRIMER_OUTSIDE_PENALTY
=$PRIMER_OUTSIDE_PENALTY
331 PRIMER_WT_GC_PERCENT_LT
=$PRIMER_WT_GC_PERCENT_LT
332 PRIMER_INTERNAL_WT_GC_PERCENT_LT
=$PRIMER_INTERNAL_WT_GC_PERCENT_LT
333 PRIMER_PAIR_MAX_COMPL_ANY
=$PRIMER_PAIR_MAX_COMPL_ANY
334 PRIMER_WT_HAIRPIN_TH
=$PRIMER_WT_HAIRPIN_TH
335 PRIMER_INTERNAL_WT_HAIRPIN_TH
=$PRIMER_INTERNAL_WT_HAIRPIN_TH
336 PRIMER_PAIR_MAX_COMPL_ANY_TH
=$PRIMER_PAIR_MAX_COMPL_ANY_TH
337 PRIMER_WT_LIBRARY_MISPRIMING
=$PRIMER_WT_LIBRARY_MISPRIMING
338 PRIMER_INTERNAL_WT_LIBRARY_MISHYB
=$PRIMER_INTERNAL_WT_LIBRARY_MISHYB
339 PRIMER_PAIR_MAX_COMPL_END
=$PRIMER_PAIR_MAX_COMPL_END
340 PRIMER_WT_NUM_NS
=$PRIMER_WT_NUM_NS
341 PRIMER_INTERNAL_WT_NUM_NS
=$PRIMER_INTERNAL_WT_NUM_NS
342 PRIMER_PAIR_MAX_COMPL_END_TH
=$PRIMER_PAIR_MAX_COMPL_END_TH
343 PRIMER_WT_POS_PENALTY
=$PRIMER_WT_POS_PENALTY
344 PRIMER_INTERNAL_WT_SELF_ANY
=$PRIMER_INTERNAL_WT_SELF_ANY
345 PRIMER_PAIR_MAX_DIFF_TM
=$PRIMER_PAIR_MAX_DIFF_TM
346 PRIMER_WT_SELF_ANY
=$PRIMER_WT_SELF_ANY
347 PRIMER_INTERNAL_WT_SELF_ANY_TH
=$PRIMER_INTERNAL_WT_SELF_ANY_TH
348 PRIMER_WT_SELF_ANY_TH
=$PRIMER_WT_SELF_ANY_TH
349 PRIMER_INTERNAL_WT_SELF_END
=$PRIMER_INTERNAL_WT_SELF_END
350 PRIMER_PAIR_MAX_LIBRARY_MISPRIMING
=$PRIMER_PAIR_MAX_LIBRARY_MISPRIMING
351 PRIMER_WT_SELF_END
=$PRIMER_WT_SELF_END
352 PRIMER_INTERNAL_WT_SELF_END_TH
=$PRIMER_INTERNAL_WT_SELF_END_TH
353 PRIMER_PAIR_MAX_TEMPLATE_MISPRIMING
=$PRIMER_PAIR_MAX_TEMPLATE_MISPRIMING
354 PRIMER_WT_SELF_END_TH
=$PRIMER_WT_SELF_END_TH
355 PRIMER_INTERNAL_WT_SEQ_QUAL
=$PRIMER_INTERNAL_WT_SEQ_QUAL
356 PRIMER_PAIR_MAX_TEMPLATE_MISPRIMING_TH
=$PRIMER_PAIR_MAX_TEMPLATE_MISPRIMING_TH
357 PRIMER_WT_SEQ_QUAL
=$PRIMER_WT_SEQ_QUAL
358 PRIMER_INTERNAL_WT_SIZE_GT
=$PRIMER_INTERNAL_WT_SIZE_GT
359 PRIMER_PAIR_WT_COMPL_ANY
=$PRIMER_PAIR_WT_COMPL_ANY
360 PRIMER_WT_SIZE_GT
=$PRIMER_WT_SIZE_GT
361 PRIMER_INTERNAL_WT_SIZE_LT
=$PRIMER_INTERNAL_WT_SIZE_LT
362 PRIMER_PAIR_WT_COMPL_ANY_TH
=$PRIMER_PAIR_WT_COMPL_ANY_TH
363 PRIMER_WT_SIZE_LT
=$PRIMER_WT_SIZE_LT
364 PRIMER_PAIR_WT_COMPL_END
=$PRIMER_PAIR_WT_COMPL_END
365 PRIMER_WT_TEMPLATE_MISPRIMING
=$PRIMER_WT_TEMPLATE_MISPRIMING
366 PRIMER_PAIR_WT_COMPL_END_TH
=$PRIMER_PAIR_WT_COMPL_END_TH
367 PRIMER_WT_TEMPLATE_MISPRIMING_TH
=$PRIMER_WT_TEMPLATE_MISPRIMING_TH
368 PRIMER_INTERNAL_WT_TM_GT
=$PRIMER_INTERNAL_WT_TM_GT
369 PRIMER_PAIR_WT_DIFF_TM
=$PRIMER_PAIR_WT_DIFF_TM
370 PRIMER_WT_TM_GT
=$PRIMER_WT_TM_GT
371 PRIMER_INTERNAL_WT_TM_LT
=$PRIMER_INTERNAL_WT_TM_LT
372 PRIMER_PAIR_WT_IO_PENALTY
=$PRIMER_PAIR_WT_IO_PENALTY
373 PRIMER_WT_TM_LT
=$PRIMER_WT_TM_LT
374 PRIMER_LIBERAL_BASE
=$PRIMER_LIBERAL_BASE
375 PRIMER_PAIR_WT_LIBRARY_MISPRIMING
=$PRIMER_PAIR_WT_LIBRARY_MISPRIMING
379 my $filename = "primer3.txt";
380 my $tempdir = File
::Spec
->catfile($c->config->{basepath
}, $c->tempfiles_subdir('primer3'), $filename);
383 my @text = split("\n", $text);
385 foreach my $item (@text) {
386 if ($item !~ m/=$/) {
387 $filteredtext .= $item."\n";
390 $filteredtext .= "=";
392 write_file
($tempdir, $filteredtext);
394 system("primer3_core < $tempdir > $tempdir.results");
396 open (RESULTS
, "$tempdir.results");
400 my @stuff = split(/=/, $_);
401 $results{$stuff[0]} = $stuff[1];
405 $c->stash(template
=> 'primer3/primer3results.mas',
406 resultshash
=> \
%results
412 __PACKAGE__
->meta->make_immutable;