X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FSequenceGroup.java;h=c1443ef3b1d177b6e3ea15988397e942e6807a38;hb=36e82a30ba2cd0c1331d8735214ebbe2139790ce;hp=463b909ad8ef1c96ba00c06f208f1e056548e25d;hpb=3b239d86dc3a1bf3aa07c0ad3d38aeca57b54ada;p=jalview.git diff --git a/src/jalview/datamodel/SequenceGroup.java b/src/jalview/datamodel/SequenceGroup.java index 463b909..c1443ef 100755 --- a/src/jalview/datamodel/SequenceGroup.java +++ b/src/jalview/datamodel/SequenceGroup.java @@ -25,6 +25,7 @@ import jalview.analysis.Conservation; import jalview.renderer.ResidueShader; import jalview.renderer.ResidueShaderI; import jalview.schemes.ColourSchemeI; +import jalview.util.MessageManager; import java.awt.Color; import java.util.ArrayList; @@ -100,6 +101,10 @@ public class SequenceGroup implements AnnotatedCollectionI */ private boolean ignoreGapsInConsensus = true; + private boolean ignoreBelowBackground = true; + + private boolean infoLetterHeight = false; + /** * consensus calculation property */ @@ -124,10 +129,18 @@ public class SequenceGroup implements AnnotatedCollectionI AlignmentAnnotation conservation = null; + AlignmentAnnotation information = null; + private boolean showConsensusHistogram; private AnnotatedCollectionI context; + private boolean showHMMSequenceLogo; + + private boolean normaliseHMMSequenceLogo; + + private boolean showInformationHistogram; + /** * Creates a new SequenceGroup object. */ @@ -188,7 +201,7 @@ public class SequenceGroup implements AnnotatedCollectionI colourText = seqsel.colourText; startRes = seqsel.startRes; endRes = seqsel.endRes; - cs = new ResidueShader(seqsel.getColourScheme()); + cs = new ResidueShader((ResidueShader) seqsel.cs); if (seqsel.description != null) { description = new String(seqsel.description); @@ -199,6 +212,9 @@ public class SequenceGroup implements AnnotatedCollectionI showSequenceLogo = seqsel.showSequenceLogo; normaliseSequenceLogo = seqsel.normaliseSequenceLogo; showConsensusHistogram = seqsel.showConsensusHistogram; + showHMMSequenceLogo = seqsel.showHMMSequenceLogo; + normaliseHMMSequenceLogo = seqsel.normaliseHMMSequenceLogo; + showInformationHistogram = seqsel.showInformationHistogram; idColour = seqsel.idColour; outlineColour = seqsel.outlineColour; seqrep = seqsel.seqrep; @@ -207,6 +223,8 @@ public class SequenceGroup implements AnnotatedCollectionI thresholdTextColour = seqsel.thresholdTextColour; width = seqsel.width; ignoreGapsInConsensus = seqsel.ignoreGapsInConsensus; + ignoreBelowBackground = seqsel.ignoreBelowBackground; + infoLetterHeight = seqsel.infoLetterHeight; if (seqsel.conserve != null) { recalcConservation(); // safer than @@ -548,7 +566,8 @@ public class SequenceGroup implements AnnotatedCollectionI */ public boolean recalcConservation(boolean defer) { - if (cs == null && consensus == null && conservation == null) + if (cs == null && consensus == null && conservation == null + && information == null) { return false; } @@ -559,6 +578,17 @@ public class SequenceGroup implements AnnotatedCollectionI { ProfilesI cnsns = AAFrequency.calculate(sequences, startRes, endRes + 1, showSequenceLogo); + if (information != null) + { + HiddenMarkovModel hmm = information.sequenceRef.getHMM(); + + ProfilesI info = AAFrequency.calculateHMMProfiles(hmm, + (endRes + 1) - startRes, startRes, endRes + 1, + showHMMSequenceLogo, ignoreBelowBackground, + infoLetterHeight); + _updateInformationRow(info, sequences.size()); + upd = true; + } if (consensus != null) { _updateConsensusRow(cnsns, sequences.size()); @@ -620,8 +650,10 @@ public class SequenceGroup implements AnnotatedCollectionI conservation.description = "Conservation for group " + getName() + " less than " + consPercGaps + "% gaps"; // preserve width if already set - int aWidth = (conservation.annotations != null) ? (endRes < conservation.annotations.length ? conservation.annotations.length - : endRes + 1) + int aWidth = (conservation.annotations != null) + ? (endRes < conservation.annotations.length + ? conservation.annotations.length + : endRes + 1) : endRes + 1; conservation.annotations = null; conservation.annotations = new Annotation[aWidth]; // should be alignment @@ -631,6 +663,8 @@ public class SequenceGroup implements AnnotatedCollectionI public ProfilesI consensusData = null; + public ProfilesI informationData = null; + private void _updateConsensusRow(ProfilesI cnsns, long nseq) { if (consensus == null) @@ -641,8 +675,10 @@ public class SequenceGroup implements AnnotatedCollectionI consensus.description = "Percent Identity"; consensusData = cnsns; // preserve width if already set - int aWidth = (consensus.annotations != null) ? (endRes < consensus.annotations.length ? consensus.annotations.length - : endRes + 1) + int aWidth = (consensus.annotations != null) + ? (endRes < consensus.annotations.length + ? consensus.annotations.length + : endRes + 1) : endRes + 1; consensus.annotations = null; consensus.annotations = new Annotation[aWidth]; // should be alignment width @@ -655,6 +691,38 @@ public class SequenceGroup implements AnnotatedCollectionI } /** + * Recalculates the information content on the HMM annotation. + * + * @param cnsns + * @param nseq + */ + private void _updateInformationRow(ProfilesI cnsns, long nseq) + { + if (information == null) + { + getInformation(); + } + information.description = MessageManager + .getString("label.information_description"); + informationData = cnsns; + // preserve width if already set + int aWidth = (information.annotations != null) + ? (endRes < information.annotations.length + ? information.annotations.length : endRes + 1) + : endRes + 1; + information.annotations = null; + information.annotations = new Annotation[aWidth]; // should be alignment + // width + information.calcId = "HMM"; + AAFrequency.completeInformation(information, cnsns, startRes, + endRes + 1, nseq, 0f); // TODO: + // setting + // container + // for + // ignoreGapsInInformationCalculation); + } + + /** * @param s * sequence to either add or remove from group * @param recalc @@ -1102,6 +1170,35 @@ public class SequenceGroup implements AnnotatedCollectionI } /** + * + * @return information content annotation. + */ + public AlignmentAnnotation getInformation() + { + // TODO get or calculate and get information annotation row for this group + int aWidth = this.getWidth(); + // pointer + // possibility + // here. + if (aWidth < 0) + { + return null; + } + if (information == null) + { + information = new AlignmentAnnotation("", "", new Annotation[1], 0f, + 6.25f, AlignmentAnnotation.BAR_GRAPH); + information.hasText = true; + information.autoCalculated = false; + information.groupRef = this; + information.label = getName(); + information.description = "Information content, measured in bits"; + information.calcId = "HMM"; + } + return information; + } + + /** * set this alignmentAnnotation object as the one used to render consensus * annotation * @@ -1187,6 +1284,34 @@ public class SequenceGroup implements AnnotatedCollectionI return ignoreGapsInConsensus; } + public void setIgnoreBelowBackground(boolean state) + { + if (this.ignoreBelowBackground != state) + { + ignoreBelowBackground = state; + } + ignoreBelowBackground = state; + } + + public boolean getIgnoreBelowBackground() + { + return ignoreBelowBackground; + } + + public void setInfoLetterHeight(boolean state) + { + if (this.infoLetterHeight != state) + { + infoLetterHeight = state; + } + infoLetterHeight = state; + } + + public boolean getInfoLetterHeight() + { + return infoLetterHeight; + } + /** * @param showSequenceLogo * indicates if a sequence logo is shown for consensus annotation @@ -1304,11 +1429,12 @@ public class SequenceGroup implements AnnotatedCollectionI ArrayList aa = new ArrayList<>(); for (AlignmentAnnotation ann : getAlignmentAnnotation()) { - if ((calcId == null || (ann.getCalcId() != null && ann.getCalcId() - .equals(calcId))) - && (seq == null || (ann.sequenceRef != null && ann.sequenceRef == seq)) - && (label == null || (ann.label != null && ann.label - .equals(label)))) + if ((calcId == null || (ann.getCalcId() != null + && ann.getCalcId().equals(calcId))) + && (seq == null || (ann.sequenceRef != null + && ann.sequenceRef == seq)) + && (label == null + || (ann.label != null && ann.label.equals(label)))) { aa.add(ann); } @@ -1432,7 +1558,8 @@ public class SequenceGroup implements AnnotatedCollectionI @Override public boolean isNucleotide() { - if (context != null) { + if (context != null) + { return context.isNucleotide(); } return false; @@ -1457,4 +1584,87 @@ public class SequenceGroup implements AnnotatedCollectionI { return (startRes <= apos && endRes >= apos) && sequences.contains(seq); } + + public boolean isShowInformationHistogram() + { + return showInformationHistogram; + } + + public void setShowInformationHistogram(boolean state) + { + if (showInformationHistogram != state && information != null) + { + this.showInformationHistogram = state; + // recalcConservation(); TODO don't know what to do here next + } + this.showInformationHistogram = state; + + } + + public boolean isShowHMMSequenceLogo() + { + // TODO Auto-generated method stub + return showHMMSequenceLogo; + } + + public void setshowHMMSequenceLogo(boolean state) + { + showHMMSequenceLogo = state; + + } + + public boolean isNormaliseHMMSequenceLogo() + { + // TODO Auto-generated method stub + return normaliseHMMSequenceLogo; + } + + public void setNormaliseHMMSequenceLogo(boolean state) + { + normaliseSequenceLogo = state; + } + + /** + * Returns all HMM consensus sequences. This will not return real sequences + * with HMMs. If remove is set to true, the consensus sequences will be + * removed from the alignment. + */ + @Override // TODO make this more efficient. + public List getHMMConsensusSequences(boolean remove) + { + List seqs = new ArrayList<>(); + int position = 0; + int seqsRemoved = 0; + boolean endReached = false; + + while (!endReached) + { + SequenceI seq = sequences.get(position); + if (seq.isHMMConsensusSequence()) + { + if (remove) + { + sequences.remove(position); + seqsRemoved++; + seq.setPreviousPosition(seqsRemoved + position - 1); + } + else + { + position++; + } + seqs.add(seq); + } + else + { + position++; + } + + if (position >= sequences.size()) + { + endReached = true; + } + } + return seqs; + } + }