From: <ha...@us...> - 2007-07-24 13:11:47
|
Revision: 8000 http://svn.sourceforge.net/jmol/?rev=8000&view=rev Author: hansonr Date: 2007-07-24 06:11:42 -0700 (Tue, 24 Jul 2007) Log Message: ----------- version=11.2.6 # bug fix: inappropriate draw pick spinning for single point # bug fix: dots not available in multimodel mode # bug fix: multiple isosurface cavities incorrect in a multimodel environment # bug fix: isosurface cavity not filled completely Modified Paths: -------------- trunk/Jmol/src/org/jmol/atomdata/AtomData.java trunk/Jmol/src/org/jmol/atomdata/AtomDataServer.java trunk/Jmol/src/org/jmol/geodesic/EnvelopeCalculation.java trunk/Jmol/src/org/jmol/jvxl/readers/IsoMOReader.java trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java trunk/Jmol/src/org/jmol/modelset/AtomIteratorWithinSet.java trunk/Jmol/src/org/jmol/modelset/ModelManager.java trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/shape/Dots.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/org/jmol/atomdata/AtomData.java =================================================================== --- trunk/Jmol/src/org/jmol/atomdata/AtomData.java 2007-07-24 13:05:55 UTC (rev 7999) +++ trunk/Jmol/src/org/jmol/atomdata/AtomData.java 2007-07-24 13:11:42 UTC (rev 8000) @@ -136,8 +136,9 @@ /// to be filled: - public int firstAtom; + public int firstAtomIndex; public int firstModelIndex; + public int lastModelIndex; // if modelIndex < 0, this gets filled with the model of the first atom // for now we do NOT include indexes to model for each atom, because we do not need them. Modified: trunk/Jmol/src/org/jmol/atomdata/AtomDataServer.java =================================================================== --- trunk/Jmol/src/org/jmol/atomdata/AtomDataServer.java 2007-07-24 13:05:55 UTC (rev 7999) +++ trunk/Jmol/src/org/jmol/atomdata/AtomDataServer.java 2007-07-24 13:11:42 UTC (rev 8000) @@ -7,7 +7,8 @@ public AtomIndexIterator getWithinAtomSetIterator(int atomIndex, float distance, BitSet bsSelected, - boolean isGreaterOnly); + boolean isGreaterOnly, + boolean modelZeroBased); public void fillAtomData(AtomData atomData, int mode); } Modified: trunk/Jmol/src/org/jmol/geodesic/EnvelopeCalculation.java =================================================================== --- trunk/Jmol/src/org/jmol/geodesic/EnvelopeCalculation.java 2007-07-24 13:05:55 UTC (rev 7999) +++ trunk/Jmol/src/org/jmol/geodesic/EnvelopeCalculation.java 2007-07-24 13:11:42 UTC (rev 8000) @@ -151,6 +151,7 @@ private float scale = 1f; private float setRadius = Float.MAX_VALUE; private float addRadius = Float.MAX_VALUE; + private boolean modelZeroBased; private int[][] dotsConvexMaps; public int[][] getDotsConvexMaps() { @@ -222,12 +223,15 @@ float maxRadius, BitSet bsSelected, BitSet bsIgnore, boolean useVanderwaalsRadius, boolean disregardNeighbors, boolean onlySelectedDots, - boolean isSurface) { + boolean isSurface, boolean multiModel) { this.addRadius = (addRadius == Float.MAX_VALUE ? 0 : addRadius); this.setRadius = (setRadius == Float.MAX_VALUE && !useVanderwaalsRadius ? SURFACE_DISTANCE_FOR_CALCULATION : setRadius); this.scale = scale; atomData.useIonic = !useVanderwaalsRadius; + atomData.modelIndex = (multiModel ? -1 : 0); + modelZeroBased = !multiModel; + viewer.fillAtomData(atomData, AtomData.MODE_FILL_COORDS_AND_RADII); atomCount = atomData.atomCount; setRadii(useVanderwaalsRadius); @@ -263,7 +267,7 @@ public Point3f[] getPoints() { if (dotsConvexMaps == null) { calculate(Float.MAX_VALUE, SURFACE_DISTANCE_FOR_CALCULATION, 1f, - Float.MAX_VALUE, bsMySelected, null, false, false, false, false); + Float.MAX_VALUE, bsMySelected, null, false, false, false, false, false); } if (currentPoints != null) return currentPoints; @@ -513,7 +517,7 @@ if (disregardNeighbors) return; AtomIndexIterator iter = viewer.getWithinAtomSetIterator(indexI, radiusI + diameterP - + maxRadius, bsMySelected, false); //true ==> only atom index > this atom accepted + + maxRadius, bsMySelected, false, modelZeroBased); //true ==> only atom index > this atom accepted while (iter.hasNext()) { int indexN = iter.next(); Modified: trunk/Jmol/src/org/jmol/jvxl/readers/IsoMOReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/IsoMOReader.java 2007-07-24 13:05:55 UTC (rev 7999) +++ trunk/Jmol/src/org/jmol/jvxl/readers/IsoMOReader.java 2007-07-24 13:11:42 UTC (rev 8000) @@ -81,7 +81,7 @@ switch (params.qmOrbitalType) { case Parameters.QM_TYPE_GAUSSIAN: q.calculate(volumeData, bsMySelected, (String) moData - .get("calculationType"), atomData.atomXyz, atomData.firstAtom, + .get("calculationType"), atomData.atomXyz, atomData.firstAtomIndex, (Vector) moData.get("shells"), (float[][]) moData.get("gaussians"), (Hashtable) moData.get("atomicOrbitalOrder"), null, null, @@ -89,7 +89,7 @@ break; case Parameters.QM_TYPE_SLATER: q.calculate(volumeData, bsMySelected, (String) moData - .get("calculationType"), atomData.atomXyz, atomData.firstAtom, + .get("calculationType"), atomData.atomXyz, atomData.firstAtomIndex, null, null, null, (int[][]) moData.get("slaterInfo"), (float[][]) moData.get("slaterData"), params.moCoefficients); Modified: trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java 2007-07-24 13:05:55 UTC (rev 7999) +++ trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java 2007-07-24 13:11:42 UTC (rev 8000) @@ -77,16 +77,16 @@ isCavity = (params.isCavity && meshDataServer != null); // Jvxl cannot do this calculation on its own. isPocket = (params.pocket != null && meshDataServer != null); - if (isCavity || isPocket) - meshData.dots = meshDataServer.calculateGeodesicSurface( - params.bsSelected, bsMyIgnored, envelopeRadius); - doCalculateTroughs = (atomDataServer != null && !isCavity // Jvxl needs an atom iterator to do this. && solventRadius > 0 && (dataType == Parameters.SURFACE_SOLVENT || dataType == Parameters.SURFACE_MOLECULAR)); doUseIterator = doCalculateTroughs; modelIndex = params.modelIndex; getAtoms(Float.NaN, false, true); + if (isCavity || isPocket) + meshData.dots = meshDataServer.calculateGeodesicSurface( + bsMySelected, bsMyIgnored, envelopeRadius); + setHeader("solvent/molecular surface", params.calculationType); setRangesAndAddAtoms(params.solvent_ptsPerAngstrom, params.solvent_gridMax, params.thePlane != null ? Integer.MAX_VALUE : Math.min(firstNearbyAtom, 100)); @@ -194,19 +194,49 @@ int nDots = meshData.dots.length; int n = 0; //surface_data = new float[1000]; + + // for (int j = 0; j < nDots; j++) { + // System.out.println("draw pt"+j+" {"+meshData.dots[j].x + " " +meshData.dots[j].y + " " +meshData.dots[j].z + "} " ); + // } + /* + Point3f pt = new Point3f(15.3375f, 1.0224999f, 5.1125f); for (int x = 0; x < nPointsX; ++x) for (int y = 0; y < nPointsY; ++y) { + out: for (int z = 0; z < nPointsZ; ++z, ++i) { + float d = voxelData[x][y][z]; + volumeData.voxelPtToXYZ(x, y, z, ptXyzTemp); + if (d < Float.MAX_VALUE && d >= cavityRadius) + if (ptXyzTemp.distance(pt) < 3f) + System.out.println("draw pt"+(n++)+" {"+ptXyzTemp.x + " " +ptXyzTemp.y + " " +ptXyzTemp.z + "} # " +x + " " + y + " " + z + " " + voxelData[x][y][z]); + if (false && d < Float.MAX_VALUE && + d >= cavityRadius) { + volumeData.voxelPtToXYZ(x, y, z, ptXyzTemp); + if (ptXyzTemp.x > 0 && ptXyzTemp.y > 0 && ptXyzTemp.z > 0) + System.out.println("draw pt"+(n++)+" {"+ptXyzTemp.x + " " +ptXyzTemp.y + " " +ptXyzTemp.z + "} " ); + } + } + } + n = 0; + i = 0; +*/ + float d; + float r2 = envelopeRadius;// - cavityRadius; + + for (int x = 0; x < nPointsX; ++x) + for (int y = 0; y < nPointsY; ++y) { out: for (int z = 0; z < nPointsZ; ++z, ++i) - if (voxelData[x][y][z] < Float.MAX_VALUE - && voxelData[x][y][z] >= cavityRadius) { + if ((d = voxelData[x][y][z]) < Float.MAX_VALUE && + d >= cavityRadius) { volumeData.voxelPtToXYZ(x, y, z, ptXyzTemp); //float dMin = Float.MAX_VALUE; //float d; for (int j = 0; j < nDots; j++) { - if (meshData.dots[j].distance(ptXyzTemp) < envelopeRadius) + if (meshData.dots[j].distance(ptXyzTemp) < r2) continue out; } bs.set(i); + //if (n < 1069) + //System.out.println("draw pt"+n+" {"+ptXyzTemp.x + " " +ptXyzTemp.y + " " +ptXyzTemp.z + "} " ); n++; } } @@ -253,6 +283,7 @@ property[x][y][z] = Float.NaN; } float maxRadius = 0; + float r0 = (isFirstPass && isCavity ? cavityRadius : 0); boolean isWithin = (isFirstPass && distance != Float.MAX_VALUE); for (int iAtom = 0; iAtom < myAtomCount; iAtom++) { ptA = atomXyz[iAtom]; @@ -262,7 +293,7 @@ if (isWithin && ptA.distance(point) > distance + rA + 0.5) continue; boolean isNearby = (iAtom >= firstNearbyAtom); - setGridLimitsForAtom(ptA, rA, pt0, pt1); + setGridLimitsForAtom(ptA, rA + r0, pt0, pt1); volumeData.voxelPtToXYZ(pt0.x, pt0.y, pt0.z, ptXyzTemp); for (int i = pt0.x; i < pt1.x; i++) { ptY0.set(ptXyzTemp); @@ -287,7 +318,7 @@ } if (isCavity && isFirstPass) return; - if (doCalculateTroughs && !isCavity) { + if (doCalculateTroughs) { Point3i ptA0 = new Point3i(); Point3i ptB0 = new Point3i(); Point3i ptA1 = new Point3i(); @@ -301,7 +332,7 @@ continue; setGridLimitsForAtom(ptA, rA - solventRadius, ptA0, ptA1); AtomIndexIterator iter = atomDataServer.getWithinAtomSetIterator(iatomA, rA - + solventRadius + maxRadius, bsMySelected, true); //true ==> only atom index > this atom accepted + + solventRadius + maxRadius, bsMySelected, true, true); //true ==> only atom index > this atom accepted while (iter.hasNext()) { int iatomB = iter.next(); Point3f ptB = atomXyz[myIndex[iatomB]]; Modified: trunk/Jmol/src/org/jmol/modelset/AtomIteratorWithinSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomIteratorWithinSet.java 2007-07-24 13:05:55 UTC (rev 7999) +++ trunk/Jmol/src/org/jmol/modelset/AtomIteratorWithinSet.java 2007-07-24 13:11:42 UTC (rev 8000) @@ -41,13 +41,13 @@ int atomIndex; int zerobase; - void initialize(ModelSet modelSet, Bspf bspf, int bsptIndex, int atomIndex, float distance, BitSet bsSelected, boolean isGreaterOnly) { + void initialize(ModelSet modelSet, Bspf bspf, int bsptIndex, int atomIndex, float distance, BitSet bsSelected, boolean isGreaterOnly, boolean modelZeroBased) { bsptIter = bspf.getSphereIterator(bsptIndex); bsptIter.initialize(modelSet.atoms[atomIndex], distance); this.atomIndex = atomIndex; this.bsSelected = bsSelected; this.isGreaterOnly = isGreaterOnly; - zerobase = modelSet.getFirstAtomIndexInModel(bsptIndex); + zerobase = (modelZeroBased ? modelSet.getFirstAtomIndexInModel(bsptIndex) : 0); } int iNext; Modified: trunk/Jmol/src/org/jmol/modelset/ModelManager.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelManager.java 2007-07-24 13:05:55 UTC (rev 7999) +++ trunk/Jmol/src/org/jmol/modelset/ModelManager.java 2007-07-24 13:11:42 UTC (rev 8000) @@ -1502,8 +1502,13 @@ return modelSet.getWithinModelIterator(atom, distance); } - public AtomIndexIterator getWithinAtomSetIterator(int atomIndex, float distance, BitSet bsSelected, boolean isGreaterOnly) { - return modelSet.getWithinAtomSetIterator(atomIndex, distance, bsSelected, isGreaterOnly); + public AtomIndexIterator getWithinAtomSetIterator(int atomIndex, + float distance, + BitSet bsSelected, + boolean isGreaterOnly, + boolean modelZeroBased) { + return modelSet.getWithinAtomSetIterator(atomIndex, distance, bsSelected, + isGreaterOnly, modelZeroBased); } public void fillAtomData(AtomData atomData, int mode) { Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2007-07-24 13:05:55 UTC (rev 7999) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2007-07-24 13:11:42 UTC (rev 8000) @@ -140,10 +140,10 @@ private final AtomIteratorWithinSet withinAtomSetIterator = new AtomIteratorWithinSet(); - AtomIndexIterator getWithinAtomSetIterator(int atomIndex, float distance, BitSet bsSelected, boolean isGreaterOnly) { + AtomIndexIterator getWithinAtomSetIterator(int atomIndex, float distance, BitSet bsSelected, boolean isGreaterOnly, boolean modelZeroBased) { //EnvelopeCalculation, IsoSolventReader initializeBspf(); - withinAtomSetIterator.initialize(this, bspf, atoms[atomIndex].modelIndex, atomIndex, distance, bsSelected, isGreaterOnly); + withinAtomSetIterator.initialize(this, bspf, atoms[atomIndex].modelIndex, atomIndex, distance, bsSelected, isGreaterOnly, modelZeroBased); return withinAtomSetIterator; } @@ -968,7 +968,7 @@ envelopeRadius = EnvelopeCalculation.SURFACE_DISTANCE_FOR_CALCULATION; EnvelopeCalculation ec = new EnvelopeCalculation(viewer, atomCount, null); ec.calculate(Float.MAX_VALUE, envelopeRadius, 1, Float.MAX_VALUE, - bsSelected, bsIgnore, false, false, false, false); + bsSelected, bsIgnore, false, false, false, false, true); Point3f[] points = ec.getPoints(); surfaceDistanceMax = 0; bsSurface = ec.getBsSurfaceClone(); @@ -1878,10 +1878,10 @@ return; } if(atomData.modelIndex < 0) - atomData.firstAtom = Math.max(0, BitSetUtil.firstSetBit(atomData.bsSelected)); + atomData.firstAtomIndex = Math.max(0, BitSetUtil.firstSetBit(atomData.bsSelected)); else - atomData.firstAtom = getFirstAtomIndexInModel(atomData.modelIndex); - atomData.firstModelIndex = (atomCount == 0 ? 0 : atoms[atomData.firstAtom].modelIndex); + atomData.firstAtomIndex = getFirstAtomIndexInModel(atomData.modelIndex); + atomData.lastModelIndex = atomData.firstModelIndex = (atomCount == 0 ? 0 : atoms[atomData.firstAtomIndex].modelIndex); atomData.modelName = getModelName(-1 - atomData.modelIndex); atomData.atomXyz = atoms; atomData.atomCount = atomCount; @@ -1890,13 +1890,14 @@ if (includeRadii) atomData.atomRadius = new float[atomCount]; for (int i = 0; i < atomCount; i++) { - if (atoms[i].modelIndex != atomData.firstModelIndex) { + if (atomData.modelIndex >= 0 && atoms[i].modelIndex != atomData.firstModelIndex) { if (atomData.bsIgnored == null) atomData.bsIgnored = new BitSet(); atomData.bsIgnored.set(i); continue; } atomData.atomicNumber[i] = atoms[i].getElementNumber(); + atomData.lastModelIndex = atoms[i].modelIndex; if (includeRadii) atomData.atomRadius[i] = (atomData.useIonic ? atoms[i] .getBondingRadiusFloat() : atoms[i].getVanderwaalsRadiusFloat()); Modified: trunk/Jmol/src/org/jmol/shape/Dots.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Dots.java 2007-07-24 13:05:55 UTC (rev 7999) +++ trunk/Jmol/src/org/jmol/shape/Dots.java 2007-07-24 13:11:42 UTC (rev 8000) @@ -231,7 +231,7 @@ ec .calculate(addRadius, setRadius, scale, maxRadius, bsOn, bsIgnore, useVanderwaalsRadius, disregardNeighbors, onlySelectedDots, - isSurface); + isSurface, true); } timeEndExecution = System.currentTimeMillis(); if (Logger.isActiveLevel(Logger.LEVEL_DEBUG)) { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2007-07-24 13:05:55 UTC (rev 7999) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2007-07-24 13:11:42 UTC (rev 8000) @@ -1,5 +1,11 @@ -version=11.3.6_dev +version=11.3.6 +# bug fix: inappropriate draw pick spinning for single point +# bug fix: dots not available in multimodel mode +# bug fix: multiple isosurface cavities incorrect in a multimodel environment +# bug fix: isosurface cavity not filled completely + + # ----------------------------------------------------------------------------- #version=11.3.5 Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2007-07-24 13:05:55 UTC (rev 7999) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2007-07-24 13:11:42 UTC (rev 8000) @@ -1629,9 +1629,10 @@ public AtomIndexIterator getWithinAtomSetIterator(int atomIndex, float distance, BitSet bsSelected, - boolean isGreaterOnly) { + boolean isGreaterOnly, + boolean modelZeroBased) { return modelManager.getWithinAtomSetIterator(atomIndex, distance, - bsSelected, isGreaterOnly); + bsSelected, isGreaterOnly, modelZeroBased); } public void fillAtomData(AtomData atomData, int mode) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |