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 */
021package org.biojava.nbio.structure.asa;
022
023import org.biojava.nbio.structure.*;
024
025import java.io.Serializable;
026import java.util.ArrayList;
027import java.util.HashMap;
028import java.util.List;
029
030/**
031 * A class to store the results of ASA calculations, it can
032 * hold ASA values per atom present in {@link org.biojava.nbio.structure.Group}
033 *
034 * @author duarte_j
035 *
036 */
037public class GroupAsa implements Serializable {
038
039
040        private static final long serialVersionUID = 1L;
041
042        // ASA in extended tripeptide conformation (GLY-X-GLY)
043        private static final HashMap<Character,Double> tripeptAsa = initTriPeptAsas();
044
045        private static HashMap<Character,Double>  initTriPeptAsas() {
046                // ASA in extended tripeptide conformation (GLY-X-GLY) from Miller et al JMB 1987 (for calculation of relative ASAs)
047                HashMap<Character,Double> map = new HashMap<Character,Double>();
048                map.put('A', 113.0);
049                map.put('R', 241.0);
050                map.put('N', 158.0);
051                map.put('D', 151.0);
052                map.put('C', 140.0);
053                map.put('Q', 189.0);
054                map.put('E', 183.0);
055                map.put('G',  85.0);
056                map.put('H', 194.0);
057                map.put('I', 182.0);
058                map.put('L', 180.0);
059                map.put('K', 211.0);
060                map.put('M', 204.0);
061                map.put('F', 218.0);
062                map.put('P', 143.0);
063                map.put('S', 122.0);
064                map.put('T', 146.0);
065                map.put('W', 259.0);
066                map.put('Y', 229.0);
067                map.put('V', 160.0);
068                return map;
069        }
070
071
072
073
074        private Group g;
075
076        /**
077         * ASA of uncomplexed residue
078         */
079        private double asaU;
080
081        /**
082         * ASA of complexed residue
083         */
084        private double asaC;
085
086        /**
087         * The individual atoms uncomplexed ASAs
088         */
089        private List<Double> atomAsaUs;
090
091        /**
092         * The individual atoms complexed ASAs
093         */
094        private List<Double> atomAsaCs;
095
096        public GroupAsa(Group g) {
097                this.g = g;
098
099                int groupNoHSize = getGroupNoHSize();
100                atomAsaUs = new ArrayList<Double>(groupNoHSize);
101                atomAsaCs = new ArrayList<Double>(groupNoHSize);
102        }
103
104        private int getGroupNoHSize() {
105                int count = 0;
106                for (Atom atom:g.getAtoms()) {
107                        if (atom.getElement()!=Element.H) count++;
108                }
109                return count;
110        }
111
112        public Group getGroup() {
113                return g;
114        }
115
116        /**
117         * Returns the ASA of the residue in the uncomplexed state
118         * @return
119         */
120        public double getAsaU() {
121                return asaU;
122        }
123
124        public void setAsaU(double asaU) {
125                this.asaU = asaU;
126        }
127
128        /**
129         * Returns the ASA of the residue in the complexed state
130         * @return
131         */
132        public double getAsaC() {
133                return asaC;
134        }
135
136        public void setAsaC(double asaC) {
137                this.asaC = asaC;
138        }
139
140        public void addAtomAsaU(double asa) {
141                this.asaU += asa;
142                this.atomAsaUs.add(asa);
143        }
144
145        public void addAtomAsaC(double asa) {
146                this.asaC += asa;
147                this.atomAsaCs.add(asa);
148        }
149
150        public List<Double> getAtomAsaUs() {
151                return atomAsaUs;
152        }
153
154        public void setAtomAsaUs(List<Double> atomAsaUs) {
155                this.atomAsaUs = atomAsaUs;
156                this.asaU = 0;
157                for (Double atomAsaU : atomAsaUs) {
158                        this.asaU += atomAsaU;
159                }
160        }
161
162        public List<Double> getAtomAsaCs() {
163                return atomAsaCs;
164        }
165
166        public void setAtomAsaCs(List<Double> atomAsaCs) {
167                this.atomAsaCs = atomAsaCs;
168                this.asaC = 0;
169                for (Double atomAsaC : atomAsaCs) {
170                        this.asaC += atomAsaC;
171                }
172        }
173
174
175        /**
176         * Returns the BSA value for this group, i.e. the difference between ASA uncomplexed and ASA complexed
177         * @return
178         */
179        public double getBsa() {
180                return (asaU-asaC);
181        }
182
183        /**
184         * Returns the bsa/asa(uncomplexed) ratio, i.e. the ratio of burial of a residue upon complexation
185         * @return
186         */
187        public double getBsaToAsaRatio() {
188                return getBsa()/asaU;
189        }
190
191        /**
192         * Returns the relative (uncomplexed) ASA, i.e. the ASA of the residue
193         * with respect to its ASA in an extended tri-peptide conformation (GLY-x-GLY)
194         * @return
195         */
196        public double getRelativeAsaU() {
197                if (!g.getType().equals(GroupType.AMINOACID))
198                        throw new IllegalArgumentException("Can not calculate relative ASA for non amino-acid");
199
200                char aa = ((AminoAcid)g).getAminoType();
201
202                return (asaU/tripeptAsa.get(aa));
203
204        }
205
206        /**
207         * Returns the relative (complexed) ASA, i.e. the ASA of the residue
208         * with respect to its ASA in an extended tri-peptide conformation (GLY-x-GLY)
209         * @return
210         */
211        public double getRelativeAsaC() {
212                if (!g.getType().equals(GroupType.AMINOACID))
213                        throw new IllegalArgumentException("Can not calculate relative ASA for non amino-acid");
214
215                char aa = ((AminoAcid)g).getAminoType();
216
217                return (asaC/tripeptAsa.get(aa));
218
219        }
220
221        @Override
222        public Object clone() {
223                GroupAsa n = new GroupAsa(this.g);
224                n.setAsaC(this.getAsaC());
225                n.setAsaU(this.getAsaU());
226                n.atomAsaUs = new ArrayList<Double>(this.atomAsaUs.size());
227                n.atomAsaCs = new ArrayList<Double>(this.atomAsaCs.size());
228                for (int i=0;i<this.atomAsaUs.size();i++) {
229                        n.atomAsaUs.add(this.atomAsaUs.get(i));
230                }
231                for (int i=0;i<this.atomAsaCs.size();i++) {
232                        n.atomAsaCs.add(this.atomAsaCs.get(i));
233                }
234
235                return n;
236        }
237}