2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import jalview.datamodel.AlignmentAnnotation;
24 import jalview.datamodel.DBRefSource;
25 import jalview.datamodel.SequenceI;
26 import jalview.io.DataSourceType;
27 import jalview.io.FileParse;
28 import jalview.io.StructureFile;
29 import jalview.util.MessageManager;
31 import java.io.IOException;
32 import java.util.ArrayList;
33 import java.util.Hashtable;
34 import java.util.List;
35 import java.util.Vector;
37 public class PDBfile extends StructureFile
39 private static String CALC_ID_PREFIX = "JalviewPDB";
41 public PDBfile(boolean addAlignmentAnnotations,
42 boolean predictSecondaryStructure, boolean externalSecStr)
45 addSettings(addAlignmentAnnotations, predictSecondaryStructure,
49 public PDBfile(boolean addAlignmentAnnotations, boolean predictSecStr,
50 boolean externalSecStr, String dataObject,
51 DataSourceType sourceType) throws IOException
53 super(false, dataObject, sourceType);
54 addSettings(addAlignmentAnnotations, predictSecStr, externalSecStr);
58 public PDBfile(boolean addAlignmentAnnotations, boolean predictSecStr,
59 boolean externalSecStr, FileParse source) throws IOException
62 addSettings(addAlignmentAnnotations, predictSecStr, externalSecStr);
67 public String print(SequenceI[] seqs, boolean jvSuffix)
73 public void parse() throws IOException
75 setDbRefType(DBRefSource.PDB);
76 // TODO set the filename sensibly - try using data source name.
77 setId(safeName(getDataName()));
79 setChains(new Vector<PDBChain>());
80 List<SequenceI> rna = new ArrayList<SequenceI>();
81 List<SequenceI> prot = new ArrayList<SequenceI>();
84 boolean modelFlag = false;
85 boolean terFlag = false;
89 String atomnam = null;
92 while ((line = nextLine()) != null)
94 if (line.indexOf("HEADER") == 0)
96 if (line.length() > 62)
99 if (line.length() > 67)
101 tid = line.substring(62, 67).trim();
105 tid = line.substring(62).trim();
107 if (tid.length() > 0)
114 // Were we to do anything with SEQRES - we start it here
115 if (line.indexOf("SEQRES") == 0)
119 if (line.indexOf("MODEL") == 0)
124 if (line.indexOf("TER") == 0)
129 if (modelFlag && line.indexOf("ENDMDL") == 0)
133 if (line.indexOf("ATOM") == 0
134 || (line.indexOf("HETATM") == 0 && !terFlag))
138 // Jalview is only interested in CA bonds????
139 atomnam = line.substring(12, 15).trim();
140 if (!atomnam.equals("CA") && !atomnam.equals("P"))
145 Atom tmpatom = new Atom(line);
146 if (tmpatom.resNumIns.trim().equals(lastID))
148 // phosphorylated protein - seen both CA and P..
151 tmpchain = findChain(tmpatom.chain);
152 if (tmpchain != null)
154 tmpchain.atoms.addElement(tmpatom);
157 tmpchain = new PDBChain(getId(), tmpatom.chain);
158 getChains().add(tmpchain);
159 tmpchain.atoms.addElement(tmpatom);
161 lastID = tmpatom.resNumIns.trim();
171 setId(inFile.getName());
173 for (PDBChain chain : getChains())
175 SequenceI chainseq = postProcessChain(chain);
185 if (predictSecondaryStructure)
187 addSecondaryStructure(rna, prot);
189 } catch (OutOfMemoryError er)
191 System.out.println("OUT OF MEMORY LOADING PDB FILE");
192 throw new IOException(MessageManager
193 .getString("exception.outofmemory_loading_pdb_file"));
194 } catch (NumberFormatException ex)
198 System.err.println("Couldn't read number from line:");
199 System.err.println(line);
206 * Process a parsed chain to construct and return a Sequence, and add it to
207 * the list of sequences parsed.
213 public static boolean isCalcIdHandled(String calcId)
215 return calcId != null && (CALC_ID_PREFIX.equals(calcId));
218 public static boolean isCalcIdForFile(AlignmentAnnotation alan,
221 return alan.getCalcId() != null
222 && CALC_ID_PREFIX.equals(alan.getCalcId())
223 && pdbFile.equals(alan.getProperty("PDBID"));
226 public static String relocateCalcId(String calcId,
227 Hashtable<String, String> alreadyLoadedPDB) throws Exception
229 int s = CALC_ID_PREFIX.length(),
230 end = calcId.indexOf(CALC_ID_PREFIX, s);
231 String between = calcId.substring(s, end - 1);
232 return CALC_ID_PREFIX + alreadyLoadedPDB.get(between) + ":"
233 + calcId.substring(end);
236 private void markCalcIds()
238 for (SequenceI sq : seqs)
240 if (sq.getAnnotation() != null)
242 for (AlignmentAnnotation aa : sq.getAnnotation())
244 String oldId = aa.getCalcId();
249 aa.setCalcId(CALC_ID_PREFIX);
250 aa.setProperty("PDBID", getId());
251 aa.setProperty("oldCalcId", oldId);