From: <pie...@us...> - 2013-11-15 02:25:54
|
Revision: 18952 http://sourceforge.net/p/jmol/code/18952 Author: pierocanepa Date: 2013-11-15 02:25:50 +0000 (Fri, 15 Nov 2013) Log Message: ----------- Add extension for animated Xcrysden files Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/XcrysdenReader.java trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/XcrysdenReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/XcrysdenReader.java 2013-11-14 18:33:58 UTC (rev 18951) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/XcrysdenReader.java 2013-11-15 02:25:50 UTC (rev 18952) @@ -11,12 +11,13 @@ * * http://www.xcrysden.org * - * @version 1.0 + * @version 1.1 */ public class XcrysdenReader extends AtomSetCollectionReader { private int nAtoms; + private boolean aNimation = false; @Override protected void initializeReader() throws Exception { @@ -25,7 +26,9 @@ @Override protected boolean checkLine() throws Exception { - if (line.contains("CRYSTAL")) { + if (line.contains("ANIMSTEP")) { + readNostep(); + } else if (line.contains("CRYSTAL")) { setFractionalCoordinates(false); } else if (line.contains("PRIMVEC")) { readUnitCell(); @@ -33,8 +36,13 @@ readCoordinates(); } return true; - } + + + + private void readNostep() throws Exception { + aNimation = true; + } private float[] unitCellData = new float[9]; @@ -68,13 +76,14 @@ 6 -0.916425367 5.375190418 -7.209984663 6 -4.773254987 4.300512942 6.348687286 */ + private int step = 0; private void readCoordinates() throws Exception { String[] atomStr = getTokensStr(readLine()); nAtoms = Integer.parseInt(atomStr[0]); setFractionalCoordinates(false); int counter = 0; - while (counter < nAtoms && readLine() != null) { + while (counter < nAtoms && readLine() != null) { Atom atom = atomSetCollection.addNewAtom(); String[] tokens = getTokens(); atom.atomName = getElementSymbol(Integer.parseInt(tokens[0])); @@ -84,7 +93,9 @@ setAtomCoordXYZ(atom, x, y, z); counter++; } - atomSetCollection.setAtomSetName("Initial Coordinates"); + atomSetCollection.setAtomSetName("Initial coordinates"); + if (aNimation) + atomSetCollection.setAtomSetName("Structure " + Integer.toString(step++)); } } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2013-11-14 18:33:58 UTC (rev 18951) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2013-11-15 02:25:50 UTC (rev 18952) @@ -878,7 +878,7 @@ "WELCOME TO SIESTA" }; private final static String[] xcrysDenContainsRecords = - { "Xcrysden", "PRIMVEC", "CONVVEC", "PRIMCOORD" }; + { "Xcrysden", "PRIMVEC", "CONVVEC", "PRIMCOORD", "ANIMSTEP" }; private final static String[] mopacArchiveContainsRecords = { "MopacArchive", "SUMMARY OF PM" }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pie...@us...> - 2014-01-20 15:46:36
|
Revision: 19205 http://sourceforge.net/p/jmol/code/19205 Author: pierocanepa Date: 2014-01-20 15:46:24 +0000 (Mon, 20 Jan 2014) Log Message: ----------- Resolver and CrystalReader classes adapted to slightly new format adopted in the new release of CRYSTAL, i.e. CRYSTAL14 Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CrystalReader.java trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CrystalReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CrystalReader.java 2014-01-19 23:12:48 UTC (rev 19204) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CrystalReader.java 2014-01-20 15:46:24 UTC (rev 19205) @@ -422,7 +422,11 @@ private boolean readHeader() throws Exception { - discardLinesUntilContains("* CRYSTAL"); + //This avoid line mismatching between different version of CRYSTAL + discardLinesUntilContains("*******************************************************************************"); + readLines(2); + //discardLinesUntilContains("* CRYSTAL14"); + //discardLinesUntilContains("* CRYSTAL"); isVersion3 = (line.indexOf("CRYSTAL03") >= 0); discardLinesUntilContains("EEEEEEEEEE"); Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2014-01-19 23:12:48 UTC (rev 19204) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2014-01-20 15:46:24 UTC (rev 19205) @@ -539,12 +539,19 @@ private static boolean checkCrystal(String[] lines) { String s = lines[1].trim(); if (s.equals("SLAB") ||s.equals("MOLECULE") - || s.equals("CRYSTAL") + || s.equals("CRYSTAL") || s.equals("POLYMER") || (s = lines[3]).equals("SLAB") || s.equals("MOLECULE") || s.equals("POLYMER")) return true; for (int i = 0; i < lines.length; i++) { - if (lines[i].trim().equals("OPTGEOM")) + if (lines[i].trim().equals("OPTGEOM") || lines[i].trim().equals("FREQCALC") || + lines[i].contains("DOVESI") + || lines[i].contains("TORINO") + || lines[i].contains("http://www.crystal.unito.it") + //new lenghty scripts for CRYSTAL14 + || lines[i].contains("Pcrystal") + || lines[i].contains("MPPcrystal") + || lines[i].contains("crystal executable")) return true; } return false; @@ -865,7 +872,8 @@ { "Cif", "Crystallographic Information File"}; private final static String[] crystalContainsRecords = - { "Crystal", "* CRYSTAL"}; + { "Crystal", + "* CRYSTAL", "TORINO", "DOVESI" }; private final static String[] espressoContainsRecords = { "Espresso", "Program PWSCF", "Program PHONON" }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-03-17 13:48:34
|
Revision: 19458 http://sourceforge.net/p/jmol/code/19458 Author: hansonr Date: 2014-03-17 13:48:25 +0000 (Mon, 17 Mar 2014) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java trunk/Jmol/src/org/jmol/adapter/readers/pdb/PdbReader.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2014-03-17 12:34:43 UTC (rev 19457) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2014-03-17 13:48:25 UTC (rev 19458) @@ -107,10 +107,7 @@ @Override public void initializeReader() throws Exception { - initializeReaderCif(); - } - - protected void initializeReaderCif() throws Exception { + allowPDBFilter = true; appendedData = (String) htParams.get("appendedData"); String conf = getFilter("CONF "); if (conf != null) Modified: trunk/Jmol/src/org/jmol/adapter/readers/pdb/PdbReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pdb/PdbReader.java 2014-03-17 12:34:43 UTC (rev 19457) +++ trunk/Jmol/src/org/jmol/adapter/readers/pdb/PdbReader.java 2014-03-17 13:48:25 UTC (rev 19458) @@ -188,6 +188,7 @@ @SuppressWarnings("unchecked") @Override protected void initializeReader() throws Exception { + allowPDBFilter = true; pdbHeader = (getHeader ? new SB() : null); applySymmetry = !checkFilterKey("NOSYMMETRY"); getTlsGroups = checkFilterKey("TLS"); @@ -861,6 +862,8 @@ private void atom() { boolean isHetero = line.startsWith("HETATM"); + if (isHetero) + System.out.println("pdbtest"); Atom atom = processAtom(new Atom(), line.substring(12, 16).trim(), line.charAt(16), Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2014-03-17 12:34:43 UTC (rev 19457) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2014-03-17 13:48:25 UTC (rev 19458) @@ -800,6 +800,7 @@ protected boolean doCentralize; protected boolean addVibrations; protected boolean useAltNames; + protected boolean allowPDBFilter; public boolean doReadMolecularOrbitals; protected boolean reverseModels; private String nameRequired; @@ -845,20 +846,28 @@ doReadMolecularOrbitals = !checkFilterKey("NOMO"); useAltNames = checkFilterKey("ALTNAME"); reverseModels = checkFilterKey("REVERSEMODELS"); + if (checkFilterKey("HETATM")) { + filterHetero = true; + filter = PT.rep(filter, "HETATM", "HETATM-Y"); + } + if (checkFilterKey("ATOM")) { + filterHetero = true; + filter = PT.rep(filter, "ATOM", "HETATM-N"); + } if (checkFilterKey("NAME=")) { nameRequired = filter.substring(filter.indexOf("NAME=") + 5); if (nameRequired.startsWith("'")) - nameRequired = PT.split(nameRequired, "'")[1]; + nameRequired = PT.split(nameRequired, "'")[1]; else if (nameRequired.startsWith("\"")) - nameRequired = PT.split(nameRequired, "\"")[1]; - filter0 = filter = PT.rep(filter, nameRequired,""); - filter0 = filter = PT.rep(filter, "NAME=",""); + nameRequired = PT.split(nameRequired, "\"")[1]; + filter0 = filter = PT.rep(filter, nameRequired, ""); + filter0 = filter = PT.rep(filter, "NAME=", ""); } if (filter == null) return; filterAtomName = checkFilterKey("*.") || checkFilterKey("!."); filterElement = checkFilterKey("_"); - filterHetero = checkFilterKey("HETATM"); // PDB + filterGroup3 = checkFilterKey("["); filterChain = checkFilterKey(":"); filterAltLoc = checkFilterKey("%"); @@ -869,8 +878,9 @@ filterAtomType = checkFilterKey("="); if (filterN == Integer.MIN_VALUE) filterEveryNth = false; - haveAtomFilter = filterAtomName || filterAtomType || filterElement || filterGroup3 || filterChain - || filterAltLoc || filterHetero || filterEveryNth || checkFilterKey("/="); + haveAtomFilter = filterAtomName || filterAtomType || filterElement + || filterGroup3 || filterChain || filterAltLoc || filterHetero + || filterEveryNth || checkFilterKey("/="); if (bsFilter == null) { // bsFilter is usually null, but from MDTOP it gets set to indicate // which atoms were selected by the filter. This then @@ -938,8 +948,8 @@ + viewer.getChainIDStr(atom.chainID))) && (!filterAltLoc || atom.altLoc == '\0' || !filterReject( f, "%", "" + atom.altLoc)) - && (!filterHetero || !filterReject(f, "HETATM", - atom.isHetero ? "HETATM" : "ATOM")); + && (!filterHetero || !allowPDBFilter || !filterReject(f, "HETATM", + atom.isHetero ? "-Y" : "-N")); } public boolean rejectAtomName(String name) { @@ -952,8 +962,10 @@ } protected boolean filterReject(String f, String code, String atomCode) { - return (f.indexOf(code) >= 0 && (f.indexOf("!" + code) >= 0 ? f - .indexOf(code + atomCode) >= 0 : f.indexOf(code + atomCode) < 0)); + return (f.indexOf(code) >= 0 + && (f.indexOf("!" + code) >= 0) == + (f.indexOf(code + atomCode) >= 0) + ); } protected void set2D() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-08-05 11:08:16
|
Revision: 19910 http://sourceforge.net/p/jmol/code/19910 Author: hansonr Date: 2014-08-05 11:08:09 +0000 (Tue, 05 Aug 2014) Log Message: ----------- ___JmolVersion="14.3.5_2014.08.05" bug fix: CIF reader broken for load xxx.cif 1 (14.1.17_2014.06.07) Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2014-08-05 11:07:38 UTC (rev 19909) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2014-08-05 11:08:09 UTC (rev 19910) @@ -1014,7 +1014,7 @@ fieldProperty(modelField); int modelNo = parseIntStr(field); if (modelNo != currentModelNo) { - if (iHaveDesiredModel) { + if (iHaveDesiredModel && asc.atomSetCount > 0) { parser.skipLoop(); // but only this atom loop skipping = false; Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2014-08-05 11:07:38 UTC (rev 19909) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2014-08-05 11:08:09 UTC (rev 19910) @@ -367,34 +367,36 @@ } protected void finalizeReaderASCR() throws Exception { - applySymmetryAndSetTrajectory(); - asc.finalizeStructures(); - if (doCentralize) - asc.centralize(); - Map<String, Object>info = asc.getAtomSetAuxiliaryInfo(0); - if (domains != null && info != null) { - asc.setGlobalBoolean(AtomSetCollection.GLOBAL_DOMAINS); - String s = ((SV) domains).getMapKeys(2, true); - int pt = s.indexOf("{ ", 2); - if (pt >= 0) - s = s.substring(pt + 2); - pt = s.indexOf("_metadata"); - if (pt < 0) - pt = s.indexOf("metadata"); - if (pt >= 0) - s = s.substring(0, pt); - s = PT.rep(PT.replaceAllCharacters(s,"{}", "").trim(), "\n", "\n ") - + "\n\nUse SHOW DOMAINS for details."; - appendLoadNote("\nDomains loaded:\n " + s); - for (int i = asc.atomSetCount; --i >= 0;) { - info = asc.getAtomSetAuxiliaryInfo(i); - info.put("domains", domains); + if (asc.atomSetCount > 0) { + applySymmetryAndSetTrajectory(); + asc.finalizeStructures(); + if (doCentralize) + asc.centralize(); + Map<String, Object> info = asc.getAtomSetAuxiliaryInfo(0); + if (domains != null && info != null) { + asc.setGlobalBoolean(AtomSetCollection.GLOBAL_DOMAINS); + String s = ((SV) domains).getMapKeys(2, true); + int pt = s.indexOf("{ ", 2); + if (pt >= 0) + s = s.substring(pt + 2); + pt = s.indexOf("_metadata"); + if (pt < 0) + pt = s.indexOf("metadata"); + if (pt >= 0) + s = s.substring(0, pt); + s = PT.rep(PT.replaceAllCharacters(s, "{}", "").trim(), "\n", "\n ") + + "\n\nUse SHOW DOMAINS for details."; + appendLoadNote("\nDomains loaded:\n " + s); + for (int i = asc.atomSetCount; --i >= 0;) { + info = asc.getAtomSetAuxiliaryInfo(i); + info.put("domains", domains); + } } - } - if (validation != null && info != null) { - for (int i = asc.atomSetCount; --i >= 0;) { - info = asc.getAtomSetAuxiliaryInfo(i); - info.put("validation", validation); + if (validation != null && info != null) { + for (int i = asc.atomSetCount; --i >= 0;) { + info = asc.getAtomSetAuxiliaryInfo(i); + info.put("validation", validation); + } } } setLoadNote(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-08-31 19:54:26
|
Revision: 19969 http://sourceforge.net/p/jmol/code/19969 Author: hansonr Date: 2014-08-31 19:54:16 +0000 (Sun, 31 Aug 2014) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/cif/Subsystem.java trunk/Jmol/src/org/jmol/adapter/readers/pdb/PdbReader.java trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/Subsystem.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/Subsystem.java 2014-08-30 16:02:07 UTC (rev 19968) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/Subsystem.java 2014-08-31 19:54:16 UTC (rev 19969) @@ -7,7 +7,6 @@ import javajs.util.Matrix; import javajs.util.V3; -import org.jmol.api.Interface; import org.jmol.api.SymmetryInterface; import org.jmol.symmetry.Symmetry; import org.jmol.util.Logger; Modified: trunk/Jmol/src/org/jmol/adapter/readers/pdb/PdbReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pdb/PdbReader.java 2014-08-30 16:02:07 UTC (rev 19968) +++ trunk/Jmol/src/org/jmol/adapter/readers/pdb/PdbReader.java 2014-08-31 19:54:16 UTC (rev 19969) @@ -435,7 +435,7 @@ } } if (vTlsModels != null) { - symmetry = ((Symmetry) getInterface("org.jmol.symmetry.Symmetry")); + symmetry = (Symmetry) getInterface("org.jmol.symmetry.Symmetry"); int n = asc.atomSetCount; if (n == vTlsModels.size()) { for (int i = n; --i >= 0;) Modified: trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java 2014-08-30 16:02:07 UTC (rev 19968) +++ trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java 2014-08-31 19:54:16 UTC (rev 19969) @@ -75,7 +75,7 @@ public SymmetryInterface symmetry; SymmetryInterface getSymmetry() { - return (symmetry == null ?(Symmetry) acr.getInterface("org.jmol.symmetry.Symmetry") : symmetry); + return (symmetry == null ?(symmetry = (Symmetry) acr.getInterface("org.jmol.symmetry.Symmetry")) : symmetry); } SymmetryInterface setSymmetry(SymmetryInterface symmetry) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-10-02 02:08:24
|
Revision: 20033 http://sourceforge.net/p/jmol/code/20033 Author: hansonr Date: 2014-10-02 02:08:17 +0000 (Thu, 02 Oct 2014) Log Message: ----------- CGD reader made automatically packed and {1 1 1} Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java trunk/Jmol/src/org/jmol/adapter/readers/cif/MSRdr.java trunk/Jmol/src/org/jmol/adapter/readers/xtal/CgdReader.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2014-09-30 23:34:54 UTC (rev 20032) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2014-10-02 02:08:17 UTC (rev 20033) @@ -132,12 +132,7 @@ filterAssembly = checkFilterKey("$"); useAuthorChainID = !checkFilterKey("NOAUTHORCHAINS"); if (isMolecular) { - if (!doApplySymmetry) { - doApplySymmetry = true; - latticeCells[0] = 1; - latticeCells[1] = 1; - latticeCells[2] = 1; - } + forceSymmetry(false); molecularType = "filter \"MOLECULAR\""; } checkSpecial = !checkFilterKey("NOSPECIAL"); @@ -1626,8 +1621,7 @@ Logger.info(bondCount + " bonds read"); if (!doApplySymmetry) { isMolecular = true; - doApplySymmetry = true; - latticeCells[0] = latticeCells[1] = latticeCells[2] = 1; + forceSymmetry(false); } } } Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/MSRdr.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/MSRdr.java 2014-09-30 23:34:54 UTC (rev 20032) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/MSRdr.java 2014-10-02 02:08:17 UTC (rev 20033) @@ -247,13 +247,7 @@ } private void setSubsystemOptions() { - cr.doPackUnitCell = modPack; - if (!cr.doApplySymmetry) { - cr.doApplySymmetry = true; - cr.latticeCells[0] = 1; - cr.latticeCells[1] = 1; - cr.latticeCells[2] = 1; - } + cr.forceSymmetry(modPack); if (modCell != null) cr.addJmolScript("unitcell {%" + modCell + "}"); } Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CgdReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CgdReader.java 2014-09-30 23:34:54 UTC (rev 20032) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CgdReader.java 2014-10-02 02:08:17 UTC (rev 20033) @@ -49,11 +49,15 @@ public class CgdReader extends AtomSetCollectionReader { + private boolean noBondSym; + @Override public void initializeReader() { setFractionalCoordinates(true); asc.setNoAutoBond(); asc.vibScale = 1; + forceSymmetry(!checkFilterKey("NOPACK")); + noBondSym = checkFilterKey("NOBONDSYM"); } private String[] tokens; @@ -246,6 +250,8 @@ for (int i = 0, n = asc.ac; i < n; i++) { Atom a = asc.atoms[i]; Atom a0 = asc.atoms[a.atomSite]; + if (noBondSym && a != a0) + continue; V3[] edges = htEdges.get(a0); if (edges == null) continue; @@ -275,7 +281,7 @@ } private Atom findAtom(P3 pt) { - for (int i = asc.ac; --i >= 0;) + for (int i = asc.ac; --i >= 0;) if (asc.atoms[i].distanceSquared(pt) < 0.00001f) return asc.atoms[i]; return null; Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2014-09-30 23:34:54 UTC (rev 20032) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2014-10-02 02:08:17 UTC (rev 20033) @@ -1782,5 +1782,16 @@ return o; } + public void forceSymmetry(boolean andPack) { + if (andPack) + doPackUnitCell = andPack; + if (!doApplySymmetry) { + doApplySymmetry = true; + latticeCells[0] = 1; + latticeCells[1] = 1; + latticeCells[2] = 1; + } + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2015-02-18 05:09:30
|
Revision: 20302 http://sourceforge.net/p/jmol/code/20302 Author: hansonr Date: 2015-02-18 05:09:25 +0000 (Wed, 18 Feb 2015) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xtal/VaspPoscarReader.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/VaspPoscarReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/VaspPoscarReader.java 2015-02-18 00:44:51 UTC (rev 20301) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/VaspPoscarReader.java 2015-02-18 05:09:25 UTC (rev 20302) @@ -5,8 +5,6 @@ import javajs.util.PT; import javajs.util.SB; -import org.jmol.util.Logger; - /** * http://cms.mpi.univie.ac.at/vasp/ * Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2015-02-18 00:44:51 UTC (rev 20301) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2015-02-18 05:09:25 UTC (rev 20302) @@ -256,7 +256,7 @@ binaryDoc.setOutputChannel(out); processBinaryDocument(); } - finalizeSubclassReader(); // upstairs + finalizeSubclassReader(); // upstairs if (!isFinalized) finalizeReaderASCR(); } catch (Throwable e) { @@ -466,8 +466,8 @@ if (asc.errorMessage != null) return asc.errorMessage + "\nfor file " + filePath + "\ntype " + name; - if ((asc.bsAtoms == null ? asc.ac - : asc.bsAtoms.nextSetBit(0)) <= 0 + if ((asc.bsAtoms == null ? asc.ac == 0 + : asc.bsAtoms.nextSetBit(0) < 0) && fileType.indexOf("DataOnly") < 0 && asc.atomSetInfo.get("dataOnly") == null) return "No atoms found\nfor file " + filePath + "\ntype " + name; fixBaseIndices(); Modified: trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java 2015-02-18 00:44:51 UTC (rev 20301) +++ trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java 2015-02-18 05:09:25 UTC (rev 20302) @@ -986,6 +986,7 @@ if (biomts.size() < 2) return; symmetry = null; + // it's not clear to me why you would do this: if (!Float.isNaN(notionalUnitCell[0])) // PDB can do this; setNotionalUnitCell(notionalUnitCell, null, unitCellOffset); getSymmetry().setSpaceGroup(doNormalize); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2017-07-27 13:42:05
|
Revision: 21680 http://sourceforge.net/p/jmol/code/21680 Author: hansonr Date: 2017-07-27 13:42:02 +0000 (Thu, 27 Jul 2017) Log Message: ----------- Jmol.___JmolVersion="14.20.4" bug fix: SpartanSMOL reader for iSpartan files does not read charges or vibrational mode data Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/spartan/SpartanArchive.java trunk/Jmol/src/org/jmol/adapter/readers/spartan/SpartanReader.java trunk/Jmol/src/org/jmol/adapter/readers/spartan/SpartanSmolReader.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/spartan/SpartanArchive.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/spartan/SpartanArchive.java 2017-07-27 13:15:02 UTC (rev 21679) +++ trunk/Jmol/src/org/jmol/adapter/readers/spartan/SpartanArchive.java 2017-07-27 13:42:02 UTC (rev 21680) @@ -51,6 +51,7 @@ private int modelCount = 0; + private int modelAtomCount = 0; private int ac = 0; private String bondData; // not in archive; may or may not have private int moCount = 0; @@ -62,8 +63,9 @@ private BasisFunctionReader r; - SpartanArchive(BasisFunctionReader r, String bondData, String endCheck) { + SpartanArchive(BasisFunctionReader r, String bondData, String endCheck, int smolAtomCount) { initialize(r, bondData); + this.modelAtomCount = smolAtomCount; this.endCheck = endCheck; isSMOL = (endCheck != null); } @@ -130,8 +132,6 @@ r.asc.setAtomSetEnergy(tokens[0], value); } - int modelAtomCount; - private int setInfo(String info) throws Exception { // 5 17 11 18 0 1 17 0 RHF 3-21G(d) NOOPT FREQ // 0 1 2 3 4 5 6 7 8 9 Modified: trunk/Jmol/src/org/jmol/adapter/readers/spartan/SpartanReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/spartan/SpartanReader.java 2017-07-27 13:15:02 UTC (rev 21679) +++ trunk/Jmol/src/org/jmol/adapter/readers/spartan/SpartanReader.java 2017-07-27 13:42:02 UTC (rev 21680) @@ -47,7 +47,7 @@ String cartesianHeader = "Cartesian Coordinates (Ang"; if (isSpartanArchive(cartesianHeader)) { moData = new Hashtable<String, Object>(); - SpartanArchive spartanArchive = new SpartanArchive(this, "", null); + SpartanArchive spartanArchive = new SpartanArchive(this, "", null, 0); int ac = spartanArchive.readArchive(line, true, 0, true); if (ac > 0) asc.setAtomSetName("Spartan file"); Modified: trunk/Jmol/src/org/jmol/adapter/readers/spartan/SpartanSmolReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/spartan/SpartanSmolReader.java 2017-07-27 13:15:02 UTC (rev 21679) +++ trunk/Jmol/src/org/jmol/adapter/readers/spartan/SpartanSmolReader.java 2017-07-27 13:42:02 UTC (rev 21680) @@ -163,10 +163,6 @@ return false; } else if (lcline.endsWith("proparc") || lcline.endsWith("propertyarchive")) { - if (spartanArchive == null) { - spartanArchive = new SpartanArchive(this, bondData, endCheck); - spartanArchive.modelAtomCount = asc.getAtomSetAtomCount(asc.iSet); - } readProperties(); return false; } else if (lcline.endsWith("archive")) { @@ -246,7 +242,7 @@ } private String readArchive() throws Exception { - spartanArchive = new SpartanArchive(this, bondData, endCheck); + spartanArchive = new SpartanArchive(this, bondData, endCheck, 0); String modelName = readArchiveHeader(); if (modelName != null) modelAtomCount = spartanArchive.readArchive(line, false, asc.ac, false); @@ -266,10 +262,13 @@ } private void readProperties() throws Exception { - if (spartanArchive == null) { + if (modelAtomCount == 0) { rd(); return; } + if (spartanArchive == null) + spartanArchive = new SpartanArchive(this, bondData, endCheck, + modelAtomCount); spartanArchive.readProperties(); rd(); setCharges(); Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java 2017-07-27 13:15:02 UTC (rev 21679) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java 2017-07-27 13:42:02 UTC (rev 21680) @@ -738,8 +738,9 @@ if (!atomSetInfo.containsKey(auxKey)) return false; Lst<Float> atomData = (Lst<Float>) atomSetInfo.get(auxKey); - for (int i = atomData.size(); --i >= 0;) - atoms[i].partialCharge = atomData.get(i).floatValue(); + int n = atomData.size(); + for (int i = ac; --i >= 0;) + atoms[i].partialCharge = atomData.get(i % n).floatValue(); Logger.info("Setting partial charges type " + auxKey); return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2021-09-05 23:41:29
|
Revision: 22226 http://sourceforge.net/p/jmol/code/22226 Author: hansonr Date: 2021-09-05 23:41:26 +0000 (Sun, 05 Sep 2021) Log Message: ----------- TopoCifParser for release Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java trunk/Jmol/src/org/jmol/adapter/readers/cif/TopoCifParser.java trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2021-09-03 14:05:34 UTC (rev 22225) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2021-09-05 23:41:26 UTC (rev 22226) @@ -468,7 +468,7 @@ private void setOxidationStates() { for (int i = asc.ac; --i >= 0;) { Atom a = asc.atoms[i]; - String sym = a.elementSymbol; + String sym = a.typeSymbol; float[] data; if (sym != null && (data = htOxStates.get(sym)) != null) { float charge = data[0]; @@ -480,11 +480,7 @@ a.bondRadius = radius; } } - } - - // TODO - } @@ -1282,6 +1278,7 @@ } } atom.elementSymbol = elementSymbol; + atom.typeSymbol = field; break; case CC_ATOM_ID: case LABEL: Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/TopoCifParser.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/TopoCifParser.java 2021-09-03 14:05:34 UTC (rev 22225) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/TopoCifParser.java 2021-09-05 23:41:26 UTC (rev 22226) @@ -9,7 +9,6 @@ import org.jmol.api.SymmetryInterface; import org.jmol.symmetry.SymmetryOperation; import org.jmol.util.Edge; -import org.jmol.util.Logger; import javajs.api.GenericCifDataParser; import javajs.util.BS; @@ -51,14 +50,14 @@ * hb} separated by "+"; default is v+hb */ // private final static String ` = "+v+hb+w+"; - public static final int LINK_TYPE_SING = 1; - public static final int LINK_TYPE_DOUB = 2; - public static final int LINK_TYPE_TRIP = 3; - public static final int LINK_TYPE_QUAD = 4; - public static final int LINK_TYPE_QUIN = 5; - public static final int LINK_TYPE_HEX = 6; - public static final int LINK_TYPE_HEPT = 7; - public static final int LINK_TYPE_OCT = 8; + public static final int LINK_TYPE_SINGLE = 1; + public static final int LINK_TYPE_DOUBLE = 2; + public static final int LINK_TYPE_TRIPLE = 3; + public static final int LINK_TYPE_QUADRUPLE = 4; + public static final int LINK_TYPE_QUINTUPLE = 5; + public static final int LINK_TYPE_SEXTUPLE = 6; + public static final int LINK_TYPE_SEPTUPLE = 7; + public static final int LINK_TYPE_OCTUPLE = 8; public static final int LINK_TYPE_AROM = 9; public static final int LINK_TYPE_POLY = 0xA; public static final int LINK_TYPE_DELO = 0xB; @@ -73,19 +72,23 @@ + "TRI" + "QUA" + "QUI" - + "HEX" - + "HEP" + + "SEX" + + "SEP" + "OCT" + "ARO" + "POL" + "PI " + "HBO" - + "VDW"; // also "W" + + "VDW"; // also "W" ? - static int getBondType(String type) { + static int getBondType(String type, int order) { type = type.toUpperCase(); - if (type.charAt(0) == 'V') - return (type.length() == 1 ? LINK_TYPE_SING : LINK_TYPE_VDW); + if (type.equals("V")) + return (order == 0 ? LINK_TYPE_SINGLE : order); + switch (type.charAt(0)) { + case 'V': + return LINK_TYPE_VDW; + } if (type.length() > 3) type = type.substring(0, 3); return Math.max(1, linkTypes.indexOf(type)/3); @@ -102,25 +105,28 @@ CifReader reader; /** - * list of _topol_node block data + * list of TOPOL_ATOM loop data */ Lst<TAtom> atoms = new Lst<TAtom>(); /** - * list of _topol_node block data + * list of TOPOL_NODE loop data */ Lst<TNode> nodes = new Lst<TNode>(); /** - * list of _topol_link block data + * list of TOPOL_LINK loop data */ - private Lst<TLink> links = new Lst<TLink>(); + Lst<TLink> links = new Lst<TLink>(); /** - * list of _topol_net block data + * list of TOPOL_NET loop or single data item data */ Lst<TNet> nets = new Lst<TNet>(); + /** + * storage for a single net from a non-looped data item + */ TNet singleNet; int netCount; @@ -156,134 +162,138 @@ private String allowedTypes; String netNotes = ""; + private SymmetryInterface sym; // CifParser supports up to 100 fields final private static String[] topolFields = { /*0*/"_topol_net_id", /*1*/"_topol_net_label", - /*2*/"_topol_link_id", - /*3*/"_topol_link_net_id", - /*4*/"_topol_link_node_id_1", - /*5*/"_topol_link_node_id_2", - /*6*/"_topol_link_node_label_1", - /*7*/"_topol_link_node_label_2", - /*8*/"_topol_link_atom_label_1", - /*9*/"_topol_link_atom_label_2", - /*10*/"_topol_link_symop_1", - /*11*/"_topol_link_translation_1", - /*12*/"_topol_link_translation_1_x", - /*13*/"_topol_link_translation_1_y", - /*14*/"_topol_link_translation_1_z", - /*15*/"_topol_link_symop_2", - /*16*/"_topol_link_translation_2", - /*17*/"_topol_link_translation_2_x", - /*18*/"_topol_link_translation_2_y", - /*19*/"_topol_link_translation_2_z", - /*20*/"_topol_link_distance", - /*21*/"_topol_link_type", - /*22*/"_topol_link_multiplicity", - /*23*/"_topol_link_voronoi_solidangle", - /*24*/"_topol_link_order", - /*25*/"_topol_node_id", - /*26*/"_topol_node_net_id", - /*27*/"_topol_node_label", - /*28*/"_topol_node_atom_label", - /*29*/"_topol_node_symop", - /*30*/"_topol_node_translation", - /*31*/"_topol_node_translation_x", - /*32*/"_topol_node_translation_y", - /*33*/"_topol_node_translation_z", - /*34*/"_topol_node_fract_x", - /*35*/"_topol_node_fract_y", - /*36*/"_topol_node_fract_z", - /*37*/"_topol_node_chemical_formula_sum", - /*38*/"_topol_atom_id", - /*39*/"_topol_atom_atom_label", - /*40*/"_topol_atom_node_id", - /*41*/"_topol_atom_link_id", - /*42*/"_topol_atom_symop", - /*43*/"_topol_atom_translation", - /*44*/"_topol_atom_translation_x", - /*45*/"_topol_atom_translation_y", - /*46*/"_topol_atom_translation_z", - /*47*/"_topol_atom_fract_x", - /*48*/"_topol_atom_fract_y", - /*49*/"_topol_atom_fract_z", - /*50*/"_topol_atom_element_symbol", - /*51*/"_topol_link_site_symmetry_symop_1", - /*52*/"_topol_link_site_symmetry_translation_1_x", - /*53*/"_topol_link_site_symmetry_translation_1_y", - /*54*/"_topol_link_site_symmetry_translation_1_z", - /*55*/"_topol_link_site_symmetry_symop_2", - /*56*/"_topol_link_site_symmetry_translation_2_x", - /*57*/"_topol_link_site_symmetry_translation_2_y", - /*58*/"_topol_link_site_symmetry_translation_2_z", - /*59*/"_topol_link_site_symmetry_translation_1", - /*60*/"_topol_link_site_symmetry_translation_2", + /*2*/"_topol_net_special_details", + /*3*/"_topol_link_id", + /*4*/"_topol_link_net_id", + /*5*/"_topol_link_node_id_1", + /*6*/"_topol_link_node_id_2", + /*7*/"_topol_link_node_label_1", + /*8*/"_topol_link_node_label_2", + /*9*/"_topol_link_atom_label_1", + /*10*/"_topol_link_atom_label_2", + /*11*/"_topol_link_symop_1", + /*12*/"_topol_link_translation_1", + /*13*/"_topol_link_translation_1_x", + /*14*/"_topol_link_translation_1_y", + /*15*/"_topol_link_translation_1_z", + /*16*/"_topol_link_symop_2", + /*17*/"_topol_link_translation_2", + /*18*/"_topol_link_translation_2_x", + /*19*/"_topol_link_translation_2_y", + /*20*/"_topol_link_translation_2_z", + /*21*/"_topol_link_distance", + /*22*/"_topol_link_type", + /*23*/"_topol_link_multiplicity", + /*24*/"_topol_link_voronoi_solidangle", + /*25*/"_topol_link_order", + /*26*/"_topol_node_id", + /*27*/"_topol_node_net_id", + /*28*/"_topol_node_label", + /*29*/"_topol_node_atom_label", + /*30*/"_topol_node_symop", + /*31*/"_topol_node_translation", + /*32*/"_topol_node_translation_x", + /*33*/"_topol_node_translation_y", + /*34*/"_topol_node_translation_z", + /*35*/"_topol_node_fract_x", + /*36*/"_topol_node_fract_y", + /*37*/"_topol_node_fract_z", + /*38*/"_topol_node_chemical_formula_sum", + /*39*/"_topol_atom_id", + /*40*/"_topol_atom_atom_label", + /*41*/"_topol_atom_node_id", + /*42*/"_topol_atom_link_id", + /*43*/"_topol_atom_symop", + /*44*/"_topol_atom_translation", + /*45*/"_topol_atom_translation_x", + /*46*/"_topol_atom_translation_y", + /*47*/"_topol_atom_translation_z", + /*48*/"_topol_atom_fract_x", + /*49*/"_topol_atom_fract_y", + /*50*/"_topol_atom_fract_z", + /*51*/"_topol_atom_element_symbol", + /*52*/"_topol_link_site_symmetry_symop_1", + /*53*/"_topol_link_site_symmetry_translation_1_x", + /*54*/"_topol_link_site_symmetry_translation_1_y", + /*55*/"_topol_link_site_symmetry_translation_1_z", + /*56*/"_topol_link_site_symmetry_symop_2", + /*57*/"_topol_link_site_symmetry_translation_2_x", + /*58*/"_topol_link_site_symmetry_translation_2_y", + /*59*/"_topol_link_site_symmetry_translation_2_z", + /*60*/"_topol_link_site_symmetry_translation_1", + /*61*/"_topol_link_site_symmetry_translation_2", }; private final static byte topol_net_id = 0; private final static byte topol_net_label = 1; - private final static byte topol_link_id = 2; - private final static byte topol_link_net_id = 3; - private final static byte topol_link_node_id_1 = 4; - private final static byte topol_link_node_id_2 = 5; - private final static byte topol_link_node_label_1 = 6; - private final static byte topol_link_node_label_2 = 7; - private final static byte topol_link_atom_label_1 = 8; - private final static byte topol_link_atom_label_2 = 9; - private final static byte topol_link_symop_1 = 10; - private final static byte topol_link_translation_1 = 11; - private final static byte topol_link_translation_1_x = 12; - private final static byte topol_link_translation_1_y = 13; - private final static byte topol_link_translation_1_z = 14; - private final static byte topol_link_symop_2 = 15; - private final static byte topol_link_translation_2 = 16; - private final static byte topol_link_translation_2_x = 17; - private final static byte topol_link_translation_2_y = 18; - private final static byte topol_link_translation_2_z = 19; - private final static byte topol_link_distance = 20; - private final static byte topol_link_type = 21; - private final static byte topol_link_multiplicity = 22; - private final static byte topol_link_voronoi_solidangle = 23; - private final static byte topol_link_order = 24; - private final static byte topol_node_id = 25; - private final static byte topol_node_net_id = 26; - private final static byte topol_node_label = 27; - private final static byte topol_node_atom_label = 28; - private final static byte topol_node_symop = 29; - private final static byte topol_node_translation = 30; - private final static byte topol_node_translation_x = 31; - private final static byte topol_node_translation_y = 32; - private final static byte topol_node_translation_z = 33; - private final static byte topol_node_fract_x = 34; - private final static byte topol_node_fract_y = 35; - private final static byte topol_node_fract_z = 36; - private final static byte topol_node_chemical_formula_sum = 37; - private final static byte topol_atom_id = 38; - private final static byte topol_atom_atom_label = 39; - private final static byte topol_atom_node_id = 40; - private final static byte topol_atom_link_id = 41; - private final static byte topol_atom_symop = 42; - private final static byte topol_atom_translation = 43; - private final static byte topol_atom_translation_x = 44; - private final static byte topol_atom_translation_y = 45; - private final static byte topol_atom_translation_z = 46; - private final static byte topol_atom_fract_x = 47; - private final static byte topol_atom_fract_y = 48; - private final static byte topol_atom_fract_z = 49; - private final static byte topol_atom_element_symbol = 50; - private final static byte topol_link_site_symmetry_symop_1 = 51; - private final static byte topol_link_site_symmetry_translation_1_x = 52; - private final static byte topol_link_site_symmetry_translation_1_y = 53; - private final static byte topol_link_site_symmetry_translation_1_z = 54; - private final static byte topol_link_site_symmetry_symop_2 = 55; - private final static byte topol_link_site_symmetry_translation_2_x = 56; - private final static byte topol_link_site_symmetry_translation_2_y = 57; - private final static byte topol_link_site_symmetry_translation_2_z = 58; - private final static byte topol_link_site_symmetry_translation_1 = 59; - private final static byte topol_link_site_symmetry_translation_2 = 60; + private final static byte topol_net_special_details = 2; + private final static byte topol_link_id = 3; + private final static byte topol_link_net_id = 4; + private final static byte topol_link_node_id_1 = 5; + private final static byte topol_link_node_id_2 = 6; + private final static byte topol_link_node_label_1 = 7; + private final static byte topol_link_node_label_2 = 8; + private final static byte topol_link_atom_label_1 = 9; + private final static byte topol_link_atom_label_2 = 10; + private final static byte topol_link_symop_1 = 11; + private final static byte topol_link_translation_1 = 12; + private final static byte topol_link_translation_1_x = 13; + private final static byte topol_link_translation_1_y = 14; + private final static byte topol_link_translation_1_z = 15; + private final static byte topol_link_symop_2 = 16; + private final static byte topol_link_translation_2 = 17; + private final static byte topol_link_translation_2_x = 18; + private final static byte topol_link_translation_2_y = 19; + private final static byte topol_link_translation_2_z = 20; + private final static byte topol_link_distance = 21; + private final static byte topol_link_type = 22; + private final static byte topol_link_multiplicity = 23; + private final static byte topol_link_voronoi_solidangle = 24; + private final static byte topol_link_order = 25; + private final static byte topol_node_id = 26; + private final static byte topol_node_net_id = 27; + private final static byte topol_node_label = 28; + private final static byte topol_node_atom_label = 29; + private final static byte topol_node_symop = 30; + private final static byte topol_node_translation = 31; + private final static byte topol_node_translation_x = 32; + private final static byte topol_node_translation_y = 33; + private final static byte topol_node_translation_z = 34; + private final static byte topol_node_fract_x = 35; + private final static byte topol_node_fract_y = 36; + private final static byte topol_node_fract_z = 37; + private final static byte topol_node_chemical_formula_sum = 38; + private final static byte topol_atom_id = 39; + private final static byte topol_atom_atom_label = 40; + private final static byte topol_atom_node_id = 41; + private final static byte topol_atom_link_id = 42; + private final static byte topol_atom_symop = 43; + private final static byte topol_atom_translation = 44; + private final static byte topol_atom_translation_x = 45; + private final static byte topol_atom_translation_y = 46; + private final static byte topol_atom_translation_z = 47; + private final static byte topol_atom_fract_x = 48; + private final static byte topol_atom_fract_y = 49; + private final static byte topol_atom_fract_z = 50; + private final static byte topol_atom_element_symbol = 51; + private final static byte topol_link_site_symmetry_symop_1 = 52; + private final static byte topol_link_site_symmetry_translation_1_x = 53; + private final static byte topol_link_site_symmetry_translation_1_y = 54; + private final static byte topol_link_site_symmetry_translation_1_z = 55; + private final static byte topol_link_site_symmetry_symop_2 = 56; + private final static byte topol_link_site_symmetry_translation_2_x = 57; + private final static byte topol_link_site_symmetry_translation_2_y = 58; + private final static byte topol_link_site_symmetry_translation_2_z = 59; + private final static byte topol_link_site_symmetry_translation_1 = 60; + private final static byte topol_link_site_symmetry_translation_2 = 61; + public TopoCifParser() { } @@ -294,7 +304,7 @@ @Override public TopoCifParser setReader(CifReader reader) { if (!reader.checkFilterKey("TOPOL")) { - reader.appendLoadNote("This file has Topology analysis records. Use LOAD \"\" {1 1 1} FILTER \"TOPOL\" to load the topology."); + reader.appendLoadNote("This file has Topology analysis records.\nUse LOAD \"\" {1 1 1} FILTER \"TOPOL\" to load the topology."); return this; } this.reader = reader; @@ -339,8 +349,53 @@ return true; } + @Override + public void ProcessRecord(String key, String data) { + if (key.startsWith("_topol_net")) { + processSingleNet(key, data); + } + } + /** - * Process all nets. Note that tne nets list is self-populating with a "Net1" + * A single net may be represented with no loop. + * Generously allowing legacy format where _topol_net.id was a string. + * + * @param key + * @param data + */ + private void processSingleNet(String key, String data) { + if (key.equals(topolFields[topol_net_id])) { + int n = reader.parseIntStr(data); + if (n == Integer.MIN_VALUE) { + // legacy net.id was not an integer, now net.label + } else { + if (singleNet == null) { + nets.addLast(singleNet = new TNet(netCount++, n, "Net" + n, null)); + } else { + singleNet.id = n; + } + return; + } + } else if (key.equals(topolFields[topol_net_special_details])) { + if (singleNet == null) { + nets.addLast(singleNet = new TNet(netCount++, 1, null, data)); + } else { + singleNet.specialDetails = data; + } + return; + } else if (!key.equals(topolFields[topol_net_label])) { + return; + } + // net.label + if (singleNet == null) { + nets.addLast(singleNet = new TNet(netCount++, 1, data, null)); + } else { + singleNet.label = data; + } + } + + /** + * Process all nets. Note that the nets list is self-populating with a "Net1" * value if there is no TOPOL_NET section. * * @throws Exception @@ -347,11 +402,12 @@ */ private void processNets() throws Exception { while (cifParser.getData()) { - int id = getInt(getField(topol_net_id)); + int id = getInt(getDataValue(topol_net_id)); if (id < 0) id = 0; - String netLabel = getField(topol_net_label); + String netLabel = getDataValue(topol_net_label); TNet net = getNetFor(id, netLabel); + net.specialDetails = getDataValue(topol_net_special_details); net.line = reader.line; } } @@ -358,7 +414,7 @@ private void processLinks() throws Exception { while (cifParser.getData()) { - String type = ("" + getField(topol_link_type)).toLowerCase(); + String type = ("" + getDataValue(topol_link_type)).toLowerCase(); if (allowedTypes != null && allowedTypes.indexOf("+" + type + "+") < 0) continue; TLink link = new TLink(); @@ -376,7 +432,7 @@ case topol_link_net_id: int id = getInt(field); if (id == Integer.MIN_VALUE) { - // original + // original, legacy -- net.id value is "net1" link.netLabel = field; } else { link.netID = getInt(field); @@ -383,28 +439,26 @@ } break; case topol_link_node_id_1: - link.id1 = getInt(field); + link.nodeIds[0] = getInt(field); break; case topol_link_node_id_2: - link.id2 = getInt(field); + link.nodeIds[1] = getInt(field); break; - case topol_link_node_label_1: - case topol_link_atom_label_1: // - if (link.label1 == null) - link.label1 = field; + case topol_link_atom_label_1: + case topol_link_node_label_1: // legacy + link.atomLabels[0] = field; break; case topol_link_atom_label_2: - case topol_link_node_label_2: - if (link.label2 == null) - link.label2 = field; + case topol_link_node_label_2: // legacy + link.atomLabels[1] = field; break; case topol_link_site_symmetry_symop_1: case topol_link_symop_1: - link.symop1 = getInt(field) - 1; + link.symops[0] = getInt(field) - 1; break; case topol_link_site_symmetry_symop_2: case topol_link_symop_2: - link.symop2 = getInt(field) - 1; + link.symops[1] = getInt(field) - 1; break; case topol_link_order: link.topoOrder = getInt(field); @@ -447,44 +501,6 @@ } } - private int[] processTranslation(int p, int[] t, String field) { - switch (p) { - case topol_link_site_symmetry_translation_1: - case topol_link_site_symmetry_translation_2: - case topol_link_translation_1: - case topol_link_translation_2: - case topol_node_translation: - case topol_atom_translation: - t = Cif2DataParser.getIntArrayFromStringList(field, 3); - break; - case topol_link_site_symmetry_translation_1_x: - case topol_link_site_symmetry_translation_2_x: - case topol_link_translation_1_x: - case topol_link_translation_2_x: - case topol_node_translation_x: - case topol_atom_translation_x: - t[0] = getInt(field); - break; - case topol_link_site_symmetry_translation_1_y: - case topol_link_site_symmetry_translation_2_y: - case topol_link_translation_1_y: - case topol_link_translation_2_y: - case topol_node_translation_y: - case topol_atom_translation_y: - t[1] = getInt(field); - break; - case topol_link_site_symmetry_translation_1_z: - case topol_link_site_symmetry_translation_2_z: - case topol_link_translation_1_z: - case topol_link_translation_2_z: - case topol_node_translation_z: - case topol_atom_translation_z: - t[2] = getInt(field); - break; - } - return t; - } - private void processNodes() throws Exception { while (cifParser.getData()) { TNode node = new TNode(); @@ -583,6 +599,44 @@ } } + private int[] processTranslation(int p, int[] t, String field) { + switch (p) { + case topol_link_site_symmetry_translation_1: + case topol_link_site_symmetry_translation_2: + case topol_link_translation_1: + case topol_link_translation_2: + case topol_node_translation: + case topol_atom_translation: + t = Cif2DataParser.getIntArrayFromStringList(field, 3); + break; + case topol_link_site_symmetry_translation_1_x: + case topol_link_site_symmetry_translation_2_x: + case topol_link_translation_1_x: + case topol_link_translation_2_x: + case topol_node_translation_x: + case topol_atom_translation_x: + t[0] = getInt(field); + break; + case topol_link_site_symmetry_translation_1_y: + case topol_link_site_symmetry_translation_2_y: + case topol_link_translation_1_y: + case topol_link_translation_2_y: + case topol_node_translation_y: + case topol_atom_translation_y: + t[1] = getInt(field); + break; + case topol_link_site_symmetry_translation_1_z: + case topol_link_site_symmetry_translation_2_z: + case topol_link_translation_1_z: + case topol_link_translation_2_z: + case topol_node_translation_z: + case topol_atom_translation_z: + t[2] = getInt(field); + break; + } + return t; + } + /** * PRIOR to symmetry application, process all internal symop/translation aspects. */ @@ -594,31 +648,27 @@ cifParser = null; reader.applySymmetryToBonds = true; // finalize all topol_atom symmetries - M4[] ops = getOperations(); + Lst<String> symops = reader.symops; + int nOps = symops.size(); + ops = new M4[nOps]; + for (int i = 0; i < nOps; i++) { + ops[i] = SymmetryOperation.getMatrixFromXYZ("!" + symops.get(i)); + } for (int i = 0; i < atoms.size(); i++) { - atoms.get(i).finalizeAtom(ops); + atoms.get(i).finalizeAtom(); } - - SymmetryInterface sym = reader.getSymmetry(); + // sym is used only to allow conversion to Cartesian coordinates for the link distance finalization + sym = reader.getSymmetry(); // we do not have to finalize nodes directly -- finalizeLink will take care of that. for (int i = 0; i < links.size(); i++) { - links.get(i).finalizeLink(ops, sym); + links.get(i).finalizeLink(); } - if (reader.doApplySymmetry) + if (reader.doApplySymmetry) { reader.applySymmetryAndSetTrajectory(); + } return true; } - private M4[] getOperations() { - Lst<String> symops = reader.symops; - int nOps = symops.size(); - ops = new M4[nOps]; - for (int i = 0; i < nOps; i++) { - ops[i] = SymmetryOperation.getMatrixFromXYZ("!" + symops.get(i)); - } - return ops; - } - /** * Symmetry has been applied. Identify all of the connected atoms and process the group associations * @@ -631,14 +681,8 @@ BS bsConnected = new BS(); // atoms that are linked BS bsAtoms = new BS(); // atoms that are associated or connected; int nLinks = processAssociations(bsConnected, bsAtoms); - bsAtoms.or(bsConnected); // create the excluded atoms set -- atoms of bsAtoms that are linked - BS bsExclude = new BS(); - for (int pt = 0, i = bsAtoms.nextSetBit(0); i >= 0; i = bsAtoms.nextSetBit(i + 1)) { - while (bsAtoms.get(i)) { - bsExclude.setBitTo(pt++, bsConnected.get(i++)); - } - } + BS bsExclude = shiftBits(bsAtoms, bsConnected); // If we have a network, remove all unconnected atoms. if (bsConnected.cardinality() > 0) { reader.asc.bsAtoms = bsAtoms; @@ -646,29 +690,49 @@ } reader.appendLoadNote("TopoCifParser created " + bsConnected.cardinality() + " nodes and " + nLinks + " links"); - // add model info + // add auxiliaryInfo.models[i].topology Lst<Map<String, Object>> info = new Lst<Map<String, Object>>(); for (int i = 0, n = links.size(); i < n; i++) { - info.addLast(links.get(i).getInfo()); + info.addLast(links.get(i).getLinkInfo()); } reader.asc.setCurrentModelInfo("topology", info); - String script = "display displayed or " + nets.get(0).label + "__*"; + String script = "if (autobond) {delete !connected && !(atomName LIKE '*_Link*' or atomName LIKE '*_Node*')}; display displayed or " + nets.get(0).label + "__*"; reader.addJmolScript(script); for (int i = 0; i < nets.size(); i++) { - nets.get(i).setNote(); + nets.get(i).finalizeNet(); } } /** - * Find and process all "bonds" associated with all links and nodes. + * Shift bits to the left to account for missing atoms in the final atom list. * + * @param bsAtoms + * @param bs + * @return shifted bitset + */ + static BS shiftBits(BS bsAtoms, BS bs) { + BS bsNew = new BS(); + for (int pt = 0, i = bsAtoms.nextSetBit(0); i >= 0; i = bsAtoms.nextSetBit(i + 1)) { + while (bsAtoms.get(i)) { + bsNew.setBitTo(pt++, bs.get(i++)); + } + } + return bsNew; + } + + /** + * Find and process all "bonds" associated with all links and nodes. This + * method runs AFTER generation of all the symmetry-related atoms. + * * BOND_LINK + index indicates linked nodes * * BOND_GROUP + index indicates associated nodes * * - * @param bsConnected prevent Jmol from adding bonds to this atom - * @param bsAtoms allow Jmol to add bonds to these atoms, inclusively + * @param bsConnected + * prevent Jmol from adding bonds to this atom + * @param bsAtoms + * allow Jmol to add bonds to these atoms, inclusively * * @return number of bonds created */ @@ -676,7 +740,7 @@ int nlinks = 0; Atom[] atoms = reader.asc.atoms; - + // set associations for links and nodes for (int i = reader.asc.ac; --i >= ac0;) { Atom a = atoms[i]; @@ -690,23 +754,20 @@ node.bsAtoms.set(i0 + a.index); } else { TLink link = getAssoiatedLinkByIdx(-idx - 1); - if (link.bsAtoms == null) - link.bsAtoms = new BS(); - link.bsAtoms.set(i0 + a.index); + if (link != null) { + if (link.bsAtoms == null) + link.bsAtoms = new BS(); + link.bsAtoms.set(i0 + a.index); + } } bsAtoms.set(a.index); - } + } + boolean checkDistance = reader.doPackUnitCell; // finish up with bonds Bond[] bonds = reader.asc.bonds; for (int i = reader.asc.bondCount; --i >= bc0;) { Bond b = bonds[i]; -// if (!isEqualD(atoms[b.atomIndex1], atoms[b.atomIndex2], b.distance)) { -// bonds[i] = null; -// bsAtoms.set(b.atomIndex1); -// bsAtoms.set(b.atomIndex2); -// continue; -// } if (b.order >= TOPOL_GROUP) { // associated atoms - don't show this bond bonds[i] = null; @@ -713,26 +774,29 @@ } else if (b.order >= TOPOL_LINK) { // adjust link bond order, and add this bond to the link's bsBonds bitset b.order -= TOPOL_LINK; - int id = b.order >> LINK_TYPE_BITS; - TLink link = getLinkById(id); - link.bsBonds.set(b0 + i); + TLink link = getAssoiatedLinkByIdx(b.order >> LINK_TYPE_BITS); + if (checkDistance && Math.abs(calculateDistance(atoms[b.atomIndex1], atoms[b.atomIndex2]) - link.distance) >= ERROR_TOLERANCE) { + bonds[i] = null; + continue; + } + link.bsBonds.set(b0 + i); switch (b.order & 0xF) { default: b.order = Edge.BOND_COVALENT_SINGLE; break; - case LINK_TYPE_DOUB: + case LINK_TYPE_DOUBLE: b.order = Edge.BOND_COVALENT_DOUBLE; break; - case LINK_TYPE_TRIP: + case LINK_TYPE_TRIPLE: b.order = Edge.BOND_COVALENT_TRIPLE; break; - case LINK_TYPE_QUAD: + case LINK_TYPE_QUADRUPLE: b.order = Edge.BOND_COVALENT_QUADRUPLE; break; - case LINK_TYPE_QUIN: + case LINK_TYPE_QUINTUPLE: b.order = Edge.BOND_COVALENT_QUINTUPLE; break; - case LINK_TYPE_HEX: + case LINK_TYPE_SEXTUPLE: b.order = Edge.BOND_COVALENT_sextuple; break; case LINK_TYPE_POLY: @@ -748,21 +812,44 @@ case LINK_TYPE_VDW: b.order = Edge.BOND_PARTIAL01; break; - } + } bsConnected.set(b.atomIndex1); bsConnected.set(b.atomIndex2); nlinks++; } - } + } + + bsAtoms.or(bsConnected); + + for (int i = nodes.size(); --i >= 0;) { + TNode node = nodes.get(i); + if (node.bsAtoms != null) { + node.bsAtoms = shiftBits(bsAtoms, node.bsAtoms); + } + } + + for (int i = links.size(); --i >= 0;) { + TLink link = links.get(i); + if (link.bsAtoms != null) { + link.bsAtoms = shiftBits(bsAtoms, link.bsAtoms); + } + } + return nlinks; } -// static boolean isEqualD(T3 p1, T3 p2, double d) { -// return (Double.isNaN(d) || Math.abs(p1.distance(p2) - d) < ERROR_TOLERANCE); -// } -// - private String getField(byte field) { - String f = reader.getField(field); + static boolean isEqualD(T3 p1, T3 p2, double d) { + return (Double.isNaN(d) || Math.abs(p1.distance(p2) - d) < ERROR_TOLERANCE); + } + + /** + * Read the data value. + * + * @param key + * @return the value or null if does not exist or is '.' or '?' + */ + private String getDataValue(byte key) { + String f = reader.getField(key); return ("\0".equals(f) ? null : f); } @@ -774,49 +861,35 @@ return (f == null ? Float.NaN : reader.parseFloatStr(f)); } - @Override - public void ProcessRecord(String key, String data) { - if (key.startsWith("_topol_net")) { - if (key.endsWith("_id")) { - int n = Integer.parseInt(data); - if (singleNet == null) { - nets.addLast(singleNet = new TNet(netCount++, n, "Net" + n)); - } else { - singleNet.id = n; - } - } else if (key.endsWith("_label")) { - if (singleNet == null) { - nets.addLast(singleNet = new TNet(netCount++, 1, data)); - } else { - singleNet.label = data; - } - } - } - } - private class TNet { @SuppressWarnings("unused") String line; - @SuppressWarnings("unused") - int idx; int id; int nLinks, nNodes; String label; - public boolean hasAtoms; + String specialDetails; - TNet(int index, int id, String label) { + @SuppressWarnings("unused") + int idx; + boolean hasAtoms; + + TNet(int index, int id, String label, String specialDetails) { idx = index; this.id = id; this.label = label; + this.specialDetails = specialDetails; } - void setNote() { + void finalizeNet() { String netKey = "," + id + ","; if (netNotes.indexOf(netKey) < 0) { reader.appendLoadNote( - "Net " + label + " created with " + nLinks + " links and " + nNodes + " nodes.\n" - + "Use DISPLAY " + (hasAtoms ? label + "__* to display it without associated atoms or " + label - + "_* to display it with its associated atoms" : label + "** to display it" + "Net " + label + + (specialDetails == null ? "" : " '" + specialDetails + "'") + + " created with " + nLinks + " links and " + nNodes + " nodes.\n" + + "Use DISPLAY " + + (hasAtoms ? label + "__* to display it without associated atoms\nUse DISPLAY " + label + + "_* to display it with its associated atoms" : label + "* to display it" +"") ); } @@ -825,9 +898,9 @@ private class TAtom extends Atom { + // from CIF data: @SuppressWarnings("unused") int id; - String atomLabel; int nodeID; int linkID; @@ -834,14 +907,13 @@ int symop = 0; private P3 trans = new P3(); String formula; + String line; - Atom atom; + + // derived private boolean isFinalized; @SuppressWarnings("unused") int idx; - - @SuppressWarnings("unused") - String line; TAtom() { super(); @@ -877,14 +949,11 @@ return true; } - void finalizeAtom(M4[] ops) throws Exception { + void finalizeAtom() throws Exception { if (isFinalized) return; isFinalized = true; - Atom a = atom; - if (a == null && atomLabel != null) { - a = reader.asc.getAtomFromName(atomLabel); - } + Atom a = getAtomFromName(atomLabel); setElementSymbol(this, formula); if (a == null && Float.isNaN(x)) { // no associated atom @@ -895,8 +964,6 @@ TNode node = null; if (nodeID > 0) { node = getNodeById(nodeID, -1, null); - // else if (atomLabel != null) - // node = (TNode) getTopo(nodes, atomLabel, 'n'); if (node != null) { node.addAtom(this); } @@ -909,23 +976,19 @@ if (link != null) link.addAtom(this); } + if (node == null && link == null) { System.out.println("TAtom " + this + " ignored"); return; } - // set the symmetry op [tx ty tz] - if (a != null && (a == atom || Float.isNaN(x))) { + // transfer fields and set the symmetry op [tx ty tz] + if (a != null && Float.isNaN(x)) { setTAtom(a, this); applySymmetry(this, ops, symop, trans); } // add this atom to the AtomSetCollection -// if (node != null && node.atomLabel == null) { -// node.atomLabel = node.atomName = node.netLabel + "__" + atomName; -// if (node.label == null) -// node.label = node.atomLabel; -// } atomName = (node != null ? "Node_" + nodeID + "_" : link != null ? "Link_" + linkID + "_" : "TAtom_") + atomLabel; System.out.println("TAtom adding " + this); @@ -932,6 +995,15 @@ reader.addCifAtom(this, atomName, null, null); } + private TLink getLinkById(int linkID) { + for (int i = links.size(); --i >= 0;) { + TLink l = links.get(i); + if (l.id == linkID) + return l; + } + return null; + } + @Override public String toString() { return line + " " + super.toString(); @@ -984,7 +1056,6 @@ public String formula; public String atomLabel; int netID; - String netLabel; String label; int symop = 0; P3 trans = new P3(); @@ -1044,8 +1115,7 @@ } } if (net == null) - net = getNetFor(netID, netLabel); - netLabel = net.label; + net = getNetFor(netID, null); netID = net.id; return true; } @@ -1063,15 +1133,14 @@ boolean haveXYZ = !Float.isNaN(x); Atom a; if (tatoms == null) { - a = (atom != null ? atom - : atomLabel == null ? null : getAtomFromName(atomLabel)); + a = (atom == null ? getAtomFromName(atomLabel) : atom); setElementSymbol(this, formula == null ? a.elementSymbol : formula); if (a == null && !haveXYZ) { // no assigned atom_site // no associated atom // no defined xyz - throw new Exception( - "TopoCIFParser.finalizeNode no atom " + atomLabel + " line=" + line); + throw new Exception("TopoCIFParser.finalizeNode no atom " + atomLabel + + " line=" + line); } } else { setCentroid(); @@ -1093,17 +1162,18 @@ } a = this; } - if (a == atom || !haveXYZ) { + if ((a != null && a == atom) || !haveXYZ) { if (a != this) { setTAtom(a, this); } applySymmetry(this, ops, symop, trans); } - atomName = netLabel + "__"; + atomName = net.label + "__"; if (label != null && label.startsWith(atomName)) { atomName = ""; } - atomName += (label != null ? label : atomLabel != null ? atomLabel : "Node_" + id); + atomName += (label != null ? label + : atomLabel != null ? atomLabel : "Node_" + id); addNode(); } @@ -1162,7 +1232,7 @@ } /** - * A class to hold the _topol block information and transform it as needed. A + * A class to hold the TOPOL_LINK data item information and transform it as needed. A * key field is the primitives array of TopoPrimitives. These structures allow * us to create a set of "primitive" operation results that operate * specifically on the links themselves. Rather than showing those links (as @@ -1177,12 +1247,13 @@ private class TLink extends Bond { int id; + int[] nodeIds = new int[2]; + String[] atomLabels = new String[2]; + int[] symops = new int[2]; + P3[] translations = new P3[2]; + int netID; String netLabel; - int id1, id2; - String label1, label2; - int symop1, symop2; - P3 trans1, trans2; String type = ""; int multiplicity; int topoOrder; @@ -1194,7 +1265,7 @@ int idx; TNet net; - TNode node1, node2; + TNode[] linkNodes = new TNode[2]; int typeBondOrder; @@ -1201,7 +1272,6 @@ Lst<TAtom> tatoms; BS bsAtoms = null; BS bsBonds = new BS(); - @SuppressWarnings("unused") private String line; public TLink() { @@ -1211,12 +1281,12 @@ boolean setLink(int[] t1, int[] t2, String line) { this.line = line; idx = linkCount++; - if (id2 == 0) - id2 = id1; - typeBondOrder = getBondType(type); + if (nodeIds[1] == 0) + nodeIds[1] = nodeIds[0]; + typeBondOrder = getBondType(type, topoOrder); // only a relative lattice change is necessary here. - trans1 = P3.new3(t1[0], t1[1], t1[2]); - trans2 = P3.new3(t2[0], t2[1], t2[2]); + translations[0] = P3.new3(t1[0], t1[1], t1[2]); + translations[1] = P3.new3(t2[0], t2[1], t2[2]); System.out.println("TopoCifParser.setLink " + this); return true; } @@ -1227,144 +1297,84 @@ tatoms.add(atom); } - Map<String, Object> getInfo() { - Hashtable<String, Object> info = new Hashtable<String, Object>(); - info.put("index", Integer.valueOf(idx + 1)); - if (id > 0) - info.put("id", Integer.valueOf(id)); - if (id1 > 0) - info.put("id1", Integer.valueOf(id1)); - if (id2 > 0) - info.put("id2", Integer.valueOf(id2)); - info.put("distance", Float.valueOf(cartesianDistance)); - info.put("netID", Integer.valueOf(netID)); - info.put("netLabel", netLabel); - info.put("label1", node1.atomName); - info.put("label2", node2.atomName); - if (!Float.isNaN(distance)) - info.put("distance", Float.valueOf(distance)); - info.put("symop1", Integer.valueOf(symop1 + 1)); - info.put("symop2", Integer.valueOf(symop2 + 1)); - info.put("translation1", trans1); - info.put("translation2", trans2); - info.put("multiplicity", Integer.valueOf(multiplicity)); - if (type != null) - info.put("type", type); - info.put("voronoiSolidAngle", Float.valueOf(voronoiAngle)); - // derived - info.put("atomIndex1", Integer.valueOf(i0 + node1.index)); - info.put("atomIndex2", Integer.valueOf(i0 + node2.index)); - if (bsAtoms != null && bsAtoms.cardinality() > 0) - info.put("representedAtoms", bsAtoms); - info.put("topoOrder", Integer.valueOf(topoOrder)); - info.put("order", Integer.valueOf(typeBondOrder)); - return info; - } - - String info() { - return "[link " + line + " : " + distance + "]"; - } - - @Override - public String toString() { - return info(); - } - /** * Take all actions prior to applying symmetry. Specifically, create any * nodes and atoms * - * @param ops - * @param sym - * * @throws Exception */ - void finalizeLink(M4[] ops, SymmetryInterface sym) throws Exception { - node1 = addLinkNodeIfNull(id1, label1, symop1, trans1); - node2 = addLinkNodeIfNull(id2, label2, symop2, trans2); - if (node1 == null || node2 == null) { - Logger.warn("TopoCifParser atom " - + (node1 == null ? label1 : label2) + " could not be found"); - return; - } - // check for the same node (but different symmetry, then) - if (node1 == node2) { - node2 = node1.copy(); - } - node1.finalizeNode(ops); - node2.finalizeNode(ops); - applySymmetry(node1, ops, symop1, trans1); - applySymmetry(node2, ops, symop2, trans2); + void finalizeLink() throws Exception { + finalizeLinkNode(0); + finalizeLinkNode(1); - - // set the Bond fields, encoding the order field with "link", id, and typeBondOrder - atomIndex1 = node1.index; - atomIndex2 = node2.index; - order = TOPOL_LINK + (id << LINK_TYPE_BITS) + typeBondOrder; - - temp1.setT(node1); - temp2.setT(node2); - sym.toCartesian(temp1, true); - sym.toCartesian(temp2, true); - distance = temp1.distance(temp2); - if (cartesianDistance != 0 && Math.abs(distance - cartesianDistance) >= ERROR_TOLERANCE) - System.err.println("Distance error! distance=" + distance + " for " + line); - System.out.println("link d=" + distance + " " + this + node1 + node2); - // encode the associated atom sequence number with this link's id. if (tatoms != null) { -// TAtom aa = tatoms.get(0); -// aa.finalizeAtom(ops); -// aa.sequenceNumber = -idx - 1; -// aa.atomName = net.label + "_" + aa.atomName; + net.hasAtoms = true; for (int i = tatoms.size(); --i >= 0;) { TAtom a = tatoms.get(i); - a.finalizeAtom(ops); a.sequenceNumber = -idx - 1; a.atomName = net.label + "_" + a.atomName; } } + // set the Bond fields, encoding the order field with "link", id, and typeBondOrder + + order = TOPOL_LINK + (idx << LINK_TYPE_BITS) + typeBondOrder; + distance = calculateDistance(linkNodes[0], linkNodes[1]); + if (cartesianDistance != 0 && Math.abs(distance - cartesianDistance) >= ERROR_TOLERANCE) + System.err.println("Distance error! distance=" + distance + " for " + line); + System.out.println("link d=" + distance + " " + this + linkNodes[0] + linkNodes[1]); + reader.asc.addBond(this); } /** - * @param id - * @param nodeLabel - * @param nodeOp - * @param nodeTrans - * @return the node + * + * @param index 0 or 1 * @throws Exception */ - private TNode addLinkNodeIfNull(int id, String nodeLabel, int nodeOp, - P3 nodeTrans) - throws Exception { + private void finalizeLinkNode(int index) throws Exception { + int id = nodeIds[index]; + String atomLabel = atomLabels[index]; + int op = symops[index]; + P3 trans = translations[index]; + // first check is for a node based on id - TNode node = getNodeWithSym(id, nodeLabel, nodeOp, nodeTrans); + TNode node = getNodeWithSym(id, atomLabel, op, trans); TNode node0 = node; if (node == null) { - node = getNodeWithSym(id, nodeLabel, -1, null); + node = getNodeWithSym(id, atomLabel, -1, null); } // second check is for an atom_site atom with this label - Atom atom = (node == null ? getAtomFromName(nodeLabel) : null); + Atom atom = (node == null ? getAtomFromName(atomLabel) : null); // we now either have a node or an atom_site atom or we have a problem if (atom != null) { setNet(null); - node = new TNode(atomCount++, atom, net, nodeOp, nodeTrans); + node = new TNode(atomCount++, atom, net, op, trans); } else if (node != null) { setNet(node); if (node0 == null) node = node.copy(); - node.linkSymop = nodeOp; - node.linkTrans = nodeTrans; + node.linkSymop = op; + node.linkTrans = trans; } else { throw new Exception( - "TopoCIFParser.addNodeIfNull no atom or node " + nodeLabel + " line=" + line); + "TopoCIFParser.addNodeIfNull no atom or node " + atomLabel + " line=" + line); } nodes.addLast(node); - return node; + linkNodes[index] = node; + // check for the same node (but different symmetry, of course) + if (index == 1 && node == linkNodes[0]) { + linkNodes[1] = node.copy(); + } + node.finalizeNode(ops); + applySymmetry(node, ops, op, trans); + if (index == 0) + atomIndex1 = node.index; + else + atomIndex2 = node.index; } private void setNet(TNode node) { @@ -1395,6 +1405,52 @@ } return null; } + + Map<String, Object> getLinkInfo() { + Hashtable<String, Object> info = new Hashtable<String, Object>(); + info.put("index", Integer.valueOf(idx + 1)); + if (id > 0) + info.put("id", Integer.valueOf(id)); + info.put("netID", Integer.valueOf(netID)); + info.put("netLabel", netLabel); + if (atomLabels[0] != null) + info.put("atomLabel1", atomLabels[0]); + if (atomLabels[1] != null) + info.put("atomLabel2", atomLabels[1]); + if (nodeIds[0] > 0) + info.put("nodeId1", Integer.valueOf(nodeIds[0])); + if (nodeIds[1] > 0) + info.put("nodeId2", Integer.valueOf(nodeIds[1])); + info.put("distance", Float.valueOf(cartesianDistance)); + if (!Float.isNaN(distance)) + info.put("distance", Float.valueOf(distance)); + info.put("symops1", Integer.valueOf(symops[0] + 1)); + info.put("symops2", Integer.valueOf(symops[1] + 1)); + info.put("translation1", translations[0]); + info.put("translation2", translations[1]); + info.put("multiplicity", Integer.valueOf(multiplicity)); + if (type != null) + info.put("type", type); + info.put("voronoiSolidAngle", Float.valueOf(voronoiAngle)); + // derived + info.put("atomIndex1", Integer.valueOf(i0 + linkNodes[0].index)); + info.put("atomIndex2", Integer.valueOf(i0 + linkNodes[1].index)); + if (bsAtoms != null && bsAtoms.cardinality() > 0) + info.put("representedAtoms", bsAtoms); + info.put("topoOrder", Integer.valueOf(topoOrder)); + info.put("order", Integer.valueOf(typeBondOrder)); + return info; + } + + String info() { + return "[link " + line + " : " + distance + "]"; + } + + @Override + public String toString() { + return info(); + } + } /** @@ -1408,22 +1464,29 @@ if (n.id == id) return n; } - TNet n = new TNet(netCount++, id, "Net" + id); + TNet n = new TNet(netCount++, id, "Net" + id, null); nets.addLast(n); return n; } - public Atom getAtomFromName(String name) { - name = name.substring(name.lastIndexOf("_") + 1); - return reader.asc.getAtomFromName(name); + public Atom getAtomFromName(String atomLabel) { + return (atomLabel == null ? null : reader.asc.getAtomFromName(atomLabel)); } + float calculateDistance(P3 p1, P3 p2) { + temp1.setT(p1); + temp2.setT(p2); + sym.toCartesian(temp1, true); + sym.toCartesian(temp2, true); + return temp1.distance(temp2); + } + /** - * Find or create a TNet. + * Find or create a TNet for this id and label. * - * @param id - * @param label - * @return a net + * @param id or null + * @param label or null + * @return a net, never null */ public TNet getNetFor(int id, String label) { TNet net = null; @@ -1430,7 +1493,13 @@ if (id > 0) { net = getNetByID(id); } else if (label != null) { - net = (TNet) getTopo(nets, label, 'N'); + for (int i = nets.size(); --i >= 0;) { + TNet n = nets.get(i); + if (n.label.equals(label)) { + net = n; + break; + } + } } if (net == null) { net = getNetByID(id < 1 ? 1 : id); @@ -1437,18 +1506,15 @@ } if (label != null) net.label = label; - return net; -} - - TLink getAssoiatedLinkByIdx(int idx) { - for (int i = links.size(); --i >= 0;) { - TLink l = links.get(i); - if (l.idx == idx) - return l; - } - return null; + return net; } + /** + * Find the node for this TAtom. + * + * @param idx + * @return the node or null + */ TNode getAssociatedNodeByIdx(int idx) { for (int i = nodes.size(); --i >= 0;) { TNode n = nodes.get(i); @@ -1458,15 +1524,29 @@ return null; } - public TLink getLinkById(int linkID) { + /** + * Find the link for this TAtom. + * + * @param idx + * @return the link or null + */ + TLink getAssoiatedLinkByIdx(int idx) { for (int i = links.size(); --i >= 0;) { TLink l = links.get(i); - if (l.id == linkID) + if (l.idx == idx) return l; } return null; } + /** + * Called from TLink and TAtom to find a node with the given symmetry. + * + * @param nodeID + * @param op + * @param trans + * @return the node, or null if no such node was found + */ public TNode getNodeById(int nodeID, int op, P3 trans) { for (int i = nodes.size(); --i >= 0;) { TNode n = nodes.get(i); @@ -1476,30 +1556,5 @@ return null; } - public Object getTopo(Lst<?> l, String label, char type) { - for (int i = 0; i < l.size(); i++) { - Object o = l.get(i); - switch (type) { - case 'a': - if (((TAtom) o).atomLabel.equals(label)) - return o; - continue; - case 'n': - String s = ((TNode) o).label; - if (s != null && s.equals(label)) - return o; - continue; - case 'N': - if (((TNet) o).label.equals(label)) - return o; - continue; - default: - return null; - } - } - return null; - } - - } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java 2021-09-03 14:05:34 UTC (rev 22225) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java 2021-09-05 23:41:26 UTC (rev 22226) @@ -76,6 +76,7 @@ public boolean ignoreSymmetry; // CIF _atom_site_disorder_group -1 + public String typeSymbol; // CIF only public Atom() { set(Float.NaN, Float.NaN, Float.NaN); Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2021-09-03 14:05:34 UTC (rev 22225) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2021-09-05 23:41:26 UTC (rev 22226) @@ -226,8 +226,11 @@ protected P3 unitCellOffset; private boolean unitCellOffsetFractional; private Lst<String> moreUnitCellInfo; - - + public T3 paramsLattice; + public boolean paramsCentroid; + private boolean paramsPacked; + + protected String filePath; protected String fileName; @@ -614,6 +617,9 @@ symmetryRange = (htParams.containsKey("symmetryRange") ? ((Float) htParams .get("symmetryRange")).floatValue() : 0); + paramsLattice = (T3) htParams.get("lattice"); + paramsCentroid = htParams.containsKey("centroid"); + paramsPacked = htParams.containsKey("packed"); initializeSymmetryOptions(); //this flag FORCES symmetry -- generally if coordinates are not fractional, //we may note the unit cell, but we do not apply symmetry @@ -668,7 +674,7 @@ protected void initializeSymmetryOptions() { latticeCells = new int[4]; doApplySymmetry = false; - T3 pt = (T3) htParams.get("lattice"); + T3 pt = paramsLattice; if (pt == null || pt.length() == 0) { if (!forcePacked && strSupercell == null) return; @@ -679,10 +685,10 @@ latticeCells[2] = (int) pt.z; if (pt instanceof T4) latticeCells[3] = (int) ((T4) pt).w; - doCentroidUnitCell = (htParams.containsKey("centroid")); + doCentroidUnitCell = paramsCentroid; if (doCentroidUnitCell && (latticeCells[2] == -1 || latticeCells[2] == 0)) latticeCells[2] = 1; - boolean isPacked = forcePacked || htParams.containsKey("packed"); + boolean isPacked = forcePacked || paramsPacked; centroidPacked = doCentroidUnitCell && isPacked; doPackUnitCell = !doCentroidUnitCell && (isPacked || latticeCells[2] < 0); doApplySymmetry = (latticeCells[0] > 0 && latticeCells[1] > 0); @@ -971,8 +977,8 @@ public boolean doReadMolecularOrbitals; protected boolean reverseModels; private String nameRequired; - boolean doCentroidUnitCell; - boolean centroidPacked; + public boolean doCentroidUnitCell; + public boolean centroidPacked; public String strSupercell; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2023-09-12 17:24:20
|
Revision: 22560 http://sourceforge.net/p/jmol/code/22560 Author: hansonr Date: 2023-09-12 17:24:17 +0000 (Tue, 12 Sep 2023) Log Message: ----------- Adapted code from patch #40 AmsReader as subclass of AdfReader. All changes need testing with actual files. Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/quantum/AdfReader.java trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java Added Paths: ----------- trunk/Jmol/src/org/jmol/adapter/readers/quantum/AmsReader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/AdfReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/AdfReader.java 2023-09-12 15:04:48 UTC (rev 22559) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/AdfReader.java 2023-09-12 17:24:17 UTC (rev 22560) @@ -61,6 +61,10 @@ * that the atomic Slater description uses Cartesian orbitals, * but the MO refers to spherical orbitals. * + *<p> Added note (Diego Garay) -- 07/2023 + * Fixed support for geometry optimizations and frequencies, as + * only the first model (initial geometry) was being parsed for + * recent versions of ADF * * @author Bradley A. Smith (ye...@ho...) * @version 1.0 @@ -68,44 +72,65 @@ public class AdfReader extends SlaterReader { - private Map<String, SymmetryData> htSymmetries; - private Lst<SymmetryData> vSymmetries; - private String energy = null; - private int nXX = 0; - private String symLine; + protected Map<String, SymmetryData> htSymmetries; + protected Lst<SymmetryData> vSymmetries; + protected String energy; + protected String bondingEnergy; + protected int nXX = 0; + protected String symLine; + protected boolean isADF; @Override + public void initializeReader() { + isADF = true; + } + + + @Override protected boolean checkLine() throws Exception { - - if (line.indexOf("Irreducible Representations, including subspecies") >= 0) { + if (line + .indexOf("Irreducible Representations, including subspecies") >= 0) { readSymmetries(); - return true; + line = null; } - if (line.indexOf("S F O s *** (Symmetrized Fragment Orbitals) ***") >= 0) { + if (line + .indexOf("S F O s *** (Symmetrized Fragment Orbitals) ***") >= 0) { readSlaterBasis(); // Cartesians - return true; + line = null; } - if (line.indexOf(" Coordinates (Cartesian, in Input Orientation)") >= 0 - || line.indexOf("G E O M E T R Y ***") >= 0) { + + if (line.indexOf("current energy") >= 0) { + String[] tokens = PT.getTokens(line); + energy = tokens[2]; + // no return true??? + } + + if (isADF ? + line.indexOf(" Coordinates (Cartesian)") >= 0 + || line.indexOf("G E O M E T R Y ***") >= 0 + : line.indexOf("Formula:") >= 0) { if (!doGetModel(++modelNumber, null)) return checkLastModel(); readCoordinates(); return true; } - if (line.indexOf(" ====== Eigenvectors (rows) in BAS representation") >= 0) { + if (line + .indexOf(" ====== Eigenvectors (rows) in BAS representation") >= 0) { if (doReadMolecularOrbitals) readMolecularOrbitals(PT.getTokens(symLine)[1]); return true; } - if (!doProcessLines) + if (!doProcessLines) { return true; - - if (line.indexOf("Energy:") >= 0) { - String[] tokens = PT.getTokens(line.substring(line.indexOf("Energy:"))); - energy = tokens[1]; + } + + if (line.indexOf("Total Bonding Energy:") >= 0) { + String[] tokens = PT + .getTokens(line.substring(line.indexOf("Total Bonding Energy:"))); + bondingEnergy = tokens[3]; return true; } - if (line.indexOf("Vibrations") >= 0) { + if (line.indexOf(isADF ? "Vibrations" : "Normal Modes") >= 0) { readFrequencies(); return true; } @@ -113,47 +138,87 @@ symLine = line; return true; } - if (line.indexOf(" ====== Eigenvectors (rows) in BAS representation") >= 0) { + if (line + .indexOf(" ====== Eigenvectors (rows) in BAS representation") >= 0) { readMolecularOrbitals(PT.getTokens(symLine)[1]); return true; } + + if (!isADF && line.startsWith(" Old frequency:")) { + readOldFrequency(); + return true; + } return true; } + protected void readOldFrequency() { + String[] tokens = PT.getTokens(line); + float frqOld = PT.parseFloat(tokens[2].replace(",", "")); + float frqNew = PT.parseFloat(tokens[4]); + int finalModel = modelNumber + vibrationNumber; + for (int i = modelNumber; i < finalModel; i++) { + String cname = (String) asc.getAtomSetAuxiliaryInfoValue(i, "name"); + String frqPrev = cname.replace(" cm^-1", ""); + String frqOldFmt = PT.formatStringF("%.3f", "f", frqOld); + if (frqOldFmt.equals(frqPrev)) { + String frqNewFmt = PT.formatStringF("%.3f", "f", frqNew); + cname += " (now " + frqNewFmt + " cm^-1)"; + asc.setAtomSetModelPropertyForSet("name", cname, i); + asc.setAtomSetModelPropertyForSet("modelName", cname, i); + break; + } + } + } + /** * Reads a set of coordinates * * @exception Exception if an I/O error occurs */ - private void readCoordinates() throws Exception { + protected void readCoordinates() throws Exception { - /* - * - Coordinates (Cartesian) - ======================= + // ADF: + + // Coordinates (Cartesian) + // ======================= + // + // Atom bohr angstrom Geometric Variables + // X Y Z X Y Z (0:frozen, *:LT par.) + // -------------------------------------------------------------------------------------------------------------- + // 1 XX .000000 .000000 .000000 .000000 .000000 .000000 0 0 0 + // + // + //OR + // + // + // ATOMS + // ===== X Y Z CHARGE + // (Angstrom) Nucl +Core At.Mass + // -------------------------- ---------------- ------- + // 1 Ni 0.0000 0.0000 0.0000 28.00 28.00 57.9353 + // + + // AMS: + + // -------- + // Geometry + // -------- + // Formula: Mo12O40P + // Atoms + // Index Symbol x (angstrom) y (angstrom) z (angstrom) + // 1 Mo 0.11453909 -2.53514597 2.53514597 adf.R=1.992 + // + + boolean isGeometry = (!isADF || line.indexOf("G E O M E T R Y") >= 0); + asc.newAtomSet(); + String modelName = "model " + String.valueOf(modelNumber); + if (energy != null) + modelName = modelName + " e=" + energy + " a.u."; + asc.setAtomSetName(modelName); - Atom bohr angstrom Geometric Variables - X Y Z X Y Z (0:frozen, *:LT par.) - -------------------------------------------------------------------------------------------------------------- - 1 XX .000000 .000000 .000000 .000000 .000000 .000000 0 0 0 - - -OR - - - ATOMS - ===== X Y Z CHARGE - (Angstrom) Nucl +Core At.Mass - -------------------------- ---------------- ------- - 1 Ni 0.0000 0.0000 0.0000 28.00 28.00 57.9353 - - * - */ - boolean isGeometry = (line.indexOf("G E O M E T R Y") >= 0); - asc.newAtomSet(); - asc.setAtomSetName("" + energy); // start with an empty name - discardLinesUntilContains("----"); + String startGeomDelimiter = (isADF ? "----" : "Index Symbol"); int pt0 = (isGeometry ? 2 : 5); + discardLinesUntilContains(startGeomDelimiter); nXX = 0; String[] tokens; while (rd() != null && !line.startsWith(" -----")) { @@ -173,51 +238,75 @@ } } + // ADF + // Vibrations and Normal Modes *** (cartesian coordinates, NOT mass-weighted) *** + // =========================== + // + // The headers on the normal mode eigenvectors below give the Frequency in cm-1 + // (a negative value means an imaginary frequency, no output for (almost-)zero frequencies) + // + // + // 940.906 1571.351 1571.351 + // ------------------------ ------------------------ ------------------------ + // 1.XX .000 .000 .000 .000 .000 .000 .000 .000 .000 + // 2.N .000 .000 .115 .008 .067 .000 -.067 .008 .000 + // 3.H .104 .180 -.534 .323 -.037 -.231 .580 -.398 .098 + // 4.H -.208 .000 -.534 .017 -.757 .030 -.140 -.092 -.249 + // 5.H .104 -.180 -.534 -.453 -.131 .201 .485 .378 .151 + // + // + // ==================================== - /* - Vibrations and Normal Modes *** (cartesian coordinates, NOT mass-weighted) *** - =========================== - - The headers on the normal mode eigenvectors below give the Frequency in cm-1 - (a negative value means an imaginary frequency, no output for (almost-)zero frequencies) + // AMS: + //------------ + //Normal Modes + //------------ + // + //Number of removed rigid normal modes: 6 + // + //Mode: 7 Frequency (cm-1): 28.4703 Intensity (km/mol): 0.0000 Irrep: A2 + //Index Atom ---- Displacements (x/y/z) ---- + // 1 Xx -0.000355 0.127075 0.127261 + // 2 Xx 0.000355 0.127075 -0.127261 + // 3 Xx -0.000355 -0.127075 -0.127261 + // - 940.906 1571.351 1571.351 - ------------------------ ------------------------ ------------------------ - 1.XX .000 .000 .000 .000 .000 .000 .000 .000 .000 - 2.N .000 .000 .115 .008 .067 .000 -.067 .008 .000 - 3.H .104 .180 -.534 .323 -.037 -.231 .580 -.398 .098 - 4.H -.208 .000 -.534 .017 -.757 .030 -.140 -.092 -.249 - 5.H .104 -.180 -.534 -.453 -.131 .201 .485 .378 .151 - - - ==================================== - */ /** * Reads a set of vibrations. * - * @exception Exception if an I/O error occurs + * @exception Exception + * if an I/O error occurs */ - private void readFrequencies() throws Exception { + protected void readFrequencies() throws Exception { rd(); + if (!isADF) { + discardLinesUntilContains("Number of removed rigid"); + } while (rd() != null) { - while (rd() != null && line.indexOf(".") < 0 - && line.indexOf("====") < 0) { + // note: in AMS this was reading to EOF. Is there never anything after frequencies? + if (isADF) { + while (rd() != null && line.indexOf(".") < 0 + && line.indexOf("====") < 0) { + } + } else { + discardLinesUntilContains("Mode:"); } if (line == null || line.indexOf(".") < 0) return; - String[] frequencies = getTokens(); - rd(); // -------- -------- -------- + String[] freqdata = getTokens(); + rd(); // -------- -------- -------- or Index Atom... int iAtom0 = asc.ac; int ac = asc.getLastAtomSetAtomCount(); - int frequencyCount = frequencies.length; + int frequencyCount = (isADF ? freqdata.length : 1); boolean[] ignore = new boolean[frequencyCount]; for (int i = 0; i < frequencyCount; ++i) { ignore[i] = !doGetVibration(++vibrationNumber); if (ignore[i]) continue; + String frequency = freqdata[isADF ? i : 4]; asc.cloneLastAtomSet(); - asc.setAtomSetFrequency(vibrationNumber, null, null, frequencies[i], null); + asc.setAtomSetFrequency(vibrationNumber, null, null, frequency, null); } readLines(nXX); fillFrequencyData(iAtom0, ac, ac, ignore, true, 0, 0, null, 0, null); @@ -224,7 +313,7 @@ } } - private void readSymmetries() throws Exception { + protected void readSymmetries() throws Exception { /* Irreducible Representations, including subspecies ------------------------------------------------- @@ -248,7 +337,7 @@ } } - private class SymmetryData { + protected class SymmetryData { int index; String sym; int nSFO; @@ -257,7 +346,7 @@ Map<String, Object>[] mos; int[] basisFunctions; public SymmetryData(int index, String sym) { - Logger.info("ADF reader creating SymmetryData " + sym + " " + index); + Logger.info((isADF ? "ADF" : "AMS") + " reader creating SymmetryData " + sym + " " + index); this.index = index; this.sym = sym; } @@ -264,7 +353,7 @@ } - private void readSlaterBasis() throws Exception { + protected void readSlaterBasis() throws Exception { if (vSymmetries == null) return; int nBF = 0; @@ -358,7 +447,7 @@ } } - private void readMolecularOrbitals(String sym) throws Exception { + protected void readMolecularOrbitals(String sym) throws Exception { /* ====== Eigenvectors (rows) in BAS representation @@ -463,7 +552,7 @@ setMOs("eV"); } - private void addMo(String sym, int moPt, float occ, float energy) { + protected void addMo(String sym, int moPt, float occ, float energy) { SymmetryData sd = htSymmetries.get(sym); if (sd == null) { for (Map.Entry<String, SymmetryData> entry : htSymmetries.entrySet()) Added: trunk/Jmol/src/org/jmol/adapter/readers/quantum/AmsReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/AmsReader.java (rev 0) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/AmsReader.java 2023-09-12 17:24:17 UTC (rev 22560) @@ -0,0 +1,53 @@ +/* $RCSfile: ADFReader.java,v $ + * $Author: egonw $ + * $Date: 2004/02/23 08:52:55 $ + * $Revision: 1.3.2.4 $ + * Copyright (C) 2002-2004 The Jmol Development Team + * + * Contact: jmo...@li... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA. + */ +package org.jmol.adapter.readers.quantum; + +/** + * + * A reader for AMS output subclassing the older AdfReader. + * + * Amsterdam Modeling Suite (AMS) is a quantum chemistry program + * by Scientific Computing & Modelling NV (SCM) + * (http://www.scm.com/), superseding previous ADF + * + * The reader was directly adapted from the code of the ADF reader + * authored by Bradley A. Smith, to make it work on the new structure + * of AMS output files. + * + * Added note by Bob Hanson 9/12/2023 + * Most of this patch was duplicate code in AdfReader. + * This code was consolidated by subclassing. + * It has not been tested. + * + * @author Diego Garay-Ruiz (dg...@ic...) + * @version 1.0 + */ +public class AmsReader extends AdfReader { + + @Override + public void initializeReader() { + // a flag for various new checks + isADF = false; + } +} Property changes on: trunk/Jmol/src/org/jmol/adapter/readers/quantum/AmsReader.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2023-09-12 15:04:48 UTC (rev 22559) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2023-09-12 17:24:17 UTC (rev 22560) @@ -49,7 +49,7 @@ "more.", ";AFLOW;BinaryDcd;CDX;Gromacs;Jcampdx;MdCrd;MdTop;Mol2;TlsDataOnly;", "quantum.", ";Adf;Csf;Dgrid;GamessUK;GamessUS;Gaussian;GaussianFchk;GaussianWfn;Jaguar;" + "Molden;MopacGraphf;GenNBO;NWChem;Psi;Qchem;QCJSON;" + - "WebMO;Orca;MO;", // MO is for XmlMolpro + "WebMO;Orca;MO;Ams;", // MO is for XmlMolpro "pdb.", ";Pdb;Pqr;P2n;JmolData;", "pymol.", ";PyMOL;", "simple.", ";Alchemy;Ampac;Cube;FoldingXyz;GhemicalMM;HyperChem;Jme;JSON;Mopac;MopacArchive;Tinker;Input;FAH;", @@ -109,7 +109,7 @@ String errMsg = null; if (type == null && htParams != null) { type = Resolver.getFileTypefromFilter((String) htParams.get("filter")); - } + } if (type != null) { readerName = getReaderFromType(type); if (readerName == null) @@ -174,7 +174,7 @@ type = "Xml" + type.substring(0, type.length() - 5); } type = ";" + type.toLowerCase() + ";"; - if (";zmatrix;cfi;c;vfi;v;mnd;jag;adf;gms;g;gau;mp;nw;orc;pqs;qc;".indexOf(type) >= 0) + if (";zmatrix;cfi;c;vfi;v;mnd;jag;gms;g;gau;mp;nw;orc;pqs;qc;".indexOf(type) >= 0) return "Input"; String set; @@ -852,8 +852,11 @@ { "Spartan", "Spartan", "converted archive file" }; // very old Spartan files; sparchive files private final static String[] adfContainsRecords = - { "Adf", "Amsterdam Density Functional" }; + { "Adf", "Amsterdam Density Functional"}; + private final static String[] amsContainsRecords = + { "Ams", "Amsterdam Modeling Suite"}; + private final static String[] psiContainsRecords = { "Psi", " PSI 3", "PSI3:"}; @@ -933,7 +936,8 @@ espressoContainsRecords, siestaContainsRecords, xcrysDenContainsRecords, mopacArchiveContainsRecords,abinitContainsRecords,gaussianFchkContainsRecords, inputContainsRecords, aflowContainsRecords, magCifContainsRecords, - qcJsonContainsRecords, optimadeContainsRecords, orcaContainsRecords, jsonArrayContainsRecords + qcJsonContainsRecords, optimadeContainsRecords, orcaContainsRecords, jsonArrayContainsRecords, + amsContainsRecords }; private final static String[][] jsonContainsRecords = This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |