X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fhmmer%2FHMMSearchThread.java;h=16c7c6843503d41fc7ddde666ba73cc4309bbc27;hb=bd6ce8f5f9fc8e5bc8a6188d15987ce0ffd2c1ee;hp=c723d2f5a489ffd417ec4e4e481530b67fce9ef1;hpb=bd4ab013e64863bbbffa93c58953051e11cfb236;p=jalview.git diff --git a/src/jalview/hmmer/HMMSearchThread.java b/src/jalview/hmmer/HMMSearchThread.java index c723d2f..16c7c68 100644 --- a/src/jalview/hmmer/HMMSearchThread.java +++ b/src/jalview/hmmer/HMMSearchThread.java @@ -1,14 +1,13 @@ package jalview.hmmer; -import jalview.bin.Cache; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; +import jalview.datamodel.Annotation; import jalview.datamodel.HiddenMarkovModel; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; import jalview.gui.JvOptionPane; -import jalview.gui.Preferences; import jalview.io.DataSourceType; import jalview.io.FileParse; import jalview.io.StockholmFile; @@ -17,30 +16,33 @@ import jalview.viewmodel.seqfeatures.FeatureRendererSettings; import jalview.ws.params.ArgumentI; import jalview.ws.params.simple.BooleanOption; +import java.io.BufferedReader; import java.io.File; +import java.io.FileReader; import java.io.IOException; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; +import java.util.Scanner; import javax.swing.JOptionPane; -public class HMMSearchThread implements Runnable +public class HMMSearchThread extends HmmerCommand implements Runnable { - /** + static final String HMMSEARCH = "hmmsearch"; + + /* * feature settings from view that job was associated with */ protected FeatureRendererSettings featureSettings = null; - /** - * Object containing frequently used commands. - */ - HMMERCommands cmds = new HMMERCommands(); + HiddenMarkovModel hmm; - AlignFrame af; + boolean newFrame; - HiddenMarkovModel hmm; + boolean realign = false; - boolean newFrame, realign = false, trim = false; + boolean trim = false; Integer numberOfSequences = null; @@ -58,11 +60,8 @@ public class HMMSearchThread implements Runnable File databaseFile = null; - - SequenceI[] seqs; - /** * Constructor for the HMMSearchThread. If create new frame is set to true, a * new frame will be created. @@ -102,7 +101,6 @@ public class HMMSearchThread implements Runnable barID = System.currentTimeMillis(); af.setProgressBar(MessageManager.getString("status.running_hmmsearch"), barID); - cmds.HMMERFOLDER = Cache.getProperty(Preferences.HMMER_PATH); try { @@ -113,7 +111,7 @@ public class HMMSearchThread implements Runnable } try { - cmds.exportData(null, null, hmm, hmmTemp.getAbsoluteFile()); + exportData(null, null, hmm, hmmTemp.getAbsoluteFile(), null); } catch (IOException e1) { e1.printStackTrace(); @@ -140,8 +138,7 @@ public class HMMSearchThread implements Runnable e.printStackTrace(); } - af.setProgressBar(MessageManager.getString("status.running_hmmsearch"), - barID); + af.setProgressBar("", barID); } @@ -158,7 +155,6 @@ public class HMMSearchThread implements Runnable inputAlignmentTemp.deleteOnExit(); inputTableTemp = File.createTempFile("buffer", ".sto"); inputTableTemp.deleteOnExit(); - databaseFile = new File("D:/Thomas/uniref50.fasta"); } /** @@ -170,21 +166,18 @@ public class HMMSearchThread implements Runnable */ private boolean runCommand() throws IOException, InterruptedException { - File file = new File(cmds.HMMERFOLDER + "/hmmsearch"); - if (!file.canExecute()) + String binaryPath = getCommandRoot(HMMSEARCH); + if (binaryPath == null) { - file = new File(cmds.HMMERFOLDER + "/hmmsearch.exe"); - { - if (!file.canExecute()) - { - return false; - } - } + return false; } - String command = cmds.HMMERFOLDER + "/hmmsearch -o " + String command = binaryPath + " -o " + inputTableTemp.getAbsolutePath() + " -A " - + inputAlignmentTemp.getAbsolutePath() + cmds.SPACE; + + inputAlignmentTemp.getAbsolutePath() + SPACE; + + boolean dbFound = false; + String dbPath = ""; if (params != null) { for (ArgumentI arg : params) @@ -209,29 +202,52 @@ public class HMMSearchThread implements Runnable } break; case "Sequence E-value Cutoff": - command += "--incE " + arg.getValue() + cmds.SPACE; + command += "--incE " + arg.getValue() + SPACE; break; case "Sequence Score Threshold": - command += "-incT " + arg.getValue() + cmds.SPACE; + command += "-incT " + arg.getValue() + SPACE; break; case "Domain E-value Threshold": - command += "--incdomE " + arg.getValue() + cmds.SPACE; + command += "--incdomE " + arg.getValue() + SPACE; break; case "Domain Score Threshold": - command += "--incdomT " + arg.getValue() + cmds.SPACE; + command += "--incdomT " + arg.getValue() + SPACE; break; case "Trim Non-Matching Termini": trim = true; - + break; + case "Database": + dbFound = true; + dbPath = arg.getValue(); + if (!MessageManager.getString("label.this_alignment") + .equals(dbPath)) + { + databaseFile = new File(dbPath); + } } - } } - command += hmmTemp.getAbsolutePath() + cmds.SPACE + if (!dbFound || MessageManager.getString("label.this_alignment") + .equals(dbPath)) + { + AlignmentI alignment = af.getViewport().getAlignment(); + AlignmentI copy = new Alignment(alignment); + copy.getHMMConsensusSequences(true); + StockholmFile stoFile = new StockholmFile(copy); + stoFile.setSeqs(copy.getSequencesArray()); + String alignmentString = stoFile.print(); + databaseFile = File.createTempFile("database", ".sto"); + databaseFile.deleteOnExit(); + PrintWriter writer = new PrintWriter(databaseFile); + writer.print(alignmentString); + writer.close(); + } + + command += hmmTemp.getAbsolutePath() + SPACE + databaseFile.getAbsolutePath(); - return cmds.runCommand(command); + return runCommand(command); } /** @@ -240,60 +256,66 @@ public class HMMSearchThread implements Runnable */ private void importData() throws IOException, InterruptedException { - StockholmFile file = new StockholmFile(new FileParse( - inputAlignmentTemp.getAbsolutePath(), DataSourceType.FILE)); - seqs = file.getSeqsAsArray(); - - readTable(); - - SequenceI[] hmmAndSeqs; - if (numberOfSequences != null && numberOfSequences < seqs.length) - { - hmmAndSeqs = new SequenceI[numberOfSequences + 1]; - } - else + BufferedReader br = new BufferedReader( + new FileReader(inputAlignmentTemp)); + try { - hmmAndSeqs = new SequenceI[seqs.length + 1]; - } + if (br.readLine() == null) + { + JOptionPane.showMessageDialog(af, + MessageManager.getString("label.no_sequences_found")); + return; + } + StockholmFile file = new StockholmFile(new FileParse( + inputAlignmentTemp.getAbsolutePath(), DataSourceType.FILE)); + seqs = file.getSeqsAsArray(); - AlignmentAnnotation[] list = hmmSeq.getAnnotation(); - for (AlignmentAnnotation annot : list) - { - if ("HMM".equals(annot.getCalcId())) + readTable(); + + SequenceI[] hmmAndSeqs; + if (numberOfSequences != null && numberOfSequences < seqs.length) { - hmmSeq.removeAlignmentAnnotation(annot); + hmmAndSeqs = new SequenceI[numberOfSequences + 1]; } - } - hmmSeq.setHasInfo(false); - hmmAndSeqs[0] = hmmSeq; + else + { + hmmAndSeqs = new SequenceI[seqs.length + 1]; + } + hmmAndSeqs[0] = hmmSeq; - if (numberOfSequences != null && seqs.length > numberOfSequences) - { - System.arraycopy(seqs, 0, hmmAndSeqs, 1, numberOfSequences); - } - else - { - System.arraycopy(seqs, 0, hmmAndSeqs, 1, seqs.length); - } + if (numberOfSequences != null && seqs.length > numberOfSequences) + { + System.arraycopy(seqs, 0, hmmAndSeqs, 1, numberOfSequences); + } + else + { + System.arraycopy(seqs, 0, hmmAndSeqs, 1, seqs.length); + } - AlignmentI alignment = new Alignment(hmmAndSeqs); - AlignFrame frame = new AlignFrame(alignment, 1, 1); - frame.setSelectedHMMSequence(hmmSeq); - frame.getViewport().initInformation(); - List alignArgs = new ArrayList<>(); - if (trim) + AlignmentI alignment = new Alignment(hmmAndSeqs); + AlignFrame frame = new AlignFrame(alignment, 1, 1); + frame.setSelectedHMMSequence(hmmSeq); + List alignArgs = new ArrayList<>(); + if (trim) + { + alignArgs.add(new BooleanOption( + MessageManager.getString("label.trim_termini"), + MessageManager.getString("label.trim_termini_desc"), true, + true, true, null)); + } + HMMAlignThread hmmalign = new HMMAlignThread(frame, true, alignArgs); + hmmalign.hmmalignWaitTillComplete(); + frame = null; + hmmTemp.delete(); + inputAlignmentTemp.delete(); + inputTableTemp.delete(); + } finally { - alignArgs.add(new BooleanOption( - MessageManager.getString("label.trim_termini"), - MessageManager.getString("label.trim_termini_desc"), true, - true, true, null)); + if (br != null) + { + br.close(); + } } - HMMAlignThread hmmalign = new HMMAlignThread(frame, true, alignArgs); - hmmalign.hmmalignWaitTillComplete(); - frame = null; - hmmTemp.delete(); - inputAlignmentTemp.delete(); - inputTableTemp.delete(); } /** @@ -316,38 +338,45 @@ public class HMMSearchThread implements Runnable } - public void readTable() throws IOException + void readTable() throws IOException { - - /* BufferedReader br = new BufferedReader(new FileReader(inputTableTemp)); String line = ""; while (!line.startsWith("Query:")) { line = br.readLine(); } - for (int i = 0; i < 4; i++) + for (int i = 0; i < 5; i++) { - br.readLine(); + line = br.readLine(); } - - + int index = 0; - while (!" ------ inclusion threshold ------".equals(line)) + while (!" ------ inclusion threshold ------".equals(line) + && !"".equals(line)) { Scanner scanner = new Scanner(line); - - String str = scanner.next(); - AlignmentAnnotation annots = new AlignmentAnnotation("", "", null); - annots.setScore(Double.parseDouble(str)); - seqs[index].addAlignmentAnnotation(annots); - + + String str = scanner.next(); // full sequence eValue score + float eValue = Float.parseFloat(str); + int seqLength = seqs[index].getLength(); + Annotation[] annots = new Annotation[seqLength]; + for (int j = 0; j < seqLength; j++) + { + annots[j] = new Annotation(eValue); + } + AlignmentAnnotation annot = new AlignmentAnnotation("E-value", + "Score", annots); + annot.setScore(Double.parseDouble(str)); + annot.setSequenceRef(seqs[index]); + seqs[index].addAlignmentAnnotation(annot); + scanner.close(); + line = br.readLine(); + index++; } - - br.close(); - */ + br.close(); } }