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.SequenceI;
25 import jalview.io.FileParse;
26 import jalview.io.StructureFile;
27 import jalview.util.MessageManager;
29 import java.io.IOException;
30 import java.util.ArrayList;
31 import java.util.Hashtable;
32 import java.util.List;
33 import java.util.Vector;
35 public class PDBfile extends StructureFile
37 private static String CALC_ID_PREFIX = "JalviewPDB";
39 public PDBfile(boolean addAlignmentAnnotations,
40 boolean predictSecondaryStructure, boolean externalSecStr)
43 this.visibleChainAnnotation = addAlignmentAnnotations;
44 this.predictSecondaryStructure = predictSecondaryStructure;
45 this.externalSecondaryStructure = externalSecStr;
48 public PDBfile(boolean addAlignmentAnnotations,
49 boolean predictSecondaryStructure, boolean externalSecStr,
50 String file, String protocol) throws IOException
52 super(false, file, protocol);
53 this.visibleChainAnnotation = addAlignmentAnnotations;
54 this.predictSecondaryStructure = predictSecondaryStructure;
55 this.externalSecondaryStructure = externalSecStr;
59 public PDBfile(boolean addAlignmentAnnotations,
60 boolean predictSecondaryStructure, boolean externalSecStr,
61 FileParse source) throws IOException
64 this.visibleChainAnnotation = addAlignmentAnnotations;
65 this.predictSecondaryStructure = predictSecondaryStructure;
66 this.externalSecondaryStructure = externalSecStr;
77 public void parse() throws IOException
79 // TODO set the filename sensibly - try using data source name.
80 setId(safeName(getDataName()));
82 setChains(new Vector<PDBChain>());
83 List<SequenceI> rna = new ArrayList<SequenceI>();
84 List<SequenceI> prot = new ArrayList<SequenceI>();
87 boolean modelFlag = false;
88 boolean terFlag = false;
92 String atomnam = null;
95 while ((line = nextLine()) != null)
97 if (line.indexOf("HEADER") == 0)
99 if (line.length() > 62)
102 if (line.length() > 67)
104 tid = line.substring(62, 67).trim();
108 tid = line.substring(62).trim();
110 if (tid.length() > 0)
117 // Were we to do anything with SEQRES - we start it here
118 if (line.indexOf("SEQRES") == 0)
122 if (line.indexOf("MODEL") == 0)
127 if (line.indexOf("TER") == 0)
132 if (modelFlag && line.indexOf("ENDMDL") == 0)
136 if (line.indexOf("ATOM") == 0
137 || (line.indexOf("HETATM") == 0 && !terFlag))
141 // Jalview is only interested in CA bonds????
142 atomnam = line.substring(12, 15).trim();
143 if (!atomnam.equals("CA") && !atomnam.equals("P"))
148 Atom tmpatom = new Atom(line);
151 tmpchain = findChain(tmpatom.chain);
152 if (tmpatom.resNumIns.trim().equals(lastID))
154 // phosphorylated protein - seen both CA and P..
157 tmpchain.atoms.addElement(tmpatom);
158 } catch (Exception e)
160 tmpchain = new PDBChain(getId(), tmpatom.chain);
161 getChains().add(tmpchain);
162 tmpchain.atoms.addElement(tmpatom);
164 lastID = tmpatom.resNumIns.trim();
174 setId(inFile.getName());
176 for (PDBChain chain : getChains())
178 SequenceI chainseq = postProcessChain(chain);
188 if (predictSecondaryStructure)
190 addSecondaryStructure(rna, prot);
192 } catch (OutOfMemoryError er)
194 System.out.println("OUT OF MEMORY LOADING PDB FILE");
195 throw new IOException(
197 .getString("exception.outofmemory_loading_pdb_file"));
198 } catch (NumberFormatException ex)
202 System.err.println("Couldn't read number from line:");
203 System.err.println(line);
212 * Process a parsed chain to construct and return a Sequence, and add it to
213 * the list of sequences parsed.
219 public static boolean isCalcIdHandled(String calcId)
221 return calcId != null && (CALC_ID_PREFIX.equals(calcId));
224 public static boolean isCalcIdForFile(AlignmentAnnotation alan,
227 return alan.getCalcId() != null
228 && CALC_ID_PREFIX.equals(alan.getCalcId())
229 && pdbFile.equals(alan.getProperty("PDBID"));
232 public static String relocateCalcId(String calcId,
233 Hashtable<String, String> alreadyLoadedPDB) throws Exception
235 int s = CALC_ID_PREFIX.length(), end = calcId
236 .indexOf(CALC_ID_PREFIX, s);
237 String between = calcId.substring(s, end - 1);
238 return CALC_ID_PREFIX + alreadyLoadedPDB.get(between) + ":"
239 + calcId.substring(end);
242 private void markCalcIds()
244 for (SequenceI sq : seqs)
246 if (sq.getAnnotation() != null)
248 for (AlignmentAnnotation aa : sq.getAnnotation())
250 String oldId = aa.getCalcId();
255 aa.setCalcId(CALC_ID_PREFIX);
256 aa.setProperty("PDBID", getId());
257 aa.setProperty("oldCalcId", oldId);