001/*
002 *                    BioJava development code
003 *
004 * This code may be freely distributed and modified under the
005 * terms of the GNU Lesser General Public Licence.  This should
006 * be distributed with the code.  If you do not have a copy,
007 * see:
008 *
009 *      http://www.gnu.org/copyleft/lesser.html
010 *
011 * Copyright for this code is held jointly by the individual
012 * authors.  These should be listed in @author doc comments.
013 *
014 * For more information on the BioJava project and its aims,
015 * or to join the biojava-l mailing list, visit the home page
016 * at:
017 *
018 *      http://www.biojava.org/
019 *
020 * Created on 2013-05-23
021 *
022 */
023package org.biojava.nbio.structure.symmetry.core;
024
025/**
026 * Holds the results of quaternary symmetry perception.
027 *
028 * @author Peter Rose
029 *
030 */
031public class QuatSymmetryResults {
032        private Subunits subunits = null;
033        private RotationGroup rotationGroup = null;
034        private HelixLayers helixLayers = null;
035        private String method = null;
036        private double sequenceIdentityThreshold = 0;
037        private boolean local = false;
038        private boolean preferredResult = false;
039
040        public QuatSymmetryResults(Subunits subunits, RotationGroup rotationGroup, String method) {
041        //      SymmetryDeviation sd = new SymmetryDeviation(subunits, rotationGroup);
042        //      rotationGroup.setSymmetryDeviation(sd.getSymmetryDeviation());
043                this.subunits = subunits;
044                this.rotationGroup = rotationGroup;
045                this.method = method;
046        }
047
048        public QuatSymmetryResults(Subunits subunits, HelixLayers helixLayers, String method) {
049        //      SymmetryDeviation sd = new SymmetryDeviation(subunits, helixLayers);
050        //      helixLayers.setSymmetryDeviation(sd.getSymmetryDeviation());
051                this.subunits = subunits;
052                this.helixLayers = helixLayers;
053                this.method = method;
054        }
055
056        /**
057         * Returns protein subunit information that was used to determine symmetry information
058         *
059         * @return
060         */
061        public Subunits getSubunits() {
062                return subunits;
063        }
064
065        /**
066         * Returns rotation group (point group) information representing rotational quaternary symmetry,
067         * see http://en.wikipedia.org/wiki/Rotation_group_SO(3)
068         *
069         * @return rotation group
070         */
071        public RotationGroup getRotationGroup() {
072                return rotationGroup;
073        }
074
075        /*
076         * Returns helix layers (layer lines) as a list of helices that describe a helical structure
077         */
078        public HelixLayers getHelixLayers() {
079                return helixLayers;
080        }
081
082        /**
083         * Returns name of method used for symmetry perception.
084         *
085         * @return method
086         */
087        public String getMethod() {
088                return method;
089        }
090
091
092        /**
093         * Returns the symmetry group. For point groups returns the point group symbol
094         * and for helical symmetry returns "H".
095         * @return symmetry symbol
096         */
097        public String getSymmetry() {
098                if (helixLayers != null && helixLayers.size() > 0) {
099                        return "H";
100                } else if (rotationGroup != null && rotationGroup.getOrder() > 0) {
101                        return rotationGroup.getPointGroup();
102                }
103                return "";
104        }
105
106
107        public QuatSymmetryScores getScores() {
108                if (helixLayers != null && helixLayers.size() > 0) {
109                        return helixLayers.getScores();
110                } else if (rotationGroup != null && rotationGroup.getOrder() > 0) {
111                        return rotationGroup.getScores();
112                }
113                return new QuatSymmetryScores();
114        }
115
116        /**
117         * Returns the average Calpha trace RMSD for all symmetry operations
118         * @return
119         * @deprecated use {@link getScores()} instead.
120         */
121        @Deprecated
122        public double getAverageTraceRmsd() {
123                if (helixLayers != null && helixLayers.size() > 0) {
124                        return helixLayers.getScores().getRmsd();
125                } else if (rotationGroup != null && rotationGroup.getOrder() > 0) {
126                        return rotationGroup.getScores().getRmsd();
127                }
128                return 0;
129        }
130
131        /**
132         * Returns the average Calpha trace Tm for all symmetry operations
133         * @return
134         * @deprecated use {@link getScores()} instead.
135         */
136        @Deprecated
137        public double getAverageTraceTmScoreMin() {
138                if (helixLayers != null && helixLayers.size() > 0) {
139                        return helixLayers.getScores().getTm();
140                } else if (rotationGroup != null && rotationGroup.getOrder() > 0) {
141                        return rotationGroup.getScores().getTm();
142                }
143                return 0;
144        }
145
146        public int getNucleicAcidChainCount() {
147                return subunits.getNucleicAcidChainCount();
148        }
149
150        public double getSequenceIdentityThreshold() {
151                return sequenceIdentityThreshold;
152        }
153
154        public void setSequenceIdentityThreshold(double sequenceIdentityThreshold) {
155                this.sequenceIdentityThreshold = sequenceIdentityThreshold;
156        }
157
158        @Override
159        public String toString() {
160                StringBuilder sb = new StringBuilder();
161
162                sb.append("Stoichiometry         : ");
163                sb.append(getSubunits().getStoichiometry());
164                sb.append("\n");
165                sb.append("Pseudostoichiometry   : ");
166                sb.append(getSubunits().isPseudoStoichiometric());
167                sb.append("\n");
168                sb.append("Pseudosymmetry        : ");
169                sb.append(getSubunits().isPseudoSymmetric());
170                sb.append("\n");
171                sb.append("Min sequence identity : ");
172                sb.append(Math.round(getSubunits().getMinSequenceIdentity()*100));
173                sb.append("\n");
174                sb.append("Max sequence identity : ");
175                sb.append(Math.round(getSubunits().getMaxSequenceIdentity()*100));
176                sb.append("\n");
177                sb.append("Symmetry              : ");
178                sb.append(getSymmetry());
179                sb.append("\n");
180                sb.append("Symmetry RMSD         : ");
181                sb.append((float) getAverageTraceRmsd());
182                sb.append("\n");
183                sb.append("Symmetry TmScoreMin   : ");
184                sb.append((float) getAverageTraceTmScoreMin());
185                sb.append("\n");
186                sb.append("Prefered result       : ");
187                sb.append(isPreferredResult());
188                sb.append("\n");
189
190                return sb.toString();
191        }
192
193        /**
194         * Return true
195         * @return
196         */
197        public boolean isLocal() {
198                return local;
199        }
200
201        public void setLocal(boolean local) {
202                this.local = local;
203        }
204
205        public boolean isPreferredResult() {
206                return preferredResult;
207        }
208
209        public void setPreferredResult(boolean preferredResult) {
210                this.preferredResult = preferredResult;
211        }
212}