From: <ha...@us...> - 2017-02-05 22:57:52
|
Revision: 21391 http://sourceforge.net/p/jmol/code/21391 Author: hansonr Date: 2017-02-05 22:57:50 +0000 (Sun, 05 Feb 2017) Log Message: ----------- Final NBO update for today -- more efficient retrieval of NBO resonance structures from .nbo files adds NBOParser class Modified Paths: -------------- trunk/Jmol/src/org/gennbo/NBODialogConfig.java trunk/Jmol/src/org/gennbo/NBODialogModel.java trunk/Jmol/src/org/gennbo/NBODialogRun.java trunk/Jmol/src/org/gennbo/NBODialogSearch.java trunk/Jmol/src/org/gennbo/NBODialogView.java trunk/Jmol/src/org/gennbo/NBOFileHandler.java Modified: trunk/Jmol/src/org/gennbo/NBODialogConfig.java =================================================================== --- trunk/Jmol/src/org/gennbo/NBODialogConfig.java 2017-02-05 13:05:22 UTC (rev 21390) +++ trunk/Jmol/src/org/gennbo/NBODialogConfig.java 2017-02-05 22:57:50 UTC (rev 21391) @@ -324,7 +324,7 @@ @Override public void actionPerformed(ActionEvent e) { showAtNum = !showAtNum; - showAtomNums(false); + setStructure(null); } }); showAtNum = true; @@ -676,43 +676,6 @@ } /** - * label atoms: (number lone pairs)+atomnum - * - * @param alpha - */ - protected void showAtomNums(boolean alpha) { - if (!showAtNum) { - runScriptNow("measurements off;select visible;label off; select none;refresh"); - return; - } - SB sb = new SB(); - sb.append("measurements off;select visible;label %a;"); - - Map<String, String> lonePairs = inputFileHandler.getChooseListMap(alpha, true); - Map<String, String> loneV = inputFileHandler.getChooseListMap(alpha, false); - if (lonePairs != null) { - for (int i = 1; i <= vwr.ms.ac; i++) { - sb.append("select visible && atomno=" + i + ";label "); - String atNum = new Integer(i).toString(); - String lp, lv; - if ((lp = lonePairs.get(atNum)) != null) - if (!lp.equals("0")) - sb.append("<sup>(" + lp + ")</sup>"); - if ((lv = loneV.get(atNum)) != null) - if (!lv.equals("0")) - sb.append("<sub>[" + lv + "]</sub>"); - sb.append("%a;"); - } - } - String color = (nboView) ? "black" : "gray"; - sb.append("select visible;color labels white;" + - "select visible && {H*};color labels " + color + ";" - + "set labeloffset 0 0 {visible}; select none;refresh"); - runScriptNow(sb.toString()); - - } - - /** * Centers the dialog on the screen. * * @param d @@ -983,7 +946,57 @@ } + private String atomTypeLast = "alpha"; + + /** + * label atoms: (number lone pairs)+atomnum + * + * @param type alpha or beta + */ + protected void setStructure(String type) { + setResStruct(type, -1); + } + /** + * Changes bonds and labels on the Jmol model when new resonance structure is selected + * + * @param type + * @param rsNum + * - index of RS in Combo Box + */ + protected void setResStruct(String type, int rsNum) { + if (!showAtNum) { + runScriptNow("measurements off;select visible;label off; select none;refresh"); + return; + } +// boolean atomsOnly = (type == null); + if (type == null) { + type = atomTypeLast; + } else { + atomTypeLast = type; + } + SB sb = new SB(); + sb.append("measurements off;select visible;label %a;"); + String color = (nboView) ? "black" : "gray"; + sb.append("select visible;color labels white;" + + "select visible & _H;color labels " + color + ";" + + "set labeloffset 0 0 {visible}; select none;refresh;"); + String s = inputFileHandler.setStructure(sb, type, rsNum); + if (s == null) { + runScriptNow(sb.toString()); + return; + } + sb.append(s); + if (nboView) { + sb.append("select add {*}.bonds;color bonds lightgrey;" + + "wireframe 0.1;"); + } + sb.append(JMOL_FONT_SCRIPT); + runScriptQueued(sb.toString()); + } + + + } Modified: trunk/Jmol/src/org/gennbo/NBODialogModel.java =================================================================== --- trunk/Jmol/src/org/gennbo/NBODialogModel.java 2017-02-05 13:05:22 UTC (rev 21390) +++ trunk/Jmol/src/org/gennbo/NBODialogModel.java 2017-02-05 22:57:50 UTC (rev 21391) @@ -1163,7 +1163,7 @@ return; } runScriptNow(JMOL_FONT_SCRIPT + ";select within(model,visible);rotate best;"); - showAtomNums(false); + setStructure(null); showComponents(true); innerEditBox.setVisible(true); if (vwr.ms.ac > 0) Modified: trunk/Jmol/src/org/gennbo/NBODialogRun.java =================================================================== --- trunk/Jmol/src/org/gennbo/NBODialogRun.java 2017-02-05 13:05:22 UTC (rev 21390) +++ trunk/Jmol/src/org/gennbo/NBODialogRun.java 2017-02-05 22:57:50 UTC (rev 21391) @@ -38,7 +38,6 @@ import java.io.File; import java.net.URI; import java.util.ArrayList; -import java.util.Hashtable; import java.util.Map; import javajs.util.JSJSONParser; @@ -370,53 +369,6 @@ return tmp.trim(); } - protected void setBonds(boolean alpha) { - try { - SB tmp = inputFileHandler.getChooseListBonds(alpha); - if (tmp == null) - return; - String bonds = tmp.toString(); - if (!bonds.trim().equals("")) { - vwr.ms.deleteAllBonds(); - for (String s : bonds.split("\n")) { - String[] tokens = s.split(":"); - String key = tokens[0]; - String[] atoms = tokens[1].split(" "); - int at1 = Integer.parseInt(atoms[0]); - int at2 = Integer.parseInt(atoms[1]); - int order = 0; - short mag = 250; - switch (key.charAt(0)) { - case 'S': - order = 1; - break; - case 'D': - order = 2; - break; - case 'T': - order = 3; - mag = 150; - break; - case 'Q': - order = 4; - mag = 100; - break; - default: - order = Integer.parseInt(key); - mag = 100; - } - vwr.ms.bondAtoms(vwr.ms.at[at1 - 1], vwr.ms.at[at2 - 1], order, mag, - vwr.ms.bsVisible, 0, true, true); - } - } - if (nboView) { - String s2 = runScriptNow("print {*}.bonds"); - runScriptNow("select " + s2 + ";color bonds lightgrey"); - } - } catch (Exception e) { - System.out.println("Cannot create bonds: " + e.getMessage()); - } - } protected void logJobName(String name) { if (name == null) @@ -472,8 +424,7 @@ if (vwr.ms.ac == 0) return; get47FileData(true); - showAtomNums(true); - setBonds(true); + setStructure("alpha"); addNBOKeylist(); for (Component c : panel.getComponents()) c.setVisible(true); Modified: trunk/Jmol/src/org/gennbo/NBODialogSearch.java =================================================================== --- trunk/Jmol/src/org/gennbo/NBODialogSearch.java 2017-02-05 13:05:22 UTC (rev 21390) +++ trunk/Jmol/src/org/gennbo/NBODialogSearch.java 2017-02-05 22:57:50 UTC (rev 21391) @@ -32,8 +32,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; -import java.util.Hashtable; -import java.util.Map; import javajs.util.PT; import javajs.util.SB; @@ -57,8 +55,6 @@ import javax.swing.JTextPane; import javax.swing.SwingConstants; -import org.gennbo.NBOFileHandler.ChooseList; - abstract class NBODialogSearch extends NBODialogView { private final static int KEYWD_WEBHELP = 0; @@ -428,13 +424,7 @@ } protected void doSetSpin() { - if (alphaSpin.isSelected()) { - setBonds(true); - showAtomNums(true); - } else { - setBonds(false); - showAtomNums(false); - } + setStructure(alphaSpin.isSelected() ? "alpha" : "beta"); switch (searchKeywordNumber) { case KEYWD_NBO: case KEYWD_BEND: @@ -463,7 +453,7 @@ comboUnit1.setSelectedIndex(0); SB script = new SB(); if (relabel) { - showAtomNums(alphaSpin.isSelected()); + setStructure(alphaSpin.isSelected() ? "alpha" : "beta"); script .append("select add {*}.bonds; color bonds lightgrey; select none;"); for (int i = 0; i < nBonds; i++) { @@ -1065,7 +1055,7 @@ if (relabel) { runScriptQueued("select add {*}.bonds; color bonds lightgrey; select none; measurements off"); - showAtomNums(alphaSpin.isSelected()); + setStructure(alphaSpin.isSelected() ? "alpha" : "beta"); relabel = false; } if (isLabel) { @@ -1130,18 +1120,14 @@ if (cb == comboUnit1) { changeKey(nrt); //Parsing RS list here ensures RS list will be in .nbo file - inputFileHandler.parseRSList(); comboUnit1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - if (isOpenShell) - setResStruct(comboUnit1.getSelectedIndex() + 1, - alphaSpin.isSelected()); - else - setResStruct(comboUnit1.getSelectedIndex() + 1, true); + setResStruct((alphaSpin.isSelected() ? "nrtstra" : "nrtstrb"), + comboUnit1.getSelectedIndex()); } }); - setResStruct(1, alphaSpin.isSelected()); + setResStruct(alphaSpin.isSelected() ? "nrtstra": "nrtstrb", 0); } break; case KEYWD_OPBAS: @@ -1155,101 +1141,8 @@ } } - /** - * Changes bonds and labels on the Jmol model when new RS is selected - * - * @param rsNum - * - index of RS in Combo Box - * @param alpha - */ - protected void setResStruct(int rsNum, boolean alpha) { - ChooseList chooseList = inputFileHandler.chooseList; - if (chooseList == null) - return; - int[][] resStructDef = inputFileHandler.resStructDef; - Map<Integer, String> resStructList = inputFileHandler.resStructList; - int sz = resStructDef.length; - Map<String, String> lonePairs = new Hashtable<String, String>(); - int[][] tmp = new int[sz][sz]; - for (int i = 0; i < sz; i++) - for (int j = 0; j < sz; j++) - tmp[i][j] = resStructDef[i][j]; - String rs = resStructList.get(new Integer(rsNum)); - if (rs != null) { - String[] rsList = rs.split(","); - int inc; - for (int i = 0; i < rsList.length; i++) { - if (rsList[i].contains("(")) - inc = -1; - else - inc = 1; - String bond = rsList[i].replaceAll("[\\D]", " ").trim(); - String[] toks = bond.split("\\s+"); - int a1 = Integer.parseInt(toks[0]) - 1; - if (toks.length < 2) { - tmp[a1][a1] += inc; - } else { - int a2 = Integer.parseInt(toks[1]) - 1; - tmp[a1][a2] += inc; - tmp[a2][a1] += inc; - } - } - } - vwr.ms.deleteAllBonds(); - int[] bondCounts = new int[vwr.ms.ac]; - for (int i = 0; i < sz; i++) { - for (int j = i; j < sz; j++) { - if (tmp[i][j] > 0) { - if (i == j) { - lonePairs.put(new Integer(i + 1).toString(), - new Integer(tmp[i][j]).toString()); - //vwr.ms.at[i].setValence(vwr.ms.at[i].getValence() + 2*tmp[i][j]); - continue; - } - if (tmp[i][j] > 0) { - int mad = (tmp[i][j] > 2) ? 150 : 250; - vwr.ms.bondAtoms(vwr.ms.at[i], vwr.ms.at[j], tmp[i][j], - (short) mad, vwr.ms.bsVisible, 0, true, true); - bondCounts[i] += tmp[i][j]; - bondCounts[j] += tmp[i][j]; - } - } - } - } - if (nboView) { - runScriptQueued("select add {*}.bonds;color bonds lightgrey;" - + "wireframe 0.1;select remove {*}"); - } - for (int i = 0; i < vwr.ms.ac; i++) { - vwr.ms.at[i].setFormalCharge(0); - vwr.ms.at[i].setValence(bondCounts[i]); - } - SB sb = new SB(); - vwr.ms.fixFormalCharges(vwr.getAllAtoms()); - for (int i = 1; i <= vwr.ms.ac; i++) { - sb.append("select (atomno=" + i + ");label "); - String atNum = new Integer(i).toString(); - String lp; - if ((lp = lonePairs.get(atNum)) != null) - if (!lp.equals("0")) - sb.append("<sup>(" + lp + ")</sup>"); - sb.append("%a"); - int charge = vwr.ms.at[i - 1].getFormalCharge(); - if (charge != 0) - sb.append("<sup>" + Math.abs(charge) + (charge > 0 ? "+" : charge < 0 ? "-" : "") + "</sup>"); - sb.append(";"); - } - runScriptQueued(sb.toString()); - runScriptQueued("select remove{*}; " + "select add (atomno=" - + (comboAtom1.getSelectedIndex()) + ");" + "select add (atomno=" - + (comboAtom2.getSelectedIndex()) + ");"); - - } - - - /** * * @param type @@ -1519,8 +1412,7 @@ runScriptNow("isosurface delete"); rbSelection = -1; - showAtomNums(true); - setBonds(true); + setStructure("alpha"); if (isOpenShell) { alphaSpin.setVisible(true); betaSpin.setVisible(true); Modified: trunk/Jmol/src/org/gennbo/NBODialogView.java =================================================================== --- trunk/Jmol/src/org/gennbo/NBODialogView.java 2017-02-05 13:05:22 UTC (rev 21390) +++ trunk/Jmol/src/org/gennbo/NBODialogView.java 2017-02-05 22:57:50 UTC (rev 21391) @@ -307,8 +307,7 @@ @Override public void run() { if (betaSpin.isSelected()) { - setBonds(false); - showAtomNums(false); + setStructure("beta"); } if (nboView) { runScriptNow("select *;color bonds lightgrey"); @@ -327,8 +326,7 @@ @Override public void run() { if (alphaSpin.isSelected()) { - setBonds(true); - showAtomNums(true); + setStructure("alpha"); } if (nboView) { runScriptNow("select*;color bonds lightgrey"); @@ -1262,8 +1260,7 @@ if (vwr.ms.ac == 0) return; - showAtomNums(alphaSpin.isSelected()); - setBonds(alphaSpin.isSelected()); + setStructure(alphaSpin.isSelected() ? "alpha" : "beta"); centerBox.setVisible(true); bottomBox.setVisible(!jmolOptionNONBO); Modified: trunk/Jmol/src/org/gennbo/NBOFileHandler.java =================================================================== --- trunk/Jmol/src/org/gennbo/NBOFileHandler.java 2017-02-05 13:05:22 UTC (rev 21390) +++ trunk/Jmol/src/org/gennbo/NBOFileHandler.java 2017-02-05 22:57:50 UTC (rev 21391) @@ -9,10 +9,9 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; -import java.io.StringReader; -import java.util.Hashtable; import java.util.Map; +import javajs.util.Lst; import javajs.util.PT; import javajs.util.SB; @@ -24,6 +23,7 @@ import javax.swing.JTextField; import javax.swing.filechooser.FileNameExtensionFilter; +import org.jmol.adapter.readers.quantum.NBOParser; import org.jmol.i18n.GT; import org.jmol.util.Logger; @@ -40,9 +40,7 @@ protected File inputFile; - protected ChooseList chooseList; - protected JTextField tfDir, tfName, tfExt; private JButton btnBrowse; @@ -51,15 +49,14 @@ protected NBODialog dialog; protected boolean canReRun; + private Lst<Object> structureList; + protected final static int MODE_MODEL_USE = 1; protected final static int MODE_RUN = 2; protected final static int MODE_VIEW = 3; protected final static int MODE_SEARCH = 4; protected final static int MODE_MODEL_SAVE = 5; - protected int[][] resStructDef; - protected Map<Integer, String> resStructList; - public NBOFileHandler(String name, String ext, final int mode, String useExt, NBODialog dialog) { @@ -218,7 +215,8 @@ boolean isOK = true; String msg = ""; if (dialog.dialogMode != NBODialogConfig.DIALOG_MODEL) { - if (!createChooseList(true)) { + setStructure(null, null, -1); + if (structureList == null || structureList.size() == 0) { msg = "problems getting a $CHOOSE list for " + inputFile; isOK = false; } else { @@ -253,49 +251,6 @@ tfExt.setText("47"); } } - - /** - * gets a valid $CHOOSE list from nbo file if it exists and corrects the bonds - * in the Jmol model - * @param isCheckOnly - * - * - * @return false if output contains error - */ - private boolean createChooseList(boolean isCheckOnly) { - chooseList = null; - dialog.isOpenShell = false; - - File f = newNBOFileForExt("nbo"); - if (!f.exists() || f.length() == 0) - return false; - String fdata = getFileData(f.toString()); - String[] tokens = PT.split(fdata, "\n $CHOOSE"); - int i = 1; - if (tokens.length < 2) { - dialog.logInfo("$CHOOSE record was not found in " + f, - Logger.LEVEL_INFO); - return false; - } - if (tokens[1].trim().startsWith("keylist")) { - if (!tokens[1].contains("Structure accepted:")) { - if (tokens[1].contains("missing END?")) { - dialog.logInfo("Plot files not found. Have you used RUN yet?", - Logger.LEVEL_ERROR); - return false; - } else if (tokens[2].contains("ignoring")) { - System.out.println("Ignoring $CHOOSE list"); - } else { - return false; - } - } - i = 3; - } - //if (!isCheckOnly) - chooseList = new ChooseList(tokens[i].substring(0, tokens[i].indexOf("$END"))); - dialog.isOpenShell = chooseList.isOpenShell; - return true; - } /** * change \ to / @@ -489,184 +444,24 @@ return null; } + /** - * Structure for maintaining contents of $CHOOSE list + * create the resonance structure list. + * @param sb string buffer to write Jmol scripts to if desired + * + * @param type + * nrtstra, nrtstrb, alpha, beta + * @param index index into list of this type + * @return the map for this structure */ - class ChooseList { - - protected Hashtable<String, String> lv; - protected Hashtable<String, String> lv_b; - protected Hashtable<String, String> lonePairs; - protected Hashtable<String, String> lonePairs_b; - protected SB bonds; - protected SB bonds_b; - protected SB bonds3c; - protected SB bonds3c_b; - protected boolean isOpenShell; - - public ChooseList(String data) { - lv = new Hashtable<String, String>(); - lv_b = new Hashtable<String, String>(); - lonePairs = new Hashtable<String, String>(); - lonePairs_b = new Hashtable<String, String>(); - bonds = new SB(); - bonds_b = new SB(); - bonds3c = new SB(); - bonds3c_b = new SB(); - - setData(data); + public String setStructure(SB sb, String type, int index) { + if (structureList == null) { + NBOParser nboParser = new NBOParser(); + structureList = nboParser.getAllStructures(getInputFile("nbo")); } - - private void setData(String data) { - String[] tokens = PT.split(data, "END"); - int ind = 0; - SB bonds = this.bonds; - SB bonds3c = this.bonds3c; - Hashtable<String, String> lonePairs = this.lonePairs; - if (data.trim().contains("ALPHA")) { - isOpenShell = true; - ind = 1; - } - - for (String x : tokens) { - String[] list = x.trim().split("\\s+"); - if (list[0].trim().equals("BETA")) { - bonds = this.bonds_b; - bonds3c = this.bonds3c_b; - lonePairs = this.lonePairs_b; - ind = 1; - } - - if (list[ind].trim().equals("LONE")) - for (int j = 1 + ind; j < list.length; j += 2) - lonePairs.put(list[j], list[j + 1]); - - else if (list[ind].trim().equals("BOND")) - for (int j = 1 + ind; j < list.length; j += 3) - bonds - .append(list[j] + ":" + list[j + 1] + " " + list[j + 2] + "\n"); - - else if (list[ind].equals("3C")) - for (int j = 1 + ind; j < list.length; j += 4) - bonds3c.append(list[j] + ":" + list[j + 1] + " " + list[j + 2] - + " " + list[j + 3] + "\n"); - - ind = 0; - - } - - } - - /** - * Takes two strings from .nbo file and parses RS list information toks[0] = - * primary rs matrix toks[1] = change list using accountants notation; creates - * fields int[][] resStructDef and Map<Integer, String> resStructList - * - */ - protected void parseRSList() { - -// TOPO matrix for the leading resonance structure: - // -// Atom 1 2 3 -// ---- --- --- --- -// 1. O 2 2 0 -// 2. C 2 0 2 -// 3. O 0 2 2 - // -// Resonance -// RS Weight(%) Added(Removed) -// --------------------------------------------------------------------------- -// 1*(3) 49.51 -// 2*(2) 25.63 ( O 1- C 2), C 2- O 3, O 1, ( O 3) -// 3*(2) 24.45 O 1- C 2, ( C 2- O 3), ( O 1), O 3 -// 4 0.21 ( O 1- C 2), ( O 1- C 2), C 2- O 3, C 2- O 3, -// O 1, O 1, ( O 3), ( O 3) -// 5 0.21 O 1- C 2, O 1- C 2, ( C 2- O 3), ( C 2- O 3), -// ( O 1), ( O 1), O 3, O 3 -// 6-11 0.00 -// --------------------------------------------------------------------------- -// 100.00 * Total * [* = reference structure] - // - - - String data = getInputFile("nbo"); - String[] toks = PT.split(data, - "TOPO matrix for the leading resonance structure:\n"); - if (toks.length < 2) { - if (toks[0].contains("0 candidate reference structure(s)")) - dialog.alertError("0 candidate reference structure(s) calculated by SR LEWIS" - + " Candidate reference structure taken from NBO search"); - return; - } - String[] toks2 = PT - .split(toks[1], - "---------------------------------------------------------------------------"); - String[] rsList = new String[2]; - rsList[0] = toks2[0].substring(toks2[0].lastIndexOf('-'), - toks2[0].indexOf("Res")).trim(); - rsList[0] = rsList[0].replace("-\n", ""); - rsList[1] = toks2[1]; - String[] tmp1 = rsList[0].split("\n"); - int size = tmp1.length; - resStructDef = new int[size][size]; - for (int i = 0; i < size; i++) { - String[] tmp = tmp1[i].substring(10).trim().split("\\s+"); - for (int j = 0; j < tmp.length; j++) { - if (tmp[j].length() > 0) - resStructDef[i][j] = Integer.parseInt(tmp[j]); - } - } - resStructList = new Hashtable<Integer, String>(); - try { - BufferedReader br = new BufferedReader(new StringReader(rsList[1])); - String line = br.readLine(); - line = br.readLine(); - int num = 1; - String list = ""; - while ((line = br.readLine()) != null) { - String n = line.substring(0, 10).trim(); - if (n.equals("")) { - list += line.substring(18).trim(); - } else if (n.contains("-")) { - break; - } else { - if (!list.equals("")) { - Integer rs = new Integer(++num); - resStructList.put(rs, list); - } - list = ""; - list += line.substring(18).trim(); - } - } - Integer rs = new Integer(++num); - resStructList.put(rs, list); - } catch (Exception e) { - } - } - - public Map<String, String> getMap(boolean isAlpha, boolean isLonePair) { - return (isLonePair ? (isAlpha ? lonePairs : lonePairs_b) : isAlpha ? lv - : lv_b); - } - - + Map<String, Object> map = NBOParser.getStructureMap(structureList, type, index); + return (map == null ? null : NBOParser.setStructure(sb, dialog.vwr, map)); } - public void parseRSList() { - if (chooseList != null) - chooseList.parseRSList(); - } - - - public SB getChooseListBonds(boolean alpha) { - return (chooseList == null ? null : alpha ? chooseList.bonds : chooseList.bonds_b); - } - - public Map<String, String> getChooseListMap(boolean isAlpha, boolean isLonePair) { - return (chooseList == null ? null : chooseList.getMap(isAlpha, isLonePair)); - - } - - } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |