3 import jalview.bin.Cache;
4 import jalview.datamodel.AlignmentI;
5 import jalview.datamodel.HiddenMarkovModel;
6 import jalview.datamodel.Sequence;
7 import jalview.datamodel.SequenceGroup;
8 import jalview.datamodel.SequenceI;
9 import jalview.gui.AlignFrame;
10 import jalview.gui.AlignViewport;
11 import jalview.gui.JvOptionPane;
12 import jalview.gui.Preferences;
13 import jalview.io.DataSourceType;
14 import jalview.io.FileParse;
15 import jalview.io.HMMFile;
16 import jalview.util.MessageManager;
17 import jalview.ws.params.ArgumentI;
20 import java.io.FileNotFoundException;
21 import java.io.IOException;
22 import java.util.ArrayList;
23 import java.util.List;
25 import javax.swing.JOptionPane;
27 public class HMMBuildThread implements Runnable
29 HMMERCommands cmds = new HMMERCommands();
33 AlignViewport viewport;
35 boolean multiJob = false;
41 List<ArgumentI> params;
43 boolean forGroup = false;
52 * This is used for validation purposes. Do not use!
56 public HMMBuildThread(AlignmentI alignment)
58 this.alignment = alignment;
62 public HMMBuildThread(AlignFrame af, List<ArgumentI> args)
65 viewport = af.getViewport();
70 * Builds a HMM from an alignment, then imports and adds it to the alignment.
75 barID = System.currentTimeMillis();
78 af.setProgressBar(MessageManager.getString("status.running_hmmbuild"),
81 cmds.HMMERFOLDER = Cache.getProperty(Preferences.HMMER_PATH);
83 List<SequenceGroup> groups = new ArrayList<>();
86 for (ArgumentI arg : params)
88 String name = arg.getName();
89 if (MessageManager.getString("label.hmmbuild_for").equals(name))
91 String value = arg.getValue();
92 if ("Alignment".equals(value))
94 alignment = viewport.getAlignment();
97 else if ("All groups and alignment".equals(value))
99 alignment = viewport.getAlignment();
100 groups.addAll(viewport.getAlignment().getGroups());
101 if (groups.size() > 0)
107 else if ("All groups".equals(value))
110 groups = viewport.getAlignment().getGroups();
111 if (groups.size() > 0)
117 else if ("Selected group".equals(value))
120 groups.add(viewport.getSelectionGroup());
124 else if (MessageManager.getString("label.use_reference")
127 if (!af.getViewport().hasReferenceAnnotation())
132 MessageManager.getString("status.running_hmmbuild"),
135 JvOptionPane.showInternalMessageDialog(af, MessageManager
136 .getString("warn.no_reference_annotation"));
142 else if (viewport != null)
144 alignment = viewport.getAlignment();
147 if (alignment != null)
153 if (alignment == null)
155 alignment = viewport.getAlignment();
158 if (groups != null && groups.size() > 0)
160 for (SequenceGroup grp : groups)
170 af.setProgressBar(MessageManager.getString("status.running_hmmbuild"),
175 private void runHMMBuild()
177 if (alignment == null && group == null)
179 JOptionPane.showMessageDialog(af,
180 MessageManager.getString("warn.no_sequence_data"));
184 hmmTemp = File.createTempFile("hmm", ".hmm");
185 hmmTemp.deleteOnExit();
186 stoTemp = File.createTempFile("output", ".sto");
187 stoTemp.deleteOnExit();
188 } catch (IOException e1)
190 e1.printStackTrace();
198 List<SequenceI> seqs = null;
201 seqs = group.getHMMConsensusSequences(true);
206 array = group.getSelectionAsNewSequences(alignment);
210 seqs = alignment.getHMMConsensusSequences(true);
211 if (!alignment.isAligned())
215 array = alignment.getSequencesArray();
218 cmds.setHmmSeqs(seqs);
220 if (array.length < 1)
224 JOptionPane.showMessageDialog(af,
225 MessageManager.getString("warn.no_sequence_data"));
229 SequenceI[] newArr = new SequenceI[array.length];
231 for (SequenceI seq : array)
233 newArr[index] = new Sequence(seq);
237 cmds.uniquifySequences(newArr);
241 cmds.exportData(newArr, stoTemp, null, null, group);
245 cmds.exportData(newArr, stoTemp, null, null, alignment);
248 jalview.analysis.SeqsetUtils.deuniquify(cmds.hash, array);
250 } catch (FileNotFoundException e)
252 // TODO Auto-generated catch block
258 boolean ran = runCommand();
263 } catch (IOException | InterruptedException e)
265 // TODO Auto-generated catch block
272 } catch (IOException | InterruptedException e)
274 // TODO Auto-generated catch block
277 } catch (Exception e)
284 * Executes the hmmbuild command in the command line.
287 * @throws IOException
288 * @throws InterruptedException
290 private boolean runCommand() throws IOException, InterruptedException
292 File file = new File(cmds.HMMERFOLDER + "/hmmbuild");
293 if (!file.canExecute())
295 file = new File(cmds.HMMERFOLDER + "/hmmbuild.exe");
297 if (!file.canExecute())
301 JvOptionPane.showInternalMessageDialog(af,
302 MessageManager.getString("warn.hmmbuild_failed"));
308 String command = cmds.HMMERFOLDER + cmds.HMMBUILD + cmds.SPACE;
313 for (ArgumentI arg : params)
315 String argName = arg.getName();
319 name = arg.getValue();
322 case "Use Reference Annotation":
323 command += "--hand ";
330 if (forGroup && multiJob)
332 name = group.getName() + "_HMM";
335 if (name == null || "".equals(name))
339 if (af.getTitle().length() < 15)
341 name = af.getTitle();
344 if (name == null || "".equals(name))
351 command += "-n " + name.replace(' ', '_') + cmds.SPACE;
352 if (!alignment.isNucleotide())
354 command += cmds.FORCEAMINO; // TODO check for rna
358 command += cmds.FORCEDNA;
361 command += hmmTemp.getAbsolutePath() + cmds.SPACE
362 + stoTemp.getAbsolutePath() + cmds.SPACE;
363 return cmds.runCommand(command);
367 * Imports the .hmm file produced by hmmbuild.
369 * @throws IOException
370 * @throws InterruptedException
372 private void importData() throws IOException, InterruptedException
374 HMMFile file = new HMMFile(
375 new FileParse(hmmTemp.getAbsolutePath(), DataSourceType.FILE));
376 SequenceI[] seqs = file.getSeqsAsArray();
377 SequenceI seq = seqs[0];
378 seq.createDatasetSequence();
379 HiddenMarkovModel hmm = file.getHMM();
382 seq.insertCharAt(0, group.getStartRes(), '-');
383 seq.insertCharAt(group.getEndRes() + 1,
384 alignment.getWidth() - group.getEndRes() - 1, '-');
385 seq.updateHMMMapping();
386 SequenceI topSeq = group.getSequencesInOrder(alignment)[0];
387 int topIndex = alignment.findIndex(topSeq);
388 alignment.insertSequenceAt(topIndex, seq);
389 group.setSeqrep(seq);
390 group.addSequence(seq, false);
394 alignment.insertSequenceAt(0, seq);
397 if (viewport != null)
399 viewport.alignmentChanged(viewport.getAlignPanel());
400 viewport.getAlignPanel().adjustAnnotationHeight();
401 viewport.updateSequenceIdColours();
403 if (viewport.getAlignPanel().alignFrame.getSelectedHMM() == null)
405 viewport.getAlignPanel().alignFrame.setSelectedHMMSequence(seq);
413 * Runs hmmbuild, and waits for the results to be imported before continuing
415 public void hmmbuildWaitTillComplete()
417 Thread loader = new Thread(this);
420 while (loader.isAlive())
425 } catch (Exception ex)