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 java.io.IOException;
24 import java.util.ArrayList;
25 import java.util.Hashtable;
26 import java.util.List;
27 import java.util.Vector;
29 import jalview.bin.Console;
30 import jalview.datamodel.AlignmentAnnotation;
31 import jalview.datamodel.DBRefSource;
32 import jalview.datamodel.SequenceI;
33 import jalview.io.DataSourceType;
34 import jalview.io.FileParse;
35 import jalview.io.StructureFile;
36 import jalview.util.MessageManager;
38 public class PDBfile extends StructureFile
40 private static String CALC_ID_PREFIX = "JalviewPDB";
42 public PDBfile(boolean addAlignmentAnnotations,
43 boolean predictSecondaryStructure, boolean externalSecStr)
46 addSettings(addAlignmentAnnotations, predictSecondaryStructure,
50 public PDBfile(boolean addAlignmentAnnotations, boolean predictSecStr,
51 boolean externalSecStr, String dataObject,
52 DataSourceType sourceType) throws IOException
54 super(false, dataObject, sourceType);
55 Console.debug("***** PDBfile constructor");
56 addSettings(addAlignmentAnnotations, predictSecStr, externalSecStr);
57 Console.debug("***** About to doParse() 1");
61 public PDBfile(boolean addAlignmentAnnotations, boolean predictSecStr,
62 boolean externalSecStr, FileParse source) throws IOException
65 addSettings(addAlignmentAnnotations, predictSecStr, externalSecStr);
66 Console.debug("***** About to doParse() 2");
71 public String print(SequenceI[] seqs, boolean jvSuffix)
77 public void parse() throws IOException
79 setDbRefType(DBRefSource.PDB);
80 // TODO set the filename sensibly - try using data source name.
81 setId(safeName(getDataName()));
83 setChains(new Vector<PDBChain>());
84 List<SequenceI> rna = new ArrayList<SequenceI>();
85 List<SequenceI> prot = new ArrayList<SequenceI>();
88 boolean modelFlag = false;
89 boolean terFlag = false;
93 String atomnam = null;
96 while ((line = nextLine()) != null)
98 if (line.indexOf("HEADER") == 0)
100 if (line.length() > 62)
103 if (line.length() > 67)
105 tid = line.substring(62, 67).trim();
109 tid = line.substring(62).trim();
111 if (tid.length() > 0)
118 // Were we to do anything with SEQRES - we start it here
119 if (line.indexOf("SEQRES") == 0)
123 if (line.indexOf("MODEL") == 0)
128 if (line.indexOf("TER") == 0)
133 if (modelFlag && line.indexOf("ENDMDL") == 0)
137 if (line.indexOf("ATOM") == 0
138 || (line.indexOf("HETATM") == 0 && !terFlag))
142 // Jalview is only interested in CA bonds????
143 atomnam = line.substring(12, 15).trim();
144 if (!atomnam.equals("CA") && !atomnam.equals("P"))
149 Atom tmpatom = new Atom(line);
150 if (tmpatom.resNumIns.trim().equals(lastID))
152 // phosphorylated protein - seen both CA and P..
155 tmpchain = findChain(tmpatom.chain);
156 if (tmpchain != null)
158 tmpchain.atoms.addElement(tmpatom);
162 // PDBfile never handles alphafold models
163 tmpchain = new PDBChain(getId(), tmpatom.chain);
164 getChains().add(tmpchain);
165 tmpchain.atoms.addElement(tmpatom);
167 lastID = tmpatom.resNumIns.trim();
177 setId(inFile.getName());
179 for (PDBChain chain : getChains())
181 SequenceI chainseq = postProcessChain(chain);
191 if (predictSecondaryStructure)
193 addSecondaryStructure(rna, prot);
195 } catch (OutOfMemoryError er)
197 System.out.println("OUT OF MEMORY LOADING PDB FILE");
198 throw new IOException(MessageManager
199 .getString("exception.outofmemory_loading_pdb_file"));
200 } catch (NumberFormatException ex)
204 System.err.println("Couldn't read number from line:");
205 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(),
236 end = calcId.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);