From: Michael T H. <mic...@us...> - 2003-10-29 23:27:10
|
Update of /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/protein In directory sc8-pr-cvs1:/tmp/cvs-serv24327/src/org/openscience/jmol/viewer/protein Modified Files: PdbAtom.java PdbMolecule.java Added Files: PdbChain.java PdbResidue.java Log Message: added classes PdbChain & PdbResidue + reimplemented Trace --- NEW FILE: PdbChain.java --- /* $RCSfile: PdbChain.java,v $ * $Author: michaelthoward $ * $Date: 2003/10/29 23:27:07 $ * $Revision: 1.1 $ * * Copyright (C) 2002-2003 The Jmol Development Team * * Contact: jmo...@li... * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. */ package org.openscience.jmol.viewer.protein; import org.openscience.jmol.viewer.*; import org.openscience.jmol.viewer.datamodel.Atom; import java.util.Hashtable; public class PdbChain { public char chainID; int residueCount; PdbResidue[] residues = new PdbResidue[16]; PdbResidue[] mainchain; public PdbChain(char chainID) { this.chainID = chainID; } void freeze() { if (residueCount != residues.length) { PdbResidue[] t = new PdbResidue[residueCount]; System.arraycopy(residues, 0, t, 0, residueCount); residues = t; } System.out.println("chain: " + chainID + " has length=" + residues.length); } void addResidue(PdbResidue residue) { if (residueCount == residues.length) { PdbResidue[] t = new PdbResidue[residueCount * 2]; System.arraycopy(residues, 0, t, 0, residueCount); residues = t; } residues[residueCount++] = residue; } int mainchainHelper(boolean addResidues) { int mainchainCount = 0; outer: for (int i = residueCount; --i >= 0; ) { PdbResidue residue = residues[i]; int[] mainchainIndices = residue.mainchainIndices; if (mainchainIndices == null) continue; for (int j = 4; --j >=0; ) if (mainchainIndices[j] == -1) continue outer; if (addResidues) mainchain[mainchainCount] = residue; ++mainchainCount; } return mainchainCount; } PdbResidue[] getMainchain() { if (mainchain == null) { int mainchainCount = mainchainHelper(false); if (mainchainCount == residueCount) { mainchain = residues; } else { mainchain = new PdbResidue[mainchainCount]; if (mainchainCount > 0) mainchainHelper(true); } } return mainchain; } void propogateSecondaryStructure(byte type, int startResidueNumber, int endResidueNumber) { System.out.println("chainID=" + chainID + " type=" + type + " " + startResidueNumber + "->" + endResidueNumber); for (int i = residueCount; --i >= 0; ) { PdbResidue residue = residues[i]; int resNumber = residue.resNumber; if (resNumber >= startResidueNumber && resNumber <= endResidueNumber) residue.setStructureType(type); } } } --- NEW FILE: PdbResidue.java --- /* $RCSfile: PdbResidue.java,v $ * $Author: michaelthoward $ * $Date: 2003/10/29 23:27:07 $ * $Revision: 1.1 $ * * Copyright (C) 2002-2003 The Jmol Development Team * * Contact: jmo...@li... * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. */ package org.openscience.jmol.viewer.protein; import org.openscience.jmol.viewer.*; import java.util.Hashtable; public class PdbResidue { public final static byte STRUCTURE_NONE = 0; public final static byte STRUCTURE_HELIX = 1; public final static byte STRUCTURE_SHEET = 2; public final static byte STRUCTURE_TURN = 3; public char chainID; public short resNumber; public short resid; public byte structureType = STRUCTURE_NONE; int[] mainchainIndices; public PdbResidue(char chainID, int resNumber, String residue3) { this.chainID = chainID; this.resNumber = (short) resNumber; resid = lookupResid(residue3); } public void setStructureType(byte structureType) { this.structureType = structureType; } public boolean isResidue(String residue3) { return residueNames3[resid].equalsIgnoreCase(residue3); } public String getResidue3() { return residueNames3[resid]; } public int getResidueNumber() { return resNumber; } public short getResID() { return resid; } public boolean isResidueNameMatch(String strWildcard) { if (strWildcard.length() != 3) { System.err.println("residue wildcard length != 3"); return false; } String strResidue = residueNames3[resid]; for (int i = 0; i < 3; ++i) { char charWild = strWildcard.charAt(i); if (charWild == '?') continue; if (charWild != strResidue.charAt(i)) return false; } return true; } public int getResno() { return resNumber; } public char getChainID() { return chainID; } private static Hashtable htResidue = new Hashtable(); static String[] residueNames3 = new String[128]; static short residMax = 0; static { for (int i = 0; i < JmolConstants.predefinedResidueNames3.length; ++i) addResidueName(JmolConstants.predefinedResidueNames3[i]); } synchronized static short addResidueName(String name) { if (residMax == residueNames3.length) { String[] t; t = new String[residMax * 2]; System.arraycopy(residueNames3, 0, t, 0, residMax); residueNames3 = t; } short resid = residMax++; residueNames3[resid] = name; htResidue.put(name, new Short(resid)); return resid; } static short lookupResid(String strRes3) { Short boxedResid = (Short)htResidue.get(strRes3); if (boxedResid != null) return boxedResid.shortValue(); return addResidueName(strRes3); } PdbAtom newPdbAtom(int atomIndex, String pdbRecord) { PdbAtom pdbatom = new PdbAtom(this, pdbRecord); if (pdbatom.atomid <= 3) { if (mainchainIndices == null) { mainchainIndices = new int[4]; for (int i = 4; --i >= 0; ) mainchainIndices[i] = -1; } if (mainchainIndices[pdbatom.atomid] == -1) mainchainIndices[pdbatom.atomid] = atomIndex; } return pdbatom; } public int getAlphaCarbonIndex() { if (mainchainIndices == null) return -1; return mainchainIndices[1]; } } Index: PdbAtom.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/protein/PdbAtom.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- PdbAtom.java 21 Oct 2003 19:53:20 -0000 1.5 +++ PdbAtom.java 29 Oct 2003 23:27:07 -0000 1.6 @@ -30,23 +30,17 @@ public class PdbAtom { - public final static byte STRUCTURE_NONE = 0; - public final static byte STRUCTURE_HELIX = 1; - public final static byte STRUCTURE_SHEET = 2; - public final static byte STRUCTURE_TURN = 3; - // FIXME mth -- a very quick/dirty/ugly implementation // just to get some complex queries running + public PdbResidue pdbResidue; public String recordPdb; - short resid; short atomid; int atomNumber; - public byte structureType = STRUCTURE_NONE; - public PdbAtom(String recordPdb) { + public PdbAtom(PdbResidue pdbResidue, String recordPdb) { + this.pdbResidue = pdbResidue; this.recordPdb = recordPdb; - resid = lookupResid(recordPdb.substring(17, 20)); atomid = lookupAtomid(recordPdb.substring(12, 16)); atomNumber = -999999; try { @@ -60,7 +54,7 @@ } public boolean isResidue(String residue) { - return recordPdb.regionMatches(true, 17, residue, 0, 3); + return pdbResidue.isResidue(residue); } public String getName() { @@ -68,20 +62,15 @@ } public String getResidue() { - return residueNames3[resid]; + return pdbResidue.getResidue3(); } public int getResidueNumber() { - int num = -1; - try { - num = Integer.parseInt(recordPdb.substring(22, 26).trim()); - } catch (NumberFormatException e) - {} - return num; + return pdbResidue.getResidueNumber(); } public short getResID() { - return resid; + return pdbResidue.resid; } public short getAtomID() { @@ -97,19 +86,7 @@ } public boolean isResidueNameMatch(String strWildcard) { - if (strWildcard.length() != 3) { - System.err.println("residue wildcard length != 3"); - return false; - } - String strResidue = getResidue(); - for (int i = 0; i < 3; ++i) { - char charWild = strWildcard.charAt(i); - if (charWild == '?') - continue; - if (charWild != strResidue.charAt(i)) - return false; - } - return true; + return pdbResidue.isResidueNameMatch(strWildcard); } public boolean isAtomNameMatch(String strPattern) { @@ -131,13 +108,7 @@ } public int getResno() { - int chain = 0; - try { - chain = Integer.parseInt(recordPdb.substring(22, 26).trim()); - } catch (NumberFormatException e) { - System.out.println("Resno is not an integer:" + recordPdb); - } - return chain; + return pdbResidue.getResno(); } public int getTemperature() { @@ -156,14 +127,18 @@ return recordPdb.charAt(21); } - public void setStructureType(byte structureType) { - this.structureType = structureType; - } - public int getAtomNumber() { return atomNumber; } + public void setStructureType(byte type) { + pdbResidue.structureType = type; + } + + public int getProteinStructureType() { + return pdbResidue.structureType; + } + /* "N", "N", // 0 "CA", "C\u03B1", @@ -270,34 +245,4 @@ return boxedAtomid.shortValue(); return addAtomName(strAtom); } - - private static Hashtable htResidue = new Hashtable(); - static String[] residueNames3 = new String[128]; - static short residMax = 0; - - static { - for (int i = 0; i < JmolConstants.predefinedResidueNames3.length; ++i) - addResidueName(JmolConstants.predefinedResidueNames3[i]); - } - - synchronized static short addResidueName(String name) { - if (residMax == residueNames3.length) { - String[] t; - t = new String[residMax * 2]; - System.arraycopy(residueNames3, 0, t, 0, residMax); - residueNames3 = t; - } - short resid = residMax++; - residueNames3[resid] = name; - htResidue.put(name, new Short(resid)); - return resid; - } - - short lookupResid(String strRes3) { - Short boxedResid = (Short)htResidue.get(strRes3); - if (boxedResid != null) - return boxedResid.shortValue(); - return addResidueName(strRes3); - } - } Index: PdbMolecule.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/protein/PdbMolecule.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- PdbMolecule.java 7 Oct 2003 18:43:37 -0000 1.5 +++ PdbMolecule.java 29 Oct 2003 23:27:07 -0000 1.6 @@ -26,6 +26,7 @@ import org.openscience.jmol.viewer.datamodel.Frame; import org.openscience.jmol.viewer.datamodel.Atom; +import javax.vecmath.Point3f; import java.util.Hashtable; import java.util.Vector; @@ -41,42 +42,42 @@ this.structureRecords = structureRecords; } - public void finalize(int atomCount, Atom[] atoms) { - propogateAtomStructure(atomCount, atoms); + public void freeze() { + System.out.println("PdbMolecule.freeze() called"); + if (chainCount != chains.length) { + PdbChain[] t = new PdbChain[chainCount]; + System.arraycopy(chains, 0, t, 0, chainCount); + chains = t; + } + System.out.println("chainCount=" + chainCount); + for (int i = chainCount; --i >= 0; ) + chains[i].freeze(); + propogateSecondaryStructure(); } - private void propogateAtomStructure(int atomCount, Atom[] atoms) { + private void propogateSecondaryStructure() { if (structureRecords == null) return; - - Hashtable ht = new Hashtable(); - for (int i = atomCount; --i >= 0; ) { - PdbAtom pdbatom = atoms[i].pdbAtom; - if (pdbatom == null) - continue; - int residueNum = pdbatom.getResidueNumber(); - Integer boxed = new Integer(residueNum); - Vector v = (Vector)ht.get(boxed); - if (v == null) - ht.put(boxed, v = new Vector()); - v.addElement(pdbatom); - } - for (int i = structureRecords.length; --i >= 0; ) { String structure = structureRecords[i]; - byte type = PdbAtom.STRUCTURE_NONE; + byte type = PdbResidue.STRUCTURE_NONE; + int chainIDIndex = 19; int startIndex = 0; int endIndex = 0; if (structure.startsWith("HELIX ")) { - type = PdbAtom.STRUCTURE_HELIX; + System.out.println("HELIX"); + type = PdbResidue.STRUCTURE_HELIX; startIndex = 21; endIndex = 33; } else if (structure.startsWith("SHEET ")) { - type = PdbAtom.STRUCTURE_SHEET; + System.out.println("SHEET"); + type = PdbResidue.STRUCTURE_SHEET; + chainIDIndex = 21; startIndex = 22; endIndex = 33; } else if (structure.startsWith("TURN ")) { - type = PdbAtom.STRUCTURE_TURN; + System.out.println("TURN"); + type = PdbResidue.STRUCTURE_TURN; startIndex = 20; endIndex = 31; } else @@ -88,95 +89,117 @@ start = Integer.parseInt(structure.substring(startIndex, startIndex + 4).trim()); end = Integer.parseInt(structure.substring(endIndex, endIndex + 4).trim()); } catch (NumberFormatException e) { - System.out.println("number format exception"); + System.out.println("secondary structure record error"); continue; } - - for (int j = start; j <= end; ++j) { - Vector v = (Vector)ht.get(new Integer(j)); - if (v == null) - continue; - for (int k = v.size(); --k >= 0; ) { - PdbAtom pdbatom = (PdbAtom)v.elementAt(k); - pdbatom.setStructureType(type); - } + + System.out.println("start=" + start + " end=" + end); + + PdbChain chain = getPdbChain(structure.charAt(chainIDIndex)); + if (chain == null) { + System.out.println("secondary structure record error"); + continue; } + chain.propogateSecondaryStructure(type, start, end); } } - char chainCurrent; - int alphaCountCurrent; - Atom[] alphasCurrent; - int chainCount = 0; - char[] chainIDs; - Atom[][] chains; + PdbChain[] chains = new PdbChain[8]; - public Atom[][] getAlphaChains() { - if (chains == null) - buildAlphaChains(); - return chains; - } - - void buildAlphaChains() { - initializeAlphaChains(); - int atomCount = frame.getAtomCount(); - for (int i = 0; i < atomCount; ++i) { - Atom atom = frame.getAtomAt(i); - PdbAtom pdbAtom = atom.pdbAtom; - if (pdbAtom == null || pdbAtom.getAtomID() != 1) // FIXME!! needs a symbol - continue; - addAlpha(atom); - } - finalizeAlphaChains(); + public int getChainCount() { + return chainCount; + } + + public PdbResidue[] getMainchain(int chainIndex) { + return chains[chainIndex].getMainchain(); + } + + /* + Point3f[][] midpointsChains; + + public Point3f[][] getMidpointsChains() { + calcMidpoints(); + return midpointsChains; } - void initializeAlphaChains() { - chainCount = 0; - chainIDs = new char[8]; - chains = new Atom[8][]; + public Point3f[] getMidpointsChain(int chainIndex) { + calcMidpoints(); + return midpointsChains[chainIndex]; + } + */ - alphaCountCurrent = 0; - alphasCurrent = new Atom[64]; - chainCurrent = '\u0000'; + /* + void calcMidpoints() { + // buildAlphaChains(); + midpointsChains = new Point3f[chainIDCount][]; + for (int i = chainIDCount; --i >= 0; ) { + Atom[] alphaChain = alphaChains[i]; + int chainLength = alphaChain.length; + calcMidpoints(alphaChain, midpointsChains[i] = new Point3f[chainLength + 1]); + } } - void addAlpha(Atom atom) { - char chain = atom.pdbAtom.getChainID(); - if (chain != chainCurrent) { - if (alphaCountCurrent > 0) - addCurrentChain(); - alphaCountCurrent = 0; - chainCurrent = chain; + void calcMidpoints(Atom[] alphas, Point3f[] midpoints) { + int chainLength = alphas.length; + Point3f atomPrevious = alphas[0].point3f; + midpoints[0] = atomPrevious; + for (int i = 1; i < chainLength; ++i) { + Point3f mid = midpoints[i] = new Point3f(atomPrevious); + atomPrevious = alphas[i].point3f; + mid.add(atomPrevious); + mid.scale(0.5f); } - if (alphaCountCurrent == alphasCurrent.length) { - Atom[] t = new Atom[alphaCountCurrent * 2]; - System.arraycopy(alphasCurrent, 0, t, 0, alphaCountCurrent); - alphasCurrent = t; + midpoints[chainLength] = atomPrevious; + } + */ + + PdbChain getPdbChain(char chainID) { + for (int i = chainCount; --i >= 0; ) { + PdbChain chain = chains[i]; + if (chain.chainID == chainID) + return chain; } - alphasCurrent[alphaCountCurrent++] = atom; + return null; } - void addCurrentChain() { + PdbChain getOrAllocPdbChain(char chainID) { + PdbChain chain = getPdbChain(chainID); + if (chain != null) + return chain; if (chainCount == chains.length) { - Atom[][] t = new Atom[chainCount * 2][]; + PdbChain[] t = new PdbChain[chainCount * 2]; System.arraycopy(chains, 0, t, 0, chainCount); chains = t; } - Atom[] newChain = new Atom[alphaCountCurrent]; - System.arraycopy(alphasCurrent, 0, newChain, 0, alphaCountCurrent); - chains[chainCount] = newChain; - chainIDs[chainCount++] = chainCurrent; + return chains[chainCount++] = new PdbChain(chainID); } - void finalizeAlphaChains() { - if (alphaCountCurrent != 0) - addCurrentChain(); - if (chainCount != chains.length) { - Atom[][] t = new Atom[chainCount][]; - System.arraycopy(chains, 0, t, 0, chainCount); - chains = t; + + char chainIDCurrent = '\uFFFF'; + int resNumberCurrent = -1; + PdbResidue pdbResidueCurrent; + + PdbResidue allocResidue(char chainID, int resNumber, String residue3) { + PdbChain chain = getOrAllocPdbChain(chainID); + PdbResidue residue = new PdbResidue(chainID, resNumber, residue3); + chain.addResidue(residue); + return residue; + } + + public PdbAtom getPdbAtom(int atomIndex, String pdbRecord) { + try { + char chainID = pdbRecord.charAt(21); + int resNumber = Integer.parseInt(pdbRecord.substring(22, 26).trim()); + if (chainID != chainIDCurrent || resNumber != resNumberCurrent) { + pdbResidueCurrent = allocResidue(chainID, resNumber, pdbRecord.substring(17, 20)); + chainIDCurrent = chainID; + resNumberCurrent = resNumber; + } + return pdbResidueCurrent.newPdbAtom(atomIndex, pdbRecord); + } catch (NumberFormatException e) { + System.out.println("bad residue number in: " + pdbRecord); } - alphasCurrent = null; + return null; } } |