//fine name: doPrimer.java, Done on 01 November 2000 import java.io.*; import java.util.*; public class doPrimer { static int InputCount = 22; //expected number of inputs public static void main(String[] args) { String seq = ""; //source sequence int snploc = 0; //position of snp in sequence String allele1 = ""; //first snp allele String allele2 = ""; //second snp allele int optprimersize = 0; //optimum primer size int maxprimersize = 0; //maximum primer size int minprimersize = 0; //minimum primer size int optproductsize = 0; //optimum product size int maxproductsize = 0; //maximum product size int minproductsize = 0; //minimum product size double maxsizedif = 0; //maximum relative size difference of inner products double minsizedif = 0; //minimum relative size difference of inner products double optprimerTm = 0; //optimum primer Tm double maxprimerTm = 0; //maximum primer Tm double minprimerTm = 0; //minimum primer Tm double maxprimergc = 0; //maximum primer GC% double minprimergc = 0; //minimum primer GC% double maxprimercom = 0; //maximum primer complementarity double maxprimer3com = 0; //maximum primer 3' complementarity double saltconc = 0; //salt (K+) concentration in mM double primerconc = 0; //primer concentration in nM int numoutput = 0; //number of outputs //work out the input values StringTokenizer st = new StringTokenizer(args[0]); int currentcount = st.countTokens(); if (currentcount == InputCount) { seq = st.nextToken(); snploc = Integer.valueOf(st.nextToken()).intValue(); allele1 = st.nextToken().toUpperCase(); allele2 = st.nextToken().toUpperCase(); optprimersize = Integer.valueOf(st.nextToken()).intValue(); maxprimersize = Integer.valueOf(st.nextToken()).intValue(); minprimersize = Integer.valueOf(st.nextToken()).intValue(); optproductsize = Integer.valueOf(st.nextToken()).intValue(); maxproductsize = Integer.valueOf(st.nextToken()).intValue(); minproductsize = Integer.valueOf(st.nextToken()).intValue(); maxsizedif = Double.valueOf(st.nextToken()).doubleValue(); minsizedif = Double.valueOf(st.nextToken()).doubleValue(); optprimerTm = Double.valueOf(st.nextToken()).doubleValue(); maxprimerTm = Double.valueOf(st.nextToken()).doubleValue(); minprimerTm = Double.valueOf(st.nextToken()).doubleValue(); maxprimergc = Double.valueOf(st.nextToken()).doubleValue(); minprimergc = Double.valueOf(st.nextToken()).doubleValue(); maxprimercom = Double.valueOf(st.nextToken()).doubleValue(); maxprimer3com = Double.valueOf(st.nextToken()).doubleValue(); saltconc = Double.valueOf(st.nextToken()).doubleValue(); primerconc = Double.valueOf(st.nextToken()).doubleValue(); numoutput = Integer.valueOf(st.nextToken()).intValue(); // System.out.println("Source sequence - "); // if (seq.length() < 81) // System.out.println(seq); // else // { // int i = 0; // int p = 0; // p = seq.length() / 80 + 1; // for (i=0; i (i+1)*80+1) // System.out.println(seq.substring((i*80), (i+1)*80)); // } // } } else { System.out.println("Only " + currentcount + " out of " + InputCount + " inputs - Abort!"); return; } //validate the input sequence: 1) snploc should be greater than input //sequence length. 2) Allele 1 should be the same as the Nucleotide as //indicated by snploc in the sequence. 3) Allele 1 and 2 should not be //'N' (unknown). 4) at least (minimum product size - maximum primer //size) before the SNP location. 5) at least (minimum product size - //maximum primer size) after the SNP location. if ((snploc >= seq.length()) || (snploc < minproductsize - maxprimersize) || (seq.length() - snploc < minproductsize - maxprimersize)) { System.out.println("Input sequence too short to design primers"); return; } else if (allele1.equalsIgnoreCase(seq.substring(snploc, (snploc+1)))) { System.out.println("Allele 1 not agree with allele in input sequence"); return; } else if ((allele1.equalsIgnoreCase("N")) || (allele2.equalsIgnoreCase("N"))) { System.out.println("Undefined SNP Input!"); return; } Lock1 l1 = new Lock1(); Lock2 l2 = new Lock2(); Lock3 l3 = new Lock3(); Lock4 l4 = new Lock4(); innerForward innerf = new innerForward(l1, l2, seq, snploc, allele1, allele2, optprimersize, maxprimersize, minprimersize, optprimerTm, maxprimerTm, minprimerTm, maxprimergc, minprimergc, maxprimercom, maxprimer3com, saltconc, primerconc, numoutput); innerReverse innerr = new innerReverse(l2, l3, seq, snploc, allele1, allele2, optprimersize, maxprimersize, minprimersize, optprimerTm, maxprimerTm, minprimerTm, maxprimergc, minprimergc, maxprimercom, maxprimer3com, saltconc, primerconc); outerReverse outerr = new outerReverse(l3, l4, seq, snploc, optprimersize, maxprimersize, minprimersize, optproductsize, maxproductsize, minproductsize, optprimerTm, maxprimerTm, minprimerTm, maxprimergc, minprimergc, maxprimercom, maxprimer3com, saltconc, primerconc); outerForward outerf = new outerForward(l1, l4, seq, snploc, allele1, allele2, optprimersize, maxprimersize, minprimersize, optproductsize, maxproductsize, minproductsize, maxsizedif, minsizedif, optprimerTm, maxprimerTm, minprimerTm, maxprimergc, minprimergc, maxprimercom, maxprimer3com, saltconc, primerconc, numoutput); innerf.start(); innerr.start(); outerr.start(); outerf.start(); l1.put(0); return; } }