Revision: 18360 http://sourceforge.net/p/jmol/code/18360 Author: hansonr Date: 2013-06-26 09:06:29 +0000 (Wed, 26 Jun 2013) Log Message: ----------- ___JmolVersion="13.1.17_dev_2013.06.25"
code: MagRes/CASTEP reader upgrades Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java trunk/Jmol/src/org/jmol/adapter/readers/xtal/MagResReader.java trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java trunk/Jmol/src/org/jmol/renderspecial/EllipsoidsRenderer.java trunk/Jmol/src/org/jmol/script/T.java trunk/Jmol/src/org/jmol/util/Eigen.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/StateManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-06-25 01:43:16 UTC (rev 18359) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CastepReader.java 2013-06-26 09:06:29 UTC (rev 18360) @@ -88,7 +88,6 @@ private boolean isPhonon; private boolean isOutput; private boolean isCell; - private boolean isDispersion; private float a, b, c, alpha, beta, gamma; private V3[] abc = new V3[3]; @@ -241,9 +240,7 @@ protected boolean checkLine() throws Exception { // only for .phonon, castep output, or other BEGIN HEADER type files if (isOutput) { - if (line.contains("DFT+D: Semi-empirical")){ - isDispersion = true; - } else if (line.contains("Real Lattice(A)")) { + if (line.contains("Real Lattice(A)")) { readOutputUnitCell(); } else if (line.contains("Fractional coordinates of atoms")) { if (doGetModel(++modelNumber, null)) { @@ -255,8 +252,12 @@ readOutputCharges(); } else if (doProcessLines && line.contains("Born Effective Charges")) { readOutputBornChargeTensors(); - } else if (line.contains("Final energy")) { - readEnergy(); + } else if (line.contains("Final energy ")) { // not "Final energy, E" + readEnergy(3); + } else if (line.contains("Dispersion corrected final energy*")) { + readEnergy(5); + } else if (line.contains("Total energy corrected")) { + readEnergy(8); } return true; } @@ -290,7 +291,6 @@ private void readOutputUnitCell() throws Exception { applySymmetryAndSetTrajectory(); - //atomSetCollection.newAtomSet(); setFractionalCoordinates(true); abc = read3Vectors(false); setLatticeVectors(); @@ -318,21 +318,16 @@ } - private void readEnergy() throws Exception { + private void readEnergy(int pt) throws Exception { tokens = getTokens(); - Double energy; - - if (!isDispersion) { - energy = Double.valueOf(Double.parseDouble(tokens[3])); - } else { - discardLinesUntilContains("Dispersion corrected final energy*"); - tokens = getTokens(); - energy = Double.valueOf(Double.parseDouble(tokens[5])); + try { + Double energy = Double.valueOf(Double.parseDouble(tokens[pt])); + atomSetCollection.setAtomSetName("Energy = " + energy + " eV"); + atomSetCollection.setAtomSetEnergy("" + energy, energy.floatValue()); + atomSetCollection.setAtomSetAuxiliaryInfo("Energy", energy); + } catch (Exception e) { + appendLoadNote("CASTEP Energy could not be read: " + line); } - - atomSetCollection.setAtomSetName("Energy = " + energy + " eV"); - atomSetCollection.setAtomSetEnergy("" + energy, energy.floatValue()); - atomSetCollection.setAtomSetAuxiliaryInfo("Energy", energy); /* is better to do this also here in case the output is only a @@ -340,7 +335,7 @@ both volume and geometry */ applySymmetryAndSetTrajectory(); - atomSetCollection.newAtomSet(); + atomSetCollection.newAtomSetClear(false); setLatticeVectors(); } @@ -348,7 +343,7 @@ isTrajectory = (desiredVibrationNumber <= 0); doApplySymmetry = true; while (line != null && line.contains("<-- E")) { - atomSetCollection.newAtomSet(); + atomSetCollection.newAtomSetClear(false); discardLinesUntilContains("<-- h"); setSpaceGroupName("P1"); abc = read3Vectors(true); @@ -547,6 +542,7 @@ if (readLine().indexOf("--------") < 0) return; Atom[] atoms = atomSetCollection.getAtoms(); + appendLoadNote("Ellipsoids: Born Charge Tensors"); while (readLine().indexOf('=') < 0) getOutputEllipsoid(atoms[readOutputAtomIndex()], line.substring(12)); } @@ -554,7 +550,8 @@ private int readOutputAtomIndex() { tokens = getTokensStr(line); - return atomSetCollection.getAtomIndexFromName(tokens[0] + tokens[1]); + String name = tokens[0] + tokens[1]; + return atomSetCollection.getAtomIndexFromName(name); } private void getOutputEllipsoid(Atom atom, String line0) throws Exception { Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/MagResReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/MagResReader.java 2013-06-25 01:43:16 UTC (rev 18359) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/MagResReader.java 2013-06-26 09:06:29 UTC (rev 18360) @@ -12,6 +12,10 @@ * @version 1.0 */ +import java.util.Hashtable; +import java.util.Map; + +import org.jmol.util.Quadric; import org.jmol.util.TextFormat; import org.jmol.adapter.smarter.AtomSetCollectionReader; @@ -22,6 +26,9 @@ private float[] cellParams; private float maxIso = 10000; + private String tensorTypes = ""; + private boolean isNew; + private Map<String, String> mapUnits = new Hashtable<String, String>(); @Override protected void initializeReader() { @@ -31,21 +38,95 @@ } @Override + protected void finalizeReader() throws Exception { + doApplySymmetry = true; + finalizeReaderASCR(); + } + + @Override protected boolean checkLine() throws Exception { - if (line.startsWith("lattice")) { + if (!isNew && line.indexOf("<calculation>") >= 0) { + isNew = true; + ignoreFileSpaceGroupName = true; + //setSpaceGroupName("P1"); + } + if (cellParams == null && line.startsWith("lattice")) { readCellParams(); - } else if (line.contains("Coordinates")) { - readAtom(); - } else if (line.contains("J-coupling Total") || line.contains("TOTAL tensor")) { - readTensor(); + return true; } + if (isNew) { + if (line.startsWith("units")) { + setUnitsNew(); + } else if (line.startsWith("atom")) { + readAtom(true); + atom.ellipsoid = new Quadric[2]; + } else if (line.startsWith("symmetry")) { + readSymmetryNew(); + } else if (line.startsWith("ms")) { + readTensorNew(0); + } else if (line.startsWith("efg")) { + readTensorNew(1); + } else if (line.startsWith("<magres_old>")) { + continuing = false; + } + return true; + } + if (line.contains("Coordinates")) { + readAtom(false); + } else if (line.contains("J-coupling Total") + || line.contains("TOTAL tensor")) { + readTensorOld(); + } return true; } + // 0 ms H 1 1.9115355485265077E+01 -6.8441521786256319E+00 1.9869475943756368E-01 -7.4231606832789883E+00 3.5078237789073569E+01 1.6453141184608533E+00 -8.4492087560280138E-01 1.4000600350356041E+00 1.7999188282948701E+01 + // 1 efg H 1 -9.7305664267778647E-02 -1.3880930041098827E-01 8.3161631703720738E-03 -1.3880930041098827E-01 2.5187188360357782E-01 -4.4856574290225361E-02 8.3161631703720738E-03 -4.4856574290225361E-02 -1.5456621933580317E-01 + private void readTensorNew(int iType) throws Exception { + float[] data = new float[9]; + String[] tokens = getTokens(); + String atomName = (tokens[1] + tokens[2]); + fillFloatArray(line.substring(30), 0, data); + float f = (iType == 0 ? 0.04f : 1f); + // if (isJ) { + // discardLinesUntilContains("Isotropic"); + // float iso = parseFloatStr(getTokens()[3]); + // if (Math.abs(iso) > maxIso) + // return; + // f = 0.04f; + // } + double[][] a = new double[3][3]; + for (int i = 0, pt = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + a[i][j] = data[pt++]; + atom = atomSetCollection.getAtoms()[atomSetCollection.getAtomIndexFromName(atomName)]; + atom.ellipsoid[iType] = Eigen.getEllipsoidDD(a); + atom.ellipsoid[iType].scale(f); + if (tensorTypes.indexOf("" + iType) < 0) { + tensorTypes += "" + iType; + appendLoadNote("Ellipsoids set " + (iType + 1) + ": " + + (iType == 0 ? "Magnetic Shielding" : "Electric Field Gradient")); + } + } + + // symmetry x,y,z + // symmetry x+1/2,-y+1/2,-z + // symmetry -x,y+1/2,-z+1/2 + // symmetry -x+1/2,-y,z+1/2 + + private void readSymmetryNew() { + setSymmetryOperator(getTokens()[1]); + } + + private void setUnitsNew() { + String[] tokens = getTokens(); + mapUnits.put(tokens[1], tokens[2]); + } + private void readCellParams() throws Exception { String[] tokens = getTokens(); - cellParams = new float[9]; + cellParams = new float[9]; for (int i = 0; i < 9; i++) cellParams[i] = parseFloatStr(tokens[i + 1]) * ANGSTROMS_PER_BOHR; addPrimitiveLatticeVector(0, cellParams, 0); @@ -59,15 +140,21 @@ */ private Atom atom; - private void readAtom() throws Exception { - float f = line.trim().endsWith("A") ? 1 : ANGSTROMS_PER_BOHR; + + private void readAtom(boolean isNew) { + float f = ((isNew ? mapUnits.get("atom").startsWith("A") : line.trim() + .endsWith("A")) ? 1 : ANGSTROMS_PER_BOHR); + int pt = (isNew ? 2 : 0); String[] tokens = getTokens(); - atom = atomSetCollection.addNewAtom(); - atom.elementSymbol = tokens[0]; - atom.atomName = tokens[0] + tokens[1]; - float x = parseFloatStr(tokens[3]) * f; - float y = parseFloatStr(tokens[4]) * f; - float z = parseFloatStr(tokens[5]) * f; + atom = new Atom(); + atom.elementSymbol = tokens[pt]; + atom.atomName = tokens[pt++] + tokens[pt++]; + atomSetCollection.addAtomWithMappedName(atom); + if (!isNew) + pt++; + float x = parseFloatStr(tokens[pt++]) * f; + float y = parseFloatStr(tokens[pt++]) * f; + float z = parseFloatStr(tokens[pt++]) * f; atom.set(x, y, z); setAtomCoord(atom); } @@ -82,19 +169,25 @@ W 1 Eigenvalue sigma_zz -432981.4974 W 1 Eigenvector sigma_zz 0.0000 0.0000 1.0000 -TOTAL tensor + TOTAL tensor -0.0216 -0.1561 -0.0137 -0.1561 -0.1236 -0.0359 -0.0137 -0.0359 0.1452 */ - private void readTensor() throws Exception { + private void readTensorOld() throws Exception { + line = line.trim(); + if (tensorTypes.indexOf(line) < 0) { + tensorTypes += line; + appendLoadNote("Ellipsoids: " + line); + } + atomSetCollection.setAtomSetName(line); boolean isJ = (line.indexOf("J-") >= 0); - atomSetCollection.setAtomSetName(line.trim()); float[] data = new float[9]; readLine(); - String s = TextFormat.simpleReplace(readLine() + readLine() + readLine(), "-", " -"); + String s = TextFormat.simpleReplace(readLine() + readLine() + readLine(), + "-", " -"); fillFloatArray(s, 0, data); float f = 3; if (isJ) { @@ -107,7 +200,7 @@ double[][] a = new double[3][3]; for (int i = 0, pt = 0; i < 3; i++) for (int j = 0; j < 3; j++) - a[i][j] = data[pt++]; + a[i][j] = data[pt++]; atom.setEllipsoid(Eigen.getEllipsoidDD(a)); atom.ellipsoid[0].scale(f); } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java 2013-06-25 01:43:16 UTC (rev 18359) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java 2013-06-26 09:06:29 UTC (rev 18360) @@ -56,8 +56,6 @@ public void setEllipsoid(Quadric e) { if (e == null) return; - //if (atomIndex < 5) - //System.out.println("Atom: ellipsoid " + e); if (ellipsoid != null && ellipsoid.length == 3) ellipsoid[0] = e; else Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java 2013-06-25 01:43:16 UTC (rev 18359) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java 2013-06-26 09:06:29 UTC (rev 18360) @@ -1469,14 +1469,16 @@ //TODO: need to clone bonds } - Map<Object, Integer> atomSymbolicMap = new Hashtable<Object, Integer>(); + private Map<Object, Integer> atomSymbolicMap = new Hashtable<Object, Integer>(); private void mapMostRecentAtomName() { if (atomCount > 0) { int index = atomCount - 1; String atomName = atoms[index].atomName; - if (atomName != null) + if (atomName != null) { atomSymbolicMap.put(atomName, Integer.valueOf(index)); + System.out.println(this + " " + atomName); + } } } @@ -1509,27 +1511,19 @@ haveMappedSerials = true; } - void mapAtomName(String atomName, int atomIndex) { - atomSymbolicMap.put(atomName, Integer.valueOf(atomIndex)); - } - public int getAtomIndexFromName(String atomName) { - //for new Bond -- inconsistent with mmCIF altLoc - int index = -1; - Object value = atomSymbolicMap.get(atomName); - if (value != null) - index = ((Integer)value).intValue(); - return index; + return getMapIndex(atomName); } public int getAtomIndexFromSerial(int serialNumber) { - int index = -1; - Object value = atomSymbolicMap.get(Integer.valueOf(serialNumber)); - if (value != null) - index = ((Integer)value).intValue(); - return index; + return getMapIndex(Integer.valueOf(serialNumber)); } + private int getMapIndex(Object nameOrNum) { + Integer value = atomSymbolicMap.get(nameOrNum); + return (value == null ? -1 : value.intValue()); + } + public void setAtomSetCollectionAuxiliaryInfo(String key, Object value) { if (value == null) atomSetCollectionAuxiliaryInfo.remove(key); @@ -1647,6 +1641,11 @@ } public void newAtomSet() { + newAtomSetClear(true); + } + + public void newAtomSetClear(boolean doClearMap) { + if (!allowMultiple && currentAtomSetIndex >= 0) discardPreviousAtoms(); bondIndex0 = bondCount; @@ -1669,7 +1668,8 @@ } else { atomSetNumbers[currentAtomSetIndex] = atomSetCount; } - atomSymbolicMap.clear(); + if (doClearMap) + atomSymbolicMap.clear(); setAtomSetAuxiliaryInfo("title", collectionName); } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2013-06-25 01:43:16 UTC (rev 18359) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2013-06-26 09:06:29 UTC (rev 18360) @@ -723,7 +723,7 @@ {"ZMatrix", "#ZMATRIX"}; private final static String[] magResFileStartRecords = - {"MagRes", "# magres"}; + {"MagRes", "# magres", "#$magres"}; private final static String[] pymolStartRecords = {"PyMOL", "}q" }; Modified: trunk/Jmol/src/org/jmol/renderspecial/EllipsoidsRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/renderspecial/EllipsoidsRenderer.java 2013-06-25 01:43:16 UTC (rev 18359) +++ trunk/Jmol/src/org/jmol/renderspecial/EllipsoidsRenderer.java 2013-06-26 09:06:29 UTC (rev 18360) @@ -331,7 +331,7 @@ private void fillConeScreen(P3i p1, P3i p2, boolean isPositive) { if (diameter == 0) return; - float diam = (diameter == 0 ? 1 : diameter) * 4; + float diam = (diameter == 0 ? 1 : diameter) * 8; v1.set(p2.x - p1.x, p2.y - p1.y, p2.z - p1.z); v1.normalize(); v1.scale(diam); Modified: trunk/Jmol/src/org/jmol/script/T.java =================================================================== --- trunk/Jmol/src/org/jmol/script/T.java 2013-06-25 01:43:16 UTC (rev 18359) +++ trunk/Jmol/src/org/jmol/script/T.java 2013-06-26 09:06:29 UTC (rev 18360) @@ -2382,6 +2382,7 @@ "justifyMeasurements", T.t(justifymeasurements), "languageTranslation", T.t(languagetranslation), "legacyAutoBonding", T.t(legacyautobonding), + "legacyHAddtion", T.t(legacyhaddition), "logCommands", T.t(logcommands), "logGestures", T.t(loggestures), "measureAllModels", T.t(measureallmodels), Modified: trunk/Jmol/src/org/jmol/util/Eigen.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Eigen.java 2013-06-25 01:43:16 UTC (rev 18359) +++ trunk/Jmol/src/org/jmol/util/Eigen.java 2013-06-26 09:06:29 UTC (rev 18360) @@ -1073,15 +1073,15 @@ n.setT(evec[i]); m.transform(n); cross.cross(n, evec[i]); - Logger.info("v[i], n, n x v[i]"+ evec[i] + " " + n + " " + cross); + //Logger.info("v[i], n, n x v[i]"+ evec[i] + " " + n + " " + cross); n.setT(evec[i]); n.normalize(); cross.cross(evec[i], evec[(i + 1)%3]); - Logger.info("draw id eigv" + i + " " + Escape.eP(evec[i]) + " color " + (i == 0 ? "red": i == 1 ? "green" : "blue") + " # " + n + " " + cross); + //Logger.info("draw id eigv" + i + " " + Escape.eP(evec[i]) + " color " + (i == 0 ? "red": i == 1 ? "green" : "blue") + " # " + n + " " + cross); } - Logger.info("eigVl (" + eigen.d[0] + " + " + eigen.e[0] - + "I) (" + eigen.d[1] + " + " + eigen.e[1] - + "I) (" + eigen.d[2] + " + " + eigen.e[2] + "I)"); + Logger.info("eigVal+vec (" + eigen.d[0] + " + " + eigen.e[0] + + ")\n (" + eigen.d[1] + " + " + eigen.e[1] + + ")\n (" + eigen.d[2] + " + " + eigen.e[2] + ")"); V3[] unitVectors = new V3[3]; float[] lengths = new float[3]; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2013-06-25 01:43:16 UTC (rev 18359) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2013-06-26 09:06:29 UTC (rev 18360) @@ -11,6 +11,7 @@ ___JmolVersion="13.1.17_dev_2013.06.25" +code: MagRes/CASTEP reader upgrades bug fix: PyMOL movie start frame bug fix: PyMOL putty broken bug fix: pdbAddHydrogens may miss O3' or O5' H atoms at end of DNA strands Modified: trunk/Jmol/src/org/jmol/viewer/StateManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StateManager.java 2013-06-25 01:43:16 UTC (rev 18359) +++ trunk/Jmol/src/org/jmol/viewer/StateManager.java 2013-06-26 09:06:29 UTC (rev 18360) @@ -853,7 +853,7 @@ //setParameterValue("edsUrlOptions", edsUrlOptions); setS("edsUrlCutoff", edsUrlCutoff); setB("ellipsoidArcs", ellipsoidArcs); - setB("ellipsoidArrrow", ellipsoidArrows); + setB("ellipsoidArrows", ellipsoidArrows); setB("ellipsoidAxes", ellipsoidAxes); setF("ellipsoidAxisDiameter", ellipsoidAxisDiameter); setB("ellipsoidBall", ellipsoidBall); Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2013-06-25 01:43:16 UTC (rev 18359) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2013-06-26 09:06:29 UTC (rev 18360) @@ -6490,6 +6490,11 @@ private void setBooleanPropertyTok(String key, int tok, boolean value) { boolean doRepaint = true; switch (tok) { + case T.ellipsoidarrows: + // 13.1.17 TRUE for little points on ellipsoids showing sign of + // eigenvalues (in --> negative; out --> positive) + global.ellipsoidArrows = value; + break; case T.translucent: // 13.1.17 false -> translucent objects are opaque among themselves (Pymol transparency_mode 2) global.translucent = value; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ This SF.net email is sponsored by Windows: Build for Windows Store. http://p.sf.net/sfu/windows-dev2dev _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits