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.scop;
022
023import java.io.IOException;
024import java.io.Serializable;
025import java.util.HashSet;
026import java.util.List;
027import java.util.Set;
028
029import javax.xml.bind.annotation.XmlAccessType;
030import javax.xml.bind.annotation.XmlAccessorType;
031import javax.xml.bind.annotation.XmlRootElement;
032
033import org.biojava.nbio.structure.ResidueRange;
034import org.biojava.nbio.structure.Structure;
035import org.biojava.nbio.structure.StructureException;
036import org.biojava.nbio.structure.StructureIdentifier;
037import org.biojava.nbio.structure.SubstructureIdentifier;
038import org.biojava.nbio.structure.align.util.AtomCache;
039
040
041/** Container for the information for a domain. Contains a line in the file
042 * dir.cla.scop.txt_1.75
043 *
044 * e.g d1dlwa_  1dlw    A:      a.1.1.1 14982   cl=46456,cf=46457,sf=46458,fa=46459,dm=46460,sp=46461,px=14982
045 *
046 * Instantiated using {@link ScopDatabase#getDomainByScopID(String)}
047 * @author Andreas Prlic
048 *
049 */
050@XmlRootElement(name = "ScopDomain", namespace ="http://source.rcsb.org")
051@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
052public class ScopDomain implements Serializable, Cloneable, StructureIdentifier {
053
054        private static final long serialVersionUID = 5890476209571654301L;
055
056        String scopId;
057        String pdbId;
058        List<String> ranges;
059        String classificationId;
060        Integer sunid;
061
062        int classId;
063        int foldId;
064        int superfamilyId;
065        int familyId;
066        int domainId;
067        int speciesId;
068        int px;
069
070
071
072
073        @Override
074        public String toString() {
075                StringBuilder buf = new StringBuilder();
076                buf.append(scopId);
077                buf.append("\t") ;
078                buf.append(pdbId);
079                buf.append( "\t");
080
081                int rangePos = 0;
082                for (String range: ranges){
083                        rangePos++;
084
085                        buf.append(range);
086
087                        if ( ( ranges.size()> 1 ) && (rangePos < ranges.size()))
088                                buf.append(",");
089                }
090                buf.append("\t") ;
091                buf.append(classificationId);
092                buf.append("\t") ;
093                buf.append(String.valueOf(sunid));
094                buf.append("\t") ;
095
096                buf.append("cl=");
097                buf.append(String.valueOf(classId));
098                buf.append(",cf=");
099                buf.append(String.valueOf(foldId));
100                buf.append(",sf=");
101                buf.append(String.valueOf(superfamilyId));
102                buf.append(",fa=");
103                buf.append(String.valueOf(familyId));
104                buf.append(",dm=");
105                buf.append(String.valueOf(domainId));
106                buf.append(",sp=");
107                buf.append(String.valueOf(speciesId));
108                buf.append(",px=");
109                buf.append(String.valueOf(px));
110
111
112                return buf.toString();
113        }
114
115        public String getScopId() {
116                return scopId;
117        }
118        public void setScopId(String scopId) {
119                this.scopId = scopId;
120        }
121        public String getPdbId() {
122                return pdbId;
123        }
124        public void setPdbId(String pdbId) {
125                this.pdbId = pdbId;
126        }
127        public List<String> getRanges() {
128                return ranges;
129        }
130        public void setRanges(List<String> ranges) {
131                this.ranges = ranges;
132        }
133        public String getClassificationId() {
134                return classificationId;
135        }
136        public void setClassificationId(String classificationId) {
137                this.classificationId = classificationId;
138        }
139        public Integer getSunid() {
140                return sunid;
141        }
142        public void setSunid(Integer sunid) {
143                this.sunid = sunid;
144        }
145        public int getClassId() {
146                return classId;
147        }
148        public void setClassId(int classId) {
149                this.classId = classId;
150        }
151        public int getFoldId() {
152                return foldId;
153        }
154        public void setFoldId(int foldId) {
155                this.foldId = foldId;
156        }
157        public int getSuperfamilyId() {
158                return superfamilyId;
159        }
160        public void setSuperfamilyId(int superfamilyId) {
161                this.superfamilyId = superfamilyId;
162        }
163        public int getFamilyId() {
164                return familyId;
165        }
166        public void setFamilyId(int familyId) {
167                this.familyId = familyId;
168        }
169        public int getDomainId() {
170                return domainId;
171        }
172        public void setDomainId(int domainId) {
173                this.domainId = domainId;
174        }
175        public int getSpeciesId() {
176                return speciesId;
177        }
178        public void setSpeciesId(int speciesId) {
179                this.speciesId = speciesId;
180        }
181        public int getPx() {
182                return px;
183        }
184        public void setPx(int px) {
185                this.px = px;
186        }
187
188        @Override
189        protected Object clone() throws CloneNotSupportedException {
190
191                super.clone();
192
193                ScopDomain n = new ScopDomain();
194                n.setClassId(getClassId());
195                n.setClassificationId(getClassificationId());
196                n.setDomainId(getDomainId());
197                n.setFamilyId(getFamilyId());
198                n.setFoldId(getFoldId());
199                n.setPdbId(getPdbId());
200                n.setPx(getPx());
201                n.setRanges(getRanges());
202                n.setScopId(getScopId());
203                n.setSpeciesId(getSpeciesId());
204                n.setSunid(getSunid());
205                n.setSuperfamilyId(getSuperfamilyId());
206
207
208                return n;
209
210
211        }
212
213        /**
214         * Returns the chains this domain is defined over; contains more than 1 element only if this domains is a multi-chain domain.
215         */
216        public Set<String> getChains() {
217                Set<String> chains = new HashSet<String>();
218                List<ResidueRange> rrs = ResidueRange.parseMultiple(getRanges());
219                for (ResidueRange rr : rrs) chains.add(rr.getChainId());
220                return chains;
221        }
222
223        @Override
224        public String getIdentifier() {
225                return getScopId();
226        }
227
228        public List<ResidueRange> getResidueRanges() {
229                return ResidueRange.parseMultiple(ranges);
230        }
231
232        @Override
233        public SubstructureIdentifier toCanonical() {
234                return new SubstructureIdentifier(getPdbId(), ResidueRange.parseMultiple(getRanges()));
235        }
236
237        @Override
238        public Structure reduce(Structure input) throws StructureException {
239                return toCanonical().reduce(input);
240        }
241
242        @Override
243        public Structure loadStructure(AtomCache cache) throws StructureException,
244        IOException {
245                return cache.getStructureForPdbId(pdbId);
246        }
247
248}