X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fhmmer%2FHMMBuild.java;h=0c47c1dd8011fc05ef682d1f39fb113439eb94ac;hb=857348180124be7ab86d7de1e4d3f780e65b1fdd;hp=b892e5cd43cc57603757632ccd9986f686f641e5;hpb=4389a166735bf1203894abdf3cf7dd57c4856dbc;p=jalview.git diff --git a/src/jalview/hmmer/HMMBuild.java b/src/jalview/hmmer/HMMBuild.java index b892e5c..0c47c1d 100644 --- a/src/jalview/hmmer/HMMBuild.java +++ b/src/jalview/hmmer/HMMBuild.java @@ -1,28 +1,26 @@ package jalview.hmmer; import jalview.api.AlignViewportI; +import jalview.bin.Cache; import jalview.datamodel.Alignment; -import jalview.datamodel.AlignmentAnnotation; 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.workers.InformationThread; import jalview.ws.params.ArgumentI; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Hashtable; -import java.util.Iterator; import java.util.List; /** @@ -58,6 +56,12 @@ public class HMMBuild extends HmmerCommand @Override public void run() { + if (params == null || params.isEmpty()) + { + Cache.log.error("No parameters to HMMBuild!|"); + return; + } + long msgID = System.currentTimeMillis(); af.setProgressBar(MessageManager.getString("status.running_hmmbuild"), msgID); @@ -65,66 +69,91 @@ public class HMMBuild extends HmmerCommand AlignViewportI viewport = af.getViewport(); try { - List runBuildFor = new ArrayList<>(); - if (params != null) - { - for (ArgumentI arg : params) - { - String name = arg.getName(); - if (MessageManager.getString("label.hmmbuild_for").equals(name)) - { - String value = arg.getValue(); - if (MessageManager.getString("label.alignment") - .equals(value)) - { - runBuildFor.add(alignment); - } - else if (MessageManager.getString("label.groups_and_alignment") - .equals(value)) - { - runBuildFor.add(alignment); - runBuildFor.addAll(viewport.getAlignment().getGroups()); - } - else if (MessageManager.getString("label.groups").equals(value)) - { - runBuildFor.addAll(viewport.getAlignment().getGroups()); - } - else if (MessageManager.getString("label.selected_group") - .equals(value)) - { - runBuildFor.add(viewport.getSelectionGroup()); - } - } - else if (MessageManager.getString("label.use_reference") - .equals(name)) - { - // todo disable this option if no RF annotation on alignment - if (!af.getViewport().hasReferenceAnnotation()) - { - JvOptionPane.showInternalMessageDialog(af, MessageManager - .getString("warn.no_reference_annotation")); - // return; - } - } - } - } - /* * run hmmbuild for alignment and/or groups as selected */ + List runBuildFor = parseParameters(viewport); + for (AnnotatedCollectionI grp : runBuildFor) { runHMMBuild(grp); } } 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 } } /** + * Scans the parameters to determine whether to run hmmmbuild for the whole + * alignment or specified subgroup(s) or both + * + * @param viewport + * @return + */ + protected List parseParameters( + 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(viewport.getAlignmentView(false) + .getVisibleAlignment('-')); + } + else if (MessageManager.getString("label.groups_and_alignment") + .equals(value)) + { + runBuildFor.add(viewport.getAlignmentView(false) + .getVisibleAlignment('-')); + runBuildFor.addAll(viewport.getAlignment().getGroups()); + } + else if (MessageManager.getString("label.groups").equals(value)) + { + runBuildFor.addAll(viewport.getAlignment().getGroups()); + } + else if (MessageManager.getString("label.selected_group") + .equals(value)) + { + runBuildFor.add(viewport.getSelectionGroup()); + } + } + else if (MessageManager.getString("label.use_reference") + .equals(name)) + { + // todo disable this option if no RF annotation on alignment + if (!af.getViewport().hasReferenceAnnotation()) + { + JvOptionPane.showInternalMessageDialog(af, MessageManager + .getString("warn.no_reference_annotation")); + // return; + } + } + } + + /* + * default is to build for the whole alignment + */ + if (!foundArg) + { + runBuildFor.add(alignment); + } + + return runBuildFor; + } + + /** * Runs hmmbuild on the given sequences (alignment or group) * * @param grp @@ -135,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) { @@ -151,45 +177,41 @@ public class HMMBuild extends HmmerCommand } } - /* - * copy over sequences, excluding hmm consensus sequences - * hmm sequences and their Information annotation are also deleted - * in preparation for re-adding them when recalculated - */ - Iterator it = copy.iterator(); - while (it.hasNext()) + deleteHmmSequences(ac); + + List copy = new ArrayList<>(); + if (ac instanceof Alignment) { - SequenceI seq = it.next(); - if (seq.isHMMConsensusSequence()) + copy.addAll(ac.getSequences()); + } + else + { + SequenceI[] sel = ((SequenceGroup) ac) + .getSelectionAsNewSequences((AlignmentI) ac.getContext()); + for (SequenceI seq : sel) { - // todo leave it to InformationThread to delete annotations? - AlignmentAnnotation[] seqAnnotations = seq - .getAnnotation(); - if (seqAnnotations != null) + if (seq != null) { - for (AlignmentAnnotation ann : seqAnnotations) - { - if (InformationThread.HMM_CALC_ID.equals(ann.getCalcId())) - { - alignment.deleteAnnotation(ann); - } - } + copy.add(seq); } - alignment.deleteSequence(seq); - it.remove(); } } + // 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); @@ -237,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 = ""; @@ -287,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); } @@ -306,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); - } } } }