4 import jalview.bin.Cache;
5 import jalview.datamodel.AlignmentI;
6 import jalview.datamodel.HiddenMarkovModel;
7 import jalview.datamodel.Sequence;
8 import jalview.datamodel.SequenceGroup;
9 import jalview.datamodel.SequenceI;
10 import jalview.gui.AlignFrame;
11 import jalview.gui.AlignViewport;
12 import jalview.gui.JvOptionPane;
13 import jalview.gui.Preferences;
14 import jalview.io.DataSourceType;
15 import jalview.io.FileParse;
16 import jalview.io.HMMFile;
17 import jalview.util.MessageManager;
18 import jalview.ws.params.ArgumentI;
21 import java.io.FileNotFoundException;
22 import java.io.IOException;
23 import java.util.ArrayList;
24 import java.util.List;
26 import javax.swing.JOptionPane;
28 public class HMMBuildThread implements Runnable
30 HMMERCommands cmds = new HMMERCommands();
33 AlignViewport viewport;
37 List<ArgumentI> params;
40 boolean forGroup = false;
49 * This is used for validation purposes. Do not use!
53 public HMMBuildThread(AlignmentI alignment)
55 this.alignment = alignment;
59 public HMMBuildThread(AlignFrame af, List<ArgumentI> args)
62 viewport = af.getViewport();
67 * Builds a HMM from an alignment, then imports and adds it to the alignment.
72 barID = System.currentTimeMillis();
75 af.setProgressBar(MessageManager.getString("status.running_hmmbuild"),
78 cmds.HMMERFOLDER = Cache.getProperty(Preferences.HMMER_PATH);
80 List<SequenceGroup> groups = new ArrayList<>();
83 for (ArgumentI arg : params)
85 String name = arg.getName();
86 if (MessageManager.getString("label.hmmbuild_for").equals(name))
88 String value = arg.getValue();
89 if ("Alignment".equals(value))
91 alignment = viewport.getAlignment();
94 else if ("All groups and alignment".equals(value))
96 alignment = viewport.getAlignment();
97 groups.addAll(viewport.getAlignment().getGroups());
100 else if ("All groups".equals(value))
103 groups = viewport.getAlignment().getGroups();
106 else if ("Selected group".equals(value))
109 groups.add(viewport.getSelectionGroup());
113 else if (MessageManager.getString("label.use_reference")
116 if (!af.getViewport().hasReferenceAnnotation())
121 MessageManager.getString("status.running_hmmbuild"),
124 JvOptionPane.showInternalMessageDialog(af, MessageManager
125 .getString("warn.no_reference_annotation"));
133 if (viewport != null && alignment == null)
135 alignment = viewport.getAlignment();
139 if (alignment != null)
145 if (alignment == null)
147 alignment = viewport.getAlignment();
150 if (groups != null && groups.size() > 0)
152 for (SequenceGroup grp : groups)
163 af.setProgressBar(MessageManager.getString("status.running_hmmbuild"),
168 private void runHMMBuild()
170 if (alignment == null && group == null)
172 JOptionPane.showMessageDialog(af,
173 MessageManager.getString("warn.no_sequence_data"));
177 hmmTemp = File.createTempFile("hmm", ".hmm");
178 hmmTemp.deleteOnExit();
179 stoTemp = File.createTempFile("output", ".sto");
180 stoTemp.deleteOnExit();
181 } catch (IOException e1)
183 e1.printStackTrace();
191 List<SequenceI> seqs = null;
194 seqs = group.getHMMConsensusSequences(true);
199 array = group.getSelectionAsNewSequences(alignment);
203 seqs = alignment.getHMMConsensusSequences(true);
204 if (!alignment.isAligned())
208 array = alignment.getSequencesArray();
211 cmds.setHmmSeqs(seqs);
213 if (array.length < 1)
217 JOptionPane.showMessageDialog(af,
218 MessageManager.getString("warn.no_sequence_data"));
222 SequenceI[] newArr = new SequenceI[array.length];
224 for (SequenceI seq : array)
226 newArr[index] = new Sequence(seq);
230 cmds.uniquifySequences(newArr);
231 cmds.exportData(newArr, stoTemp, null, null);
232 jalview.analysis.SeqsetUtils.deuniquify(cmds.hash, array);
234 } catch (FileNotFoundException e)
236 // TODO Auto-generated catch block
242 boolean ran = runCommand();
247 } catch (IOException | InterruptedException e)
249 // TODO Auto-generated catch block
256 } catch (IOException | InterruptedException e)
258 // TODO Auto-generated catch block
261 } catch (Exception e)
270 * Executes the hmmbuild command in the command line.
273 * @throws IOException
274 * @throws InterruptedException
276 private boolean runCommand() throws IOException, InterruptedException
278 File file = new File(cmds.HMMERFOLDER + "/hmmbuild");
279 if (!file.canExecute())
281 file = new File(cmds.HMMERFOLDER + "/hmmbuild.exe");
283 if (!file.canExecute())
287 JvOptionPane.showInternalMessageDialog(af,
288 MessageManager.getString("warn.hmmbuild_failed"));
294 String command = cmds.HMMERFOLDER + cmds.HMMBUILD + cmds.SPACE;
299 for (ArgumentI arg : params)
301 String argName = arg.getName();
305 name = arg.getValue();
308 case "Use Reference Annotation":
309 command += "--hand ";
319 if (name == null || "".equals(name))
323 name = group.getName();
329 name = af.getTitle();
331 if (name == null || "".equals(name))
338 command += "-n " + name.replace(' ', '_') + cmds.SPACE;
339 if (!alignment.isNucleotide())
341 command += cmds.FORCEAMINO; // TODO check for rna
345 command += cmds.FORCEDNA;
348 command += hmmTemp.getAbsolutePath()
349 + cmds.SPACE + stoTemp.getAbsolutePath() + cmds.SPACE;
350 return cmds.runCommand(command);
354 * Imports the .hmm file produced by hmmbuild.
356 * @throws IOException
357 * @throws InterruptedException
359 private void importData() throws IOException, InterruptedException
361 HMMFile file = new HMMFile(new FileParse(hmmTemp.getAbsolutePath(),
362 DataSourceType.FILE));
363 SequenceI[] seqs = file.getSeqsAsArray();
364 SequenceI seq = seqs[0];
365 seq.createDatasetSequence();
366 HiddenMarkovModel hmm = file.getHMM();
369 seq.insertCharAt(0, group.getStartRes(), '-');
370 seq.insertCharAt(group.getEndRes() + 1,
371 alignment.getWidth() - group.getEndRes(), '-');
372 seq.updateHMMMapping();
373 SequenceI topSeq = group.getSequencesInOrder(alignment)[0];
374 int topIndex = alignment.findIndex(topSeq);
375 alignment.insertSequenceAt(topIndex, seq);
376 group.setSeqrep(seq);
377 group.addSequence(seq, false);
381 alignment.insertSequenceAt(0, seq);
384 if (viewport != null)
386 viewport.alignmentChanged(viewport.getAlignPanel());
387 viewport.getAlignPanel().adjustAnnotationHeight();
388 viewport.updateSequenceIdColours();
390 if (viewport.getAlignPanel().alignFrame.getSelectedHMM() == null)
392 viewport.getAlignPanel().alignFrame.setSelectedHMMSequence(seq);
400 * Runs hmmbuild, and waits for the results to be imported before continuing
402 public void hmmbuildWaitTillComplete()
404 Thread loader = new Thread(this);
407 while (loader.isAlive())
412 } catch (Exception ex)