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();
64 alignment = viewport.getAlignment();
66 List<SequenceGroup> groups = new ArrayList<>();
69 for (ArgumentI arg : params)
71 String name = arg.getName();
72 if (MessageManager.getString("label.hmmbuild_for").equals(name))
74 String value = arg.getValue();
75 if (MessageManager.getString("label.alignment").equals(value))
77 alignment = viewport.getAlignment();
79 else if (MessageManager.getString("label.groups_and_alignment")
82 alignment = viewport.getAlignment();
83 groups.addAll(viewport.getAlignment().getGroups());
85 else if (MessageManager.getString("label.groups").equals(value))
88 groups = viewport.getAlignment().getGroups();
90 else if ("label.selected_group".equals(value))
93 groups.add(viewport.getSelectionGroup());
96 else if (MessageManager.getString("label.use_reference")
99 // todo disable this option if no RF annotation on alignment
100 if (!af.getViewport().hasReferenceAnnotation())
102 JvOptionPane.showInternalMessageDialog(af, MessageManager
103 .getString("warn.no_reference_annotation"));
110 if (alignment != null)
115 if (alignment == null)
117 alignment = viewport.getAlignment();
120 for (SequenceGroup grp : groups)
128 af.buildColourMenu(); // enable HMMER colour schemes
129 af.setProgressBar("", msgID);
135 * Runs hmmbuild on the alignment, or on the group if one is specified
139 private void runHMMBuild(SequenceGroup group)
141 if (alignment == null && group == null)
143 JOptionPane.showMessageDialog(af,
144 MessageManager.getString("warn.no_sequence_data"));
147 File alignmentFile = null;
150 hmmFile = createTempFile("hmm", ".hmm");
151 alignmentFile = createTempFile("output", ".sto");
153 List<SequenceI> hmmSeqs = null;
156 hmmSeqs = group.getHMMConsensusSequences();
157 array = group.getSelectionAsNewSequences(alignment);
161 hmmSeqs = alignment.getHMMConsensusSequences();
162 // todo pad gaps in an unaligned SequenceGroup as well?
163 if (!alignment.isAligned())
167 array = alignment.getSequencesArray();
170 if (array.length < 1)
174 JOptionPane.showMessageDialog(af,
175 MessageManager.getString("warn.no_sequence_data"));
181 * copy over sequences excluding hmm consensus sequences
183 SequenceI[] newArr = new SequenceI[array.length - hmmSeqs.size()];
185 for (SequenceI seq : array)
187 if (seq.isHMMConsensusSequence())
189 alignment.deleteSequence(seq);
193 newArr[index] = new Sequence(seq);
198 stashSequences(newArr);
200 exportStockholm(newArr, alignmentFile,
201 group != null ? group : alignment);
203 recoverSequences(array);
205 boolean ran = runCommand(alignmentFile, hmmFile, group);
210 importData(hmmFile, group);
211 } catch (Exception e)
220 if (alignmentFile != null)
222 alignmentFile.delete();
228 * Constructs and executes the hmmbuild command as a separate process
231 * the alignment from which the HMM is built
233 * the output file to which the HMM is written
235 * (optional) group for which the hmm is generated
238 * @throws IOException
239 * @throws InterruptedException
241 private boolean runCommand(File sequences, File hmm, SequenceGroup group)
242 throws IOException, InterruptedException
245 String cmd = getCommandPath(HMMBUILD);
250 List<String> args = new ArrayList<>();
256 for (ArgumentI arg : params)
258 String argName = arg.getName();
262 name = arg.getValue();
265 case "Use Reference Annotation":
274 name = group.getName() + "_HMM";
277 if (name == null || "".equals(name))
281 if (af.getTitle().length() < 15)
283 name = af.getTitle();
286 if (name == null || "".equals(name))
294 args.add(name.replace(' ', '_'));
295 if (!alignment.isNucleotide())
297 args.add(ARG_AMINO); // TODO check for rna
304 args.add(hmm.getAbsolutePath());
305 args.add(sequences.getAbsolutePath());
307 return runCommand(args);
311 * Imports the .hmm file produced by hmmbuild, and inserts the HMM consensus
312 * sequence (with attached HMM profile) as the first sequence in the alignment
313 * or group for which it was generated
316 * @oparam group (optional) the group for which the hmm was generated
317 * @throws IOException
318 * @throws InterruptedException
320 private void importData(File hmmFile, SequenceGroup group)
321 throws IOException, InterruptedException
323 HMMFile file = new HMMFile(
324 new FileParse(hmmFile.getAbsolutePath(), DataSourceType.FILE));
325 SequenceI[] seqs = file.getSeqsAsArray();
326 SequenceI seq = seqs[0];
327 seq.createDatasetSequence();
330 seq.insertCharAt(0, group.getStartRes(), '-');
331 seq.insertCharAt(group.getEndRes() + 1,
332 alignment.getWidth() - group.getEndRes() - 1, '-');
333 seq.updateHMMMapping();
334 SequenceI topSeq = group.getSequencesInOrder(alignment)[0];
335 int topIndex = alignment.findIndex(topSeq);
336 alignment.insertSequenceAt(topIndex, seq);
337 group.setSeqrep(seq);
338 group.addSequence(seq, false);
342 alignment.insertSequenceAt(0, seq);
345 AlignViewport viewport = af.getViewport();
346 if (viewport != null)
348 viewport.alignmentChanged(viewport.getAlignPanel());
349 viewport.getAlignPanel().adjustAnnotationHeight();
350 viewport.updateSequenceIdColours();
352 if (viewport.getAlignPanel().alignFrame.getSelectedHMM() == null)
354 viewport.getAlignPanel().alignFrame.setSelectedHMMSequence(seq);
360 * Runs hmmbuild, and waits for the results to be imported before continuing
362 public void hmmbuildWaitTillComplete()
364 Thread loader = new Thread(this);
367 while (loader.isAlive())
372 } catch (Exception ex)