From: <ha...@us...> - 2013-08-22 05:33:43
|
Revision: 18616 http://sourceforge.net/p/jmol/code/18616 Author: hansonr Date: 2013-08-22 05:33:40 +0000 (Thu, 22 Aug 2013) Log Message: ----------- NMRCalculation simplification of code Modified Paths: -------------- branches/v13_2/Jmol/src/org/jmol/api/JmolNMRInterface.java branches/v13_2/Jmol/src/org/jmol/modelset/Measurement.java branches/v13_2/Jmol/src/org/jmol/quantum/NMRCalculation.java branches/v13_2/Jmol/src/org/jmol/util/Tensor.java Modified: branches/v13_2/Jmol/src/org/jmol/api/JmolNMRInterface.java =================================================================== --- branches/v13_2/Jmol/src/org/jmol/api/JmolNMRInterface.java 2013-08-22 05:32:34 UTC (rev 18615) +++ branches/v13_2/Jmol/src/org/jmol/api/JmolNMRInterface.java 2013-08-22 05:33:40 UTC (rev 18616) @@ -28,13 +28,14 @@ * If t is null, then a1, a2, and type are used to find the appropriate * tensor. * + * @param isIso * @param a1 * @param a2 * @param type * @param t * @return 0 if not found */ - public float getJCouplingHz(Atom a1, Atom a2, String type, Tensor t); + public float getIsoOrAnisoHz(boolean isIso, Atom a1, Atom a2, String type, Tensor t); /** * Modified: branches/v13_2/Jmol/src/org/jmol/modelset/Measurement.java =================================================================== --- branches/v13_2/Jmol/src/org/jmol/modelset/Measurement.java 2013-08-22 05:32:34 UTC (rev 18615) +++ branches/v13_2/Jmol/src/org/jmol/modelset/Measurement.java 2013-08-22 05:33:40 UTC (rev 18616) @@ -313,7 +313,7 @@ / (a1.getVanderwaalsRadiusFloat(viewer, EnumVdw.AUTO) + a2.getVanderwaalsRadiusFloat(viewer, EnumVdw.AUTO)) : isDC ? viewer.getNMRCalculation().getDipolarConstantHz(a1, a2) - : viewer.getNMRCalculation().getJCouplingHz(a1, a2, units, + : viewer.getNMRCalculation().getIsoOrAnisoHz(true, a1, a2, units, null)); isValid = !Float.isNaN(dist); if (isPercent) Modified: branches/v13_2/Jmol/src/org/jmol/quantum/NMRCalculation.java =================================================================== --- branches/v13_2/Jmol/src/org/jmol/quantum/NMRCalculation.java 2013-08-22 05:32:34 UTC (rev 18615) +++ branches/v13_2/Jmol/src/org/jmol/quantum/NMRCalculation.java 2013-08-22 05:33:40 UTC (rev 18616) @@ -196,6 +196,10 @@ } public float getJCouplingHz(Atom a1, Atom a2, String type, Tensor isc) { + return getIsoOrAnisoHz(true, a1, a2, type, isc); + } + + public float getIsoOrAnisoHz(boolean isIso, Atom a1, Atom a2, String type, Tensor isc) { if (isc == null) { type = getISCtype(a1, type); if (type == null || a1.modelIndex != a2.modelIndex) @@ -212,7 +216,7 @@ a2 = viewer.modelSet.atoms[isc.atomIndex2]; } return (float) (getIsotopeData(a1, MAGNETOGYRIC_RATIO) - * getIsotopeData(a2, MAGNETOGYRIC_RATIO) * isc.getIso() * J_FACTOR); + * getIsotopeData(a2, MAGNETOGYRIC_RATIO) * (isIso ? isc.isotropy() : isc.anisotropy()) * J_FACTOR); } @SuppressWarnings("unchecked") @@ -366,7 +370,7 @@ public float getMagneticShielding(Atom atom) { Tensor t = viewer.modelSet.getAtomTensor(atom.index, "ms"); - return (t == null ? Float.NaN : t.getIso()); + return (t == null ? Float.NaN : t.isotropy()); } private Map<String, Float> shiftRefsPPM = new Hashtable<String, Float>(); @@ -393,6 +397,7 @@ BS bs) { if ("".equals(tensorType)) tensorType = null; + infoType = (infoType == null ? ";all." : ";" + infoType + "."); JmolList<Object> data = new JmolList<Object>(); JmolList<Object> list1; if (";dc.".equals(infoType)) { @@ -411,6 +416,7 @@ } if (tensorType == null || tensorType.startsWith("isc")) { boolean isJ = infoType.equals(";j."); + boolean isEta = infoType.equals(";eta."); JmolList<Tensor> list = getInteractionTensorList(tensorType, bs); int n = (list == null ? 0 : list.size()); for (int i = 0; i < n; i++) { @@ -418,8 +424,8 @@ list1 = new JmolList<Object>(); list1.addLast(Integer.valueOf(t.atomIndex1)); list1.addLast(Integer.valueOf(t.atomIndex2)); - list1.addLast(isJ ? Float.valueOf(getJCouplingHz(null, null, null, t)) - : t.getInfo(infoType)); + list1.addLast(isEta || isJ ? Float.valueOf(getIsoOrAnisoHz(isJ, null, + null, null, t)) : t.getInfo(infoType)); data.addLast(list1); } if (tensorType != null) Modified: branches/v13_2/Jmol/src/org/jmol/util/Tensor.java =================================================================== --- branches/v13_2/Jmol/src/org/jmol/util/Tensor.java 2013-08-22 05:32:34 UTC (rev 18615) +++ branches/v13_2/Jmol/src/org/jmol/util/Tensor.java 2013-08-22 05:33:40 UTC (rev 18616) @@ -116,6 +116,8 @@ public int modelIndex; public int atomIndex1 = -1; public int atomIndex2 = -1; + public boolean isModulated; + public boolean isUnmodulated; private static final String infoList = ";............." + ";eigenvalues.." + ";eigenvectors." @@ -123,7 +125,8 @@ + ";isotropy....." + ";anisotropy..." + ";asymmetry...." + ";eulerzyz....." + ";eulerzxz....." + ";quaternion..." + ";indices......" + ";string......." + ";type........." - + ";id..........."; + + ";id..........." + ";span........." + ";skew........."; + /** * returns an object of the specified type, including "eigenvalues", * "eigenvectors", "asymmetric", "symmetric", "trace", "indices", and "type" @@ -165,7 +168,7 @@ for (int j = 0; j < 3; j++) a[pt++] = (float) asymMatrix[i][j]; return Matrix3f.newA(a); - case 4: + case 4: if (symMatrix == null) return null; float[] b = new float[9]; @@ -174,16 +177,16 @@ for (int j = 0; j < 3; j++) b[p2++] = (float) symMatrix[i][j]; return Matrix3f.newA(b); - case 5: + case 5: // value return Float.valueOf(eigenValues[2]); case 6: // isotropy - return Float.valueOf(getIso()); + return Float.valueOf(isotropy()); case 7: // anisotropy // Anisotropy, defined as Vzz-(Vxx+Vyy)/2 - return Float.valueOf(getAnisotropy()); + return Float.valueOf(anisotropy()); case 8: // asymmetry // Asymmetry, defined as (Vyy-Vxx)/(Vzz - Viso) - return Float.valueOf(getAsymmetry()); + return Float.valueOf(asymmetry()); case 9: // eulerzyz @@ -204,22 +207,127 @@ case 15: return id; + + case 16: + return Float.valueOf(span()); + case 17: + return Float.valueOf(skew()); + } } - public float getIso() { + // isotropy = (e2 + e1 + e0)/3 + // + // | | | + // | | | + // e2 e1 e0 + // | + // iso + + /** + * isotropy = average of eigenvalues + * + * @return isotropy + */ + public float isotropy() { return (eigenValues[0] + eigenValues[1] + eigenValues[2]) / 3; } - public float getAnisotropy() { + // span = |e2 - e0| + // + // | | | + // | | | + // e2 e1 e0 + // |---------------------------| + // span + // + + /** + * width of the signal; |e2 - e0| + * + * @return unitless; >= 0 + */ + public float span() { + return Math.abs(eigenValues[2] - eigenValues[0]); + } + + // skew = 3 (e1 - iso) / span + // + // | | | + // | iso | | + // e2 | e1 e0 + // e1 - iso |-> + // + // |---------------------------| + // span + // + // or 0 if 0/0 + + /** + * a measure of asymmetry. + * + * @return range [-1, 1] + */ + public float skew() { + return (span() == 0 ? 0 : 3 * (eigenValues[1] - isotropy()) / span()); + } + + + // anistropy = e2 - (e1 + e0)/2 + // + // | | | + // | | | + // e2 e1 e0 + // <----------------------| + // anisotropy + + /** + * anisotropy = directed distance from (center of two closest) to (the furthest) + * @return unitless number + */ + public float anisotropy() { return eigenValues[2] - (eigenValues[0] + eigenValues[1]) / 2; } - public float getAsymmetry() { - return eigenValues[0] == eigenValues[2] ? 0 : (eigenValues[1] - eigenValues[0]) - / (eigenValues[2] - getIso()); + // reduced anisotropy = e2 - iso = anisotropy * 2/3 + // + // | | | + // | | | + // e2 iso e1 e0 + // <----------------------| + // anisotropy + // <--------------| + // reduced anisotropy + + /** + * reduced anisotropy = largest difference from isotropy + * (may be negative) + * + * @return unitless number + * + */ + public float reducedAnisotropy() { + return anisotropy() * 2 / 3; // = eigenValues[2]-iso(); } + // asymmetry = (e1 - e0)/(e2 - iso) + // + // | | | + // | | | + // e2 iso e1 e0 + // <--------------| <--------| + // (e2 - iso) (e1 - e0) + // or 0 when 0/0 + + /** + * asymmetry = deviation from a symmetric tensor + * + * @return range [0,1] + */ + public float asymmetry() { + return span() == 0 ? 0 : (eigenValues[1] - eigenValues[0]) / reducedAnisotropy(); + } + public static Tensor copyTensor(Tensor t0) { Tensor t = new Tensor(); t.setType(t0.type); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |