/*
*
*
*/
package org.clothocad.tool.primerdesigner;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.biojava.bio.alignment.NeedlemanWunsch;
import org.biojava.bio.alignment.SequenceAlignment;
import org.biojava.bio.alignment.SubstitutionMatrix;
import org.biojava.bio.symbol.AlphabetManager;
import org.biojava.bio.symbol.FiniteAlphabet;
import org.biojava.bio.symbol.Alignment;
import org.biojava.bio.symbol.IllegalAlphabetException;
import org.biojava.bio.symbol.IllegalSymbolException;
import org.biojavax.bio.seq.RichSequence;
import org.biojava.bio.seq.DNATools;
import org.biojava.bio.symbol.SymbolList;
import org.biojava.bio.seq.StrandedFeature;
import org.biojavax.SimpleNamespace;
import org.biojavax.bio.seq.SimpleRichSequence;
public class Aligner {
/**
* Aligns two DNA sequences using Needleman Wunsch Algorithm
* @param fwdSequence
* @param revSequence
* @return
*/
public static String align(String fwdSequence, String revSequence) {
SymbolList revSeq3to5Prime = null;
String annealingString = null;
SimpleRichSequence fwdSeq;
SimpleRichSequence revSeq;
try {
revSeq = new SimpleRichSequence(new SimpleNamespace("org"), "REVERSE", "REVERSE", 1, DNATools.createDNA(revSequence), 1.0);
fwdSeq = new SimpleRichSequence(new SimpleNamespace("org"), "FORWARD", "FORWARD", 1, DNATools.createDNA(fwdSequence), 1.0);
revSeq3to5Prime = DNATools.complement(DNATools.flip(revSeq, StrandedFeature.NEGATIVE));
} catch (IllegalSymbolException ex) {
return (ex.getMessage());
} catch (IllegalAlphabetException ex) {
return (ex.getMessage());
}
if (fwdSeq != null && revSeq != null) {
try {
FiniteAlphabet alphabet = (FiniteAlphabet) AlphabetManager.alphabetForName("DNA");
SubstitutionMatrix matrix = new SubstitutionMatrix(alphabet, "#\n# Lowest score = -4, Highest score = 5\n#\n A T G C\nA -4 4 -4 -4\nT 4 -4 -4 -4\nG -4 -4 -4 5\nC -4 -4 5 -4", "AnnealingMatrix");
NeedlemanWunsch seqAlignment = new NeedlemanWunsch(
(short) 3, // match
(short) 3, // replace
(short) 2, // insert
(short) 2, // delete
(short) 1, // gapExtend
matrix // SubstitutionMatrix
);
// SequenceAlignment alignment = new NeedlemanWunsch(
// (short) 3, // match
// (short) 3, // replace
// (short) 2, // insert
// (short) 2, // delete
// (short) 1, // gapExtend
// matrix // SubstitutionMatrix
// );
seqAlignment.pairwiseAlignment(fwdSeq, revSeq3to5Prime);
Alignment alignment = seqAlignment.getAlignment(fwdSeq, revSeq3to5Prime);
annealingString = generateAlignmentString(alignment);
return annealingString;
} catch (Exception e) {
return e.getMessage();
}
} else {
return "Invalid parameters were submitted.";
}
}
/**
* Formats the result text of an Alignment object
* @param alignment
* @return
*/
private static String generateAlignmentString(Alignment alignment) {
String annealingString = null;
try {
SymbolList forwardSymbolList = alignment.symbolListForLabel(alignment.getLabels().get(0));
SymbolList reverseSymbolList = alignment.symbolListForLabel(alignment.getLabels().get(1));
String matchCharString = "";
//Will contain all of the | characters
if (forwardSymbolList.length() == reverseSymbolList.length()) {
for (int n = 1; n
<= forwardSymbolList.length(); n++) {
if (!forwardSymbolList.symbolAt(n).getName().equals("gap") && !reverseSymbolList.symbolAt(n).getName().equals("gap") && !forwardSymbolList.symbolAt(n).getName().equals("[]") && !reverseSymbolList.symbolAt(n).getName().equals("[]")) {
//Checks to make sure that there is not a gap symbol at point of comparison
if (forwardSymbolList.symbolAt(n).equals(DNATools.complement(reverseSymbolList.symbolAt(n)))) {
matchCharString = matchCharString + "|";
//If there is a match, insert a | character
} else {
matchCharString = matchCharString + " ";
//Adds a blank space if there is no match
}
} else {
matchCharString = matchCharString + " ";
//Adds a blank space if there is no match
}
}
annealingString = alignment.symbolListForLabel(alignment.getLabels().get(0)).seqString() + "\n" + matchCharString + "\n" + alignment.symbolListForLabel(alignment.getLabels().get(1)).seqString();
} else {
return "the SymbolLists generated by the alignment have unequal lengths. Severe error in alignment is likely.";
}
} catch (Exception ex) {
Logger.getLogger(Aligner.class.getName()).log(Level.SEVERE, null, ex);
}
return annealingString;
}
}