From: Michael T H. <mic...@us...> - 2003-11-03 15:33:39
|
Update of /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/protein In directory sc8-pr-cvs1:/tmp/cvs-serv26250/src/org/openscience/jmol/viewer/protein Modified Files: Helix.java PdbChain.java PdbResidue.java PdbStructure.java Sheet.java Log Message: more work on cartoon Index: Helix.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/protein/Helix.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Helix.java 2 Nov 2003 21:42:26 -0000 1.1 +++ Helix.java 3 Nov 2003 15:33:36 -0000 1.2 @@ -33,9 +33,106 @@ Helix(PdbChain chain, int residueStart, int residueEnd) { super(chain, JmolConstants.SECONDARY_STRUCTURE_HELIX, residueStart, residueEnd); + } + + // copied from sheet -- not correct + void calcAxis() { + if (axisA != null) + return; + chain.getResidueMidPoint(residueStart + 1, axisA = new Point3f()); + chain.getResidueMidPoint(residueEnd, axisB = new Point3f()); + + axisUnitVector = new Vector3f(axisB); + axisUnitVector.sub(axisA); + axisUnitVector.normalize(); + + Point3f temp = new Point3f(); + float dist; + + chain.getResidueMidPoint(residueStart, temp = new Point3f()); + dist = axisB.distance(temp); + axisA.set(axisUnitVector); + axisA.scaleAdd(-dist, axisB); + + chain.getResidueMidPoint(residueEnd + 1, temp); + dist = axisA.distance(temp); + axisB.set(axisUnitVector); + axisB.scaleAdd(dist, axisA); + } + + + void calcAxisFoo() { + if (axisA != null) + return; calcCenter(); - calcAxis(); - calcSegments(); + Point3f[] points = new Point3f[count]; + float[] lengths = new float[count]; + for (int i = count; --i >= 0; ) { + Point3f point = new Point3f(chain.getResiduePoint(i + residueStart)); + point.sub(center); + points[i] = point; + lengths[i] = length(point); + } + calcSums(count, points, lengths); + calcDirectionCosines(); + Point3f point; + float length; + point = points[0]; + length = lengths[0]; + // axisA = new Point3f(length * cosineX, length * cosineY, length * cosineZ); + axisA = center; + point = points[count - 1]; + length = lengths[count - 1]; + axisB = new Point3f(length * cosineX, length * cosineY, length * cosineZ); + axisB.add(center); + } + + /**************************************************************** + * see: + * Defining the Axis of a Helix + * Peter C Kahn + * Computers Chem. Vol 13, No 3, pp 185-189, 1989 + * + * Simple Methods for Computing the Least Squares Line + * in Three Dimensions + * Peter C Kahn + * Computers Chem. Vol 13, No 3, pp 191-195, 1989 + ****************************************************************/ + + void calcCenter() { + if (center == null) { + center = new Point3f(chain.getResiduePoint(residueEnd)); + for (int i = residueStart; i < residueEnd; ++i) + center.add(chain.getResiduePoint(i)); + center.scale(1f/count); + System.out.println("structure center is at :" + center); + } + } + + static float length(Point3f point) { + return + (float)Math.sqrt(point.x*point.x + point.y*point.y + point.z*point.z); + } + + float sumXiLi, sumYiLi, sumZiLi; + void calcSums(int count, Point3f[] points, float[] lengths) { + sumXiLi = sumYiLi = sumZiLi = 0; + for (int i = count; --i >= 0; ) { + Point3f point = points[i]; + float length = lengths[i]; + sumXiLi += point.x * length; + sumYiLi += point.y * length; + sumZiLi += point.z * length; + } + } + + float cosineX, cosineY, cosineZ; + void calcDirectionCosines() { + float denominator = + (float)Math.sqrt(sumXiLi*sumXiLi + sumYiLi*sumYiLi + sumZiLi*sumZiLi); + cosineX = sumXiLi / denominator; + cosineY = sumYiLi / denominator; + cosineZ = sumZiLi / denominator; } } Index: PdbChain.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/protein/PdbChain.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- PdbChain.java 2 Nov 2003 21:40:59 -0000 1.4 +++ PdbChain.java 3 Nov 2003 15:33:36 -0000 1.5 @@ -141,6 +141,19 @@ } } + + void getResidueMidPoint(int residueNumber, Point3f midPoint) { + int residueIndex = residueNumber - firstResidueNumber; + if (residueIndex >= residueCount) { + residueIndex = residueCount - 1; + } else if (residueIndex > 0) { + midPoint.set(residues[residueIndex].getAlphaCarbonPoint()); + midPoint.add(residues[residueIndex-1].getAlphaCarbonPoint()); + midPoint.scale(0.5f); + return; + } + midPoint.set(residues[residueIndex].getAlphaCarbonPoint()); + } /* void propogateSecondaryStructure(byte type, int startResidueNumber, Index: PdbResidue.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/protein/PdbResidue.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- PdbResidue.java 2 Nov 2003 21:40:59 -0000 1.6 +++ PdbResidue.java 3 Nov 2003 15:33:36 -0000 1.7 @@ -27,6 +27,7 @@ import org.openscience.jmol.viewer.*; import org.openscience.jmol.viewer.datamodel.Atom; import java.util.Hashtable; +import javax.vecmath.Point3f; public class PdbResidue { @@ -177,4 +178,7 @@ return getMainchainAtom(3); } + public Point3f getAlphaCarbonPoint() { + return getMainchainAtom(1).point3f; + } } Index: PdbStructure.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/protein/PdbStructure.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- PdbStructure.java 2 Nov 2003 21:42:26 -0000 1.1 +++ PdbStructure.java 3 Nov 2003 15:33:36 -0000 1.2 @@ -36,6 +36,7 @@ int count; Point3f center; Point3f axisA, axisB; + Vector3f axisUnitVector; Point3f[] segments; PdbStructure(PdbChain chain, byte type, int residueStart, int residueEnd) { @@ -46,37 +47,7 @@ this.count = residueEnd - residueStart + 1; } - - - void calcCenter() { - if (center == null) { - center = new Point3f(chain.getResiduePoint(residueEnd)); - for (int i = residueStart; i < residueEnd; ++i) - center.add(chain.getResiduePoint(i)); - center.scale(1f/count); - System.out.println("structure center is at :" + center); - } - } - - static float length(Point3f point) { - return - (float)Math.sqrt(point.x*point.x + point.y*point.y + point.z*point.z); - } - void calcAxis() { - if (axisA != null) - return; - calcCenter(); - Point3f[] points = new Point3f[count]; - float[] lengths = new float[count]; - for (int i = count; --i >= 0; ) { - Point3f point = new Point3f(chain.getResiduePoint(i + residueStart)); - point.sub(center); - points[i] = point; - lengths[i] = length(point); - } - axisA = new Point3f(chain.getResiduePoint(residueStart)); - axisB = new Point3f(chain.getResiduePoint(residueEnd)); } void calcSegments() { @@ -86,10 +57,21 @@ segments = new Point3f[count + 1]; segments[count] = axisB; segments[0] = axisA; - Vector3f delta = new Vector3f(); - delta.sub(axisB, axisA); - for (int i = 1; i < count; ++i) - (segments[i] = new Point3f(delta)).scaleAdd((float)i / count, axisA); + for (int i = 1; i < count; ++i) { + Point3f point = segments[i] = new Point3f(); + chain.getResidueMidPoint(residueStart + i, point); + projectOntoAxis(point); + } + } + + final Vector3f vectorProjection = new Vector3f(); + + void projectOntoAxis(Point3f point) { + // assumes axisA, axisB, and axisUnitVector are set; + vectorProjection.sub(point, axisA); + float projectedLength = vectorProjection.dot(axisUnitVector); + point.set(axisUnitVector); + point.scaleAdd(projectedLength, axisA); } public int getResidueCount() { Index: Sheet.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/protein/Sheet.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Sheet.java 2 Nov 2003 21:42:26 -0000 1.1 +++ Sheet.java 3 Nov 2003 15:33:36 -0000 1.2 @@ -24,12 +24,52 @@ */ package org.openscience.jmol.viewer.protein; import org.openscience.jmol.viewer.JmolConstants; +import javax.vecmath.Point3f; +import javax.vecmath.Vector3f; public class Sheet extends PdbStructure { - Sheet(PdbChain chain, int residueFirst, int residueLast) { + Sheet(PdbChain chain, int residueStart, int residueEnd) { super(chain, JmolConstants.SECONDARY_STRUCTURE_SHEET, - residueFirst, residueLast); + residueStart, residueEnd); } -} + void calcAxis() { + if (axisA != null) + return; + chain.getResidueMidPoint(residueStart + 1, axisA = new Point3f()); + chain.getResidueMidPoint(residueEnd, axisB = new Point3f()); + + axisUnitVector = new Vector3f(); + axisUnitVector.sub(axisB, axisA); + axisUnitVector.normalize(); + + Point3f tempA, tempB; + chain.getResidueMidPoint(residueStart, tempA = new Point3f()); + projectOntoAxis(tempA); + chain.getResidueMidPoint(residueEnd + 1, tempB = new Point3f()); + projectOntoAxis(tempB); + axisA = tempA; + axisB = tempB; + } + /* + + Vector3f vectorT = new Vector3f(); + float projectedLength; + + axisB = new Point3f(); + chain.getResidueMidPoint(residueEnd + 1, axisB); + vectorT.sub(axisB, tempA); + projectedLength = vectorT.dot(axisUnitVector); + axisB.set(axisUnitVector); + axisB.scaleAdd(projectedLength, tempA); + + axisA = new Point3f(); + chain.getResidueMidPoint(residueStart, axisA); + vectorT.sub(axisA, tempB); + projectedLength = vectorT.dot(axisUnitVector); + axisA.set(axisUnitVector); + axisA.scaleAdd(projectedLength, tempB); + + */ +} |