3 import jalview.analysis.SeqsetUtils;
4 import jalview.bin.Cache;
5 import jalview.datamodel.Alignment;
6 import jalview.datamodel.AlignmentAnnotation;
7 import jalview.datamodel.AlignmentI;
8 import jalview.datamodel.AnnotatedCollectionI;
9 import jalview.datamodel.Annotation;
10 import jalview.datamodel.HiddenMarkovModel;
11 import jalview.datamodel.SequenceI;
12 import jalview.gui.AlignFrame;
13 import jalview.gui.JvOptionPane;
14 import jalview.gui.Preferences;
15 import jalview.io.HMMFile;
16 import jalview.io.StockholmFile;
17 import jalview.util.MessageManager;
18 import jalview.ws.params.ArgumentI;
20 import java.io.BufferedReader;
22 import java.io.IOException;
23 import java.io.InputStreamReader;
24 import java.io.PrintWriter;
25 import java.util.Hashtable;
26 import java.util.List;
29 * Base class for hmmbuild, hmmalign and hmmsearch
34 public abstract class HmmerCommand implements Runnable
36 public static final String HMMBUILD = "hmmbuild";
38 protected final AlignFrame af;
40 protected final AlignmentI alignment;
42 protected final List<ArgumentI> params;
50 public HmmerCommand(AlignFrame alignFrame, List<ArgumentI> args)
53 alignment = af.getViewport().getAlignment();
57 public static boolean isHmmerAvailable()
59 File exec = getExecutable(HMMBUILD, Cache.getProperty(Preferences.HMMER_PATH));
64 * Uniquifies the sequences when exporting and stores their details in a
69 protected Hashtable stashSequences(SequenceI[] seqs)
71 return SeqsetUtils.uniquify(seqs, true);
75 * Restores the sequence data lost by uniquifying
80 protected void recoverSequences(Hashtable hashtable, SequenceI[] seqs)
82 SeqsetUtils.deuniquify(hashtable, seqs);
86 * Runs a command as a separate process and waits for it to complete. Answers
87 * true if the process return status is zero, else false.
90 * the executable command and any arguments to it
93 public boolean runCommand(List<String> command)
98 ProcessBuilder pb = new ProcessBuilder(command);
99 pb.redirectErrorStream(true); // merge syserr to sysout
100 final Process p = pb.start();
101 new Thread(new Runnable()
106 BufferedReader input = new BufferedReader(
107 new InputStreamReader(p.getInputStream()));
110 String line = input.readLine();
113 System.out.println(line);
114 line = input.readLine();
116 } catch (IOException e)
124 return p.exitValue() == 0; // 0 is success, by convention
125 } catch (Exception e)
133 * Exports an alignment (and possibly annotation) to the specified file, in
139 * @throws IOException
141 public void exportStockholm(SequenceI[] seqs, File toFile,
142 AnnotatedCollectionI annotated)
147 AlignmentI newAl = new Alignment(seqs);
148 if (toFile != null && annotated != null)
150 for (AlignmentAnnotation annot : annotated.getAlignmentAnnotation())
152 if (annot.label.contains("Reference") || "RF".equals(annot.label))
154 AlignmentAnnotation newRF;
155 if (annot.annotations.length > newAl.getWidth())
157 Annotation[] rfAnnots = new Annotation[newAl.getWidth()];
158 System.arraycopy(annot.annotations, 0, rfAnnots, 0,
160 newRF = new AlignmentAnnotation("RF", "Reference Positions",
165 newRF = new AlignmentAnnotation(annot);
167 newAl.addAnnotation(newRF);
172 StockholmFile file = new StockholmFile(newAl);
173 String output = file.print(seqs, false);
174 PrintWriter writer = new PrintWriter(toFile);
175 writer.println(output);
181 * Answers the full path to the given hmmer executable, or null if file cannot
182 * be found or is not executable
185 * command short name e.g. hmmalign
188 protected String getCommandPath(String cmd)
190 String binariesFolder = Cache.getProperty(Preferences.HMMER_PATH);
191 File file = getExecutable(cmd, binariesFolder);
192 if (file == null && af != null)
194 JvOptionPane.showInternalMessageDialog(af,
195 MessageManager.getString("warn.hmm_command_failed"));
198 return file == null ? null : file.getAbsolutePath();
202 * Answers the executable file for the given hmmer command, or null if not
203 * found or not executable. The path to the executable is the command name
204 * prefixed by the hmmer binaries folder path, optionally with .exe appended.
207 * hmmer command short name, for example hmmbuild
209 * parent folder containing hmmer executables
212 public static File getExecutable(String cmd, String binaryPath)
214 File file = new File(binaryPath, cmd);
215 if (!file.canExecute())
217 file = new File(binaryPath, cmd + ".exe");
219 if (!file.canExecute())
229 * A convenience method to create a temporary file that is deleted on exit of
235 * @throws IOException
237 protected File createTempFile(String prefix, String suffix)
240 File f = File.createTempFile(prefix, suffix);
247 * Exports an HMM to the specified file
251 * @throws IOException
253 public void exportHmm(HiddenMarkovModel hmm, File hmmFile)
258 HMMFile file = new HMMFile(hmm);
259 PrintWriter writer = new PrintWriter(hmmFile);
260 writer.print(file.print());