X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fhmmer%2FHMMBuild.java;h=0c47c1dd8011fc05ef682d1f39fb113439eb94ac;hb=8d2c4f1719e83f64cabdc294b3e051b7417a77e1;hp=6887cb51432532c88ed1c33e39976484acf799ee;hpb=05a51640d2a5c35cd32e8ad831963bd268ea10f6;p=jalview.git diff --git a/src/jalview/hmmer/HMMBuild.java b/src/jalview/hmmer/HMMBuild.java index 6887cb5..0c47c1d 100644 --- a/src/jalview/hmmer/HMMBuild.java +++ b/src/jalview/hmmer/HMMBuild.java @@ -5,15 +5,15 @@ import jalview.bin.Cache; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; import jalview.datamodel.AnnotatedCollectionI; +import jalview.datamodel.ResidueCount; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; -import jalview.gui.AlignViewport; -import jalview.gui.AlignmentPanel; import jalview.gui.JvOptionPane; import jalview.io.DataSourceType; import jalview.io.FileParse; import jalview.io.HMMFile; +import jalview.util.FileUtils; import jalview.util.MessageManager; import jalview.ws.params.ArgumentI; @@ -21,7 +21,6 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Hashtable; -import java.util.Iterator; import java.util.List; /** @@ -57,7 +56,7 @@ public class HMMBuild extends HmmerCommand @Override public void run() { - if (params == null) + if (params == null || params.isEmpty()) { Cache.log.error("No parameters to HMMBuild!|"); return; @@ -81,9 +80,9 @@ public class HMMBuild extends HmmerCommand } } finally { - viewport.updateInformation(af.alignPanel); - af.buildColourMenu(); // to enable HMMER colour schemes af.setProgressBar("", msgID); + viewport.alignmentChanged(af.alignPanel); + af.buildColourMenu(); // to enable HMMER colour schemes } } @@ -98,20 +97,26 @@ public class HMMBuild extends HmmerCommand AlignViewportI viewport) { List runBuildFor = new ArrayList<>(); + boolean foundArg = false; + for (ArgumentI arg : params) { String name = arg.getName(); if (MessageManager.getString("label.hmmbuild_for").equals(name)) { + foundArg = true; String value = arg.getValue(); + if (MessageManager.getString("label.alignment").equals(value)) { - runBuildFor.add(alignment); + runBuildFor.add(viewport.getAlignmentView(false) + .getVisibleAlignment('-')); } else if (MessageManager.getString("label.groups_and_alignment") .equals(value)) { - runBuildFor.add(alignment); + runBuildFor.add(viewport.getAlignmentView(false) + .getVisibleAlignment('-')); runBuildFor.addAll(viewport.getAlignment().getGroups()); } else if (MessageManager.getString("label.groups").equals(value)) @@ -136,6 +141,15 @@ public class HMMBuild extends HmmerCommand } } } + + /* + * default is to build for the whole alignment + */ + if (!foundArg) + { + runBuildFor.add(alignment); + } + return runBuildFor; } @@ -150,11 +164,8 @@ public class HMMBuild extends HmmerCommand File alignmentFile = null; try { - hmmFile = createTempFile("hmm", ".hmm"); - alignmentFile = createTempFile("output", ".sto"); - List seqs = ac.getSequences(); - List copy = new ArrayList<>(); - copy.addAll(seqs); + hmmFile = FileUtils.createTempFile("hmm", ".hmm"); + alignmentFile = FileUtils.createTempFile("output", ".sto"); if (ac instanceof Alignment) { @@ -166,34 +177,41 @@ public class HMMBuild extends HmmerCommand } } - /* - * copy over sequences, excluding hmm consensus sequences - * hmm sequences are also deleted in preparation for - * re-adding them when recalculated; Information annotation is not - * deleted, it will be updated to reference the new hmm sequence - * by InformationThread.findOrCreateAnnotation - */ - Iterator it = copy.iterator(); - while (it.hasNext()) + deleteHmmSequences(ac); + + List copy = new ArrayList<>(); + if (ac instanceof Alignment) + { + copy.addAll(ac.getSequences()); + } + else { - SequenceI seq = it.next(); - if (seq.isHMMConsensusSequence()) + SequenceI[] sel = ((SequenceGroup) ac) + .getSelectionAsNewSequences((AlignmentI) ac.getContext()); + for (SequenceI seq : sel) { - alignment.deleteSequence(seq); - it.remove(); + if (seq != null) + { + copy.add(seq); + } } } + // TODO rather than copy alignment data we should anonymize in situ - + // export/File import could use anonymization hash to reinstate references + // at import level ? SequenceI[] copyArray = copy.toArray(new SequenceI[copy.size()]); Hashtable sequencesHash = stashSequences(copyArray); exportStockholm(copyArray, alignmentFile, ac); - recoverSequences(sequencesHash, seqs.toArray(new SequenceI[] {})); + recoverSequences(sequencesHash, copy.toArray(new SequenceI[] {})); boolean ran = runCommand(alignmentFile, hmmFile, ac); if (!ran) { + JvOptionPane.showInternalMessageDialog(af, MessageManager + .formatMessage("warn.command_failed", "hmmbuild")); return; } importData(hmmFile, ac); @@ -241,7 +259,7 @@ public class HMMBuild extends HmmerCommand * HMM name (will be given to consensus sequence) is * - as specified by an input parameter if set * - else group name with _HMM appended (if for a group) - * - else align fame title with _HMM appended (if title is not too long) + * - else align frame title with _HMM appended (if title is not too long) * - else "Alignment_HMM" */ String name = ""; @@ -291,8 +309,8 @@ public class HMMBuild extends HmmerCommand args.add(ARG_DNA); } - args.add(hmmFile.getAbsolutePath()); - args.add(sequencesFile.getAbsolutePath()); + args.add(getFilePath(hmmFile, true)); + args.add(getFilePath(sequencesFile, true)); return runCommand(args); } @@ -310,43 +328,43 @@ public class HMMBuild extends HmmerCommand private void importData(File hmmFile, AnnotatedCollectionI ac) throws IOException { + if (hmmFile.length() == 0L) + { + Cache.log.error("Error: hmmbuild produced empty hmm file"); + return; + } + HMMFile file = new HMMFile( new FileParse(hmmFile.getAbsolutePath(), DataSourceType.FILE)); - SequenceI[] seqs = file.getSeqsAsArray(); - SequenceI hmmSeq = seqs[0]; - hmmSeq.createDatasetSequence(); + SequenceI hmmSeq = file.getHMM().getConsensusSequence(); + + + + ResidueCount counts = new ResidueCount(alignment.getSequences()); + hmmSeq.getHMM().setBackgroundFrequencies(counts); + + if (hmmSeq == null) + { + // hmmbuild failure not detected earlier + return; + } + if (ac instanceof SequenceGroup) { SequenceGroup grp = (SequenceGroup) ac; - hmmSeq.insertCharAt(0, ac.getStartRes(), '-'); + char gapChar = alignment.getGapCharacter(); + hmmSeq.insertCharAt(0, ac.getStartRes(), gapChar); hmmSeq.insertCharAt(ac.getEndRes() + 1, - alignment.getWidth() - ac.getEndRes() - 1, '-'); - hmmSeq.updateHMMMapping(); + alignment.getWidth() - ac.getEndRes() - 1, gapChar); SequenceI topSeq = grp.getSequencesInOrder(alignment)[0]; int topIndex = alignment.findIndex(topSeq); alignment.insertSequenceAt(topIndex, hmmSeq); ac.setSeqrep(hmmSeq); grp.addSequence(hmmSeq, false); - grp.setHmmConsensus(hmmSeq); } else { alignment.insertSequenceAt(0, hmmSeq); - alignment.setHmmConsensus(hmmSeq); - } - - AlignViewport viewport = af.getViewport(); - if (viewport != null) - { - AlignmentPanel alignPanel = viewport.getAlignPanel(); - viewport.alignmentChanged(alignPanel); - alignPanel.adjustAnnotationHeight(); - viewport.updateSequenceIdColours(); - - if (alignPanel.alignFrame.getSelectedHMM() == null) - { - alignPanel.alignFrame.setSelectedHMMSequence(hmmSeq); - } } } }