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) throws IOException
148 AlignmentI newAl = new Alignment(seqs);
149 if (!newAl.isAligned())
154 if (toFile != null && annotated != null)
156 for (AlignmentAnnotation annot : annotated.getAlignmentAnnotation())
158 if (annot.label.contains("Reference") || "RF".equals(annot.label))
160 AlignmentAnnotation newRF;
161 if (annot.annotations.length > newAl.getWidth())
163 Annotation[] rfAnnots = new Annotation[newAl.getWidth()];
164 System.arraycopy(annot.annotations, 0, rfAnnots, 0,
166 newRF = new AlignmentAnnotation("RF", "Reference Positions",
171 newRF = new AlignmentAnnotation(annot);
173 newAl.addAnnotation(newRF);
178 StockholmFile file = new StockholmFile(newAl);
179 String output = file.print(seqs, false);
180 PrintWriter writer = new PrintWriter(toFile);
181 writer.println(output);
186 * Answers the full path to the given hmmer executable, or null if file cannot
187 * be found or is not executable
190 * command short name e.g. hmmalign
193 protected String getCommandPath(String cmd)
195 String binariesFolder = Cache.getProperty(Preferences.HMMER_PATH);
196 File file = getExecutable(cmd, binariesFolder);
197 if (file == null && af != null)
199 JvOptionPane.showInternalMessageDialog(af,
200 MessageManager.getString("warn.hmm_command_failed"));
203 return file == null ? null : file.getAbsolutePath();
207 * Answers the executable file for the given hmmer command, or null if not
208 * found or not executable. The path to the executable is the command name
209 * prefixed by the hmmer binaries folder path, optionally with .exe appended.
212 * hmmer command short name, for example hmmbuild
214 * parent folder containing hmmer executables
217 public static File getExecutable(String cmd, String binaryPath)
219 File file = new File(binaryPath, cmd);
220 if (!file.canExecute())
222 file = new File(binaryPath, cmd + ".exe");
224 if (!file.canExecute())
234 * A convenience method to create a temporary file that is deleted on exit of
240 * @throws IOException
242 protected File createTempFile(String prefix, String suffix)
245 File f = File.createTempFile(prefix, suffix);
252 * Exports an HMM to the specified file
256 * @throws IOException
258 public void exportHmm(HiddenMarkovModel hmm, File hmmFile)
263 HMMFile file = new HMMFile(hmm);
264 PrintWriter writer = new PrintWriter(hmmFile);
265 writer.print(file.print());