3 import jalview.analysis.SeqsetUtils;
4 import jalview.datamodel.AlignmentI;
5 import jalview.datamodel.Sequence;
6 import jalview.datamodel.SequenceGroup;
7 import jalview.datamodel.SequenceI;
8 import jalview.gui.AlignFrame;
9 import jalview.gui.AlignViewport;
10 import jalview.gui.JvOptionPane;
11 import jalview.io.DataSourceType;
12 import jalview.io.FileParse;
13 import jalview.io.HMMFile;
14 import jalview.util.MessageManager;
15 import jalview.ws.params.ArgumentI;
18 import java.io.FileNotFoundException;
19 import java.io.IOException;
20 import java.util.ArrayList;
21 import java.util.List;
23 import javax.swing.JOptionPane;
25 public class HMMBuildThread extends HmmerCommand implements Runnable
27 AlignViewport viewport;
29 boolean multiJob = false;
35 List<ArgumentI> params;
37 boolean forGroup = false;
46 * This is used for validation purposes. Do not use!
50 public HMMBuildThread(AlignmentI alignment)
52 this.alignment = alignment;
56 public HMMBuildThread(AlignFrame af, List<ArgumentI> args)
59 viewport = af.getViewport();
64 * Builds a HMM from an alignment, then imports and adds it to the alignment.
69 barID = System.currentTimeMillis();
72 af.setProgressBar(MessageManager.getString("status.running_hmmbuild"),
76 List<SequenceGroup> groups = new ArrayList<>();
79 for (ArgumentI arg : params)
81 String name = arg.getName();
82 if (MessageManager.getString("label.hmmbuild_for").equals(name))
84 String value = arg.getValue();
85 if ("Alignment".equals(value))
87 alignment = viewport.getAlignment();
90 else if ("All groups and alignment".equals(value))
92 alignment = viewport.getAlignment();
93 groups.addAll(viewport.getAlignment().getGroups());
94 if (groups.size() > 0)
100 else if ("All groups".equals(value))
103 groups = viewport.getAlignment().getGroups();
104 if (groups.size() > 0)
110 else if ("Selected group".equals(value))
113 groups.add(viewport.getSelectionGroup());
117 else if (MessageManager.getString("label.use_reference")
120 if (!af.getViewport().hasReferenceAnnotation())
125 MessageManager.getString("status.running_hmmbuild"),
128 JvOptionPane.showInternalMessageDialog(af, MessageManager
129 .getString("warn.no_reference_annotation"));
135 else if (viewport != null)
137 alignment = viewport.getAlignment();
140 if (alignment != null)
146 if (alignment == null)
148 alignment = viewport.getAlignment();
151 if (groups != null && groups.size() > 0)
153 for (SequenceGroup grp : groups)
163 af.setProgressBar("", barID);
167 private void runHMMBuild()
169 if (alignment == null && group == null)
171 JOptionPane.showMessageDialog(af,
172 MessageManager.getString("warn.no_sequence_data"));
176 hmmTemp = File.createTempFile("hmm", ".hmm");
177 hmmTemp.deleteOnExit();
178 stoTemp = File.createTempFile("output", ".sto");
179 stoTemp.deleteOnExit();
180 } catch (IOException e1)
182 e1.printStackTrace();
190 List<SequenceI> hmmSeqs = null;
193 hmmSeqs = group.getHMMConsensusSequences();
194 if (hmmSeqs.size() > 0)
196 // todo why this test? means can't re-run hmmbuild on a group?
199 array = group.getSelectionAsNewSequences(alignment);
203 hmmSeqs = alignment.getHMMConsensusSequences();
204 if (!alignment.isAligned())
208 array = alignment.getSequencesArray();
211 if (array.length < 1)
215 JOptionPane.showMessageDialog(af,
216 MessageManager.getString("warn.no_sequence_data"));
222 * copy over sequences excluding hmm consensus sequences
224 SequenceI[] newArr = new SequenceI[array.length - hmmSeqs.size()];
226 for (SequenceI seq : array)
228 if (!seq.isHMMConsensusSequence())
230 newArr[index] = new Sequence(seq);
235 uniquifySequences(newArr);
239 exportData(newArr, stoTemp, null, null, group);
243 exportData(newArr, stoTemp, null, null, alignment);
246 SeqsetUtils.deuniquify(hash, array);
248 } catch (FileNotFoundException e)
250 // TODO Auto-generated catch block
256 boolean ran = runCommand();
261 } catch (IOException | InterruptedException e)
263 // TODO Auto-generated catch block
270 } catch (IOException | InterruptedException e)
272 // TODO Auto-generated catch block
275 } catch (Exception e)
282 * Executes the hmmbuild command in the command line.
285 * @throws IOException
286 * @throws InterruptedException
288 private boolean runCommand() throws IOException, InterruptedException
290 String binaryPath = getCommandRoot(HMMBUILD);
291 if (binaryPath == null)
295 String command = binaryPath + SPACE;
300 for (ArgumentI arg : params)
302 String argName = arg.getName();
306 name = arg.getValue();
309 case "Use Reference Annotation":
310 command += "--hand ";
317 if (forGroup && multiJob)
319 name = group.getName() + "_HMM";
322 if (name == null || "".equals(name))
326 if (af.getTitle().length() < 15)
328 name = af.getTitle();
331 if (name == null || "".equals(name))
338 command += "-n " + name.replace(' ', '_') + SPACE;
339 if (!alignment.isNucleotide())
341 command += FORCEAMINO; // TODO check for rna
348 command += hmmTemp.getAbsolutePath() + SPACE + stoTemp.getAbsolutePath()
350 return 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(
362 new FileParse(hmmTemp.getAbsolutePath(), DataSourceType.FILE));
363 SequenceI[] seqs = file.getSeqsAsArray();
364 SequenceI seq = seqs[0];
365 seq.createDatasetSequence();
368 seq.insertCharAt(0, group.getStartRes(), '-');
369 seq.insertCharAt(group.getEndRes() + 1,
370 alignment.getWidth() - group.getEndRes() - 1, '-');
371 seq.updateHMMMapping();
372 SequenceI topSeq = group.getSequencesInOrder(alignment)[0];
373 int topIndex = alignment.findIndex(topSeq);
374 alignment.insertSequenceAt(topIndex, seq);
375 group.setSeqrep(seq);
376 group.addSequence(seq, false);
380 alignment.insertSequenceAt(0, seq);
383 if (viewport != null)
385 viewport.alignmentChanged(viewport.getAlignPanel());
386 viewport.getAlignPanel().adjustAnnotationHeight();
387 viewport.updateSequenceIdColours();
389 if (viewport.getAlignPanel().alignFrame.getSelectedHMM() == null)
391 viewport.getAlignPanel().alignFrame.setSelectedHMMSequence(seq);
399 * Runs hmmbuild, and waits for the results to be imported before continuing
401 public void hmmbuildWaitTillComplete()
403 Thread loader = new Thread(this);
406 while (loader.isAlive())
411 } catch (Exception ex)