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;
import jalview.util.MessageManager;
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();
-
- AlignFrame af;
-
HiddenMarkovModel hmm;
boolean newFrame;
+ boolean realign = false;
+
+ boolean trim = false;
+
+ Integer numberOfSequences = null;
+
long barID;
SequenceI hmmSeq;
SequenceI[] seqs;
-
/**
* Constructor for the HMMSearchThread. If create new frame is set to true, a
* new frame will be created.
barID = System.currentTimeMillis();
af.setProgressBar(MessageManager.getString("status.running_hmmsearch"),
barID);
- cmds.HMMERFOLDER = Cache.getProperty(Preferences.HMMER_PATH);
try
{
}
try
{
- cmds.exportData(null, null, hmm, hmmTemp.getAbsoluteFile());
+ exportData(null, null, hmm, hmmTemp.getAbsoluteFile(), null);
} catch (IOException e1)
{
e1.printStackTrace();
e.printStackTrace();
}
- af.setProgressBar(MessageManager.getString("status.running_hmmsearch"),
- barID);
+ af.setProgressBar("", barID);
}
inputAlignmentTemp.deleteOnExit();
inputTableTemp = File.createTempFile("buffer", ".sto");
inputTableTemp.deleteOnExit();
- databaseFile = new File("D:/Thomas/uniref50.fasta");
}
/**
*/
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");
+ return false;
+ }
+
+ String command = binaryPath + " -o "
+ + inputTableTemp.getAbsolutePath() + " -A "
+ + inputAlignmentTemp.getAbsolutePath() + SPACE;
+
+ boolean dbFound = false;
+ String dbPath = "";
+ if (params != null)
+ {
+ for (ArgumentI arg : params)
{
- if (!file.canExecute())
+ String name = arg.getName();
+ switch (name)
{
- return false;
+ case "Number of Results to Return":
+ numberOfSequences = Integer.parseInt(arg.getValue());
+ break;
+ case "Automatically Align Fetched Sequences":
+ if ("Automatically Align Fetched Sequences"
+ .equals(arg.getValue()))
+ {
+ realign = true;
+ }
+ break;
+ case "Return Accessions":
+ if ("Return Accessions".equals(arg.getValue()))
+ {
+ command += "--acc ";
+ }
+ break;
+ case "Sequence E-value Cutoff":
+ command += "--incE " + arg.getValue() + SPACE;
+ break;
+ case "Sequence Score Threshold":
+ command += "-incT " + arg.getValue() + SPACE;
+ break;
+ case "Domain E-value Threshold":
+ command += "--incdomE " + arg.getValue() + SPACE;
+ break;
+ case "Domain Score Threshold":
+ 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);
+ }
}
+
}
}
- String command = cmds.HMMERFOLDER + "/hmmsearch -o "
- + inputTableTemp.getAbsolutePath() + " -A "
- + inputAlignmentTemp.getAbsolutePath() + cmds.SPACE
- + 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);
}
/**
*/
private void importData() throws IOException, InterruptedException
{
- StockholmFile file = new StockholmFile(new FileParse(
- inputAlignmentTemp.getAbsolutePath(), DataSourceType.FILE));
- seqs = file.getSeqsAsArray();
+ BufferedReader br = new BufferedReader(
+ new FileReader(inputAlignmentTemp));
+ try
+ {
+ 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();
+
+ readTable();
- readTable();
+ SequenceI[] hmmAndSeqs;
+ if (numberOfSequences != null && numberOfSequences < seqs.length)
+ {
+ hmmAndSeqs = new SequenceI[numberOfSequences + 1];
+ }
+ 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);
+ }
- SequenceI[] hmmAndSeqs = new SequenceI[seqs.length + 1];
- AlignmentAnnotation[] list = hmmSeq.getAnnotation();
- for (AlignmentAnnotation annot : list)
+ AlignmentI alignment = new Alignment(hmmAndSeqs);
+ AlignFrame frame = new AlignFrame(alignment, 1, 1);
+ frame.setSelectedHMMSequence(hmmSeq);
+ List<ArgumentI> 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
{
- if ("HMM annotation".equals(annot.getCalcId()))
+ if (br != null)
{
- hmmSeq.removeAlignmentAnnotation(annot);
+ br.close();
}
}
- hmmSeq.setHasInfo(false);
- hmmAndSeqs[0] = hmmSeq;
- 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();
- HMMAlignThread hmmalign = new HMMAlignThread(frame, true);
- hmmalign.hmmalignWaitTillComplete();
- frame = null;
- hmmTemp.delete();
- inputAlignmentTemp.delete();
- inputTableTemp.delete();
}
/**
}
- 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();
}
}