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;
35 boolean multiJob = false;
38 List<ArgumentI> params;
41 boolean forGroup = false;
50 * This is used for validation purposes. Do not use!
54 public HMMBuildThread(AlignmentI alignment)
56 this.alignment = alignment;
60 public HMMBuildThread(AlignFrame af, List<ArgumentI> args)
63 viewport = af.getViewport();
68 * Builds a HMM from an alignment, then imports and adds it to the alignment.
73 barID = System.currentTimeMillis();
76 af.setProgressBar(MessageManager.getString("status.running_hmmbuild"),
79 cmds.HMMERFOLDER = Cache.getProperty(Preferences.HMMER_PATH);
81 List<SequenceGroup> groups = new ArrayList<>();
84 for (ArgumentI arg : params)
86 String name = arg.getName();
87 if (MessageManager.getString("label.hmmbuild_for").equals(name))
89 String value = arg.getValue();
90 if ("Alignment".equals(value))
92 alignment = viewport.getAlignment();
95 else if ("All groups and alignment".equals(value))
97 alignment = viewport.getAlignment();
98 groups.addAll(viewport.getAlignment().getGroups());
99 if (groups.size() > 0)
105 else if ("All groups".equals(value))
108 groups = viewport.getAlignment().getGroups();
109 if (groups.size() > 0)
115 else if ("Selected group".equals(value))
118 groups.add(viewport.getSelectionGroup());
122 else if (MessageManager.getString("label.use_reference")
125 if (!af.getViewport().hasReferenceAnnotation())
130 MessageManager.getString("status.running_hmmbuild"),
133 JvOptionPane.showInternalMessageDialog(af, MessageManager
134 .getString("warn.no_reference_annotation"));
140 else if (viewport != null)
142 alignment = viewport.getAlignment();
145 if (alignment != null)
151 if (alignment == null)
153 alignment = viewport.getAlignment();
156 if (groups != null && groups.size() > 0)
158 for (SequenceGroup grp : groups)
169 af.setProgressBar(MessageManager.getString("status.running_hmmbuild"),
174 private void runHMMBuild()
176 if (alignment == null && group == null)
178 JOptionPane.showMessageDialog(af,
179 MessageManager.getString("warn.no_sequence_data"));
183 hmmTemp = File.createTempFile("hmm", ".hmm");
184 hmmTemp.deleteOnExit();
185 stoTemp = File.createTempFile("output", ".sto");
186 stoTemp.deleteOnExit();
187 } catch (IOException e1)
189 e1.printStackTrace();
197 List<SequenceI> seqs = null;
200 seqs = group.getHMMConsensusSequences(true);
205 array = group.getSelectionAsNewSequences(alignment);
209 seqs = alignment.getHMMConsensusSequences(true);
210 if (!alignment.isAligned())
214 array = alignment.getSequencesArray();
217 cmds.setHmmSeqs(seqs);
219 if (array.length < 1)
223 JOptionPane.showMessageDialog(af,
224 MessageManager.getString("warn.no_sequence_data"));
228 SequenceI[] newArr = new SequenceI[array.length];
230 for (SequenceI seq : array)
232 newArr[index] = new Sequence(seq);
236 cmds.uniquifySequences(newArr);
237 cmds.exportData(newArr, stoTemp, null, null);
238 jalview.analysis.SeqsetUtils.deuniquify(cmds.hash, array);
240 } catch (FileNotFoundException e)
242 // TODO Auto-generated catch block
248 boolean ran = runCommand();
253 } catch (IOException | InterruptedException e)
255 // TODO Auto-generated catch block
262 } catch (IOException | InterruptedException e)
264 // TODO Auto-generated catch block
267 } catch (Exception e)
276 * Executes the hmmbuild command in the command line.
279 * @throws IOException
280 * @throws InterruptedException
282 private boolean runCommand() throws IOException, InterruptedException
284 File file = new File(cmds.HMMERFOLDER + "/hmmbuild");
285 if (!file.canExecute())
287 file = new File(cmds.HMMERFOLDER + "/hmmbuild.exe");
289 if (!file.canExecute())
293 JvOptionPane.showInternalMessageDialog(af,
294 MessageManager.getString("warn.hmmbuild_failed"));
300 String command = cmds.HMMERFOLDER + cmds.HMMBUILD + cmds.SPACE;
305 for (ArgumentI arg : params)
307 String argName = arg.getName();
311 name = arg.getValue();
314 case "Use Reference Annotation":
315 command += "--hand ";
323 if (forGroup && multiJob)
325 name = group.getName() + "_HMM";
329 if (name == null || "".equals(name))
333 name = af.getTitle();
335 if (name == null || "".equals(name))
342 command += "-n " + name.replace(' ', '_') + cmds.SPACE;
343 if (!alignment.isNucleotide())
345 command += cmds.FORCEAMINO; // TODO check for rna
349 command += cmds.FORCEDNA;
352 command += hmmTemp.getAbsolutePath()
353 + cmds.SPACE + stoTemp.getAbsolutePath() + cmds.SPACE;
354 return cmds.runCommand(command);
358 * Imports the .hmm file produced by hmmbuild.
360 * @throws IOException
361 * @throws InterruptedException
363 private void importData() throws IOException, InterruptedException
365 HMMFile file = new HMMFile(new FileParse(hmmTemp.getAbsolutePath(),
366 DataSourceType.FILE));
367 SequenceI[] seqs = file.getSeqsAsArray();
368 SequenceI seq = seqs[0];
369 seq.createDatasetSequence();
370 HiddenMarkovModel hmm = file.getHMM();
373 seq.insertCharAt(0, group.getStartRes(), '-');
374 seq.insertCharAt(group.getEndRes() + 1,
375 alignment.getWidth() - group.getEndRes(), '-');
376 seq.updateHMMMapping();
377 SequenceI topSeq = group.getSequencesInOrder(alignment)[0];
378 int topIndex = alignment.findIndex(topSeq);
379 alignment.insertSequenceAt(topIndex, seq);
380 group.setSeqrep(seq);
381 group.addSequence(seq, false);
385 alignment.insertSequenceAt(0, seq);
388 if (viewport != null)
390 viewport.alignmentChanged(viewport.getAlignPanel());
391 viewport.getAlignPanel().adjustAnnotationHeight();
392 viewport.updateSequenceIdColours();
394 if (viewport.getAlignPanel().alignFrame.getSelectedHMM() == null)
396 viewport.getAlignPanel().alignFrame.setSelectedHMMSequence(seq);
404 * Runs hmmbuild, and waits for the results to be imported before continuing
406 public void hmmbuildWaitTillComplete()
408 Thread loader = new Thread(this);
411 while (loader.isAlive())
416 } catch (Exception ex)