3 import jalview.api.AlignViewportI;
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.IOException;
19 import java.util.ArrayList;
20 import java.util.List;
22 import javax.swing.JOptionPane;
24 public class HMMBuildThread extends HmmerCommand implements Runnable
26 static final String ARG_AMINO = "--amino";
28 static final String ARG_DNA = "--dna";
30 static final String ARG_RNA = "--rna";
40 public HMMBuildThread(AlignFrame alignFrame, List<ArgumentI> args)
42 super(alignFrame, args);
46 * Builds a HMM from an alignment (and/or groups), then imports and adds it to
47 * the alignment (and/or groups)
52 long msgID = System.currentTimeMillis();
55 af.setProgressBar(MessageManager.getString("status.running_hmmbuild"),
59 AlignViewportI viewport = af.getViewport();
62 List<SequenceGroup> groups = new ArrayList<>();
65 for (ArgumentI arg : params)
67 String name = arg.getName();
68 if (MessageManager.getString("label.hmmbuild_for").equals(name))
70 String value = arg.getValue();
71 if (MessageManager.getString("label.alignment").equals(value))
73 alignment = viewport.getAlignment();
75 else if (MessageManager.getString("label.groups_and_alignment")
78 alignment = viewport.getAlignment();
79 groups.addAll(viewport.getAlignment().getGroups());
81 else if (MessageManager.getString("label.groups").equals(value))
84 groups = viewport.getAlignment().getGroups();
86 else if ("label.selected_group".equals(value))
89 groups.add(viewport.getSelectionGroup());
92 else if (MessageManager.getString("label.use_reference")
95 // todo disable this option if no RF annotation on alignment
96 if (!af.getViewport().hasReferenceAnnotation())
98 JvOptionPane.showInternalMessageDialog(af, MessageManager
99 .getString("warn.no_reference_annotation"));
105 else if (viewport != null)
107 alignment = viewport.getAlignment();
110 if (alignment != null)
115 if (alignment == null)
117 alignment = viewport.getAlignment();
120 for (SequenceGroup grp : groups)
128 af.setProgressBar("", msgID);
134 * Runs hmmbuild on the alignment, or on the group if one is specified
138 private void runHMMBuild(SequenceGroup group)
140 if (alignment == null && group == null)
142 JOptionPane.showMessageDialog(af,
143 MessageManager.getString("warn.no_sequence_data"));
146 File alignmentFile = null;
149 hmmFile = createTempFile("hmm", ".hmm");
150 alignmentFile = createTempFile("output", ".sto");
152 List<SequenceI> hmmSeqs = null;
155 hmmSeqs = group.getHMMConsensusSequences();
156 array = group.getSelectionAsNewSequences(alignment);
160 hmmSeqs = alignment.getHMMConsensusSequences();
161 // todo pad gaps in an unaligned SequenceGroup as well?
162 if (!alignment.isAligned())
166 array = alignment.getSequencesArray();
169 if (array.length < 1)
173 JOptionPane.showMessageDialog(af,
174 MessageManager.getString("warn.no_sequence_data"));
180 * copy over sequences excluding hmm consensus sequences
182 SequenceI[] newArr = new SequenceI[array.length - hmmSeqs.size()];
184 for (SequenceI seq : array)
186 if (seq.isHMMConsensusSequence())
188 alignment.deleteSequence(seq);
192 newArr[index] = new Sequence(seq);
197 stashSequences(newArr);
199 exportStockholm(newArr, alignmentFile,
200 group != null ? group : alignment);
202 recoverSequences(array);
204 boolean ran = runCommand(alignmentFile, hmmFile, group);
209 importData(hmmFile, group);
210 } catch (Exception e)
219 if (alignmentFile != null)
221 alignmentFile.delete();
227 * Constructs and executes the hmmbuild command as a separate process
230 * the alignment from which the HMM is built
232 * the output file to which the HMM is written
234 * (optional) group for which the hmm is generated
237 * @throws IOException
238 * @throws InterruptedException
240 private boolean runCommand(File sequences, File hmm, SequenceGroup group)
241 throws IOException, InterruptedException
244 String cmd = getCommandPath(HMMBUILD);
249 List<String> args = new ArrayList<>();
255 for (ArgumentI arg : params)
257 String argName = arg.getName();
261 name = arg.getValue();
264 case "Use Reference Annotation":
273 name = group.getName() + "_HMM";
276 if (name == null || "".equals(name))
280 if (af.getTitle().length() < 15)
282 name = af.getTitle();
285 if (name == null || "".equals(name))
293 args.add(name.replace(' ', '_'));
294 if (!alignment.isNucleotide())
296 args.add(ARG_AMINO); // TODO check for rna
303 args.add(hmm.getAbsolutePath());
304 args.add(sequences.getAbsolutePath());
306 return runCommand(args);
310 * Imports the .hmm file produced by hmmbuild, and inserts the HMM consensus
311 * sequence (with attached HMM profile) as the first sequence in the alignment
312 * or group for which it was generated
315 * @oparam group (optional) the group for which the hmm was generated
316 * @throws IOException
317 * @throws InterruptedException
319 private void importData(File hmmFile, SequenceGroup group)
320 throws IOException, InterruptedException
322 HMMFile file = new HMMFile(
323 new FileParse(hmmFile.getAbsolutePath(), DataSourceType.FILE));
324 SequenceI[] seqs = file.getSeqsAsArray();
325 SequenceI seq = seqs[0];
326 seq.createDatasetSequence();
329 seq.insertCharAt(0, group.getStartRes(), '-');
330 seq.insertCharAt(group.getEndRes() + 1,
331 alignment.getWidth() - group.getEndRes() - 1, '-');
332 seq.updateHMMMapping();
333 SequenceI topSeq = group.getSequencesInOrder(alignment)[0];
334 int topIndex = alignment.findIndex(topSeq);
335 alignment.insertSequenceAt(topIndex, seq);
336 group.setSeqrep(seq);
337 group.addSequence(seq, false);
341 alignment.insertSequenceAt(0, seq);
344 AlignViewport viewport = af.getViewport();
345 if (viewport != null)
347 viewport.alignmentChanged(viewport.getAlignPanel());
348 viewport.getAlignPanel().adjustAnnotationHeight();
349 viewport.updateSequenceIdColours();
351 if (viewport.getAlignPanel().alignFrame.getSelectedHMM() == null)
353 viewport.getAlignPanel().alignFrame.setSelectedHMMSequence(seq);
359 * Runs hmmbuild, and waits for the results to be imported before continuing
361 public void hmmbuildWaitTillComplete()
363 Thread loader = new Thread(this);
366 while (loader.isAlive())
371 } catch (Exception ex)