From: Miguel <mig...@us...> - 2004-08-25 19:13:28
|
Update of /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8041/src/org/openscience/jmol/viewer/datamodel Modified Files: AlphaMonomer.java FrameBuilder.java Monomer.java Mps.java MpsRenderer.java NucleicMonomer.java NucleicPolymer.java Polymer.java RibbonsRenderer.java Added Files: PhosphorusMonomer.java PhosphorusPolymer.java Log Message: initial work on phosphorus-only nucleic acid chains --- NEW FILE: PhosphorusMonomer.java --- /* $RCSfile: PhosphorusMonomer.java,v $ * $Author: migueljmol $ * $Date: 2004/08/25 19:13:17 $ * $Revision: 1.1 $ * * Copyright (C) 2004 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.datamodel; import org.openscience.jmol.viewer.*; import javax.vecmath.Point3f; public class PhosphorusMonomer extends Monomer { final static byte[] phosphorusOffsets = { 0 }; static Monomer validateAndAllocate(Chain chain, String group3, int seqcode, int firstIndex, int lastIndex, int[] specialAtomIndexes, Atom[] atoms) { // System.out.println("PhosphorusMonomer.validateAndAllocate"); if (firstIndex != lastIndex || specialAtomIndexes[JmolConstants.ATOMID_NUCLEIC_PHOSPHORUS] != firstIndex) return null; return new PhosphorusMonomer(chain, group3, seqcode, firstIndex, lastIndex, phosphorusOffsets); } //////////////////////////////////////////////////////////////// PhosphorusMonomer(Chain chain, String group3, int seqcode, int firstAtomIndex, int lastAtomIndex, byte[] offsets) { super(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, offsets); } boolean isPhosphorusMonomer() { return true; } byte getProteinStructureType() { return 0; } Atom getAtom(byte specialAtomID) { return (specialAtomID == JmolConstants.ATOMID_NUCLEIC_PHOSPHORUS ? getLeadAtom() : null); } Point3f getAtomPoint(byte specialAtomID) { return (specialAtomID == JmolConstants.ATOMID_NUCLEIC_PHOSPHORUS ? getLeadAtomPoint() : null); } boolean isConnectedAfter(Monomer possiblyPreviousMonomer) { if (possiblyPreviousMonomer == null) return true; if (! (possiblyPreviousMonomer instanceof PhosphorusMonomer)) return false; // 1PN8 73:d and 74:d are 7.001 angstroms apart float distance = getLeadAtomPoint().distance(possiblyPreviousMonomer.getLeadAtomPoint()); return distance <= 7.1f; } } --- NEW FILE: PhosphorusPolymer.java --- /* $RCSfile: PhosphorusPolymer.java,v $ * $Author: migueljmol $ * $Date: 2004/08/25 19:13:17 $ * $Revision: 1.1 $ * * Copyright (C) 2004 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.datamodel; import org.openscience.jmol.viewer.*; import javax.vecmath.Point3f; public class PhosphorusPolymer extends Polymer { PhosphorusPolymer(Monomer[] monomers) { super(monomers); } } Index: AlphaMonomer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/AlphaMonomer.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- AlphaMonomer.java 14 Jun 2004 20:33:40 -0000 1.15 +++ AlphaMonomer.java 25 Aug 2004 19:13:16 -0000 1.16 @@ -86,14 +86,6 @@ : null); } - Atom getInitiatorAtom() { - return getLeadAtom(); - } - - Atom getTerminatorAtom() { - return getLeadAtom(); - } - boolean isConnectedAfter(Monomer possiblyPreviousMonomer) { if (possiblyPreviousMonomer == null) return true; @@ -105,7 +97,4 @@ return distance <= 4.2f; } - void findNearestAtomIndex(int x, int y, Closest closest, - short madBegin, short madEnd) { - } } Index: FrameBuilder.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/FrameBuilder.java,v retrieving revision 1.50 retrieving revision 1.51 diff -u -r1.50 -r1.51 --- FrameBuilder.java 15 Jun 2004 21:46:15 -0000 1.50 +++ FrameBuilder.java 25 Aug 2004 19:13:16 -0000 1.51 @@ -1,383 +1,386 @@ -/* $RCSfile$ - * $Author$ - * $Date$ - * $Revision$ - * - * 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.datamodel; - -import org.jmol.api.ModelAdapter; -import org.openscience.jmol.viewer.*; -import java.util.Hashtable; -import javax.vecmath.Point3f; - -final public class FrameBuilder { - - final JmolViewer viewer; - final ModelAdapter adapter; - - public FrameBuilder(JmolViewer viewer, ModelAdapter adapter) { - this.viewer = viewer; - this.adapter = adapter; - } - - protected void finalize() { - } - - public Frame buildFrame(Object clientFile) { - long timeBegin = System.currentTimeMillis(); - String fileTypeName = adapter.getFileTypeName(clientFile); - initializeBuild(adapter.getEstimatedAtomCount(clientFile)); - - Frame frame = new Frame(viewer, fileTypeName); - - /**************************************************************** - * crystal cell must come first, in case atom coordinates - * need to be transformed to fit in the crystal cell - ****************************************************************/ - frame.fileCoordinatesAreFractional = - adapter.coordinatesAreFractional(clientFile); - frame.setNotionalUnitcell(adapter.getNotionalUnitcell(clientFile)); - frame.setPdbScaleMatrix(adapter.getPdbScaleMatrix(clientFile)); - frame.setPdbScaleTranslate(adapter.getPdbScaleTranslate(clientFile)); - - for (ModelAdapter.AtomIterator iterAtom = - adapter.getAtomIterator(clientFile); - iterAtom.hasNext(); ) { - byte elementNumber = (byte)iterAtom.getElementNumber(); - if (elementNumber <= 0) - elementNumber = JmolConstants. - elementNumberFromSymbol(iterAtom.getElementSymbol()); - addAtom(frame, - iterAtom.getModelTag().intern(), - iterAtom.getUniqueID(), - elementNumber, - iterAtom.getAtomName(), - iterAtom.getFormalCharge(), - iterAtom.getPartialCharge(), - iterAtom.getOccupancy(), - iterAtom.getBfactor(), - iterAtom.getX(), iterAtom.getY(), iterAtom.getZ(), - iterAtom.getIsHetero(), iterAtom.getAtomSerial(), - iterAtom.getChainID(), - iterAtom.getGroup3(), - iterAtom.getSequenceNumber(), iterAtom.getInsertionCode(), - iterAtom.getVectorX(), iterAtom.getVectorY(), - iterAtom.getVectorZ(), - iterAtom.getClientAtomReference()); - } - - { - ModelAdapter.BondIterator iterBond = - adapter.getBondIterator(clientFile); - if (iterBond != null) - while (iterBond.hasNext()) - bondAtoms(iterBond.getAtomUniqueID1(), - iterBond.getAtomUniqueID2(), - iterBond.getEncodedOrder()); - } - - ModelAdapter.StructureIterator iterStructure = - adapter.getStructureIterator(clientFile); - if (iterStructure != null) - while (iterStructure.hasNext()) - frame.defineStructure(iterStructure.getStructureType(), - iterStructure.getStartChainID(), - iterStructure.getStartSequenceNumber(), - iterStructure.getStartInsertionCode(), - iterStructure.getEndChainID(), - iterStructure.getEndSequenceNumber(), - iterStructure.getEndInsertionCode()); - - frame.atomCount = atomCount; - frame.atoms = atoms; - frame.clientAtomReferences = clientAtomReferences; - frame.bondCount = bondCount; - frame.bonds = bonds; - - frame.doUnitcellStuff(); - frame.doAutobond(); - finalizeGroupBuild(frame); - buildPolymers(frame); - frame.freeze(); - long msToBuild = System.currentTimeMillis() - timeBegin; - // System.out.println("Build a frame:" + msToBuild + " ms"); - adapter.finish(clientFile); - finalizeBuild(); - return frame; - } - - private final static int ATOM_GROWTH_INCREMENT = 2000; - - String currentModelTag; - int currentModelIndex; - Model currentModel; - char currentChainID; - Chain currentChain; - int currentGroupSequenceNumber; - char currentGroupInsertionCode; - - int atomCount; - Atom[] atoms; - Object[] clientAtomReferences; - - int bondCount; - Bond[] bonds; - - private final Hashtable htAtomMap = new Hashtable(); - - - void initializeBuild(int atomCountEstimate) { - currentModelTag = null; - currentModel = null; - currentChainID = '\uFFFF'; - currentChain = null; - currentGroupInsertionCode = '\uFFFF'; - - this.atomCount = 0; - if (atomCountEstimate <= 0) - atomCountEstimate = ATOM_GROWTH_INCREMENT; - atoms = new Atom[atomCountEstimate]; - clientAtomReferences = null; - this.bondCount = 0; - bonds = new Bond[2 * atomCountEstimate]; - htAtomMap.clear(); - initializeGroupBuild(); - } - - void finalizeBuild() { - currentModel = null; - currentChain = null; - atoms = null; - clientAtomReferences = null; - bonds = null; - htAtomMap.clear(); - } - - - void addAtom(Frame frame, - String modelTag, Object atomUid, - byte atomicNumber, - String atomName, - int formalCharge, float partialCharge, - int occupancy, - float bfactor, - float x, float y, float z, - boolean isHetero, int atomSerial, char chainID, - String group3, - int groupSequenceNumber, char groupInsertionCode, - float vectorX, float vectorY, float vectorZ, - Object clientAtomReference) { - if (modelTag != currentModelTag) { - currentModelTag = modelTag; - currentModel = frame.mmset.getOrAllocateModel(modelTag); - currentModelIndex = frame.mmset.getModelIndex(modelTag); - currentChainID = '\uFFFF'; - } - if (chainID != currentChainID) { - currentChainID = chainID; - currentChain = currentModel.getOrAllocateChain(chainID); - currentGroupInsertionCode = '\uFFFF'; - } - if (groupSequenceNumber != currentGroupSequenceNumber || - groupInsertionCode != currentGroupInsertionCode) { - currentGroupSequenceNumber = groupSequenceNumber; - currentGroupInsertionCode = groupInsertionCode; - startGroup(currentChain, group3, - groupSequenceNumber, groupInsertionCode, atomCount); - } - Atom atom = new Atom(viewer, - currentModelIndex, - atomCount, - atomicNumber, - atomName, - formalCharge, partialCharge, - occupancy, - bfactor, - x, y, z, - isHetero, atomSerial, chainID, - vectorX, vectorY, vectorZ); - - if (atomCount == atoms.length) - atoms = (Atom[])Util.setLength(atoms, atomCount + ATOM_GROWTH_INCREMENT); - atoms[atomCount] = atom; - if (clientAtomReference != null) { - if (clientAtomReferences == null) - clientAtomReferences = new Object[atoms.length]; - else if (clientAtomReferences.length <= atomCount) - clientAtomReferences = - (Object[])Util.setLength(clientAtomReferences, atoms.length); - clientAtomReferences[atomCount] = clientAtomReference; - } - ++atomCount; - htAtomMap.put(atomUid, atom); - } - - void bondAtoms(Object atomUid1, Object atomUid2, - int order) { - Atom atom1 = (Atom)htAtomMap.get(atomUid1); - if (atom1 == null) { - System.out.println("bondAtoms cannot find atomUid1?"); - return; - } - Atom atom2 = (Atom)htAtomMap.get(atomUid2); - if (atom2 == null) { - System.out.println("bondAtoms cannot find atomUid2?"); - return; - } - if (bondCount == bonds.length) - bonds = (Bond[])Util.setLength(bonds, - bondCount + 2 * ATOM_GROWTH_INCREMENT); - // note that if the atoms are already bonded then - // Atom.bondMutually(...) will return null - Bond bond = atom1.bondMutually(atom2, order, viewer); - if (bond != null) - bonds[bondCount++] = bond; - } - - //////////////////////////////////////////////////////////////// - // special handling for groups - //////////////////////////////////////////////////////////////// - - final static int defaultGroupCount = 32; - int groupCount; - Chain[] chains = new Chain[defaultGroupCount]; - String[] group3s = new String[defaultGroupCount]; - int[] seqcodes = new int[defaultGroupCount]; - int[] firstAtomIndexes = new int[defaultGroupCount]; - - Group[] groups; - - final int[] specialAtomIndexes = new int[JmolConstants.ATOMID_MAX]; - - void initializeGroupBuild() { - groupCount = 0; - } - - void finalizeGroupBuild(Frame frame) { - // run this loop in increasing order so that the - // groups get defined going up - groups = new Group[groupCount]; - for (int i = 0; i < groupCount; ++i) { - distinguishAndPropogateGroup(i, chains[i], group3s[i], seqcodes[i], - firstAtomIndexes[i], - i == groupCount - 1 - ? atomCount : firstAtomIndexes[i + 1]); - chains[i] = null; - group3s[i] = null; - } - frame.groupCount = groupCount; - frame.groups = groups; - groups = null; - } - - void startGroup(Chain chain, String group3, - int groupSequenceNumber, char groupInsertionCode, - int firstAtomIndex) { - if (groupCount == group3s.length) { - chains = (Chain[])Util.doubleLength(chains); - group3s = Util.doubleLength(group3s); - seqcodes = Util.doubleLength(seqcodes); - firstAtomIndexes = Util.doubleLength(firstAtomIndexes); - } - firstAtomIndexes[groupCount] = firstAtomIndex; - chains[groupCount] = chain; - group3s[groupCount] = group3; - seqcodes[groupCount] = - Group.getSeqcode(groupSequenceNumber, groupInsertionCode); - ++groupCount; - } - - void distinguishAndPropogateGroup(int groupIndex, - Chain chain, String group3, int seqcode, - int firstAtomIndex, int maxAtomIndex) { - /* - System.out.println("distinguish & propogate group:" + - " group3:" + group3 + - " seqcode:" + Group.getSeqcodeString(seqcode) + - " firstAtomIndex:" + firstAtomIndex + - " maxAtomIndex:" + maxAtomIndex); - */ - int distinguishingBits = 0; - // clear previous specialAtomIndexes - for (int i = JmolConstants.ATOMID_MAX; --i >= 0; ) - specialAtomIndexes[i] = Integer.MIN_VALUE; - - for (int i = maxAtomIndex; --i >= firstAtomIndex; ) { - int specialAtomID = atoms[i].specialAtomID; - if (specialAtomID > 0) { - if (specialAtomID < JmolConstants.ATOMID_DISTINGUISHING_ATOM_MAX) - distinguishingBits |= 1 << specialAtomID; - specialAtomIndexes[specialAtomID] = i; - } - } - - int lastAtomIndex = maxAtomIndex - 1; - if (lastAtomIndex < firstAtomIndex) - throw new NullPointerException(); - - Group group = null; - // System.out.println("distinguishingBits=" + distinguishingBits); - if ((distinguishingBits & JmolConstants.ATOMID_PROTEIN_MASK) == - JmolConstants.ATOMID_PROTEIN_MASK) { - // System.out.println("may be an AminoMonomer"); - group = AminoMonomer.validateAndAllocate(chain, group3, seqcode, - firstAtomIndex, lastAtomIndex, - specialAtomIndexes, atoms); - } else if ((distinguishingBits & JmolConstants.ATOMID_ALPHA_ONLY_MASK) == - JmolConstants.ATOMID_ALPHA_ONLY_MASK) { - // System.out.println("AlphaMonomer.validateAndAllocate"); - group = AlphaMonomer.validateAndAllocate(chain, group3, seqcode, - firstAtomIndex, lastAtomIndex, - specialAtomIndexes, atoms); - } else if (((distinguishingBits & JmolConstants.ATOMID_NUCLEIC_MASK) == - JmolConstants.ATOMID_NUCLEIC_MASK)) { - group = NucleicMonomer.validateAndAllocate(chain, group3, seqcode, - firstAtomIndex, lastAtomIndex, - specialAtomIndexes, atoms); - } - - if (group == null) - group = new Group(chain, group3, seqcode, firstAtomIndex, lastAtomIndex); - - chain.addGroup(group); - groups[groupIndex] = group; - - //////////////////////////////////////////////////////////////// - for (int i = maxAtomIndex; --i >= firstAtomIndex; ) - atoms[i].setGroup(group); - } - - //////////////////////////////////////////////////////////////// - - void buildPolymers(Frame frame) { - Group[] groups = frame.groups; - for (int i = 0; i < groupCount; ++i) { - Group group = groups[i]; - if (group instanceof Monomer) { - Monomer monomer = (Monomer)group; - if (monomer.polymer == null) - Polymer.allocatePolymer(groups, i); - } - } - } -} - +/* $RCSfile$ + * $Author$ + * $Date$ + * $Revision$ + * + * 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.datamodel; + +import org.jmol.api.ModelAdapter; +import org.openscience.jmol.viewer.*; +import java.util.Hashtable; +import javax.vecmath.Point3f; + +final public class FrameBuilder { + + final JmolViewer viewer; + final ModelAdapter adapter; + + public FrameBuilder(JmolViewer viewer, ModelAdapter adapter) { + this.viewer = viewer; + this.adapter = adapter; + } + + protected void finalize() { + } + + public Frame buildFrame(Object clientFile) { + long timeBegin = System.currentTimeMillis(); + String fileTypeName = adapter.getFileTypeName(clientFile); + initializeBuild(adapter.getEstimatedAtomCount(clientFile)); + + Frame frame = new Frame(viewer, fileTypeName); + + /**************************************************************** + * crystal cell must come first, in case atom coordinates + * need to be transformed to fit in the crystal cell + ****************************************************************/ + frame.fileCoordinatesAreFractional = + adapter.coordinatesAreFractional(clientFile); + frame.setNotionalUnitcell(adapter.getNotionalUnitcell(clientFile)); + frame.setPdbScaleMatrix(adapter.getPdbScaleMatrix(clientFile)); + frame.setPdbScaleTranslate(adapter.getPdbScaleTranslate(clientFile)); + + for (ModelAdapter.AtomIterator iterAtom = + adapter.getAtomIterator(clientFile); + iterAtom.hasNext(); ) { + byte elementNumber = (byte)iterAtom.getElementNumber(); + if (elementNumber <= 0) + elementNumber = JmolConstants. + elementNumberFromSymbol(iterAtom.getElementSymbol()); + addAtom(frame, + iterAtom.getModelTag().intern(), + iterAtom.getUniqueID(), + elementNumber, + iterAtom.getAtomName(), + iterAtom.getFormalCharge(), + iterAtom.getPartialCharge(), + iterAtom.getOccupancy(), + iterAtom.getBfactor(), + iterAtom.getX(), iterAtom.getY(), iterAtom.getZ(), + iterAtom.getIsHetero(), iterAtom.getAtomSerial(), + iterAtom.getChainID(), + iterAtom.getGroup3(), + iterAtom.getSequenceNumber(), iterAtom.getInsertionCode(), + iterAtom.getVectorX(), iterAtom.getVectorY(), + iterAtom.getVectorZ(), + iterAtom.getClientAtomReference()); + } + + { + ModelAdapter.BondIterator iterBond = + adapter.getBondIterator(clientFile); + if (iterBond != null) + while (iterBond.hasNext()) + bondAtoms(iterBond.getAtomUniqueID1(), + iterBond.getAtomUniqueID2(), + iterBond.getEncodedOrder()); + } + + ModelAdapter.StructureIterator iterStructure = + adapter.getStructureIterator(clientFile); + if (iterStructure != null) + while (iterStructure.hasNext()) + frame.defineStructure(iterStructure.getStructureType(), + iterStructure.getStartChainID(), + iterStructure.getStartSequenceNumber(), + iterStructure.getStartInsertionCode(), + iterStructure.getEndChainID(), + iterStructure.getEndSequenceNumber(), + iterStructure.getEndInsertionCode()); + + frame.atomCount = atomCount; + frame.atoms = atoms; + frame.clientAtomReferences = clientAtomReferences; + frame.bondCount = bondCount; + frame.bonds = bonds; + + frame.doUnitcellStuff(); + frame.doAutobond(); + finalizeGroupBuild(frame); + buildPolymers(frame); + frame.freeze(); + long msToBuild = System.currentTimeMillis() - timeBegin; + // System.out.println("Build a frame:" + msToBuild + " ms"); + adapter.finish(clientFile); + finalizeBuild(); + return frame; + } + + private final static int ATOM_GROWTH_INCREMENT = 2000; + + String currentModelTag; + int currentModelIndex; + Model currentModel; + char currentChainID; + Chain currentChain; + int currentGroupSequenceNumber; + char currentGroupInsertionCode; + + int atomCount; + Atom[] atoms; + Object[] clientAtomReferences; + + int bondCount; + Bond[] bonds; + + private final Hashtable htAtomMap = new Hashtable(); + + + void initializeBuild(int atomCountEstimate) { + currentModelTag = null; + currentModel = null; + currentChainID = '\uFFFF'; + currentChain = null; + currentGroupInsertionCode = '\uFFFF'; + + this.atomCount = 0; + if (atomCountEstimate <= 0) + atomCountEstimate = ATOM_GROWTH_INCREMENT; + atoms = new Atom[atomCountEstimate]; + clientAtomReferences = null; + this.bondCount = 0; + bonds = new Bond[2 * atomCountEstimate]; + htAtomMap.clear(); + initializeGroupBuild(); + } + + void finalizeBuild() { + currentModel = null; + currentChain = null; + atoms = null; + clientAtomReferences = null; + bonds = null; + htAtomMap.clear(); + } + + + void addAtom(Frame frame, + String modelTag, Object atomUid, + byte atomicNumber, + String atomName, + int formalCharge, float partialCharge, + int occupancy, + float bfactor, + float x, float y, float z, + boolean isHetero, int atomSerial, char chainID, + String group3, + int groupSequenceNumber, char groupInsertionCode, + float vectorX, float vectorY, float vectorZ, + Object clientAtomReference) { + if (modelTag != currentModelTag) { + currentModelTag = modelTag; + currentModel = frame.mmset.getOrAllocateModel(modelTag); + currentModelIndex = frame.mmset.getModelIndex(modelTag); + currentChainID = '\uFFFF'; + } + if (chainID != currentChainID) { + currentChainID = chainID; + currentChain = currentModel.getOrAllocateChain(chainID); + currentGroupInsertionCode = '\uFFFF'; + } + if (groupSequenceNumber != currentGroupSequenceNumber || + groupInsertionCode != currentGroupInsertionCode) { + currentGroupSequenceNumber = groupSequenceNumber; + currentGroupInsertionCode = groupInsertionCode; + startGroup(currentChain, group3, + groupSequenceNumber, groupInsertionCode, atomCount); + } + Atom atom = new Atom(viewer, + currentModelIndex, + atomCount, + atomicNumber, + atomName, + formalCharge, partialCharge, + occupancy, + bfactor, + x, y, z, + isHetero, atomSerial, chainID, + vectorX, vectorY, vectorZ); + + if (atomCount == atoms.length) + atoms = (Atom[])Util.setLength(atoms, atomCount + ATOM_GROWTH_INCREMENT); + atoms[atomCount] = atom; + if (clientAtomReference != null) { + if (clientAtomReferences == null) + clientAtomReferences = new Object[atoms.length]; + else if (clientAtomReferences.length <= atomCount) + clientAtomReferences = + (Object[])Util.setLength(clientAtomReferences, atoms.length); + clientAtomReferences[atomCount] = clientAtomReference; + } + ++atomCount; + htAtomMap.put(atomUid, atom); + } + + void bondAtoms(Object atomUid1, Object atomUid2, + int order) { + Atom atom1 = (Atom)htAtomMap.get(atomUid1); + if (atom1 == null) { + System.out.println("bondAtoms cannot find atomUid1?"); + return; + } + Atom atom2 = (Atom)htAtomMap.get(atomUid2); + if (atom2 == null) { + System.out.println("bondAtoms cannot find atomUid2?"); + return; + } + if (bondCount == bonds.length) + bonds = (Bond[])Util.setLength(bonds, + bondCount + 2 * ATOM_GROWTH_INCREMENT); + // note that if the atoms are already bonded then + // Atom.bondMutually(...) will return null + Bond bond = atom1.bondMutually(atom2, order, viewer); + if (bond != null) + bonds[bondCount++] = bond; + } + + //////////////////////////////////////////////////////////////// + // special handling for groups + //////////////////////////////////////////////////////////////// + + final static int defaultGroupCount = 32; + int groupCount; + Chain[] chains = new Chain[defaultGroupCount]; + String[] group3s = new String[defaultGroupCount]; + int[] seqcodes = new int[defaultGroupCount]; + int[] firstAtomIndexes = new int[defaultGroupCount]; + + Group[] groups; + + final int[] specialAtomIndexes = new int[JmolConstants.ATOMID_MAX]; + + void initializeGroupBuild() { + groupCount = 0; + } + + void finalizeGroupBuild(Frame frame) { + // run this loop in increasing order so that the + // groups get defined going up + groups = new Group[groupCount]; + for (int i = 0; i < groupCount; ++i) { + distinguishAndPropogateGroup(i, chains[i], group3s[i], seqcodes[i], + firstAtomIndexes[i], + i == groupCount - 1 + ? atomCount : firstAtomIndexes[i + 1]); + chains[i] = null; + group3s[i] = null; + } + frame.groupCount = groupCount; + frame.groups = groups; + groups = null; + } + + void startGroup(Chain chain, String group3, + int groupSequenceNumber, char groupInsertionCode, + int firstAtomIndex) { + if (groupCount == group3s.length) { + chains = (Chain[])Util.doubleLength(chains); + group3s = Util.doubleLength(group3s); + seqcodes = Util.doubleLength(seqcodes); + firstAtomIndexes = Util.doubleLength(firstAtomIndexes); + } + firstAtomIndexes[groupCount] = firstAtomIndex; + chains[groupCount] = chain; + group3s[groupCount] = group3; + seqcodes[groupCount] = + Group.getSeqcode(groupSequenceNumber, groupInsertionCode); + ++groupCount; + } + + void distinguishAndPropogateGroup(int groupIndex, + Chain chain, String group3, int seqcode, + int firstAtomIndex, int maxAtomIndex) { + // System.out.println("distinguish & propogate group:" + + // " group3:" + group3 + + // " seqcode:" + Group.getSeqcodeString(seqcode) + + // " firstAtomIndex:" + firstAtomIndex + + // " maxAtomIndex:" + maxAtomIndex); + int distinguishingBits = 0; + // clear previous specialAtomIndexes + for (int i = JmolConstants.ATOMID_MAX; --i >= 0; ) + specialAtomIndexes[i] = Integer.MIN_VALUE; + + for (int i = maxAtomIndex; --i >= firstAtomIndex; ) { + int specialAtomID = atoms[i].specialAtomID; + if (specialAtomID > 0) { + if (specialAtomID < JmolConstants.ATOMID_DISTINGUISHING_ATOM_MAX) + distinguishingBits |= 1 << specialAtomID; + specialAtomIndexes[specialAtomID] = i; + } + } + + int lastAtomIndex = maxAtomIndex - 1; + if (lastAtomIndex < firstAtomIndex) + throw new NullPointerException(); + + Group group = null; + // System.out.println("distinguishingBits=" + distinguishingBits); + if ((distinguishingBits & JmolConstants.ATOMID_PROTEIN_MASK) == + JmolConstants.ATOMID_PROTEIN_MASK) { + // System.out.println("may be an AminoMonomer"); + group = AminoMonomer.validateAndAllocate(chain, group3, seqcode, + firstAtomIndex, lastAtomIndex, + specialAtomIndexes, atoms); + } else if (distinguishingBits == JmolConstants.ATOMID_ALPHA_ONLY_MASK) { + // System.out.println("AlphaMonomer.validateAndAllocate"); + group = AlphaMonomer.validateAndAllocate(chain, group3, seqcode, + firstAtomIndex, lastAtomIndex, + specialAtomIndexes, atoms); + } else if (((distinguishingBits & JmolConstants.ATOMID_NUCLEIC_MASK) == + JmolConstants.ATOMID_NUCLEIC_MASK)) { + group = NucleicMonomer.validateAndAllocate(chain, group3, seqcode, + firstAtomIndex, lastAtomIndex, + specialAtomIndexes, atoms); + } else if (distinguishingBits == + JmolConstants.ATOMID_PHOSPHORUS_ONLY_MASK) { + // System.out.println("PhosphorusMonomer.validateAndAllocate"); + group = + PhosphorusMonomer.validateAndAllocate(chain, group3, seqcode, + firstAtomIndex, lastAtomIndex, + specialAtomIndexes, atoms); + } + if (group == null) + group = new Group(chain, group3, seqcode, firstAtomIndex, lastAtomIndex); + + chain.addGroup(group); + groups[groupIndex] = group; + + //////////////////////////////////////////////////////////////// + for (int i = maxAtomIndex; --i >= firstAtomIndex; ) + atoms[i].setGroup(group); + } + + //////////////////////////////////////////////////////////////// + + void buildPolymers(Frame frame) { + Group[] groups = frame.groups; + for (int i = 0; i < groupCount; ++i) { + Group group = groups[i]; + if (group instanceof Monomer) { + Monomer monomer = (Monomer)group; + if (monomer.polymer == null) + Polymer.allocatePolymer(groups, i); + } + } + } +} + Index: Monomer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/Monomer.java,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- Monomer.java 14 Jun 2004 18:47:39 -0000 1.20 +++ Monomer.java 25 Aug 2004 19:13:17 -0000 1.21 @@ -88,13 +88,10 @@ //////////////////////////////////////////////////////////////// - boolean isAminoMonomer() { return false; } - boolean isAlphaMonomer() { return false; } - boolean isNucleicMonomer() { return false; } public boolean isDna() { return false; } public boolean isRna() { return false; } - final public boolean isProtein() { return isAlphaMonomer(); } - final public boolean isNucleic() { return isNucleicMonomer(); } + final public boolean isProtein() {return this instanceof AlphaMonomer;} + final public boolean isNucleic() {return this instanceof PhosphorusMonomer;} //////////////////////////////////////////////////////////////// @@ -193,8 +190,13 @@ return getAtomPointFromOffsetIndex(1); } - abstract Atom getInitiatorAtom(); - abstract Atom getTerminatorAtom(); + Atom getInitiatorAtom() { + return getLeadAtom(); + } + + Atom getTerminatorAtom() { + return getLeadAtom(); + } abstract boolean isConnectedAfter(Monomer possiblyPreviousMonomer); @@ -202,6 +204,7 @@ * Selects LeadAtom when this Monomer is clicked ... iff it is * closer to the user. */ - abstract void findNearestAtomIndex(int x, int y, Closest closest, - short madBegin, short madEnd); + void findNearestAtomIndex(int x, int y, Closest closest, + short madBegin, short madEnd) { + } } Index: Mps.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/Mps.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- Mps.java 12 Jul 2004 15:36:20 -0000 1.10 +++ Mps.java 25 Aug 2004 19:13:17 -0000 1.11 @@ -91,7 +91,6 @@ } void findNearestAtomIndex(int xMouse, int yMouse, Closest closest) { - System.out.println("Mps.findNearestAtomIndex()"); for (int i = mpsmodels.length; --i >= 0; ) mpsmodels[i].findNearestAtomIndex(xMouse, yMouse, closest); } Index: MpsRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/MpsRenderer.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- MpsRenderer.java 7 Jun 2004 22:48:10 -0000 1.3 +++ MpsRenderer.java 25 Aug 2004 19:13:17 -0000 1.4 @@ -86,12 +86,14 @@ if (! isSpecials[iNext1]) madEnd = (mads[iNext1] + madThis) / 2; } - int diameterBeg = viewer.scaleToScreen(leadMidpointScreens[i].z, madBeg); - int diameterEnd = viewer.scaleToScreen(leadMidpointScreens[iNext1].z, madEnd); + int diameterBeg = + viewer.scaleToScreen(leadMidpointScreens[i].z, madBeg); + int diameterEnd = + viewer.scaleToScreen(leadMidpointScreens[iNext1].z, madEnd); int diameterMid = viewer.scaleToScreen(monomers[i].getLeadAtom().getScreenZ(), madThis); - g3d.fillHermite(colix, monomers[i].isNucleicMonomer() ? 4 : 7, + g3d.fillHermite(colix, monomers[i].isNucleic() ? 4 : 7, diameterBeg, diameterMid, diameterEnd, leadMidpointScreens[iPrev1], leadMidpointScreens[i], leadMidpointScreens[iNext1], leadMidpointScreens[iNext2]); Index: NucleicMonomer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/NucleicMonomer.java,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- NucleicMonomer.java 14 Jun 2004 18:47:39 -0000 1.22 +++ NucleicMonomer.java 25 Aug 2004 19:13:17 -0000 1.23 @@ -27,7 +27,7 @@ import org.openscience.jmol.viewer.*; import javax.vecmath.Point3f; -public class NucleicMonomer extends Monomer { +public class NucleicMonomer extends PhosphorusMonomer { // negative values are optional final static byte[] interestingNucleicAtomIDs = { @@ -175,10 +175,6 @@ return getSpecialAtomPoint(interestingNucleicAtomIDs, specialAtomID); } - Atom getInitiatorAtom() { - return getLeadAtom(); - } - Atom getTerminatorAtom() { return getAtomFromOffsetIndex(offsets[23] != -1 ? 23 : 24); } Index: NucleicPolymer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/NucleicPolymer.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- NucleicPolymer.java 14 Jun 2004 23:14:28 -0000 1.3 +++ NucleicPolymer.java 25 Aug 2004 19:13:17 -0000 1.4 @@ -39,15 +39,6 @@ boolean hasWingPoints() { return true; } - void addSecondaryStructure(byte type, - char startChainID, int startSeqcode, - char endChainID, int endSeqcode) { - } - - public boolean isProtein() { - return false; - } - public void calcHydrogenBonds() { for (int i = model.getPolymerCount(); --i >= 0; ) { Polymer otherPolymer = model.getPolymer(i); Index: Polymer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/Polymer.java,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- Polymer.java 15 Jun 2004 20:49:29 -0000 1.26 +++ Polymer.java 25 Aug 2004 19:13:17 -0000 1.27 @@ -74,6 +74,11 @@ // System.out.println("a NucleicPolymer"); return new NucleicPolymer(monomers); } + monomers = getPhosphorusMonomers(groups, firstGroupIndex); + if (monomers != null) { + // System.out.println("an AlphaPolymer"); + return new PhosphorusPolymer(monomers); + } System.out.println("Polymer.allocatePolymer() ... why am I here?"); throw new NullPointerException(); } @@ -122,6 +127,28 @@ return monomers; } + static Monomer[] getPhosphorusMonomers(Group[] groups, int firstGroupIndex) { + PhosphorusMonomer previous = null; + int count = 0; + for (int i = firstGroupIndex; i < groups.length; ++i, ++count) { + Group group = groups[i]; + if (! (group instanceof PhosphorusMonomer)) + break; + PhosphorusMonomer current = (PhosphorusMonomer)group; + if (current.polymer != null) + break; + if (! current.isConnectedAfter(previous)) + break; + previous = current; + } + if (count == 0) + return null; + Monomer[] monomers = new Monomer[count]; + for (int j = 0; j < count; ++j) + monomers[j] = (PhosphorusMonomer)groups[firstGroupIndex + j]; + return monomers; + } + static Monomer[] getNucleicMonomers(Group[] groups, int firstGroupIndex) { NucleicMonomer previous = null; int count = 0; @@ -198,15 +225,23 @@ return monomers[polymerIndex].getWingAtomPoint(); } - abstract void addSecondaryStructure(byte type, - char chainIdStart, int startSeqcode, - char chainIdEnd, int endSeqcode); + void addSecondaryStructure(byte type, + char startChainID, int startSeqcode, + char endChainID, int endSeqcode) { + } void calculateStructures() { } - abstract boolean isProtein(); + /* + boolean isProtein() { return monomers[0].isProtein(); } + return false; + } + */ - abstract void calcHydrogenBonds(); + boolean isNucleic() { return monomers[0].isNucleic(); } + + void calcHydrogenBonds() { + } Point3f[] getLeadMidpoints() { if (leadMidpoints == null) Index: RibbonsRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/RibbonsRenderer.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- RibbonsRenderer.java 30 May 2004 16:43:46 -0000 1.21 +++ RibbonsRenderer.java 25 Aug 2004 19:13:17 -0000 1.22 @@ -58,12 +58,17 @@ return screens; } - boolean isNucleicPolymer; + boolean isNucleic; void renderMpspolymer( Mps.Mpspolymer mpspolymer) { Ribbons.Schain strandsChain = (Ribbons.Schain)mpspolymer; if (strandsChain.wingVectors != null) { - isNucleicPolymer = strandsChain.polymer instanceof NucleicPolymer; + // note that we are not treating a PhosphorusPolymer + // as nucleic because we are not calculating the wing + // vector correctly. + // if/when we do that then this test will become + // isNucleic = strandsChain.polymer.isNucleic(); + isNucleic = strandsChain.polymer instanceof NucleicPolymer; render1Chain(strandsChain.monomerCount, strandsChain.monomers, strandsChain.leadMidpoints, @@ -81,9 +86,9 @@ Point3i[] ribbonBottomScreens; ribbonTopScreens = calcScreens(centers, vectors, mads, - isNucleicPolymer ? 1f : 0.5f); + isNucleic ? 1f : 0.5f); ribbonBottomScreens = calcScreens(centers, vectors, mads, - isNucleicPolymer ? 0f : -0.5f); + isNucleic ? 0f : -0.5f); render2Strand(monomerCount, monomers, mads, colixes, ribbonTopScreens, ribbonBottomScreens); viewer.freeTempScreens(ribbonTopScreens); @@ -112,7 +117,7 @@ colix = monomer.getLeadAtom().colixAtom; //change false -> true to fill in mesh - g3d.drawHermite(true, colix, isNucleicPolymer ? 4 : 7, + g3d.drawHermite(true, colix, isNucleic ? 4 : 7, ribbonTopScreens[iPrev], ribbonTopScreens[i], ribbonTopScreens[iNext], ribbonTopScreens[iNext2], ribbonBottomScreens[iPrev], ribbonBottomScreens[i], |