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

Reply via email to