From: <ha...@us...> - 2014-01-10 15:19:41
|
Revision: 19162 http://sourceforge.net/p/jmol/code/19162 Author: hansonr Date: 2014-01-10 15:19:33 +0000 (Fri, 10 Jan 2014) Log Message: ----------- ___JmolVersion="14.1.5_dev_2014.01.10" bug fix: reading of *co*mmensurately modulated structures (e.g. Lilianite) working bug fix: wrong name for coverimage in WebExport. Modified Paths: -------------- trunk/Jmol/src/javajs/util/T3.java trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java trunk/Jmol/src/org/jmol/adapter/readers/cif/MSCifReader.java trunk/Jmol/src/org/jmol/adapter/readers/cif/MSReader.java trunk/Jmol/src/org/jmol/adapter/readers/cif/Subsystem.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java trunk/Jmol/src/org/jmol/adapter/smarter/MSInterface.java trunk/Jmol/src/org/jmol/api/SymmetryInterface.java trunk/Jmol/src/org/jmol/jvxl/readers/AtomDataReader.java trunk/Jmol/src/org/jmol/modelset/AtomCollection.java trunk/Jmol/src/org/jmol/render/FontLineShapeRenderer.java trunk/Jmol/src/org/jmol/render/LabelsRenderer.java trunk/Jmol/src/org/jmol/symmetry/PointGroup.java trunk/Jmol/src/org/jmol/symmetry/Symmetry.java trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java trunk/Jmol/src/org/jmol/symmetry/UnitCell.java trunk/Jmol/src/org/jmol/util/ModulationSet.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Added Paths: ----------- trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifInterface.java trunk/Jmol/src/org/jmol/adapter/readers/cif/MSCifInterface.java Removed Paths: ------------- trunk/Jmol/src/org/jmol/adapter/smarter/MMCifInterface.java trunk/Jmol/src/org/jmol/adapter/smarter/MSCifInterface.java Modified: trunk/Jmol/src/javajs/util/T3.java =================================================================== --- trunk/Jmol/src/javajs/util/T3.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/javajs/util/T3.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -170,6 +170,20 @@ } /** + * Add {a b c} + * + * @param a + * @param b + * @param c + */ + public final void add3(float a, float b, float c) { + x += a; + y += b; + z += c; + } + + + /** * Sets the value of this tuple to the scalar multiplication of tuple t1 and * then adds tuple t2 (this = s*t1 + t2). * @@ -186,6 +200,7 @@ z = s * t1.z + t2.z; } + /** * average of two tuples * Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -26,8 +26,6 @@ import org.jmol.adapter.smarter.AtomSetCollection; import org.jmol.adapter.smarter.Atom; import org.jmol.adapter.smarter.AtomSetCollectionReader; -import org.jmol.adapter.smarter.MMCifInterface; -import org.jmol.adapter.smarter.MSCifInterface; import org.jmol.api.Interface; import org.jmol.api.JmolAdapter; import org.jmol.api.JmolLineReader; @@ -257,7 +255,9 @@ if (lastSpaceGroupName != null) setSpaceGroupName(lastSpaceGroupName); } else if (pr != null) { - pr.processData(key); + pr.processEntry(); + } else if (mr != null) { + mr.processEntry(); } } return true; @@ -518,22 +518,26 @@ */ private void processLoopBlock() throws Exception { tokenizer.getTokenPeeked(); //loop_ - String str = tokenizer.peekToken(); - if (str == null) + key = tokenizer.peekToken(); + if (key == null) return; boolean isLigand = false; - str = fixKey(str); - if (lookingForPDB && !isPDBX && str.indexOf("_pdb") >= 0) + key = fixKey(key); + if (lookingForPDB && !isPDBX && key.indexOf("_pdb") >= 0) initializeMMCIF(); - if (modulated - && (str.startsWith("_cell_wave") || str.contains("fourier") || str - .contains("_special_func"))) { - if (!mr.processModulationLoopBlock()) + + if (mr != null) + switch (mr.processLoopBlock()) { + case 0: + break; + case -1: skipLoop(); - return; - } - if (str.startsWith("_atom_site_") - || (isLigand = str.equals("_chem_comp_atom_comp_id"))) { + //$FALL-THROUGH$ + case 1: + return; + } + if (key.startsWith("_atom_site_") + || (isLigand = key.equals("_chem_comp_atom_comp_id"))) { if (!processAtomSiteLoopBlock(isLigand)) return; atomSetCollection.setAtomSetName(thisDataSetName); @@ -543,9 +547,9 @@ atomSetCollection.setAtomSetAuxiliaryInfo("formula", thisFormula); return; } - if (str.startsWith("_symmetry_equiv_pos") - || str.startsWith("_space_group_symop") - || str.startsWith("_symmetry_ssg_equiv")) { + if (key.startsWith("_symmetry_equiv_pos") + || key.startsWith("_space_group_symop") + || key.startsWith("_symmetry_ssg_equiv")) { if (ignoreFileSymmetryOperators) { Logger.warn("ignoring file-based symmetry operators"); skipLoop(); @@ -554,26 +558,20 @@ } return; } - if (str.startsWith("_citation")) { + if (key.startsWith("_citation")) { processCitationListBlock(); return; } - - if (pr != null && pr.processPDBLoops(str)) - return; - - if (str.startsWith("_atom_type")) { + if (key.startsWith("_atom_type")) { processAtomTypeLoopBlock(); return; } - - if (mr != null && str.equals("_cell_subsystem_code")) - mr.processSubsystemLoopBlock(); - - if (str.startsWith("_geom_bond") && (isMolecular || !doApplySymmetry)) { + if (key.startsWith("_geom_bond") && (isMolecular || !doApplySymmetry)) { processGeomBondLoopBlock(); return; } + if (pr != null && pr.processLoopBlock()) + return; skipLoop(); } Copied: trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifInterface.java (from rev 19075, trunk/Jmol/src/org/jmol/adapter/smarter/MMCifInterface.java) =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifInterface.java (rev 0) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifInterface.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -0,0 +1,17 @@ +package org.jmol.adapter.readers.cif; + +import org.jmol.adapter.smarter.Atom; + +public interface MMCifInterface { + + boolean checkAtom(Atom atom, String assemblyID, int index); + + void finalizeReader(int nAtoms) throws Exception; + + boolean initialize(CifReader cifReader); + + void processEntry() throws Exception; + + boolean processLoopBlock() throws Exception; + +} Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -34,7 +34,6 @@ import org.jmol.adapter.smarter.Atom; import org.jmol.adapter.smarter.AtomSetCollection; -import org.jmol.adapter.smarter.MMCifInterface; import org.jmol.adapter.smarter.Structure; import org.jmol.api.JmolAdapter; import org.jmol.constant.EnumStructure; @@ -181,14 +180,14 @@ */ private String[] assem = null; - private String data; - private String key; + //private String data; + //private String key; @Override - public void processData(String key) throws Exception { - if (key.startsWith("_pdbx_entity_nonpoly")) + public void processEntry() throws Exception { + if (cr.key.startsWith("_pdbx_entity_nonpoly")) processDataNonpoly(); - else if (key.startsWith("_pdbx_struct_assembly_gen")) + else if (cr.key.startsWith("_pdbx_struct_assembly_gen")) processDataAssemblyGen(); } @@ -207,16 +206,14 @@ } private void processDataAssemblyGen() throws Exception { - data = cr.data; - key = cr.key; if (assem == null) assem = new String[3]; - if (key.indexOf("assembly_id") >= 0) - assem[ASSEM_ID] = data = cr.tokenizer.fullTrim(data); - else if (key.indexOf("oper_expression") >= 0) - assem[ASSEM_OPERS] = data = cr.tokenizer.fullTrim(data); - else if (key.indexOf("asym_id_list") >= 0) - assem[ASSEM_LIST] = data = cr.tokenizer.fullTrim(data); + if (cr.key.indexOf("assembly_id") >= 0) + assem[ASSEM_ID] = cr.tokenizer.fullTrim(cr.data); + else if (cr.key.indexOf("oper_expression") >= 0) + assem[ASSEM_OPERS] = cr.tokenizer.fullTrim(cr.data); + else if (cr.key.indexOf("asym_id_list") >= 0) + assem[ASSEM_LIST] = cr.tokenizer.fullTrim(cr.data); if (assem[0] != null && assem[1] != null && assem[2] != null) addAssembly(); } @@ -932,27 +929,28 @@ } @Override - public boolean processPDBLoops(String str) throws Exception { - if (str.startsWith("_pdbx_struct_oper_list")) + public boolean processLoopBlock() throws Exception { + String key = cr.key; + if (key.startsWith("_pdbx_struct_oper_list")) return processStructOperListBlock(); - if (str.startsWith("_pdbx_struct_assembly_gen")) + if (key.startsWith("_pdbx_struct_assembly_gen")) return processAssemblyGenBlock(); if (isCourseGrained) return false; - if (str.startsWith("_struct_site_gen")) + if (key.startsWith("_struct_site_gen")) return processStructSiteBlock(); - if (str.startsWith("_chem_comp_bond")) + if (key.startsWith("_chem_comp_bond")) return processLigandBondLoopBlock(); - if (str.startsWith("_chem_comp")) + if (key.startsWith("_chem_comp")) return processChemCompLoopBlock(); - if (str.startsWith("_pdbx_entity_nonpoly")) + if (key.startsWith("_pdbx_entity_nonpoly")) return processNonpolyLoopBlock(); - if (str.startsWith("_struct_conf") - && !str.startsWith("_struct_conf_type")) + if (key.startsWith("_struct_conf") + && !key.startsWith("_struct_conf_type")) return processStructConfLoopBlock(); - if (str.startsWith("_struct_sheet_range")) + if (key.startsWith("_struct_sheet_range")) return processStructSheetRangeLoopBlock(); return false; } Copied: trunk/Jmol/src/org/jmol/adapter/readers/cif/MSCifInterface.java (from rev 19117, trunk/Jmol/src/org/jmol/adapter/smarter/MSCifInterface.java) =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/MSCifInterface.java (rev 0) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/MSCifInterface.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -0,0 +1,12 @@ +package org.jmol.adapter.readers.cif; + +import org.jmol.adapter.smarter.MSInterface; + +public interface MSCifInterface extends MSInterface { + + // methods called from org.jmol.adapters.readers.cif.CifReader + + int processLoopBlock() throws Exception; + void processEntry() throws Exception; + +} Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/MSCifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/MSCifReader.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/MSCifReader.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -23,7 +23,6 @@ */ package org.jmol.adapter.readers.cif; -import org.jmol.adapter.smarter.MSCifInterface; import javajs.util.Matrix; import javajs.util.PT; @@ -36,7 +35,7 @@ } private String field; - + // incommensurate modulation //////////////////////////////////////////////////////////////// @@ -180,7 +179,16 @@ "_atom_site_u_fourier_sin" }; private static final int NONE = -1; - + + @Override + public void processEntry() throws Exception { + CifReader cr = (CifReader) this.cr; + if (cr.key.equals("_jana_cell_commen_t_section_1")) { + isCommensurate = true; + commensurateSection1 = cr.parseIntStr(cr.data); + } + } + /** * creates entries in htModulation with a key of the form: * @@ -191,13 +199,21 @@ * 0|x|y|z (0 indicates irrelevant -- occupancy); and ;atomLabel is only for D * and O. * + * @return 1:handled; -1: skip; 0: unrelated * @throws Exception */ @Override - public boolean processModulationLoopBlock() throws Exception { + public int processLoopBlock() throws Exception { + CifReader cr = (CifReader) this.cr; + if (cr.key.equals("_cell_subsystem_code")) { + processSubsystemLoopBlock(); + return 1; + } + if (!cr.key.startsWith("_cell_wave") && !cr.key.contains("fourier") + && !cr.key.contains("_special_func")) + return 0; if (modAverage) - return false; - CifReader cr = (CifReader) this.cr; + return -1; if (cr.atomSetCollection.getCurrentAtomSetIndex() < 0) cr.atomSetCollection.newAtomSet(); cr.parseLoopParameters(modulationFields); @@ -372,7 +388,7 @@ addMod(id, fid, pt); } } - return true; + return 1; } private void addMod(String id, String fid, double[] params) { @@ -404,8 +420,7 @@ //2 '2-nd subsystem' 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 // - @Override - public void processSubsystemLoopBlock() throws Exception { + private void processSubsystemLoopBlock() throws Exception { CifReader cr = (CifReader) this.cr; cr.parseLoopParameters(null); while (cr.tokenizer.getData()) { Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/MSReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/MSReader.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/MSReader.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -43,11 +43,14 @@ public class MSReader implements MSInterface { - protected AtomSetCollectionReader cr; + protected AtomSetCollectionReader cr; // Cif or Jana protected int modDim; protected String modAxes; protected boolean modAverage; + protected boolean isCommensurate; + protected int commensurateSection1; // TODO + private boolean modPack; private boolean modVib; @@ -77,6 +80,8 @@ private boolean modCoord; + private boolean finalized; + public MSReader() { // for reflection from Jana } @@ -193,10 +198,11 @@ */ @Override public void finalizeModulation() { - if (modDim > 0 && !modVib) { + if (!finalized && modDim > 0 && !modVib) { cr.atomSetCollection.setAtomSetCollectionAuxiliaryInfo("modulationOn", Boolean.TRUE); - cr.addJmolScript((haveOccupancy ? ";display occupancy >= 0.5" : "")); + cr.addJmolScript((haveOccupancy && !isCommensurate ? ";display occupancy >= 0.5" : "")); } + finalized = true; } private String atModel = "@0"; @@ -577,28 +583,9 @@ // (Special positions should generate the same atom regardless of which operation is employed.) if (modCoord && htSubsystems != null) { - P3 pt = new P3(); P3 ptc = P3.newP(a); SymmetryInterface spt = getSymmetry(a); spt.toCartesian(ptc, true); - - boolean ok = true; - Subsystem ss3 = htSubsystems.get("3"); - if (ss3 != null) { - pt.setT(ptc); - ss3.getSymmetry().toFractional(pt, true); - if (pt.x < 0 || pt.y < 0 || pt.z != 1) - ok = false; - } - if (ok) { - System.out.println(a.index + " " + a.atomName + " " + ptc); - for (Entry<String, Subsystem> e : htSubsystems.entrySet()) { - SymmetryInterface sym = e.getValue().getSymmetry(); - pt.setT(ptc); - sym.toFractional(pt, true); - System.out.println("ss" + e.getKey() + " " + pt); - } - } } List<Modulation> list = htAtomMods.get(a.atomName); if (list == null && a.altLoc != '\0' && htSubsystems != null) { @@ -621,7 +608,7 @@ // nOps is used as a factor in occupation modulation only. iopLast = iop; gammaE = new M3(); - cr.symmetry.getSpaceGroupOperation(iop).getRotationScale(gammaE); + getSymmetry(a).getSpaceGroupOperation(iop).getRotationScale(gammaE); } if (Logger.debugging) { Logger.debug("setModulation iop = " + iop + " " @@ -796,7 +783,7 @@ getSymmetry(a).toCartesian(pt, false); sym.toFractional(pt, false); if (!ac.isWithinCell(3, pt, minXYZ0.x, maxXYZ0.x, minXYZ0.y, maxXYZ0.y, - minXYZ0.z, maxXYZ0.z, 0.001f)) + minXYZ0.z, maxXYZ0.z, 0.001f) || isCommensurate && a.foccupancy < 0.5f) bs.clear(i); } } @@ -807,5 +794,9 @@ .getSymmetry() : cr.atomSetCollection.symmetry); } + @Override + public SymmetryInterface getSymmetryFromCode(String code) { + return htSubsystems.get(code).getSymmetry(); + } } Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/Subsystem.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/Subsystem.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/Subsystem.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -3,7 +3,6 @@ import java.util.Map.Entry; import javajs.util.List; -import javajs.util.M3; import javajs.util.M4; import javajs.util.Matrix; import javajs.util.V3; @@ -21,6 +20,7 @@ private SymmetryInterface symmetry; private Matrix[] modMatrices; + private boolean isFinalized; Subsystem(MSReader msReader, String code, Matrix w) { this.msReader = msReader; @@ -30,13 +30,13 @@ } public SymmetryInterface getSymmetry() { - if (modMatrices == null) + if (!isFinalized) setSymmetry(true); return symmetry; } public Matrix[] getModMatrices() { - if (modMatrices == null) + if (!isFinalized) setSymmetry(true); return modMatrices; } @@ -75,8 +75,6 @@ // mard3 = full (3+d)x3 matrix of ai* (a*, b*, c*, x4*, x5*,....) // = [ mard3 | sigma * mard3 ] // - // We need top half of W*mard3 here - Matrix mard3 = new Matrix(null, 3 + d, 3); Matrix mar3 = new Matrix(null, 3, 3); double[][] mard3a = mard3.getArray(); @@ -98,22 +96,14 @@ uc_nu[i + 1] = V3.new3((float) a[i][0], (float) a[i][1], (float) a[i][2]); uc_nu = reciprocalsOf(uc_nu); symmetry = msReader.cr.symmetry.getUnitCell(uc_nu, false); + modMatrices = new Matrix[] { sigma_nu, tFactor }; if (!setOperators) return; - - modMatrices = new Matrix[] { sigma_nu, tFactor }; + isFinalized = true; // Part 3: Transform the operators // -// Matrix w3 = msReader.htSubsystems.get("3").w; -// Matrix w3inv = w3.inverse(); -// Matrix w2 = msReader.htSubsystems.get("2").w; -// Matrix w2inv = w2.inverse(); -// System.out.println(w3inv.mul(w2)); -// System.out.println(w2inv.mul(w3)); -// System.out.println(w3.mul(w2inv)); -// System.out.println(w2.mul(w3inv)); Logger.info("unit cell parameters: " + symmetry.getUnitCellInfo()); symmetry.createSpaceGroup(-1, "[subsystem " + code + "]", new List<M4>()); int nOps = s0.getSpaceGroupOperationCount(); @@ -121,44 +111,41 @@ Matrix rv = s0.getOperationRsVs(iop); Matrix r0 = rv.getRotation(); Matrix v0 = rv.getTranslation(); -// System.out.println("op " + (iop + 1) + ".1: "+ r); -// r = w2.mul(r).mul(w2inv); -// System.out.println("op " + (iop + 1) + ".2: "+ r); -// r = w3.mul(rv.getRotation()).mul(w3inv); -// System.out.println("op " + (iop + 1) + ".3: "+ r); -// System.out.println("====="); -// -// r = rv.getRotation(); Matrix r = w.mul(r0).mul(winv); Matrix v = w.mul(v0); - M3 jToi = null; - if(isComplex(r)) { - // must find 3+d subsystem + String code = this.code; + if(isMixed(r)) { + // This operator mixes x4,x5... into x1,x2,x3. + // It is not a pure operation. Instead, it correlates one + // subsystem with another. Our job is to find the other + // subsystem "j" that will satisfy the following condition: + // + // (Wj R Wi_inv).submatrix(0,3,3,d) == all_zeros + // for (Entry<String, Subsystem> e: msReader.htSubsystems.entrySet()){ Subsystem ss = e.getValue(); if (ss == this) continue; Matrix rj = ss.w.mul(r0).mul(winv); - if (!isComplex(rj)) { - // result of this operation will be in other system. - jToi = M3.newM(symmetry.getMatrix("toFractional")); - if (ss.symmetry == null) - ss.setSymmetry(false); - jToi.mul(ss.symmetry.getMatrix("toCartesian")); + if (!isMixed(rj)) { + // We have found the corresponding subsystem. + // The result of this operation will be in other system, + // and the operation itself will be used to rotate the modulation. + // ss.code will be used to mark any atom created by this operation as + // part of the other system. r = rj; v = ss.w.mul(v0); + code = ss.code; break; } } } - String jf = symmetry.addOp(code, r, v, sigma_nu, jToi); - - Logger.info(jf); + String jf = symmetry.addOp(code, r, v, sigma_nu); + Logger.info(this.code + "." + (iop + 1) + (this.code.equals(code) ? " " : ">" + code + " ") + jf); } - System.out.println("===="); } - private boolean isComplex(Matrix r) { + private boolean isMixed(Matrix r) { double[][] a = r.getArray(); for (int i = 3; --i >= 0;) for (int j = 3 + d; --j >= 3;) Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -1373,6 +1373,7 @@ baseCount = noSymmetryCount; int atomMax = firstSymmetryAtom + noSymmetryCount; P3 ptAtom = new P3(); + String code = null; for (int iSym = 0; iSym < nOperations; iSym++) { if (isBaseCell && iSym == 0 || latticeOnly && iSym > 0 && iSym != latticeOp) @@ -1390,43 +1391,38 @@ int pt0 = (checkSpecial ? pt : checkRange111 ? baseCount : 0); for (int i = firstSymmetryAtom; i < atomMax; i++) { - if (atoms[i].ignoreSymmetry) + Atom a = atoms[i]; + if (a.ignoreSymmetry) continue; if (bsAtoms != null && !bsAtoms.get(i)) continue; - if (ms != null) - symmetry = ms.getAtomSymmetry(atoms[i], this.symmetry); - - symmetry.newSpaceGroupPoint(iSym, atoms[i], ptAtom, transX, transY, - transZ); + if (ms == null) { + symmetry.newSpaceGroupPoint(iSym, a, ptAtom, transX, transY, + transZ); + } else { + symmetry = ms.getAtomSymmetry(a, this.symmetry); + symmetry.newSpaceGroupPoint(iSym, a, ptAtom, transX, transY, + transZ); + // COmmensurate structures may use a symmetry operator + // to changes space groups. + code = symmetry.getSpaceGroupOperationCode(iSym); + symmetry = ms.getSymmetryFromCode(code); + if (symmetry.getSpaceGroupOperationCount() == 0) + finalizeSymmetry(symmetry); + } Atom special = null; P3 cartesian = P3.newP(ptAtom); symmetry.toCartesian(cartesian, false); if (doPackUnitCell) { + // note that COmmensurate structures may need + // modulation at this point. symmetry.toUnitCell(cartesian, ptOffset); ptAtom.setT(cartesian); symmetry.toFractional(ptAtom, false); if (!isWithinCell(dtype, ptAtom, minXYZ0.x, maxXYZ0.x, minXYZ0.y, maxXYZ0.y, minXYZ0.z, maxXYZ0.z, 0.02f)) continue; - -// if (ms == null) { -// symmetry.toUnitCell(cartesian, ptOffset); -// ptAtom.setT(cartesian); -// symmetry.toFractional(ptAtom, false); -// if (!isWithinCell(dtype, ptAtom, minXYZ0.x, maxXYZ0.x, minXYZ0.y, -// maxXYZ0.y, minXYZ0.z, maxXYZ0.z, 0.02f)) { -// continue; -// } -// } else { -// //symmetry.toUnitCell(cartesian, ptOffset); -// ptAtom.setT(cartesian); -// this.symmetry.toFractional(ptAtom, false); -// toUnitCell(ptAtom, 0.02f); -// this.symmetry.toCartesian(ptAtom, false); -// symmetry.toFractional(ptAtom, false); -// } } if (checkSymmetryMinMax) @@ -1440,12 +1436,14 @@ if (checkSymmetryRange && !isInSymmetryRange(cartesian)) continue; int j0 = (checkAll ? atomCount : pt0); + String name = a.atomName; + char altloc = a.altLoc; for (int j = j0; --j >= 0;) { float d2 = cartesian.distanceSquared(cartesians[j]); if (checkSpecial && d2 < 0.0001) { special = atoms[firstSymmetryAtom + j]; - if (special.atomName == null - || special.atomName.equals(atoms[i].atomName)) + if ((special.atomName == null || special.atomName.equals(name)) + && special.altLoc == altloc) break; special = null; } @@ -1455,7 +1453,7 @@ if (checkRange111 && minDist2 > range2) continue; } - int atomSite = atoms[i].atomSite; + int atomSite = a.atomSite; if (special != null) { if (addBonds) atomMap[atomSite] = special.index; @@ -1464,17 +1462,20 @@ } else { if (addBonds) atomMap[atomSite] = atomCount; - Atom atom1 = newCloneAtom(atoms[i]); + Atom atom1 = newCloneAtom(a); atom1.setT(ptAtom); atom1.atomSite = atomSite; + if (code != null) + atom1.altLoc = code.charAt(0); atom1.bsSymmetry = BSUtil.newAndSetBit(iCellOpPt + iSym); atom1.bsSymmetry.set(iSym); if (addCartesian) cartesians[pt++] = cartesian; - if (atoms[i].tensors != null) { + List<Object> tensors = a.tensors; + if (tensors != null) { atom1.tensors = null; - for (int j = atoms[i].tensors.size(); --j >= 0;) { - Tensor t = (Tensor) atoms[i].tensors.get(j); + for (int j = tensors.size(); --j >= 0;) { + Tensor t = (Tensor) tensors.get(j); if (t == null) continue; if (nOperations == 1) @@ -1503,20 +1504,20 @@ return pt; } - private void toUnitCell(P3 ptAtom, float f) { - while (ptAtom.x > maxXYZ00.x + f) - ptAtom.x -= 1; - while (ptAtom.y > maxXYZ00.y + f) - ptAtom.y -= 1; - while (ptAtom.z > maxXYZ00.z + f) - ptAtom.z -= 1; - while (ptAtom.x < minXYZ00.x - f) - ptAtom.x += 1; - while (ptAtom.y < minXYZ00.y - f) - ptAtom.y += 1; - while (ptAtom.z < minXYZ00.z - f) - ptAtom.z += 1; - } +// private void toUnitCell(P3 ptAtom, float f) { +// while (ptAtom.x > maxXYZ00.x + f) +// ptAtom.x -= 1; +// while (ptAtom.y > maxXYZ00.y + f) +// ptAtom.y -= 1; +// while (ptAtom.z > maxXYZ00.z + f) +// ptAtom.z -= 1; +// while (ptAtom.x < minXYZ00.x - f) +// ptAtom.x += 1; +// while (ptAtom.y < minXYZ00.y - f) +// ptAtom.y += 1; +// while (ptAtom.z < minXYZ00.z - f) +// ptAtom.z += 1; +// } public Tensor addRotatedTensor(Atom a, Tensor t, int iSym, boolean reset, SymmetryInterface symmetry) { Deleted: trunk/Jmol/src/org/jmol/adapter/smarter/MMCifInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/MMCifInterface.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/adapter/smarter/MMCifInterface.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -1,18 +0,0 @@ -package org.jmol.adapter.smarter; - -import org.jmol.adapter.readers.cif.CifReader; - -public interface MMCifInterface { - - - boolean checkAtom(Atom atom, String assemblyID, int index); - - void finalizeReader(int nAtoms) throws Exception; - - boolean initialize(CifReader cifReader); - - void processData(String key) throws Exception; - - boolean processPDBLoops(String str) throws Exception; - -} Deleted: trunk/Jmol/src/org/jmol/adapter/smarter/MSCifInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/MSCifInterface.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/adapter/smarter/MSCifInterface.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -1,11 +0,0 @@ -package org.jmol.adapter.smarter; - -public interface MSCifInterface extends MSInterface { - - // methods called from org.jmol.adapters.readers.cif.CifReader - - boolean processModulationLoopBlock() throws Exception; - - void processSubsystemLoopBlock() throws Exception; - -} Modified: trunk/Jmol/src/org/jmol/adapter/smarter/MSInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/MSInterface.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/adapter/smarter/MSInterface.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -32,4 +32,6 @@ void setMinMax0(P3 minXYZ0, P3 maxXYZ0); + SymmetryInterface getSymmetryFromCode(String spaceGroupOperationCode); + } Modified: trunk/Jmol/src/org/jmol/api/SymmetryInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/SymmetryInterface.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/api/SymmetryInterface.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -178,10 +178,10 @@ public int getSiteMultiplicity(P3 a); - public String addOp(String code, Matrix rs, Matrix vs, Matrix sigma, M3 jToi); + public String addOp(String code, Matrix rs, Matrix vs, Matrix sigma); public String getUnitCellState(); - public M3 getMatrix(String type); + public String getSpaceGroupOperationCode(int iSym); } Modified: trunk/Jmol/src/org/jmol/jvxl/readers/AtomDataReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/AtomDataReader.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/jvxl/readers/AtomDataReader.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -127,9 +127,9 @@ if (useOriginStepsPoints) { xyzMin = P3.newP(params.origin); xyzMax = P3.newP(params.origin); - xyzMax.x += (params.points.x - 1) * params.steps.x; - xyzMax.y += (params.points.y - 1) * params.steps.y; - xyzMax.z += (params.points.z - 1) * params.steps.z; + xyzMax.add3((params.points.x - 1) * params.steps.x, + (params.points.y - 1) * params.steps.y, + (params.points.z - 1) * params.steps.z); } else if (params.boundingBox == null) { getAtoms(params.bsSelected, false, true, false, false, false, false, params.mep_marginAngstroms); if (xyzMin == null) { Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -538,9 +538,7 @@ if (atomIndex < 0 || atomIndex >= atomCount) return; Atom a = atoms[atomIndex]; - a.x += x; - a.y += y; - a.z += z; + a.add3(x, y, z); fixTrajectory(a); taintAtom(atomIndex, TAINT_COORD); } Modified: trunk/Jmol/src/org/jmol/render/FontLineShapeRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/FontLineShapeRenderer.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/render/FontLineShapeRenderer.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -180,9 +180,7 @@ if (ptRef == null) { pointT3.setT(viewer.getBoundBoxCenter()); if (viewer.getAxesMode() == EnumAxesMode.BOUNDBOX) { - pointT3.x += 1.0; - pointT3.y += 1.0; - pointT3.z += 1.0; + pointT3.add3(1, 1, 1); } } else { pointT3.setT(ptRef); Modified: trunk/Jmol/src/org/jmol/render/LabelsRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/LabelsRenderer.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/render/LabelsRenderer.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -177,9 +177,7 @@ pTemp.setT(atomPt); else pTemp.set(0, 0, 0); - pTemp.x += text.pymolOffset[4]; - pTemp.y += text.pymolOffset[5]; - pTemp.z += text.pymolOffset[6]; + pTemp.add3(text.pymolOffset[4], text.pymolOffset[5], text.pymolOffset[6]); viewer.transformPtScr(pTemp, screen); text.setXYZs(screen.x, screen.y, screen.z, zSlab); text.setScalePixelsPerMicron(sppm); Modified: trunk/Jmol/src/org/jmol/symmetry/PointGroup.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/PointGroup.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/symmetry/PointGroup.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -957,11 +957,8 @@ .append(Escape.eP(v)); v.scaleAdd2(-2, op.normalOrAxis, v); sb.append(Escape.eP(v)); - v.x += 0.011; - v.y += 0.012; - v.z += 0.013; - sb - .append(Escape.eP(v)) + v.add3(0.011f, 0.012f, 0.013f); + sb.append(Escape.eP(v)) .append("{0 360 0.5} color ") .append( principalPlane != null && op.index == principalPlane.index ? "red" Modified: trunk/Jmol/src/org/jmol/symmetry/Symmetry.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/Symmetry.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/symmetry/Symmetry.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -752,12 +752,12 @@ * @param trans is a (3+d)x(1) array of translations * @return Jones-Faithful representation */ - public String addOp(String code, Matrix rs, Matrix vs, Matrix sigma, M3 jtoi) { + public String addOp(String code, Matrix rs, Matrix vs, Matrix sigma) { spaceGroup.isSSG = true; String s = SymmetryOperation.getXYZFromRsVs(rs, vs, false); int i = spaceGroup.addSymmetry(s, -1, true); - spaceGroup.operations[i].setSigma(code, sigma, jtoi); - System.out.println(spaceGroup.operations[i]); + spaceGroup.operations[i].setSigma(code, sigma); + //System.out.println(spaceGroup.operations[i]); return s; } @@ -767,13 +767,8 @@ } @Override - public M3 getMatrix(String type) { - M3 m = new M3(); - if (type.equals("toFractional")) { - unitCell.matrixCartesianToFractional.getRotationScale(m); - } else if (type.equals("toCartesian")) { - unitCell.matrixFractionalToCartesian.getRotationScale(m); - } - return m; + public String getSpaceGroupOperationCode(int iOp) { + return spaceGroup.operations[iOp].subsystemCode; } + } Modified: trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -86,13 +86,11 @@ private boolean isBio; private Matrix sigma; int index; - private M3 jtoi; - private String subsystemCode; + String subsystemCode; - void setSigma(String subsystemCode, Matrix sigma, M3 jtoi) { + void setSigma(String subsystemCode, Matrix sigma) { this.subsystemCode = subsystemCode; this.sigma = sigma; - this.jtoi = jtoi; } /** @@ -124,12 +122,11 @@ index = op.index; linearRotTrans = op.linearRotTrans; sigma = op.sigma; - jtoi = op.jtoi; subsystemCode = op.subsystemCode; setMatrix(false); if (!op.isFinalized) doFinalize(); - if (doNormalize) + if (doNormalize && sigma == null) setOffset(atoms, atomIndex, countOrId); } @@ -191,26 +188,9 @@ return (normalized && modDim == 0 || xyzOriginal == null ? xyz : xyzOriginal); } - void newPoint(P3 atom1, P3 atom2, int transX, int transY, int transZ) { + void newPoint(P3 atom1, P3 atom2, int x, int y, int z) { transform2(atom1, atom2); - if (jtoi == null) { - atom2.x += transX; - atom2.y += transY; - atom2.z += transZ; - } else { - atom2.x += transX - Math.floor(atom2.x); - atom2.y += transY - Math.floor(atom2.y); - atom2.z += transZ - Math.floor(atom2.z); - if (subsystemCode.equals("2") && index == 3 && transX >= 0 && transX < 4 && transY >= -2 && transY <= 0 && transZ >= -1 && transZ <= 1) { - System.out.print(subsystemCode + "." + index - + " " + transX + " " + transY + " " + transZ - + " " + atom1 + " " + atom2); - jtoi.transform(atom2); - System.out.println(" " + atom2); - } else { - jtoi.transform(atom2); - } - } + atom2.add3(x, y, z); } String dumpInfo() { @@ -471,8 +451,11 @@ if (allPositive) { while (n12ths < 0) n12ths += 12f; - } else if (halfOrLess && n12ths > 6f) { - n12ths -= 12f; + } else if (halfOrLess) { + while (n12ths > 6f) + n12ths -= 12f; + while (n12ths < -6f) + n12ths += 12f; } String s = twelfthsOf(n12ths); return (s.charAt(0) == '0' ? "" : n12ths > 0 ? "+" + s : s); Modified: trunk/Jmol/src/org/jmol/symmetry/UnitCell.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/UnitCell.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/symmetry/UnitCell.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -386,9 +386,9 @@ pts[i] = P3.newP(BoxInfo.unitCubePoints[i]); if (cell0 != null) { scale *= unitCellMultiplier.z; - pts[i].x += cell0.x + cell1.x * pts[i].x; - pts[i].y += cell0.y + cell1.y * pts[i].y; - pts[i].z += cell0.z + cell1.z * pts[i].z; + pts[i].add3(cell0.x + cell1.x * pts[i].x, + cell0.y + cell1.y * pts[i].y, + cell0.z + cell1.z * pts[i].z); } matrixFractionalToCartesian.transform(pts[i]); if (withOffset) Modified: trunk/Jmol/src/org/jmol/util/ModulationSet.java =================================================================== --- trunk/Jmol/src/org/jmol/util/ModulationSet.java 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/util/ModulationSet.java 2014-01-10 15:19:33 UTC (rev 19162) @@ -152,7 +152,7 @@ // why would we want to use the global gammaE? } - this.gammaE = gammaE; // ?? should be gammaE_nu? + this.gammaE = gammaE; // gammaE_nu Matrix rsvs = symmetry.getOperationRsVs(iop); gammaIinv = rsvs.getSubmatrix(3, 3, modDim, modDim).inverse(); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-01-10 02:04:33 UTC (rev 19161) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-01-10 15:19:33 UTC (rev 19162) @@ -11,10 +11,15 @@ # The quotes above look odd for a parameter file, but they are # important for the JavaScript version of Jmol. -___JmolVersion="14.1.5" +___JmolVersion="14.1.5_dev_2014.01.10" + +bug fix: reading of *co*mmensurately modulated structures (e.g. Lilianite) working + +bug fix: wrong name for coverimage in WebExport. + +JmolVersion="14.1.5" JmolVersion="14.1.5_dev_2014.01.09" -bug fix: wrong name for coverimage in WebExport. bug fix: LCAOCartoon translucency broken bug fix: translucent backbone broken bug fix: pqr,p2n readers broken This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-01-16 03:54:39
|
Revision: 19176 http://sourceforge.net/p/jmol/code/19176 Author: hansonr Date: 2014-01-16 03:54:33 +0000 (Thu, 16 Jan 2014) Log Message: ----------- ___JmolVersion="14.1.6_dev_2014.01.15" bug fix: GETPROPERTY command and function can return SV.toString() rather than property escaped value bug fix: getProperty for certain arrays returns string "[object Array]" Modified Paths: -------------- trunk/Jmol/src/javajs/util/PT.java trunk/Jmol/src/org/jmol/script/SV.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java trunk/Jmol/src/org/jmol/util/Escape.java trunk/Jmol/src/org/jmol/util/Tensor.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/PropertyManager.java Modified: trunk/Jmol/src/javajs/util/PT.java =================================================================== --- trunk/Jmol/src/javajs/util/PT.java 2014-01-14 23:40:06 UTC (rev 19175) +++ trunk/Jmol/src/javajs/util/PT.java 2014-01-16 03:54:33 UTC (rev 19176) @@ -24,8 +24,10 @@ package javajs.util; +import java.lang.reflect.Array; import java.util.Map; +import javajs.J2SIgnoreImport; import javajs.api.JSONEncodable; /** @@ -34,6 +36,8 @@ * @author hansonr * */ + +@J2SIgnoreImport(value = { java.lang.reflect.Array.class }) public class PT { public static int parseInt(String str) { @@ -425,9 +429,8 @@ /** * @j2sNative * - * if(s==null){ + * if(s==null) * throw new NumberFormatException("null"); - * } * var d=parseFloat(s); * if(isNaN(d)) * throw new NumberFormatException("Not a Number : "+s); @@ -659,6 +662,25 @@ } /** + * Does a clean replace of any of the characters in str with chrTo + * If strTo contains strFrom, then only a single pass is done. + * Otherwise, multiple passes are made until no more replacements can be made. + * + * @param str + * @param strFrom + * @param chTo + * @return replaced string + */ + public static String replaceWithCharacter(String str, String strFrom, + char chTo) { + if (str == null) + return null; + for (int i = strFrom.length(); --i >= 0;) + str = str.replace(strFrom.charAt(i), chTo); + return str; + } + + /** * Does a clean replace of any of the characters in str with strTo * If strTo contains strFrom, then only a single pass is done. * Otherwise, multiple passes are made until no more replacements can be made. @@ -696,182 +718,153 @@ : value); } - /** - * Does a clean replace of any of the characters in str with chrTo - * If strTo contains strFrom, then only a single pass is done. - * Otherwise, multiple passes are made until no more replacements can be made. - * - * @param str - * @param strFrom - * @param chTo - * @return replaced string - */ - public static String replaceAllCharacter(String str, String strFrom, - char chTo) { - if (str == null) - return null; - for (int i = strFrom.length(); --i >= 0;) - str = str.replace(strFrom.charAt(i), chTo); - return str; + public static boolean isPrimitive(Object info) { + return info instanceof Integer || info instanceof Float + || info instanceof Double ||info instanceof Boolean; } @SuppressWarnings("unchecked") public static String toJSON(String infoType, Object info) { - - //Logger.debug(infoType+" -- "+info); - - SB sb = new SB(); - String sep = ""; if (info == null) return packageJSON(infoType, null); - if (info instanceof Integer || info instanceof Float - || info instanceof Double) { + if (isPrimitive(info)) return packageJSON(infoType, info.toString()); - } - if (info instanceof String) { - sb.append(fixString((String) info)); - } else if (info instanceof JSONEncodable) { - sb.append(((JSONEncodable) info).toJSON()); - } else if (isAS(info)) { - sb.append("["); - int imax = ((String[]) info).length; - for (int i = 0; i < imax; i++) { - sb.append(sep).append(fixString(((String[]) info)[i])); - sep = ","; + String s = null; + SB sb = null; + while (true) { + if (info instanceof String) { + s = fixString((String) info); + break; } - sb.append("]"); - } else if (isAI(info)) { - sb.append("["); - int imax = ((int[]) info).length; - for (int i = 0; i < imax; i++) { - sb.append(sep).appendI(((int[]) info)[i]); - sep = ","; + if (info instanceof JSONEncodable) { + // includes javajs.util.BS, org.jmol.script.SV + s = ((JSONEncodable) info).toJSON(); + break; } - sb.append("]"); - } else if (isAF(info)) { - sb.append("["); - int imax = ((float[]) info).length; - for (int i = 0; i < imax; i++) { - sb.append(sep).appendF(((float[]) info)[i]); - sep = ","; + sb = new SB(); + if (info instanceof Map) { + sb.append("{ "); + String sep = ""; + for (String key : ((Map<String, ?>) info).keySet()) { + sb.append(sep).append( + packageJSON(key, toJSON(null, ((Map<?, ?>) info).get(key)))); + sep = ","; + } + sb.append(" }"); + break; } - sb.append("]"); - } else if (isAD(info)) { - sb.append("["); - int imax = ((double[]) info).length; - for (int i = 0; i < imax; i++) { - sb.append(sep).appendD(((double[]) info)[i]); - sep = ","; + if (info instanceof List) { + sb.append("[ "); + int n = ((List<?>) info).size(); + for (int i = 0; i < n; i++) { + if (i > 0) + sb.appendC(','); + sb.append(toJSON(null, ((List<?>) info).get(i))); + } + sb.append(" ]"); + break; } - sb.append("]"); - } else if (isAP(info)) { - sb.append("["); - int imax = ((P3[]) info).length; - for (int i = 0; i < imax; i++) { - sb.append(sep); - addJsonTuple(sb, ((P3[]) info)[i]); - sep = ","; + if (info instanceof T3) { + addJsonTuple(sb, (T3) info); + break; } - sb.append("]"); - } else if (isASS(info)) { - sb.append("["); - int imax = ((String[][]) info).length; - for (int i = 0; i < imax; i++) { - sb.append(sep).append(toJSON(null, ((String[][]) info)[i])); - sep = ","; + if (info instanceof A4) { + sb.append("[").appendF(((A4) info).x).append(",") + .appendF(((A4) info).y).append(",").appendF(((A4) info).z) + .append(",").appendF((float) (((A4) info).angle * 180d / Math.PI)) + .append("]"); + break; } - sb.append("]"); - } else if (isAII(info)) { - sb.append("["); - int imax = ((int[][]) info).length; - for (int i = 0; i < imax; i++) { - sb.append(sep).append(toJSON(null, ((int[][]) info)[i])); - sep = ","; + if (info instanceof P4) { + sb.append("[").appendF(((P4) info).x).append(",") + .appendF(((P4) info).y).append(",").appendF(((P4) info).z) + .append(",").appendF(((P4) info).w).append("]"); + break; } - sb.append("]"); - } else if (isAFF(info)) { - sb.append("["); - int imax = ((float[][]) info).length; - for (int i = 0; i < imax; i++) { - sb.append(sep).append(toJSON(null, ((float[][]) info)[i])); - sep = ","; + if (info instanceof M3) { + float[] x = new float[3]; + M3 m3 = (M3) info; + sb.appendC('['); + for (int i = 0; i < 3; i++) { + if (i > 0) + sb.appendC(','); + m3.getRow(i, x); + sb.append(toJSON(null, x)); + } + sb.appendC(']'); + break; } - sb.append("]"); - } else if (isADD(info)) { - sb.append("["); - int imax = ((double[][]) info).length; - for (int i = 0; i < imax; i++) { - sb.append(sep).append(toJSON(null, ((double[][]) info)[i])); - sep = ","; + if (info instanceof M4) { + float[] x = new float[4]; + M4 m4 = (M4) info; + sb.appendC('['); + for (int i = 0; i < 4; i++) { + if (i > 0) + sb.appendC(','); + m4.getRow(i, x); + sb.append(toJSON(null, x)); + } + sb.appendC(']'); + break; } - sb.append("]"); - } else if (isAFFF(info)) { - sb.append("["); - int imax = ((float[][][]) info).length; - for (int i = 0; i < imax; i++) { - sb.append(sep).append(toJSON(null, ((float[][][]) info)[i])); - sep = ","; + int n = -1; + /** + * @j2sNative + * s = info.toString(); + * s.equals("[object Array]") && ((n = s.length) || (s = null)); + */ + { + s = nonArrayString(info); + if (s == null) + n = Array.getLength(info); } - sb.append("]"); - } else if (info instanceof List) { - sb.append("[ "); - int imax = ((List<?>) info).size(); - for (int i = 0; i < imax; i++) { - sb.append(sep).append(toJSON(null, ((List<?>) info).get(i))); - sep = ","; + if (n >= 0) { + sb.append("["); + Object o; + for (int i = 0; i < n; i++) { + if (i > 0) + sb.appendC(','); + /** + * @j2sNative + * + * o = info[i]; + */ + { + o = Array.get(info, i); + } + sb.append(toJSON(null, o)); + } + sb.append("]"); + break; } - sb.append(" ]"); - } else if (info instanceof M4) { - float[] x = new float[4]; - M4 m4 = (M4) info; - sb.appendC('['); - for (int i = 0; i < 4; i++) { - if (i > 0) - sb.appendC(','); - m4.getRow(i, x); - sb.append(toJSON(null, x)); - } - sb.appendC(']'); - } else if (info instanceof M3) { - float[] x = new float[3]; - M3 m3 = (M3) info; - sb.appendC('['); - for (int i = 0; i < 3; i++) { - if (i > 0) - sb.appendC(','); - m3.getRow(i, x); - sb.append(toJSON(null, x)); - } - sb.appendC(']'); - } else if (info instanceof T3) { - addJsonTuple(sb, (T3) info); - } else if (info instanceof A4) { - sb.append("[").appendF(((A4) info).x).append(",").appendF(((A4) info).y) - .append(",").appendF(((A4) info).z).append(",") - .appendF((float) (((A4) info).angle * 180d / Math.PI)).append("]"); - } else if (info instanceof P4) { - sb.append("[").appendF(((P4) info).x).append(",").appendF(((P4) info).y) - .append(",").appendF(((P4) info).z).append(",") - .appendF(((P4) info).w).append("]"); - } else if (info instanceof Map) { - sb.append("{ "); - for (String key : ((Map<String, ?>) info).keySet()) { - sb.append(sep).append( - packageJSON(key, toJSON(null, ((Map<?, ?>) info).get(key)))); - sep = ","; - } - sb.append(" }"); - } else { - sb.append(fixString(info.toString())); + s = fixString(s); } - return packageJSON(infoType, sb.toString()); + return packageJSON(infoType, (s == null ? sb.toString() : s)); } + public static String nonArrayString(Object x) { + /** + * @j2sNative + * + * var s = x.toString(); + * return (s == "[object Array]" ? null : s); + * + */ + { + try { + Array.getLength(x); + return null; + } catch (Exception e) { + return x.toString(); + } + } + } + public static String packageJSON(String infoType, String info) { return (infoType == null ? info : "\"" + infoType + "\": " + info); } - public static String fixString(String s) { + private static String fixString(String s) { /** * @j2sNative * Modified: trunk/Jmol/src/org/jmol/script/SV.java =================================================================== --- trunk/Jmol/src/org/jmol/script/SV.java 2014-01-14 23:40:06 UTC (rev 19175) +++ trunk/Jmol/src/org/jmol/script/SV.java 2014-01-16 03:54:33 UTC (rev 19176) @@ -49,6 +49,7 @@ import javajs.util.P3; import javajs.util.P4; import javajs.util.PT; +import javajs.util.T3; import org.jmol.util.Quaternion; import org.jmol.util.Txt; @@ -139,8 +140,7 @@ || x instanceof Float || x instanceof Integer || x instanceof String - || x instanceof P3 // stored as point3f - || x instanceof V3 // stored as point3f + || x instanceof T3 // stored as point3f || x instanceof P4 // stored as point4f || x instanceof Quaternion // stored as point4f || x instanceof Map<?, ?> // stored as Map<String, ScriptVariable> @@ -220,9 +220,13 @@ return getVariableAII((int[][]) x); if (PT.isAFF(x)) return getVariableAFF((float[][]) x); + if (PT.isASS(x)) + return getVariableASS((String[][]) x); + if (PT.isADD(x)) + return getVariableADD((double[][]) x); if (PT.isAFloat(x)) return newV(listf, x); - return newS(Escape.toReadable(null, x)); + return newS(x.toString()); } private static boolean isArray(Object x) { @@ -242,6 +246,8 @@ || x instanceof P3[] || x instanceof int[][] || x instanceof float[][] + || x instanceof String[][] + || x instanceof double[][] || x instanceof Float[]; } } @@ -257,12 +263,8 @@ } if (!(o instanceof SV)) { Map<String, SV> x2 = new Hashtable<String, SV>(); - for (Map.Entry<String, Object> entry : ht.entrySet()) { - String key = entry.getKey(); - o = entry.getValue(); - x2.put(key, isVariableType(o) ? getVariable(o) : newV(string, - Escape.toReadable(null, o))); - } + for (Map.Entry<String, Object> entry : ht.entrySet()) + x2.put(entry.getKey(), getVariable(entry.getValue())); x = x2; } return newV(hash, x); @@ -313,6 +315,20 @@ return newV(varray, objects); } + static SV getVariableADD(double[][] fx) { + List<SV> objects = new List<SV>(); + for (int i = 0; i < fx.length; i++) + objects.addLast(getVariableAD(fx[i])); + return newV(varray, objects); + } + + static SV getVariableASS(String[][] fx) { + List<SV> objects = new List<SV>(); + for (int i = 0; i < fx.length; i++) + objects.addLast(getVariableAS(fx[i])); + return newV(varray, objects); + } + static SV getVariableAII(int[][] ix) { List<SV> objects = new List<SV>(); for (int i = 0; i < ix.length; i++) Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-01-14 23:40:06 UTC (rev 19175) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-01-16 03:54:33 UTC (rev 19176) @@ -4406,7 +4406,7 @@ switch (tokAt(i)) { case T.string: s = SV.sValue(st[i]); - s = PT.replaceAllCharacter(s, "{},[]\"'", ' '); + s = PT.replaceWithCharacter(s, "{},[]\"'", ' '); fparams = PT.parseFloatArray(s); n = fparams.length; break; Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-01-14 23:40:06 UTC (rev 19175) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-01-16 03:54:33 UTC (rev 19176) @@ -1195,8 +1195,9 @@ case T.integer: if (x2.tok == T.integer && x2.intValue != 0) return addXInt(x1.intValue / x2.intValue); - if (!isDecimal(x2)) - return addXInt(x1.intValue / x2.asInt()); + int n = (isDecimal(x2) ? x2.asInt() : 0); + if (n != 0) + return addXInt(x1.intValue / n); break; case T.string: int i2; Modified: trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java 2014-01-14 23:40:06 UTC (rev 19175) +++ trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java 2014-01-16 03:54:33 UTC (rev 19176) @@ -2428,7 +2428,7 @@ invArg(); // inline PMESH data if (isPmesh) - str = PT.replaceAllCharacter(str, "{,}|", ' '); + str = PT.replaceWithCharacter(str, "{,}|", ' '); if (eval.logMessages) Logger.debug("pmesh inline data:\n" + str); propertyValue = (chk ? null : str); Modified: trunk/Jmol/src/org/jmol/util/Escape.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Escape.java 2014-01-14 23:40:06 UTC (rev 19175) +++ trunk/Jmol/src/org/jmol/util/Escape.java 2014-01-16 03:54:33 UTC (rev 19176) @@ -38,7 +38,6 @@ import javajs.util.P4; import javajs.util.T3; - import org.jmol.java.BS; import org.jmol.script.SV; @@ -90,6 +89,8 @@ return PT.esc((String) x); if (x instanceof List<?>) return eV((List<SV>) x); + if (x instanceof Map) + return escapeMap((Map<String, Object>) x); if (x instanceof BS) return eBS((BS) x); if (x instanceof T3) @@ -98,27 +99,19 @@ return eP4((P4) x); if (PT.isAS(x)) return eAS((String[]) x, true); - if (PT.isAI(x)) - return eAI((int[]) x); - if (PT.isAF(x)) - return eAF((float[]) x); - if (PT.isAD(x)) - return eAD((double[]) x); - if (PT.isAP(x)) - return eAP((P3[]) x); if (x instanceof M3) return PT.rep(((M3) x).toString(), "\t", ",\t"); if (x instanceof M4) return PT.rep(((M4) x).toString(), "\t", ",\t"); if (x instanceof A4) { A4 a = (A4) x; - return "{" + a.x + " " + a.y + " " + a.z + " " + (float) (a.angle * 180d/Math.PI) + "}"; - } - if (x instanceof Map) - return escapeMap((Map<String, Object>) x); - if (PT.isAII(x) || PT.isAFF(x) || PT.isADD(x) || PT.isAFFF(x)) - return PT.toJSON(null, x); - return x.toString(); + return "{" + a.x + " " + a.y + " " + a.z + " " + (float) (a.angle * 180d/Math.PI) + "}"; + } + if (x instanceof Quaternion) { + return ((Quaternion) x).toString(); + } + String s = PT.nonArrayString(x); + return (s == null ? PT.toJSON(null, x) : s); } public static String eV(List<SV> list) { @@ -464,13 +457,24 @@ return s.toString(); } + /** + * Used only for getProperty("readable",...) + * + * @param name + * @param info + * @return tabular listing, with array types + */ public static String toReadable(String name, Object info) { SB sb =new SB(); String sep = ""; if (info == null) return "null"; + if (PT.isPrimitive(info)) + return packageReadable(name, null, info.toString()); if (info instanceof String) return packageReadable(name, null, PT.esc((String) info)); + if (info instanceof SV) + return packageReadable(name, null, ((SV) info).escape()); if (PT.isAS(info)) { sb.append("["); int imax = ((String[]) info).length; @@ -584,7 +588,7 @@ } return sb.toString(); } - return packageReadable(name, null, info.toString()); + return packageReadable(name, null, PT.toJSON(null, info)); } private static String packageReadableSb(String infoName, String infoType, @@ -687,7 +691,7 @@ public static boolean isAV(Object x) { /** * @j2sNative - * return Clazz.instanceOf(x[0], org.jmol.scriSV); + * return Clazz.instanceOf(x[0], org.jmol.script.SV); */ { return x instanceof SV[]; Modified: trunk/Jmol/src/org/jmol/util/Tensor.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Tensor.java 2014-01-14 23:40:06 UTC (rev 19175) +++ trunk/Jmol/src/org/jmol/util/Tensor.java 2014-01-16 03:54:33 UTC (rev 19176) @@ -156,7 +156,7 @@ default: // dump all key/value pairs Map<String, Object> info = new Hashtable<String, Object>(); - String[] s = PT.getTokens(PT.replaceAllCharacter(infoList, ";.", ' ').trim()); + String[] s = PT.getTokens(PT.replaceWithCharacter(infoList, ";.", ' ').trim()); Arrays.sort(s); for (int i = 0; i < s.length; i++) { Object o = getInfo(s[i]); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-01-14 23:40:06 UTC (rev 19175) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-01-16 03:54:33 UTC (rev 19176) @@ -11,8 +11,11 @@ # The quotes above look odd for a parameter file, but they are # important for the JavaScript version of Jmol. -___JmolVersion="14.1.6_dev_2014.01.14" +___JmolVersion="14.1.6_dev_2014.01.15" +bug fix: GETPROPERTY command and function can return SV.toString() rather than property escaped value +bug fix: getProperty for certain arrays returns string "[object Array]" + code: JSpecView upgrade includes -- operational applet from jnlp -- append options from menus Modified: trunk/Jmol/src/org/jmol/viewer/PropertyManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2014-01-14 23:40:06 UTC (rev 19175) +++ trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2014-01-16 03:54:33 UTC (rev 19176) @@ -471,7 +471,7 @@ returnType = "string"; String type = "JPG"; if (params.indexOf("type=") >= 0) - type = PT.getTokens(PT.replaceAllCharacter(params.substring(params.indexOf("type=") + 5), ";,", ' '))[0]; + type = PT.getTokens(PT.replaceWithCharacter(params.substring(params.indexOf("type=") + 5), ";,", ' '))[0]; String[] errMsg = new String[1]; byte[] bytes = viewer.getImageAsBytes(type.toUpperCase(), width, height, -1, errMsg); return (errMsg[0] != null ? errMsg[0] : returnType == null ? bytes : Base64 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-01-16 15:58:50
|
Revision: 19177 http://sourceforge.net/p/jmol/code/19177 Author: hansonr Date: 2014-01-16 15:58:44 +0000 (Thu, 16 Jan 2014) Log Message: ----------- ___JmolVersion="14.1.6_dev_2014.01.16" bug fix: getproperty broken in 14.1.6_dev_2014.01.15 Modified Paths: -------------- trunk/Jmol/src/javajs/util/PT.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/javajs/util/PT.java =================================================================== --- trunk/Jmol/src/javajs/util/PT.java 2014-01-16 03:54:33 UTC (rev 19176) +++ trunk/Jmol/src/javajs/util/PT.java 2014-01-16 15:58:44 UTC (rev 19177) @@ -719,6 +719,17 @@ } public static boolean isPrimitive(Object info) { + /** + * @j2sNative + * + * switch(typeof info) { + * case "number": + * case "boolean": + * return true; + * } + */ + {} + return info instanceof Integer || info instanceof Float || info instanceof Double ||info instanceof Boolean; } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-01-16 03:54:33 UTC (rev 19176) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-01-16 15:58:44 UTC (rev 19177) @@ -11,8 +11,9 @@ # The quotes above look odd for a parameter file, but they are # important for the JavaScript version of Jmol. -___JmolVersion="14.1.6_dev_2014.01.15" +___JmolVersion="14.1.6_dev_2014.01.16" +bug fix: getproperty broken in 14.1.6_dev_2014.01.15 bug fix: GETPROPERTY command and function can return SV.toString() rather than property escaped value bug fix: getProperty for certain arrays returns string "[object Array]" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-01-16 16:36:23
|
Revision: 19178 http://sourceforge.net/p/jmol/code/19178 Author: hansonr Date: 2014-01-16 16:36:20 +0000 (Thu, 16 Jan 2014) Log Message: ----------- code fixing of toJSON Modified Paths: -------------- trunk/Jmol/src/javajs/util/AU.java trunk/Jmol/src/javajs/util/PT.java trunk/Jmol/src/org/jmol/util/Escape.java Modified: trunk/Jmol/src/javajs/util/AU.java =================================================================== --- trunk/Jmol/src/javajs/util/AU.java 2014-01-16 15:58:44 UTC (rev 19177) +++ trunk/Jmol/src/javajs/util/AU.java 2014-01-16 16:36:20 UTC (rev 19178) @@ -176,7 +176,7 @@ } } - private static int getLength(Object array) { + public static int getLength(Object array) { /** * @j2sNative * Modified: trunk/Jmol/src/javajs/util/PT.java =================================================================== --- trunk/Jmol/src/javajs/util/PT.java 2014-01-16 15:58:44 UTC (rev 19177) +++ trunk/Jmol/src/javajs/util/PT.java 2014-01-16 16:36:20 UTC (rev 19178) @@ -718,27 +718,35 @@ : value); } - public static boolean isPrimitive(Object info) { + public static boolean isNonStringPrimitive(Object info) { + // note that we don't use Double, Float, or Integer here + // because in JavaScript those would be false for unwrapped primitives + // coming from equivalent of Array.get() + // Strings will need their own escaped processing + + return info instanceof Number || info instanceof Boolean; + } + + private static Object arrayGet(Object info, int i) { /** + * + * Note that o will be a primitive in JavaScript + * but a wrapped primitive in Java. + * * @j2sNative * - * switch(typeof info) { - * case "number": - * case "boolean": - * return true; - * } + * return info[i]; */ - {} - - return info instanceof Integer || info instanceof Float - || info instanceof Double ||info instanceof Boolean; + { + return Array.get(info, i); + } } - + @SuppressWarnings("unchecked") public static String toJSON(String infoType, Object info) { if (info == null) return packageJSON(infoType, null); - if (isPrimitive(info)) + if (isNonStringPrimitive(info)) return packageJSON(infoType, info.toString()); String s = null; SB sb = null; @@ -818,32 +826,22 @@ sb.appendC(']'); break; } - int n = -1; /** * @j2sNative * s = info.toString(); - * s.equals("[object Array]") && ((n = s.length) || (s = null)); + * if (s.equals("[object Array]") + * s = null; */ { s = nonArrayString(info); - if (s == null) - n = Array.getLength(info); } - if (n >= 0) { + if (s == null) { sb.append("["); - Object o; + int n = AU.getLength(info); for (int i = 0; i < n; i++) { if (i > 0) sb.appendC(','); - /** - * @j2sNative - * - * o = info[i]; - */ - { - o = Array.get(info, i); - } - sb.append(toJSON(null, o)); + sb.append(toJSON(null, arrayGet(info, i))); } sb.append("]"); break; @@ -853,6 +851,14 @@ return packageJSON(infoType, (s == null ? sb.toString() : s)); } + /** + * Checks to see if an object is an array, and if it is, + * returns null; otherwise it returns the string equivalent + * of that object. + * + * @param x + * @return String or null + */ public static String nonArrayString(Object x) { /** * @j2sNative @@ -870,7 +876,7 @@ } } } - + public static String packageJSON(String infoType, String info) { return (infoType == null ? info : "\"" + infoType + "\": " + info); } Modified: trunk/Jmol/src/org/jmol/util/Escape.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Escape.java 2014-01-16 15:58:44 UTC (rev 19177) +++ trunk/Jmol/src/org/jmol/util/Escape.java 2014-01-16 16:36:20 UTC (rev 19178) @@ -80,11 +80,13 @@ public static String eP4(P4 x) { return "{" + x.x + " " + x.y + " " + x.z + " " + x.w + "}"; } - + @SuppressWarnings("unchecked") public static String e(Object x) { if (x == null) return "null"; + if (PT.isNonStringPrimitive(x)) + return x.toString(); if (x instanceof String) return PT.esc((String) x); if (x instanceof List<?>) @@ -107,9 +109,8 @@ A4 a = (A4) x; return "{" + a.x + " " + a.y + " " + a.z + " " + (float) (a.angle * 180d/Math.PI) + "}"; } - if (x instanceof Quaternion) { + if (x instanceof Quaternion) return ((Quaternion) x).toString(); - } String s = PT.nonArrayString(x); return (s == null ? PT.toJSON(null, x) : s); } @@ -469,7 +470,7 @@ String sep = ""; if (info == null) return "null"; - if (PT.isPrimitive(info)) + if (PT.isNonStringPrimitive(info)) return packageReadable(name, null, info.toString()); if (info instanceof String) return packageReadable(name, null, PT.esc((String) info)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-01-21 02:52:50
|
Revision: 19207 http://sourceforge.net/p/jmol/code/19207 Author: hansonr Date: 2014-01-21 02:52:45 +0000 (Tue, 21 Jan 2014) Log Message: ----------- ___JmolVersion="14.1.7" JmolVersion="14.1.7_dev_2014.01.20" bug fix: 14.0.6 fatally bugged -- unitcell and echo rendering, getProperty Modified Paths: -------------- trunk/Jmol/src/JmolApplet.java trunk/Jmol/src/javajs/util/PT.java trunk/Jmol/src/org/jmol/adapter/readers/cif/MSReader.java trunk/Jmol/src/org/jmol/api/JmolAppletInterface.java trunk/Jmol/src/org/jmol/api/JmolViewer.java trunk/Jmol/src/org/jmol/modelset/ModelCollection.java trunk/Jmol/src/org/jmol/shape/Shape.java trunk/Jmol/src/org/jmol/util/GenericApplet.java trunk/Jmol/src/org/jmol/viewer/JC.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/ShapeManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/JmolApplet.java =================================================================== --- trunk/Jmol/src/JmolApplet.java 2014-01-21 02:44:41 UTC (rev 19206) +++ trunk/Jmol/src/JmolApplet.java 2014-01-21 02:52:45 UTC (rev 19207) @@ -255,4 +255,10 @@ ((GenericApplet) wrappedApplet).register(id, jsi); } + @Override + public int getModelIndexFromId(String id) { + return (wrappedApplet == null ? Integer.MIN_VALUE : + ((GenericApplet) wrappedApplet).getModelIndexFromId(id)); + } + } Modified: trunk/Jmol/src/javajs/util/PT.java =================================================================== --- trunk/Jmol/src/javajs/util/PT.java 2014-01-21 02:44:41 UTC (rev 19206) +++ trunk/Jmol/src/javajs/util/PT.java 2014-01-21 02:52:45 UTC (rev 19207) @@ -826,7 +826,7 @@ /** * @j2sNative * - * var s = info.toString(); return (s.startsWith("[object") && + * var s = x.toString(); return (s.startsWith("[object") && * s.endsWith("Array]") ? null : s); * */ Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/MSReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/MSReader.java 2014-01-21 02:44:41 UTC (rev 19206) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/MSReader.java 2014-01-21 02:52:45 UTC (rev 19207) @@ -365,7 +365,7 @@ double[] ptHarmonic = getQCoefs(pt); if (ptHarmonic == null) { cr.appendLoadNote("Cannot match atom wave vector " + key + " " - + pt + " to a cell wave vector or its harmonic"); + + Escape.eAD(pt) + " to a cell wave vector or its harmonic"); } else { String k2 = key + "_coefs_"; if (!htModulation.containsKey(k2 + atModel)) { @@ -486,9 +486,9 @@ for (int k = kmin; k <= kmax; k++) { pt.setT(qs[0]); pt.scale(i); - if (qs[1] != null) + if (modDim > 1 && qs[1] != null) pt.scaleAdd2(j, qs[1], pt); - if (qs[2] != null) + if (modDim > 2 && qs[2] != null) pt.scaleAdd2(k, qs[2], pt); if (pt.distanceSquared(p3) < 0.0001f) { p = new double[modDim]; Modified: trunk/Jmol/src/org/jmol/api/JmolAppletInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolAppletInterface.java 2014-01-21 02:44:41 UTC (rev 19206) +++ trunk/Jmol/src/org/jmol/api/JmolAppletInterface.java 2014-01-21 02:52:45 UTC (rev 19207) @@ -41,7 +41,6 @@ public void destroy(); public Object setStereoGraphics(boolean isStereo); - Object getProperty(String infoType); public void script(String script); public String scriptCheck(String script); public String scriptWait(String script); @@ -49,6 +48,24 @@ public String scriptWait(String script, String statusParams); public String scriptNoWait(String script); + /** + * + * @param id + * some_id, + * filename#id, or + * ~fileNo.modelNo + * + * added ".basemodel" indicates to get the first model in a + * series from a JDX-MOL file. + * + * @return model index if found; + * -2 if file found but model not found + * -2 if no file indicated and no model found + * -1 if no such file + */ + public int getModelIndexFromId(String id); + + public Object getProperty(String infoType); public String getPropertyAsString(String infoType); public String getPropertyAsString(String infoType, String paramInfo); public String getPropertyAsJSON(String infoType); Modified: trunk/Jmol/src/org/jmol/api/JmolViewer.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolViewer.java 2014-01-21 02:44:41 UTC (rev 19206) +++ trunk/Jmol/src/org/jmol/api/JmolViewer.java 2014-01-21 02:52:45 UTC (rev 19207) @@ -613,6 +613,23 @@ abstract public String clipImageOrPasteText(String text); abstract public void notifyStatusReady(boolean isReady); - + + /** + * + * @param id + * some_id, + * filename#id, or + * ~fileNo.modelNo + * + * added ".basemodel" indicates to get the first model in a + * series from a JDX-MOL file. + * + * @return model index if found; + * -2 if file found but model not found + * -2 if no file indicated and no model found + * -1 if no such file + */ + abstract public int getModelIndexFromId(String id); + } Modified: trunk/Jmol/src/org/jmol/modelset/ModelCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2014-01-21 02:44:41 UTC (rev 19206) +++ trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2014-01-21 02:52:45 UTC (rev 19207) @@ -3314,12 +3314,6 @@ : 0); } - /** - * - * @param id - * @return model index if found; -2 if file found but model not found -2 if no - * file indicated and no model found -1 if no such file - */ public int getModelIndexFromId(String id) { boolean haveFile = (id.indexOf("#") >= 0); boolean isBaseModel = id.toLowerCase().endsWith(".basemodel"); Modified: trunk/Jmol/src/org/jmol/shape/Shape.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Shape.java 2014-01-21 02:44:41 UTC (rev 19206) +++ trunk/Jmol/src/org/jmol/shape/Shape.java 2014-01-21 02:52:45 UTC (rev 19207) @@ -104,6 +104,10 @@ public GData gdata; public int shapeID; public int myVisibilityFlag; + // AtomShape: Balls, Dots, GeoSurface, Ellipsoids, Halos, Labels, Polyhedra, Stars, Vectors + // Sticks, Dipoles, BioShape + // MeshCollection: Draw, CGO, Isosurface, LcaoCartoon, MolecularOrbital, Pmesh + protected float translucentLevel; public boolean translucentAllowed = true; public boolean isBioShape; @@ -159,6 +163,7 @@ } protected void setShapeVisibility(Atom atom, boolean isVisible) { + // only used for AtomShapes and BioShapes atom.setShapeVisibility(myVisibilityFlag, isVisible); } Modified: trunk/Jmol/src/org/jmol/util/GenericApplet.java =================================================================== --- trunk/Jmol/src/org/jmol/util/GenericApplet.java 2014-01-21 02:44:41 UTC (rev 19206) +++ trunk/Jmol/src/org/jmol/util/GenericApplet.java 2014-01-21 02:52:45 UTC (rev 19207) @@ -339,6 +339,11 @@ return str; } + @Override + public int getModelIndexFromId(String id) { + return viewer.getModelIndexFromId(id); + } + /** * @j2sIgnore * @param infoType Modified: trunk/Jmol/src/org/jmol/viewer/JC.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/JC.java 2014-01-21 02:44:41 UTC (rev 19206) +++ trunk/Jmol/src/org/jmol/viewer/JC.java 2014-01-21 02:52:45 UTC (rev 19207) @@ -1404,7 +1404,8 @@ public final static int SHAPE_LCAOCARTOON = 26; public final static int SHAPE_MO = 27; //but no ID for MO - public final static int SHAPE_MAX_ATOM_VIS_FLAG = 28; // no assoc with atoms after this point + private final static int SHAPE_LAST_ATOM_VIS_FLAG = 27; + // no setting of atom.shapeVisibilityFlags after this point public final static int SHAPE_PMESH = 28; public final static int SHAPE_PLOT3D = 29; @@ -1441,10 +1442,8 @@ public final static int ATOM_INFRAME_NOTHIDDEN = ATOM_INFRAME | ATOM_NOTHIDDEN; public final static int ATOM_SHAPE_VIS_MASK = ~ATOM_INFRAME_NOTHIDDEN; - // note that this is only valid for shapes with IDs < 28. - public final static int getShapeVisibilityFlag(int shapeID) { - return (shapeID < SHAPE_MAX_ATOM_VIS_FLAG ? 16 << shapeID : 0); + return 16 << Math.min(shapeID, SHAPE_LAST_ATOM_VIS_FLAG); } public static final int VIS_BOND_FLAG = 16 << SHAPE_STICKS; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-01-21 02:44:41 UTC (rev 19206) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-01-21 02:52:45 UTC (rev 19207) @@ -11,14 +11,17 @@ # The quotes above look odd for a parameter file, but they are # important for the JavaScript version of Jmol. -JmolVersion="14.1.7_dev_2014.01.19" -___JmolVersion="14.1.6" +___JmolVersion="14.1.7" +JmolVersion="14.1.7_dev_2014.01.20" + + bug fix: 14.0.6 fatally bugged -- unitcell and echo rendering, getProperty + +JmolVersion="14.1.6" + bug fix: translucent geosurface was turned off; - - recommend set TRANSLUCENT FALSE - to remove inner translucent sections - + JmolVersion="14.1.6_dev_2014.01.19" bug fix: Jmol2.js should have commented lines in Jmol.Info but does not Modified: trunk/Jmol/src/org/jmol/viewer/ShapeManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ShapeManager.java 2014-01-21 02:44:41 UTC (rev 19206) +++ trunk/Jmol/src/org/jmol/viewer/ShapeManager.java 2014-01-21 02:52:45 UTC (rev 19207) @@ -400,7 +400,7 @@ // i=1 skips balls (0) - for (int i = 1; i < JC.SHAPE_MAX_ATOM_VIS_FLAG; i++) + for (int i = 1; i < JC.SHAPE_MAX; i++) if (shapes[i] != null) shapes[i].setVisibilityFlags(bs); Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-01-21 02:44:41 UTC (rev 19206) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-01-21 02:52:45 UTC (rev 19207) @@ -8849,6 +8849,7 @@ getStateCreator().syncScript(script, applet, port); } + @Override public int getModelIndexFromId(String id) { // from JSpecView peak pick and model "ID" return modelSet.getModelIndexFromId(id); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-02-06 04:14:34
|
Revision: 19266 http://sourceforge.net/p/jmol/code/19266 Author: hansonr Date: 2014-02-06 04:14:27 +0000 (Thu, 06 Feb 2014) Log Message: ----------- ___JmolVersion="14.1.8_dev_2014.02.05b" new feature: Tinker file reader (and FoldingXYZ reader upgrade) Modified Paths: -------------- trunk/Jmol/src/javajs/util/CU.java trunk/Jmol/src/org/jmol/adapter/readers/simple/FoldingXyzReader.java trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java trunk/Jmol/src/org/jmol/constant/StaticConstants.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/javajs/util/CU.java =================================================================== --- trunk/Jmol/src/javajs/util/CU.java 2014-02-05 15:40:32 UTC (rev 19265) +++ trunk/Jmol/src/javajs/util/CU.java 2014-02-06 04:14:27 UTC (rev 19266) @@ -5,6 +5,11 @@ import javajs.api.GenericColor; +/** + * ColorUtility + * + */ + public class CU { public static String toRGBHexString(GenericColor c) { Modified: trunk/Jmol/src/org/jmol/adapter/readers/simple/FoldingXyzReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/simple/FoldingXyzReader.java 2014-02-05 15:40:32 UTC (rev 19265) +++ trunk/Jmol/src/org/jmol/adapter/readers/simple/FoldingXyzReader.java 2014-02-06 04:14:27 UTC (rev 19266) @@ -27,7 +27,8 @@ import org.jmol.adapter.smarter.AtomSetCollectionReader; import org.jmol.adapter.smarter.Atom; -import java.util.StringTokenizer; +import java.util.Hashtable; +import java.util.Map; import javajs.util.AU; import javajs.util.PT; @@ -40,122 +41,135 @@ * I have not found a precise description of the file format. * I used source code from fpd from Dick Howell to analyze the file format. * (see <a href="http://boston.quik.com/rph">http://boston.quik.com/rph</a>) + * -- Nico Vervelle + * + * Extended by Bob Hanson 2/2014: + * + * - adds support for newer Tinker files (see data/folding) + * - adds desired model options + * - adds atom type if available + * */ public class FoldingXyzReader extends AtomSetCollectionReader { - // Enable / Disable features of the reader - private final static boolean useAutoBond = false; + @Override + protected void initializeReader() { + atomSetCollection.setNoAutoBond(); + } + /** + * @return true if next line needs to be read. + * + * Note that just a single token on line 1 is NOT possible. + * If that were the case, the xyz reader would have captured this. + * + */ @Override protected boolean checkLine() throws Exception { - StringTokenizer tokens = new StringTokenizer(line, " \t"); - if (tokens.hasMoreTokens()) { - atomSetCollection.newAtomSet(); - int modelAtomCount = PT.parseIntRadix(tokens.nextToken(), 10); - if (tokens.hasMoreTokens()) - atomSetCollection.setAtomSetName("Protein " + tokens.nextToken()); - readAtoms(modelAtomCount); - } + int[] next = new int[] { 0 }; + String token = PT.parseTokenNext(line, next); + if (token == null) return true; + boolean addAtoms = doGetModel(++modelNumber, null); + int modelAtomCount = parseIntStr(token); + String[] tokens = getTokens(); + if (addAtoms) { + atomSetCollection.newAtomSet(); + atomSetCollection.setAtomSetName(tokens.length == 2 ? "Protein " + + tokens[1] : line.substring(next[0])); + } + boolean readLine = readAtoms(modelAtomCount + 1, addAtoms); // Some Tinker files are one off! + continuing = !addAtoms || !isLastModel(modelNumber); + return readLine; } /** - * @param modelAtomCount + * Lots of possibilities here: + * + * atom count is real; atom count is one less than true atom count + * sixth column is atom type; sixth column is first bond + * + * + * @param atomCount + * @param addAtoms + * @return true if next line needs to be read * @throws Exception */ - void readAtoms(int modelAtomCount) throws Exception { - // Stores bond informations - int[][] bonds = AU.newInt2(modelAtomCount + 1); - for (int i = 0; i <= modelAtomCount; ++i) { - bonds[i] = null; - } - - for (int i = 0; i <= modelAtomCount; ++i) { - readLine(); - if (line != null && line.length() == 0) { - readLine(); + boolean readAtoms(int atomCount, boolean addAtoms) throws Exception { + // Stores bond informations + Map<String, int[]> htBondCounts = new Hashtable<String, int[]>(); + int[][] bonds = AU.newInt2(atomCount); + boolean haveAtomTypes = true; + boolean checking = true; + int i0 = atomSetCollection.atomCount; + String lastAtom = null; + boolean readNextLine = true; + for (int i = 0; i < atomCount; i++) { + discardLinesUntilNonBlank(); + if (line == null) + break; // no problem. + String[] tokens = getTokensStr(line); + if (tokens[0].equals(lastAtom)) { + readNextLine = false; + break; // end; next structure; } - if (line != null && line.length() > 0) { - //Logger.debug("Line: " + line); - Atom atom = atomSetCollection.addNewAtom(); - parseIntStr(line); - atom.atomName = parseToken(); - if (atom.atomName != null) { - int carCount = 1; - if (atom.atomName.length() >= 2) { - char c1 = atom.atomName.charAt(0); - char c2 = atom.atomName.charAt(1); - if (Character.isUpperCase(c1) && Character.isLowerCase(c2) && - Atom.isValidElementSymbol2(c1, c2)) { - carCount = 2; - } - if ((c1 == 'C') && (c2 =='L')) { - carCount = 2; - } + lastAtom = tokens[0]; + if (!addAtoms) + continue; + addAtomXYZSymName(tokens, 2, getElement(tokens[1]), tokens[1]); + int n = tokens.length - 5; + bonds[i] = new int[n]; + for (int j = 0; j < n; j++) { + String t = tokens[j + 5]; + int i2 = parseIntStr(t) - 1; + bonds[i][j] = i2; + if (checking) { + // Tinker files may or may not include an atom type in column 6 + if (n == 0 || i2 == i || i2 < 0 || i2 >= atomCount) { + haveAtomTypes = (n > 0); + checking = false; + } else { + int[] count = htBondCounts.get(t); + if (count == null) + htBondCounts.put(t, count = new int[1]); + if (++count[0] > 10) // even 10 is quite many bonds! + haveAtomTypes = !(checking = false); } - atom.elementSymbol = atom.atomName.substring(0, carCount); } - setAtomCoordXYZ(atom, parseFloat(), parseFloat(), parseFloat()); - - // Memorise bond informations - int bondCount = 0; - bonds[i] = new int[5]; - int bondNum = Integer.MIN_VALUE; - while ((bondNum = parseInt()) > 0) { - if (bondCount == bonds[i].length) { - bonds[i] = AU.arrayCopyI(bonds[i], bondCount + 1); - } - bonds[i][bondCount++] = bondNum - 1; - } - if (bondCount < bonds[i].length) { - bonds[i] = AU.arrayCopyI(bonds[i], bondCount); - } } } - - // Bonds - if (!useAutoBond) { - - // Decide if first bond is relevant - int incorrectBonds = 0; - for (int origin = 0; origin < bonds.length; origin++) { - if ((bonds[origin] != null) && (bonds[origin].length > 0)) { - boolean correct = false; - int destination = bonds[origin][0]; - if ((destination >= 0) && (destination < bonds.length) && (bonds[destination] != null)) { - for (int j = 0; j < bonds[destination].length; j++) { - if (bonds[destination][j] == origin) { - correct = true; - } - } - } - if (!correct) { - incorrectBonds++; - } - } - } - - // Create bond - int start = (incorrectBonds * 5) > bonds.length ? 1 : 0; - for (int origin = start; origin < bonds.length; origin++) { - if (bonds[origin] != null) { - for (int i = 0; i < bonds[origin].length; i++) { - boolean correct = false; - int destination = bonds[origin][i]; - if ((destination >= 0) && (destination < bonds.length) && (bonds[destination] != null)) { - for (int j = start; j < bonds[destination].length; j++) { - if (bonds[destination][j] == origin) { - correct = true; - } - } - } - if (correct && (destination > origin)) { - atomSetCollection.addNewBondWithOrder(origin, destination, 1); - } - } - } - } + if (addAtoms) + makeBonds(i0, bonds, !checking && haveAtomTypes); + return readNextLine; + } + + private void makeBonds(int i0, int[][] bonds, boolean haveAtomTypes) { + Atom[] atoms = atomSetCollection.atoms; + for (int i = bonds.length; --i >= 0;) { + int[] b = bonds[i]; + if (b == null) + continue; + Atom a = atoms[i0 + i]; + int b0 = 0; + if (haveAtomTypes) + a.atomName += "\0" + (b[b0++] + 1); + for (int j = b.length; --j >= b0;) + if (b[j] > i) + atomSetCollection.addNewBondWithOrder(i0 + i, i0 + b[j], 1); } } + + private String getElement(String name) { + int n = name.length(); + switch (n) { + case 1: + break; + default: + char c1 = name.charAt(0); + char c2 = name.charAt(1); + n = (Atom.isValidElementSymbol2(c1, c2) || c1 == 'C' && c2 == 'L' ? 2 : 1); + } + return name.substring(0, n); + } } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java 2014-02-05 15:40:32 UTC (rev 19265) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java 2014-02-06 04:14:27 UTC (rev 19266) @@ -123,13 +123,6 @@ return elementSymbol; } - /** - * Bits which indicate whether or not an element symbol is valid. - *<p> - * If the high bit is set, then it is valid as a standalone char. - * otherwise, bits 0-25 say whether or not is valid when followed - * by the letters a-z. - */ private final static int[] elementCharMasks = { // Ac Ag Al Am Ar As At Au 1 << ('c' - 'a') | @@ -278,9 +271,8 @@ } public static boolean isValidElementSymbol2(char chFirst, char chSecond) { - if (chFirst < 'A' || chFirst > 'Z' || chSecond < 'a' || chSecond > 'z') - return false; - return ((elementCharMasks[chFirst - 'A'] >> (chSecond - 'a')) & 1) != 0; + return (chFirst >= 'A' && chFirst <= 'Z' && chSecond >= 'a' + && chSecond <= 'z' && ((elementCharMasks[chFirst - 'A'] >> (chSecond - 'a')) & 1) != 0); } public static boolean isValidElementSymbolNoCaseSecondChar2(char chFirst, Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java 2014-02-05 15:40:32 UTC (rev 19265) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java 2014-02-06 04:14:27 UTC (rev 19266) @@ -254,7 +254,7 @@ } } - void setNoAutoBond() { + public void setNoAutoBond() { setAtomSetCollectionAuxiliaryInfo("noAutoBond", Boolean.TRUE); } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2014-02-05 15:40:32 UTC (rev 19265) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2014-02-06 04:14:27 UTC (rev 19266) @@ -452,6 +452,7 @@ if (nLines == 1 && lines[0].length() > 0 && Character.isDigit(lines[0].charAt(0))) return specialTags[SPECIAL_JME][0]; //only one line, and that line starts with a number + if (checkMopacGraphf(lines)) return specialTags[SPECIAL_MOPACGRAPHF][0]; //must be prior to checkFoldingXyz and checkMol if (checkOdyssey(lines)) Modified: trunk/Jmol/src/org/jmol/constant/StaticConstants.java =================================================================== --- trunk/Jmol/src/org/jmol/constant/StaticConstants.java 2014-02-05 15:40:32 UTC (rev 19265) +++ trunk/Jmol/src/org/jmol/constant/StaticConstants.java 2014-02-06 04:14:27 UTC (rev 19266) @@ -58,4 +58,4 @@ public final static byte PALETTE_VARIABLE = 21 | PALETTE_VOLATILE; public final static byte PALETTE_STRAIGHTNESS = 22 | PALETTE_VOLATILE; public final static byte PALETTE_POLYMER = 23 | PALETTE_VOLATILE; -} +} \ No newline at end of file Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-02-05 15:40:32 UTC (rev 19265) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-02-06 04:14:27 UTC (rev 19266) @@ -13,8 +13,10 @@ # important for the JavaScript version of Jmol. -___JmolVersion="14.1.8_dev_2014.02.05" +___JmolVersion="14.1.8_dev_2014.02.05b" +new feature: Tinker file reader (and FoldingXYZ reader upgrade) + code: refactoring to enable SWING in JavaScript for all menus new feature: (actually 13.1 but undocumented) animation frame [ 51 50 49 48 47 46 45 (etc) 27 1 2 3 4 5 6 7 (etc)....] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-02-06 17:06:56
|
Revision: 19272 http://sourceforge.net/p/jmol/code/19272 Author: hansonr Date: 2014-02-06 17:06:51 +0000 (Thu, 06 Feb 2014) Log Message: ----------- ___JmolVersion="14.1.8_dev_2014.02.06" bug fix: substructure() function using SMILES instead of SMARTS, so only full structures; bug fix: better error trapping and messages in SMILES-related methods Modified Paths: -------------- trunk/Jmol/src/JmolSmilesApplet.java trunk/Jmol/src/javajs/api/SC.java trunk/Jmol/src/javajs/awt/Component.java trunk/Jmol/src/javajs/swing/AbstractButton.java trunk/Jmol/src/javajs/swing/JMenuItem.java trunk/Jmol/src/org/jmol/api/JmolViewer.java trunk/Jmol/src/org/jmol/api/SmilesMatcherInterface.java trunk/Jmol/src/org/jmol/minimize/forcefield/ForceFieldMMFF.java trunk/Jmol/src/org/jmol/modelkit/ModelKitPopup.java trunk/Jmol/src/org/jmol/popup/AwtSwingComponent.java trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java trunk/Jmol/src/org/jmol/smiles/InvalidSmilesException.java trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java trunk/Jmol/src/org/jmol/viewer/ActionManager.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/JmolSmilesApplet.java =================================================================== --- trunk/Jmol/src/JmolSmilesApplet.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/JmolSmilesApplet.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -85,18 +85,15 @@ * 1: found at least 1, 0: not found, -1: error */ public int find(String pattern, String smiles, boolean isSmarts, boolean isAll) { - System.out.println("find " + pattern + " in " + smiles + " isSmarts? " - + isSmarts + "; isAll? " + isAll); lastError = null; int ret = -1; try { SmilesMatcher sm = new SmilesMatcher(); BS[] result = sm.find(pattern, smiles, isSmarts, !isAll); - if (result == null) - lastError = InvalidSmilesException.getLastError(); ret = (result == null ? -1 : result.length); } catch (Exception e) { System.out.println(e.getMessage()); + lastError = InvalidSmilesException.getLastError(); } catch (Error er) { System.out.println(er.getMessage()); } @@ -108,10 +105,14 @@ * * @param smiles1 * @param smiles2 - * @return IDENTICAL, ENANTIOMERS, DIASTERIOMERS, CONSTITUTIONAL ISOMERS, NONE + * @return IDENTICAL, ENANTIOMERS, DIASTERIOMERS, CONSTITUTIONAL ISOMERS, NONE, or an error message */ public String getRelationship(String smiles1, String smiles2) { - return (new SmilesMatcher()).getRelationship(smiles1, smiles2); + try { + return (new SmilesMatcher()).getRelationship(smiles1, smiles2); + } catch (Exception e) { + return e.toString(); + } } Modified: trunk/Jmol/src/javajs/api/SC.java =================================================================== --- trunk/Jmol/src/javajs/api/SC.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/javajs/api/SC.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -32,10 +32,14 @@ Object getPopupMenu(); + Object getIcon(); + String getText(); void init(String text, Object icon, String actionCommand, SC popupMenu); + void insert(SC subMenu, int index); + boolean isEnabled(); boolean isSelected(); @@ -50,12 +54,12 @@ void setEnabled(boolean enable); + void setIcon(Object icon); + void setName(String string); void setSelected(boolean state); void setText(String entry); - void insert(SC subMenu, int index); - } Modified: trunk/Jmol/src/javajs/awt/Component.java =================================================================== --- trunk/Jmol/src/javajs/awt/Component.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/javajs/awt/Component.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -15,7 +15,6 @@ protected Object parent; - protected Object actionListener; protected Object mouseListener; private GenericColor bgcolor; @@ -68,16 +67,6 @@ this.height = dimension.height; } - /** - * It will be the function of the JavaScript on the - * page to do with selectionListener what is desired. - * @param listener - * - */ - public void addActionListener(Object listener) { - actionListener = listener; - } - public void addMouseListener(Object listener) { mouseListener = listener; } Modified: trunk/Jmol/src/javajs/swing/AbstractButton.java =================================================================== --- trunk/Jmol/src/javajs/swing/AbstractButton.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/javajs/swing/AbstractButton.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -6,12 +6,17 @@ public abstract class AbstractButton extends JComponent implements SC { - boolean selected; - String actionCommand; + Object actionListener; Object itemListener; - SC popupMenu; Object applet; + String htmlName; + boolean selected; + + private String actionCommand; + private SC popupMenu; + private String icon; + protected AbstractButton(String type) { super(type); enabled = true; @@ -35,7 +40,18 @@ return selected; } + /** + * It will be the function of the JavaScript on the + * page to do with selectionListener what is desired. + * @param listener + * + */ @Override + public void addActionListener(Object listener) { + actionListener = listener; + } + + @Override public String getActionCommand() { return actionCommand; } @@ -50,9 +66,12 @@ itemListener = listener; } - protected String icon; - public String htmlName; - + @Override + public Object getIcon() { + return icon; + } + + @Override public void setIcon(Object icon) { this.icon = (String) icon; } @@ -72,6 +91,11 @@ { } } + + public SC getTopPopupMenu() { + // note that JMenu.getPopupMenu refers to ITSELF, not the main one) + return popupMenu; + } @Override public void add(SC item) { Modified: trunk/Jmol/src/javajs/swing/JMenuItem.java =================================================================== --- trunk/Jmol/src/javajs/swing/JMenuItem.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/javajs/swing/JMenuItem.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -4,7 +4,7 @@ public class JMenuItem extends AbstractButton { - private int btnType; + int btnType; public JMenuItem(String text) { super("btn"); @@ -32,5 +32,5 @@ protected String htmlLabel() { return (this.text != null ? "TeXt" : ""); } - + } Modified: trunk/Jmol/src/org/jmol/api/JmolViewer.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolViewer.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/org/jmol/api/JmolViewer.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -178,7 +178,7 @@ abstract public void setInMotion(boolean isInMotion); - abstract public BS getSmartsMatch(String smarts, BS bsSelected); + abstract public BS getSmartsMatch(String smarts, BS bsSelected) throws Exception; /** * an added class for rendering stereo in two independent applets @@ -227,7 +227,7 @@ // for example: getData("selected","XYZ"); abstract public String getData(String atomExpression, String type); - abstract public String getSmiles(BS atoms); + abstract public String getSmiles(BS atoms) throws Exception; @Override abstract public void setScreenDimension(int width, int height); Modified: trunk/Jmol/src/org/jmol/api/SmilesMatcherInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/SmilesMatcherInterface.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/org/jmol/api/SmilesMatcherInterface.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -11,15 +11,15 @@ public abstract String getLastException(); - public int areEqual(String smiles1, String smiles2); + public int areEqual(String smiles1, String smiles2) throws Exception; public abstract BS[] find(String pattern,/* ...in... */String smiles, - boolean isSmarts, boolean firstMatchOnly); + boolean isSmarts, boolean firstMatchOnly) throws Exception; public abstract BS getSubstructureSet(String pattern, JmolNode[] atoms, int atomCount, BS bsSelected, boolean isSmarts, - boolean firstMatchOnly); + boolean firstMatchOnly) throws Exception; public abstract BS[] getSubstructureSetArray(String pattern, JmolNode[] atoms, @@ -27,26 +27,26 @@ BS bsSelected, BS bsAromatic, boolean isSmarts, - boolean firstMatchOnly); + boolean firstMatchOnly) throws Exception; public abstract int[][] getCorrelationMaps(String pattern, JmolNode[] atoms, int atomCount, BS bsSelected, boolean isSmarts, - boolean firstMatchOnly); + boolean firstMatchOnly) throws Exception; - public abstract String getMolecularFormula(String pattern, boolean isSearch); + public abstract String getMolecularFormula(String pattern, boolean isSearch) throws Exception; public abstract String getSmiles(JmolNode[] atoms, int atomCount, BS bsSelected, boolean asBioSmiles, boolean bioAllowUnmatchedRings, boolean bioAddCrossLinks, String bioComment, - boolean explicitH); + boolean explicitH) throws Exception; - public abstract String getRelationship(String smiles1, String smiles2); + public abstract String getRelationship(String smiles1, String smiles2) throws Exception; - public abstract String reverseChirality(String smiles); + public abstract String reverseChirality(String smiles) throws Exception; public abstract void getSubstructureSets(String[] smarts, JmolNode[] atoms, int atomCount, int flags, - BS bsSelected, List<BS> bitSets, List<BS>[] vRings); + BS bsSelected, List<BS> bitSets, List<BS>[] vRings) throws Exception; } Modified: trunk/Jmol/src/org/jmol/minimize/forcefield/ForceFieldMMFF.java =================================================================== --- trunk/Jmol/src/org/jmol/minimize/forcefield/ForceFieldMMFF.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/org/jmol/minimize/forcefield/ForceFieldMMFF.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -864,9 +864,13 @@ // for each atom. So the FIRST occurrence of an atom in the list // identifies that atom's MMFF94 type. - smartsMatcher.getSubstructureSets(smarts, atoms, atoms.length, - JmolEdge.FLAG_AROMATIC_STRICT | JmolEdge.FLAG_AROMATIC_DOUBLE, - bsConnected, bitSets, vRings); + try { + smartsMatcher.getSubstructureSets(smarts, atoms, atoms.length, + JmolEdge.FLAG_AROMATIC_STRICT | JmolEdge.FLAG_AROMATIC_DOUBLE, + bsConnected, bitSets, vRings); + } catch (Exception e) { + Logger.error(e.toString()); + } BS bsDone = new BS(); for (int j = 0; j < bitSets.size(); j++) { BS bs = bitSets.get(j); Modified: trunk/Jmol/src/org/jmol/modelkit/ModelKitPopup.java =================================================================== --- trunk/Jmol/src/org/jmol/modelkit/ModelKitPopup.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/org/jmol/modelkit/ModelKitPopup.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -35,6 +35,8 @@ import javax.swing.JPopupMenu; import org.jmol.i18n.GT; +import org.jmol.popup.AwtSwingComponent; +import org.jmol.popup.AwtSwingPopupHelper; import org.jmol.popup.JmolGenericPopup; import org.jmol.popup.PopupResource; import org.jmol.util.Elements; @@ -43,7 +45,7 @@ public class ModelKitPopup extends JmolGenericPopup { public ModelKitPopup() { - // required by reflection + helper = new AwtSwingPopupHelper(this); } @Override @@ -59,7 +61,7 @@ @Override protected void menuShowPopup(SC popup, int x, int y) { try { - ((JPopupMenu)popup).show((Component) viewer.getDisplay(), x, y); + ((JPopupMenu)((AwtSwingComponent)popup).jc).show((Component) viewer.getDisplay(), x, y); } catch (Exception e) { // ignore } Modified: trunk/Jmol/src/org/jmol/popup/AwtSwingComponent.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/AwtSwingComponent.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/org/jmol/popup/AwtSwingComponent.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -74,21 +74,22 @@ @Override public void add(SC item) { - if (item == null || item.getText() == null || item.getText().length() == 0) { + if (item == null || item.getIcon() == null + && (item.getText() == null || item.getText().length() == 0)) { if (jm == null) ((JPopupMenu) jc).addSeparator(); else jm.addSeparator(); - return; + return; } - + AwtSwingComponent c = (AwtSwingComponent) item; jc.add(c.jc); - + // in Java, a menuItem gets one and only one parent. // This is never changed, even if the item is moved // to another menu. So we set this exactly ONCE. - + if (c.parent == null) c.parent = this; } @@ -151,13 +152,16 @@ } @Override + public Object getIcon() { + return ab.getIcon(); + } + + @Override public void init(String text, Object icon, String actionCommand, SC popupMenu) { - if (text != null) - ab.setText(text); - if (icon != null) - ab.setIcon((Icon) icon); - ab.setActionCommand(actionCommand); + setText(text); + setIcon(icon); + setActionCommand(actionCommand); } @Override @@ -218,4 +222,9 @@ ab.setText(text); } + @Override + public void setIcon(Object icon) { + ab.setIcon((Icon) icon); + } + } \ No newline at end of file Modified: trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -2788,17 +2788,18 @@ * @param bsIgnore * @param fileName * @return calculated atom potentials + * @throws Exception */ private float[] getAtomicPotentials(BS bsSelected, BS bsIgnore, - String fileName) { + String fileName) throws Exception { float[] potentials = new float[viewer.getAtomCount()]; MepCalculationInterface m = (MepCalculationInterface) Interface .getOptionInterface("quantum.MlpCalculation"); m.set(viewer); String data = (fileName == null ? null : viewer.getFileAsString(fileName, false)); - m.assignPotentials(viewer.modelSet.atoms, potentials, viewer.getSmartsMatch("a", - bsSelected), viewer.getSmartsMatch("/noAromatic/[$(C=O),$(O=C),$(NC=O)]", - bsSelected), bsIgnore, data); + m.assignPotentials(viewer.modelSet.atoms, potentials, viewer.getSmartsMatch("a", + bsSelected), viewer.getSmartsMatch("/noAromatic/[$(C=O),$(O=C),$(NC=O)]", + bsSelected), bsIgnore, data); return potentials; } @@ -5184,7 +5185,11 @@ checkLength(tok == T.chemical ? 3 : 2); if (chk) return; - msg = viewer.getSmiles(null); + try { + msg = viewer.getSmiles(null); + } catch (Exception e) { + msg = e.getMessage(); + } switch (tok) { case T.drawing: if (msg.length() > 0) { @@ -5991,7 +5996,7 @@ eval.runScript(sb.toString()); } catch (Exception e) { viewer.setSelectionSubset(bsSubset); - eval.errorStr(-1, "Error: " + e.toString()); + eval.errorStr(-1, "Error: " + e.getMessage()); } catch (Error er) { viewer.setSelectionSubset(bsSubset); eval.errorStr(-1, "Error: " + er.toString()); @@ -6483,7 +6488,11 @@ M4 m4 = new M4(); center = new P3(); if ("*".equals(strSmiles) && bsFrom != null) - strSmiles = viewer.getSmiles(bsFrom); + try { + strSmiles = viewer.getSmiles(bsFrom); + } catch (Exception e) { + eval.evalError(e.getMessage(), null); + } if (isFlexFit) { float[] list; if (bsFrom == null || bsTo == null || (list = getFlexFitList(bsFrom, bsTo, strSmiles, !isSmiles)) == null) @@ -6598,8 +6607,13 @@ return; Atom[] atoms = viewer.modelSet.atoms; int atomCount = viewer.getAtomCount(); - int[][] maps = viewer.getSmilesMatcher().getCorrelationMaps(smarts, - atoms, atomCount, viewer.getSelectedAtoms(), true, false); + int[][] maps = null; + try { + maps = viewer.getSmilesMatcher().getCorrelationMaps(smarts, + atoms, atomCount, viewer.getSelectedAtoms(), true, false); + } catch (Exception e) { + eval.evalError(e.getMessage(), null); + } if (maps == null) return; setShapeProperty(JC.SHAPE_MEASURES, "maps", maps); @@ -7018,7 +7032,7 @@ for (int j = 0; j < maps[i].length; j++) ptsB.addLast(atoms[maps[i][j]]); } catch (Exception e) { - eval.evalError(e.toString(), null); + eval.evalError(e.getMessage(), null); } return 0; } @@ -7037,11 +7051,12 @@ if (pattern.length() == 0 || pattern.equals("H")) { boolean isBioSmiles = (!asOneBitset); - Object ret = viewer.getSmilesOpt(bsSelected, 0, 0, pattern.equals("H"), isBioSmiles, false, - true, true); - if (ret == null) - eval.evalError(viewer.getSmilesMatcher().getLastException(), null); - return ret; + try { + return viewer.getSmilesOpt(bsSelected, 0, 0, pattern.equals("H"), + isBioSmiles, false, true, true); + } catch (Exception e) { + eval.evalError(e.getMessage(), null); + } } boolean asAtoms = true; @@ -7051,19 +7066,19 @@ // getting a BitSet or BitSet[] from a set of atoms or a pattern. asAtoms = (smiles == null); - if (asAtoms) - b = viewer.getSmilesMatcher().getSubstructureSetArray(pattern, - viewer.modelSet.atoms, viewer.getAtomCount(), bsSelected, null, - isSmarts, false); - else - b = viewer.getSmilesMatcher().find(pattern, smiles, isSmarts, false); + try { + if (asAtoms) + b = viewer.getSmilesMatcher().getSubstructureSetArray(pattern, + viewer.modelSet.atoms, viewer.getAtomCount(), bsSelected, null, + isSmarts, false); + else + b = viewer.getSmilesMatcher().find(pattern, smiles, isSmarts, false); - if (b == null) { - eval.showStringPrint(viewer.getSmilesMatcher().getLastException(), - false); - if (!asAtoms && !isSmarts) - return Integer.valueOf(-1); - return "?"; + } catch (Exception e) { + eval.evalError(e.getMessage(), null); + //if (!asAtoms && !isSmarts) + //return Integer.valueOf(-1); + return null; } } else { @@ -7298,125 +7313,137 @@ return false; smiles1 = SV.sValue(args[2]); isSmiles = smiles1.equalsIgnoreCase("SMILES"); - if (isSmiles) - smiles1 = viewer.getSmiles(bs1); + try { + if (isSmiles) + smiles1 = viewer.getSmiles(bs1); + } catch (Exception e) { + eval.evalError(e.getMessage(), null); + } float[] data = getFlexFitList(bs1, bs2, smiles1, !isSmiles); return (data == null ? mp.addXStr("") : mp.addXAF(data)); } - if (isIsomer) { - if (args.length != 3) - return false; - if (bs1 == null && bs2 == null) - return mp.addXStr(viewer.getSmilesMatcher() - .getRelationship(smiles1, smiles2).toUpperCase()); - String mf1 = (bs1 == null ? viewer.getSmilesMatcher() - .getMolecularFormula(smiles1, false) : JmolMolecule - .getMolecularFormula(viewer.getModelSet().atoms, bs1, false)); - String mf2 = (bs2 == null ? viewer.getSmilesMatcher() - .getMolecularFormula(smiles2, false) : JmolMolecule - .getMolecularFormula(viewer.getModelSet().atoms, bs2, false)); - if (!mf1.equals(mf2)) - return mp.addXStr("NONE"); - if (bs1 != null) - smiles1 = (String) getSmilesMatches("", null, bs1, null, false, true); - boolean check; - if (bs2 == null) { - // note: find smiles1 IN smiles2 here - check = (viewer.getSmilesMatcher().areEqual(smiles2, smiles1) > 0); - } else { - check = (((BS) getSmilesMatches(smiles1, null, bs2, null, false, true)) - .nextSetBit(0) >= 0); - } - if (!check) { - // MF matched, but didn't match SMILES - String s = smiles1 + smiles2; - if (s.indexOf("/") >= 0 || s.indexOf("\\") >= 0 || s.indexOf("@") >= 0) { - if (smiles1.indexOf("@") >= 0 - && (bs2 != null || smiles2.indexOf("@") >= 0)) { - // reverse chirality centers - smiles1 = viewer.getSmilesMatcher().reverseChirality(smiles1); + try { + if (isIsomer) { + if (args.length != 3) + return false; + if (bs1 == null && bs2 == null) + return mp.addXStr(viewer.getSmilesMatcher() + .getRelationship(smiles1, smiles2).toUpperCase()); + String mf1 = (bs1 == null ? viewer.getSmilesMatcher() + .getMolecularFormula(smiles1, false) : JmolMolecule + .getMolecularFormula(viewer.getModelSet().atoms, bs1, false)); + String mf2 = (bs2 == null ? viewer.getSmilesMatcher() + .getMolecularFormula(smiles2, false) : JmolMolecule + .getMolecularFormula(viewer.getModelSet().atoms, bs2, false)); + if (!mf1.equals(mf2)) + return mp.addXStr("NONE"); + if (bs1 != null) + smiles1 = (String) getSmilesMatches("", null, bs1, null, false, true); + boolean check; + if (bs2 == null) { + // note: find smiles1 IN smiles2 here + check = (viewer.getSmilesMatcher().areEqual(smiles2, smiles1) > 0); + } else { + check = (((BS) getSmilesMatches(smiles1, null, bs2, null, false, true)) + .nextSetBit(0) >= 0); + } + if (!check) { + // MF matched, but didn't match SMILES + String s = smiles1 + smiles2; + if (s.indexOf("/") >= 0 || s.indexOf("\\") >= 0 + || s.indexOf("@") >= 0) { + if (smiles1.indexOf("@") >= 0 + && (bs2 != null || smiles2.indexOf("@") >= 0)) { + // reverse chirality centers + smiles1 = viewer.getSmilesMatcher().reverseChirality(smiles1); + if (bs2 == null) { + check = (viewer.getSmilesMatcher().areEqual(smiles1, smiles2) > 0); + } else { + check = (((BS) getSmilesMatches(smiles1, null, bs2, null, + false, true)).nextSetBit(0) >= 0); + } + if (check) + return mp.addXStr("ENANTIOMERS"); + } + // remove all stereochemistry from SMILES string if (bs2 == null) { - check = (viewer.getSmilesMatcher().areEqual(smiles1, smiles2) > 0); + check = (viewer.getSmilesMatcher().areEqual( + "/nostereo/" + smiles2, smiles1) > 0); } else { - check = (((BS) getSmilesMatches(smiles1, null, bs2, null, false, - true)).nextSetBit(0) >= 0); + Object ret = getSmilesMatches("/nostereo/" + smiles1, null, bs2, + null, false, true); + check = (((BS) ret).nextSetBit(0) >= 0); } if (check) - return mp.addXStr("ENANTIOMERS"); + return mp.addXStr("DIASTERIOMERS"); } - // remove all stereochemistry from SMILES string - if (bs2 == null) { - check = (viewer.getSmilesMatcher().areEqual("/nostereo/" + smiles2, - smiles1) > 0); + // MF matches, but not enantiomers or diasteriomers + return mp.addXStr("CONSTITUTIONAL ISOMERS"); + } + //identical or conformational + if (bs1 == null || bs2 == null) + return mp.addXStr("IDENTICAL"); + stddev = getSmilesCorrelation(bs1, bs2, smiles1, null, null, null, + null, false, false, null, null, false, false); + return mp.addXStr(stddev < 0.2f ? "IDENTICAL" + : "IDENTICAL or CONFORMATIONAL ISOMERS (RMSD=" + stddev + ")"); + } else if (isSmiles) { + ptsA = new List<P3>(); + ptsB = new List<P3>(); + sOpt = SV.sValue(args[2]); + boolean isMap = sOpt.equalsIgnoreCase("MAP"); + isSmiles = (sOpt.equalsIgnoreCase("SMILES")); + boolean isSearch = (isMap || sOpt.equalsIgnoreCase("SMARTS")); + if (isSmiles || isSearch) + sOpt = (args.length > 3 ? SV.sValue(args[3]) : null); + boolean hMaps = (("H".equals(sOpt) || "allH".equals(sOpt) || "bestH" + .equals(sOpt))); + boolean allMaps = (("all".equals(sOpt) || "allH".equals(sOpt))); + boolean bestMap = (("best".equals(sOpt) || "bestH".equals(sOpt))); + if (sOpt == null || hMaps || allMaps || bestMap) { + // with explicitH we set to find only the first match. + if (isMap || isSmiles) { + sOpt = "/noaromatic" + + (allMaps || bestMap ? "/" : " nostereo/") + + getSmilesMatches((hMaps ? "H" : ""), null, bs1, null, false, + true); } else { - Object ret = getSmilesMatches("/nostereo/" + smiles1, null, bs2, - null, false, true); - check = (((BS) ret).nextSetBit(0) >= 0); + return false; } - if (check) - return mp.addXStr("DIASTERIOMERS"); - } - // MF matches, but not enantiomers or diasteriomers - return mp.addXStr("CONSTITUTIONAL ISOMERS"); - } - //identical or conformational - if (bs1 == null || bs2 == null) - return mp.addXStr("IDENTICAL"); - stddev = getSmilesCorrelation(bs1, bs2, smiles1, null, null, null, null, - false, false, null, null, false, false); - return mp.addXStr(stddev < 0.2f ? "IDENTICAL" - : "IDENTICAL or CONFORMATIONAL ISOMERS (RMSD=" + stddev + ")"); - } else if (isSmiles) { - ptsA = new List<P3>(); - ptsB = new List<P3>(); - sOpt = SV.sValue(args[2]); - boolean isMap = sOpt.equalsIgnoreCase("MAP"); - isSmiles = (sOpt.equalsIgnoreCase("SMILES")); - boolean isSearch = (isMap || sOpt.equalsIgnoreCase("SMARTS")); - if (isSmiles || isSearch) - sOpt = (args.length > 3 ? SV.sValue(args[3]) : null); - boolean hMaps = (("H".equals(sOpt) || "allH".equals(sOpt) || "bestH".equals(sOpt))); - boolean allMaps = (("all".equals(sOpt) || "allH".equals(sOpt))); - boolean bestMap = (("best".equals(sOpt) || "bestH".equals(sOpt))); - if (sOpt == null || hMaps || allMaps || bestMap) { - // with explicitH we set to find only the first match. - if (isMap || isSmiles) { - sOpt = "/noaromatic" + (allMaps || bestMap ? "/" : " nostereo/") - + getSmilesMatches((hMaps ? "H" : ""), null, bs1, null, - false, true); } else { - return false; + allMaps = true; } + stddev = getSmilesCorrelation(bs1, bs2, sOpt, ptsA, ptsB, m, null, + !isSmiles, isMap, null, null, !allMaps && !bestMap, bestMap); + if (isMap) { + int nAtoms = ptsA.size(); + if (nAtoms == 0) + return mp.addXStr(""); + int nMatch = ptsB.size() / nAtoms; + List<int[][]> ret = new List<int[][]>(); + for (int i = 0, pt = 0; i < nMatch; i++) { + int[][] a = AU.newInt2(nAtoms); + ret.addLast(a); + for (int j = 0; j < nAtoms; j++, pt++) + a[j] = new int[] { ((Atom) ptsA.get(j)).index, + ((Atom) ptsB.get(pt)).index }; + } + if (!allMaps) + return (ret.size() > 0 ? mp.addXAII(ret.get(0)) : mp.addXStr("")); + return mp.addXList(ret); + } } else { - allMaps = true; + ptsA = eval.getPointVector(args[0], 0); + ptsB = eval.getPointVector(args[1], 0); + if (ptsA != null && ptsB != null) + stddev = Measure.getTransformMatrix4(ptsA, ptsB, m, null, false); } - stddev = getSmilesCorrelation(bs1, bs2, sOpt, ptsA, ptsB, m, null, - !isSmiles, isMap, null, null, !allMaps && !bestMap, bestMap); - if (isMap) { - int nAtoms = ptsA.size(); - if (nAtoms == 0) - return mp.addXStr(""); - int nMatch = ptsB.size() / nAtoms; - List<int[][]> ret = new List<int[][]>(); - for (int i = 0, pt = 0; i < nMatch; i++) { - int[][] a = AU.newInt2(nAtoms); - ret.addLast(a); - for (int j = 0; j < nAtoms; j++, pt++) - a[j] = new int[] { ((Atom) ptsA.get(j)).index, - ((Atom) ptsB.get(pt)).index }; - } - if (!allMaps) - return (ret.size() > 0 ? mp.addXAII(ret.get(0)) : mp.addXStr("")); - return mp.addXList(ret); - } - } else { - ptsA = eval.getPointVector(args[0], 0); - ptsB = eval.getPointVector(args[1], 0); - if (ptsA != null && ptsB != null) - stddev = Measure.getTransformMatrix4(ptsA, ptsB, m, null, false); + return (isStdDev || Float.isNaN(stddev) ? mp.addXFloat(stddev) : mp + .addXM4(m)); + } catch (Exception e) { + eval.evalError(e.getMessage() == null ? e.toString() : e.getMessage(), null); + return false; } - return (isStdDev || Float.isNaN(stddev) ? mp.addXFloat(stddev) : mp - .addXM4(m)); } private boolean evaluateContact(ScriptMathProcessor mp, SV[] args) { @@ -7910,7 +7937,8 @@ return (var == null ? false : mp.addXVar(var)); } - private boolean evaluateFind(ScriptMathProcessor mp, SV[] args) throws ScriptException { + private boolean evaluateFind(ScriptMathProcessor mp, SV[] args) + throws ScriptException { if (args.length == 0) return false; @@ -7931,53 +7959,55 @@ boolean isSmiles = sFind.equalsIgnoreCase("SMILES"); boolean isSearch = sFind.equalsIgnoreCase("SMARTS"); boolean isMF = sFind.equalsIgnoreCase("MF"); - if (isSmiles || isSearch || x1.tok == T.bitset) { - int iPt = (isSmiles || isSearch ? 2 : 1); - BS bs2 = (iPt < args.length && args[iPt].tok == T.bitset ? (BS) args[iPt++].value - : null); - boolean asBonds = ("bonds".equalsIgnoreCase(SV - .sValue(args[args.length - 1]))); - boolean isAll = (asBonds || args[args.length - 1].tok == T.on); - Object ret = null; - switch (x1.tok) { - case T.string: - String smiles = SV.sValue(x1); - if (bs2 != null) - return false; - if (flags.equalsIgnoreCase("mf")) { - ret = viewer.getSmilesMatcher().getMolecularFormula(smiles, isSearch); - if (ret == null) - eval.evalError(viewer.getSmilesMatcher().getLastException(), null); - } else { - ret = getSmilesMatches(flags, smiles, null, null, isSearch, - !isAll); + try { + if (isSmiles || isSearch || x1.tok == T.bitset) { + int iPt = (isSmiles || isSearch ? 2 : 1); + BS bs2 = (iPt < args.length && args[iPt].tok == T.bitset ? (BS) args[iPt++].value + : null); + boolean asBonds = ("bonds".equalsIgnoreCase(SV + .sValue(args[args.length - 1]))); + boolean isAll = (asBonds || args[args.length - 1].tok == T.on); + Object ret = null; + switch (x1.tok) { + case T.string: + String smiles = SV.sValue(x1); + if (bs2 != null) + return false; + if (flags.equalsIgnoreCase("mf")) { + ret = viewer.getSmilesMatcher().getMolecularFormula(smiles, + isSearch); + } else { + ret = getSmilesMatches(flags, smiles, null, null, isSearch, !isAll); + } + break; + case T.bitset: + if (isMF) + return mp.addXStr(JmolMolecule.getMolecularFormula( + viewer.getModelSet().atoms, (BS) x1.value, false)); + if (isSequence) + return mp.addXStr(viewer.getSmilesOpt((BS) x1.value, -1, -1, false, + true, isAll, isAll, false)); + if (isSmiles || isSearch) + sFind = flags; + BS bsMatch3D = bs2; + if (asBonds) { + // this will return a single match + int[][] map = viewer.getSmilesMatcher().getCorrelationMaps(sFind, + viewer.modelSet.atoms, viewer.getAtomCount(), (BS) x1.value, + !isSmiles, true); + ret = (map.length > 0 ? viewer.getDihedralMap(map[0]) : new int[0]); + } else { + ret = getSmilesMatches(sFind, null, (BS) x1.value, bsMatch3D, + !isSmiles, !isAll); + } + break; } - break; - case T.bitset: - if (isMF) - return mp.addXStr(JmolMolecule.getMolecularFormula( - viewer.getModelSet().atoms, (BS) x1.value, false)); - if (isSequence) - return mp.addXStr(viewer.getSmilesOpt((BS) x1.value, -1, -1, false, true, - isAll, isAll, false)); - if (isSmiles || isSearch) - sFind = flags; - BS bsMatch3D = bs2; - if (asBonds) { - // this will return a single match - int[][] map = viewer.getSmilesMatcher().getCorrelationMaps(sFind, - viewer.modelSet.atoms, viewer.getAtomCount(), (BS) x1.value, - !isSmiles, true); - ret = (map.length > 0 ? viewer.getDihedralMap(map[0]) : new int[0]); - } else { - ret = getSmilesMatches(sFind, null, (BS) x1.value, bsMatch3D, - !isSmiles, !isAll); - } - break; + if (ret == null) + eval.error(ScriptEvaluator.ERROR_invalidArgument); + return mp.addXObj(ret); } - if (ret == null) - eval.error(ScriptEvaluator.ERROR_invalidArgument); - return mp.addXObj(ret); + } catch (Exception e) { + eval.evalError(e.getMessage(), null); } boolean isReverse = (flags.indexOf("v") >= 0); boolean isCaseInsensitive = (flags.indexOf("i") >= 0); @@ -8015,8 +8045,9 @@ } if (!isList) { return (asMatch ? mp.addXStr(v.size() == 1 ? (String) v.get(0) : "") - : isReverse ? mp.addXBool(n == 1) : asMatch ? mp.addXStr(n == 0 ? "" - : matcher.group()) : mp.addXInt(n == 0 ? 0 : matcher.start() + 1)); + : isReverse ? mp.addXBool(n == 1) : asMatch ? mp + .addXStr(n == 0 ? "" : matcher.group()) : mp.addXInt(n == 0 ? 0 + : matcher.start() + 1)); } if (n == 1) return mp.addXStr(asMatch ? (String) v.get(0) : list[ipt]); @@ -9298,9 +9329,9 @@ : null); bs = viewer.getSmilesMatcher().getSubstructureSet(pattern, viewer.getModelSet().atoms, viewer.getAtomCount(), bsSelected, - tok != T.smiles && tok != T.substructure, false); + tok != T.smiles, false); } catch (Exception e) { - eval.evalError(e.toString(), null); + eval.evalError(e.getMessage(), null); } return mp.addXBs(bs); } Modified: trunk/Jmol/src/org/jmol/smiles/InvalidSmilesException.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/InvalidSmilesException.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/org/jmol/smiles/InvalidSmilesException.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -35,18 +35,11 @@ return lastError; } - public static void setLastError(String message) { - lastError = message; + public static void clear() { + lastError = null; } /** - * Constructs a <code>InvalideSmilesException</code> without any detail. - */ - public InvalidSmilesException() { - super(); - } - - /** * Constructs a <code>InvalidSmilesException</code> with a detail message. * * @param message The detail message. @@ -54,30 +47,6 @@ public InvalidSmilesException(String message) { super(message); lastError = message; - //printStackTrace(); } - /** - * Contructs a <code>InvalidSmilesException</code> with the specified cause and - * a detail message of <tt>(cause == null ? null : cause.toString())</tt> - * (which typically contains the class and detail message of <tt>cause</tt>). - * - * @param cause The cause. - */ - public InvalidSmilesException(Throwable cause) { - super(cause); - lastError = cause.toString(); - } - - /** - * Construcst a <code>InvalidSmilesException</code> with the specified detail - * message and cause. - * - * @param message The detail message. - * @param cause The cause. - */ - public InvalidSmilesException(String message, Throwable cause) { - super(message, cause); - lastError = message + "\n" + cause.getCause(); - } } Modified: trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -181,8 +181,7 @@ i = i2 - 1; } } catch (Exception e) { - System.out.println(e.toString()); - return ""; + throw new InvalidSmilesException("//* error: " + e.getMessage() + " *//"); } if (!allowUnmatchedRings && !htRingsSequence.isEmpty()) { dumpRingKeys(sb, htRingsSequence); Modified: trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -35,25 +35,27 @@ import org.jmol.util.BSUtil; import org.jmol.util.JmolNode; -/** +/** * Originating author: Nicholas Vervelle * - * A class to handle a variety of SMILES/SMARTS-related functions, including: - * -- determining if two SMILES strings are equivalent - * -- determining the molecular formula of a SMILES or SMARTS string - * -- searching for specific runs of atoms in a 3D model - * -- searching for specific runs of atoms in a SMILES description - * -- generating valid (though not canonical) SMILES and bioSMILES strings - * -- getting atom-atom correlation maps to be used with biomolecular alignment methods - * + * A class to handle a variety of SMILES/SMARTS-related functions, including: -- + * determining if two SMILES strings are equivalent -- determining the molecular + * formula of a SMILES or SMARTS string -- searching for specific runs of atoms + * in a 3D model -- searching for specific runs of atoms in a SMILES description + * -- generating valid (though not canonical) SMILES and bioSMILES strings -- + * getting atom-atom correlation maps to be used with biomolecular alignment + * methods + * * <p> - * The original SMILES description can been found at the - * <a href="http://www.daylight.com/smiles/">SMILES Home Page</a>. + * The original SMILES description can been found at the <a + * href="http://www.daylight.com/smiles/">SMILES Home Page</a>. * * Specification for this implementation can be found in package.html. * * <p> - * <pre><code> + * + * <pre> + * <code> * public methods: * * int areEqual -- checks a SMILES string against a reference (-1 for error; 0 for no finds; >0 for number of finds) @@ -82,12 +84,13 @@ * e.g. * * print "CCCC".find("SMILES", "C[C]") - * + * * select search("smartsString") * * All bioSMARTS strings begin with ~ (tilde). * - * </code></pre> + * </code> + * </pre> * * @author Bob Hanson * @@ -104,53 +107,45 @@ } @Override - public String getMolecularFormula(String pattern, boolean isSmarts) { - InvalidSmilesException.setLastError(null); - try { - // note: Jmol may undercount the number of hydrogen atoms - // for aromatic amines where the ring bonding to N is - // not explicit. Each "n" will be assigned a bonding count - // of two unless explicitly indicated as -n-. - // Thus, we take the position that "n" is the - // N of pyridine unless otherwise indicated. - // - // For example: - // $ print "c1ncccc1C".find("SMILES","MF") - // H 7 C 5 N 1 (correct) - // $ print "c1nc-n-c1C".find("SMILES","MF") - // H 6 C 4 N 2 (correct) - // but - // $ print "c1ncnc1C".find("SMILES","MF") - // H 5 C 4 N 2 (incorrect) - SmilesSearch search = SmilesParser.getMolecule(pattern, isSmarts); - search.createTopoMap(null); - search.nodes = search.jmolAtoms; - return search.getMolecularFormula(!isSmarts); - } catch (InvalidSmilesException e) { - if (InvalidSmilesException.getLastError() == null) - InvalidSmilesException.setLastError(e.toString()); - return null; - } + public String getMolecularFormula(String pattern, boolean isSmarts) + throws Exception { + InvalidSmilesException.clear(); + // note: Jmol may undercount the number of hydrogen atoms + // for aromatic amines where the ring bonding to N is + // not explicit. Each "n" will be assigned a bonding count + // of two unless explicitly indicated as -n-. + // Thus, we take the position that "n" is the + // N of pyridine unless otherwise indicated. + // + // For example: + // $ print "c1ncccc1C".find("SMILES","MF") + // H 7 C 5 N 1 (correct) + // $ print "c1nc-n-c1C".find("SMILES","MF") + // H 6 C 4 N 2 (correct) + // but + // $ print "c1ncnc1C".find("SMILES","MF") + // H 5 C 4 N 2 (incorrect) + SmilesSearch search = SmilesParser.getMolecule(pattern, isSmarts); + search.createTopoMap(null); + search.nodes = search.jmolAtoms; + return search.getMolecularFormula(!isSmarts); } @Override public String getSmiles(JmolNode[] atoms, int atomCount, BS bsSelected, - boolean asBioSmiles, boolean bioAllowUnmatchedRings, boolean bioAddCrossLinks, String bioComment, boolean explicitH) { - InvalidSmilesException.setLastError(null); - try { - if (asBioSmiles) - return (new SmilesGenerator()).getBioSmiles(atoms, atomCount, - bsSelected, bioAllowUnmatchedRings, bioAddCrossLinks, bioComment); - return (new SmilesGenerator()).getSmiles(atoms, atomCount, bsSelected, explicitH); - } catch (InvalidSmilesException e) { - if (InvalidSmilesException.getLastError() == null) - InvalidSmilesException.setLastError(e.toString()); - return null; - } + boolean asBioSmiles, boolean bioAllowUnmatchedRings, + boolean bioAddCrossLinks, String bioComment, + boolean explicitH) throws Exception { + InvalidSmilesException.clear(); + if (asBioSmiles) + return (new SmilesGenerator()).getBioSmiles(atoms, atomCount, bsSelected, + bioAllowUnmatchedRings, bioAddCrossLinks, bioComment); + return (new SmilesGenerator()).getSmiles(atoms, atomCount, bsSelected, + explicitH); } @Override - public int areEqual(String smiles1, String smiles2) { + public int areEqual(String smiles1, String smiles2) throws Exception { BS[] result = find(smiles1, smiles2, false, false); return (result == null ? -1 : result.length); } @@ -160,53 +155,51 @@ * * @param smiles * @param molecule - * @return true only if the SMILES strings match and there are no errors + * @return true only if the SMILES strings match and there are no errors + * @throws Exception */ - public boolean areEqual(String smiles, SmilesSearch molecule) { + public boolean areEqual(String smiles, SmilesSearch molecule) + throws Exception { BS[] ret = find(smiles, molecule, false, true, true); return (ret != null && ret.length == 1); } /** * - * Searches for all matches of a pattern within a SMILES string. - * If SMILES (not isSmarts), requires that all atoms be part of the match. + * Searches for all matches of a pattern within a SMILES string. If SMILES + * (not isSmarts), requires that all atoms be part of the match. * * * @param pattern - * SMILES or SMARTS pattern. + * SMILES or SMARTS pattern. * @param smiles - * @param isSmarts TRUE for SMARTS strings, FALSE for SMILES strings - * @param firstMatchOnly + * @param isSmarts + * TRUE for SMARTS strings, FALSE for SMILES strings + * @param firstMatchOnly * @return number of occurances of pattern within smiles + * @throws Exception */ @Override public BS[] find(String pattern, String smiles, boolean isSmarts, - boolean firstMatchOnly) { + boolean firstMatchOnly) throws Exception { - InvalidSmilesException.setLastError(null); - try { - SmilesSearch search = SmilesParser.getMolecule(smiles, false); - return find(pattern, search, isSmarts, !isSmarts, firstMatchOnly); - } catch (Exception e) { - if (InvalidSmilesException.getLastError() == null) - InvalidSmilesException.setLastError(e.toString()); - System.out.println(e.toString()); - return null; - } + InvalidSmilesException.clear(); + SmilesSearch search = SmilesParser.getMolecule(smiles, false); + return find(pattern, search, isSmarts, !isSmarts, firstMatchOnly); } @Override - public String getRelationship(String smiles1, String smiles2) { - if (smiles1 == null || smiles2 == null - || smiles1.length() == 0 || smiles2.length() == 0) + public String getRelationship(String smiles1, String smiles2) + throws Exception { + if (smiles1 == null || smiles2 == null || smiles1.length() == 0 + || smiles2.length() == 0) return ""; String mf1 = getMolecularFormula(smiles1, false); String mf2 = getMolecularFormula(smiles2, false); if (!mf1.equals(mf2)) return "none"; boolean check; - // note: find smiles1 IN smiles2 here + // note: find smiles1 IN smiles2 here int n1 = countStereo(smiles1); int n2 = countStereo(smiles2); check = (n1 == n2 && areEqual(smiles2, smiles1) > 0); @@ -217,12 +210,12 @@ if (n1 == n2 && n1 > 0) { // reverse chirality centers smiles1 = reverseChirality(smiles1); - check = (areEqual(smiles1, smiles2) > 0); + check = (areEqual(smiles1, smiles2) > 0); if (check) return "enantiomers"; } // remove all stereochemistry from SMILES string - check = (areEqual("/nostereo/" + smiles2, smiles1) > 0); + check = (areEqual("/nostereo/" + smiles2, smiles1) > 0); if (check) return (n1 == n2 ? "diastereomers" : "ambiguous stereochemistry!"); } @@ -231,7 +224,6 @@ } return "identical"; } - @Override public String reverseChirality(String smiles) { @@ -248,7 +240,7 @@ * Returns a bitset matching the pattern within atoms. * * @param pattern - * SMILES or SMARTS pattern. + * SMILES or SMARTS pattern. * @param atoms * @param atomCount * @param bsSelected @@ -258,9 +250,9 @@ */ @Override - public BS getSubstructureSet(String pattern, JmolNode[] atoms, - int atomCount, BS bsSelected, - boolean isSmarts, boolean firstMatchOnly) { + public BS getSubstructureSet(String pattern, JmolNode[] atoms, int atomCount, + BS bsSelected, boolean isSmarts, + boolean firstMatchOnly) throws Exception { return (BS) match(pattern, atoms, atomCount, bsSelected, null, isSmarts, false, firstMatchOnly, MODE_BITSET); } @@ -270,51 +262,43 @@ * */ @Override - public void getSubstructureSets(String[] smarts, JmolNode[] atoms, int atomCount, - int flags, BS bsSelected, List<BS> ret, - List<BS>[] vRings) { - InvalidSmilesException.setLastError(null); + public void getSubstructureSets(String[] smarts, JmolNode[] atoms, + int atomCount, int flags, BS bsSelected, + List<BS> ret, List<BS>[] vRings) + throws Exception { + InvalidSmilesException.clear(); SmilesParser sp = new SmilesParser(true); SmilesSearch search = null; - try { - search = sp.parse(""); - search.firstMatchOnly = false; - search.matchAllAtoms = false; - search.jmolAtoms = atoms; - search.jmolAtomCount = Math.abs(atomCount); - search.setSelected(bsSelected); - search.getRingData(true, flags, vRings); - search.asVector = false; - search.subSearches = new SmilesSearch[1]; - search.getSelections(); - } catch (InvalidSmilesException e) { - // I think this is impossible. - } + search = sp.parse(""); + search.firstMatchOnly = false; + search.matchAllAtoms = false; + search.jmolAtoms = atoms; + search.jmolAtomCount = Math.abs(atomCount); + search.setSelected(bsSelected); + search.getRingData(true, flags, vRings); + search.asVector = false; + search.subSearches = new SmilesSearch[1]; + search.getSelections(); BS bsDone = new BS(); - + for (int i = 0; i < smarts.length; i++) { - if (smarts[i] == null || smarts[i].length() == 0 || smarts[i].startsWith("#")) { + if (smarts[i] == null || smarts[i].length() == 0 + || smarts[i].startsWith("#")) { ret.addLast(null); continue; } - try { - search.clear(); - SmilesSearch ss = sp.getSearch(search, SmilesParser.cleanPattern(smarts[i]), flags); - search.subSearches[0] = ss; - BS bs = BSUtil.copy((BS) search.search(false));//.subsearch(ss, false, false)); - //System.out.println(i + " " + bs); - ret.addLast(bs); - bsDone.or(bs); - if (bsDone.cardinality() == atomCount) - return; - //if (ret[i] != null && ret[i].nextSetBit(0) >= 0) - //System.out.println(smarts[i] + " "+ ret[i]); - } catch (Exception e) { - if (InvalidSmilesException.getLastError() == null) - InvalidSmilesException.setLastError(e.toString()); - System.out.println(e.toString()); - // ret[i] will be null in that case - } + search.clear(); + SmilesSearch ss = sp.getSearch(search, + SmilesParser.cleanPattern(smarts[i]), flags); + search.subSearches[0] = ss; + BS bs = BSUtil.copy((BS) search.search(false));//.subsearch(ss, false, false)); + //System.out.println(i + " " + bs); + ret.addLast(bs); + bsDone.or(bs); + if (bsDone.cardinality() == atomCount) + return; + //if (ret[i] != null && ret[i].nextSetBit(0) >= 0) + //System.out.println(smarts[i] + " "+ ret[i]); } } @@ -322,67 +306,68 @@ * Returns a vector of bitsets indicating which atoms match the pattern. * * @param pattern - * SMILES or SMARTS pattern. - * @param atoms - * @param atomCount - * @param bsSelected - * @param bsAromatic - * @param isSmarts + * SMILES or SMARTS pattern. + * @param atoms + * @param atomCount + * @param bsSelected + * @param bsAromatic + * @param isSmarts * @param firstMatchOnly * @return BitSet Array indicating which atoms match the pattern. + * @throws Exception */ @Override public BS[] getSubstructureSetArray(String pattern, JmolNode[] atoms, - int atomCount, BS bsSelected, - BS bsAromatic, boolean isSmarts, - boolean firstMatchOnly) { + int atomCount, BS bsSelected, + BS bsAromatic, boolean isSmarts, + boolean firstMatchOnly) throws Exception { return (BS[]) match(pattern, atoms, atomCount, bsSelected, bsAromatic, isSmarts, false, firstMatchOnly, MODE_ARRAY); } /** - * Rather than returning bitsets, this method returns the - * sets of matching atoms in array form so that a direct - * atom-atom correlation can be made. + * Rather than returning bitsets, this method returns the sets of matching + * atoms in array form so that a direct atom-atom correlation can be made. * - * @param pattern - * SMILES or SMARTS pattern. - * @param atoms - * @param atomCount - * @param bsSelected - * @param isSmarts + * @param pattern + * SMILES or SMARTS pattern. + * @param atoms + * @param atomCount + * @param bsSelected + * @param isSmarts * @param firstMatchOnly - * @return a set of atom correlations + * @return a set of atom correlations * */ @Override public int[][] getCorrelationMaps(String pattern, JmolNode[] atoms, int atomCount, BS bsSelected, - boolean isSmarts, boolean firstMatchOnly) { - return (int[][]) match(pattern, atoms, atomCount, bsSelected, null, isSmarts, - false, firstMatchOnly, MODE_MAP); + boolean isSmarts, boolean firstMatchOnly) + throws Exception { + return (int[][]) match(pattern, atoms, atomCount, bsSelected, null, + isSmarts, false, firstMatchOnly, MODE_MAP); } - /////////////// private methods //////////////// - + private BS[] find(String pattern, SmilesSearch search, boolean isSmarts, - boolean matchAllAtoms, boolean firstMatchOnly) { + boolean matchAllAtoms, boolean firstMatchOnly) + throws Exception { // create a topological model set from smiles // do not worry about stereochemistry -- this // will be handled by SmilesSearch.setSmilesCoordinates BS bsAromatic = new BS(); search.createTopoMap(bsAromatic); - return (BS[]) match(pattern, search.jmolAtoms, - -search.jmolAtoms.length, null, bsAromatic, isSmarts, matchAllAtoms, - firstMatchOnly, MODE_ARRAY); + return (BS[]) match(pattern, search.jmolAtoms, -search.jmolAtoms.length, + null, bsAromatic, isSmarts, matchAllAtoms, firstMatchOnly, MODE_ARRAY); } @SuppressWarnings({ "unchecked" }) private Object match(String pattern, JmolNode[] atoms, int atomCount, BS bsSelected, BS bsAromatic, boolean isSmarts, - boolean matchAllAtoms, boolean firstMatchOnly, int mode) { - InvalidSmilesException.setLastError(null); + boolean matchAllAtoms, boolean firstMatchOnly, int mode) + throws Exception { + InvalidSmilesException.clear(); try { SmilesSearch search = SmilesParser.getMolecule(pattern, isSmarts); search.jmolAtoms = atoms; @@ -410,14 +395,14 @@ } } catch (Exception e) { if (InvalidSmilesException.getLastError() == null) - InvalidSmilesException.setLastError(e.toString()); - System.out.println(e.toString()); + InvalidSmilesException.clear(); + throw new InvalidSmilesException(InvalidSmilesException.getLastError()); } return null; } - private int countStereo(String s) { - s = PT.rep(s, "@@","@"); + private static int countStereo(String s) { + s = PT.rep(s, "@@", "@"); int i = s.lastIndexOf('@') + 1; int n = 0; for (; --i >= 0;) @@ -426,5 +411,4 @@ return n; } - } Modified: trunk/Jmol/src/org/jmol/viewer/ActionManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -1725,8 +1725,12 @@ int a2 = measurementQueued.getAtomIndex(2); if (a1 < 0 || a2 < 0) return; - String sequence = viewer.getSmilesOpt(null, a1, a2, false, true, false, false, false); - viewer.setStatusMeasuring("measureSequence", -2, sequence, 0); + try { + String sequence = viewer.getSmilesOpt(null, a1, a2, false, true, false, false, false); + viewer.setStatusMeasuring("measureSequence", -2, sequence, 0); + } catch (Exception e) { + Logger.error(e.toString()); + } } private void minimize(boolean dragDone) { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-02-06 17:06:51 UTC (rev 19272) @@ -8,13 +8,16 @@ # Developers: to add a description of changes you have made, # add it on a line below the "___JmolVersion=..." line. # Don't use ___ in your text, as that is the key for stripping out -# the information saved in the JAR version of this file. +# the info rmation saved in the JAR version of this file. # The quotes above look odd for a parameter file, but they are # important for the JavaScript version of Jmol. -___JmolVersion="14.1.8_dev_2014.02.05b" +___JmolVersion="14.1.8_dev_2014.02.06" +bug fix: substructure() function using SMILES instead of SMARTS, so only full structures; +bug fix: better error trapping and messages in SMILES-related methods + new feature: anim frame [a,b,c,d] works with negative numbers to indicate ranges: -- anim frame [1, -5, 10, -6] --> [1,2,3,4,5,10,9,8,7,6] -- read as "1 through 5 and then 10 through 6" Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-02-06 05:22:55 UTC (rev 19271) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-02-06 17:06:51 UTC (rev 19272) @@ -400,7 +400,7 @@ } @Override - public BS getSmartsMatch(String smarts, BS bsSelected) { + public BS getSmartsMatch(String smarts, BS bsSelected) throws Exception { if (bsSelected == null) bsSelected = getSelectedAtoms(); return getSmilesMatcher().getSubstructureSet(smarts, modelSet.atoms, @@ -9725,7 +9725,7 @@ } @Override - public String getSmiles(BS bs) { + public String getSmiles(BS bs) throws Exception { return getSmilesOpt(bs, -1, -1, false, false, false, false, false); } @@ -9742,10 +9742,11 @@ * @param bioAddComment * * @return SMILES string + * @throws Exception */ public String getSmilesOpt(BS bsSelected, int index1, int index2, boolean explicitH, boolean isBioSmiles, - boolean bioAllowUnmatchedRings, boolean bioAddCrossLinks, boolean bioAddComment) { + boolean bioAllowUnmatchedRings, boolean bioAddCrossLinks, boo... [truncated message content] |
From: <ha...@us...> - 2014-02-06 23:21:22
|
Revision: 19278 http://sourceforge.net/p/jmol/code/19278 Author: hansonr Date: 2014-02-06 23:21:19 +0000 (Thu, 06 Feb 2014) Log Message: ----------- Tinker fix for serial numbers and atom filtering Modified Paths: -------------- trunk/Jmol/src/javajs/swing/AbstractButton.java trunk/Jmol/src/javajs/swing/JComponent.java trunk/Jmol/src/org/jmol/adapter/readers/simple/FoldingXyzReader.java trunk/Jmol/src/org/jmol/popup/GenericSwingPopup.java Modified: trunk/Jmol/src/javajs/swing/AbstractButton.java =================================================================== --- trunk/Jmol/src/javajs/swing/AbstractButton.java 2014-02-06 21:12:19 UTC (rev 19277) +++ trunk/Jmol/src/javajs/swing/AbstractButton.java 2014-02-06 23:21:19 UTC (rev 19278) @@ -6,13 +6,11 @@ public abstract class AbstractButton extends JComponent implements SC { - Object actionListener; Object itemListener; Object applet; String htmlName; boolean selected; - private String actionCommand; private SC popupMenu; private String icon; @@ -40,28 +38,7 @@ return selected; } - /** - * It will be the function of the JavaScript on the - * page to do with selectionListener what is desired. - * @param listener - * - */ @Override - public void addActionListener(Object listener) { - actionListener = listener; - } - - @Override - public String getActionCommand() { - return actionCommand; - } - - @Override - public void setActionCommand(String actionCommand) { - this.actionCommand = actionCommand; - } - - @Override public void addItemListener(Object listener) { itemListener = listener; } Modified: trunk/Jmol/src/javajs/swing/JComponent.java =================================================================== --- trunk/Jmol/src/javajs/swing/JComponent.java 2014-02-06 21:12:19 UTC (rev 19277) +++ trunk/Jmol/src/javajs/swing/JComponent.java 2014-02-06 23:21:19 UTC (rev 19278) @@ -5,6 +5,8 @@ public abstract class JComponent extends Container { protected boolean autoScrolls; + protected String actionCommand; + protected Object actionListener; protected JComponent(String type) { super(type); @@ -14,4 +16,30 @@ autoScrolls = b; } + /** + * Note that it will be the job of the JavaScript on the + * page to do with actionListener what is desired. + * + * In javax.swing, these methods are in AbstractButton, but + * this is better for javajs.swing, reducing the duplication + * of JTextField's actionListener business. + * + * @param listener + * + */ + public void addActionListener(Object listener) { + actionListener = listener; + } + + public String getActionCommand() { + return actionCommand; + } + + public void setActionCommand(String actionCommand) { + this.actionCommand = actionCommand; + } + + + + } Modified: trunk/Jmol/src/org/jmol/adapter/readers/simple/FoldingXyzReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/simple/FoldingXyzReader.java 2014-02-06 21:12:19 UTC (rev 19277) +++ trunk/Jmol/src/org/jmol/adapter/readers/simple/FoldingXyzReader.java 2014-02-06 23:21:19 UTC (rev 19278) @@ -53,13 +53,16 @@ public class FoldingXyzReader extends AtomSetCollectionReader { + private boolean haveBonds; + @Override protected void initializeReader() { - atomSetCollection.setNoAutoBond(); } @Override protected void finalizeReader() throws Exception { + if (haveBonds) + atomSetCollection.setNoAutoBond(); isTrajectory = false; finalizeReaderASCR(); } @@ -116,23 +119,32 @@ if (line == null) break; // no problem. String[] tokens = getTokensStr(line); - if (tokens[0].equals(lastAtom)) { + String sIndex = tokens[0]; + if (sIndex.equals(lastAtom)) { readNextLine = false; break; // end; next structure; } - lastAtom = tokens[0]; + lastAtom = sIndex; if (!addAtoms) continue; - addAtomXYZSymName(tokens, 2, getElement(tokens[1]), tokens[1]); + Atom atom = new Atom(); + atom.atomName = tokens[1]; + atom.elementSymbol = getElement(tokens[1]); + atom.atomSerial = parseIntStr(sIndex); + if (!filterAtom(atom, i)) + continue; + setAtomCoordTokens(atom, tokens, 2); + atomSetCollection.addAtomWithMappedSerialNumber(atom); int n = tokens.length - 5; - bonds[i] = new int[n]; + bonds[i] = new int[n + 1]; + bonds[i][n] = atom.atomSerial; for (int j = 0; j < n; j++) { String t = tokens[j + 5]; - int i2 = parseIntStr(t) - 1; + int i2 = parseIntStr(t); bonds[i][j] = i2; if (checking) { // Tinker files may or may not include an atom type in column 6 - if (n == 0 || i2 == i || i2 < 0 || i2 >= atomCount) { + if (n == 0 || t.equals(sIndex) || i2 <= 0 || i2 > atomCount) { haveAtomTypes = (n > 0); checking = false; } else { @@ -157,14 +169,14 @@ for (int i = bonds.length; --i >= 0;) { int[] b = bonds[i]; if (b == null) - continue; - Atom a = atoms[i0 + i]; + continue; // discarded atom + Atom a1 = atoms[atomSetCollection.getAtomIndexFromSerial(b[b.length - 1])]; int b0 = 0; if (haveAtomTypes) - a.atomName += "\0" + (b[b0++] + 1); - for (int j = b.length; --j >= b0;) - if (b[j] > i) - atomSetCollection.addNewBondWithOrder(i0 + i, i0 + b[j], 1); + a1.atomName += "\0" + (b[b0++]); + for (int j = b.length - 1; --j >= b0;) + if (b[j] > i && atomSetCollection.addNewBondWithOrder(a1.index, atomSetCollection.getAtomIndexFromSerial(b[j]), 1) != null) + haveBonds = true; } } Modified: trunk/Jmol/src/org/jmol/popup/GenericSwingPopup.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/GenericSwingPopup.java 2014-02-06 21:12:19 UTC (rev 19277) +++ trunk/Jmol/src/org/jmol/popup/GenericSwingPopup.java 2014-02-06 23:21:19 UTC (rev 19278) @@ -14,20 +14,9 @@ public abstract class GenericSwingPopup implements GenericMenuInterface { -// abstract protected SC menuCreatePopup(String name); -// abstract protected SC getMenu(String name); -// abstract protected SC getMenuItem(String name); -// abstract protected SC getCheckBox(String name); -// abstract protected SC getRadio(String name); -// abstract protected SC getSwingComponent(Object component); abstract protected Object getImageIcon(String fileName); -// abstract protected void menuAddButtonGroup(SC item); -// abstract protected void menuInsertSubMenu(SC menu, SC subMenu, int index); abstract protected void menuShowPopup(SC popup, int x, int y); -// abstract protected void menuClearListeners(SC menu); abstract protected String menuSetCheckBoxOption(SC item, String name, String what); -// abstract protected int getItemType(SC m); -// abstract protected void helper.taint(); abstract protected void appCheckItems(String item, SC newMenu); abstract protected void appCheckSpecialMenu(String item, SC subMenu, String word); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-02-17 03:14:56
|
Revision: 19341 http://sourceforge.net/p/jmol/code/19341 Author: hansonr Date: 2014-02-17 03:14:50 +0000 (Mon, 17 Feb 2014) Log Message: ----------- ___JmolVersion="14.1.8_2014.02.16" -- note I am leaving version as 14.1.8 here but updating the date bug fix: PyMOL reader multiple bond view bug fix: popup menu fixes bug fix: bond/draw/isosurface picking broken bug fix: [1 -5 6 -2] gives [1 (-5+6-2)] instead of [1 -5 6 -2] Modified Paths: -------------- trunk/Jmol/src/javajs/swing/JPopupMenu.java trunk/Jmol/src/org/jmol/awtjs2d/JSModelKitPopup.java trunk/Jmol/src/org/jmol/awtjs2d/JmolJSPopup.java trunk/Jmol/src/org/jmol/export/___Exporter.java trunk/Jmol/src/org/jmol/popup/GenericSwingPopup.java trunk/Jmol/src/org/jmol/popup/JmolGenericPopup.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/viewer/StatusManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/javajs/swing/JPopupMenu.java =================================================================== --- trunk/Jmol/src/javajs/swing/JPopupMenu.java 2014-02-17 03:09:01 UTC (rev 19340) +++ trunk/Jmol/src/javajs/swing/JPopupMenu.java 2014-02-17 03:14:50 UTC (rev 19341) @@ -7,6 +7,8 @@ // note that in Java Swing JPopupMenu extends // JComponent, but here we extend AbstractButton // so that it shares the SwingComponent interface + + boolean tainted = true; public JPopupMenu(String name) { super("mnu"); @@ -33,6 +35,8 @@ /** * @j2sNative * + * if (applet != null) + * this.tainted = true; * SwingController.showMenu(this, x, y); * */ Modified: trunk/Jmol/src/org/jmol/awtjs2d/JSModelKitPopup.java =================================================================== --- trunk/Jmol/src/org/jmol/awtjs2d/JSModelKitPopup.java 2014-02-17 03:09:01 UTC (rev 19340) +++ trunk/Jmol/src/org/jmol/awtjs2d/JSModelKitPopup.java 2014-02-17 03:14:50 UTC (rev 19341) @@ -58,10 +58,11 @@ public void menuShowPopup(SC popup, int x, int y) { try { - ((JPopupMenu) popup).show((Component) viewer.getApplet(), x, y); + ((JPopupMenu) popup).show(isTainted ? (Component) viewer.getApplet() : null, x, y); } catch (Exception e) { // ignore } + isTainted = false; } @Override Modified: trunk/Jmol/src/org/jmol/awtjs2d/JmolJSPopup.java =================================================================== --- trunk/Jmol/src/org/jmol/awtjs2d/JmolJSPopup.java 2014-02-17 03:09:01 UTC (rev 19340) +++ trunk/Jmol/src/org/jmol/awtjs2d/JmolJSPopup.java 2014-02-17 03:14:50 UTC (rev 19341) @@ -57,12 +57,12 @@ @Override public void menuShowPopup(SC popup, int x, int y) { - try { - ((JPopupMenu) popup).show((Component) viewer.getApplet(), x, y); + ((JPopupMenu) popup).show(isTainted ? (Component) viewer.getApplet() : null, x, y); } catch (Exception e) { // ignore } + isTainted = false; } @Override Modified: trunk/Jmol/src/org/jmol/export/___Exporter.java =================================================================== --- trunk/Jmol/src/org/jmol/export/___Exporter.java 2014-02-17 03:09:01 UTC (rev 19340) +++ trunk/Jmol/src/org/jmol/export/___Exporter.java 2014-02-17 03:14:50 UTC (rev 19341) @@ -37,7 +37,6 @@ import javajs.util.M3; import javajs.util.M4; import javajs.util.P3i; -import javajs.util.PT; import javajs.util.T3; import javajs.util.V3; @@ -187,7 +186,6 @@ final protected V3 tempV2 = new V3(); final protected V3 tempV3 = new V3(); private boolean isWebGL; - protected String appletName; public ___Exporter() { } @@ -205,9 +203,6 @@ Map<String, Object> params) { this.viewer = viewer; isWebGL = params.get("type").equals("JS"); - if (isWebGL) - appletName = PT.split(viewer.getHtmlName(), "_")[0]; - this.g3d = g3d; this.privateKey = privateKey; backgroundColix = viewer.getObjectColix(StateManager.OBJ_BACKGROUND); Modified: trunk/Jmol/src/org/jmol/popup/GenericSwingPopup.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/GenericSwingPopup.java 2014-02-17 03:09:01 UTC (rev 19340) +++ trunk/Jmol/src/org/jmol/popup/GenericSwingPopup.java 2014-02-17 03:14:50 UTC (rev 19341) @@ -40,6 +40,7 @@ protected boolean allowSignedFeatures; protected boolean isJS, isApplet, isSigned; protected int thisx, thisy; + protected boolean isTainted = true; protected String menuName; protected SC popupMenu; @@ -48,7 +49,6 @@ protected Object buttonGroup; protected String currentMenuItemId; protected Map<String, SC> htMenus = new Hashtable<String, SC>(); - private List<SC> AppletOnly = new List<SC>(); private List<SC> SignedOnly = new List<SC>(); protected void initSwing(String title, PopupResource bundle, boolean isJS, Modified: trunk/Jmol/src/org/jmol/popup/JmolGenericPopup.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/JmolGenericPopup.java 2014-02-17 03:09:01 UTC (rev 19340) +++ trunk/Jmol/src/org/jmol/popup/JmolGenericPopup.java 2014-02-17 03:14:50 UTC (rev 19341) @@ -165,6 +165,7 @@ public void jpiUpdateComputedMenus() { if (updateMode == UPDATE_NEVER) return; + isTainted = true; updateMode = UPDATE_ALL; getViewerData(); updateSelectMenu(); @@ -400,6 +401,7 @@ protected void appUpdateForShow() { if (updateMode == UPDATE_NEVER) return; + isTainted = true; getViewerData(); updateMode = UPDATE_SHOW; updateSelectMenu(); @@ -949,7 +951,7 @@ private void updateAboutSubmenu() { if (isApplet) - setText("APPLETid", viewer.getHtmlName()); + setText("APPLETid", viewer.appletName); /** * @j2sNative Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-02-17 03:09:01 UTC (rev 19340) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-02-17 03:14:50 UTC (rev 19341) @@ -139,7 +139,7 @@ } private void putX(SV x) { - System.out.println("putX wasX=" + wasX + " x=" + x); + //System.out.println("putX wasX=" + wasX + " x=" + x); if (skipping) return; if (wasX) { @@ -719,6 +719,7 @@ eval.error(ScriptEvaluator.ERROR_endOfStatementUnexpected); SV v = SV.selectItemVar(xStack[xPt]); xStack[xPt--] = null; + wasX = false; return v; } Modified: trunk/Jmol/src/org/jmol/viewer/StatusManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2014-02-17 03:09:01 UTC (rev 19340) +++ trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2014-02-17 03:14:50 UTC (rev 19341) @@ -589,7 +589,7 @@ } if (Logger.debugging) { Logger.debug( - viewer.getHtmlName() + " sync mode=" + syncMode + + viewer.appletName + " sync mode=" + syncMode + "; synced? " + isSynced + "; driving? " + drivingSync + "; disabled? " + syncDisabled); } } Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-02-17 03:09:01 UTC (rev 19340) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-02-17 03:14:50 UTC (rev 19341) @@ -247,7 +247,9 @@ boolean mustRender = false; public String htmlName = ""; + public String appletName = ""; + private String insertedCommand = ""; public void setInsertedCommand(String strScript) { @@ -444,6 +446,7 @@ allowScripting = !checkOption2("noscripting", "-noscripting"); int i = fullName.indexOf("__"); htmlName = (i < 0 ? fullName : fullName.substring(0, i)); + appletName = PT.split(htmlName + "_", "_")[0]; syncId = (i < 0 ? "" : fullName.substring(i + 2, fullName.length() - 2)); access = (checkOption2("access:READSPT", "-r") ? ACCESS.READSPT : checkOption2("access:NONE", "-R") ? ACCESS.NONE : ACCESS.ALL); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-02-18 04:48:09
|
Revision: 19342 http://sourceforge.net/p/jmol/code/19342 Author: hansonr Date: 2014-02-18 04:48:04 +0000 (Tue, 18 Feb 2014) Log Message: ----------- Popup menu efficiencies, better action Modified Paths: -------------- trunk/Jmol/src/javajs/awt/Component.java trunk/Jmol/src/javajs/swing/AbstractButton.java trunk/Jmol/src/javajs/swing/ButtonGroup.java trunk/Jmol/src/javajs/swing/JButton.java trunk/Jmol/src/javajs/swing/JCheckBox.java trunk/Jmol/src/javajs/swing/JCheckBoxMenuItem.java trunk/Jmol/src/javajs/swing/JContentPane.java trunk/Jmol/src/javajs/swing/JDialog.java trunk/Jmol/src/javajs/swing/JEditorPane.java trunk/Jmol/src/javajs/swing/JLabel.java trunk/Jmol/src/javajs/swing/JMenuItem.java trunk/Jmol/src/javajs/swing/JPanel.java trunk/Jmol/src/javajs/swing/JPopupMenu.java trunk/Jmol/src/javajs/swing/JRadioButtonMenuItem.java trunk/Jmol/src/javajs/swing/JScrollPane.java trunk/Jmol/src/javajs/swing/JSplitPane.java trunk/Jmol/src/javajs/swing/JTextField.java trunk/Jmol/src/javajs/swing/JTextPane.java trunk/Jmol/src/org/jmol/awtjs2d/JSModelKitPopup.java trunk/Jmol/src/org/jmol/awtjs2d/Mouse.java trunk/Jmol/src/org/jmol/popup/AwtSwingPopupHelper.java trunk/Jmol/src/org/jmol/popup/GenericSwingPopup.java trunk/Jmol/src/org/jmol/popup/JSSwingPopupHelper.java trunk/Jmol/src/org/jmol/popup/JmolGenericPopup.java trunk/Jmol/src/org/jmol/popup/PopupHelper.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java Modified: trunk/Jmol/src/javajs/awt/Component.java =================================================================== --- trunk/Jmol/src/javajs/awt/Component.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/awt/Component.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -6,7 +6,7 @@ abstract public class Component { protected boolean visible; - protected boolean enabled; + protected boolean enabled = true; protected String text; protected String name; protected int width; @@ -20,7 +20,7 @@ private GenericColor bgcolor; protected Component(String type) { - id = type + ("" + Math.random()).substring(3, 10); + id = newID(type); if (type == null) return; /** @@ -32,6 +32,10 @@ } + public static String newID(String type) { + return type + ("" + Math.random()).substring(3, 10); + } + abstract public String toHTML(); public void setBackground(GenericColor color) { @@ -81,6 +85,13 @@ public void setEnabled(boolean enabled) { this.enabled = enabled; + /** + * @j2sNative + * + * SwingController.setEnabled(this); + * + */ + {} } public boolean isVisible() { @@ -95,6 +106,7 @@ * SwingController.setVisible(this); * */ + {} } public int getHeight() { @@ -124,11 +136,11 @@ protected int renderWidth; protected int renderHeight; - protected String getCSSstyle(int defaultPercent) { + protected String getCSSstyle(int defaultPercentW, int defaultPercentH) { int width = (renderWidth > 0 ? renderWidth : getSubcomponentWidth()); int height = (renderHeight > 0 ? renderHeight : getSubcomponentHeight()); - return (width > 0 ? "width:" + width +"px;" : defaultPercent > 0 ? "width:"+defaultPercent+"%;" : "") - + (height > 0 ?"height:" + height + "px;" : defaultPercent > 0 ? "height:"+defaultPercent+"%;" : "") + return (width > 0 ? "width:" + width +"px;" : defaultPercentW > 0 ? "width:"+defaultPercentW+"%;" : "") + + (height > 0 ?"height:" + height + "px;" : defaultPercentH > 0 ? "height:"+defaultPercentH+"%;" : "") + (bgcolor == null ? "" : "background-color:" + CU.toCSSString(bgcolor) + ";"); } Modified: trunk/Jmol/src/javajs/swing/AbstractButton.java =================================================================== --- trunk/Jmol/src/javajs/swing/AbstractButton.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/AbstractButton.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -19,7 +19,7 @@ super(type); enabled = true; } - + @Override public void setSelected(boolean selected) { this.selected = selected; @@ -97,7 +97,7 @@ : this.text != null ? this.text : null); String s = (label == null ? "" : "<li><a>" + label + "</a>" - + "<ul id=\"" + this.id + "\" class=\"" + (this.enabled ? "" : "ui-state-disabled") + "\">"); + + htmlMenuOpener("ul")); int n = getComponentCount(); if (n > 0) for(int i = 0; i < n; i++) @@ -107,4 +107,12 @@ return s; } + protected String htmlMenuOpener(String type) { + return "<" + type + " id=\"" + this.id + "\"" + (this.enabled ? "" : getHtmlDisabled()) + ">"; + } + + protected String getHtmlDisabled() { + return " disabled=\"disabled\""; + } + } Modified: trunk/Jmol/src/javajs/swing/ButtonGroup.java =================================================================== --- trunk/Jmol/src/javajs/swing/ButtonGroup.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/ButtonGroup.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -2,28 +2,16 @@ import javajs.api.SC; import javajs.awt.Component; -import javajs.util.List; public class ButtonGroup { - List<SC> list = new List<SC>(); - Component popupMenu; private String id; - public ButtonGroup(SC thisPopup) { - popupMenu = (Component) thisPopup; - /** - * @j2sNative - * - * this.id = SwingController.getMenuID(this, "bg"); - * - */ - {} - + public ButtonGroup() { + id = Component.newID("bg"); } public void add(SC item) { - list.addLast(item); ((AbstractButton) item).htmlName = this.id; } Modified: trunk/Jmol/src/javajs/swing/JButton.java =================================================================== --- trunk/Jmol/src/javajs/swing/JButton.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JButton.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -10,7 +10,7 @@ @Override public String toHTML() { SB sb = new SB(); - sb.append("<input type=button id='" + id + "' class='JButton' style='" + getCSSstyle(0) + "' onclick='SwingController.click(this)' value='"+ text + "'/>"); + sb.append("<input type=button id='" + id + "' class='JButton' style='" + getCSSstyle(80, 0) + "' onclick='SwingController.click(this)' value='"+ text + "'/>"); return sb.toString(); } } Modified: trunk/Jmol/src/javajs/swing/JCheckBox.java =================================================================== --- trunk/Jmol/src/javajs/swing/JCheckBox.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JCheckBox.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -8,7 +8,7 @@ @Override public String toHTML() { - String s = "<input type=checkbox id='" + id + "' class='JCheckBox' style='" + getCSSstyle(0) + String s = "<input type=checkbox id='" + id + "' class='JCheckBox' style='" + getCSSstyle(0, 0) + "' " + (selected ? "checked='checked' " : "") + "onclick='SwingController.click(this)'>" + "<label for='" + id + "'>" + text + "</label>"; return s; Modified: trunk/Jmol/src/javajs/swing/JCheckBoxMenuItem.java =================================================================== --- trunk/Jmol/src/javajs/swing/JCheckBoxMenuItem.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JCheckBoxMenuItem.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -9,7 +9,7 @@ @Override protected String htmlLabel() { - return "<input id=\"" + this.id + "-cb\" type=\"checkbox\" " + (this.selected ? "checked" : "") + " /><label for=\"ID-cb\">TeXt</label>"; + return "<input id=\"" + this.id + "-cb\" type=\"checkbox\" " + (this.selected ? "checked" : "") + " /><label for=\"" + this.id + "-cb\">TeXt</label>"; } } Modified: trunk/Jmol/src/javajs/swing/JContentPane.java =================================================================== --- trunk/Jmol/src/javajs/swing/JContentPane.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JContentPane.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -12,7 +12,7 @@ public String toHTML() { SB sb = new SB(); sb.append("\n<div id='" + id + "' class='JContentPane' style='" - + getCSSstyle(100) + "'>\n"); + + getCSSstyle(100, 100) + "'>\n"); if (list != null) for (int i = 0; i < list.size(); i++) sb.append(list.get(i).toHTML()); Modified: trunk/Jmol/src/javajs/swing/JDialog.java =================================================================== --- trunk/Jmol/src/javajs/swing/JDialog.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JDialog.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -110,7 +110,7 @@ renderHeight = defaultHeight; int h = renderHeight - headerHeight; SB sb = new SB(); - sb.append("\n<div id='" + id + "' class='JDialog' style='" + getCSSstyle(0) + "z-index:" + zIndex + ";position:relative;top:0px;left:0px;reize:both;'>\n"); + sb.append("\n<div id='" + id + "' class='JDialog' style='" + getCSSstyle(0, 0) + "z-index:" + zIndex + ";position:relative;top:0px;left:0px;reize:both;'>\n"); sb.append("\n<div id='" + id + "_title' class='JDialogTitle' style='width:100%;height:25px;padding:5px 5px 5px 5px;height:"+headerHeight+"px'>" +"<span style='text-align:center;'>" + title + "</span><span style='position:absolute;text-align:right;right:1px;'>" + "<input type=button id='" + id + "_closer' onclick='SwingController.windowClosing(this)' value='x' /></span></div>\n"); Modified: trunk/Jmol/src/javajs/swing/JEditorPane.java =================================================================== --- trunk/Jmol/src/javajs/swing/JEditorPane.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JEditorPane.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -19,7 +19,7 @@ @Override public String toHTML() { SB sb = new SB(); - sb.append("<textarea type=text id='" + id + "' class='JEditorPane' style='" + getCSSstyle(98) + "'>"+ text + "</textarea>"); + sb.append("<textarea type=text id='" + id + "' class='JEditorPane' style='" + getCSSstyle(98, 98) + "'>"+ text + "</textarea>"); return sb.toString(); } Modified: trunk/Jmol/src/javajs/swing/JLabel.java =================================================================== --- trunk/Jmol/src/javajs/swing/JLabel.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JLabel.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -12,7 +12,7 @@ @Override public String toHTML() { SB sb = new SB(); - sb.append("<span id='" + id + "' class='JLabel' style='" + getCSSstyle(0) + "'>"); + sb.append("<span id='" + id + "' class='JLabel' style='" + getCSSstyle(0, 0) + "'>"); sb.append(text); sb.append("</span>"); return sb.toString(); Modified: trunk/Jmol/src/javajs/swing/JMenuItem.java =================================================================== --- trunk/Jmol/src/javajs/swing/JMenuItem.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JMenuItem.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -18,17 +18,20 @@ @Override public String toHTML() { - String s = "<li id=\"~ID~\" class=\"" + (this.enabled ? "" : "ui-state-disabled") + "\">"; - if (this.text != null) - s += "<a>"; - s += htmlLabel(); - s = PT.rep(s, "~ID~", this.id); - if (this.text != null) - s = PT.rep(s,"TeXt", this.text) + "</a>"; - s += "</li>"; - return s; + String s = htmlMenuOpener("li"); + if (this.text != null) + s += "<a>"; + s += htmlLabel(); + if (this.text != null) + s = PT.rep(s,"TeXt", this.text) + "</a>"; + return s + "</li>"; } + @Override + protected String getHtmlDisabled() { + return " class=\"ui-state-disabled\""; + } + protected String htmlLabel() { return (this.text != null ? "TeXt" : ""); } Modified: trunk/Jmol/src/javajs/swing/JPanel.java =================================================================== --- trunk/Jmol/src/javajs/swing/JPanel.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JPanel.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -56,7 +56,7 @@ } SB sb = new SB(); sb.append("\n<div id='" + id + "' class='JPanel' style='" - + getCSSstyle(100) + "'>\n"); + + getCSSstyle(100, 100) + "'>\n"); sb.append("\n<span id='" + id + "_minimizer' style='width:" + minWidth + "px;height:" + minHeight + "px;'>"); sb.append(grid.toHTML(id)); Modified: trunk/Jmol/src/javajs/swing/JPopupMenu.java =================================================================== --- trunk/Jmol/src/javajs/swing/JPopupMenu.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JPopupMenu.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -10,6 +10,16 @@ boolean tainted = true; + static { + /** + * @j2sNative + * + * SwingController.setDraggable(javajs.swing.JPopupMenu); + */ + { + } + } + public JPopupMenu(String name) { super("mnu"); this.name = name; Modified: trunk/Jmol/src/javajs/swing/JRadioButtonMenuItem.java =================================================================== --- trunk/Jmol/src/javajs/swing/JRadioButtonMenuItem.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JRadioButtonMenuItem.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -8,8 +8,8 @@ @Override public String htmlLabel() { - return "<input id=\"ID-rb\" type=\"radio\" name=\"" + this.htmlName + "\" " - + (this.selected ? "checked" : "") + " /><label for=\"ID-rb\">TeXt</label>"; + return "<input id=\"" + this.id + "-rb\" type=\"radio\" name=\"" + this.htmlName + "\" " + + (this.selected ? "checked" : "") + " /><label for=\"" + this.id + "-rb\">TeXt</label>"; } } Modified: trunk/Jmol/src/javajs/swing/JScrollPane.java =================================================================== --- trunk/Jmol/src/javajs/swing/JScrollPane.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JScrollPane.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -14,7 +14,7 @@ @Override public String toHTML() { SB sb = new SB(); - sb.append("\n<div id='" + id + "' class='JScrollPane' style='" + getCSSstyle(98) + "overflow:auto'>\n"); + sb.append("\n<div id='" + id + "' class='JScrollPane' style='" + getCSSstyle(98, 98) + "overflow:auto'>\n"); if (list != null) { Component c = list.get(0); sb.append(c.toHTML()); Modified: trunk/Jmol/src/javajs/swing/JSplitPane.java =================================================================== --- trunk/Jmol/src/javajs/swing/JSplitPane.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JSplitPane.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -69,7 +69,7 @@ if (height == 0) height = getSubcomponentHeight(); SB sb = new SB(); - sb.append("<div id='" + id + "' class='JSplitPane' style='" + getCSSstyle(100) + "'>"); + sb.append("<div id='" + id + "' class='JSplitPane' style='" + getCSSstyle(100, 100) + "'>"); if (isH) sb.append("<div id='" + id + "_left' style='width:50%;height:100%;position:absolute;top:0%;left:0%'>"); else Modified: trunk/Jmol/src/javajs/swing/JTextField.java =================================================================== --- trunk/Jmol/src/javajs/swing/JTextField.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JTextField.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -13,7 +13,7 @@ @Override public String toHTML() { SB sb = new SB(); - sb.append("<input type=text id='" + id + "' class='JTextField' style='" + getCSSstyle(0) + "' value='"+ text + "' onkeyup =SwingController.click(this,event) >"); + sb.append("<input type=text id='" + id + "' class='JTextField' style='" + getCSSstyle(0, 0) + "' value='"+ text + "' onkeyup =SwingController.click(this,event) >"); return sb.toString(); } Modified: trunk/Jmol/src/javajs/swing/JTextPane.java =================================================================== --- trunk/Jmol/src/javajs/swing/JTextPane.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/javajs/swing/JTextPane.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -29,7 +29,7 @@ @Override public String toHTML() { SB sb = new SB(); - sb.append("<textarea type=text id='" + id + "' class='JTextPane' style='" + getCSSstyle(98) + "'>"+ text + "</textarea>"); + sb.append("<textarea type=text id='" + id + "' class='JTextPane' style='" + getCSSstyle(98, 98) + "'>"+ text + "</textarea>"); return sb.toString(); } Modified: trunk/Jmol/src/org/jmol/awtjs2d/JSModelKitPopup.java =================================================================== --- trunk/Jmol/src/org/jmol/awtjs2d/JSModelKitPopup.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/org/jmol/awtjs2d/JSModelKitPopup.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -74,7 +74,6 @@ menuSetLabel(item, "??"); item.setActionCommand("_??P!:"); item.setSelected(false); - helper.taint(); } viewer.evalStringQuiet("set picking assignAtom_C"); return; Modified: trunk/Jmol/src/org/jmol/awtjs2d/Mouse.java =================================================================== --- trunk/Jmol/src/org/jmol/awtjs2d/Mouse.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/org/jmol/awtjs2d/Mouse.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -92,10 +92,10 @@ dragged(time, x, y, modifiers); break; case Event.MOUSE_ENTER: - entered(time, x, y); + entry(time, x, y, false); break; case Event.MOUSE_EXIT: - exited(time, x, y); + entry(time, x, y, true); break; case Event.MOUSE_MOVE: moved(time, x, y, modifiers); @@ -180,11 +180,11 @@ } public void mouseEntered(MouseEvent e) { - entered(e.getWhen(), e.getX(), e.getY()); + entry(e.getWhen(), e.getX(), e.getY(), false); } public void mouseExited(MouseEvent e) { - exited(e.getWhen(), e.getX(), e.getY()); + entry(e.getWhen(), e.getX(), e.getY(), true); } public void mousePressed(MouseEvent e) { @@ -329,15 +329,11 @@ viewer.evalStringQuietSync(kb, false, true); } - private void entered(long time, int x, int y) { + private void entry(long time, int x, int y, boolean isExit) { wheeling = false; - manager.mouseEnterExit(time, x, y, false); + manager.mouseEnterExit(time, x, y, isExit); } - private void exited(long time, int x, int y) { - wheeling = false; - manager.mouseEnterExit(time, x, y, true); - } /** * * @param time Modified: trunk/Jmol/src/org/jmol/popup/AwtSwingPopupHelper.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/AwtSwingPopupHelper.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/org/jmol/popup/AwtSwingPopupHelper.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -64,7 +64,7 @@ private ButtonGroup buttonGroup; @Override - public SC menuCreatePopup(String title) { + public SC menuCreatePopup(String title, Object applet) { return AwtSwingComponent.getPopup(title, htSources); } @@ -201,10 +201,4 @@ return getSwingComponent(e.getSource()); } - @Override - public void taint() { - // JavaScript only - } - - } Modified: trunk/Jmol/src/org/jmol/popup/GenericSwingPopup.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/GenericSwingPopup.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/org/jmol/popup/GenericSwingPopup.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -51,14 +51,14 @@ protected Map<String, SC> htMenus = new Hashtable<String, SC>(); private List<SC> SignedOnly = new List<SC>(); - protected void initSwing(String title, PopupResource bundle, boolean isJS, - boolean isApplet, boolean isSigned) { + protected void initSwing(String title, PopupResource bundle, Object applet, + boolean isJS, boolean isSigned) { this.isJS = isJS; - this.isApplet = isApplet; + this.isApplet = (applet!= null); this.isSigned = isSigned; this.allowSignedFeatures = (!isApplet || isSigned); menuName = title; - popupMenu = helper.menuCreatePopup(title); + popupMenu = helper.menuCreatePopup(title, applet); thisPopup = popupMenu; htMenus.put(title, popupMenu); addMenuItems("", title, popupMenu, bundle); @@ -180,7 +180,7 @@ Object icon = getEntryIcon(ret); entry = ret[0]; b.init(entry, icon, script, thisPopup); - helper.taint(); + isTainted = true; } protected Object getEntryIcon(String[] ret) { @@ -199,7 +199,7 @@ protected void menuSetLabel(SC m, String entry) { m.setText(entry); - helper.taint(); + isTainted = true; } private void menuSetCheckBoxValue(SC source) { @@ -207,7 +207,7 @@ String what = source.getActionCommand(); checkForCheckBoxScript(source, what, isSelected); appUpdateSpecialCheckBoxValue(source, what, isSelected); - helper.taint(); + isTainted = true; } /////// run time event-driven methods @@ -279,7 +279,7 @@ protected void menuAddSeparator(SC menu) { menu.add(helper.getMenuItem(null)); - helper.taint(); + isTainted = true; } protected SC menuNewSubMenu(String entry, String id) { @@ -296,7 +296,7 @@ else for (int i = menu.getComponentCount(); --i >= indexFrom;) menu.remove(i); - helper.taint(); + isTainted = true; } private SC newMenuItem(SC item, SC menu, @@ -320,7 +320,7 @@ private void menuAddItem(SC menu, SC item) { menu.add(item); - helper.taint(); + isTainted = true; } protected void menuAddSubMenu(SC menu, SC subMenu) { @@ -328,7 +328,7 @@ } protected void menuEnable(SC component, boolean enable) { - if (component == null) + if (component == null || component.isEnabled() == enable) return; component.setEnabled(enable); } @@ -339,7 +339,7 @@ protected void menuSetAutoscrolls(SC menu) { menu.setAutoscrolls(true); - helper.taint(); + isTainted = true; } protected int menuGetListPosition(SC item) { @@ -368,7 +368,7 @@ boolean b = appGetBooleanProperty(basename); if (item.isSelected() != b) { item.setSelected(b); - helper.taint(); + isTainted = true; } } } Modified: trunk/Jmol/src/org/jmol/popup/JSSwingPopupHelper.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/JSSwingPopupHelper.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/org/jmol/popup/JSSwingPopupHelper.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -48,28 +48,20 @@ // (on exit) checkMenuFocus(item.getName(), item.getActionCommand(), false); // (on checkbox click) checkBoxStateChanged(e.getSource()); - GenericMenuInterface popup; // used by Jmol.Swing + /** + * used here and by SwingController to refer to the Java + * class being handled by this helper. + */ + GenericMenuInterface popup; + private ButtonGroup buttonGroup; - private SC thisPopup; public JSSwingPopupHelper(GenericMenuInterface popup) { this.popup = popup; } @Override - public SC menuCreatePopup(String name) { - - Object applet = null; - /** - * @j2sNative - * - * Jmol.Swing.setDraggable(javajs.swing.JPopupMenu); - * applet = this.popup.viewer.getApplet(); - * this.thisPopup = this.popup.thisPopup; - */ - { - } - + public SC menuCreatePopup(String name, Object applet) { JPopupMenu j = new JPopupMenu(name); j.setInvoker(applet); return j; @@ -102,7 +94,7 @@ return; } if (buttonGroup == null) - buttonGroup = new ButtonGroup(thisPopup); + buttonGroup = new ButtonGroup(); buttonGroup.add(item); } @@ -125,18 +117,6 @@ } @Override - public void taint() { - /** - * @j2sNative - * - * if (this.thisPopup) this.thisPopup.tainted = true; - * - */ - { - } - } - - @Override public SC getSwingComponent(Object component) { return (SC) component; } Modified: trunk/Jmol/src/org/jmol/popup/JmolGenericPopup.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/JmolGenericPopup.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/org/jmol/popup/JmolGenericPopup.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -119,7 +119,7 @@ protected void initialize(Viewer viewer, PopupResource bundle, String title) { this.viewer = viewer; - initSwing(title, bundle, viewer.isJS, viewer.isApplet(), + initSwing(title, bundle, viewer.getApplet(), viewer.isJS, viewer.getBooleanProperty("_signedApplet")); } @@ -324,7 +324,7 @@ if (currentFrankId != null && currentFrankId == id && nFrankList > 0) return; if (frankPopup == null) - frankPopup = helper.menuCreatePopup("Frank"); + frankPopup = helper.menuCreatePopup("Frank", viewer.getApplet()); thisPopup = frankPopup; menuRemoveAll(frankPopup, 0); if (id == null) Modified: trunk/Jmol/src/org/jmol/popup/PopupHelper.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/PopupHelper.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/org/jmol/popup/PopupHelper.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -4,7 +4,7 @@ public interface PopupHelper { - SC menuCreatePopup(String title); + SC menuCreatePopup(String title, Object applet); SC getRadio(String name); @@ -25,7 +25,5 @@ SC getSwingComponent(Object component); void menuClearListeners(SC c); - - void taint(); - + } Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -469,13 +469,13 @@ private boolean isCmdLine_C_Option; protected boolean isCmdLine_c_or_C_Option; public boolean historyDisabled; - public boolean logMessages; + public boolean debugHigh; private boolean debugScript; @Override public void setDebugging() { debugScript = viewer.getBoolean(T.debugscript); - logMessages = (debugScript && Logger.debugging); + debugHigh = (debugScript && Logger.debugging); } private boolean executionStopped; @@ -552,7 +552,7 @@ public String getNextStatement() { return (pc < aatoken.length ? getErrorLineMessage(functionName, scriptFileName, getLinenumber(null), pc, - statementAsString(viewer, aatoken[pc], -9999, logMessages)) : ""); + statementAsString(viewer, aatoken[pc], -9999, debugHigh)) : ""); } /** @@ -617,19 +617,17 @@ } private void logDebugScript(int ifLevel) { - if (logMessages) { + iToken = -9999; + if (debugHigh) { if (st.length > 0) Logger.debug(st[0].toString()); for (int i = 1; i < slen; ++i) Logger.debug(st[i].toString()); - } - iToken = -9999; - if (logMessages) { SB strbufLog = new SB(); String s = (ifLevel > 0 ? " ".substring(0, ifLevel * 2) : ""); strbufLog.append(s).append( - statementAsString(viewer, st, iToken, logMessages)); + statementAsString(viewer, st, iToken, debugHigh)); viewer.scriptStatus(strbufLog.toString()); } else { String cmd = getCommand(pc, false, false); @@ -1887,7 +1885,7 @@ scriptFileName = filename; strScript = fixScriptPath(strScript, filename); restoreScriptContext(compiler.compile(filename, strScript, false, false, - debugCompiler, false), false, false, false); + debugCompiler && Logger.debugging, false), false, false, false); isStateScript = (script.indexOf(JC.STATE_VERSION_STAMP) >= 0); forceNoAddHydrogens = (isStateScript && script.indexOf("pdbAddHydrogens") < 0); String s = script; @@ -2585,7 +2583,7 @@ for (String key : token.contextVariables.keySet()) ScriptCompiler.addContextVariable(contextVariables, key); } - if (debugScript || isCmdLine_c_or_C_Option) + if (debugHigh || isCmdLine_c_or_C_Option) Logger.info("-->>-------------".substring(0, Math.max(17, scriptLevel + 5)) + scriptLevel @@ -2600,7 +2598,7 @@ @Override public ScriptContext getScriptContext(String why) { ScriptContext context = new ScriptContext(); - if (debugScript) + if (debugHigh) Logger.info("creating context " + context.id + " for " + why); context.scriptLevel = scriptLevel; context.parentContext = thisContext; @@ -2649,7 +2647,7 @@ restoreScriptContext(thisContext, true, isFlowCommand, statementOnly); if (scTemp != null) restoreScriptContext(scTemp, true, false, true); - if (debugScript || isCmdLine_c_or_C_Option) + if (debugHigh || isCmdLine_c_or_C_Option) Logger.info("--<<-------------".substring(0, Math.max(17, scriptLevel + 5)) + scriptLevel @@ -2665,7 +2663,7 @@ executing = !chk; if (context == null) return; - if (debugScript || isCmdLine_c_or_C_Option) + if (debugHigh || isCmdLine_c_or_C_Option) Logger.info("--<<-------------".substring(0, Math.max(17, scriptLevel + 5)) + scriptLevel @@ -5223,7 +5221,7 @@ throws ScriptException { if (sm == null) sm = viewer.getShapeManager(); - debugScript = logMessages = false; + debugScript = debugHigh = false; if (!chk) setDebugging(); if (pcEnd == 0) @@ -5271,7 +5269,7 @@ break; if (lineNumbers[pc] > lineEnd) break; - if (logMessages) { + if (debugHigh) { long timeBegin = 0; timeBegin = System.currentTimeMillis(); viewer.scriptStatus("Eval.dispatchCommands():" + timeBegin); @@ -5333,7 +5331,7 @@ logDebugScript(0); if (scriptLevel == 0 && viewer.global.logCommands) viewer.log(thisCommand); - if (logMessages && theToken != null) + if (debugHigh && theToken != null) Logger.debug(theToken.toString()); } if (theToken == null) @@ -8399,7 +8397,7 @@ } if (scriptLevel == 0 && !isAppend && nFiles < 2) showString((String) viewer.getModelSetAuxiliaryInfoValue("modelLoadNote")); - if (logMessages) + if (debugHigh) scriptStatusOrBuffer("Successfully loaded:" + (filenames == null ? htParams.get("fullPathName") : modelName)); Map<String, Object> info = viewer.getModelSetAuxiliaryInfo(); @@ -12973,7 +12971,7 @@ public String getErrorLineMessage2() { return getErrorLineMessage(functionName, scriptFileName, getLinenumber(null), pc, - statementAsString(viewer, st, -9999, logMessages)); + statementAsString(viewer, st, -9999, debugHigh)); } @Override Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -66,7 +66,7 @@ private boolean chk; private boolean wasSyntaxCheck; - private boolean logMessages; + private boolean debugHigh; private ScriptEvaluator eval; private Viewer viewer; @@ -91,13 +91,13 @@ boolean asVector, boolean asBitSet) { this.eval = eval; this.viewer = eval.viewer; - this.logMessages = eval.logMessages; + this.debugHigh = eval.debugHigh; this.chk = wasSyntaxCheck = eval.chk; this.isArrayItem = isArrayItem; this.asVector = asVector || isArrayItem; this.asBitSet = asBitSet; wasX = isArrayItem; - if (logMessages) + if (debugHigh) Logger.debug("initialize RPN"); } @@ -151,7 +151,7 @@ } if (++xPt == xStack.length) xStack = (SV[]) AU.doubleLength(xStack); - if (logMessages) { + if (debugHigh) { Logger.debug("\nputX: " + x); } @@ -364,7 +364,7 @@ boolean addOpAllowMath(T op, boolean allowMathFunc) throws ScriptException { - if (logMessages) { + if (debugHigh) { Logger.debug("addOp entry\naddOp: " + op ); //+ " oPt=" + oPt + " ifPt = " // + ifPt + " skipping=" + skipping + " wasX=" + wasX); @@ -514,7 +514,7 @@ && (op.tok == T.propselector || op.tok == T.leftsquare)) && T.getPrecedence(tok0) >= T.getPrecedence(op.tok)) { - if (logMessages) { + if (debugHigh) { Logger.debug("\noperating, oPt=" + oPt + " isLeftOp=" + isLeftOp + " oStack[oPt]=" + T.nameOf(tok0) + " prec=" + T.getPrecedence(tok0) + " pending op=\"" @@ -759,7 +759,7 @@ M3 m; String s; - if (logMessages) { + if (debugHigh) { dumpStacks("operate: " + op); } Modified: trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java 2014-02-17 03:14:50 UTC (rev 19341) +++ trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java 2014-02-18 04:48:04 UTC (rev 19342) @@ -2429,7 +2429,7 @@ // inline PMESH data if (isPmesh) str = PT.replaceWithCharacter(str, "{,}|", ' '); - if (eval.logMessages) + if (eval.debugHigh) Logger.debug("pmesh inline data:\n" + str); propertyValue = (chk ? null : str); addShapeProperty(propertyList, "fileName", ""); @@ -5702,7 +5702,7 @@ } else { sb.append(ScriptEvaluator.getErrorLineMessage(context.functionName, context.scriptFileName, eval.getLinenumber(context), context.pc, - ScriptEvaluator.statementAsString(viewer, context.statement, -9999, eval.logMessages))); + ScriptEvaluator.statementAsString(viewer, context.statement, -9999, eval.debugHigh))); } context = context.parentContext; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-02-19 23:54:30
|
Revision: 19356 http://sourceforge.net/p/jmol/code/19356 Author: hansonr Date: 2014-02-19 23:54:27 +0000 (Wed, 19 Feb 2014) Log Message: ----------- ___JmolVersion="14.1.10_dev_2014.02.19" bug fix: ==/!= comparison not appropriate for arrays or strings -- string/string comparison should be case sensitive, but wasn't -- (you can use x %9999 == y %9999 to force no-case comparison) -- array/array comparison should be element by element and exact -- assoc.array/assoc.array should be key/value by key/value and exact -- int/decimal comparison should be simply numerical, always -- decimal/decimal comparison should be able to be done without the < 1e-6 cutoff -- you can now use [x] == [y] for exact numerical comparison -- string/int and string/decimal comparison should also only be outside of arrays -- all approximations for type1/type2 should be only outside the context of arrays bug fix: array/string assignment broken in 14.1.9 -- a[2] = ... -- a["testing"] = ... bug fix; HTML5 popup frank mini-menu not implemented bug fix: HTML5 popup menu checkboxes not turning off bug fix: zap <model Number> or zap {atom expression} broken -- does not affect ZAP command without parameters Modified Paths: -------------- trunk/Jmol/src/javajs/awt/Component.java trunk/Jmol/src/javajs/awt/event/ActionEvent.java trunk/Jmol/src/javajs/swing/JCheckBox.java trunk/Jmol/src/javajs/swing/JCheckBoxMenuItem.java trunk/Jmol/src/javajs/swing/JMenu.java trunk/Jmol/src/javajs/swing/JMenuItem.java trunk/Jmol/src/javajs/swing/JRadioButtonMenuItem.java trunk/Jmol/src/javajs/util/T3.java trunk/Jmol/src/org/jmol/popup/AwtSwingPopupHelper.java trunk/Jmol/src/org/jmol/popup/JSSwingPopupHelper.java trunk/Jmol/src/org/jmol/popup/JmolGenericPopup.java trunk/Jmol/src/org/jmol/script/SV.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/script/T.java trunk/Jmol/src/org/jmol/thread/JmolThread.java trunk/Jmol/src/org/jmol/viewer/ActionManager.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/StateCreator.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Added Paths: ----------- trunk/Jmol/src/javajs/awt/event/ItemEvent.java Modified: trunk/Jmol/src/javajs/awt/Component.java =================================================================== --- trunk/Jmol/src/javajs/awt/Component.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/javajs/awt/Component.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -14,6 +14,10 @@ protected String id; protected Object parent; + + public void setParent(Object p) { + parent = p; + } protected Object mouseListener; Modified: trunk/Jmol/src/javajs/awt/event/ActionEvent.java =================================================================== --- trunk/Jmol/src/javajs/awt/event/ActionEvent.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/javajs/awt/event/ActionEvent.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -2,5 +2,11 @@ public class ActionEvent extends Event { + + private String actionCommand; + + public String getActionCommand() { + return actionCommand; + } } Added: trunk/Jmol/src/javajs/awt/event/ItemEvent.java =================================================================== --- trunk/Jmol/src/javajs/awt/event/ItemEvent.java (rev 0) +++ trunk/Jmol/src/javajs/awt/event/ItemEvent.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -0,0 +1,6 @@ +package javajs.awt.event; + + +public class ItemEvent extends Event { + +} Property changes on: trunk/Jmol/src/javajs/awt/event/ItemEvent.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Modified: trunk/Jmol/src/javajs/swing/JCheckBox.java =================================================================== --- trunk/Jmol/src/javajs/swing/JCheckBox.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/javajs/swing/JCheckBox.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -6,13 +6,14 @@ super("chkJCB"); } - @Override - public String toHTML() { - String s = "<input type=checkbox id='" + id + "' class='JCheckBox' style='" + getCSSstyle(0, 0) - + "' " + (selected ? "checked='checked' " : "") + "onclick='SwingController.click(this)'>" - + "<label for='" + id + "'>" + text + "</label>"; - return s; - } + @Override + public String toHTML() { + String s = "<label><input type=checkbox id='" + id + + "' class='JCheckBox' style='" + getCSSstyle(0, 0) + "' " + + (selected ? "checked='checked' " : "") + + "onclick='SwingController.click(this)'>" + text + "</label>"; + return s; + } } Modified: trunk/Jmol/src/javajs/swing/JCheckBoxMenuItem.java =================================================================== --- trunk/Jmol/src/javajs/swing/JCheckBoxMenuItem.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/javajs/swing/JCheckBoxMenuItem.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -2,14 +2,9 @@ public class JCheckBoxMenuItem extends JMenuItem { + public JCheckBoxMenuItem() { - super("chk", 1); + super("chk", TYPE_CHECKBOX); } - - @Override - protected String htmlLabel() { - return "<input id=\"" + this.id + "-cb\" type=\"checkbox\" " + (this.selected ? "checked" : "") + " /><label for=\"" + this.id + "-cb\">TeXt</label>"; - } - } Modified: trunk/Jmol/src/javajs/swing/JMenu.java =================================================================== --- trunk/Jmol/src/javajs/swing/JMenu.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/javajs/swing/JMenu.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -5,7 +5,7 @@ public class JMenu extends JMenuItem { public JMenu() { - super("mnu",3); + super("mnu",TYPE_MENU); } public int getItemCount() { Modified: trunk/Jmol/src/javajs/swing/JMenuItem.java =================================================================== --- trunk/Jmol/src/javajs/swing/JMenuItem.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/javajs/swing/JMenuItem.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -1,14 +1,20 @@ package javajs.swing; -import javajs.util.PT; - public class JMenuItem extends AbstractButton { - int btnType; + public final int btnType; + + public static final int TYPE_SEPARATOR = 0; + public static final int TYPE_BUTTON = 1; + public static final int TYPE_CHECKBOX = 2; + public static final int TYPE_RADIO = 3; + public static final int TYPE_MENU = 4; + public JMenuItem(String text) { super("btn"); setText(text); + btnType = (text == null ? 0 : 1); } public JMenuItem(String type, int i) { @@ -18,13 +24,8 @@ @Override public String toHTML() { - String s = htmlMenuOpener("li"); - if (this.text != null) - s += "<a>"; - s += htmlLabel(); - if (this.text != null) - s = PT.rep(s,"TeXt", this.text) + "</a>"; - return s + "</li>"; + return htmlMenuOpener("li") + + (text == null ? "" : "<a>" + htmlLabel() + "</a>") + "</li>"; } @Override @@ -32,8 +33,14 @@ return " class=\"ui-state-disabled\""; } - protected String htmlLabel() { - return (this.text != null ? "TeXt" : ""); + private String htmlLabel() { + return (btnType == TYPE_BUTTON ? text + : "<label><input id=\"" + id + "-" + (btnType == TYPE_RADIO ? "r" : "c") + + "b\" type=\"" + + (btnType == TYPE_RADIO ? "radio\" name=\"" + htmlName : "checkbox") + + "\" " + (selected ? "checked" : "") + " />" + + text + "</label>"); } + } Modified: trunk/Jmol/src/javajs/swing/JRadioButtonMenuItem.java =================================================================== --- trunk/Jmol/src/javajs/swing/JRadioButtonMenuItem.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/javajs/swing/JRadioButtonMenuItem.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -2,14 +2,10 @@ public class JRadioButtonMenuItem extends JMenuItem { + protected boolean isRadio = true; + public JRadioButtonMenuItem() { - super("rad",2); + super("rad",TYPE_RADIO); } - @Override - public String htmlLabel() { - return "<input id=\"" + this.id + "-rb\" type=\"radio\" name=\"" + this.htmlName + "\" " - + (this.selected ? "checked" : "") + " /><label for=\"" + this.id + "-rb\">TeXt</label>"; - } - } Modified: trunk/Jmol/src/javajs/util/T3.java =================================================================== --- trunk/Jmol/src/javajs/util/T3.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/javajs/util/T3.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -291,7 +291,7 @@ if (!(t1 instanceof T3)) return false; T3 t2 = (T3) t1; - return (this.x == t2.x && this.y == t2.y && this.z == t2.z); + return (x == t2.x && y == t2.y && z == t2.z); } /** Modified: trunk/Jmol/src/org/jmol/popup/AwtSwingPopupHelper.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/AwtSwingPopupHelper.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/org/jmol/popup/AwtSwingPopupHelper.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -154,6 +154,11 @@ } @Override + public void itemStateChanged(ItemEvent e) { + popup.menuCheckBoxCallback(getSource(e)); + } + + @Override public void actionPerformed(ActionEvent e) { popup.menuClickCallback(getSource(e), e.getActionCommand()); } @@ -186,11 +191,6 @@ public void mouseClicked(MouseEvent e) { } - @Override - public void itemStateChanged(ItemEvent e) { - popup.menuCheckBoxCallback(getSource(e)); - } - /** * returns the SwingComponent wrapper for this item * Modified: trunk/Jmol/src/org/jmol/popup/JSSwingPopupHelper.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/JSSwingPopupHelper.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/org/jmol/popup/JSSwingPopupHelper.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -26,6 +26,9 @@ import javajs.api.GenericMenuInterface; import javajs.api.SC; +import javajs.awt.Component; +import javajs.awt.event.ActionEvent; +import javajs.awt.event.ItemEvent; import javajs.swing.ButtonGroup; import javajs.swing.JPopupMenu; import javajs.swing.JCheckBoxMenuItem; @@ -100,20 +103,13 @@ @Override public int getItemType(SC m) { - /** - * @j2sNative - * - * return (m.isMenu ? 4: m.isRadio ? 3 : m.isCheckBox ? 2 : m.text ? 1 : 0); - */ - { - return 0; - } + return ((JMenuItem) m).btnType; } @Override public void menuInsertSubMenu(SC menu, SC subMenu, int index) { - // not applicable; Frank menu only + ((Component)subMenu).setParent(menu); } @Override @@ -127,28 +123,12 @@ ((JPopupMenu) menu).disposeMenu(); } - public void itemStateChanged(Object e) { - /** - * @j2sNative - * - * this.popup.menuCheckBoxCallback(e.getSource()); - * - */ - { - System.out.println(e); - } + public void itemStateChanged(ItemEvent e) { + popup.menuCheckBoxCallback((SC)e.getSource()); } - public void actionPerformed(Object e) { - /** - * @j2sNative - * - * this.popup.menuClickCallback(e.getSource(), e.getActionCommand()); - * - */ - { - System.out.println(e); - } + public void actionPerformed(ActionEvent e) { + popup.menuClickCallback((SC) e.getSource(), e.getActionCommand()); } @Override Modified: trunk/Jmol/src/org/jmol/popup/JmolGenericPopup.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/JmolGenericPopup.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/org/jmol/popup/JmolGenericPopup.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -40,8 +40,8 @@ import javajs.util.List; /** - * A generic popup class that is then instantiated - * for a given platform and context as one of: + * A generic popup class that is then instantiated for a given platform and + * context as one of: * * org.jmol.popup.JmolPopup (via org.jmol.popup.SwingPopup) * @@ -52,9 +52,8 @@ * org.jmol.awtjs2d.JSModelKitPopup (via org.jmol.awtjs2d.JSPopup) * */ - abstract public class JmolGenericPopup extends GenericSwingPopup { +abstract public class JmolGenericPopup extends GenericSwingPopup { - //list is saved in http://www.stolaf.edu/academics/chemapps/jmol/docs/misc protected final static int UPDATE_NEVER = -1; @@ -256,7 +255,7 @@ protected boolean appGetBooleanProperty(String name) { return viewer.getBooleanProperty(name); } - + @Override protected String appGetMenuAsString(String title) { return (new MainPopupResourceBundle(strMenuStructure, null)) @@ -284,12 +283,15 @@ @Override protected void appRestorePopupMenu() { thisPopup = popupMenu; - if (nFrankList < 2) + // JavaScript does not have to re-insert the menu + // because it never gets removed in the first place. + // first entry is just the main item + if (viewer.isJS || nFrankList < 2) return; - // first entry is just the main item for (int i = nFrankList; --i > 0;) { Object[] f = frankList[i]; - helper.menuInsertSubMenu((SC) f[0], (SC) f[1], ((Integer) f[2]).intValue()); + helper.menuInsertSubMenu((SC) f[0], (SC) f[1], + ((Integer) f[2]).intValue()); } nFrankList = 1; } @@ -298,7 +300,7 @@ protected void appRunScript(String script) { viewer.evalStringQuiet(script); } - + /** * (1) setOption --> set setOption true or set setOption false * @@ -325,25 +327,24 @@ return; if (frankPopup == null) frankPopup = helper.menuCreatePopup("Frank", viewer.getApplet()); + // thisPopup is needed by the JavaScript side of the operation thisPopup = frankPopup; menuRemoveAll(frankPopup, 0); - if (id == null) - return; + menuCreateItem(frankPopup, getMenuText("mainMenuText"), "MAIN", ""); currentFrankId = id; nFrankList = 0; frankList[nFrankList++] = new Object[] { null, null, null }; - menuCreateItem(frankPopup, getMenuText("mainMenuText"), "MAIN", ""); - for (int i = id.indexOf(".", 2) + 1;;) { - int iNew = id.indexOf(".", i); - if (iNew < 0) - break; - String strMenu = id.substring(i, iNew); - SC menu = htMenus.get(strMenu); - frankList[nFrankList++] = new Object[] { menu.getParent(), - menu, Integer.valueOf(menuGetListPosition(menu)) }; - menuAddSubMenu(frankPopup, menu); - i = iNew + 1; - } + if (id != null) + for (int i = id.indexOf(".", 2) + 1;;) { + int iNew = id.indexOf(".", i); + if (iNew < 0) + break; + SC menu = htMenus.get(id.substring(i, iNew)); + frankList[nFrankList++] = new Object[] { menu.getParent(), menu, + Integer.valueOf(viewer.isJS ? 0 : menuGetListPosition(menu)) }; + menuAddSubMenu(frankPopup, menu); + i = iNew + 1; + } thisPopup = popupMenu; } @@ -361,8 +362,8 @@ || "files".equals(modelSetFileName) || "string[]".equals(modelSetFileName)) modelSetFileName = ""; - modelSetRoot = modelSetFileName.substring(0, i < 0 ? modelSetFileName - .length() : i); + modelSetRoot = modelSetFileName.substring(0, + i < 0 ? modelSetFileName.length() : i); if (modelSetRoot.length() == 0) modelSetRoot = "Jmol"; modelIndex = viewer.getCurrentModelIndex(); @@ -413,16 +414,17 @@ for (int i = Special.size(); --i >= 0;) updateSpecialMenuItem(Special.get(i)); } - + private void updateFileMenu() { SC menu = htMenus.get("fileMenu"); if (menu == null) return; String text = getMenuText("writeFileTextVARIABLE"); menu = htMenus.get("writeFileTextVARIABLE"); - boolean ignore = (modelSetFileName.equals("zapped") || modelSetFileName.equals("")); + boolean ignore = (modelSetFileName.equals("zapped") || modelSetFileName + .equals("")); if (ignore) { - menuSetLabel(menu, ""); + menuSetLabel(menu, ""); menuEnable(menu, false); } else { menuSetLabel(menu, GT.o(GT._(text), modelSetFileName)); @@ -440,8 +442,7 @@ if (menu == null) return; menuEnable(menu, atomCount != 0); - menuSetLabel(menu, gti("selectMenuText", viewer - .getSelectionCount())); + menuSetLabel(menu, gti("selectMenuText", viewer.getSelectionCount())); } private void updateElementsComputedMenu(BS elementsPresentBitSet) { @@ -507,8 +508,9 @@ String title = PT.getQuotedAttribute(peak, "title"); String atoms = PT.getQuotedAttribute(peak, "atoms"); if (atoms != null) - menuCreateItem(menu, title, "select visible & (@" - + PT.rep(atoms, ",", " or @") + ")", "Focus" + i); + menuCreateItem(menu, title, + "select visible & (@" + PT.rep(atoms, ",", " or @") + ")", "Focus" + + i); } menuEnable(menu, true); return true; @@ -598,7 +600,7 @@ for (int i = VibrationOnly.size(); --i >= 0;) menuEnable(VibrationOnly.get(i), isVibration); for (int i = SymmetryOnly.size(); --i >= 0;) - menuEnable(SymmetryOnly.get(i), isSymmetry && isUnitCell); + menuEnable(SymmetryOnly.get(i), isSymmetry && isUnitCell); for (int i = ChargesOnly.size(); --i >= 0;) menuEnable(ChargesOnly.get(i), haveCharges); for (int i = TemperatureOnly.size(); --i >= 0;) @@ -676,8 +678,7 @@ name += " (" + n + ")"; nItems++; } - SC item = menuCreateItem(menu, name, script, menuGetId(menu) + "." - + name); + SC item = menuCreateItem(menu, name, script, menuGetId(menu) + "." + name); if (n == 0) menuEnable(item, false); return nItems; @@ -732,9 +733,9 @@ for (int i = 0; i < infolist.length; i++) { if (pt >= 0 && (pt++ % nmod) == 0) { String id = "drawsymop" + pt + "Menu"; - subMenu = menuNewSubMenu((i + 1) + "..." - + Math.min(i + itemMax, infolist.length), menuGetId(menu) + "." - + id); + subMenu = menuNewSubMenu( + (i + 1) + "..." + Math.min(i + itemMax, infolist.length), + menuGetId(menu) + "." + id); menuAddSubMenu(menu, subMenu); htMenus.put(id, subMenu); pt = 1; @@ -742,11 +743,10 @@ String sym = (String) infolist[i][1]; // XYZoriginal if (sym.indexOf("x1") < 0) sym = (String) infolist[i][0]; // normalized XYZ - String entryName = (i + 1) + " " + infolist[i][2] + " (" + - sym - + ")"; - menuEnable(menuCreateItem(subMenu, entryName, - "draw SYMOP " + (i + 1), null), true); + String entryName = (i + 1) + " " + infolist[i][2] + " (" + sym + ")"; + menuEnable( + menuCreateItem(subMenu, entryName, "draw SYMOP " + (i + 1), null), + true); } menuEnable(menu, true); } @@ -770,15 +770,17 @@ for (int i = 0; i < list.length; i++) { if (pt >= 0 && (pt++ % nmod) == 0) { String id = "symop" + pt + "Menu"; - subMenu = menuNewSubMenu((i + 1) + "..." - + Math.min(i + itemMax, list.length), menuGetId(menu) + "." + id); + subMenu = menuNewSubMenu( + (i + 1) + "..." + Math.min(i + itemMax, list.length), + menuGetId(menu) + "." + id); menuAddSubMenu(menu, subMenu); htMenus.put(id, subMenu); pt = 1; } String entryName = "symop=" + (i + 1) + " # " + list[i]; - menuEnable(menuCreateItem(subMenu, entryName, "SELECT symop=" - + (i + 1), null), haveUnitCellRange); + menuEnable( + menuCreateItem(subMenu, entryName, "SELECT symop=" + (i + 1), null), + haveUnitCellRange); } menuEnable(menu, true); } @@ -789,9 +791,8 @@ if (menu == null) return; menuEnable(menu, (modelCount > 0)); - menuSetLabel(menu, (modelIndex < 0 ? gti("allModelsText", - modelCount) : gto("modelMenuText", (modelIndex + 1) + "/" - + modelCount))); + menuSetLabel(menu, (modelIndex < 0 ? gti("allModelsText", modelCount) + : gto("modelMenuText", (modelIndex + 1) + "/" + modelCount))); menuRemoveAll(menu, 0); if (modelCount < 1) return; @@ -805,8 +806,9 @@ for (int i = 0; i < modelCount; i++) { if (pt >= 0 && (pt++ % nmod) == 0) { String id = "model" + pt + "Menu"; - subMenu = menuNewSubMenu((i + 1) + "..." - + Math.min(i + itemMax, modelCount), menuGetId(menu) + "." + id); + subMenu = menuNewSubMenu( + (i + 1) + "..." + Math.min(i + itemMax, modelCount), + menuGetId(menu) + "." + id); menuAddSubMenu(menu, subMenu); htMenus.put(id, subMenu); pt = 1; @@ -863,12 +865,9 @@ } } - private final String[] noZapped = { - "surfaceMenu", "measureMenu", - "pickingMenu", "computationMenu", - "saveMenu", "exportMenu", - "SIGNEDJAVAcaptureMenuSPECIAL" - }; + private final String[] noZapped = { "surfaceMenu", "measureMenu", + "pickingMenu", "computationMenu", "saveMenu", "exportMenu", + "SIGNEDJAVAcaptureMenuSPECIAL" }; @SuppressWarnings("unchecked") private void updateModelSetComputedMenu() { @@ -893,20 +892,19 @@ } menuSetLabel(menu, modelSetName); menuEnable(menu, true); - + // 100 here is totally arbitrary. You can do a minimization on any number of atoms menuEnable(htMenus.get("computationMenu"), atomCount <= 100); addMenuItem(menu, gti("atomsText", atomCount)); - addMenuItem(menu, gti("bondsText", viewer - .getBondCountInModel(modelIndex))); + addMenuItem(menu, gti("bondsText", viewer.getBondCountInModel(modelIndex))); if (isPDB) { menuAddSeparator(menu); - addMenuItem(menu, gti("groupsText", viewer - .getGroupCountInModel(modelIndex))); - addMenuItem(menu, gti("chainsText", viewer - .getChainCountInModel(modelIndex))); - addMenuItem(menu, gti("polymersText", viewer - .getPolymerCountInModel(modelIndex))); + addMenuItem(menu, + gti("groupsText", viewer.getGroupCountInModel(modelIndex))); + addMenuItem(menu, + gti("chainsText", viewer.getChainCountInModel(modelIndex))); + addMenuItem(menu, + gti("polymersText", viewer.getPolymerCountInModel(modelIndex))); SC submenu = htMenus.get("BiomoleculesMenu"); if (submenu == null) { submenu = menuNewSubMenu(GT._(getMenuText("biomoleculesMenuText")), @@ -936,8 +934,8 @@ } if (isApplet && !viewer.getBooleanProperty("hideNameInPopup")) { menuAddSeparator(menu); - menuCreateItem(menu, gto("viewMenuText", modelSetFileName), - "show url", null); + menuCreateItem(menu, gto("viewMenuText", modelSetFileName), "show url", + null); } } @@ -952,7 +950,7 @@ private void updateAboutSubmenu() { if (isApplet) setText("APPLETid", viewer.appletName); - + /** * @j2sNative * @@ -999,13 +997,13 @@ } private void updateSpecialMenuItem(SC m) { - m.setText(getSpecialLabel(m.getName(), m.getText())); + m.setText(getSpecialLabel(m.getName(), m.getText())); } - /** - * menus or menu items with SPECIAL in their name are sent here for on-the-fly labeling - * + * menus or menu items with SPECIAL in their name are sent here for on-the-fly + * labeling + * * @param name * @param text * @return revised text @@ -1021,11 +1019,11 @@ else if (name.indexOf("captureFps") >= 0) info = "" + viewer.getInt(T.animationfps); else if (name.indexOf("captureMenu") >= 0) - info = (viewer.captureParams == null ? GT._("not capturing") : viewer.getFilePath((String)viewer.captureParams.get("captureFileName"), true) - + " " + viewer.captureParams.get("captureCount")); + info = (viewer.captureParams == null ? GT._("not capturing") : viewer + .getFilePath((String) viewer.captureParams.get("captureFileName"), + true) + + " " + viewer.captureParams.get("captureCount")); return (info == null ? text : text.substring(0, pt) + " (" + info + ")"); } } - - \ No newline at end of file Modified: trunk/Jmol/src/org/jmol/script/SV.java =================================================================== --- trunk/Jmol/src/org/jmol/script/SV.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/org/jmol/script/SV.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -1180,12 +1180,19 @@ public static boolean areEqual(SV x1, SV x2) { if (x1 == null || x2 == null) return false; - if (x1.tok == string && x2.tok == string) - return sValue(x1).equalsIgnoreCase(sValue(x2)); - if (x1.tok == point3f && x2.tok == point3f) - return (((P3) x1.value).distance((P3) x2.value) < 0.000001); - if (x1.tok == point4f && x2.tok == point4f) - return (((P4) x1.value).distance((P4) x2.value) < 0.000001); + if (x1.tok == x2.tok) { + switch (x1.tok) { + case string: + case bitset: + case hash: + case varray: + return x1.equals(x2); + case point3f: + return (((P3) x1.value).distance((P3) x2.value) < 0.000001); + case point4f: + return (((P4) x1.value).distance((P4) x2.value) < 0.000001); + } + } return (Math.abs(fValue(x1) - fValue(x2)) < 0.000001); } @@ -1403,5 +1410,4 @@ } } - } Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -7131,6 +7131,7 @@ case T.polymer: case T.property: case T.rasmol: + case T.pymol: case T.spacefill: case T.shapely: case T.straightness: @@ -7207,14 +7208,15 @@ // color element String str = parameterAsString(1); if (checkToken(2)) { - switch (getToken(2).tok) { - case T.rasmol: - argb = T.rasmol; - break; + argb = getToken(2).tok; + switch (argb) { case T.none: - case T.jmol: argb = T.jmol; break; + case T.jmol: + case T.rasmol: + case T.pymol: + break; default: argb = getArgbParam(2); } @@ -12125,6 +12127,13 @@ t.toArray(); --i; continue; + case T.string: + // check for a["t"] = xxx + if (vv.tok == T.string) { + t.value = PT.rep((String) t.value, (String) vv.value, tnew.asString()); + continue; + } + break; } t.setSelectedValue(ipt, tnew); break; Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -366,8 +366,8 @@ if (debugHigh) { - Logger.debug("addOp entry\naddOp: " + op ); //+ " oPt=" + oPt + " ifPt = " - // + ifPt + " skipping=" + skipping + " wasX=" + wasX); + Logger.debug("addOp entry\naddOp: " + op); //+ " oPt=" + oPt + " ifPt = " + // + ifPt + " skipping=" + skipping + " wasX=" + wasX); } // are we skipping due to a ( ? : ) construct? @@ -406,9 +406,8 @@ skipping = false; // dumpStacks("(..True...? ... : ...skip...)<--here "); return true; - default: - return true; } + return true; } // Do we have the appropriate context for this operator? @@ -430,27 +429,12 @@ // math functions as arguments appear without a prefixing operator boolean isArgument = (oPt >= 1 && tok0 == T.leftparen); + + // check context, and for some cases, handle them here switch (op.tok) { case T.spacebeforesquare: haveSpaceBeforeSquare = true; return true; - case T.comma: - if (!wasX) - return false; - break; - case T.min: - case T.max: - case T.average: - case T.sum: - case T.sum2: - case T.stddev: - case T.minmaxmask: - tok = (oPt < 0 ? T.nada : tok0); - if (!wasX - || !(tok == T.propselector || tok == T.bonds || tok == T.atoms)) - return false; - oStack[oPt].intValue |= op.tok; - return true; case T.leftsquare: // {....}[n][m] isLeftOp = true; if (!wasX || haveSpaceBeforeSquare) { @@ -459,8 +443,21 @@ haveSpaceBeforeSquare = false; } break; + case T.comma: + if (!wasX) + return false; + break; case T.rightsquare: break; + case T.rightparen: // () without argument allowed only for math funcs + if (!wasX && oPt >= 1 && tok0 == T.leftparen + && !isOpFunc(oStack[oPt - 1])) + return false; + break; + case T.minus: + if (!wasX) + op = SV.newV(T.unaryMinus, "-"); + break; case T.minusMinus: case T.plusPlus: incrementX = (op.tok == T.plusPlus ? 1 : -1); @@ -472,17 +469,18 @@ return x.increment(incrementX); } break; - case T.minus: - if (wasX) - break; - addXInt(0); - op = SV.newV(T.unaryMinus, "-"); - break; - case T.rightparen: // () without argument allowed only for math funcs - if (!wasX && oPt >= 1 && tok0 == T.leftparen - && !isOpFunc(oStack[oPt - 1])) + case T.min: + case T.max: + case T.average: + case T.sum: + case T.sum2: + case T.stddev: + case T.minmaxmask: // ALL + tok = (oPt < 0 ? T.nada : tok0); + if (!wasX || !(tok == T.propselector || tok == T.bonds || tok == T.atoms)) return false; - break; + oStack[oPt].intValue |= op.tok; + return true; case T.opNot: case T.leftparen: isLeftOp = true; @@ -497,20 +495,21 @@ } if (wasX == isLeftOp && tok0 != T.propselector) { // for now, because we have .label and .label() - if (wasX && allowMathFunc) { - if (addOp(T.tokenComma)) - return addOp(op); - } - return false; + if (!wasX || !allowMathFunc) + return false; + if (addOp(T.tokenComma)) + return addOp(op); } break; } + // what is left are standard operators + // Q: Do we need to operate? // A: Well, we must have an operator... - while (oPt >= 0 - // ...and that operator is not :, - // because that's part of an array definition + while (oPt >= 0 + // ...and that operator is not :, + // because that's part of an array definition && tok0 != T.colon // ...and we do not have x( or x[ or func(.... // because the function must come first @@ -522,14 +521,13 @@ && T.getPrecedence(tok0) >= T.getPrecedence(op.tok) // ...and this is not x - - y, because unary minus operates from // right to left. - && (tok0 != T.unaryMinus || op.tok != T.unaryMinus) - ) { + && (tok0 != T.unaryMinus || op.tok != T.unaryMinus)) { if (debugHigh) { Logger.debug("\noperating, oPt=" + oPt + " isLeftOp=" + isLeftOp + " oStack[oPt]=" + T.nameOf(tok0) + " prec=" - + T.getPrecedence(tok0) + " pending op=\"" - + T.nameOf(op.tok) + "\" prec=" + T.getPrecedence(op.tok)); + + T.getPrecedence(tok0) + " pending op=\"" + T.nameOf(op.tok) + + "\" prec=" + T.getPrecedence(op.tok)); dumpStacks("operating"); } // ) and ] must wait until matching ( or [ is found @@ -548,6 +546,7 @@ if (isArrayItem && squareCount == 1 && equalCount == 0) { // x[3] = .... ; add a special flag for this, // waiting until the very end to apply it. + wasX = false; addXVar(SV.newT(T.tokenArraySelector)); break; } @@ -651,7 +650,8 @@ case T.opOr: if (!wasSyntaxCheck && xPt < 0) return false; - if (!wasSyntaxCheck && xStack[xPt].tok != T.bitset && xStack[xPt].tok != T.varray) { + if (!wasSyntaxCheck && xStack[xPt].tok != T.bitset + && xStack[xPt].tok != T.varray) { // check to see if we need to evaluate the second operand or not // if not, then set this to syntax check in order to skip :) // Jmol 12.0.4, Jmol 12.1.2 @@ -678,8 +678,7 @@ putOp(op); // dumpStacks("putOp complete"); - if (op.tok == T.propselector - && (op.intValue & ~T.minmaxmask) == T.function + if (op.tok == T.propselector && (op.intValue & ~T.minmaxmask) == T.function && op.intValue != T.function) { return evaluateFunction(T.nada); } @@ -774,6 +773,7 @@ T op = oStack[oPt--]; P3 pt; M3 m; + M4 m4; String s; if (debugHigh) { @@ -794,14 +794,42 @@ // unary: - if (op.tok == T.minusMinus || op.tok == T.plusPlus) { + switch (op.tok) { + case T.minusMinus: + case T.plusPlus: if (!chk && !x2.increment(incrementX)) return false; wasX = true; putX(x2); // reverse getX() return true; - } - if (op.tok == T.opNot) { + case T.unaryMinus: + switch (x2.tok) { + case T.integer: + return addXInt(-x2.asInt()); + case T.point3f: + pt = P3.newP((P3) x2.value); + pt.scale(-1f); + return addXPt(pt); + case T.point4f: + P4 pt4 = P4.newPt((P4) x2.value); + pt4.scale(-1f); + return addXPt4(pt4); + case T.matrix3f: + m = M3.newM3((M3) x2.value); + m.transpose(); + return addXM3(m); + case T.matrix4f: + m4 = M4.newM4((M4) x2.value); + m4.transpose(); + return addXM4(m4); + case T.bitset: + return addXBs(BSUtil.copyInvert( + SV.bsSelectVar(x2), + (x2.value instanceof BondSet ? viewer.getBondCount() : viewer + .getAtomCount()))); + } + return addXFloat(-x2.asFloat()); + case T.opNot: if (chk) return addXBool(true); switch (x2.tok) { @@ -812,19 +840,19 @@ m.invert(); return addXM3(m); case T.matrix4f: - M4 m4 = M4.newM4((M4) x2.value); + m4 = M4.newM4((M4) x2.value); m4.invert(); return addXM4(m4); case T.bitset: - return addXBs(BSUtil.copyInvert(SV.bsSelectVar(x2), + return addXBs(BSUtil.copyInvert( + SV.bsSelectVar(x2), (x2.value instanceof BondSet ? viewer.getBondCount() : viewer .getAtomCount()))); default: return addXBool(!x2.asBoolean()); } - } - int iv = op.intValue & ~T.minmaxmask; - if (op.tok == T.propselector) { + case T.propselector: + int iv = op.intValue & ~T.minmaxmask; switch (iv) { case T.identifier: return getAllProperties(x2, (String) op.value); @@ -848,8 +876,7 @@ case T.matrix3f: case T.matrix4f: s = SV.sValue(x2); - s = PT.rep(s.substring(1, s.length() - 1), "],[", - "]\n["); + s = PT.rep(s.substring(1, s.length() - 1), "],[", "]\n["); break; case T.string: s = (String) x2.value; @@ -868,11 +895,9 @@ return addXPt(CU.colorPtFromString(s, pt)); case T.integer: case T.decimal: - return addXPt(viewer.getColorPointForPropertyValue(SV - .fValue(x2))); + return addXPt(viewer.getColorPointForPropertyValue(SV.fValue(x2))); case T.point3f: - return addXStr(Escape.escapeColor(CU - .colorPtToFFRGB((P3) x2.value))); + return addXStr(Escape.escapeColor(CU.colorPtToFFRGB((P3) x2.value))); default: // handle bitset later } @@ -883,8 +908,7 @@ if (chk) return addXStr(SV.sValue(x2)); if (x2.tok == T.string) { - Object v = SV - .unescapePointOrBitsetAsVariable(SV.sValue(x2)); + Object v = SV.unescapePointOrBitsetAsVariable(SV.sValue(x2)); if (!(v instanceof SV)) return false; x2 = (SV) v; @@ -901,15 +925,10 @@ chk = false; return addXVar(SV.newT(x1)); } - + return binaryOp(op, x1, x2); } - // public SV selectX(SV x2) { - // return (x2.tok == T.varray || x2.tok == T.matrix3f || x2.tok == T.matrix4f ? SV - // .selectItemVar(x2) : x2); - // } - @SuppressWarnings("unchecked") public boolean binaryOp(T op, SV x1, SV x2) throws ScriptException { P3 pt; @@ -1086,33 +1105,6 @@ return addXPt4(q1.add(-x2.asFloat()).toPoint4f()); } return addXFloat(x1.asFloat() - x2.asFloat()); - case T.unaryMinus: - switch (x2.tok) { - case T.integer: - return addXInt(-x2.asInt()); - case T.point3f: - pt = P3.newP((P3) x2.value); - pt.scale(-1f); - return addXPt(pt); - case T.point4f: - pt4 = P4.newPt((P4) x2.value); - pt4.scale(-1f); - return addXPt4(pt4); - case T.matrix3f: - m = M3.newM3((M3) x2.value); - m.transpose(); - return addXM3(m); - case T.matrix4f: - M4 m4 = M4.newM4((M4) x2.value); - m4.transpose(); - return addXM4(m4); - case T.bitset: - return addXBs(BSUtil.copyInvert( - SV.bsSelectVar(x2), - (x2.value instanceof BondSet ? viewer.getBondCount() : viewer - .getAtomCount()))); - } - return addXFloat(-x2.asFloat()); case T.mul3: if (x1.tok == T.point3f && x2.tok == T.point3f) { pt = (P3) x1.value; @@ -1651,4 +1643,5 @@ return null; return xStack[xPt--]; } + } Modified: trunk/Jmol/src/org/jmol/script/T.java =================================================================== --- trunk/Jmol/src/org/jmol/script/T.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/org/jmol/script/T.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -31,6 +31,7 @@ import javajs.util.AU; import javajs.util.List; + import org.jmol.util.Logger; /** @@ -2569,4 +2570,28 @@ } } + @Override + public boolean equals(Object o) { + // only used for arrays. + if (!(o instanceof T)) + return false; + T t = (T) o; + if (tok == t.tok) + return (t.intValue == intValue && (tok == integer || t.value + .equals(value))); + switch (tok) { + case T.integer: + return (t.tok == T.decimal && ((Float) t.value).floatValue() == intValue); + case T.decimal: + return (t.tok == T.integer && ((Float) value).floatValue() == t.intValue); + default: + return false; + } + } + + @Override + public int hashCode() { + return super.hashCode(); + } + } Modified: trunk/Jmol/src/org/jmol/thread/JmolThread.java =================================================================== --- trunk/Jmol/src/org/jmol/thread/JmolThread.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/org/jmol/thread/JmolThread.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -80,7 +80,7 @@ @Override public synchronized void start() { if (isJS) { - Logger.info("starting " + name); + //Logger.info("starting " + name); run(); } else { super.start(); Modified: trunk/Jmol/src/org/jmol/viewer/ActionManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -1408,15 +1408,16 @@ } if (Logger.debugging) Logger.debug(Binding.getMouseActionName(clickAction, false)); - if (isBound(clickAction, ACTION_clickFrank) && viewer.frankClicked(x, y)) { - viewer.popupMenu(-x, y, 'j'); - return; + if (isBound(clickAction, ACTION_clickFrank)) { + if (viewer.frankClicked(x, y)) { + viewer.popupMenu(-x, y, 'j'); + return; + } + if (viewer.frankClickedModelKit(x, y)) { + viewer.popupMenu(0, 0, 'm'); + return; + } } - if (isBound(clickAction, ACTION_clickFrank) - && viewer.frankClickedModelKit(x, y)) { - viewer.popupMenu(0, 0, 'm'); - return; - } Point3fi nearestPoint = null; boolean isBond = false; boolean isIsosurface = false; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-02-19 23:54:27 UTC (rev 19356) @@ -13,6 +13,23 @@ ___JmolVersion="14.1.10_dev_2014.02.19" +bug fix: ==/!= comparison not appropriate for arrays or strings + -- string/string comparison should be case sensitive, but wasn't + -- (you can use x %9999 == y %9999 to force no-case comparison) + -- array/array comparison should be element by element and exact + -- assoc.array/assoc.array should be key/value by key/value and exact + -- int/decimal comparison should be simply numerical, always + -- decimal/decimal comparison should be able to be done without the < 1e-6 cutoff + -- you can now use [x] == [y] for exact numerical comparison + -- string/int and string/decimal comparison should also only be outside of arrays + -- all approximations for type1/type2 should be only outside the context of arrays + +bug fix: array/string assignment broken in 14.1.9 + -- a[2] = ... + -- a["testing"] = ... + +bug fix; HTML5 popup frank mini-menu not implemented +bug fix: HTML5 popup menu checkboxes not turning off bug fix: zap <model Number> or zap {atom expression} broken -- does not affect ZAP command without parameters Modified: trunk/Jmol/src/org/jmol/viewer/StateCreator.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StateCreator.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/org/jmol/viewer/StateCreator.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -142,7 +142,7 @@ s.append(getDefinedState(sfunc, true)); // numerical values if (isAll || type.equalsIgnoreCase("variableState")) - s.append(getVariableState(global, sfunc)); // removed in 12.1.16; unnecessary in state // ARGH!!! + s.append(getParameterState(global, sfunc)); // removed in 12.1.16; unnecessary in state // ARGH!!! if (isAll || type.equalsIgnoreCase("dataState")) s.append(getDataState(sfunc)); // connections, atoms, bonds, labels, echos, shapes @@ -619,14 +619,21 @@ return commands.toString(); } - private String getVariableState(GlobalSettings global, SB sfunc) { + /** + * note that these are not user variables, only global jmol parameters + * + * @param global + * @param sfunc + * @return String + */ + private String getParameterState(GlobalSettings global, SB sfunc) { String[] list = new String[global.htBooleanParameterFlags.size() + global.htNonbooleanParameterValues.size()]; SB commands = new SB(); boolean isState = (sfunc != null); if (isState) { - sfunc.append(" _setVariableState;\n"); - commands.append("function _setVariableState() {\n\n"); + sfunc.append(" _setParameterState;\n"); + commands.append("function _seParameterState() {\n\n"); } int n = 0; //booleans @@ -1524,22 +1531,29 @@ } @Override - String getFunctionCalls(String selectedFunction) { - if (selectedFunction == null) - selectedFunction = ""; + String getFunctionCalls(String f) { + if (f == null) + f = ""; SB s = new SB(); - int pt = selectedFunction.indexOf("*"); + int pt = f.indexOf("*"); boolean isGeneric = (pt >= 0); - boolean isStatic = (selectedFunction.indexOf("static_") == 0); - boolean namesOnly = (selectedFunction.equalsIgnoreCase("names") || selectedFunction + boolean isStatic = (f.indexOf("static_") == 0); + boolean namesOnly = (f.equalsIgnoreCase("names") || f .equalsIgnoreCase("static_names")); if (namesOnly) - selectedFunction = ""; + f = ""; if (isGeneric) - selectedFunction = selectedFunction.substring(0, pt); - selectedFunction = selectedFunction.toLowerCase(); - Map<String, JmolScriptFunction> ht = (isStatic ? Viewer.staticFunctions - : viewer.localFunctions); + f = f.substring(0, pt); + f = f.toLowerCase(); + if (isStatic || f.length() == 0) + addFunctions(s, Viewer.staticFunctions, f, isGeneric, namesOnly); + if (!isStatic || f.length() == 0) + addFunctions(s, viewer.localFunctions, f, isGeneric, namesOnly); + return s.toString(); + } + + private void addFunctions(SB s, Map<String, JmolScriptFunction> ht, String selectedFunction, + boolean isGeneric, boolean namesOnly) { String[] names = new String[ht.size()]; int n = 0; for (String name : ht.keySet()) @@ -1553,7 +1567,6 @@ s.append(namesOnly ? f.getSignature() : f.toString()); s.appendC('\n'); } - return s.toString(); } private static boolean isTainted(BS[] tainted, int atomIndex, byte type) { Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-02-19 13:45:24 UTC (rev 19355) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-02-19 23:54:27 UTC (rev 19356) @@ -3391,11 +3391,13 @@ } public boolean frankClicked(int x, int y) { + // bottom right Jmol logo return !global.disablePopupMenu && getShowFrank() && shapeManager.checkFrankclicked(x, y); } public boolean frankClickedModelKit(int x, int y) { + // top left indicator return !global.disablePopupMenu && global.modelKitMode && x >= 0 && y >= 0 && x < 40 && y < 80; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-02-21 17:44:33
|
Revision: 19370 http://sourceforge.net/p/jmol/code/19370 Author: hansonr Date: 2014-02-21 17:44:27 +0000 (Fri, 21 Feb 2014) Log Message: ----------- ___JmolVersion="14.1.11_2014.02.21" new feature: added simpler associative array notation: [key:value,...] -- no quotes required -- supplements {"key":value,...] where quotes are still required due to conflict with atom set chain descriptors sucu as {a:b}. code: faster CONNECT [{...}] process for specified bonds bug fix: JSON of 4x4 matrix (M4) fails Modified Paths: -------------- trunk/Jmol/src/javajs/util/M3.java trunk/Jmol/src/javajs/util/M34.java trunk/Jmol/src/javajs/util/M4.java trunk/Jmol/src/javajs/util/PT.java trunk/Jmol/src/org/jmol/modelset/ModelCollection.java trunk/Jmol/src/org/jmol/script/SV.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/javajs/util/M3.java =================================================================== --- trunk/Jmol/src/javajs/util/M3.java 2014-02-20 23:02:09 UTC (rev 19369) +++ trunk/Jmol/src/javajs/util/M3.java 2014-02-21 17:44:27 UTC (rev 19370) @@ -228,6 +228,7 @@ * @param v * The array into which the matrix row values will be copied */ + @Override public void getRow(int row, float v[]) { getRow33(row, v); } Modified: trunk/Jmol/src/javajs/util/M34.java =================================================================== --- trunk/Jmol/src/javajs/util/M34.java 2014-02-20 23:02:09 UTC (rev 19369) +++ trunk/Jmol/src/javajs/util/M34.java 2014-02-21 17:44:27 UTC (rev 19370) @@ -7,7 +7,7 @@ * * additions by Bob Hanson ha...@st... 9/30/2012 for unique * constructor and method names for the optimization of compiled - * JavaScript using Java2Script + * JavaScript using Java2Script and for subclassing to M3 and M4 * */ public abstract class M34 { @@ -239,6 +239,8 @@ err(); } } + + public abstract void getRow(int row, float v[]); protected void getRow33(int row, float v[]) { switch (row) { Modified: trunk/Jmol/src/javajs/util/M4.java =================================================================== --- trunk/Jmol/src/javajs/util/M4.java 2014-02-20 23:02:09 UTC (rev 19369) +++ trunk/Jmol/src/javajs/util/M4.java 2014-02-21 17:44:27 UTC (rev 19370) @@ -423,6 +423,7 @@ * @param v * The array into which the matrix row values will be copied */ + @Override public void getRow(int row, float v[]) { if (row < 3) getRow33(row, v); Modified: trunk/Jmol/src/javajs/util/PT.java =================================================================== --- trunk/Jmol/src/javajs/util/PT.java 2014-02-20 23:02:09 UTC (rev 19369) +++ trunk/Jmol/src/javajs/util/PT.java 2014-02-21 17:44:27 UTC (rev 19370) @@ -787,7 +787,7 @@ // M4 extends M3 int len = (info instanceof M4 ? 4 : 3); float[] x = new float[len]; - M3 m = (M3) info; + M34 m = (M34) info; sb.appendC('['); for (int i = 0; i < len; i++) { if (i > 0) Modified: trunk/Jmol/src/org/jmol/modelset/ModelCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2014-02-20 23:02:09 UTC (rev 19369) +++ trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2014-02-21 17:44:27 UTC (rev 19370) @@ -2162,61 +2162,73 @@ Atom atomB = null; float dAB = 0; float dABcalc = 0; + float distanceSquared; + char altloc = '\0'; short newOrder = (short) (order | JmolEdge.BOND_NEW); - for (int iA = bsA.nextSetBit(0); iA >= 0; iA = bsA.nextSetBit(iA + 1)) { - if (isBonds) { - bondAB = bonds[iA]; - atomA = bondAB.atom1; - atomB = bondAB.atom2; - } else { - atomA = atoms[iA]; - if (atomA.isDeleted()) - continue; - } - char altloc = (isModulated(iA) ? '\0' : atomA.altloc); - for (int iB = (isBonds ? m : bsB.nextSetBit(0)); iB >= 0; iB = (isBonds ? iB - 1 - : bsB.nextSetBit(iB + 1))) { - if (!isBonds) { - if (iB == iA) + boolean checkDistance = (!isBonds || minDistance != JC.DEFAULT_MIN_CONNECT_DISTANCE || maxDistance != JC.DEFAULT_MAX_CONNECT_DISTANCE); + try { + for (int i = bsA.nextSetBit(0); i >= 0; i = bsA.nextSetBit(i + 1)) { + if (isBonds) { + bondAB = bonds[i]; + atomA = bondAB.atom1; + atomB = bondAB.atom2; + } else { + atomA = atoms[i]; + if (atomA.isDeleted()) continue; - atomB = atoms[iB]; - if (atomA.modelIndex != atomB.modelIndex || atomB.isDeleted()) - continue; - if (altloc != '\0' && altloc != atomB.altloc - && atomB.altloc != '\0') - continue; - bondAB = atomA.getBond(atomB); + altloc = (isModulated(i) ? '\0' : atomA.altloc); } - if (bondAB == null && (identifyOnly || modifyOnly) || bondAB != null - && createOnly) - continue; - float distanceSquared = atomA.distanceSquared(atomB); - if (minDistanceIsFractionRadius || maxDistanceIsFractionRadius) { - dAB = atomA.distance(atomB); - dABcalc = atomA.getBondingRadiusFloat() - + atomB.getBondingRadiusFloat(); - } - if ((minDistanceIsFractionRadius ? dAB < dABcalc * minDistance - : distanceSquared < minDistanceSquared) - || (maxDistanceIsFractionRadius ? dAB > dABcalc * maxDistance - : distanceSquared > maxDistanceSquared)) - continue; - if (bondAB != null) { - if (!identifyOnly && !matchAny) { - bondAB.setOrder(order); - bsAromatic.clear(bondAB.index); + for (int j = (isBonds ? m : bsB.nextSetBit(0)); j >= 0; j = bsB + .nextSetBit(j + 1)) { + if (isBonds) { + j = 2147483646; // Integer.MAX_VALUE - 1; one pass only + } else { + if (j == i) + continue; + atomB = atoms[j]; + if (atomA.modelIndex != atomB.modelIndex || atomB.isDeleted()) + continue; + if (altloc != '\0' && altloc != atomB.altloc + && atomB.altloc != '\0') + continue; + bondAB = atomA.getBond(atomB); } - if (!identifyOnly || matchAny || order == bondAB.order - || newOrder == bondAB.order || matchHbond && bondAB.isHydrogen()) { - bsBonds.set(bondAB.index); - nModified++; + if (bondAB == null && (identifyOnly || modifyOnly) || bondAB != null + && createOnly) + continue; + if (checkDistance) { + if (minDistanceIsFractionRadius || maxDistanceIsFractionRadius) { + dAB = atomA.distance(atomB); + dABcalc = atomA.getBondingRadiusFloat() + + atomB.getBondingRadiusFloat(); + } + distanceSquared = atomA.distanceSquared(atomB); + if ((minDistanceIsFractionRadius ? dAB < dABcalc * minDistance + : distanceSquared < minDistanceSquared) + || (maxDistanceIsFractionRadius ? dAB > dABcalc * maxDistance + : distanceSquared > maxDistanceSquared)) + continue; } - } else { - bsBonds.set(bondAtoms(atomA, atomB, order, mad, bsBonds, energy, - addGroup, true).index); - nNew++; + if (bondAB != null) { + if (!identifyOnly && !matchAny) { + bondAB.setOrder(order); + bsAromatic.clear(bondAB.index); + } + if (!identifyOnly || matchAny || order == bondAB.order + || newOrder == bondAB.order || matchHbond + && bondAB.isHydrogen()) { + bsBonds.set(bondAB.index); + nModified++; + } + } else { + bsBonds.set(bondAtoms(atomA, atomB, order, mad, bsBonds, energy, + addGroup, true).index); + nNew++; + } } } + } catch (Exception e) { + // well, we tried -- probably ran over } if (autoAromatize) assignAromaticBondsBs(true, bsBonds); Modified: trunk/Jmol/src/org/jmol/script/SV.java =================================================================== --- trunk/Jmol/src/org/jmol/script/SV.java 2014-02-20 23:02:09 UTC (rev 19369) +++ trunk/Jmol/src/org/jmol/script/SV.java 2014-02-21 17:44:27 UTC (rev 19370) @@ -693,22 +693,23 @@ String[] keys = ht.keySet().toArray(new String[keyset.size()]); Arrays.sort(keys); if (isEscaped) { - sb.append("{ "); + sb.append("["); String sep = ""; for (int i = 0; i < keys.length; i++) { String key = keys[i]; sb.append(sep).append(PT.esc(key)).appendC(':'); sValueArray(sb, ht.get(key), map, level + 1, true); - sep = ", "; + sep = ","; } - sb.append(" }"); + sb.append("]"); return; } for (int i = 0; i < keys.length; i++) { - sb.append(keys[i]).append("\t:"); - SV v = ht.get(keys[i]); + String key = keys[i]; + sb.append(key).append("\t:"); SB sb2 = new SB(); - sValueArray(sb2, v, map, level + 1, isEscaped); + SV v = ht.get(key); + sValueArray(sb2, v, map, level + 1, v.tok == T.string); String value = sb2.toString(); sb.append(value.indexOf("\n") >= 0 ? "\n" : "\t"); sb.append(value).append("\n"); Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-02-20 23:02:09 UTC (rev 19369) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-02-21 17:44:27 UTC (rev 19370) @@ -845,6 +845,16 @@ } } switch (tok) { + case T.rightsquare: + case T.rightbrace: + if (!ignoreComma && nParen == 0 && nSquare == 0) + break out; + if (tok == T.rightbrace) + invArg(); + break; + } + + switch (tok) { case T.define: // @{@x} or @{@{x}} or @{@1} -- also userFunction(@1) if (tokAt(++i) == T.expressionBegin) { @@ -1038,7 +1048,7 @@ i += 2; break; } - v = getHash(i); + v = getAssocArray(i); } else { v = getPointOrPlane(i, false, true, true, false, 3, 4); } @@ -1071,11 +1081,6 @@ case T.expressionEnd: i++; break out; - case T.rightbrace: - if (!ignoreComma && nParen == 0 && nSquare == 0) - break out; - invArg(); - break; case T.comma: // ignore commas if (!ignoreComma && nParen == 0 && nSquare == 0) { break out; @@ -1120,6 +1125,11 @@ } break; default: + if (theTok == T.leftsquare && tokAt(i + 2) == T.colon) { + v = getAssocArray(i); + i = iToken; + break; + } if (T.tokAttr(theTok, T.mathop) || T.tokAttr(theTok, T.mathfunc) && tokAt(iToken + 1) == T.leftparen) { if (!rpn.addOp(theToken)) { @@ -1218,12 +1228,13 @@ } @SuppressWarnings("unchecked") - private Map<String, Object> getHash(int i) throws ScriptException { + private Map<String, Object> getAssocArray(int i) throws ScriptException { Map<String, Object> ht = new Hashtable<String, Object>(); + int closer = (tokAt(i) == T.leftbrace ? T.rightbrace : T.rightsquare); for (i = i + 1; i < slen; i++) { - if (tokAt(i) == T.rightbrace) + if (tokAt(i) == closer) break; - String key = stringParameter(i++); + String key = optParameterAsString(i++); if (tokAt(i++) != T.colon) invArg(); List<SV> v = (List<SV>) parameterExpression(i, 0, null, false, true, -1, @@ -1234,7 +1245,7 @@ break; } iToken = i; - if (tokAt(i) != T.rightbrace) + if (tokAt(i) != closer) invArg(); return ht; } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-02-20 23:02:09 UTC (rev 19369) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-02-21 17:44:27 UTC (rev 19370) @@ -13,8 +13,16 @@ ___JmolVersion="14.1.11_2014.02.21" -bug fix:modelkitmode broken for Java in 14.1.10 +new feature: added simpler associative array notation: [key:value,...] + -- no quotes required + -- supplements {"key":value,...] where quotes are still required + due to conflict with atom set chain descriptors sucu as {a:b}. +code: faster CONNECT [{...}] process for specified bonds + +bug fix: JSON of 4x4 matrix (M4) fails +bug fix: modelkitmode broken for Java in 14.1.10 + new feature: catchable THROW -- as in Java or JavaScript, allows a way of jumping This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-02-25 20:02:40
|
Revision: 19386 http://sourceforge.net/p/jmol/code/19386 Author: hansonr Date: 2014-02-25 20:02:32 +0000 (Tue, 25 Feb 2014) Log Message: ----------- moving hsl<-->rgb color methods to javajs Modified Paths: -------------- trunk/Jmol/src/javajs/util/CU.java trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java trunk/Jmol/src/org/jmol/util/ColorEncoder.java trunk/Jmol/src/org/jmol/util/Rgb16.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/javajs/util/CU.java =================================================================== --- trunk/Jmol/src/javajs/util/CU.java 2014-02-25 18:23:40 UTC (rev 19385) +++ trunk/Jmol/src/javajs/util/CU.java 2014-02-25 20:02:32 UTC (rev 19386) @@ -481,7 +481,66 @@ return rgb(grey, grey, grey); } - + public static P3 rgbToHSL(P3 pt) { + //http://tips4java.wordpress.com/2009/07/05/hsl-color/ + + float r = Math.min(pt.x / 255, 1); + float g = Math.min(pt.y / 255, 1); + float b = Math.min(pt.z / 255, 1); + float min = Math.min(r, Math.min(g, b)); + float max = Math.max(r, Math.max(g, b)); + + // Luminance is just p/2 + + float p = (max + min); + float q = (max - min); + + // Calculate the Hue + + float h = (q == 0 ? 0 + : max == r ? (60 * (g - b) / q + 360) % 360 + : max == g ? 60 * (b - r) / q + 120 + : 60 * (r - g) / q + 240); + + // Calculate the Saturation + + float s = q / (q == 0 ? 1 : p <= 1 ? p : 2 - p); + + return P3.new3(Math.round(h), Math.round(s * 100), Math.round(p * 50)); + } + + /** + * Convert HSL values to a RGB Color. source: + * http://tips4java.wordpress.com/2009/07/05/hsl-color/ + * @param hsl in the range 360, 100, 100 + * @return the RGB as P3 + */ + public static P3 hslToRGB(P3 hsl) { + + float h = hsl.x / 360; + float s = hsl.y / 100; + float l = hsl.z / 100; + + float q = (l < 0.5 ? l * (1 + s) : (l + s) - s * l); + float p = 2 * l - q; + float r = Math.max(0, hueToRGB(p, q, h + 1/3f)); + float g = Math.max(0, hueToRGB(p, q, h)); + float b = Math.max(0, hueToRGB(p, q, h - 1/3f)); + + r = Math.min(r, 1.0f); + g = Math.min(g, 1.0f); + b = Math.min(b, 1.0f); + + return P3.new3(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)); + } + + private static float hueToRGB(float p, float q, float h) { + h += (h < 0 ? 1 : h > 1 ? -1 : 0); + return (6 * h < 1 ? p + (q - p) * 6 * h : 2 * h < 1 ? q : 3 * h < 2 ? p + + (q - p) * 6 * (2/3f - h) : p); + } + + } Modified: trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java 2014-02-25 18:23:40 UTC (rev 19385) +++ trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java 2014-02-25 20:02:32 UTC (rev 19386) @@ -9342,42 +9342,50 @@ } private boolean evaluateColor(ScriptMathProcessor mp, SV[] args) { - // color("hsl", {r g b}) # r g b in 0 to 255 scale + // color("toHSL", {r g b}) # r g b in 0 to 255 scale + // color("toRGB", {h s l}) # h s l in 360, 100, 100 scale // color("rwb") # "" for most recently used scheme for coloring by property // color("rwb", min, max) # min/max default to most recent property mapping // color("rwb", min, max, value) # returns color // color("$isosurfaceId") # info for a given isosurface // color("$isosurfaceId", value) # color for a given mapped isosurface value - // color(ptColor1, ptColor2, n true) + // color(ptColor1, ptColor2, n, asHSL) String colorScheme = (args.length > 0 ? SV.sValue(args[0]) : ""); boolean isIsosurface = colorScheme.startsWith("$"); - if (args.length == 2 && colorScheme.equalsIgnoreCase("hsl")) { - P3 pt = P3.newP(SV.ptValue(args[1])); - float[] hsl = new float[3]; - ColorEncoder.RGBtoHSL(pt.x, pt.y, pt.z, hsl); - pt.set(hsl[0] * 360, hsl[1] * 100, hsl[2] * 100); - return mp.addXPt(pt); - } - if (args.length == 4 && args[3].tok == T.on) { - P3 pt1 = P3.newP(args[0].tok == T.point3f ? SV.ptValue(args[0]) : - CU.colorPtFromString(args[0].asString(), new P3())); - P3 pt2 = P3.newP(args[1].tok == T.point3f ? SV.ptValue(args[1]) : - CU.colorPtFromString(args[1].asString(), new P3())); + if (args.length == 2 && colorScheme.equalsIgnoreCase("TOHSL")) + return mp.addXPt(CU.rgbToHSL(P3.newP(args[1].tok == T.point3f ? SV + .ptValue(args[1]) + : CU.colorPtFromString(args[1].asString(), new P3())))); + if (args.length == 2 && colorScheme.equalsIgnoreCase("TORGB")) + return mp.addXPt(CU.hslToRGB(P3.newP(args[1].tok == T.point3f ? SV + .ptValue(args[1]) + : CU.colorPtFromString(args[1].asString(), new P3())))); + if (args.length == 4 && (args[3].tok == T.on || args[3].tok == T.off)) { + P3 pt1 = P3.newP(args[0].tok == T.point3f ? SV.ptValue(args[0]) : CU + .colorPtFromString(args[0].asString(), new P3())); + P3 pt2 = P3.newP(args[1].tok == T.point3f ? SV.ptValue(args[1]) : CU + .colorPtFromString(args[1].asString(), new P3())); + boolean usingHSL = (args[3].tok == T.on); + if (usingHSL) { + pt1 = CU.rgbToHSL(pt1); + pt2 = CU.rgbToHSL(pt2); + } + SB sb = new SB(); V3 vd = V3.newVsub(pt2, pt1); int n = args[2].asInt(); - if (n < 2) + if (n < 2) n = 30; - vd.scale(1.001f/(n - 1)); + vd.scale(1f / (n - 1)); for (int i = 0; i < n; i++) { - sb.append(Escape.escapeColor(CU.colorPtToFFRGB(pt1))); + sb.append(Escape.escapeColor(CU.colorPtToFFRGB(usingHSL ? + CU.hslToRGB(pt1) : pt1))); pt1.add(vd); } return mp.addXStr(sb.toString()); } - - + ColorEncoder ce = (isIsosurface ? null : viewer .getColorEncoder(colorScheme)); if (!isIsosurface && ce == null) Modified: trunk/Jmol/src/org/jmol/util/ColorEncoder.java =================================================================== --- trunk/Jmol/src/org/jmol/util/ColorEncoder.java 2014-02-25 18:23:40 UTC (rev 19385) +++ trunk/Jmol/src/org/jmol/util/ColorEncoder.java 2014-02-25 20:02:32 UTC (rev 19386) @@ -737,62 +737,4 @@ : getColorSchemeName(currentPalette)); } - static public void RGBtoHSL(float r, float g, float b, float[] ret) { - //http://tips4java.wordpress.com/2009/07/05/hsl-color/ - - // Get RGB values in the range 0 - 1 - - - // Minimum and Maximum RGB values are used in the HSL calculations - - r /= 255; - g /= 255; - b /= 255; - if (r > 1) - r = 1; - if (g > 1) - g = 1; - if (b > 1) - b = 1; - float min = Math.min(r, Math.min(g, b)); - float max = Math.max(r, Math.max(g, b)); - - // Calculate the Hue - - float h = 0; - - if (max == min) - h = 0; - else if (max == r) - h = ((60 * (g - b) / (max - min)) + 360) % 360; - else if (max == g) - h = (60 * (b - r) / (max - min)) + 120; - else if (max == b) - h = (60 * (r - g) / (max - min)) + 240; - - // Calculate the Luminance - - float l = (max + min) / 2; - - // Calculate the Saturation - - float s = 0; - - if (max == min) - s = 0; - else if (l <= .5f) - s = (max - min) / (max + min); - else - s = (max - min) / (2 - max - min); - - //if (s == 1 && l != 0.5f) { - // s = Float.NaN; - // } - - ret[0] = h / 360; - ret[1] = s; - ret[2] = l; - } - - } Modified: trunk/Jmol/src/org/jmol/util/Rgb16.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Rgb16.java 2014-02-25 18:23:40 UTC (rev 19385) +++ trunk/Jmol/src/org/jmol/util/Rgb16.java 2014-02-25 20:02:32 UTC (rev 19386) @@ -58,23 +58,6 @@ gScaled = (rgb16A.gScaled - rgb16B.gScaled) / divisor; bScaled = (rgb16A.bScaled - rgb16B.bScaled) / divisor; } - - /* - void add(Rgb16 other) { - rScaled += other.rScaled; - gScaled += other.gScaled; - bScaled += other.bScaled; - } - */ - - /* - void add(Rgb16 base, Rgb16 other) { - rScaled = base.rScaled + other.rScaled; - gScaled = base.gScaled + other.gScaled; - bScaled = base.bScaled + other.bScaled; - } - */ - public void setAndIncrement(Rgb16 base, Rgb16 other) { rScaled = base.rScaled; base.rScaled += other.rScaled; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-02-25 18:23:40 UTC (rev 19385) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-02-25 20:02:32 UTC (rev 19386) @@ -14,19 +14,27 @@ ___JmolVersion="14.1.11_2014.02.25" -new feature: color(color1, color2, n, true) +new feature: color(color1, color2, n, asHSL) -- returns a color scheme as a string + -- colors can be of any nature -- string or point, name or rgb -- n colors; simple interpolation from color1 to color2 - -- colors can be of any nature -- string or point, name or rgb + -- asHSL must be TRUE or FALSE; + -- when TRUE, uses hue/saturation/luminance instead of rgb gradient + -- example: - $ print color("white","red", 5,true) + $ print color("white", "red", 5, false) [xffffff][xffbfbf][xff7f7f][xff3f3f][xff0000] + + $ print color("red", "blue", 5, true) + + [xff0000][xffff00][x00ff00][x00ffff][x0000ff] $ set propertyColorScheme color("yellow","black",50,true) $ color property temperature - + + bug fix: state reading broken in most recent version at chemapps bug fix: ++/-- compatibility with no-comma arrays This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-02-25 22:36:58
|
Revision: 19388 http://sourceforge.net/p/jmol/code/19388 Author: hansonr Date: 2014-02-25 22:36:50 +0000 (Tue, 25 Feb 2014) Log Message: ----------- very compact hsl--rgb methods Modified Paths: -------------- trunk/Jmol/src/javajs/util/CU.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java trunk/Jmol/src/org/jmol/viewer/JC.java Modified: trunk/Jmol/src/javajs/util/CU.java =================================================================== --- trunk/Jmol/src/javajs/util/CU.java 2014-02-25 20:07:40 UTC (rev 19387) +++ trunk/Jmol/src/javajs/util/CU.java 2014-02-25 22:36:50 UTC (rev 19388) @@ -480,67 +480,78 @@ (1140 * (rgb & 0xFF)) + 5000) / 10000) & 0xFFFFFF; return rgb(grey, grey, grey); } + + + /** + * Convert RGB values to HSL (hue/saturation/luminance) + * + * @param rgb + * range 255 255 255 + * @param doRound + * set to false when just using this for + * for RGB -- HSL -- HSL' -- RGB' conversion + * + * @return the HSL as P3 range 360 100 100 + * @author hansonr + */ - public static P3 rgbToHSL(P3 pt) { - //http://tips4java.wordpress.com/2009/07/05/hsl-color/ + public static P3 rgbToHSL(P3 rgb, boolean doRound) { + // adapted from http://tips4java.wordpress.com/2009/07/05/hsl-color/ + // see http://en.wikipedia.org/wiki/HSL_color_space - float r = Math.min(pt.x / 255, 1); - float g = Math.min(pt.y / 255, 1); - float b = Math.min(pt.z / 255, 1); + float r = rgb.x / 255; + float g = rgb.y / 255; + float b = rgb.z / 255; float min = Math.min(r, Math.min(g, b)); float max = Math.max(r, Math.max(g, b)); - // Luminance is just p/2 - - float p = (max + min); + // Luminance is just p * 50 + + float p = (max + min); float q = (max - min); // Calculate the Hue - float h = (q == 0 ? 0 - : max == r ? (60 * (g - b) / q + 360) % 360 - : max == g ? 60 * (b - r) / q + 120 - : 60 * (r - g) / q + 240); + float h = (60 * ((q == 0 ? 0 : max == r ? ((g - b) / q + 6) + : max == g ? (b - r) / q + 2 : (r - g) / q + 4))) % 360; // Calculate the Saturation float s = q / (q == 0 ? 1 : p <= 1 ? p : 2 - p); - return P3.new3(Math.round(h), Math.round(s * 100), Math.round(p * 50)); + return (doRound ? P3.new3(Math.round(h), Math.round(s * 100), + Math.round(p * 50)) : P3.new3(h, s * 100, p * 50)); } /** - * Convert HSL values to a RGB Color. source: - * http://tips4java.wordpress.com/2009/07/05/hsl-color/ + * Convert HSL (hue/saturation/luninance) values to RGB + * * @param hsl in the range 360, 100, 100 - * @return the RGB as P3 + * @return the RGB as P3 range 0 to 255 + * @author hansonr */ public static P3 hslToRGB(P3 hsl) { + // adapted from http://tips4java.wordpress.com/2009/07/05/hsl-color/ + // see http://en.wikipedia.org/wiki/HSL_color_space - float h = hsl.x / 360; + // highly condensed + + float h = hsl.x / 60; float s = hsl.y / 100; float l = hsl.z / 100; - float q = (l < 0.5 ? l * (1 + s) : (l + s) - s * l); - float p = 2 * l - q; - float r = Math.max(0, hueToRGB(p, q, h + 1/3f)); - float g = Math.max(0, hueToRGB(p, q, h)); - float b = Math.max(0, hueToRGB(p, q, h - 1/3f)); - - r = Math.min(r, 1.0f); - g = Math.min(g, 1.0f); - b = Math.min(b, 1.0f); - + float p = 2 * l - (l < 0.5 ? l * (1 + s) : (l + s) - s * l); + float q = 2 * (l - p); + + float r = toRGB(p, q, h + 2); + float g = toRGB(p, q, h); + float b = toRGB(p, q, h - 2); return P3.new3(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)); } - private static float hueToRGB(float p, float q, float h) { - h += (h < 0 ? 1 : h > 1 ? -1 : 0); - return (6 * h < 1 ? p + (q - p) * 6 * h : 2 * h < 1 ? q : 3 * h < 2 ? p - + (q - p) * 6 * (2/3f - h) : p); + private static float toRGB(float p, float q, float h) { + return ((h = (h + (h < 0 ? 6 : h > 6 ? -6 : 0))) < 1 ? p + q * h + : h < 3 ? p + q : h < 4 ? p + q * (4 - h) : p); } - } - - Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-02-25 20:07:40 UTC (rev 19387) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-02-25 22:36:50 UTC (rev 19388) @@ -7119,7 +7119,7 @@ : T.groupid) | T.allfloat, Float.NaN, Float.NaN); } } else { - if (!isColorIndex && !isIsosurface) + //if (!isIsosurface) index++; if (name.equals("property") && T.tokAttr((tok = getToken(index).tok), T.atomproperty) Modified: trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java 2014-02-25 20:07:40 UTC (rev 19387) +++ trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java 2014-02-25 22:36:50 UTC (rev 19388) @@ -7777,14 +7777,14 @@ for (int i = list.size(); --i >= 0;) data[i] = SV.fValue(list.get(i)); } - int nbins = (int) Math.floor((f1 - f0) / df + 0.01f); + int nbins = Math.max((int) Math.floor((f1 - f0) / df + 0.01f), 1); int[] array = new int[nbins]; int nPoints = data.length; for (int i = 0; i < nPoints; i++) { float v = data[i]; int bin = (int) Math.floor((v - f0) / df); if (bin < 0) - bin = 0; + bin = 0; else if (bin >= nbins) bin = nbins - 1; array[bin]++; @@ -9356,7 +9356,7 @@ if (args.length == 2 && colorScheme.equalsIgnoreCase("TOHSL")) return mp.addXPt(CU.rgbToHSL(P3.newP(args[1].tok == T.point3f ? SV .ptValue(args[1]) - : CU.colorPtFromString(args[1].asString(), new P3())))); + : CU.colorPtFromString(args[1].asString(), new P3())), true)); if (args.length == 2 && colorScheme.equalsIgnoreCase("TORGB")) return mp.addXPt(CU.hslToRGB(P3.newP(args[1].tok == T.point3f ? SV .ptValue(args[1]) @@ -9368,15 +9368,15 @@ .colorPtFromString(args[1].asString(), new P3())); boolean usingHSL = (args[3].tok == T.on); if (usingHSL) { - pt1 = CU.rgbToHSL(pt1); - pt2 = CU.rgbToHSL(pt2); + pt1 = CU.rgbToHSL(pt1, false); + pt2 = CU.rgbToHSL(pt2, false); } SB sb = new SB(); V3 vd = V3.newVsub(pt2, pt1); int n = args[2].asInt(); if (n < 2) - n = 30; + n = 20; vd.scale(1f / (n - 1)); for (int i = 0; i < n; i++) { sb.append(Escape.escapeColor(CU.colorPtToFFRGB(usingHSL ? Modified: trunk/Jmol/src/org/jmol/viewer/JC.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/JC.java 2014-02-25 20:07:40 UTC (rev 19387) +++ trunk/Jmol/src/org/jmol/viewer/JC.java 2014-02-25 22:36:50 UTC (rev 19388) @@ -437,48 +437,41 @@ public final static int PARTIAL_CHARGE_COLIX_RED = FORMAL_CHARGE_COLIX_RED + argbsFormalCharge.length; public final static int PARTIAL_CHARGE_RANGE_SIZE = argbsRwbScale.length; + +// $ print color("red","blue", 33,true) +// [xff0000][xff2000][xff4000] + //[xff6000][xff8000][xff9f00] + + //[xffbf00][xffdf00] ------- + //[xffff00] ------- [xdfff00] + + //[xbfff00][x9fff00][x7fff00] + //[x60ff00][x40ff00][x20ff00] + //[x00ff00][x00ff20][x00ff40] + //[x00ff60][x00ff7f][x00ff9f] + //[x00ffbf][x00ffdf][x00ffff] + //[x00dfff][x00bfff][x009fff] + //[x0080ff][x0060ff][x0040ff] + //[x0020ff][x0000ff] + public final static int[] argbsRoygbScale = { - // must be multiple of THREE for high/low - 0xFFFF0000, - 0xFFFF2000, - 0xFFFF4000, - 0xFFFF6000, - 0xFFFF8000, - 0xFFFFA000, - 0xFFFFC000, - 0xFFFFE000, + // 35 in all //why this comment?: must be multiple of THREE for high/low + 0xFFFF0000, 0xFFFF2000, 0xFFFF4000, + 0xFFFF6000, 0xFFFF8000, 0xFFFFA000, + + // yellow gets compressed, so give it an extra boost - 0xFFFFF000, // yellow gets compressed, so give it an extra boost - - 0xFFFFFF00, - 0xFFF0F000, // yellow gets compressed, so give it a little boost - 0xFFE0FF00, - 0xFFC0FF00, - 0xFFA0FF00, - 0xFF80FF00, - 0xFF60FF00, - 0xFF40FF00, - 0xFF20FF00, - - 0xFF00FF00, - 0xFF00FF20, - 0xFF00FF40, - 0xFF00FF60, - 0xFF00FF80, - 0xFF00FFA0, - 0xFF00FFC0, - 0xFF00FFE0, - - 0xFF00FFFF, - 0xFF00E0FF, - 0xFF00C0FF, - 0xFF00A0FF, - 0xFF0080FF, - 0xFF0060FF, - 0xFF0040FF, - 0xFF0020FF, - - 0xFF0000FF, + 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, + 0xFFFFFF00, 0xFFF0F000, 0xFFE0FF00, + + 0xFFC0FF00, 0xFFA0FF00, 0xFF80FF00, + 0xFF60FF00, 0xFF40FF00, 0xFF20FF00, + 0xFF00FF00, 0xFF00FF20, 0xFF00FF40, + 0xFF00FF60, 0xFF00FF80, 0xFF00FFA0, + 0xFF00FFC0, 0xFF00FFE0, 0xFF00FFFF, + 0xFF00E0FF, 0xFF00C0FF, 0xFF00A0FF, + 0xFF0080FF, 0xFF0060FF, 0xFF0040FF, + 0xFF0020FF, 0xFF0000FF, }; // positive and negative default colors used for This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-03-02 23:56:30
|
Revision: 19409 http://sourceforge.net/p/jmol/code/19409 Author: hansonr Date: 2014-03-02 23:56:22 +0000 (Sun, 02 Mar 2014) Log Message: ----------- inappropriate calls from javajs Modified Paths: -------------- trunk/Jmol/src/javajs/util/Quat.java trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/scriptext/MathExt.java trunk/Jmol/src/org/jmol/util/Escape.java Modified: trunk/Jmol/src/javajs/util/Quat.java =================================================================== --- trunk/Jmol/src/javajs/util/Quat.java 2014-03-01 23:01:24 UTC (rev 19408) +++ trunk/Jmol/src/javajs/util/Quat.java 2014-03-02 23:56:22 UTC (rev 19409) @@ -23,11 +23,6 @@ */ package javajs.util; -import org.jmol.util.Escape; -import org.jmol.util.Logger; -import org.jmol.util.Txt; - - /* * Standard UNIT quaternion math -- for rotation. * @@ -472,10 +467,10 @@ } public V3 getVector(int i) { - return getVectorS(i, 1f); + return getVectorScaled(i, 1f); } - private V3 getVectorS(int i, float scale) { + public V3 getVectorScaled(int i, float scale) { if (i == -1) { scale *= getFixFactor(); return V3.new3(q1 * scale, q2 * scale, q3 * scale); @@ -630,26 +625,6 @@ return mulQ(q2adjusted.inv()); } - public String getInfo() { - A4 axis = toAxisAngle4f(); - return Txt.sprintf("%10.6f%10.6f%10.6f%10.6f %6.2f %10.5f %10.5f %10.5f", - "F", new Object[] { new float[] { q0, q1, q2, q3, - (float) (axis.angle * 180 / Math.PI), axis.x, axis.y, axis.z } }); - } - - public String draw(String prefix, String id, P3 ptCenter, - float scale) { - String strV = " VECTOR " + Escape.eP(ptCenter) + " "; - if (scale == 0) - scale = 1f; - return "draw " + prefix + "x" + id + strV - + Escape.eP(getVectorS(0, scale)) + " color red\n" - + "draw " + prefix + "y" + id + strV - + Escape.eP(getVectorS(1, scale)) + " color green\n" - + "draw " + prefix + "z" + id + strV - + Escape.eP(getVectorS(2, scale)) + " color blue\n"; - } - /** * * Java axisAngle / plane / Point4f format @@ -709,7 +684,7 @@ retStddev[0] = stdDev(data, qMean); diff = Math.abs(retStddev[0] - lastStddev); lastStddev = retStddev[0]; - Logger.info(++iter + " sphereMean " + qMean + " stddev=" + lastStddev + " diff=" + diff); + //Logger.info(++iter + " sphereMean " + qMean + " stddev=" + lastStddev + " diff=" + diff); } return qMean; } Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2014-03-01 23:01:24 UTC (rev 19408) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2014-03-02 23:56:22 UTC (rev 19409) @@ -35,6 +35,7 @@ import org.jmol.util.Logger; +import javajs.util.A4; import javajs.util.OC; import javajs.util.P3; import javajs.util.PT; @@ -700,7 +701,7 @@ continue; } else { q = Quat.newVA(P3.new3(1, 0, 0), angledeg); - strExtra = q.getInfo(); + strExtra = getQInfo(q); if (writeRamachandranStraightness) { z = angledeg; w = straightness; @@ -858,7 +859,7 @@ continue; int deg = (int) Math.floor(Math.acos(w) * 360 / Math.PI); if (derivType == 0) { - pdbATOM.append(q.draw(prefix, id, ptCenter, 1f)); + pdbATOM.append(Escape.drawQuat(q, prefix, id, ptCenter, 1f)); if (qtype == 'n' && isAmino) { P3 ptH = ((AminoMonomer) monomer) .getNitrogenHydrogenPoint(); @@ -882,7 +883,7 @@ .append(qColor[derivType]).append("\n"); continue; } - strExtra = q.getInfo() + strExtra = getQInfo(q) + Txt.sprintf(" %10.5p %10.5p %10.5p", "p", new Object[] { ptCenter }); if (qtype == 'n' && isAmino) { @@ -918,6 +919,26 @@ } } + public String drawQuat(Quat q, String prefix, String id, P3 ptCenter, + float scale) { + String strV = " VECTOR " + Escape.eP(ptCenter) + " "; + if (scale == 0) + scale = 1f; + return "draw " + prefix + "x" + id + strV + + Escape.eP(q.getVectorScaled(0, scale)) + " color red\n" + + "draw " + prefix + "y" + id + strV + + Escape.eP(q.getVectorScaled(1, scale)) + " color green\n" + + "draw " + prefix + "z" + id + strV + + Escape.eP(q.getVectorScaled(2, scale)) + " color blue\n"; + } + + private static String getQInfo(Quat q) { + A4 axis = q.toAxisAngle4f(); + return Txt.sprintf("%10.6f%10.6f%10.6f%10.6f %6.2f %10.5f %10.5f %10.5f", + "F", new Object[] { new float[] { q.q0, q.q1, q.q2, q.q3, + (float) (axis.angle * 180 / Math.PI), axis.x, axis.y, axis.z } }); + } + /** * * @param m Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2014-03-01 23:01:24 UTC (rev 19408) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2014-03-02 23:56:22 UTC (rev 19409) @@ -2186,7 +2186,7 @@ if (isFrame) { eval.checkLast(eval.iToken); if (!chk) - eval.runScript((Quat.newP4((P4) propertyValue)).draw( + eval.runScript(Escape.drawQuat(Quat.newP4((P4) propertyValue), (thisId == null ? "frame" : thisId), " " + swidth, (center == null ? new P3() : center), intScale / 100f)); return false; @@ -2431,8 +2431,8 @@ if (propertyName != null) setShapeProperty(JC.SHAPE_DRAW, propertyName, propertyValue); } - finalizeObject(JC.SHAPE_DRAW, colorArgb[0], translucentLevel, - intScale, havePoints, connections, iptDisplayProperty, null); + finalizeObject(JC.SHAPE_DRAW, colorArgb[0], translucentLevel, intScale, + havePoints, connections, iptDisplayProperty, null); return true; } Modified: trunk/Jmol/src/org/jmol/scriptext/MathExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2014-03-01 23:01:24 UTC (rev 19408) +++ trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2014-03-02 23:56:22 UTC (rev 19409) @@ -1707,8 +1707,7 @@ P4 p4 = null; switch (nArgs) { case 0: - return mp.addXPt4(Quat.newQ(viewer.getRotationQuaternion()) - .toPoint4f()); + return mp.addXPt4(Quat.newQ(viewer.getRotationQuaternion()).toPoint4f()); case 1: default: if (tok == T.quaternion && args[0].tok == T.varray) { @@ -1748,10 +1747,10 @@ return mp.addXFloat(stddev[0]); } if (args[0].tok == T.bitset && args[1].tok == T.bitset) { - Quat[] data1 = viewer.getAtomGroupQuaternions( - (BS) args[0].value, Integer.MAX_VALUE); - Quat[] data2 = viewer.getAtomGroupQuaternions( - (BS) args[1].value, Integer.MAX_VALUE); + Quat[] data1 = viewer.getAtomGroupQuaternions((BS) args[0].value, + Integer.MAX_VALUE); + Quat[] data2 = viewer.getAtomGroupQuaternions((BS) args[1].value, + Integer.MAX_VALUE); qs = Quat.div(data2, data1, nMax, isRelative); break; } @@ -1767,7 +1766,7 @@ if (args[0].tok == T.point4f) { P3 pt = (args[2].tok == T.point3f ? (P3) args[2].value : viewer .getAtomSetCenter((BS) args[2].value)); - return mp.addXStr((Quat.newP4((P4) args[0].value)).draw("q", + return mp.addXStr(Escape.drawQuat(Quat.newP4((P4) args[0].value), "q", SV.sValue(args[1]), pt, 1f)); } P3[] pts = new P3[3]; Modified: trunk/Jmol/src/org/jmol/util/Escape.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Escape.java 2014-03-01 23:01:24 UTC (rev 19408) +++ trunk/Jmol/src/org/jmol/util/Escape.java 2014-03-02 23:56:22 UTC (rev 19409) @@ -83,6 +83,19 @@ return "{" + x.x + " " + x.y + " " + x.z + " " + x.w + "}"; } + public static String drawQuat(Quat q, String prefix, String id, P3 ptCenter, + float scale) { + String strV = " VECTOR " + eP(ptCenter) + " "; + if (scale == 0) + scale = 1f; + return "draw " + prefix + "x" + id + strV + + eP(q.getVectorScaled(0, scale)) + " color red\n" + + "draw " + prefix + "y" + id + strV + + eP(q.getVectorScaled(1, scale)) + " color green\n" + + "draw " + prefix + "z" + id + strV + + eP(q.getVectorScaled(2, scale)) + " color blue\n"; + } + @SuppressWarnings("unchecked") public static String e(Object x) { if (x == null) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-03-20 13:20:02
|
Revision: 19475 http://sourceforge.net/p/jmol/code/19475 Author: hansonr Date: 2014-03-20 13:19:55 +0000 (Thu, 20 Mar 2014) Log Message: ----------- image processing code all independent of Jmol and now in javajs.img Modified Paths: -------------- trunk/Jmol/src/javajs/img/GifEncoder.java trunk/Jmol/src/javajs/img/ImageEncoder.java trunk/Jmol/src/javajs/img/Jpg64Encoder.java trunk/Jmol/src/javajs/img/JpgEncoder.java trunk/Jmol/src/javajs/img/PngEncoder.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/viewer/OutputManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Added Paths: ----------- trunk/Jmol/src/javajs/api/GenericImageEncoder.java Removed Paths: ------------- trunk/Jmol/src/javajs/img/GenericImageEncoder.java Copied: trunk/Jmol/src/javajs/api/GenericImageEncoder.java (from rev 19474, trunk/Jmol/src/javajs/img/GenericImageEncoder.java) =================================================================== --- trunk/Jmol/src/javajs/api/GenericImageEncoder.java (rev 0) +++ trunk/Jmol/src/javajs/api/GenericImageEncoder.java 2014-03-20 13:19:55 UTC (rev 19475) @@ -0,0 +1,11 @@ +package javajs.api; + +import java.util.Map; + +import javajs.util.OC; + +public interface GenericImageEncoder { + + public boolean createImage(String type, OC out, + Map<String, Object> params) throws Exception; +} Deleted: trunk/Jmol/src/javajs/img/GenericImageEncoder.java =================================================================== --- trunk/Jmol/src/javajs/img/GenericImageEncoder.java 2014-03-20 11:58:05 UTC (rev 19474) +++ trunk/Jmol/src/javajs/img/GenericImageEncoder.java 2014-03-20 13:19:55 UTC (rev 19475) @@ -1,11 +0,0 @@ -package javajs.img; - -import java.util.Map; - -import javajs.util.OC; - -public interface GenericImageEncoder { - - public void createImage(String type, OC out, - Map<String, Object> params) throws Exception; -} Modified: trunk/Jmol/src/javajs/img/GifEncoder.java =================================================================== --- trunk/Jmol/src/javajs/img/GifEncoder.java 2014-03-20 11:58:05 UTC (rev 19474) +++ trunk/Jmol/src/javajs/img/GifEncoder.java 2014-03-20 13:19:55 UTC (rev 19475) @@ -62,7 +62,6 @@ package javajs.img; -import org.jmol.script.T; import javajs.util.List; import java.util.Collections; import java.util.Comparator; @@ -70,8 +69,6 @@ import java.util.Map; import java.io.IOException; -import org.jmol.util.Logger; - /** * * GifEncoder extensively modified for Jmol by Bob Hanson @@ -179,7 +176,7 @@ @Override protected void setParams(Map<String, Object> params) { this.params = params; - interlaced = Boolean.TRUE == params.get("interlaced"); + interlaced = (Boolean.TRUE == params.get("interlaced")); if (interlaced || !params.containsKey("captureMode")) return; try { @@ -187,33 +184,31 @@ } catch (Exception e) { // ignore } - switch (((Integer) params.get("captureMode")).intValue()) { - case T.movie: - params.put("captureMode", Integer.valueOf(T.add)); + int imode = "maec".indexOf(((String) params.get("captureMode")).substring(0, 1)); + if (logging) + System.out.println("GIF capture mode " + imode); + switch (imode) { + case 0: //"movie" + params.put("captureMode", "add"); addImage = false; addTrailer = false; break; - case T.add: + case 1: // add addHeader = false; addTrailer = false; int fps = Math.abs(((Integer) params.get("captureFps")).intValue()); delayTime100ths = (fps == 0 ? 0 : 100 / fps); looping = (Boolean.FALSE != params.get("captureLooping")); break; - case T.end: + case 2: // end addHeader = false; addImage = false; break; - case T.cancel: + case 3: // cancel addHeader = false; addImage = false; - /** - * @j2sNative - * - * this.out.cancel(); - * - */ - {} + out.cancel(); + break; } } @@ -243,7 +238,8 @@ protected void close() { if (addTrailer) { writeTrailer(); - super.close(); + } else { + doClose = false; } params.put("captureByteCount", Integer.valueOf(byteCount)); } @@ -315,8 +311,8 @@ } ciHash = null; - if (Logger.debugging) - Logger.debug("# total image colors = " + nColors); + if (logging) + System.out.println("# total image colors = " + nColors); // sort by frequency colorVector.sort(); return colorVector; @@ -356,8 +352,8 @@ ColorItem item = colorVector.get(nMax); ht.put(Integer.valueOf(item.rgb), item.acc = new AdaptiveColorCollection(item.rgb, index++)); - if (Logger.debugging) - Logger.debug("# GIF colors = " + ht.size()); + if (logging) + System.out.println("# GIF colors = " + ht.size()); return ht; } Modified: trunk/Jmol/src/javajs/img/ImageEncoder.java =================================================================== --- trunk/Jmol/src/javajs/img/ImageEncoder.java 2014-03-20 11:58:05 UTC (rev 19474) +++ trunk/Jmol/src/javajs/img/ImageEncoder.java 2014-03-20 13:19:55 UTC (rev 19475) @@ -54,6 +54,7 @@ import java.util.Map; +import javajs.api.GenericImageEncoder; import javajs.util.OC; @@ -77,6 +78,8 @@ protected int height = -1; protected int quality = -1; protected String date; + protected boolean logging; + protected boolean doClose = true; /** * @param type @@ -84,9 +87,10 @@ * @param params */ @Override - public void createImage(String type, OC out, Map<String, Object> params) + public boolean createImage(String type, OC out, Map<String, Object> params) throws Exception { this.out = out; + logging = (Boolean.TRUE == params.get("logging")); width = ((Integer) params.get("imageWidth")).intValue(); height = ((Integer) params.get("imageHeight")).intValue(); pixels = (int[]) params.get("imagePixels"); @@ -95,7 +99,8 @@ quality = (q == null ? -1 : q.intValue()); setParams(params); generate(); - close(); + close(); // GIF will override this and not close + return doClose; } abstract protected void setParams(Map<String, Object> params); Modified: trunk/Jmol/src/javajs/img/Jpg64Encoder.java =================================================================== --- trunk/Jmol/src/javajs/img/Jpg64Encoder.java 2014-03-20 11:58:05 UTC (rev 19474) +++ trunk/Jmol/src/javajs/img/Jpg64Encoder.java 2014-03-20 13:19:55 UTC (rev 19475) @@ -16,7 +16,7 @@ * JpegEncoder and its associated classes are Copyright (c) 1998, James R. Weeks and BioElectroMech * see(Jmol/src/com/obrador/license.txt) * - * Jmol.src.org.jmol.util.JpegEncoder.java was adapted by Bob Hanson + * javajs.img.JpegEncoder.java was adapted by Bob Hanson * for Jmol in the following ways: * * 1) minor coding efficiencies were made in some for() loops. Modified: trunk/Jmol/src/javajs/img/JpgEncoder.java =================================================================== --- trunk/Jmol/src/javajs/img/JpgEncoder.java 2014-03-20 11:58:05 UTC (rev 19474) +++ trunk/Jmol/src/javajs/img/JpgEncoder.java 2014-03-20 13:19:55 UTC (rev 19475) @@ -16,7 +16,8 @@ * JpegEncoder and its associated classes are Copyright (c) 1998, James R. Weeks and BioElectroMech * see(Jmol/src/com/obrador/license.txt) * - * Jmol.src.org.jmol.util.JpegEncoder.java was adapted by Bob Hanson + * javjs.img.JpegEncoder.java was adapted by Bob Hanson + * * for Jmol in the following ways: * * 1) minor coding efficiencies were made in some for() loops. @@ -35,8 +36,6 @@ import java.io.IOException; import java.util.Map; -import org.jmol.io.JmolBinary; - import javajs.img.ImageEncoder; import javajs.util.AU; import javajs.util.OC; @@ -67,6 +66,7 @@ private Huffman huf; private DCT dct; protected int defaultQuality = 100; + private String applicationTag; public JpgEncoder() { @@ -78,6 +78,7 @@ quality = defaultQuality; jpegObj = new JpegObj(); jpegObj.comment = (String) params.get("comment"); + applicationTag = (String) params.get("jpgAppTag"); } @Override @@ -289,7 +290,7 @@ private void writeString(String s, byte id) { int len = s.length(); int i0 = 0; - String suffix = JmolBinary.JPEG_CONTINUE_STRING; + String suffix = applicationTag; while (i0 < len) { int nBytes = len - i0; if (nBytes > CONTINUE_MAX_BUFFER) { Modified: trunk/Jmol/src/javajs/img/PngEncoder.java =================================================================== --- trunk/Jmol/src/javajs/img/PngEncoder.java 2014-03-20 11:58:05 UTC (rev 19474) +++ trunk/Jmol/src/javajs/img/PngEncoder.java 2014-03-20 13:19:55 UTC (rev 19475) @@ -99,9 +99,9 @@ private String type; private Integer transparentColor; - private byte[] applicationData; - private String applicationPrefix; - private String version; + private byte[] appData; + private String appPrefix; + private String comment; private byte[] bytes; @@ -119,11 +119,11 @@ filter = FILTER_NONE; compressionLevel = quality; transparentColor = (Integer) params.get("transparentColor"); - bytes = (byte[]) params.get("imageData"); + comment = (String) params.get("comment"); type = (params.get("type") + "0000").substring(0, 4); - version = (String) params.get("comment"); - applicationData = (byte[]) params.get("applicationData"); - applicationPrefix = (String) params.get("applicationPrefix"); + bytes = (byte[]) params.get("pngImgData"); + appData = (byte[]) params.get("pngAppData"); + appPrefix = (String) params.get("pngAppPrefix"); } @@ -140,11 +140,11 @@ dataLen = bytes.length; } int len = dataLen; - if (applicationData != null) { - setJmolTypeText(applicationPrefix, bytes, len, applicationData.length, + if (appData != null) { + setJmolTypeText(appPrefix, bytes, len, appData.length, type); out.write(bytes, 0, len); - len = (bytes = applicationData).length; + len = (bytes = appData).length; } out.write(bytes, 0, len); } @@ -164,9 +164,9 @@ writeBytes(pngIdBytes); //hdrPos = bytePos; writeHeader(); - writeText(getApplicationText(applicationPrefix, type, 0, 0)); + writeText(getApplicationText(appPrefix, type, 0, 0)); - writeText("Software\0Jmol " + version); + writeText("Software\0Jmol " + comment); writeText("Creation Time\0" + date); if (!encodeAlpha && transparentColor != null) Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2014-03-20 11:58:05 UTC (rev 19474) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2014-03-20 13:19:55 UTC (rev 19475) @@ -557,7 +557,7 @@ params.put("quality", Integer.valueOf(-1)); params.put("endTime", Long.valueOf(System.currentTimeMillis() + (long) (endTime * 1000))); - params.put("captureMode", Integer.valueOf(mode)); + params.put("captureMode", T.nameOf(mode).toLowerCase()); params.put("captureLooping", looping ? Boolean.TRUE : Boolean.FALSE); String msg = viewer.processWriteOrCapture(params); Logger.info(msg); Modified: trunk/Jmol/src/org/jmol/viewer/OutputManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/OutputManager.java 2014-03-20 11:58:05 UTC (rev 19474) +++ trunk/Jmol/src/org/jmol/viewer/OutputManager.java 2014-03-20 13:19:55 UTC (rev 19475) @@ -13,9 +13,8 @@ import org.jmol.io.Binary; import org.jmol.io.JmolBinary; import org.jmol.java.BS; -import org.jmol.script.T; -import javajs.img.GenericImageEncoder; +import javajs.api.GenericImageEncoder; import javajs.util.OC; import javajs.util.List; import javajs.util.PT; @@ -137,7 +136,8 @@ boolean asBytes = (out == null && fileName == null); boolean closeChannel = (out == null && fileName != null); boolean releaseImage = (objImage == null); - Object image = (type.equals("ZIPDATA") ? "" : rgbbuf != null ? rgbbuf : objImage != null ? objImage : viewer.getScreenImageBuffer(null, true)); + Object image = (type.equals("ZIPDATA") ? "" : rgbbuf != null ? rgbbuf + : objImage != null ? objImage : viewer.getScreenImageBuffer(null, true)); boolean isOK = false; try { if (image == null) @@ -159,6 +159,7 @@ comment = (!asBytes ? (String) getWrappedState(null, null, image, null) : ""); } + params.put("jpgAppTag", JmolBinary.JPEG_CONTINUE_STRING); } else if (type.equals("PDF")) { comment = ""; } else if (type.startsWith("PNG")) { @@ -173,12 +174,12 @@ .getBytes(); } if (stateData != null) { - params.put("applicationData", stateData); - params.put("applicationPrefix", "Jmol Type"); + params.put("pngAppData", stateData); + params.put("pngAppPrefix", "Jmol Type"); } if (type.equals("PNGT")) - params.put("transparentColor", Integer.valueOf(viewer - .getBackgroundArgb())); + params.put("transparentColor", + Integer.valueOf(viewer.getBackgroundArgb())); type = "PNG"; } if (comment != null) @@ -189,6 +190,9 @@ if (closeChannel) out.closeChannel(); if (isOK) { + if (params.containsKey("captureMsg")) + viewer.prompt((String) params.get("captureMsg"), "OK", null, true); + if (asBytes) bytes = out.toByteArray(); else if (params.containsKey("captureByteCount")) @@ -264,13 +268,13 @@ if (v.size() >= 2 && v.get(0).equals("_IMAGE_")) { objImage = null; v.remove(0); - params.put("imageData", v.remove(0)); + params.put("pngImgData", v.remove(0)); OC oz = getOutputChannel(null, null); errRet[0] = writeZipFile(oz, v, "OK JMOL"); params.put("type", "PNGJ"); type = "Png"; - params.put("applicationPrefix", "Jmol Type"); - params.put("applicationData", oz.toByteArray()); + params.put("pngAppPrefix", "Jmol Type"); + params.put("pngAppData", oz.toByteArray()); } else if (v.size() == 1) { byte[] b = (byte[]) v.remove(0); out.write(b, 0, b.length); @@ -286,6 +290,7 @@ errRet[0] = "Image encoder type " + type + " not available"; return false; } + boolean doClose = true; try { int w = objImage == null ? -1 : PT.isAI(objImage) ? ((Integer) params .get("width")).intValue() : viewer.apiPlatform @@ -295,13 +300,19 @@ .getImageHeight(objImage); params.put("imageWidth", Integer.valueOf(w)); params.put("imageHeight", Integer.valueOf(h)); - params.put("imagePixels", encodeImage(w, h, objImage)); - ie.createImage(type, out, params); + int[] pixels = encodeImage(w, h, objImage); + if (pixels != null) + params.put("imagePixels", pixels); + params.put("logging", Boolean.valueOf(Logger.debugging)); + // GIF capture may not close output channel + doClose = ie.createImage(type, out, params); } catch (Exception e) { errRet[0] = e.toString(); out.cancel(); + doClose = true; } finally { - out.closeChannel(); + if (doClose) + out.closeChannel(); } return (errRet[0] == null); } @@ -593,7 +604,8 @@ * @param doCheck * @return null (canceled) or a message starting with OK or an error message */ - protected String handleOutputToFile(Map<String, Object> params, boolean doCheck) { + protected String handleOutputToFile(Map<String, Object> params, + boolean doCheck) { // org.jmol.image.AviCreator does create AVI animations from JPEGs //but these aren't read by standard readers, so that's pretty much useless. @@ -607,13 +619,13 @@ int width = getInt(params, "width", 0); int height = getInt(params, "height", 0); int quality = getInt(params, "quality", Integer.MIN_VALUE); - int captureMode = getInt(params, "captureMode", Integer.MIN_VALUE); - if (captureMode != Integer.MIN_VALUE && !viewer.allowCapture()) + String captureMode = (String) params.get("captureMode"); + if (captureMode != null && !viewer.allowCapture()) return "ERROR: Cannot capture on this platform."; boolean mustRender = (quality != Integer.MIN_VALUE); // localName will be fileName only if we are able to write to disk. String localName = null; - if (captureMode != Integer.MIN_VALUE) { + if (captureMode != null) { doCheck = false; // will be checked later mustRender = false; type = "GIF"; @@ -656,14 +668,16 @@ if (sret == null) { // allow Jmol to do it String msg = null; - if (captureMode != Integer.MIN_VALUE) { + if (captureMode != null) { OC out = null; Map<String, Object> cparams = viewer.captureParams; - switch (captureMode) { - case T.movie: + int imode = "ad on of en ca mo ".indexOf(captureMode + .substring(0, 2)); + // 0 3 6 9 12 15 + switch (imode) { + case 15: if (cparams != null) - ((OC) cparams.get("outputChannel")) - .closeChannel(); + ((OC) cparams.get("outputChannel")).closeChannel(); out = getOutputChannel(localName, null); if (out == null) { sret = msg = "ERROR: capture canceled"; @@ -674,7 +688,7 @@ viewer.captureParams = params; params.put("captureFileName", localName); params.put("captureCount", Integer.valueOf(1)); - params.put("captureMode", Integer.valueOf(T.movie)); + params.put("captureMode", "movie"); } break; default: @@ -682,11 +696,11 @@ sret = msg = "ERROR: capture not active"; } else { params = cparams; - switch (captureMode) { + switch (imode) { default: sret = msg = "ERROR: CAPTURE MODE=" + captureMode + "?"; break; - case T.add: + case 0: //add: if (Boolean.FALSE == params.get("captureEnabled")) { sret = msg = "capturing OFF; use CAPTURE ON/END/CANCEL to continue"; } else { @@ -695,29 +709,31 @@ msg = type + "_STREAM_ADD " + count; } break; - case T.on: - case T.off: + case 3: //on: + case 6: //off: params = cparams; - params.put("captureEnabled", - (captureMode == T.on ? Boolean.TRUE : Boolean.FALSE)); + params + .put("captureEnabled", + (captureMode.equals("on") ? Boolean.TRUE + : Boolean.FALSE)); sret = type + "_STREAM_" - + (captureMode == T.on ? "ON" : "OFF"); - params.put("captureMode", Integer.valueOf(T.add)); + + (captureMode.equals("on") ? "ON" : "OFF"); + params.put("captureMode", "add"); break; - case T.end: - case T.cancel: + case 9:// end: + case 12:// cancel: params = cparams; - params.put("captureMode", Integer.valueOf(captureMode)); + params.put("captureMode", captureMode); fileName = (String) params.get("captureFileName"); msg = type + "_STREAM_" - + (captureMode == T.end ? "CLOSE " : "CANCEL ") + + (captureMode.equals("end") ? "CLOSE " : "CANCEL ") + params.get("captureFileName"); viewer.captureParams = null; - viewer.prompt(GT._("Capture") - + ": " - + (captureMode == T.cancel ? GT._("canceled") : GT.o(GT._( - "{0} saved"), fileName)), "OK", null, - true); + params.put("captureMsg", + GT._("Capture") + + ": " + + (captureMode.equals("cancel") ? GT._("canceled") + : GT.o(GT._("{0} saved"), fileName))); } break; } Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-03-20 11:58:05 UTC (rev 19474) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-03-20 13:19:55 UTC (rev 19475) @@ -4342,7 +4342,7 @@ if (captureParams != null && Boolean.FALSE != captureParams.get("captureEnabled")) { //showString(transformManager.matrixRotate.toString(), false); if (System.currentTimeMillis() + 50 > ((Long)captureParams.get("endTime")).longValue()) - captureParams.put("captureMode", Integer.valueOf(T.end)); + captureParams.put("captureMode", "end"); processWriteOrCapture(captureParams); } notifyViewerRepaintDone(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-03-20 23:59:11
|
Revision: 19487 http://sourceforge.net/p/jmol/code/19487 Author: hansonr Date: 2014-03-20 23:59:06 +0000 (Thu, 20 Mar 2014) Log Message: ----------- refactoring of CIf parser into javajs.util Modified Paths: -------------- trunk/Jmol/src/javajs/util/Binary.java trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java trunk/Jmol/src/org/jmol/adapter/readers/cif/MSCifReader.java trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java trunk/Jmol/src/org/jmol/io/JmolBinary.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Added Paths: ----------- trunk/Jmol/src/javajs/api/GenericCifDataReader.java trunk/Jmol/src/javajs/util/CifDataReader.java trunk/Jmol/src/javajs/util/GenericLineReader.java trunk/Jmol/src/javajs/util/LimitedLineReader.java Removed Paths: ------------- trunk/Jmol/src/org/jmol/api/JmolLineReader.java trunk/Jmol/src/org/jmol/io/CifDataReader.java trunk/Jmol/src/org/jmol/io/LimitedLineReader.java Added: trunk/Jmol/src/javajs/api/GenericCifDataReader.java =================================================================== --- trunk/Jmol/src/javajs/api/GenericCifDataReader.java (rev 0) +++ trunk/Jmol/src/javajs/api/GenericCifDataReader.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -0,0 +1,43 @@ +package javajs.api; + +import java.io.BufferedReader; +import java.util.Map; + +import javajs.util.CifDataReader; +import javajs.util.GenericLineReader; + +public interface GenericCifDataReader { + + static final int NONE = -1; + + String fullTrim(String str); + + Map<String, Object> getAllCifData(); + + boolean getData() throws Exception; + + String getFileHeader(); + + String getNextDataToken() throws Exception; + + String getNextToken() throws Exception; + + String getTokenPeeked(); + + String peekToken() throws Exception; + + String readLine(); + + CifDataReader set(GenericLineReader reader, BufferedReader br); + + String toUnicode(String data); + + String getLoopData(int i); + + int parseLoopParameters(String[] fields, int[] fieldOf, int[] propertyOf) throws Exception; + + int getFieldCount(); + + String getField(int i); + +} Property changes on: trunk/Jmol/src/javajs/api/GenericCifDataReader.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Modified: trunk/Jmol/src/javajs/util/Binary.java =================================================================== --- trunk/Jmol/src/javajs/util/Binary.java 2014-03-20 23:04:15 UTC (rev 19486) +++ trunk/Jmol/src/javajs/util/Binary.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -34,6 +34,7 @@ import java.util.Map; +import javajs.api.GenericCifDataReader; import javajs.api.Interface; import javajs.api.GenericZipTools; import javajs.api.ZInputStream; @@ -433,5 +434,13 @@ return getBIS(data); } + public static GenericCifDataReader getCifReader() { + return (GenericCifDataReader) javajs.api.Interface.getInterface("javajs.util.CifDataReader"); + } + + public static Map<String, Object> readCifData(BufferedReader br) { + return new CifDataReader().set(null, br).getAllCifData(); + } + } Copied: trunk/Jmol/src/javajs/util/CifDataReader.java (from rev 19475, trunk/Jmol/src/org/jmol/io/CifDataReader.java) =================================================================== --- trunk/Jmol/src/javajs/util/CifDataReader.java (rev 0) +++ trunk/Jmol/src/javajs/util/CifDataReader.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -0,0 +1,541 @@ +package javajs.util; + +import java.io.BufferedReader; + +import java.util.Hashtable; + +import java.util.Map; + +import javajs.api.GenericCifDataReader; + + + +public class CifDataReader implements GenericCifDataReader { + /** + * + * A special tokenizer class for dealing with quoted strings in CIF files. + * + * Greek letters implemented in Jmol 13.3.9 and only for + * titles and space groups. All other mark ups ignored. + * + *<p> + * regarding the treatment of single quotes vs. primes in + * cif file, PMR wrote: + *</p> + *<p> + * * There is a formal grammar for CIF + * (see http://www.iucr.org/iucr-top/cif/index.html) + * which confirms this. The textual explanation is + *<p /> + *<p> + * 14. Matching single or double quote characters (' or ") may + * be used to bound a string representing a non-simple data value + * provided the string does not extend over more than one line. + *<p /> + *<p> + * 15. Because data values are invariably separated from other + * tokens in the file by white space, such a quote-delimited + * character string may contain instances of the character used + * to delimit the string provided they are not followed by white + * space. For example, the data item + *<code> + * _example 'a dog's life' + *</code> + * is legal; the data value is a dog's life. + *</p> + *<p> + * [PMR - the terminating character(s) are quote+whitespace. + * That would mean that: + *<code> + * _example 'Jones' life' + *</code> + * would be an error + *</p> + *<p> + * The CIF format was developed in that late 1980's under the aegis of the + * International Union of Crystallography (I am a consultant to the COMCIFs + * committee). It was ratified by the Union and there have been several + * workshops. mmCIF is an extension of CIF which includes a relational + * structure. The formal publications are: + *</p> + *<p> + * Hall, S. R. (1991). "The STAR File: A New Format for Electronic Data + * Transfer and Archiving", J. Chem. Inform. Comp. Sci., 31, 326-333. + * Hall, S. R., Allen, F. H. and Brown, I. D. (1991). "The Crystallographic + * Information File (CIF): A New Standard Archive File for Crystallography", + * Acta Cryst., A47, 655-685. + * Hall, S.R. & Spadaccini, N. (1994). "The STAR File: Detailed + * Specifications," J. Chem. Info. Comp. Sci., 34, 505-508. + *</p> + */ + private GenericLineReader reader; + private BufferedReader br; + + private String line; + private String str; + private int ich; + private int cch; + private boolean wasUnQuoted; + private String strPeeked; + private int ichPeeked; + private int fieldCount; + private String[] loopData; + private SB fileHeader = new SB(); + private boolean isHeader = true; + + //////////////////////////////////////////////////////////////// + // special tokenizer class + //////////////////////////////////////////////////////////////// + + public CifDataReader() { + // for reflection + } + + @Override + public CifDataReader set(GenericLineReader reader, BufferedReader br) { + this.reader = reader; + this.br = br; + return this; + } + + @Override + public String getFileHeader() { + return fileHeader.toString(); + } + + + /** + * reads all Cif Data for a reader defined in the constructor + * + * @return Hashtable of models Vector of Hashtable data + */ + @Override + public Map<String, Object> getAllCifData() { + line = ""; + String key; + allData = new Hashtable<String, Object>(); + List<Map<String, Object>> models = new List<Map<String,Object>>(); + allData.put("models", models); + try { + while ((key = getNextToken()) != null) { + if (key.startsWith("global_") || key.startsWith("data_")) { + models.addLast(data = new Hashtable<String, Object>()); + data.put("name", key); + continue; + } + if (key.startsWith("loop_")) { + getCifLoopData(); + continue; + } + if (key.indexOf("_") != 0) { + System.out.println("CIF ERROR ? should be an underscore: " + key); + } else { + String value = getNextToken(); + if (value == null) { + System.out.println("CIF ERROR ? end of file; data missing: " + key); + } else { + data.put(key, value); + } + } + } + } catch (Exception e) { + // ? + } + try { + if (br != null) + br.close(); + } catch (Exception e) { + // ? + } + return allData; + } + + @Override + public String readLine() { + try { + line = (reader != null ? reader.readNextLine() : br.readLine()); + if (line == null) + return null; + if (isHeader) { + if (line.startsWith("#")) + fileHeader.append(line).appendC('\n'); + else + isHeader = false; + } + return line; + } catch (Exception e) { + return null; + } + } + + /** + * general reader for loop data + * fills loopData with fieldCount fields + * + * @return false if EOF + * @throws Exception + */ + @Override + public boolean getData() throws Exception { + // line is already present, and we leave with the next line to parse + for (int i = 0; i < fieldCount; ++i) + if ((loopData[i] = getNextDataToken()) == null) + return false; + return true; + } + + /** + * + * @return the next token of any kind, or null + * @throws Exception + */ + @Override + public String getNextToken() throws Exception { + while (!hasMoreTokens()) + if (setStringNextLine() == null) + return null; + return nextToken(); + } + + /** + * sets a string to be parsed from the beginning + * + * @param str + */ + private void setString(String str) { + this.str = line = str; + cch = (str == null ? 0 : str.length()); + ich = 0; + } + + /* + * http://www.iucr.org/resources/cif/spec/version1.1/cifsyntax + * + * 17. The special sequence of end-of-line followed + * immediately by a semicolon in column one (denoted "<eol>;") + * may also be used as a delimiter at the beginning and end + * of a character string comprising a data value. The complete + * bounded string is called a text field, and may be used to + * convey multi-line values. The end-of-line associated with + * the closing semicolon does not form part of the data value. + * Within a multi-line text field, leading white space within + * text lines must be retained as part of the data value; trailing + * white space on a line may however be elided. + * + * 18. A text field delimited by the <eol>; digraph may not + * include a semicolon at the start of a line of text as + * part of its value. + * + * 20. For example, the data value foo may be expressed + * equivalently as an unquoted string foo, as a quoted + * string 'foo' or as a text field + * + *;foo + *; + * + * By contrast the value of the text field + * + *; foo + * bar + *; + * + * is foo<eol> bar (where <eol> represents an end-of-line); + * the embedded space characters are significant. + * + * + * I (BH) note, however, that we sometimes have: + * + * _some_name + * ; + * the name here + * ; + * + * so this should actually be + * + * ;the name here + * ; + * + * for this, we use fullTrim(); + * + */ + + /** + * + * sets the string for parsing to be from the next line + * when the token buffer is empty, and if ';' is at the + * beginning of that line, extends the string to include + * that full multiline string. Uses \1 to indicate that + * this is a special quotation. + * + * @return the next line or null if EOF + * @throws Exception + */ + private String setStringNextLine() throws Exception { + setString(readLine()); + if (line == null || line.length() == 0) + return line; + if (line.charAt(0) != ';') { + if (str.startsWith("###non-st#")) + ich = 10; + return line; + } + ich = 1; + String str = '\1' + line.substring(1) + '\n'; + while (readLine() != null) { + if (line.startsWith(";")) { + // remove trailing <eol> only, and attach rest of next line + str = str.substring(0, str.length() - 1) + + '\1' + line.substring(1); + break; + } + str += line + '\n'; + } + setString(str); + return str; + } + + /** + * @return TRUE if there are more tokens in the line buffer + * + */ + private boolean hasMoreTokens() { + if (str == null) + return false; + char ch = '#'; + while (ich < cch && ((ch = str.charAt(ich)) == ' ' || ch == '\t')) + ++ich; + return (ich < cch && ch != '#'); + } + + /** + * assume that hasMoreTokens() has been called and that + * ich is pointing at a non-white character. Also sets + * boolean wasUnQuoted, because we need to know if we should + * be checking for a control keyword. 'loop_' is different from just + * loop_ without the quotes. + * + * @return null if no more tokens, "\0" if '.' or '?', or next token + */ + private String nextToken() { + if (ich == cch) + return null; + int ichStart = ich; + char ch = str.charAt(ichStart); + if (ch != '\'' && ch != '"' && ch != '\1') { + wasUnQuoted = true; + while (ich < cch && (ch = str.charAt(ich)) != ' ' && ch != '\t') + ++ich; + if (ich == ichStart + 1) + if (str.charAt(ichStart) == '.' || str.charAt(ichStart) == '?') + return "\0"; + String s = str.substring(ichStart, ich); + return s; + } + wasUnQuoted = false; + char chOpeningQuote = ch; + boolean previousCharacterWasQuote = false; + while (++ich < cch) { + ch = str.charAt(ich); + if (previousCharacterWasQuote && (ch == ' ' || ch == '\t')) + break; + previousCharacterWasQuote = (ch == chOpeningQuote); + } + if (ich == cch) { + if (previousCharacterWasQuote) // close quote was last char of string + return str.substring(ichStart + 1, ich - 1); + // reached the end of the string without finding closing ' + return str.substring(ichStart, ich); + } + ++ich; // throw away the last white character + return str.substring(ichStart + 1, ich - 2); + } + + /** + * + * first checks to see if the next token is an unquoted + * control code, and if so, returns null + * + * @return next data token or null + * @throws Exception + */ + @Override + public String getNextDataToken() throws Exception { + String str = peekToken(); + if (str == null) + return null; + if (wasUnQuoted) + if (str.charAt(0) == '_' || str.startsWith("loop_") + || str.startsWith("data_") + || str.startsWith("stop_") + || str.startsWith("global_")) + return null; + return getTokenPeeked(); + } + + /** + * just look at the next token. Saves it for retrieval + * using getTokenPeeked() + * + * @return next token or null if EOF + * @throws Exception + */ + @Override + public String peekToken() throws Exception { + while (!hasMoreTokens()) + if (setStringNextLine() == null) + return null; + int ich = this.ich; + strPeeked = nextToken(); + ichPeeked= this.ich; + this.ich = ich; + return strPeeked; + } + + /** + * + * @return the token last acquired; may be null + */ + @Override + public String getTokenPeeked() { + ich = ichPeeked; + return strPeeked; + } + + /** + * specially for names that might be multiline + * + * @param str + * @return str without any leading/trailing white space, and no '\n' + */ + @Override + public String fullTrim(String str) { + int pt0 = 0; + int pt1 = str.length(); + for (;pt0 < pt1; pt0++) + if ("\n\t ".indexOf(str.charAt(pt0)) < 0) + break; + for (;pt0 < pt1; pt1--) + if ("\n\t ".indexOf(str.charAt(pt1 - 1)) < 0) + break; + return str.substring(pt0, pt1); + } + + Map<String, Object> data; + Map<String, Object> allData; + @SuppressWarnings("unchecked") + private void getCifLoopData() throws Exception { + String str; + List<String> keyWords = new List<String>(); + while ((str = peekToken()) != null && str.charAt(0) == '_') { + str = getTokenPeeked(); + keyWords.addLast(str); + data.put(str, new List<String>()); + } + fieldCount = keyWords.size(); + if (fieldCount == 0) + return; + loopData = new String[fieldCount]; + while (getData()) { + for (int i = 0; i < fieldCount; i++) { + ((List<String>)data.get(keyWords.get(i))).addLast(loopData[i]); + } + } + } + + private final static String grABC = + "ABX\u0394E\u03A6\u0393H" // ABCDEFGH + + "I_K\u039BMNO\u03A0" // I_KLMNOP + + "\u0398P\u03A3TY_\u03A9\u039E\u03A5Z"; // QRSTU_WXYZ + private final static String grabc = + "\u03B1\u03B2\u03C7\u03A4\u03A5\u03C6\u03B3\u03B7" // abcdefgh + + "\u03B9_\u03BA\u03BB\u03BC\u03BD\u03BF\u03C0" // i_klmnop + + "\u03B8\u03C1\u03C3\u03C4\u03C5_\u03C9\u03BE\u03C5\u03B6"; // qrstu_wxyz + + /** + * Only translating the basic Greek set here, not all the other stuff. See + * http://www.iucr.org/resources/cif/spec/version1.1/semantics#markup + * + * @param data + * @return cleaned string + */ + @Override + public String toUnicode(String data) { + int pt; + try { + while ((pt = data.indexOf('\\')) >= 0) { + int c = data.charAt(pt + 1); + String ch = (c >= 65 && c <= 90 ? grABC.substring(c - 65, c - 64) + : c >= 97 && c <= 122 ? grabc.substring(c - 97, c - 96) : "_"); + data = data.substring(0, pt) + ch + data.substring(pt + 2); + } + } catch (Exception e) { + // ignore + } + + return data; + } + + @Override + public String getLoopData(int i) { + return loopData[i]; + } + + private static Map<String, Integer> htFields = new Hashtable<String, Integer>(); + + String[] fields; + + @Override + public int parseLoopParameters(String[] fields, int[] fieldOf, int[] propertyOf) throws Exception { + int propertyCount = 0; + if (fields == null) { + // for reading full list of keys, as for matrices + this.fields = new String[100]; + } else { + if (!htFields.containsKey(fields[0])) + for (int i = fields.length; --i >= 0;) + htFields.put(fields[i], Integer.valueOf(i)); + for (int i = fields.length; --i >= 0;) + fieldOf[i] = NONE; + propertyCount = fields.length; + } + fieldCount = 0; + while (true) { + String str = peekToken(); + if (str == null) { + fieldCount = 0; + break; + } + if (str.charAt(0) != '_') + break; + int pt = fieldCount++; + str = fixKey(getTokenPeeked()); + if (fields == null) { + this.fields[propertyOf[pt] = pt] = str; + fieldOf[pt] = pt; + continue; + } + Integer iField = htFields.get(str); + int i = (iField == null ? NONE : iField.intValue()); + if ((propertyOf[pt] = i) != NONE) + fieldOf[i] = pt; + } + if (fieldCount > 0) + loopData = new String[fieldCount]; + return propertyCount; + } + + private String fixKey(String key) { + return PT.rep(key, ".", "_").toLowerCase(); + } + + @Override + public int getFieldCount() { + return fieldCount; + } + + @Override + public String getField(int i) { + return fields[i]; + } + +} \ No newline at end of file Copied: trunk/Jmol/src/javajs/util/GenericLineReader.java (from rev 19475, trunk/Jmol/src/org/jmol/api/JmolLineReader.java) =================================================================== --- trunk/Jmol/src/javajs/util/GenericLineReader.java (rev 0) +++ trunk/Jmol/src/javajs/util/GenericLineReader.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -0,0 +1,5 @@ +package javajs.util; + +public interface GenericLineReader { + public String readNextLine() throws Exception; +} Copied: trunk/Jmol/src/javajs/util/LimitedLineReader.java (from rev 19475, trunk/Jmol/src/org/jmol/io/LimitedLineReader.java) =================================================================== --- trunk/Jmol/src/javajs/util/LimitedLineReader.java (rev 0) +++ trunk/Jmol/src/javajs/util/LimitedLineReader.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -0,0 +1,40 @@ +package javajs.util; + +import java.io.BufferedReader; + +public class LimitedLineReader { + private char[] buf; + private int cchBuf; + private int ichCurrent; + + public LimitedLineReader(BufferedReader bufferedReader, int readLimit) + throws Exception { + bufferedReader.mark(readLimit + 1); + buf = new char[readLimit]; + cchBuf = Math.max(bufferedReader.read(buf, 0, readLimit), 0); + ichCurrent = 0; + bufferedReader.reset(); + } + + public String getHeader(int n) { + return (n == 0 ? new String(buf) : new String(buf, 0, Math.min(cchBuf, n))); + } + + public String readLineWithNewline() { + while (ichCurrent < cchBuf) { + int ichBeginningOfLine = ichCurrent; + char ch = 0; + while (ichCurrent < cchBuf && + (ch = buf[ichCurrent++]) != '\r' && ch != '\n') { + } + if (ch == '\r' && ichCurrent < cchBuf && buf[ichCurrent] == '\n') + ++ichCurrent; + int cchLine = ichCurrent - ichBeginningOfLine; + if (buf[ichBeginningOfLine] == '#') + continue; // flush comment lines; + return new String(buf, ichBeginningOfLine, cchLine); + } + return ""; + } +} + Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2014-03-20 23:04:15 UTC (rev 19486) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -28,12 +28,12 @@ import org.jmol.adapter.smarter.AtomSetCollectionReader; import org.jmol.api.Interface; import org.jmol.api.JmolAdapter; -import org.jmol.api.JmolLineReader; import org.jmol.api.SymmetryInterface; -import org.jmol.io.CifDataReader; import org.jmol.java.BS; import org.jmol.script.T; + +import javajs.api.GenericCifDataReader; import javajs.util.List; import java.util.Hashtable; import java.util.Map; @@ -41,6 +41,8 @@ import org.jmol.util.Logger; import javajs.util.Binary; +import javajs.util.CifDataReader; +import javajs.util.GenericLineReader; import javajs.util.P3; import javajs.util.PT; import javajs.util.V3; @@ -67,12 +69,12 @@ * */ public class CifReader extends AtomSetCollectionReader implements - JmolLineReader { + GenericLineReader { private MSCifInterface mr; private MMCifInterface pr; - CifDataReader tokenizer = new CifDataReader(this); + GenericCifDataReader tokenizer = new CifDataReader().set(this, null); private boolean isMolecular; private boolean filterAssembly; @@ -150,7 +152,7 @@ if (!readAllData()) break; if (appendedData != null) { - tokenizer = new CifDataReader(Binary.getBR(appendedData)); + tokenizer = Binary.getCifReader().set(null, Binary.getBR(appendedData)); while ((key = tokenizer.peekToken()) != null) if (!readAllData()) break; @@ -601,19 +603,16 @@ } private int fieldProperty(int i) { - return ((field = tokenizer.loopData[i]).length() > 0 + return ((field = tokenizer.getLoopData(i)).length() > 0 && (firstChar = field.charAt(0)) != '\0' ? propertyOf[i] : NONE); } + int[] propertyOf = new int[100]; // should be enough + int[] fieldOf = new int[100]; String field; private char firstChar = '\0'; - int[] propertyOf = new int[100]; // should be enough - int[] fieldOf = new int[100]; - String[] fields; private int propertyCount; - private static Map<String, Integer> htFields = new Hashtable<String, Integer>(); - /** * sets up arrays and variables for tokenizer.getData() * @@ -621,42 +620,9 @@ * @throws Exception */ void parseLoopParameters(String[] fields) throws Exception { - if (fields == null) { - // for reading full list of keys, as for matrices - this.fields = new String[100]; - } else { - if (!htFields.containsKey(fields[0])) - for (int i = fields.length; --i >= 0;) - htFields.put(fields[i], Integer.valueOf(i)); - for (int i = fields.length; --i >= 0;) - fieldOf[i] = NONE; - propertyCount = fields.length; - } - tokenizer.fieldCount = 0; - while (true) { - String str = tokenizer.peekToken(); - if (str == null) { - tokenizer.fieldCount = 0; - break; - } - if (str.charAt(0) != '_') - break; - int pt = tokenizer.fieldCount++; - str = fixKey(tokenizer.getTokenPeeked()); - if (fields == null) { - this.fields[propertyOf[pt] = pt] = str; - fieldOf[pt] = pt; - continue; - } - Integer iField = htFields.get(str); - int i = (iField == null ? NONE : iField.intValue()); - if ((propertyOf[pt] = i) != NONE) - fieldOf[i] = pt; - } - if (tokenizer.fieldCount > 0) - tokenizer.loopData = new String[tokenizer.fieldCount]; + propertyCount = tokenizer.parseLoopParameters(fields, fieldOf, propertyOf); } - + /** * * used for turning off fractional or nonfractional coord. @@ -718,7 +684,8 @@ while (tokenizer.getData()) { String atomTypeSymbol = null; float oxidationNumber = Float.NaN; - for (int i = 0; i < tokenizer.fieldCount; ++i) { + int n = tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) { switch (fieldProperty(i)) { case NONE: break; @@ -899,7 +866,8 @@ assemblyId = null; if (isPDBX) { if (modelField == -1) { - for (int i = 0; i < tokenizer.fieldCount; ++i) + int n = tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) if (fieldProperty(i) == MODEL_NO) { modelField = i; isPDB = true; @@ -928,7 +896,8 @@ continue; } } - for (int i = 0; i < tokenizer.fieldCount; ++i) { + int n = tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) { int tok = fieldProperty(i); switch (tok) { case NONE: @@ -1053,7 +1022,7 @@ if (field.equalsIgnoreCase("Uiso")) { int j = fieldOf[U_ISO_OR_EQUIV]; if (j != NONE) - setU(atom, 7, parseFloatStr(tokenizer.loopData[j])); + setU(atom, 7, parseFloatStr(tokenizer.getLoopData(j))); } break; case ANISO_LABEL: @@ -1180,7 +1149,8 @@ float[] m = new float[16]; m[15] = 1; while (tokenizer.getData()) { - for (int i = 0; i < tokenizer.fieldCount; ++i) { + int n = tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) { switch (fieldProperty(i)) { case CITATION_ID: break; @@ -1227,7 +1197,8 @@ int n = 0; while (tokenizer.getData()) { boolean ssgop = false; - for (int i = 0; i < tokenizer.fieldCount; ++i) { + int nn = tokenizer.getFieldCount(); + for (int i = 0; i < nn; ++i) { switch (fieldProperty(i)) { case SYM_SSG_XYZ: // check for non-standard record x~1~,x~2~,x~3~,x~4~ kIsfCqpM.cif @@ -1310,7 +1281,8 @@ float distance = 0; float dx = 0; //String siteSym2 = null; - for (int i = 0; i < tokenizer.fieldCount; ++i) { + int nn = tokenizer.getFieldCount(); + for (int i = 0; i < nn; ++i) { switch (fieldProperty(i)) { case NONE: break; Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java 2014-03-20 23:04:15 UTC (rev 19486) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -225,7 +225,8 @@ assem = new String[3]; int count = 0; int p; - for (int i = 0; i < cr.tokenizer.fieldCount; ++i) { + int n = cr.tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) { switch (p = fieldProperty(i)) { case ASSEM_ID: case ASSEM_OPERS: @@ -310,7 +311,8 @@ int count = 0; String id = null; String xyz = null; - for (int i = 0; i < cr.tokenizer.fieldCount; ++i) { + int n = cr.tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) { int p = fieldProperty(i); switch (p) { case NONE : @@ -396,7 +398,8 @@ while (cr.tokenizer.getData()) { String groupName = null; String hetName = null; - for (int i = 0; i < cr.tokenizer.fieldCount; ++i) { + int n = cr.tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) { switch (fieldProperty(i)) { case NONE: break; @@ -427,7 +430,8 @@ while (cr.tokenizer.getData()) { String groupName = null; String hetName = null; - for (int i = 0; i < cr.tokenizer.fieldCount; ++i) { + int n = cr.tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) { switch (fieldProperty(i)) { case NONE: case NONPOLY_ENTITY_ID: @@ -508,7 +512,8 @@ } while (cr.tokenizer.getData()) { Structure structure = new Structure(-1, EnumStructure.HELIX, EnumStructure.HELIX, null, 0, 0); - for (int i = 0; i < cr.tokenizer.fieldCount; ++i) { + int n = cr.tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) { switch (fieldProperty(i)) { case NONE: break; @@ -587,7 +592,8 @@ } while (cr.tokenizer.getData()) { Structure structure = new Structure(-1, EnumStructure.SHEET, EnumStructure.SHEET, null, 0, 0); - for (int i = 0; i < cr.tokenizer.fieldCount; ++i) { + int n = cr.tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) { switch (fieldProperty(i)) { case BEG_ASYM_ID: structure.startChainID = cr.vwr.getChainID(field); @@ -687,7 +693,8 @@ Map<String, Object> htSite = null; htSites = new Hashtable<String, Map<String, Object>>(); while (cr.tokenizer.getData()) { - for (int i = 0; i < cr.tokenizer.fieldCount; ++i) { + int n = cr.tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) { switch (fieldProperty(i)) { case SITE_ID: if (group != "") { @@ -738,7 +745,7 @@ } private int fieldProperty(int i) { - return ((field = cr.tokenizer.loopData[i]).length() > 0 + return ((field = cr.tokenizer.getLoopData(i)).length() > 0 && (firstChar = field.charAt(0)) != '\0' ? cr.propertyOf[i] : NONE); } @@ -854,7 +861,8 @@ int atomIndex2 = -1; order = 0; isAromatic = false; - for (int i = 0; i < cr.tokenizer.fieldCount; ++i) { + int n = cr.tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) { switch (fieldProperty(i)) { case CHEM_COMP_BOND_ATOM_ID_1: atomIndex1 = cr.atomSetCollection.getAtomIndexFromName(field); Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/MSCifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/MSCifReader.java 2014-03-20 23:04:15 UTC (rev 19486) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/MSCifReader.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -227,7 +227,8 @@ double c = Double.NaN; double w = Double.NaN; String fid = null; - for (int i = 0; i < cr.tokenizer.fieldCount; ++i) { + int n = cr.tokenizer.getFieldCount(); + for (int i = 0; i < n; ++i) { switch (tok = fieldProperty(cr, i)) { case FD_ID: case FO_ID: @@ -435,9 +436,10 @@ double[][] a = m.getArray(); String key; int p; - for (; i < cr.tokenizer.fieldCount; ++i) { + int n = cr.tokenizer.getFieldCount(); + for (; i < n; ++i) { if ((p = fieldProperty(cr, i)) < 0 - || !(key = cr.fields[p]).contains("_w_")) + || !(key = cr.tokenizer.getField(p)).contains("_w_")) continue; String[] tokens = PT.split(key, "_"); int r = cr.parseIntStr(tokens[tokens.length - 2]) - 1; @@ -448,7 +450,7 @@ } private int fieldProperty(CifReader cr, int i) { - return ((field = cr.tokenizer.loopData[i]).length() > 0 + return ((field = cr.tokenizer.getLoopData(i)).length() > 0 && field.charAt(0) != '\0' ? cr.propertyOf[i] : NONE); } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2014-03-20 23:04:15 UTC (rev 19486) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -29,12 +29,12 @@ import java.util.StringTokenizer; import javajs.api.GenericBinaryDocument; +import javajs.util.LimitedLineReader; import javajs.util.PT; import org.jmol.api.Interface; import org.jmol.api.JmolAdapter; -import org.jmol.io.LimitedLineReader; import org.jmol.util.Logger; Deleted: trunk/Jmol/src/org/jmol/api/JmolLineReader.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolLineReader.java 2014-03-20 23:04:15 UTC (rev 19486) +++ trunk/Jmol/src/org/jmol/api/JmolLineReader.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -1,5 +0,0 @@ -package org.jmol.api; - -public interface JmolLineReader { - public String readNextLine() throws Exception; -} Deleted: trunk/Jmol/src/org/jmol/io/CifDataReader.java =================================================================== --- trunk/Jmol/src/org/jmol/io/CifDataReader.java 2014-03-20 23:04:15 UTC (rev 19486) +++ trunk/Jmol/src/org/jmol/io/CifDataReader.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -1,472 +0,0 @@ -package org.jmol.io; - -import java.io.BufferedReader; -import javajs.util.List; -import javajs.util.SB; - -import java.util.Hashtable; - -import java.util.Map; - -import org.jmol.api.JmolLineReader; -import org.jmol.util.Logger; - - -public class CifDataReader { - /** - * - * A special tokenizer class for dealing with quoted strings in CIF files. - * - * Greek letters implemented in Jmol 13.3.9 and only for - * titles and space groups. All other mark ups ignored. - * - *<p> - * regarding the treatment of single quotes vs. primes in - * cif file, PMR wrote: - *</p> - *<p> - * * There is a formal grammar for CIF - * (see http://www.iucr.org/iucr-top/cif/index.html) - * which confirms this. The textual explanation is - *<p /> - *<p> - * 14. Matching single or double quote characters (' or ") may - * be used to bound a string representing a non-simple data value - * provided the string does not extend over more than one line. - *<p /> - *<p> - * 15. Because data values are invariably separated from other - * tokens in the file by white space, such a quote-delimited - * character string may contain instances of the character used - * to delimit the string provided they are not followed by white - * space. For example, the data item - *<code> - * _example 'a dog's life' - *</code> - * is legal; the data value is a dog's life. - *</p> - *<p> - * [PMR - the terminating character(s) are quote+whitespace. - * That would mean that: - *<code> - * _example 'Jones' life' - *</code> - * would be an error - *</p> - *<p> - * The CIF format was developed in that late 1980's under the aegis of the - * International Union of Crystallography (I am a consultant to the COMCIFs - * committee). It was ratified by the Union and there have been several - * workshops. mmCIF is an extension of CIF which includes a relational - * structure. The formal publications are: - *</p> - *<p> - * Hall, S. R. (1991). "The STAR File: A New Format for Electronic Data - * Transfer and Archiving", J. Chem. Inform. Comp. Sci., 31, 326-333. - * Hall, S. R., Allen, F. H. and Brown, I. D. (1991). "The Crystallographic - * Information File (CIF): A New Standard Archive File for Crystallography", - * Acta Cryst., A47, 655-685. - * Hall, S.R. & Spadaccini, N. (1994). "The STAR File: Detailed - * Specifications," J. Chem. Info. Comp. Sci., 34, 505-508. - *</p> - */ - private JmolLineReader reader; - private BufferedReader br; - - private String line; - public String str; - public int ich; - public int cch; - public boolean wasUnQuoted; - public String strPeeked; - public int ichPeeked; - public int fieldCount; - public String[] loopData; - public SB fileHeader = new SB(); - private boolean isHeader = true; - - //////////////////////////////////////////////////////////////// - // special tokenizer class - //////////////////////////////////////////////////////////////// - - - public CifDataReader(JmolLineReader reader) { - this.reader = reader; - } - - public CifDataReader(BufferedReader br) { - this.br = br; - } - - public String getFileHeader() { - return fileHeader.toString(); - } - - public static Map<String, Object> readCifData(BufferedReader br) { - CifDataReader cdr = new CifDataReader(br); - return cdr.getAllCifData(); - } - - - /** - * reads all Cif Data for a reader defined in the constructor - * - * @return Hashtable of models Vector of Hashtable data - */ - private Map<String, Object> getAllCifData() { - line = ""; - String key; - allData = new Hashtable<String, Object>(); - List<Map<String, Object>> models = new List<Map<String,Object>>(); - allData.put("models", models); - try { - while ((key = getNextToken()) != null) { - if (key.startsWith("global_") || key.startsWith("data_")) { - models.addLast(data = new Hashtable<String, Object>()); - data.put("name", key); - continue; - } - if (key.startsWith("loop_")) { - getCifLoopData(); - continue; - } - if (key.indexOf("_") != 0) { - Logger.warn("CIF ERROR ? should be an underscore: " + key); - } else { - String value = getNextToken(); - if (value == null) { - Logger.warn("CIF ERROR ? end of file; data missing: " + key); - } else { - data.put(key, value); - } - } - } - } catch (Exception e) { - // ? - } - try { - if (br != null) - br.close(); - } catch (Exception e) { - // ? - } - return allData; - } - - public String readLine() { - try { - line = (reader != null ? reader.readNextLine() : br.readLine()); - if (line == null) - return null; - if (isHeader) { - if (line.startsWith("#")) - fileHeader.append(line).appendC('\n'); - else - isHeader = false; - } - return line; - } catch (Exception e) { - return null; - } - } - - /** - * general reader for loop data - * fills loopData with fieldCount fields - * - * @return false if EOF - * @throws Exception - */ - public boolean getData() throws Exception { - // line is already present, and we leave with the next line to parse - for (int i = 0; i < fieldCount; ++i) - if ((loopData[i] = getNextDataToken()) == null) - return false; - return true; - } - - /** - * - * @return the next token of any kind, or null - * @throws Exception - */ - public String getNextToken() throws Exception { - while (!hasMoreTokens()) - if (setStringNextLine() == null) - return null; - return nextToken(); - } - - /** - * sets a string to be parsed from the beginning - * - * @param str - */ - private void setString(String str) { - this.str = line = str; - cch = (str == null ? 0 : str.length()); - ich = 0; - } - - /* - * http://www.iucr.org/resources/cif/spec/version1.1/cifsyntax - * - * 17. The special sequence of end-of-line followed - * immediately by a semicolon in column one (denoted "<eol>;") - * may also be used as a delimiter at the beginning and end - * of a character string comprising a data value. The complete - * bounded string is called a text field, and may be used to - * convey multi-line values. The end-of-line associated with - * the closing semicolon does not form part of the data value. - * Within a multi-line text field, leading white space within - * text lines must be retained as part of the data value; trailing - * white space on a line may however be elided. - * - * 18. A text field delimited by the <eol>; digraph may not - * include a semicolon at the start of a line of text as - * part of its value. - * - * 20. For example, the data value foo may be expressed - * equivalently as an unquoted string foo, as a quoted - * string 'foo' or as a text field - * - *;foo - *; - * - * By contrast the value of the text field - * - *; foo - * bar - *; - * - * is foo<eol> bar (where <eol> represents an end-of-line); - * the embedded space characters are significant. - * - * - * I (BH) note, however, that we sometimes have: - * - * _some_name - * ; - * the name here - * ; - * - * so this should actually be - * - * ;the name here - * ; - * - * for this, we use fullTrim(); - * - */ - - /** - * - * sets the string for parsing to be from the next line - * when the token buffer is empty, and if ';' is at the - * beginning of that line, extends the string to include - * that full multiline string. Uses \1 to indicate that - * this is a special quotation. - * - * @return the next line or null if EOF - * @throws Exception - */ - private String setStringNextLine() throws Exception { - setString(readLine()); - if (line == null || line.length() == 0) - return line; - if (line.charAt(0) != ';') { - if (str.startsWith("###non-st#")) - ich = 10; - return line; - } - ich = 1; - String str = '\1' + line.substring(1) + '\n'; - while (readLine() != null) { - if (line.startsWith(";")) { - // remove trailing <eol> only, and attach rest of next line - str = str.substring(0, str.length() - 1) - + '\1' + line.substring(1); - break; - } - str += line + '\n'; - } - setString(str); - return str; - } - - /** - * @return TRUE if there are more tokens in the line buffer - * - */ - private boolean hasMoreTokens() { - if (str == null) - return false; - char ch = '#'; - while (ich < cch && ((ch = str.charAt(ich)) == ' ' || ch == '\t')) - ++ich; - return (ich < cch && ch != '#'); - } - - /** - * assume that hasMoreTokens() has been called and that - * ich is pointing at a non-white character. Also sets - * boolean wasUnQuoted, because we need to know if we should - * be checking for a control keyword. 'loop_' is different from just - * loop_ without the quotes. - * - * @return null if no more tokens, "\0" if '.' or '?', or next token - */ - private String nextToken() { - if (ich == cch) - return null; - int ichStart = ich; - char ch = str.charAt(ichStart); - if (ch != '\'' && ch != '"' && ch != '\1') { - wasUnQuoted = true; - while (ich < cch && (ch = str.charAt(ich)) != ' ' && ch != '\t') - ++ich; - if (ich == ichStart + 1) - if (str.charAt(ichStart) == '.' || str.charAt(ichStart) == '?') - return "\0"; - String s = str.substring(ichStart, ich); - return s; - } - wasUnQuoted = false; - char chOpeningQuote = ch; - boolean previousCharacterWasQuote = false; - while (++ich < cch) { - ch = str.charAt(ich); - if (previousCharacterWasQuote && (ch == ' ' || ch == '\t')) - break; - previousCharacterWasQuote = (ch == chOpeningQuote); - } - if (ich == cch) { - if (previousCharacterWasQuote) // close quote was last char of string - return str.substring(ichStart + 1, ich - 1); - // reached the end of the string without finding closing ' - return str.substring(ichStart, ich); - } - ++ich; // throw away the last white character - return str.substring(ichStart + 1, ich - 2); - } - - /** - * - * first checks to see if the next token is an unquoted - * control code, and if so, returns null - * - * @return next data token or null - * @throws Exception - */ - public String getNextDataToken() throws Exception { - String str = peekToken(); - if (str == null) - return null; - if (wasUnQuoted) - if (str.charAt(0) == '_' || str.startsWith("loop_") - || str.startsWith("data_") - || str.startsWith("stop_") - || str.startsWith("global_")) - return null; - return getTokenPeeked(); - } - - /** - * just look at the next token. Saves it for retrieval - * using getTokenPeeked() - * - * @return next token or null if EOF - * @throws Exception - */ - public String peekToken() throws Exception { - while (!hasMoreTokens()) - if (setStringNextLine() == null) - return null; - int ich = this.ich; - strPeeked = nextToken(); - ichPeeked= this.ich; - this.ich = ich; - return strPeeked; - } - - /** - * - * @return the token last acquired; may be null - */ - public String getTokenPeeked() { - ich = ichPeeked; - return strPeeked; - } - - /** - * specially for names that might be multiline - * - * @param str - * @return str without any leading/trailing white space, and no '\n' - */ - public String fullTrim(String str) { - int pt0 = 0; - int pt1 = str.length(); - for (;pt0 < pt1; pt0++) - if ("\n\t ".indexOf(str.charAt(pt0)) < 0) - break; - for (;pt0 < pt1; pt1--) - if ("\n\t ".indexOf(str.charAt(pt1 - 1)) < 0) - break; - return str.substring(pt0, pt1); - } - - Map<String, Object> data; - Map<String, Object> allData; - @SuppressWarnings("unchecked") - private void getCifLoopData() throws Exception { - String str; - List<String> keyWords = new List<String>(); - while ((str = peekToken()) != null && str.charAt(0) == '_') { - str = getTokenPeeked(); - keyWords.addLast(str); - data.put(str, new List<String>()); - } - fieldCount = keyWords.size(); - if (fieldCount == 0) - return; - loopData = new String[fieldCount]; - while (getData()) { - for (int i = 0; i < fieldCount; i++) { - ((List<String>)data.get(keyWords.get(i))).addLast(loopData[i]); - } - } - } - - private final static String grABC = - "ABX\u0394E\u03A6\u0393H" // ABCDEFGH - + "I_K\u039BMNO\u03A0" // I_KLMNOP - + "\u0398P\u03A3TY_\u03A9\u039E\u03A5Z"; // QRSTU_WXYZ - private final static String grabc = - "\u03B1\u03B2\u03C7\u03A4\u03A5\u03C6\u03B3\u03B7" // abcdefgh - + "\u03B9_\u03BA\u03BB\u03BC\u03BD\u03BF\u03C0" // i_klmnop - + "\u03B8\u03C1\u03C3\u03C4\u03C5_\u03C9\u03BE\u03C5\u03B6"; // qrstu_wxyz - - /** - * Only translating the basic Greek set here, not all the other stuff. See - * http://www.iucr.org/resources/cif/spec/version1.1/semantics#markup - * - * @param data - * @return cleaned string - */ - public String toUnicode(String data) { - int pt; - try { - while ((pt = data.indexOf('\\')) >= 0) { - int c = data.charAt(pt + 1); - String ch = (c >= 65 && c <= 90 ? grABC.substring(c - 65, c - 64) - : c >= 97 && c <= 122 ? grabc.substring(c - 97, c - 96) : "_"); - data = data.substring(0, pt) + ch + data.substring(pt + 2); - } - } catch (Exception e) { - // ignore - } - - return data; - } -} \ No newline at end of file Modified: trunk/Jmol/src/org/jmol/io/JmolBinary.java =================================================================== --- trunk/Jmol/src/org/jmol/io/JmolBinary.java 2014-03-20 23:04:15 UTC (rev 19486) +++ trunk/Jmol/src/org/jmol/io/JmolBinary.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -36,6 +36,7 @@ import org.jmol.api.JmolAdapter; import javajs.util.Binary; +import javajs.util.LimitedLineReader; import javajs.util.List; import javajs.util.PT; Deleted: trunk/Jmol/src/org/jmol/io/LimitedLineReader.java =================================================================== --- trunk/Jmol/src/org/jmol/io/LimitedLineReader.java 2014-03-20 23:04:15 UTC (rev 19486) +++ trunk/Jmol/src/org/jmol/io/LimitedLineReader.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -1,40 +0,0 @@ -package org.jmol.io; - -import java.io.BufferedReader; - -public class LimitedLineReader { - private char[] buf; - private int cchBuf; - private int ichCurrent; - - public LimitedLineReader(BufferedReader bufferedReader, int readLimit) - throws Exception { - bufferedReader.mark(readLimit + 1); - buf = new char[readLimit]; - cchBuf = Math.max(bufferedReader.read(buf, 0, readLimit), 0); - ichCurrent = 0; - bufferedReader.reset(); - } - - public String getHeader(int n) { - return (n == 0 ? new String(buf) : new String(buf, 0, Math.min(cchBuf, n))); - } - - public String readLineWithNewline() { - while (ichCurrent < cchBuf) { - int ichBeginningOfLine = ichCurrent; - char ch = 0; - while (ichCurrent < cchBuf && - (ch = buf[ichCurrent++]) != '\r' && ch != '\n') { - } - if (ch == '\r' && ichCurrent < cchBuf && buf[ichCurrent] == '\n') - ++ichCurrent; - int cchLine = ichCurrent - ichBeginningOfLine; - if (buf[ichBeginningOfLine] == '#') - continue; // flush comment lines; - return new String(buf, ichBeginningOfLine, cchLine); - } - return ""; - } -} - Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-03-20 23:04:15 UTC (rev 19486) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-03-20 23:59:06 UTC (rev 19487) @@ -31,7 +31,6 @@ import org.jmol.shape.Shape; import org.jmol.thread.TimeoutThread; import org.jmol.i18n.GT; -import org.jmol.io.CifDataReader; import org.jmol.java.BS; import org.jmol.modelset.Atom; import org.jmol.modelset.AtomCollection; @@ -3632,10 +3631,7 @@ public Map<String, Object> getCifData(int modelIndex) { String name = getModelFileName(modelIndex); String data = getFileAsString(name, false); - if (data == null) - return null; - return CifDataReader - .readCifData(Binary.getBR(data)); + return (data == null ? null : Binary.readCifData(Binary.getBR(data))); } public String getPDBHeader() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-03-21 06:13:24
|
Revision: 19489 http://sourceforge.net/p/jmol/code/19489 Author: hansonr Date: 2014-03-21 06:13:19 +0000 (Fri, 21 Mar 2014) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/javajs/api/GenericCifDataParser.java trunk/Jmol/src/javajs/util/CifDataParser.java trunk/Jmol/src/javajs/util/LimitedLineReader.java trunk/Jmol/src/javajs/util/Rdr.java trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java trunk/Jmol/src/org/jmol/io/JmolBinary.java trunk/Jmol/src/org/jmol/io/JmolZipUtilities.java trunk/Jmol/src/org/jmol/io2/JmolUtil.java Added Paths: ----------- trunk/Jmol/src/javajs/api/GenericLineReader.java Removed Paths: ------------- trunk/Jmol/src/javajs/util/GenericLineReader.java Modified: trunk/Jmol/src/javajs/api/GenericCifDataParser.java =================================================================== --- trunk/Jmol/src/javajs/api/GenericCifDataParser.java 2014-03-21 05:40:42 UTC (rev 19488) +++ trunk/Jmol/src/javajs/api/GenericCifDataParser.java 2014-03-21 06:13:19 UTC (rev 19489) @@ -3,8 +3,6 @@ import java.io.BufferedReader; import java.util.Map; -import javajs.util.CifDataParser; -import javajs.util.GenericLineReader; public interface GenericCifDataParser { @@ -36,7 +34,7 @@ String readLine(); - CifDataParser set(GenericLineReader reader, BufferedReader br); + GenericCifDataParser set(GenericLineReader reader, BufferedReader br); String toUnicode(String data); Copied: trunk/Jmol/src/javajs/api/GenericLineReader.java (from rev 19487, trunk/Jmol/src/javajs/util/GenericLineReader.java) =================================================================== --- trunk/Jmol/src/javajs/api/GenericLineReader.java (rev 0) +++ trunk/Jmol/src/javajs/api/GenericLineReader.java 2014-03-21 06:13:19 UTC (rev 19489) @@ -0,0 +1,5 @@ +package javajs.api; + +public interface GenericLineReader { + public String readNextLine() throws Exception; +} Modified: trunk/Jmol/src/javajs/util/CifDataParser.java =================================================================== --- trunk/Jmol/src/javajs/util/CifDataParser.java 2014-03-21 05:40:42 UTC (rev 19488) +++ trunk/Jmol/src/javajs/util/CifDataParser.java 2014-03-21 06:13:19 UTC (rev 19489) @@ -7,6 +7,7 @@ import java.util.Map; import javajs.api.GenericCifDataParser; +import javajs.api.GenericLineReader; Deleted: trunk/Jmol/src/javajs/util/GenericLineReader.java =================================================================== --- trunk/Jmol/src/javajs/util/GenericLineReader.java 2014-03-21 05:40:42 UTC (rev 19488) +++ trunk/Jmol/src/javajs/util/GenericLineReader.java 2014-03-21 06:13:19 UTC (rev 19489) @@ -1,5 +0,0 @@ -package javajs.util; - -public interface GenericLineReader { - public String readNextLine() throws Exception; -} Modified: trunk/Jmol/src/javajs/util/LimitedLineReader.java =================================================================== --- trunk/Jmol/src/javajs/util/LimitedLineReader.java 2014-03-21 05:40:42 UTC (rev 19488) +++ trunk/Jmol/src/javajs/util/LimitedLineReader.java 2014-03-21 06:13:19 UTC (rev 19489) @@ -2,6 +2,14 @@ import java.io.BufferedReader; +/** + * A simple class to read a designated number of bytes from a + * file and then return them line by line, skipping lines that + * start with #, and including the \n or \r characters at line ends. + * + * Generally useful for determining what sort of data a file contains. + * + */ public class LimitedLineReader { private char[] buf; private int cchBuf; Modified: trunk/Jmol/src/javajs/util/Rdr.java =================================================================== --- trunk/Jmol/src/javajs/util/Rdr.java 2014-03-21 05:40:42 UTC (rev 19488) +++ trunk/Jmol/src/javajs/util/Rdr.java 2014-03-21 06:13:19 UTC (rev 19489) @@ -56,12 +56,12 @@ */ public class Rdr { - public static GenericCifDataParser getCifReader() { + public static GenericCifDataParser getCifParser() { return (GenericCifDataParser) Interface.getInterface("javajs.util.CifDataParser"); } public static Map<String, Object> readCifData(BufferedReader br) { - return new CifDataParser().set(null, br).getAllCifData(); + return getCifParser().set(null, br).getAllCifData(); } Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2014-03-21 05:40:42 UTC (rev 19488) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2014-03-21 06:13:19 UTC (rev 19489) @@ -34,6 +34,7 @@ import org.jmol.script.T; import javajs.api.GenericCifDataParser; +import javajs.api.GenericLineReader; import javajs.util.List; import java.util.Hashtable; import java.util.Map; @@ -42,7 +43,6 @@ import javajs.util.Rdr; import javajs.util.CifDataParser; -import javajs.util.GenericLineReader; import javajs.util.P3; import javajs.util.PT; import javajs.util.V3; @@ -74,6 +74,9 @@ private MSCifInterface mr; private MMCifInterface pr; + // no need for reflection here -- the CIF reader is already + // protected by reflection + GenericCifDataParser parser = new CifDataParser().set(this, null); private boolean isMolecular; @@ -152,7 +155,7 @@ if (!readAllData()) break; if (appendedData != null) { - parser = Rdr.getCifReader().set(null, Rdr.getBR(appendedData)); + parser = Rdr.getCifParser().set(null, Rdr.getBR(appendedData)); while ((key = parser.peekToken()) != null) if (!readAllData()) break; Modified: trunk/Jmol/src/org/jmol/io/JmolBinary.java =================================================================== --- trunk/Jmol/src/org/jmol/io/JmolBinary.java 2014-03-21 05:40:42 UTC (rev 19488) +++ trunk/Jmol/src/org/jmol/io/JmolBinary.java 2014-03-21 06:13:19 UTC (rev 19489) @@ -36,7 +36,6 @@ import org.jmol.api.JmolAdapter; import javajs.util.Rdr; -import javajs.util.LimitedLineReader; import javajs.util.List; import javajs.util.PT; @@ -61,9 +60,8 @@ public final static String PMESH_BINARY_MAGIC_NUMBER = "PM\1\0"; - private final static String DELPHI_BINARY_MAGIC_NUMBER = "\24\0\0\0"; - public static String determineSurfaceTypeIs(InputStream is) { + // drag-drop only BufferedReader br; try { br = Rdr.getBufferedReader(new BufferedInputStream(is), "ISO-8859-1"); @@ -73,123 +71,6 @@ return determineSurfaceFileType(br); } - public static String determineSurfaceFileType(BufferedReader bufferedReader) { - // JVXL should be on the FIRST line of the file, but it may be - // after comments or missing. - - // Apbs, Jvxl, or Cube, also efvet and DHBD - - String line = null; - LimitedLineReader br = null; - - try { - br = new LimitedLineReader(bufferedReader, 16000); - line = br.getHeader(0); - } catch (Exception e) { - // - } - if (br == null || line == null || line.length() == 0) - return null; - - //for (int i = 0; i < 220; i++) - // System.out.print(" " + i + ":" + (0 + line.charAt(i))); - //System.out.println(""); - - switch (line.charAt(0)) { - case '@': - if (line.indexOf("@text") == 0) - return "Kinemage"; - break; - case '#': - if (line.indexOf(".obj") >= 0) - return "Obj"; // #file: pymol.obj - if (line.indexOf("MSMS") >= 0) - return "Msms"; - break; - case '&': - if (line.indexOf("&plot") == 0) - return "Jaguar"; - break; - case '\r': - case '\n': - if (line.indexOf("ZYX") >= 0) - return "Xplor"; - break; - } - if (line.indexOf("Here is your gzipped map") >= 0) - return "UPPSALA" + line; - if (line.indexOf("! nspins") >= 0) - return "CastepDensity"; - if (line.indexOf("<jvxl") >= 0 && line.indexOf("<?xml") >= 0) - return "JvxlXml"; - if (line.indexOf("#JVXL+") >= 0) - return "Jvxl+"; - if (line.indexOf("#JVXL") >= 0) - return "Jvxl"; - if (line.indexOf("<efvet ") >= 0) - return "Efvet"; - if (line.indexOf("usemtl") >= 0) - return "Obj"; - if (line.indexOf("# object with") == 0) - return "Nff"; - if (line.indexOf("BEGIN_DATAGRID_3D") >= 0 || line.indexOf("BEGIN_BANDGRID_3D") >= 0) - return "Xsf"; - // binary formats: problem here is that the buffered reader - // may be translating byte sequences into unicode - // and thus shifting the offset - int pt0 = line.indexOf('\0'); - if (pt0 >= 0) { - if (line.indexOf(PMESH_BINARY_MAGIC_NUMBER) == 0) - return "Pmesh"; - if (line.indexOf(DELPHI_BINARY_MAGIC_NUMBER) == 0) - return "DelPhi"; - if (line.indexOf("MAP ") == 208) - return "Mrc"; - if (line.length() > 37 && (line.charAt(36) == 0 && line.charAt(37) == 100 - || line.charAt(36) == 0 && line.charAt(37) == 100)) { - // header19 (short)100 - return "Dsn6"; - } - } - - if (line.indexOf(" 0.00000e+00 0.00000e+00 0 0\n") >= 0) - return "Uhbd"; // older APBS http://sourceforge.net/p/apbs/code/ci/9527462a39126fb6cd880924b3cc4880ec4b78a9/tree/src/mg/vgrid.c - - // Apbs, Jvxl, Obj, or Cube, maybe formatted Plt - - line = br.readLineWithNewline(); - if (line.indexOf("object 1 class gridpositions counts") == 0) - return "Apbs"; - - String[] tokens = PT.getTokens(line); - String line2 = br.readLineWithNewline();// second line - if (tokens.length == 2 && PT.parseInt(tokens[0]) == 3 - && PT.parseInt(tokens[1]) != Integer.MIN_VALUE) { - tokens = PT.getTokens(line2); - if (tokens.length == 3 && PT.parseInt(tokens[0]) != Integer.MIN_VALUE - && PT.parseInt(tokens[1]) != Integer.MIN_VALUE - && PT.parseInt(tokens[2]) != Integer.MIN_VALUE) - return "PltFormatted"; - } - String line3 = br.readLineWithNewline(); // third line - if (line.startsWith("v ") && line2.startsWith("v ") && line3.startsWith("v ")) - return "Obj"; - //next line should be the atom line - int nAtoms = PT.parseInt(line3); - if (nAtoms == Integer.MIN_VALUE) - return (line3.indexOf("+") == 0 ? "Jvxl+" : null); - if (nAtoms >= 0) - return "Cube"; //Can't be a Jvxl file - nAtoms = -nAtoms; - for (int i = 4 + nAtoms; --i >= 0;) - if ((line = br.readLineWithNewline()) == null) - return null; - int nSurfaces = PT.parseInt(line); - if (nSurfaces == Integer.MIN_VALUE) - return null; - return (nSurfaces < 0 ? "Jvxl" : "Cube"); //Final test looks at surface definition line - } - public static String getEmbeddedScript(String script) { if (script == null) return script; @@ -267,7 +148,11 @@ public static String[] spartanFileList(String name, String zipDirectory) { return getJzu().spartanFileList(Rdr.getJzt(), name, zipDirectory); } - + + public static String determineSurfaceFileType(BufferedReader br) { + return getJzu().determineSurfaceFileType(br); + } + public static void getFileReferences(String script, List<String> fileList) { for (int ipt = 0; ipt < FileManager.scriptFilePrefixes.length; ipt++) { String tag = FileManager.scriptFilePrefixes[ipt]; Modified: trunk/Jmol/src/org/jmol/io/JmolZipUtilities.java =================================================================== --- trunk/Jmol/src/org/jmol/io/JmolZipUtilities.java 2014-03-21 05:40:42 UTC (rev 19488) +++ trunk/Jmol/src/org/jmol/io/JmolZipUtilities.java 2014-03-21 06:13:19 UTC (rev 19489) @@ -1,5 +1,6 @@ package org.jmol.io; +import java.io.BufferedReader; import java.io.InputStream; import java.util.Map; @@ -10,6 +11,10 @@ public interface JmolZipUtilities { + public boolean cachePngjFile(JmolBinary jmb, String[] data); + + public String determineSurfaceFileType(BufferedReader br); + public Object getAtomSetCollectionOrBufferedReaderFromZip(GenericZipTools zpt, JmolAdapter adapter, InputStream is, String fileName, @@ -18,10 +23,8 @@ int i, boolean asBufferedReader); - public String[] spartanFileList(GenericZipTools zpt, String name, String zipDirectory); - public byte[] getCachedPngjBytes(JmolBinary jmb, String pathName); - public boolean cachePngjFile(JmolBinary jmb, String[] data); + public String[] spartanFileList(GenericZipTools zpt, String name, String zipDirectory); } Modified: trunk/Jmol/src/org/jmol/io2/JmolUtil.java =================================================================== --- trunk/Jmol/src/org/jmol/io2/JmolUtil.java 2014-03-21 05:40:42 UTC (rev 19488) +++ trunk/Jmol/src/org/jmol/io2/JmolUtil.java 2014-03-21 06:13:19 UTC (rev 19489) @@ -31,6 +31,7 @@ import javajs.api.GenericZipTools; import javajs.api.GenericBinaryDocument; +import javajs.util.LimitedLineReader; import javajs.util.Rdr; import javajs.util.List; import javajs.util.PT; @@ -58,7 +59,320 @@ // for reflection } + private final static String DELPHI_BINARY_MAGIC_NUMBER = "\24\0\0\0"; + + /** + * called by SmarterJmolAdapter to see if we have a Spartan directory and, if + * so, open it and get all the data into the correct order. + * @param zpt + * + * @param is + * @param zipDirectory + * @return String data for processing + */ + private static SB checkSpecialData(GenericZipTools zpt, InputStream is, String[] zipDirectory) { + boolean isSpartan = false; + // 0 entry is not used here + for (int i = 1; i < zipDirectory.length; i++) { + if (zipDirectory[i].endsWith(".spardir/") + || zipDirectory[i].indexOf("_spartandir") >= 0) { + isSpartan = true; + break; + } + } + if (!isSpartan) + return null; + SB data = new SB(); + data.append("Zip File Directory: ").append("\n") + .append(Escape.eAS(zipDirectory, true)).append("\n"); + Map<String, String> fileData = new Hashtable<String, String>(); + zpt.getAllZipData(is, new String[] {}, "", "Molecule", fileData); + String prefix = "|"; + String outputData = fileData.get(prefix + "output"); + if (outputData == null) + outputData = fileData.get((prefix = "|" + zipDirectory[1]) + "output"); + data.append(outputData); + String[] files = getSpartanFileList(prefix, getSpartanDirs(outputData)); + for (int i = 2; i < files.length; i++) { + String name = files[i]; + if (fileData.containsKey(name)) + data.append(fileData.get(name)); + else + data.append(name + "\n"); + } + return data; + } + + /** + * called by SmarterJmolAdapter to see if we can automatically assign a file + * from the zip file. If so, return a subfile list for this file. The first + * element of the list is left empty -- it would be the zipfile name. + * + * Assignment can be made if (1) there is only one file in the collection or + * (2) if the first file is xxxx.spardir/ + * + * Note that __MACOS? files are ignored by the ZIP file reader. + * + * @param zipDirectory + * @return subFileList + */ + static String[] checkSpecialInZip(String[] zipDirectory) { + String name; + return (zipDirectory.length < 2 ? null : (name = zipDirectory[1]) + .endsWith(".spardir/") || zipDirectory.length == 2 ? new String[] { "", + (name.endsWith("/") ? name.substring(0, name.length() - 1) : name) } + : null); + } + + /** + * read the output file from the Spartan directory and decide from that what + * files need to be read and in what order - usually M0001 or a set of + * Profiles. But Spartan saves the Profiles in alphabetical order, not + * numerical. So we fix that here. + * + * @param outputFileData + * @return String[] list of files to read + */ + private static String[] getSpartanDirs(String outputFileData) { + if (outputFileData == null) + return new String[] {}; + if (outputFileData.startsWith("java.io.FileNotFoundException") + || outputFileData.startsWith("FILE NOT FOUND") + || outputFileData.indexOf("<html") >= 0) + return new String[] { "M0001" }; + List<String> v = new List<String>(); + String token; + String lasttoken = ""; + try { + StringTokenizer tokens = new StringTokenizer(outputFileData, " \t\r\n"); + while (tokens.hasMoreTokens()) { + // profile file name is just before each right-paren: + /* + * MacSPARTAN '08 ENERGY PROFILE: x86/Darwin 130 + * + * Dihedral Move : C3 - C2 - C1 - O1 [ 4] -180.000000 .. 180.000000 + * Dihedral Move : C2 - C1 - O1 - H3 [ 4] -180.000000 .. 180.000000 + * + * 1 ) -180.00 -180.00 -504208.11982719 2 ) -90.00 -180.00 + * -504200.18593376 + * + * ... + * + * 24 ) 90.00 180.00 -504200.18564495 25 ) 180.00 180.00 + * -504208.12129747 + * + * Found a local maxima E = -504178.25455465 [ 3 3 ] + * + * + * Reason for exit: Successful completion Mechanics CPU Time : 1:51.42 + * Mechanics Wall Time: 12:31.54 + */ + if ((token = tokens.nextToken()).equals(")")) + v.addLast(lasttoken); + else if (token.equals("Start-") + && tokens.nextToken().equals("Molecule")) + v.addLast(PT.split(tokens.nextToken(), "\"")[1]); + lasttoken = token; + } + } catch (Exception e) { + // + } + return v.toArray(new String[v.size()]); + } + + /** + * returns the list of files to read for every Spartan spardir. Simple numbers + * are assumed to be Profiles; others are models. + * + * @param name + * @param dirNums + * @return String[] list of files to read given a list of directory names + * + */ + private static String[] getSpartanFileList(String name, String[] dirNums) { + String[] files = new String[2 + dirNums.length * 5]; + files[0] = "SpartanSmol"; + files[1] = "Directory Entry "; + int pt = 2; + name = name.replace('\\', '/'); + if (name.endsWith("/")) + name = name.substring(0, name.length() - 1); + for (int i = 0; i < dirNums.length; i++) { + String path = name + + (Character.isDigit(dirNums[i].charAt(0)) ? "/Profile." + dirNums[i] + : "/" + dirNums[i]); + files[pt++] = path + "/#JMOL_MODEL " + dirNums[i]; + files[pt++] = path + "/input"; + files[pt++] = path + "/archive"; + files[pt++] = path + "/Molecule:asBinaryString"; + files[pt++] = path + "/proparc"; + } + return files; + } + + private static String shortSceneFilename(String pathName) { + int pt = pathName.indexOf("_scene_") + 7; + if (pt < 7) + return pathName; + String s = ""; + if (pathName.endsWith("|state.spt")) { + int pt1 = pathName.indexOf('.', pt); + if (pt1 < 0) + return pathName; + s = pathName.substring(pt, pt1); + } + int pt2 = pathName.lastIndexOf("|"); + return pathName.substring(0, pt) + s + + (pt2 > 0 ? pathName.substring(pt2) : ""); + } + @Override + public boolean cachePngjFile(JmolBinary jmb, String[] data) { + data[0] = Rdr.getZipRoot(data[0]); + String shortName = shortSceneFilename(data[0]); + try { + data[1] = ZipTools.cacheZipContents( + Rdr.getPngZipStream((BufferedInputStream) jmb.fm + .getBufferedInputStreamOrErrorMessageFromName(data[0], null, + false, false, null, false, true), true), shortName, jmb.pngjCache, false); + } catch (Exception e) { + return false; + } + if (data[1] == null) + return false; + byte[] bytes = data[1].getBytes(); + jmb.pngjCache.put(jmb.fm.getCanonicalName(data[0]), bytes); // marker in case the .all. file is changed + if (shortName.indexOf("_scene_") >= 0) { + jmb.pngjCache.put(shortSceneFilename(data[0]), bytes); // good for all .min. files of this scene set + bytes = (byte[]) jmb.pngjCache.remove(shortName + "|state.spt"); + if (bytes != null) + jmb.pngjCache.put(shortSceneFilename(data[0] + "|state.spt"), bytes); + } + for (String key : jmb.pngjCache.keySet()) + System.out.println(key); + return true; + } + + @Override + public String determineSurfaceFileType(BufferedReader bufferedReader) { + // drag-drop and isosurface command only + // JVXL should be on the FIRST line of the file, but it may be + // after comments or missing. + + // Apbs, Jvxl, or Cube, also efvet and DHBD + + String line = null; + LimitedLineReader br = null; + + try { + br = new LimitedLineReader(bufferedReader, 16000); + line = br.getHeader(0); + } catch (Exception e) { + // + } + if (br == null || line == null || line.length() == 0) + return null; + + //for (int i = 0; i < 220; i++) + // System.out.print(" " + i + ":" + (0 + line.charAt(i))); + //System.out.println(""); + + switch (line.charAt(0)) { + case '@': + if (line.indexOf("@text") == 0) + return "Kinemage"; + break; + case '#': + if (line.indexOf(".obj") >= 0) + return "Obj"; // #file: pymol.obj + if (line.indexOf("MSMS") >= 0) + return "Msms"; + break; + case '&': + if (line.indexOf("&plot") == 0) + return "Jaguar"; + break; + case '\r': + case '\n': + if (line.indexOf("ZYX") >= 0) + return "Xplor"; + break; + } + if (line.indexOf("Here is your gzipped map") >= 0) + return "UPPSALA" + line; + if (line.indexOf("! nspins") >= 0) + return "CastepDensity"; + if (line.indexOf("<jvxl") >= 0 && line.indexOf("<?xml") >= 0) + return "JvxlXml"; + if (line.indexOf("#JVXL+") >= 0) + return "Jvxl+"; + if (line.indexOf("#JVXL") >= 0) + return "Jvxl"; + if (line.indexOf("<efvet ") >= 0) + return "Efvet"; + if (line.indexOf("usemtl") >= 0) + return "Obj"; + if (line.indexOf("# object with") == 0) + return "Nff"; + if (line.indexOf("BEGIN_DATAGRID_3D") >= 0 || line.indexOf("BEGIN_BANDGRID_3D") >= 0) + return "Xsf"; + // binary formats: problem here is that the buffered reader + // may be translating byte sequences into unicode + // and thus shifting the offset + int pt0 = line.indexOf('\0'); + if (pt0 >= 0) { + if (line.indexOf(JmolBinary.PMESH_BINARY_MAGIC_NUMBER) == 0) + return "Pmesh"; + if (line.indexOf(DELPHI_BINARY_MAGIC_NUMBER) == 0) + return "DelPhi"; + if (line.indexOf("MAP ") == 208) + return "Mrc"; + if (line.length() > 37 && (line.charAt(36) == 0 && line.charAt(37) == 100 + || line.charAt(36) == 0 && line.charAt(37) == 100)) { + // header19 (short)100 + return "Dsn6"; + } + } + + if (line.indexOf(" 0.00000e+00 0.00000e+00 0 0\n") >= 0) + return "Uhbd"; // older APBS http://sourceforge.net/p/apbs/code/ci/9527462a39126fb6cd880924b3cc4880ec4b78a9/tree/src/mg/vgrid.c + + // Apbs, Jvxl, Obj, or Cube, maybe formatted Plt + + line = br.readLineWithNewline(); + if (line.indexOf("object 1 class gridpositions counts") == 0) + return "Apbs"; + + String[] tokens = PT.getTokens(line); + String line2 = br.readLineWithNewline();// second line + if (tokens.length == 2 && PT.parseInt(tokens[0]) == 3 + && PT.parseInt(tokens[1]) != Integer.MIN_VALUE) { + tokens = PT.getTokens(line2); + if (tokens.length == 3 && PT.parseInt(tokens[0]) != Integer.MIN_VALUE + && PT.parseInt(tokens[1]) != Integer.MIN_VALUE + && PT.parseInt(tokens[2]) != Integer.MIN_VALUE) + return "PltFormatted"; + } + String line3 = br.readLineWithNewline(); // third line + if (line.startsWith("v ") && line2.startsWith("v ") && line3.startsWith("v ")) + return "Obj"; + //next line should be the atom line + int nAtoms = PT.parseInt(line3); + if (nAtoms == Integer.MIN_VALUE) + return (line3.indexOf("+") == 0 ? "Jvxl+" : null); + if (nAtoms >= 0) + return "Cube"; //Can't be a Jvxl file + nAtoms = -nAtoms; + for (int i = 4 + nAtoms; --i >= 0;) + if ((line = br.readLineWithNewline()) == null) + return null; + int nSurfaces = PT.parseInt(line); + if (nSurfaces == Integer.MIN_VALUE) + return null; + return (nSurfaces < 0 ? "Jvxl" : "Cube"); //Final test looks at surface definition line + } + + @Override public Object getAtomSetCollectionOrBufferedReaderFromZip(GenericZipTools zpt, JmolAdapter adapter, InputStream is, @@ -288,46 +602,34 @@ } } - /** - * called by SmarterJmolAdapter to see if we have a Spartan directory and, if - * so, open it and get all the data into the correct order. - * @param zpt - * - * @param is - * @param zipDirectory - * @return String data for processing - */ - private static SB checkSpecialData(GenericZipTools zpt, InputStream is, String[] zipDirectory) { - boolean isSpartan = false; - // 0 entry is not used here - for (int i = 1; i < zipDirectory.length; i++) { - if (zipDirectory[i].endsWith(".spardir/") - || zipDirectory[i].indexOf("_spartandir") >= 0) { - isSpartan = true; - break; - } + @Override + public byte[] getCachedPngjBytes(JmolBinary jmb, String pathName) { + Logger.info("JmolUtil checking PNGJ cache for " + pathName); + String shortName = shortSceneFilename(pathName); + if (jmb.pngjCache == null + && !jmb.clearAndCachePngjFile(new String[] { pathName, null })) + return null; + boolean isMin = (pathName.indexOf(".min.") >= 0); + if (!isMin) { + String cName = jmb.fm.getCanonicalName(Rdr.getZipRoot(pathName)); + if (!jmb.pngjCache.containsKey(cName) + && !jmb.clearAndCachePngjFile(new String[] { pathName, null })) + return null; + if (pathName.indexOf("|") < 0) + shortName = cName; } - if (!isSpartan) + if (jmb.pngjCache.containsKey(shortName)) { + Logger.info("FileManager using memory cache " + shortName); + return (byte[]) jmb.pngjCache.get(shortName); + } + // for (String key : pngjCache.keySet()) + // System.out.println(" key=" + key); + //System.out.println("FileManager memory cache size=" + pngjCache.size() + // + " did not find " + pathName + " as " + shortName); + if (!isMin || !jmb.clearAndCachePngjFile(new String[] { pathName, null })) return null; - SB data = new SB(); - data.append("Zip File Directory: ").append("\n") - .append(Escape.eAS(zipDirectory, true)).append("\n"); - Map<String, String> fileData = new Hashtable<String, String>(); - zpt.getAllZipData(is, new String[] {}, "", "Molecule", fileData); - String prefix = "|"; - String outputData = fileData.get(prefix + "output"); - if (outputData == null) - outputData = fileData.get((prefix = "|" + zipDirectory[1]) + "output"); - data.append(outputData); - String[] files = getSpartanFileList(prefix, getSpartanDirs(outputData)); - for (int i = 2; i < files.length; i++) { - String name = files[i]; - if (fileData.containsKey(name)) - data.append(fileData.get(name)); - else - data.append(name + "\n"); - } - return data; + Logger.info("FileManager using memory cache " + shortName); + return (byte[]) jmb.pngjCache.get(shortName); } /** @@ -369,184 +671,4 @@ return getSpartanFileList(name, dirNums); } - /** - * read the output file from the Spartan directory and decide from that what - * files need to be read and in what order - usually M0001 or a set of - * Profiles. But Spartan saves the Profiles in alphabetical order, not - * numerical. So we fix that here. - * - * @param outputFileData - * @return String[] list of files to read - */ - private static String[] getSpartanDirs(String outputFileData) { - if (outputFileData == null) - return new String[] {}; - if (outputFileData.startsWith("java.io.FileNotFoundException") - || outputFileData.startsWith("FILE NOT FOUND") - || outputFileData.indexOf("<html") >= 0) - return new String[] { "M0001" }; - List<String> v = new List<String>(); - String token; - String lasttoken = ""; - try { - StringTokenizer tokens = new StringTokenizer(outputFileData, " \t\r\n"); - while (tokens.hasMoreTokens()) { - // profile file name is just before each right-paren: - /* - * MacSPARTAN '08 ENERGY PROFILE: x86/Darwin 130 - * - * Dihedral Move : C3 - C2 - C1 - O1 [ 4] -180.000000 .. 180.000000 - * Dihedral Move : C2 - C1 - O1 - H3 [ 4] -180.000000 .. 180.000000 - * - * 1 ) -180.00 -180.00 -504208.11982719 2 ) -90.00 -180.00 - * -504200.18593376 - * - * ... - * - * 24 ) 90.00 180.00 -504200.18564495 25 ) 180.00 180.00 - * -504208.12129747 - * - * Found a local maxima E = -504178.25455465 [ 3 3 ] - * - * - * Reason for exit: Successful completion Mechanics CPU Time : 1:51.42 - * Mechanics Wall Time: 12:31.54 - */ - if ((token = tokens.nextToken()).equals(")")) - v.addLast(lasttoken); - else if (token.equals("Start-") - && tokens.nextToken().equals("Molecule")) - v.addLast(PT.split(tokens.nextToken(), "\"")[1]); - lasttoken = token; - } - } catch (Exception e) { - // - } - return v.toArray(new String[v.size()]); - } - - /** - * returns the list of files to read for every Spartan spardir. Simple numbers - * are assumed to be Profiles; others are models. - * - * @param name - * @param dirNums - * @return String[] list of files to read given a list of directory names - * - */ - private static String[] getSpartanFileList(String name, String[] dirNums) { - String[] files = new String[2 + dirNums.length * 5]; - files[0] = "SpartanSmol"; - files[1] = "Directory Entry "; - int pt = 2; - name = name.replace('\\', '/'); - if (name.endsWith("/")) - name = name.substring(0, name.length() - 1); - for (int i = 0; i < dirNums.length; i++) { - String path = name - + (Character.isDigit(dirNums[i].charAt(0)) ? "/Profile." + dirNums[i] - : "/" + dirNums[i]); - files[pt++] = path + "/#JMOL_MODEL " + dirNums[i]; - files[pt++] = path + "/input"; - files[pt++] = path + "/archive"; - files[pt++] = path + "/Molecule:asBinaryString"; - files[pt++] = path + "/proparc"; - } - return files; - } - - /** - * called by SmarterJmolAdapter to see if we can automatically assign a file - * from the zip file. If so, return a subfile list for this file. The first - * element of the list is left empty -- it would be the zipfile name. - * - * Assignment can be made if (1) there is only one file in the collection or - * (2) if the first file is xxxx.spardir/ - * - * Note that __MACOS? files are ignored by the ZIP file reader. - * - * @param zipDirectory - * @return subFileList - */ - static String[] checkSpecialInZip(String[] zipDirectory) { - String name; - return (zipDirectory.length < 2 ? null : (name = zipDirectory[1]) - .endsWith(".spardir/") || zipDirectory.length == 2 ? new String[] { "", - (name.endsWith("/") ? name.substring(0, name.length() - 1) : name) } - : null); - } - - @Override - public byte[] getCachedPngjBytes(JmolBinary jmb, String pathName) { - Logger.info("JmolUtil checking PNGJ cache for " + pathName); - String shortName = shortSceneFilename(pathName); - if (jmb.pngjCache == null - && !jmb.clearAndCachePngjFile(new String[] { pathName, null })) - return null; - boolean isMin = (pathName.indexOf(".min.") >= 0); - if (!isMin) { - String cName = jmb.fm.getCanonicalName(Rdr.getZipRoot(pathName)); - if (!jmb.pngjCache.containsKey(cName) - && !jmb.clearAndCachePngjFile(new String[] { pathName, null })) - return null; - if (pathName.indexOf("|") < 0) - shortName = cName; - } - if (jmb.pngjCache.containsKey(shortName)) { - Logger.info("FileManager using memory cache " + shortName); - return (byte[]) jmb.pngjCache.get(shortName); - } - // for (String key : pngjCache.keySet()) - // System.out.println(" key=" + key); - //System.out.println("FileManager memory cache size=" + pngjCache.size() - // + " did not find " + pathName + " as " + shortName); - if (!isMin || !jmb.clearAndCachePngjFile(new String[] { pathName, null })) - return null; - Logger.info("FileManager using memory cache " + shortName); - return (byte[]) jmb.pngjCache.get(shortName); - } - - @Override - public boolean cachePngjFile(JmolBinary jmb, String[] data) { - data[0] = Rdr.getZipRoot(data[0]); - String shortName = shortSceneFilename(data[0]); - try { - data[1] = ZipTools.cacheZipContents( - Rdr.getPngZipStream((BufferedInputStream) jmb.fm - .getBufferedInputStreamOrErrorMessageFromName(data[0], null, - false, false, null, false, true), true), shortName, jmb.pngjCache, false); - } catch (Exception e) { - return false; - } - if (data[1] == null) - return false; - byte[] bytes = data[1].getBytes(); - jmb.pngjCache.put(jmb.fm.getCanonicalName(data[0]), bytes); // marker in case the .all. file is changed - if (shortName.indexOf("_scene_") >= 0) { - jmb.pngjCache.put(shortSceneFilename(data[0]), bytes); // good for all .min. files of this scene set - bytes = (byte[]) jmb.pngjCache.remove(shortName + "|state.spt"); - if (bytes != null) - jmb.pngjCache.put(shortSceneFilename(data[0] + "|state.spt"), bytes); - } - for (String key : jmb.pngjCache.keySet()) - System.out.println(key); - return true; - } - - private static String shortSceneFilename(String pathName) { - int pt = pathName.indexOf("_scene_") + 7; - if (pt < 7) - return pathName; - String s = ""; - if (pathName.endsWith("|state.spt")) { - int pt1 = pathName.indexOf('.', pt); - if (pt1 < 0) - return pathName; - s = pathName.substring(pt, pt1); - } - int pt2 = pathName.lastIndexOf("|"); - return pathName.substring(0, pt) + s - + (pt2 > 0 ? pathName.substring(pt2) : ""); - } - } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-03-26 15:02:16
|
Revision: 19524 http://sourceforge.net/p/jmol/code/19524 Author: hansonr Date: 2014-03-26 15:02:08 +0000 (Wed, 26 Mar 2014) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/appletjs/Jmol.java trunk/Jmol/src/org/jmol/util/GenericApplet.java Added Paths: ----------- trunk/Jmol/src/unused/TransformManager10.java trunk/Jmol/src/unused/TransformManager11.java Removed Paths: ------------- trunk/Jmol/src/org/jmol/viewer/TransformManager10.java trunk/Jmol/src/org/jmol/viewer/TransformManager11.java Modified: trunk/Jmol/src/org/jmol/appletjs/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/appletjs/Jmol.java 2014-03-26 12:51:23 UTC (rev 19523) +++ trunk/Jmol/src/org/jmol/appletjs/Jmol.java 2014-03-26 15:02:08 UTC (rev 19524) @@ -24,7 +24,6 @@ package org.jmol.appletjs; -import org.jmol.c.CBK; import org.jmol.util.Logger; import org.jmol.util.Parser; import org.jmol.util.GenericApplet; @@ -100,35 +99,6 @@ // not implemented } - String doNotifySync(String info, String appletName) { - String syncCallback = callbacks.get(CBK.SYNC); - if (!mayScript || syncCallback == null || !haveDocumentAccess - && !syncCallback.startsWith("Jmol.")) - return info; - // ignoring - Logger.info("Jmol.notifySync " + appletName + " >> " + info); - try { - /** - * @j2sNative - * - * if (syncCallback=="Jmol._mySyncCallback") return - * Jmol._mySyncCallback(this.htmlName, info, appletName); var f - * = eval(syncCallback); return f(this.htmlName, info, - * appletName); - */ - { - System.out.println(appletName); - } - } catch (Exception e) { - if (!haveNotifiedError) - if (Logger.debugging) { - Logger.debug("syncCallback call error to " + syncCallback + ": " + e); - } - haveNotifiedError = true; - } - return info; - } - @Override protected float[][] doFunctionXY(String functionName, int nX, int nY) { /*three options: @@ -178,7 +148,7 @@ /** * @j2sNative * - * data = eval(functionName)(htmlName, nX, nY, fxy); + * data = eval(functionName)(this.htmlName, nX, nY, fxy); * */ { Modified: trunk/Jmol/src/org/jmol/util/GenericApplet.java =================================================================== --- trunk/Jmol/src/org/jmol/util/GenericApplet.java 2014-03-26 12:51:23 UTC (rev 19523) +++ trunk/Jmol/src/org/jmol/util/GenericApplet.java 2014-03-26 15:02:08 UTC (rev 19524) @@ -15,7 +15,6 @@ import org.jmol.api.JmolCallbackListener; import org.jmol.api.JmolStatusListener; import org.jmol.api.JmolSyncInterface; -import org.jmol.api.JmolViewer; import org.jmol.c.CBK; import org.jmol.i18n.GT; import org.jmol.viewer.JC; @@ -809,7 +808,7 @@ if (!mayScript || syncCallback == null) return info; try { - return doSendCallback(syncCallback, new Object[] { htmlName, info, + return doSendCallback(syncCallback, new Object[] { fullName, info, appletName }, null); } catch (Exception e) { if (!haveNotifiedError) Deleted: trunk/Jmol/src/org/jmol/viewer/TransformManager10.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/TransformManager10.java 2014-03-26 12:51:23 UTC (rev 19523) +++ trunk/Jmol/src/org/jmol/viewer/TransformManager10.java 2014-03-26 15:02:08 UTC (rev 19524) @@ -1,147 +0,0 @@ -/* $RCSfile$ - * $Author: hansonr $ - * $Date: 2006-12-18 10:29:29 -0600 (Mon, 18 Dec 2006) $ - * $Revision: 6502 $ - * - * Copyright (C) 2003-2005 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package org.jmol.viewer; - -class TransformManager10 {// extends TransformManager { - -// no longer supported in Jmol 13.2 - -// -// TransformManager10(Viewer vwr, int width, int height) { -// super(vwr, width, height); -// perspectiveModel = 10; -// } -// -// // older Jmol 10 method -// // -- applies cameraScaleFactor to scalePixelsPerAngstrom -// // -- no navigation -// -// @Override -// protected void calcCameraFactors() { -// //(m) model coordinates -// //(s) screen coordinates = (m) * screenPixelsPerAngstrom -// //(p) plane coordinates = (s) / screenPixelCount -// -// if (Float.isNaN(cameraDepth)) { -// cameraDepth = cameraDepthSetting; -// } -// -// // distance from the front plane of the model at zoom=100, where p=0 -// cameraDistance = cameraDepth * screenPixelCount; //(s) -// -// // factor to apply as part of the transform -// // 1/f = (cameraDepth + 0.5)/cameraDepth -// // -- note -- in this model 0.02 was added empirically -// cameraScaleFactor = 1.02f + 0.5f / cameraDepth; //(unitless) -// -// // conversion factor Angstroms --> pixels -// // -- note -- in this model, it depends upon camera position -// scalePixelsPerAngstrom = -// (scale3D && !perspectiveDepth ? 72 / scale3DAngstromsPerInch * (antialias ? 2 : 1) -// : scaleDefaultPixelsPerAngstrom * zoomPercent / 100 * cameraScaleFactor); //(s/m) -// -// // model radius in pixels, for slab calculation -// modelRadiusPixels = modelRadius * scalePixelsPerAngstrom; -// -// // screen offset to fixed rotation center -// // -- note -- in this model, it floats with zoom and camera position -// modelCenterOffset = cameraDistance + modelRadiusPixels; //(s) -// -// // factor to apply based on screen Z -// // -- note -- in this model, plane 0 is "standard" plane -// // so that all normal adjustments scale DOWN -// referencePlaneOffset = cameraDistance; //(s) -// -// //System.out.println("transformman10: scalppa modelrad visual range " + scalePixelsPerAngstrom + " " + modelRadiusPixels + " " + visualRange); -// -// } -// -// @Override -// protected float getPerspectiveFactor(float z) { -// // all z's SHOULD be >= 0 -// // so the more positive z is, the smaller the screen scale -// //new idea: phase out perspective depth when zoom is very large. -// //zoomPercent 1000 or larger starts removing this effect -// //we can go up to 200000 -// float factor = (z <= 0 ? referencePlaneOffset : referencePlaneOffset / z); -// if (zoomPercent >= MAXIMUM_ZOOM_PERSPECTIVE_DEPTH) -// factor += (zoomPercent - MAXIMUM_ZOOM_PERSPECTIVE_DEPTH) -// / (MAXIMUM_ZOOM_PERCENTAGE - MAXIMUM_ZOOM_PERSPECTIVE_DEPTH) -// * (1 - factor); -// return factor; -// } -// -// @Override -// protected void adjustTemporaryScreenPoint() { -// -// //fixedRotation point is at the origin initially -// -// float z = point3fScreenTemp.z; -// -// //this could easily go negative -- behind the screen -- -// //but we don't care. In fact, that just makes it easier, -// //because it means we won't render it. -// //we should probably assign z = 0 as "unrenderable" -// -// if (Float.isNaN(z)) { -// if (!haveNotifiedNaN) -// Logger.debug("NaN seen in TransformPoint"); -// haveNotifiedNaN = true; -// z = 1; -// } else if (z <= 0) { -// //just don't let z go past 1 BH 11/15/06 -// z = 1; -// } -// point3fScreenTemp.z = z; -// -// // x and y are moved inward (generally) relative to 0, which -// // is either the fixed rotation center or the navigation center -// -// // at this point coordinates are centered on rotation center -// -// if (perspectiveDepth) { -// float factor = getPerspectiveFactor(z); -// point3fScreenTemp.x *= factor; -// point3fScreenTemp.y *= factor; -// } -// -// //now move the center point to where it needs to be -// -// point3fScreenTemp.x += fixedRotationOffset.x; -// point3fScreenTemp.y += fixedRotationOffset.y; -// -// if (Float.isNaN(point3fScreenTemp.x) && !haveNotifiedNaN) { -// Logger.debug("NaN found in transformPoint "); -// haveNotifiedNaN = true; -// } -// point3iScreenTemp.set((int) point3fScreenTemp.x, (int) point3fScreenTemp.y, -// (int) point3fScreenTemp.z); -// } -// -// /* *************************************************************** -// * Navigation support -// ****************************************************************/ -// -// // none in this model -} Deleted: trunk/Jmol/src/org/jmol/viewer/TransformManager11.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/TransformManager11.java 2014-03-26 12:51:23 UTC (rev 19523) +++ trunk/Jmol/src/org/jmol/viewer/TransformManager11.java 2014-03-26 15:02:08 UTC (rev 19524) @@ -1,29 +0,0 @@ -/* $RCSfile$ - * $Author$ - * $Date$ - * $Revision$ - * - * Copyright (C) 2003-2005 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package org.jmol.viewer; - - -public class TransformManager11 {//extends TransformManager { - // folded into TransformManager in 13.1.10 -} Copied: trunk/Jmol/src/unused/TransformManager10.java (from rev 19499, trunk/Jmol/src/org/jmol/viewer/TransformManager10.java) =================================================================== --- trunk/Jmol/src/unused/TransformManager10.java (rev 0) +++ trunk/Jmol/src/unused/TransformManager10.java 2014-03-26 15:02:08 UTC (rev 19524) @@ -0,0 +1,147 @@ +/* $RCSfile$ + * $Author: hansonr $ + * $Date: 2006-12-18 10:29:29 -0600 (Mon, 18 Dec 2006) $ + * $Revision: 6502 $ + * + * Copyright (C) 2003-2005 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package unused; + +class TransformManager10 {// extends TransformManager { + +// no longer supported in Jmol 13.2 + +// +// TransformManager10(Viewer vwr, int width, int height) { +// super(vwr, width, height); +// perspectiveModel = 10; +// } +// +// // older Jmol 10 method +// // -- applies cameraScaleFactor to scalePixelsPerAngstrom +// // -- no navigation +// +// @Override +// protected void calcCameraFactors() { +// //(m) model coordinates +// //(s) screen coordinates = (m) * screenPixelsPerAngstrom +// //(p) plane coordinates = (s) / screenPixelCount +// +// if (Float.isNaN(cameraDepth)) { +// cameraDepth = cameraDepthSetting; +// } +// +// // distance from the front plane of the model at zoom=100, where p=0 +// cameraDistance = cameraDepth * screenPixelCount; //(s) +// +// // factor to apply as part of the transform +// // 1/f = (cameraDepth + 0.5)/cameraDepth +// // -- note -- in this model 0.02 was added empirically +// cameraScaleFactor = 1.02f + 0.5f / cameraDepth; //(unitless) +// +// // conversion factor Angstroms --> pixels +// // -- note -- in this model, it depends upon camera position +// scalePixelsPerAngstrom = +// (scale3D && !perspectiveDepth ? 72 / scale3DAngstromsPerInch * (antialias ? 2 : 1) +// : scaleDefaultPixelsPerAngstrom * zoomPercent / 100 * cameraScaleFactor); //(s/m) +// +// // model radius in pixels, for slab calculation +// modelRadiusPixels = modelRadius * scalePixelsPerAngstrom; +// +// // screen offset to fixed rotation center +// // -- note -- in this model, it floats with zoom and camera position +// modelCenterOffset = cameraDistance + modelRadiusPixels; //(s) +// +// // factor to apply based on screen Z +// // -- note -- in this model, plane 0 is "standard" plane +// // so that all normal adjustments scale DOWN +// referencePlaneOffset = cameraDistance; //(s) +// +// //System.out.println("transformman10: scalppa modelrad visual range " + scalePixelsPerAngstrom + " " + modelRadiusPixels + " " + visualRange); +// +// } +// +// @Override +// protected float getPerspectiveFactor(float z) { +// // all z's SHOULD be >= 0 +// // so the more positive z is, the smaller the screen scale +// //new idea: phase out perspective depth when zoom is very large. +// //zoomPercent 1000 or larger starts removing this effect +// //we can go up to 200000 +// float factor = (z <= 0 ? referencePlaneOffset : referencePlaneOffset / z); +// if (zoomPercent >= MAXIMUM_ZOOM_PERSPECTIVE_DEPTH) +// factor += (zoomPercent - MAXIMUM_ZOOM_PERSPECTIVE_DEPTH) +// / (MAXIMUM_ZOOM_PERCENTAGE - MAXIMUM_ZOOM_PERSPECTIVE_DEPTH) +// * (1 - factor); +// return factor; +// } +// +// @Override +// protected void adjustTemporaryScreenPoint() { +// +// //fixedRotation point is at the origin initially +// +// float z = point3fScreenTemp.z; +// +// //this could easily go negative -- behind the screen -- +// //but we don't care. In fact, that just makes it easier, +// //because it means we won't render it. +// //we should probably assign z = 0 as "unrenderable" +// +// if (Float.isNaN(z)) { +// if (!haveNotifiedNaN) +// Logger.debug("NaN seen in TransformPoint"); +// haveNotifiedNaN = true; +// z = 1; +// } else if (z <= 0) { +// //just don't let z go past 1 BH 11/15/06 +// z = 1; +// } +// point3fScreenTemp.z = z; +// +// // x and y are moved inward (generally) relative to 0, which +// // is either the fixed rotation center or the navigation center +// +// // at this point coordinates are centered on rotation center +// +// if (perspectiveDepth) { +// float factor = getPerspectiveFactor(z); +// point3fScreenTemp.x *= factor; +// point3fScreenTemp.y *= factor; +// } +// +// //now move the center point to where it needs to be +// +// point3fScreenTemp.x += fixedRotationOffset.x; +// point3fScreenTemp.y += fixedRotationOffset.y; +// +// if (Float.isNaN(point3fScreenTemp.x) && !haveNotifiedNaN) { +// Logger.debug("NaN found in transformPoint "); +// haveNotifiedNaN = true; +// } +// point3iScreenTemp.set((int) point3fScreenTemp.x, (int) point3fScreenTemp.y, +// (int) point3fScreenTemp.z); +// } +// +// /* *************************************************************** +// * Navigation support +// ****************************************************************/ +// +// // none in this model +} Copied: trunk/Jmol/src/unused/TransformManager11.java (from rev 19499, trunk/Jmol/src/org/jmol/viewer/TransformManager11.java) =================================================================== --- trunk/Jmol/src/unused/TransformManager11.java (rev 0) +++ trunk/Jmol/src/unused/TransformManager11.java 2014-03-26 15:02:08 UTC (rev 19524) @@ -0,0 +1,29 @@ +/* $RCSfile$ + * $Author$ + * $Date$ + * $Revision$ + * + * Copyright (C) 2003-2005 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package unused; + + +public class TransformManager11 {//extends TransformManager { + // folded into TransformManager in 13.1.10 +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-03-28 03:11:02
|
Revision: 19535 http://sourceforge.net/p/jmol/code/19535 Author: hansonr Date: 2014-03-28 03:10:56 +0000 (Fri, 28 Mar 2014) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/javajs/awt/Color.java trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java Modified: trunk/Jmol/src/javajs/awt/Color.java =================================================================== --- trunk/Jmol/src/javajs/awt/Color.java 2014-03-27 22:18:58 UTC (rev 19534) +++ trunk/Jmol/src/javajs/awt/Color.java 2014-03-28 03:10:56 UTC (rev 19535) @@ -42,5 +42,12 @@ argb = ((a << 24) | (r << 16) | (g << 8) | b) & 0xFFFFFFFF; return this; } + + @Override + public String toString() { + String s = ("000000" + Integer.toHexString(argb)); + return "[0x" + s.substring(s.length() - 6, s.length()) + "]"; + } + } Modified: trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java 2014-03-27 22:18:58 UTC (rev 19534) +++ trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java 2014-03-28 03:10:56 UTC (rev 19535) @@ -43,7 +43,6 @@ import org.jmol.script.T; import org.jmol.util.Logger; import org.jmol.util.Parser; -import org.jmol.viewer.JC; import org.jmol.viewer.Viewer; import org.openscience.jmol.app.HistoryFile; import org.openscience.jmol.app.Jmol; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-03-30 19:34:37
|
Revision: 19542 http://sourceforge.net/p/jmol/code/19542 Author: hansonr Date: 2014-03-30 19:34:29 +0000 (Sun, 30 Mar 2014) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/javajs/util/CU.java trunk/Jmol/src/org/jmol/export/_ObjExporter.java trunk/Jmol/src/org/jmol/modelset/Atom.java trunk/Jmol/src/org/jmol/scriptext/MathExt.java trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java trunk/Jmol/src/org/jmol/util/ColorEncoder.java trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/webexport/Widgets.java Modified: trunk/Jmol/src/javajs/util/CU.java =================================================================== --- trunk/Jmol/src/javajs/util/CU.java 2014-03-30 15:24:51 UTC (rev 19541) +++ trunk/Jmol/src/javajs/util/CU.java 2014-03-30 19:34:29 UTC (rev 19542) @@ -444,7 +444,7 @@ return toRGBpt(getArgbFromString(colorName), pt); } - public final static P3 colorPtFromInt2(int color) { + public final static P3 colorPtFromInt(int color) { return P3.new3((color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF); } Modified: trunk/Jmol/src/org/jmol/export/_ObjExporter.java =================================================================== --- trunk/Jmol/src/org/jmol/export/_ObjExporter.java 2014-03-30 15:24:51 UTC (rev 19541) +++ trunk/Jmol/src/org/jmol/export/_ObjExporter.java 2014-03-30 19:34:29 UTC (rev 19542) @@ -945,7 +945,7 @@ // Get the vertex colors and average them sum.set(0, 0, 0); for (int iVertex : face) - sum.add(CU.colorPtFromInt2(g3d.getColorArgbOrGray(colixes[iVertex]))); + sum.add(CU.colorPtFromInt(g3d.getColorArgbOrGray(colixes[iVertex]))); sum.scale(1.0f / face.length); rgb = CU.colorPtToFFRGB(sum); } else { Modified: trunk/Jmol/src/org/jmol/modelset/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Atom.java 2014-03-30 15:24:51 UTC (rev 19541) +++ trunk/Jmol/src/org/jmol/modelset/Atom.java 2014-03-30 19:34:29 UTC (rev 19542) @@ -1470,7 +1470,7 @@ case T.xyz: return atom; case T.color: - return CU.colorPtFromInt2( + return CU.colorPtFromInt( atom.group.chain.model.ms.vwr.getColorArgbOrGray(atom.getColix()) ); } Modified: trunk/Jmol/src/org/jmol/scriptext/MathExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2014-03-30 15:24:51 UTC (rev 19541) +++ trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2014-03-30 19:34:29 UTC (rev 19542) @@ -355,7 +355,7 @@ } Map<String, Object> key = ce.getColorKey(); if (getValue) - return mp.addXPt(CU.colorPtFromInt2(ce.getArgb(hi == Float.MAX_VALUE ? lo + return mp.addXPt(CU.colorPtFromInt(ce.getArgb(hi == Float.MAX_VALUE ? lo : value))); return mp.addX(SV.getVariableMap(key)); } Modified: trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java =================================================================== --- trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2014-03-30 15:24:51 UTC (rev 19541) +++ trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2014-03-30 19:34:29 UTC (rev 19542) @@ -1569,7 +1569,7 @@ if (s != null) info.put("jvxlInfo", s.replace('\n', ' ')); info.put("modelIndex", Integer.valueOf(mesh.modelIndex)); - info.put("color", CU.colorPtFromInt2(C + info.put("color", CU.colorPtFromInt(C .getArgb(mesh.colix))); if (mesh.colorEncoder != null) info.put("colorKey", mesh.colorEncoder.getColorKey()); Modified: trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java =================================================================== --- trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java 2014-03-30 15:24:51 UTC (rev 19541) +++ trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java 2014-03-30 19:34:29 UTC (rev 19542) @@ -469,7 +469,7 @@ if (jvxlData.contourColixes != null) { // set in SurfaceReader.colorData() for (int i = 0; i < jvxlData.contourColixes.length; i++) { - colors.addLast(CU.colorPtFromInt2(C + colors.addLast(CU.colorPtFromInt(C .getArgb(jvxlData.contourColixes[i]))); } ht.put("colors", colors); Modified: trunk/Jmol/src/org/jmol/util/ColorEncoder.java =================================================================== --- trunk/Jmol/src/org/jmol/util/ColorEncoder.java 2014-03-30 15:24:51 UTC (rev 19541) +++ trunk/Jmol/src/org/jmol/util/ColorEncoder.java 2014-03-30 19:34:29 UTC (rev 19542) @@ -534,7 +534,7 @@ for (int i = 0; i < segmentCount; i++) { values[i] = (isReversed ? hi - i * quantum : lo + i * quantum); - colors.addLast(CU.colorPtFromInt2(getArgb(values[i] + f))); + colors.addLast(CU.colorPtFromInt(getArgb(values[i] + f))); } values[segmentCount] = (isReversed ? lo : hi); info.put("values", values); Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-03-30 15:24:51 UTC (rev 19541) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-03-30 19:34:29 UTC (rev 19542) @@ -1752,7 +1752,7 @@ public P3 getColorPointForPropertyValue(float val) { // x = {atomno=3}.partialcharge.color - return CU.colorPtFromInt2(gdata.getColorArgbOrGray(cm + return CU.colorPtFromInt(gdata.getColorArgbOrGray(cm .getColixForPropertyValue(val))); } Modified: trunk/Jmol/src/org/openscience/jmol/app/webexport/Widgets.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/webexport/Widgets.java 2014-03-30 15:24:51 UTC (rev 19541) +++ trunk/Jmol/src/org/openscience/jmol/app/webexport/Widgets.java 2014-03-30 19:34:29 UTC (rev 19542) @@ -102,7 +102,7 @@ @Override String getJavaScript(int appletID, JmolInstance instance) { - P3 ptRGB = CU.colorPtFromInt2(instance.bgColor); + P3 ptRGB = CU.colorPtFromInt(instance.bgColor); return "<table><tbody><tr><td style=\"min-width:70px;\">" + GT.escapeHTML(GT._("background color:")) + "</td><td style=\"min-width:70px;\"><script type = 'text/javascript'>" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-04-08 18:45:03
|
Revision: 19617 http://sourceforge.net/p/jmol/code/19617 Author: hansonr Date: 2014-04-08 18:44:53 +0000 (Tue, 08 Apr 2014) Log Message: ----------- ___JmolVersion="14.1.14_2014.04.08" new feature: select leadAtom(s) -- selects *.CA, *.P and terminal O in nucleotides new feature: set backboneSteps TRUE -- draws base pair steps between dssr-identified base pairs new feature: load =1msy/dssr -- very simple RCSB/DSSR connection -- loads both files: FileManager opening 1 http://www.rcsb.org/pdb/files/1msy.pdb.gz FileManager opening 1 http://x3dna.bio.columbia.edu/dssr?id=1msy load =1msy/dssr set backboneSteps backbone -0.2 select within(dssr,"helices") color blue select within(dssr,"stems") color red select within (dssr,"singleStranded") color white select within (dssr,"multiplets") color green select within (dssr,"lonePairs") color orange select leadatom spacefill 1.5 label %[group1] font label 24 bold set labeloffset 0 0 color label grey Modified Paths: -------------- trunk/Jmol/src/javajs/util/M3.java trunk/Jmol/src/org/jmol/api/JmolDSSRParser.java trunk/Jmol/src/org/jmol/dssr/DSSRParser.java trunk/Jmol/src/org/jmol/modelset/AtomCollection.java trunk/Jmol/src/org/jmol/modelset/ModelCollection.java trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java trunk/Jmol/src/org/jmol/modelsetbio/NucleicMonomer.java trunk/Jmol/src/org/jmol/modelsetbio/NucleicPolymer.java trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java trunk/Jmol/src/org/jmol/renderbio/BackboneRenderer.java trunk/Jmol/src/org/jmol/script/ScriptEval.java trunk/Jmol/src/org/jmol/script/ScriptExpr.java trunk/Jmol/src/org/jmol/script/T.java trunk/Jmol/src/org/jmol/viewer/ActionManager.java trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/PropertyManager.java trunk/Jmol/src/org/jmol/viewer/TransformManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java Added Paths: ----------- trunk/Jmol/src/org/jmol/modelsetbio/BasePair.java Modified: trunk/Jmol/src/javajs/util/M3.java =================================================================== --- trunk/Jmol/src/javajs/util/M3.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/javajs/util/M3.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -608,20 +608,24 @@ /** * 3D ball rotation from dx dy in-plane mouse motion + * adapted from Andrew Hanson + * Computer Graphics beyond the Third Dimension: + * Geometry, Orientation Control, and Rendering for + * Graphics in Dimensions Greater than Three + * Course Notes for SIGGRAPH ’98 + * http://www.cse.ohio-state.edu/~hwshen/888_su02/hanson_note.pdf * - * @param scale Jmol uses 50 here + * @param responseFactor Jmol uses 0.02 here * @param dx * @param dy - * @author Andrew Hanson -- see http://www.cse.ohio-state.edu/~hwshen/888_su02/hanson_note.pdf */ - public void setAsBallRotation(float scale, float dx, float dy) { - float dxy2 = dx * dx + dy * dy; - float sxy = (float) Math.sqrt(dxy2); - float th = sxy / scale; + public void setAsBallRotation(float responseFactor, float dx, float dy) { + float r = (float) Math.sqrt(dx * dx + dy * dy); + float th = r * responseFactor; float c = (float) Math.cos(th); float s = (float) Math.sin(th); - float nx = -dy / sxy; - float ny = dx / sxy; + float nx = -dy / r; + float ny = dx / r; float c1 = c - 1; m00 = 1 + c1 * nx * nx; m01 = m10 = c1 * nx * ny; Modified: trunk/Jmol/src/org/jmol/api/JmolDSSRParser.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolDSSRParser.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/api/JmolDSSRParser.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -12,6 +12,8 @@ String process(Map<String, Object> info, GenericLineReader reader) throws Exception; - BS getAtomBits(String key, Object dssr, Map<String, BS> dssrCache, Viewer vwr); + BS getAtomBits(Viewer vwr, String key, Object dssr, Map<String, BS> dssrCache); + void setAllDSSRParametersForModel(Viewer vwr, int modelIndex); + } Modified: trunk/Jmol/src/org/jmol/dssr/DSSRParser.java =================================================================== --- trunk/Jmol/src/org/jmol/dssr/DSSRParser.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/dssr/DSSRParser.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -34,6 +34,11 @@ import org.jmol.api.JmolDSSRParser; import org.jmol.java.BS; +import org.jmol.modelsetbio.BasePair; +import org.jmol.modelsetbio.BioModel; +import org.jmol.modelsetbio.BioPolymer; +import org.jmol.modelsetbio.NucleicMonomer; +import org.jmol.modelsetbio.NucleicPolymer; import org.jmol.script.T; import org.jmol.viewer.Viewer; @@ -73,13 +78,13 @@ break; case 5: case 10: - getList(n, "helices", "helix#", true); + getHelixOrStem(n, "helices", "helix", true); break; case 15: readNTList(null, "multiplets", n); break; case 20: - getList(n, "stems", "stem#", false); + getHelixOrStem(n, "stems", "stem", false); break; case 25: readStacks(n); @@ -94,7 +99,7 @@ readJunctions(n); break; case 45: - readNTList(null, "singleStrandedSegments", n); + readNTList(null, "singleStranded", n); break; case 50: readMotifs(n); @@ -379,7 +384,7 @@ pairs = newList("basePairs"); skipHeader(); for (int i = 0; i < n; i++) - pairs.addLast(getBPData(null, true)); + pairs.addLast(getBPData(null, null, true)); } /* @@ -439,7 +444,7 @@ */ - private Map<String, Object> getBPData(Lst<Object> ntList, boolean readParams) throws Exception { + private Map<String, Object> getBPData(String type, Lst<Object> ntList, boolean readParams) throws Exception { String[] tokens = PT.getTokens(line); String nt12 = tokens[1] + tokens[2]; @SuppressWarnings("unchecked") @@ -463,6 +468,7 @@ data.put("DSSR", tokens[++pt]); htTemp.put(nt12, data); } else { + data.put(type + "Id", tokens[0]); ntList.addLast(data); } if (readParams) @@ -533,15 +539,15 @@ return list; } - private void getList(int n, String key, String htKey, boolean getHelixParams) throws Exception { + private void getHelixOrStem(int n, String key, String type, boolean isHelix) throws Exception { Lst<Map<String, Object>>list = newList(key); for (int i = 0; i < n; i++) { - skipTo(" " + htKey); + skipTo(" " + type + "#"); int bps = PT.parseInt(after(line,"=")); Map<String, Object> data = new Hashtable<String, Object>(); String header = getHeader(); data.put("info", header); - if (getHelixParams) { + if (isHelix) { String[] lines = PT.split(header, "\n"); if (lines.length == 8) { data.put("helicalAxisData", after(lines[5], "s")); @@ -552,15 +558,14 @@ // point-two: 56.822 32.522 100.293 } } - list.addLast(data); Lst<Map<String, Object>>pairs = new Lst<Map<String, Object>>(); data.put("basePairs", pairs); Lst<Object> ntList = new Lst<Object>(); - htTemp.put(htKey + (i + 1), ntList); - for (int j = 0; j < bps; j++) - pairs.addLast(getBPData(ntList, getHelixParams)); + htTemp.put(type + "#" + (i + 1), ntList); + for (int j = 0; j < bps; j++) + pairs.addLast(getBPData(type, ntList, isHelix)); } } @@ -578,10 +583,10 @@ String[] tokens = PT.getTokens(rd()); int pt = (tokens[0].startsWith("nts") ? 0 : 1); if (tokens.length > pt + 2) { - data.put("n", Integer.valueOf(PT.replaceAllCharacters(after(tokens[pt], "="), "*;", ""))); + data.put("nres", Integer.valueOf(PT.replaceAllCharacters(after(tokens[pt], "="), "*;", ""))); data.put("seq", tokens[++pt]); - data.put("nt", getNT(tokens[++pt], false)); - data.put("resno", getNT(tokens[pt], true)); + data.put("nts", getNT(tokens[++pt], false)); + data.put("resnos", getNT(tokens[pt], true)); } return data; } @@ -590,7 +595,7 @@ String[] tokens = PT.split(s, ","); Lst<Object> list = new Lst<Object>(); for (int i = 0; i < tokens.length; i++) - list.addLast(fix(tokens[i], isResno)); + list.addLast(fix(tokens[i], !isResno)); return list; } @@ -653,9 +658,13 @@ return (line = reader.readNextLine()); } + + ///////////////////// post-load processing //////////////// + @Override - public BS getAtomBits(String key, Object dssr, Map<String, BS> dssrCache, Viewer vwr) { - if (key.indexOf("Pairs") < 0 && key.indexOf("linkedBy") < 0) + public BS getAtomBits(Viewer vwr, String key, Object dssr, Map<String, BS> dssrCache) { + if (key.indexOf("Pairs") < 0 && key.indexOf("linkedBy") < 0 + && key.indexOf("multiplets") < 0 && key.indexOf("singleStrand") < 0) key += ".basePairs"; if (key.indexOf(".res") < 0) key += ".res*"; @@ -664,23 +673,62 @@ if (bs == null) { dssrCache.put(key, bs = new BS()); Object data = vwr.extractProperty(dssr, key, -1); - if (!data.equals("")) { - String[] tokens = PT.getTokens(PT.replaceAllCharacters(data.toString(), "[,]", " ")); - for (int j = tokens.length; --j >= 0;) { - String t = tokens[j]; - int pt = t.indexOf(":"); - if (pt < 0) - continue; - String chain = t.substring(pt + 1); - BS bsChain = htChains.get(chain); - if (bsChain == null) - htChains.put(chain, bsChain = vwr.ms.getAtoms(T.spec_chain, Integer.valueOf(vwr.getChainID(chain)))); - BS bsRes = vwr.ms.getAtoms(T.resno, Integer.valueOf(t.substring(0, pt))); - bsRes.and(bsChain); - bs.or(bsRes); - } - } + if (!data.equals("")) + getBsAtoms(vwr, data, bs, htChains); } return bs; } + + private void getBsAtoms(Viewer vwr, Object data, BS bs, Map<String, BS> htChains) { + String[] tokens = PT.getTokens(PT.replaceAllCharacters(data.toString(), "[,]", " ")); + for (int j = tokens.length; --j >= 0;) { + String t = tokens[j]; + int pt = t.indexOf(":"); + if (pt < 0) + continue; + String chain = t.substring(pt + 1); + BS bsChain = htChains.get(chain); + if (bsChain == null) + htChains.put(chain, bsChain = vwr.ms.getAtoms(T.spec_chain, Integer.valueOf(vwr.getChainID(chain)))); + BS bsRes = vwr.ms.getAtoms(T.resno, Integer.valueOf(t.substring(0, pt))); + bsRes.and(bsChain); + bs.or(bsRes); + } + } + + @SuppressWarnings("unchecked") + @Override + public void setAllDSSRParametersForModel(Viewer vwr, int modelIndex) { + Object info = vwr.ms.getInfo(modelIndex, "dssr"); + if (info != null) + info = ((Map<String, Object>) info).get("basePairs"); + if (info == null) { + BioModel m = (BioModel) vwr.ms.am[modelIndex]; + int n = m.getBioPolymerCount(); + for (int i = n; --i >= 0;) { + BioPolymer bp = m.getBioPolymer(i); + if (bp.isNucleic()) + ((NucleicPolymer) bp).isDssrSet = true; + } + return; + } + Lst<Map<String, Object>> lst = (Lst<Map<String, Object>>) info; + Map<String, BS> htChains = new Hashtable<String, BS>(); + BS bs = new BS(); + for (int i = lst.size(); --i >= 0;) { + Map<String, Object> bpInfo = lst.get(i); + new BasePair(bpInfo, setPhos(vwr, 1, bpInfo, bs, htChains), setPhos(vwr, + 2, bpInfo, bs, htChains)); + } + } + + private NucleicMonomer setPhos(Viewer vwr, int n, Map<String, Object> bp, + BS bs, Map<String, BS> htChains) { + bs.clearAll(); + getBsAtoms(vwr, bp.get("res" + n), bs, htChains); + NucleicMonomer group = (NucleicMonomer) vwr.ms.at[bs.nextSetBit(0)].getGroup(); + ((NucleicPolymer) group.getBioPolymer()).isDssrSet = true; + return group; + } + } Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -2115,6 +2115,11 @@ if (at[i].getElementNumber() == 1) bs.set(i); break; + case T.leadatom: + for (i = ac; --i >= 0;) + if (at[i].isLeadAtom()) + bs.set(i); + break; case T.protein: for (i = ac; --i >= 0;) if (at[i].isProtein()) Modified: trunk/Jmol/src/org/jmol/modelset/ModelCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -1850,10 +1850,10 @@ if ((dssr = getInfo(i, "dssr")) != null) bs.or(p .getAtomBits( + vwr, (String) specInfo, - dssr, - (am[i].dssrCache == null ? am[i].dssrCache = new Hashtable<String, BS>() - : am[i].dssrCache), vwr)); + dssr, (am[i].dssrCache == null ? am[i].dssrCache = new Hashtable<String, BS>() + : am[i].dssrCache))); return bs; case T.bonds: case T.isaromatic: Added: trunk/Jmol/src/org/jmol/modelsetbio/BasePair.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BasePair.java (rev 0) +++ trunk/Jmol/src/org/jmol/modelsetbio/BasePair.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -0,0 +1,22 @@ +package org.jmol.modelsetbio; + +import java.util.Map; + +public class BasePair { + Map<String, Object> info; + public NucleicMonomer g1; + public NucleicMonomer g2; + + public BasePair(Map<String, Object> info, NucleicMonomer g1, NucleicMonomer g2) { + this.info = info; + this.g1 = g1; + g1.addBasePair(this); + this.g2 = g2; + g2.addBasePair(this); + } + + public int getPartnerAtom(NucleicMonomer g) { + return (g == g1 ? g2 : g1).getLeadAtom().i; + } + +} Property changes on: trunk/Jmol/src/org/jmol/modelsetbio/BasePair.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -990,14 +990,14 @@ return (float) (1 - 2 * Math.acos(Math.abs(cosHalfTheta)) / Math.PI); } - public boolean isDna() { - return (monomerCount > 0 && monomers[0].isDna()); - } - public boolean isRna() { return (monomerCount > 0 && monomers[0].isRna()); } + public boolean isNucleic() { + return (monomerCount > 0 && (monomers[0].isDna() || monomers[0].isRna())); + } + public void getRangeGroups(int nResidues, BS bsAtoms, BS bsResult) { BS bsTemp = new BS(); for (int i = 0; i < monomerCount; i++) { Modified: trunk/Jmol/src/org/jmol/modelsetbio/NucleicMonomer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/NucleicMonomer.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/modelsetbio/NucleicMonomer.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -24,14 +24,12 @@ */ package org.jmol.modelsetbio; - - - import org.jmol.c.STR; import org.jmol.modelset.Atom; import org.jmol.modelset.Bond; import org.jmol.modelset.Group; import org.jmol.modelset.Chain; + import javajs.util.Lst; import javajs.util.P3; import javajs.util.Quat; @@ -544,4 +542,18 @@ } } + private Lst<BasePair> bps; + public void addBasePair(BasePair bp) { + if (bps == null) + bps = new Lst<BasePair>(); + bps.addLast(bp); + } + + public Lst<BasePair> getBasePairs() { + if (!((NucleicPolymer) bioPolymer).isDssrSet) + bioPolymer.model.ms.vwr.getDSSRParser().setAllDSSRParametersForModel(bioPolymer.model.ms.vwr, bioPolymer.model.modelIndex); + return bps; + } + + } Modified: trunk/Jmol/src/org/jmol/modelsetbio/NucleicPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/NucleicPolymer.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/modelsetbio/NucleicPolymer.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -49,6 +49,8 @@ public class NucleicPolymer extends BioPolymer { + public boolean isDssrSet; + NucleicPolymer(Monomer[] monomers) { super(monomers); type = TYPE_NUCLEIC; @@ -172,5 +174,6 @@ boolean addHeader, LabelToken[] tokens, OC pdbATOM, SB pdbCONECT, BS bsWritten) { getPdbData(vwr, this, ctype, qtype, mStep, derivType, bsAtoms, bsSelected, bothEnds, isDraw, addHeader, tokens, pdbATOM, pdbCONECT, bsWritten); - } + } + } Modified: trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -375,9 +375,8 @@ } @Override - protected float getDegrees(int delta, int i) { - int dim = (i == 0 ? vwr.getScreenWidth() : vwr.getScreenHeight()); - return ((float) delta) / dim * 180 * mouseDragFactor; + protected float getDegrees(float delta, boolean isX) { + return delta / (isX ? vwr.getScreenWidth() : vwr.getScreenHeight()) * 180 * mouseDragFactor; } } Modified: trunk/Jmol/src/org/jmol/renderbio/BackboneRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/renderbio/BackboneRenderer.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/renderbio/BackboneRenderer.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -25,41 +25,64 @@ package org.jmol.renderbio; +import javajs.util.Lst; + import org.jmol.modelset.Atom; +import org.jmol.modelsetbio.BasePair; +import org.jmol.modelsetbio.NucleicMonomer; +import org.jmol.script.T; import org.jmol.shapebio.BioShape; import org.jmol.util.C; import org.jmol.util.GData; public class BackboneRenderer extends BioShapeRenderer { + private boolean isDataFrame; + @Override protected void renderBioShape(BioShape bioShape) { - boolean isDataFrame = vwr.isJmolDataFrameForModel(bioShape.modelIndex); + boolean showSteps = vwr.getBoolean(T.backbonesteps) + && bioShape.bioPolymer.isNucleic(); + isDataFrame = vwr.isJmolDataFrameForModel(bioShape.modelIndex); for (int i = bsVisible.nextSetBit(0); i >= 0; i = bsVisible .nextSetBit(i + 1)) { Atom atomA = ms.at[leadAtomIndices[i]]; - Atom atomB = ms.at[leadAtomIndices[i + 1]]; - if (atomA.getNBackbonesDisplayed() == 0 - || atomB.getNBackbonesDisplayed() == 0 - || ms.isAtomHidden(atomB.i)) - continue; - if (!isDataFrame && atomA.distance(atomB) > 10) - continue; - short colixA = C.getColixInherited(colixes[i], atomA.getColix()); - short colixB = C.getColixInherited(colixes[i + 1], atomB.getColix()); - if (!isExport && !isPass2 && !setBioColix(colixA) && !setBioColix(colixB)) - continue; - int xA = atomA.sX, yA = atomA.sY, zA = atomA.sZ; - int xB = atomB.sX, yB = atomB.sY, zB = atomB.sZ; + short cA = colixes[i]; mad = mads[i]; - if (mad < 0) { - g3d.drawLine(colixA, colixB, xA, yA, zA, xB, yB, zB); - } else { - int width = (int) (exportType == GData.EXPORT_CARTESIAN ? mad : vwr - .scaleToScreen((zA + zB) / 2, mad)); - g3d.fillCylinderXYZ(colixA, colixB, GData.ENDCAPS_SPHERICAL, width, xA, - yA, zA, xB, yB, zB); + drawSegment(atomA, ms.at[leadAtomIndices[i + 1]], cA, colixes[i + 1], 100); + if (showSteps) { + NucleicMonomer g = (NucleicMonomer) monomers[i]; + Lst<BasePair> bps = g.getBasePairs(); + if (bps != null) { + for (int j = bps.size(); --j >= 0;) { + int iAtom = bps.get(j).getPartnerAtom(g); + if (iAtom > i) + drawSegment(atomA, ms.at[iAtom], cA, cA, 1000); + } + } } } + } + + private void drawSegment(Atom atomA, Atom atomB, short colixA, short colixB, float max) { + if (atomA.getNBackbonesDisplayed() == 0 + || atomB.getNBackbonesDisplayed() == 0 + || ms.isAtomHidden(atomB.i) + || !isDataFrame && atomA.distanceSquared(atomB) > max) + return; + colixA = C.getColixInherited(colixA, atomA.getColix()); + colixB = C.getColixInherited(colixB, atomB.getColix()); + if (!isExport && !isPass2 && !setBioColix(colixA) && !setBioColix(colixB)) + return; + int xA = atomA.sX, yA = atomA.sY, zA = atomA.sZ; + int xB = atomB.sX, yB = atomB.sY, zB = atomB.sZ; + if (mad < 0) { + g3d.drawLine(colixA, colixB, xA, yA, zA, xB, yB, zB); + } else { + int width = (int) (exportType == GData.EXPORT_CARTESIAN ? mad : vwr + .scaleToScreen((zA + zB) / 2, mad)); + g3d.fillCylinderXYZ(colixA, colixB, GData.ENDCAPS_SPHERICAL, width, xA, + yA, zA, xB, yB, zB); + } } } Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -4634,10 +4634,16 @@ boolean timeMsg = vwr.getBoolean(T.showtiming); if (timeMsg) Logger.startTimer("load"); - if (isConcat) - htParams.put("concatenate", Boolean.TRUE); + if (!isConcat && filename.length() == 10 && filename.startsWith("=") && filename.endsWith("/dssr")) { + // load =1mys/dssr + isConcat = true; + filenames = new String[] {filename.substring(0, 5), "=dssr/" + filename.substring(1,5)}; + filename = "fileSet"; + loadScript = null; + htParams.remove("loadScript"); + } errMsg = vwr.loadModelFromFile(null, filename, filenames, null, isAppend, - htParams, loadScript, tokType); + htParams, loadScript, tokType, isConcat); if (out != null) { vwr.setFileInfo(new String[] { localName }); Logger.info(GT.o(GT._("file {0} created"), localName)); Modified: trunk/Jmol/src/org/jmol/script/ScriptExpr.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptExpr.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/script/ScriptExpr.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -801,6 +801,7 @@ case T.hetero: case T.isaromatic: case T.nucleic: + case T.leadatom: case T.protein: case T.purine: case T.pyrimidine: Modified: trunk/Jmol/src/org/jmol/script/T.java =================================================================== --- trunk/Jmol/src/org/jmol/script/T.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/script/T.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -436,6 +436,7 @@ public final static int helix310 = predefinedset | 8; // Jmol 12.1.14 public final static int helixpi = predefinedset | 10; public final static int hydrogen = predefinedset | 12 | deprecatedparam; + public final static int leadatom = predefinedset | 13; public final static int nucleic = predefinedset | 14; public final static int protein = predefinedset | 16; public final static int purine = predefinedset | 18; @@ -961,14 +962,15 @@ public final static int axesorientationrasmol = booleanparam | 30; public final static int axesunitcell = booleanparam | 32; public final static int axeswindow = booleanparam | 34; + public final static int backbonesteps = booleanparam | 35; public final static int bondmodeor = booleanparam | 36; public final static int bondpicking = booleanparam | 38; // set mathproperty public final static int bonds = booleanparam | 40; - public final static int cartoonbaseedges = booleanparam | 41; - public final static int cartoonrockets = booleanparam | 42; - public final static int cartoonsfancy = booleanparam | 43; - public final static int cartoonladders = booleanparam | 44; - public final static int cartoonribose = booleanparam | 45; + public final static int cartoonbaseedges = booleanparam | 40; + public final static int cartoonsfancy = booleanparam | 41; + public final static int cartoonladders = booleanparam | 42; + public final static int cartoonribose = booleanparam | 43; + public final static int cartoonrockets = booleanparam | 44; public final static int celshading = booleanparam | 46; public final static int chaincasesensitive = booleanparam | 47; public final static int colorrasmol = booleanparam | 48; @@ -2440,6 +2442,7 @@ "axesOrientationRasmol", "axesUnitCell", "axesWindow", + "backboneSteps", "bondModeOr", "bondPicking", "bonds", @@ -2492,6 +2495,8 @@ "isosurfacePropertySmoothingPower", "justifyMeasurements", "languageTranslation", + "leadAtom", + "leadAtoms", "legacyAutoBonding", "legacyHAddition", "logCommands", @@ -3432,6 +3437,7 @@ axesorientationrasmol, // "axesOrientationRasmol" axesunitcell, // "axesUnitCell" axeswindow, // "axesWindow" + backbonesteps, // "backboneSteps" bondmodeor, // "bondModeOr" bondpicking, // "bondPicking" bonds, // "bonds" @@ -3484,6 +3490,8 @@ isosurfacepropertysmoothingpower, // "isosurfacePropertySmoothingPower" justifymeasurements, // "justifyMeasurements" languagetranslation, // "languageTranslation" + leadatom, // "leadAtom" + -1, // "leadAtoms" legacyautobonding, // "legacyAutoBonding" legacyhaddition, // "legacyHAddition" logcommands, // "logCommands" Modified: trunk/Jmol/src/org/jmol/viewer/ActionManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -1179,7 +1179,7 @@ setMotion(GenericPlatform.CURSOR_MOVE, true); if (bnd(dragWheelAction, ACTION_rotateSelected) && vwr.getBoolean(T.allowrotateselected)) { - vwr.rotateSelected(getDegrees(deltaX, 0), getDegrees(deltaY, 1), + vwr.rotateSelected(getDegrees(deltaX, true), getDegrees(deltaY, false), null); } else { vwr.moveSelected(deltaX, deltaY, (bnd(dragWheelAction, @@ -1201,7 +1201,7 @@ true); setMotion(GenericPlatform.CURSOR_MOVE, true); if (bnd(dragWheelAction, ACTION_rotateSelected)) { - vwr.rotateSelected(getDegrees(deltaX, 0), getDegrees(deltaY, 1), + vwr.rotateSelected(getDegrees(deltaX, true), getDegrees(deltaY, false), bs); } else { switch (apm) { @@ -1264,7 +1264,7 @@ setMotion(GenericPlatform.CURSOR_MOVE, true); if (bnd(dragWheelAction, ACTION_rotateSelected) && vwr.getBoolean(T.allowrotateselected)) - vwr.rotateSelected(getDegrees(deltaX, 0), getDegrees(deltaY, 1), + vwr.rotateSelected(getDegrees(deltaX, true), getDegrees(deltaY, false), null); else vwr.moveSelected(deltaX, deltaY, Integer.MIN_VALUE, @@ -1288,8 +1288,8 @@ return; } if (bnd(dragWheelAction, ACTION_rotate)) { - float degX = getDegrees(deltaX, 0); - float degY = getDegrees(deltaY, 1); + float degX = getDegrees(deltaX, true); + float degY = getDegrees(deltaY, false); if (vwr.g.useArcBall) vwr.rotateArcBall(x, y, mouseDragFactor); else @@ -1631,11 +1631,18 @@ } } - protected float getDegrees(int delta, int i) { - int dim = (i == 0 ? vwr.getScreenWidth() : vwr.getScreenHeight()); - if (dim > 500) - dim = 500; - return ((float) delta) / dim * 180 * mouseDragFactor; + /** + * Transform a screen pixel change to an angular change + * such that a full sweep of the dimension (up to 500 pixels) + * corresponds to 180 degrees of rotation. + * + * @param delta + * @param isX + * @return desired scaled rotation, in degrees + */ + protected float getDegrees(float delta, boolean isX) { + return delta / Math.min(500, isX ? vwr.getScreenWidth() + : vwr.getScreenHeight()) * 180 * mouseDragFactor; } private boolean checkSlideZoom(int action) { Modified: trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -227,6 +227,7 @@ setI("axesMode", axesMode.getCode()); setF("axesScale", axesScale); setB("axesOrientationRasmol", axesOrientationRasmol); + setB("backboneSteps", backboneSteps); setB("bondModeOr", bondModeOr); setB("bondPicking", bondPicking); setI("bondRadiusMilliAngstroms", bondRadiusMilliAngstroms); @@ -550,6 +551,7 @@ boolean cartoonBaseEdges = false; boolean cartoonRockets = false; + boolean backboneSteps = false; boolean cartoonFancy = false; boolean cartoonLadders = false; boolean cartoonRibose = false; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-04-08 18:44:53 UTC (rev 19617) @@ -8,11 +8,45 @@ # add it on a line below the "___JmolVersion=..." line. # Don't use ___ in your text, as that is the key for stripping out # the information saved in the JAR version of this file. -# The quotes above look odd for a parameter file, but they are +# The quotes above look odd for a parameter file, but they are # important for the JavaScript version of Jmol. -___JmolVersion="14.1.14_2014.04.07" +___JmolVersion="14.1.14_2014.04.08" + +new feature: select leadAtom(s) + -- selects *.CA, *.P and terminal O in nucleotides +new feature: set backboneSteps TRUE + -- draws base pair steps between dssr-identified base pairs + +new feature: load =1msy/dssr + -- very simple RCSB/DSSR connection + -- loads both files: + FileManager opening 1 http://www.rcsb.org/pdb/files/1msy.pdb.gz + FileManager opening 1 http://x3dna.bio.columbia.edu/dssr?id=1msy + + load =1msy/dssr + set backboneSteps + backbone -0.2 + select within(dssr,"helices") + color blue + select within(dssr,"stems") + color red + select within (dssr,"singleStranded") + color white + select within (dssr,"multiplets") + color green + select within (dssr,"lonePairs") + color orange + select leadatom + spacefill 1.5 + label %[group1] + font label 24 bold + set labeloffset 0 0 + color label grey + +JmolVersion="14.1.14_2014.04.07" + code: T4 generalized as extending T3, allowing 4D mesh reading. code: implementation of Andrew Hanson's 3D Ball Roll mouse algorithm -- no significant practical improvement, but nicer mathematics Modified: trunk/Jmol/src/org/jmol/viewer/PropertyManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -275,7 +275,8 @@ Lst<Object> v = (Lst<Object>) property; if (pt < 0) pt += v.size(); - return (pt >= 0 && pt < v.size()? extractProperty(v.get(pt), args, ptr, null): ""); + return (pt >= 0 && pt < v.size() ? extractProperty(v.get(pt), args, + ptr, null) : ""); } if (property instanceof M3) { M3 m = (M3) property; @@ -374,34 +375,12 @@ if (key.toUpperCase().startsWith("SELECT ")) { key = key.substring(6).trim(); pt = key.toUpperCase().indexOf(" WHERE "); - if (pt >= 0) { + if (pt >= 0) { String where = key.substring(pt + 6).trim(); key = key.substring(0, pt).trim(); - int ptNotLike = where.toUpperCase().indexOf(" NOT LIKE "); - int ptLike = where.toUpperCase().indexOf(" LIKE "); - int ptLT = where.indexOf("<"); - int ptGT = where.indexOf(">"); - int ptEq = where.indexOf("="); - int ptNotEq = where.indexOf("!="); - int pt1; - if (ptNotLike >= 0) - pt1 = (pt = ptNotLike) + 10; - else if (ptLike >= 0) - pt1 = (pt = ptLike) + 6; - else if (ptNotEq >= 0) - pt1 = (pt = ptNotEq) + 2; - else if (ptEq >= 0) - pt1 = (pt = ptEq) + 1; - else if (ptLT >= 0) - pt1 = (pt = ptLT) + 1; - else if (ptGT >= 0) - pt1 = (pt = ptGT) + 1; - else - return ""; - Object val = getObj(h.get(where.substring(0, pt).trim())); - if (val == null || !Txt.isSQLMatch(val, where.substring(pt1).trim(), (ptNotEq >= 0 ? 1 : ptLT >= 0 ? 2 : ptGT>= 0? 3 : ptLike >= 0 ? 4 : ptNotLike >= 0 ? 5 : 0))) + if (checkMap(h, where, false, null, null, 0) == null) return ""; - } + } } boolean isWild = Txt.isWild(key); if (isWild && v2 == null) @@ -410,24 +389,8 @@ v2.addLast(h); return v2; } - boolean isOK = (v2 == null && h.containsKey(key)); - if (!isOK) { - String lckey = (isWild ? PT.rep(key.toLowerCase(), "?", "*") : null); - for (String k : h.keySet()) { - if (k.equalsIgnoreCase(key) || lckey != null - && Txt.isMatch(k.toLowerCase(), lckey, true, true)) { - key = k; - if (v2 == null) { - isOK = true; - break; - } - v2.addLast(extractProperty(h.get(k), args, ptr, null)); - if (!isWild) - break; - } - } - } - return (isOK && !isWild ? extractProperty(h.get(key), args, ptr, null) + key = checkMap(h, key, isWild, v2, args, ptr); + return (key != null && !isWild ? extractProperty(h.get(key), args, ptr, null) : isWild ? v2 : ""); } if (property instanceof Lst<?>) { @@ -439,9 +402,8 @@ ptr--; for (pt = 0; pt < v.size(); pt++) { Object o = v.get(pt); - if (o instanceof Map<?, ?> - || (o instanceof SV) && - (((SV) o).getMap() != null || ((SV) o).getList() != null)) + if (o instanceof Map<?, ?> || (o instanceof SV) + && (((SV) o).getMap() != null || ((SV) o).getList() != null)) extractProperty(o, args, ptr, v2); } return v2; @@ -453,6 +415,62 @@ //// private static methods //// + private String checkMap(Map<String, Object> h, String key, boolean isWild, + Lst<Object> v2, Object args, int ptr) { + String strLike = null; + int likeMode = -1; + if (args == null) { + int pt; + int ptNotLike = key.toUpperCase().indexOf(" NOT LIKE "); + int ptLike = key.toUpperCase().indexOf(" LIKE "); + int ptLT = key.indexOf("<"); + int ptGT = key.indexOf(">"); + int ptEq = key.indexOf("="); + int ptNotEq = key.indexOf("!="); + int pt1; + if (ptNotLike >= 0) + pt1 = (pt = ptNotLike) + 10; + else if (ptLike >= 0) + pt1 = (pt = ptLike) + 6; + else if (ptNotEq >= 0) + pt1 = (pt = ptNotEq) + 2; + else if (ptEq >= 0) + pt1 = (pt = ptEq) + 1; + else if (ptLT >= 0) + pt1 = (pt = ptLT) + 1; + else if (ptGT >= 0) + pt1 = (pt = ptGT) + 1; + else + return null; + strLike = key.substring(pt1).trim(); + key = key.substring(0, pt).trim(); + isWild = Txt.isWild(key); + likeMode = (ptNotEq >= 0 ? 1 : ptLT >= 0 ? 2 : ptGT >= 0 ? 3 + : ptLike >= 0 ? 4 : ptNotLike >= 0 ? 5 : 0); + } + boolean isOK = (likeMode < 0 && v2 == null && h.containsKey(key)); + if (!isOK) { + String lckey = (isWild ? PT.rep(key.toLowerCase(), "?", "*") : null); + for (String k : h.keySet()) { + if (k.equalsIgnoreCase(key) || lckey != null + && Txt.isMatch(k.toLowerCase(), lckey, true, true)) { + if (v2 == null) { + if (likeMode >= 0) { + Object val = getObj(h.get(k)); + if (val == null || !Txt.isSQLMatch(val, strLike, likeMode)) + continue; + } + return k; + } + v2.addLast(extractProperty(h.get(k), args, ptr, null)); + if (!isWild) + return null; + } + } + } + return (isOK ? key : null); + } + private Object getObj(Object prop) { return (prop instanceof SV ? SV.oValue((SV) prop) : prop); } Modified: trunk/Jmol/src/org/jmol/viewer/TransformManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -271,10 +271,14 @@ rotateAxisAngle2(axisangleT, null); } - protected void rotateXYBy(float xDelta, float yDelta, BS bsAtoms) { + protected void rotateXYBy(float degX, float degY, BS bsAtoms) { // from mouse action - rotateXRadians(yDelta * JC.radiansPerDegree, bsAtoms); - rotateYRadians(xDelta * JC.radiansPerDegree, bsAtoms); + if (vwr.getTestFlag(2)) { + rotateXRadians(degY * JC.radiansPerDegree, bsAtoms); + rotateYRadians(degX * JC.radiansPerDegree, bsAtoms); + } else { + rotate3DBall(degX, degY, bsAtoms); + } } void rotateZBy(int zDelta, int x, int y) { @@ -301,9 +305,18 @@ } } - protected void rotate3DBall(float xDelta, float yDelta, BS bsAtoms) { - float scale = 50f; - matrixTemp3.setAsBallRotation(scale, -yDelta, -xDelta); + protected void rotate3DBall(float xDeg, float yDeg, BS bsAtoms) { + // xDeg and yDeg are calibrated to be 180 degrees for + // a full drag across the frame or from top to bottom. + + // Note: We will apply this matrix to the untransformed + // model coordinates, not their screen counterparts. + // Nonetheless, dx and dy are in terms of the screen. + // The swapping of dx and dy, and their reversal in sign + // probably has to do with the fact that we are changing + // the signs of both screen Y and screen Z in the end. + + matrixTemp3.setAsBallRotation(JC.radiansPerDegree, -yDeg, -xDeg); applyRotation(matrixTemp3, false, bsAtoms, null, false); } @@ -1061,6 +1074,7 @@ This is a linear function of p, with 1/f=0 at p = -c, the camera position: + \----------------0----------------/ midplane, p = 0.5, 1/f = 1 \ model center / viewingRange = screenPixelCount @@ -1073,13 +1087,13 @@ \ / \ / The distance across is the distance that is viewable \ / for this Z position. Just magnify a model and place its - \ / center at 0. Whatever part of the model is within the - \ / triangle will be viewed, scaling each distance so that - \ / it ends up screenWidthPixels wide. - \ / - \ / + ^ \ / center at 0. Whatever part of the model is within the + | \ / triangle will be viewed, scaling each distance so that +Z increasing \ / it ends up screenWidthPixels wide. + | \ / + | \ / \ / - X camera position, p = -c, 1/f = 0 + Z = 0 X camera position, p = -c, 1/f = 0 viewingRange = 0 VISUAL RANGE Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -976,12 +976,12 @@ + factor + (x == Integer.MAX_VALUE ? "" : " " + x + " " + y)); } - void rotateXYBy(float xDelta, float yDelta) { + void rotateXYBy(float degX, float degY) { // mouseSinglePressDrag if (mouseEnabled) - tm.rotateXYBy(xDelta, yDelta, null); - refresh(2, sm.syncingMouse ? "Mouse: rotateXYBy " + xDelta + " " - + yDelta : ""); + tm.rotateXYBy(degX, degY, null); + refresh(2, sm.syncingMouse ? "Mouse: rotateXYBy " + degX + " " + + degY : ""); } public void spinXYBy(int xDelta, int yDelta, float speed) { @@ -1807,10 +1807,21 @@ return loadModelFromFileRepaint("?", "?", null, DOMNode); } + /** + * + * for JmolSimpleViewer -- external applications only (and no-script + * JavaScript) + * @param fullPathName + * @param fileName + * @param fileNames + * @param reader + * @return error message or null + * + */ private String loadModelFromFileRepaint(String fullPathName, String fileName, String[] fileNames, Object reader) { String ret = loadModelFromFile(fullPathName, fileName, fileNames, reader, - false, null, null, 0); + false, null, null, 0, false); refresh(1, "loadModelFromFileRepaint"); return ret; } @@ -1830,15 +1841,18 @@ * @param htParams * @param loadScript * @param tokType + * @param isConcat * @return null or error */ public String loadModelFromFile(String fullPathName, String fileName, String[] fileNames, Object reader, boolean isAppend, Map<String, Object> htParams, SB loadScript, - int tokType) { + int tokType, boolean isConcat) { if (htParams == null) htParams = setLoadParameters(null, isAppend); + if (isConcat) + htParams.put("concatenate", Boolean.TRUE); Object atomSetCollection; String[] saveInfo = fm.getFileInfo(); if (fileNames != null) { @@ -1848,7 +1862,7 @@ if (loadScript == null) { loadScript = new SB().append("load files"); for (int i = 0; i < fileNames.length; i++) - loadScript.append(" /*file*/$FILENAME" + (i + 1) + "$"); + loadScript.append(i == 0 || !isConcat ? " " : "+").append("/*file*/$FILENAME" + (i + 1) + "$"); } long timeBegin = System.currentTimeMillis(); @@ -2063,7 +2077,7 @@ return "cannot find string data"; if (loadScript != null) htParams - .put("loadScript", loadScript = new SB().append(javajs.util.PT + .put("loadScript", loadScript = new SB().append(PT .rep(loadScript.toString(), "$FILENAME$", "data \"model inline\"\n" + strModel + "end \"model inline\""))); @@ -5299,6 +5313,8 @@ return g.autoFps; case T.axesorientationrasmol: return g.axesOrientationRasmol; + case T.backbonesteps: + return g.backboneSteps; case T.bondmodeor: return g.bondModeOr; case T.cartoonbaseedges: @@ -6178,6 +6194,10 @@ private void setBooleanPropertyTok(String key, int tok, boolean value) { boolean doRepaint = true; switch (tok) { + case T.backbonesteps: + // 14.1.14 + g.backboneSteps = value; + break; case T.cartoonribose: // 14.1.8 g.cartoonRibose = value; Modified: trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java 2014-04-08 04:35:47 UTC (rev 19616) +++ trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java 2014-04-08 18:44:53 UTC (rev 19617) @@ -1706,7 +1706,7 @@ @Override public void mousePressed(MouseEvent e) { vwr.evalStringQuiet(script); - vwr.evalStringQuiet("timeout '__animBtn' -100 \"" + script + "\""); + vwr.evalStringQuiet("timeout '__animBtn' -200 \"" + script + "\""); } @Override This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-04-10 04:32:51
|
Revision: 19630 http://sourceforge.net/p/jmol/code/19630 Author: hansonr Date: 2014-04-10 04:32:42 +0000 (Thu, 10 Apr 2014) Log Message: ----------- ___JmolVersion="14.1.14_2014.04.10" new feature: calculate structure dssr -- fetching http://x3dna.bio.columbia.edu/dssr/?POST?opts=--hl%20--more&model=[pdb data] -- displays summary report Modified Paths: -------------- trunk/Jmol/src/javajs/util/Rdr.java trunk/Jmol/src/org/jmol/api/JmolDSSRParser.java trunk/Jmol/src/org/jmol/api/JmolPropertyManager.java trunk/Jmol/src/org/jmol/dssr/DSSRParser.java trunk/Jmol/src/org/jmol/modelset/AtomCollection.java trunk/Jmol/src/org/jmol/modelset/ModelCollection.java trunk/Jmol/src/org/jmol/render/AxesRenderer.java trunk/Jmol/src/org/jmol/render/HoverRenderer.java trunk/Jmol/src/org/jmol/renderbio/BackboneRenderer.java trunk/Jmol/src/org/jmol/renderbio/BioShapeRenderer.java trunk/Jmol/src/org/jmol/script/ScriptEval.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/scriptext/MathExt.java trunk/Jmol/src/org/jmol/viewer/AnimationManager.java trunk/Jmol/src/org/jmol/viewer/JC.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/OutputManager.java trunk/Jmol/src/org/jmol/viewer/PropertyManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/javajs/util/Rdr.java =================================================================== --- trunk/Jmol/src/javajs/util/Rdr.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/javajs/util/Rdr.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -36,6 +36,7 @@ import javajs.api.GenericCifDataParser; +import javajs.api.GenericLineReader; import javajs.api.Interface; import javajs.api.GenericZipTools; import javajs.api.ZInputStream; @@ -54,8 +55,19 @@ * * */ -public class Rdr { +public class Rdr implements GenericLineReader { + BufferedReader reader; + + public Rdr(BufferedReader reader) { + this.reader = reader; + } + + @Override + public String readNextLine() throws Exception { + return reader.readLine(); + } + public static GenericCifDataParser getCifParser() { return (GenericCifDataParser) Interface.getInterface("javajs.util.CifDataParser"); } Modified: trunk/Jmol/src/org/jmol/api/JmolDSSRParser.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolDSSRParser.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/api/JmolDSSRParser.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -20,4 +20,6 @@ String getHBonds(Viewer vwr, int modelIndex, Lst<Bond> vHBonds, boolean doReport); + String calculateStructure(Viewer vwr); + } Modified: trunk/Jmol/src/org/jmol/api/JmolPropertyManager.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolPropertyManager.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/api/JmolPropertyManager.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -6,6 +6,7 @@ import org.jmol.java.BS; import javajs.util.Lst; +import javajs.util.OC; import javajs.util.P3; import org.jmol.viewer.Viewer; @@ -37,4 +38,11 @@ String getModelExtract(BS atomBitSet, boolean doTransform, boolean isModelKit, String type); + String getPdbAtomData(BS bs, OC sb); + + String getPdbData(int modelIndex, String type, BS bsA, Object[] parameters, + OC oc, boolean addStructure); + + String getModelCml(BS bs, int nAtomsMax, boolean addBonds); + } Modified: trunk/Jmol/src/org/jmol/dssr/DSSRParser.java =================================================================== --- trunk/Jmol/src/org/jmol/dssr/DSSRParser.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/dssr/DSSRParser.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -30,6 +30,7 @@ import javajs.util.Lst; import javajs.util.P3; import javajs.util.PT; +import javajs.util.Rdr; import javajs.util.SB; import org.jmol.api.JmolDSSRParser; @@ -44,6 +45,7 @@ import org.jmol.script.T; import org.jmol.util.C; import org.jmol.util.Edge; +import org.jmol.util.Logger; import org.jmol.viewer.Viewer; public class DSSRParser implements JmolDSSRParser { @@ -65,9 +67,16 @@ htTemp = new Hashtable<String, Object>(); this.reader = reader; message = new SB(); - addMessage("\nDSSR: a software program for Defining the Secondary"); + // output the header section with credits + line = rd(); + if (line.indexOf("***") >= 0) { + addMessage(rd().trim()); + rd(); + } else { + addMessage("\nDSSR: a software program for Defining the Secondary"); + } + addMessage(line.trim()); addMessage(rd().trim()); - addMessage(rd().trim()); boolean haveHeader = false; while (rd() != null) { if (line.startsWith("List of")) { @@ -809,4 +818,38 @@ return "DSSR reports " + list.size() + " hydrogen bonds"; } + @SuppressWarnings("unchecked") + @Override + public String calculateStructure(Viewer vwr) { + int modelIndex = vwr.getVisibleFramesBitSet().nextSetBit(0); + Map<String, Object> info = null; + String out = null; + while (true) { + if (!vwr.ms.am[modelIndex].isBioModel) + break; + info = vwr.ms.getModelAuxiliaryInfo(modelIndex); + if (info.containsKey("dssr")) + break; + BS bs = vwr.getModelUndeletedAtomsBitSet(modelIndex); + bs.and(vwr.ms.getAtoms(T.nucleic, null)); + if (bs.nextClearBit(0) < 0) { + info = null; + break; + } + try { + String name = (String) vwr.setLoadFormat("=dssrModel/", '=', false); + Logger.info("fetching " + name + "[pdb data]"); + String data = vwr.getPdbAtomData(bs, null); + data = vwr.getFileAsString(name + data, false); + vwr.getDSSRParser().process(info, new Rdr(Rdr.getBR(data))); + } catch (Exception e) { + info = null; + out = "" + e; + } + break; + } + return (info != null ? (String) ((Map<String, Object>) info + .get("dssr")).get("summary") : out == null ? "model has no nucleotides" : out); + } + } Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -267,13 +267,6 @@ return (i < 0 ? null : at[i].group.getQuaternion(qtype)); } - public Object getHelixData(BS bs, int tokType) { - int iAtom = bs.nextSetBit(0); - return (iAtom < 0 ? "null" - : at[iAtom].group.getHelixData(tokType, - vwr.getQuaternionFrame(), vwr.getInt(T.helixstep))); - } - public int getAtomIndexFromAtomNumber(int atomNumber, BS bsVisibleFrames) { //definitely want FIRST (model) not last here for (int i = 0; i < ac; i++) { Modified: trunk/Jmol/src/org/jmol/modelset/ModelCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -27,7 +27,6 @@ import javajs.J2SIgnoreImport; import javajs.util.AU; -import javajs.util.OC; import javajs.util.Lst; import javajs.util.P3; import javajs.util.P4; @@ -35,9 +34,7 @@ import javajs.util.Quat; import javajs.util.SB; import javajs.util.T3; -import javajs.util.XmlUtil; -import java.util.Date; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; @@ -76,7 +73,6 @@ import org.jmol.viewer.ShapeManager; import org.jmol.java.BS; import org.jmol.script.T; -import org.jmol.viewer.Viewer; @J2SIgnoreImport({javajs.util.XmlUtil.class}) abstract public class ModelCollection extends BondCollection { @@ -1092,204 +1088,6 @@ return v.toArray(new Quat[v.size()]); } - /** - * PDB or PQR only - * - * @param bs - * selected atoms - * @param out - * StringXBuilder or BufferedWriter - * @return PDB file data string - */ - public String getPdbAtomData(BS bs, OC out) { - if (ac == 0 || bs.nextSetBit(0) < 0) - return ""; - if (out == null) - out = vwr.getOutputChannel(null, null); - int iModel = at[bs.nextSetBit(0)].mi; - int iModelLast = -1; - boolean isPQR = "PQR".equals(out.getType()); - String occTemp = "%6.2Q%6.2b "; - if (isPQR) { - occTemp = "%8.4P%7.4V "; - float charge = 0; - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) - charge += at[i].getPartialCharge(); - out.append( - "REMARK 1 PQR file generated by Jmol " + Viewer.getJmolVersion()) - .append("\nREMARK 1 " + "created " + (new Date())) - .append("\nREMARK 1 Forcefield Used: unknown\nREMARK 1") - .append("\nREMARK 5") - .append( - "\nREMARK 6 Total charge on this protein: " + charge - + " e\nREMARK 6\n"); - } - int lastAtomIndex = bs.length() - 1; - boolean showModels = (iModel != at[lastAtomIndex].mi); - SB sbCONECT = (showModels ? null : new SB()); - boolean isMultipleBondPDB = am[iModel].isPdbWithMultipleBonds; - LabelToken[] tokens; - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { - Atom a = at[i]; - if (showModels && a.mi != iModelLast) { - if (iModelLast != -1) - out.append("ENDMDL\n"); - iModelLast = a.mi; - out.append("MODEL " + (iModelLast + 1) + "\n"); - } - String sa = a.getAtomName(); - boolean leftJustify = (a.getElementSymbol().length() == 2 - || sa.length() >= 4 || Character.isDigit(sa.charAt(0))); - boolean isBiomodel = am[a.mi].isBioModel; - boolean isHetero = a.isHetero(); - if (!isBiomodel) - tokens = (leftJustify ? LabelToken.compile(vwr, - "HETATM%5.-5i %-4.4a%1AUNK %1c 1%1E %8.3x%8.3y%8.3z" + occTemp, - '\0', null) : LabelToken - .compile(vwr, - "HETATM%5.-5i %-3.3a%1AUNK %1c 1%1E %8.3x%8.3y%8.3z" - + occTemp, '\0', null) - - ); - else if (isHetero) - tokens = (leftJustify ? LabelToken.compile(vwr, - "HETATM%5.-5i %-4.4a%1A%3.-3n %1c%4.-4R%1E %8.3x%8.3y%8.3z" - + occTemp, '\0', null) : LabelToken.compile(vwr, - "HETATM%5.-5i %-3.3a%1A%3.-3n %1c%4.-4R%1E %8.3x%8.3y%8.3z" - + occTemp, '\0', null)); - else - tokens = (leftJustify ? LabelToken.compile(vwr, - "ATOM %5.-5i %-4.4a%1A%3.-3n %1c%4.-4R%1E %8.3x%8.3y%8.3z" - + occTemp, '\0', null) : LabelToken.compile(vwr, - "ATOM %5.-5i %-3.3a%1A%3.-3n %1c%4.-4R%1E %8.3x%8.3y%8.3z" - + occTemp, '\0', null)); - String XX = a.getElementSymbolIso(false).toUpperCase(); - out.append(LabelToken.formatLabelAtomArray(vwr, a, tokens, '\0', null)) - .append(XX.length() == 1 ? " " + XX : XX.substring(0, 2)) - .append(" \n"); - if (!showModels && (!isBiomodel || isHetero || isMultipleBondPDB)) { - Bond[] bonds = a.getBonds(); - if (bonds != null) - for (int j = 0; j < bonds.length; j++) { - int iThis = a.getAtomNumber(); - Atom a2 = bonds[j].getOtherAtom(a); - if (!bs.get(a2.i)) - continue; - int n = bonds[j].getCovalentOrder(); - if (n == 1 && isMultipleBondPDB && !isHetero) - continue; - int iOther = a2.getAtomNumber(); - switch (n) { - case 2: - case 3: - if (iOther < iThis) - continue; // only one entry in this case -- pseudo-PDB style - //$FALL-THROUGH$ - case 1: - sbCONECT.append("CONECT").append( - Txt.formatStringI("%5i", "i", iThis)); - for (int k = 0; k < n; k++) - sbCONECT.append(Txt.formatStringI("%5i", "i", iOther)); - sbCONECT.appendC('\n'); - break; - } - } - } - } - if (showModels) - out.append("ENDMDL\n"); - else - out.append(sbCONECT.toString()); - return out.toString(); - } - - /* ********************** - * - * Jmol Data Frame methods - * - *****************************/ - - @SuppressWarnings("static-access") - public String getPdbData(int modelIndex, String type, BS bsSelected, - Object[] parameters, OC out) { - if (isJmolDataFrameForModel(modelIndex)) - modelIndex = getJmolDataSourceFrame(modelIndex); - if (modelIndex < 0) - return ""; - boolean isPDB = am[modelIndex].isBioModel; - if (parameters == null && !isPDB) - return null; - Model model = am[modelIndex]; - if (out == null) - out = vwr.getOutputChannel(null, null); - SB pdbCONECT = new SB(); - boolean isDraw = (type.indexOf("draw") >= 0); - BS bsAtoms = null; - BS bsWritten = new BS(); - char ctype = '\0'; - LabelToken[] tokens = getLabeler().compile(vwr, - "ATOM %-6i%4a%1A%3n %1c%4R%1E ", '\0', null); - if (parameters == null) { - ctype = (type.length() > 11 && type.indexOf("quaternion ") >= 0 ? type - .charAt(11) : 'R'); - model.getPdbData(vwr, type, ctype, isDraw, bsSelected, out, tokens, - pdbCONECT, bsWritten); - bsAtoms = vwr.getModelUndeletedAtomsBitSet(modelIndex); - } else { - // plot property x y z.... - bsAtoms = (BS) parameters[0]; - float[] dataX = (float[]) parameters[1]; - float[] dataY = (float[]) parameters[2]; - float[] dataZ = (float[]) parameters[3]; - boolean haveZ = (dataZ != null); - P3 minXYZ = (P3) parameters[4]; - P3 maxXYZ = (P3) parameters[5]; - P3 factors = (P3) parameters[6]; - P3 center = (P3) parameters[7]; - out.append("REMARK 6 Jmol PDB-encoded data: ").append(type) - .append(";\n"); - out.append("REMARK 6 Jmol data").append(" min = ") - .append(Escape.eP(minXYZ)).append(" max = ") - .append(Escape.eP(maxXYZ)).append(" unScaledXyz = xyz * ") - .append(Escape.eP(factors)).append(" + ").append(Escape.eP(center)) - .append(";\n"); - String strExtra = ""; - Atom atomLast = null; - for (int i = bsAtoms.nextSetBit(0), n = 0; i >= 0; i = bsAtoms - .nextSetBit(i + 1), n++) { - float x = dataX[n]; - float y = dataY[n]; - float z = (haveZ ? dataZ[n] : 0f); - if (Float.isNaN(x) || Float.isNaN(y) || Float.isNaN(z)) - continue; - Atom a = at[i]; - out.append(LabelToken.formatLabelAtomArray(vwr, a, tokens, '\0', - null)); - if (isPDB) - bsWritten.set(i); - out.append(Txt.sprintf( - "%-8.2f%-8.2f%-10.2f %6.3f %2s %s\n", "ssF", - new Object[] { a.getElementSymbolIso(false).toUpperCase(), - strExtra, new float[] { x, y, z, 0f } })); - if (atomLast != null - && atomLast.getPolymerIndexInModel() == a.getPolymerIndexInModel()) - pdbCONECT.append("CONECT") - .append(Txt.formatStringI("%5i", "i", atomLast.getAtomNumber())) - .append(Txt.formatStringI("%5i", "i", a.getAtomNumber())) - .appendC('\n'); - atomLast = a; - } - } - out.append(pdbCONECT.toString()); - if (isDraw) - return out.toString(); - bsSelected.and(bsAtoms); - if (isPDB) - out.append("\n\n" - + getProteinStructureState(bsWritten, false, ctype == 'R', 1)); - return out.toString(); - } - public boolean isJmolDataFrameForModel(int modelIndex) { return (modelIndex >= 0 && modelIndex < mc && am[modelIndex].isJmolDataFrame); } @@ -2968,68 +2766,6 @@ deleteBonds(bsBonds, false); } - /* - * <molecule title="acetic_acid.mol" - * xmlns="http://www.xml-cml.org/schema/cml2/core" - * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - * xsi:schemaLocation="http://www.xml-cml.org/schema/cml2/core cmlAll.xsd"> - * <atomArray> <atom id="a1" elementType="C" x3="0.1853" y3="0.0096" - * z3="0.4587"/> <atom id="a2" elementType="O" x3="0.6324" y3="1.0432" - * z3="0.8951"/> <atom id="a3" elementType="C" x3="-1.0665" y3="-0.1512" - * z3="-0.3758"/> <atom id="a4" elementType="O" x3="0.7893" y3="-1.1734" - * z3="0.6766" formalCharge="-1"/> <atom id="a5" elementType="H" x3="-1.7704" - * y3="-0.8676" z3="0.1055"/> <atom id="a6" elementType="H" x3="-0.8068" - * y3="-0.5215" z3="-1.3935"/> <atom id="a7" elementType="H" x3="-1.5889" - * y3="0.8259" z3="-0.4854"/> </atomArray> <bondArray> <bond atomRefs2="a1 a2" - * order="partial12"/> <bond atomRefs2="a1 a3" order="S"/> <bond - * atomRefs2="a1 a4" order="partial12"/> <bond atomRefs2="a3 a5" order="S"/> - * <bond atomRefs2="a3 a6" order="S"/> <bond atomRefs2="a3 a7" order="S"/> - * </bondArray> </molecule> - */ - public String getModelCml(BS bs, int atomsMax, boolean addBonds) { - SB sb = new SB(); - int nAtoms = BSUtil.cardinalityOf(bs); - if (nAtoms == 0) - return ""; - // creating an instance prevents pre-loading by JavaScript - Interface.getInterface("javajs.util.XmlUtil"); - XmlUtil.openTag(sb, "molecule"); - XmlUtil.openTag(sb, "atomArray"); - BS bsAtoms = new BS(); - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { - if (--atomsMax < 0) - break; - Atom atom = at[i]; - String name = atom.getAtomName(); - PT.rep(name, "\"", "''"); - bsAtoms.set(atom.i); - XmlUtil.appendTag(sb, "atom/", new String[] { "id", - "a" + (atom.i + 1), "title", atom.getAtomName(), "elementType", - atom.getElementSymbol(), "x3", "" + atom.x, "y3", "" + atom.y, "z3", - "" + atom.z }); - } - XmlUtil.closeTag(sb, "atomArray"); - if (addBonds) { - XmlUtil.openTag(sb, "bondArray"); - for (int i = 0; i < bondCount; i++) { - Bond bond = bo[i]; - Atom a1 = bond.atom1; - Atom a2 = bond.atom2; - if (!bsAtoms.get(a1.i) || !bsAtoms.get(a2.i)) - continue; - String order = Edge.getCmlBondOrder(bond.order); - if (order == null) - continue; - XmlUtil.appendTag(sb, "bond/", new String[] { "atomRefs2", - "a" + (bond.atom1.i + 1) + " a" + (bond.atom2.i + 1), - "order", order, }); - } - XmlUtil.closeTag(sb, "bondArray"); - } - XmlUtil.closeTag(sb, "molecule"); - return sb.toString(); - } - // atom addition // void adjustAtomArrays(int[] map, int i0, int ac) { Modified: trunk/Jmol/src/org/jmol/render/AxesRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/AxesRenderer.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/render/AxesRenderer.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -80,7 +80,7 @@ int modelIndex = vwr.am.cmi; // includes check here for background model present boolean isUnitCell = (axesMode == AXES.UNITCELL); - if (vwr.isJmolDataFrameForModel(modelIndex) + if (vwr.ms.isJmolDataFrameForModel(modelIndex) && !vwr.ms.getJmolFrameType(modelIndex).equals( "plot data")) return false; Modified: trunk/Jmol/src/org/jmol/render/HoverRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/HoverRenderer.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/render/HoverRenderer.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -64,7 +64,7 @@ String fixLabel(Atom atom, String label) { if (label == null) return null; - return (vwr.isJmolDataFrameForModel(atom.getModelIndex()) + return (vwr.ms.isJmolDataFrameForModel(atom.getModelIndex()) && label.equals("%U") ?"%W" : label); } } Modified: trunk/Jmol/src/org/jmol/renderbio/BackboneRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/renderbio/BackboneRenderer.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/renderbio/BackboneRenderer.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -43,7 +43,7 @@ protected void renderBioShape(BioShape bioShape) { boolean showSteps = vwr.getBoolean(T.backbonesteps) && bioShape.bioPolymer.isNucleic(); - isDataFrame = vwr.isJmolDataFrameForModel(bioShape.modelIndex); + isDataFrame = vwr.ms.isJmolDataFrameForModel(bioShape.modelIndex); for (int i = bsVisible.nextSetBit(0); i >= 0; i = bsVisible .nextSetBit(i + 1)) { Atom atomA = ms.at[leadAtomIndices[i]]; Modified: trunk/Jmol/src/org/jmol/renderbio/BioShapeRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/renderbio/BioShapeRenderer.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/renderbio/BioShapeRenderer.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -191,7 +191,7 @@ private boolean initializePolymer(BioShape bioShape) { BS bsDeleted = vwr.getDeletedAtoms(); - if (vwr.isJmolDataFrameForModel(bioShape.modelIndex)) { + if (vwr.ms.isJmolDataFrameForModel(bioShape.modelIndex)) { controlPoints = bioShape.bioPolymer.getControlPoints(true, 0, false); } else { controlPoints = bioShape.bioPolymer.getControlPoints(isTraceAlpha, Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -4750,7 +4750,7 @@ int modelIndex = vwr.am.cmi; int m; if (!chk && modelIndex >= 0 - && (m = vwr.getJmolDataSourceFrame(modelIndex)) >= 0) + && (m = vwr.ms.getJmolDataSourceFrame(modelIndex)) >= 0) vwr.setCurrentModelIndex(m == modelIndex ? Integer.MIN_VALUE : m); return; } Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -358,8 +358,7 @@ return; n = vwr.autoHbond(bs1, bs2, false); if (n != Integer.MIN_VALUE) - e.report(GT.i(GT._("{0} hydrogen bonds"), - Math.abs(n))); + e.report(GT.i(GT._("{0} hydrogen bonds"), Math.abs(n))); return; case T.hydrogen: bs1 = (slen == 2 ? null : atomExpressionAt(2)); @@ -382,9 +381,8 @@ checkLength(2); if (!chk) { vwr.calculateStraightness(); - vwr.addStateScript( - "set quaternionFrame '" + vwr.getQuaternionFrame() - + "'; calculate straightness", false, true); + vwr.addStateScript("set quaternionFrame '" + vwr.getQuaternionFrame() + + "'; calculate straightness", false, true); } return; case T.structure: @@ -392,6 +390,11 @@ switch (tokAt(++e.iToken)) { case T.ramachandran: break; + case T.dssr: + if (chk) + return; + e.showString(vwr.getDSSRParser().calculateStructure(vwr)); + return; case T.dssp: asDSSP = true; break; @@ -446,8 +449,7 @@ default: isFrom = true; } - bs1 = (e.iToken + 1 < slen ? atomExpressionAt(++e.iToken) - : vwr.bsA()); + bs1 = (e.iToken + 1 < slen ? atomExpressionAt(++e.iToken) : vwr.bsA()); checkLength(++e.iToken); if (!chk) vwr.calculateSurface(bs1, (isFrom ? Float.MAX_VALUE : -1)); @@ -5201,7 +5203,7 @@ int modelIndex = vwr.am.cmi; if (modelIndex < 0) e.errorStr(ScriptError.ERROR_multipleModelsDisplayedNotOK, "plot"); - modelIndex = vwr.getJmolDataSourceFrame(modelIndex); + modelIndex = vwr.ms.getJmolDataSourceFrame(modelIndex); int pt = args.length - 1; boolean isReturnOnly = (args != st); T[] statementSave = st; @@ -5334,7 +5336,7 @@ if (makeNewFrame) { stateScript += "plot " + type; - int ptDataFrame = vwr.getJmolDataFrameIndex(modelIndex, stateScript); + int ptDataFrame = vwr.ms.getJmolDataFrameIndex(modelIndex, stateScript); if (ptDataFrame > 0 && tokCmd != T.write && tokCmd != T.show) { // no -- this is that way we switch frames. vwr.deleteAtoms(vwr.getModelUndeletedAtomsBitSet(ptDataFrame), true); // data frame can't be 0. @@ -5413,7 +5415,7 @@ parameters); String data = (type.equals("data") ? "1 0 H 0 0 0 # Jmol PDB-encoded data" - : vwr.getPdbData(modelIndex, type, parameters)); + : vwr.getPdbData(modelIndex, type, null, parameters, null, true)); if (tokCmd == T.show) return data; @@ -5438,7 +5440,7 @@ if (!isOK) return ""; int modelCount = vwr.getModelCount(); - vwr.setJmolDataFrame(stateScript, modelIndex, modelCount - 1); + vwr.ms.setJmolDataFrame(stateScript, modelIndex, modelCount - 1); if (tok != T.property) stateScript += ";\n" + preSelected; StateScript ss = vwr.addStateScript(stateScript, true, false); Modified: trunk/Jmol/src/org/jmol/scriptext/MathExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -864,19 +864,19 @@ vwr.ms.getAtoms(T.resno, new Integer(args[0].asInt()))); switch (tok) { case T.point: - return mp.addXObj(vwr.getHelixData(bs, T.point)); + return mp.addXObj(getHelixData(bs, T.point)); case T.axis: - return mp.addXObj(vwr.getHelixData(bs, T.axis)); + return mp.addXObj(getHelixData(bs, T.axis)); case T.radius: - return mp.addXObj(vwr.getHelixData(bs, T.radius)); + return mp.addXObj(getHelixData(bs, T.radius)); case T.angle: - return mp.addXFloat(((Float) vwr.getHelixData(bs, T.angle)) + return mp.addXFloat(((Float) getHelixData(bs, T.angle)) .floatValue()); case T.draw: case T.measure: - return mp.addXObj(vwr.getHelixData(bs, tok)); + return mp.addXObj(getHelixData(bs, tok)); case T.array: - String[] data = (String[]) vwr.getHelixData(bs, T.list); + String[] data = (String[]) getHelixData(bs, T.list); if (data == null) return false; return mp.addXAS(data); @@ -885,6 +885,13 @@ return false; } + private Object getHelixData(BS bs, int tokType) { + int iAtom = bs.nextSetBit(0); + return (iAtom < 0 ? "null" + : vwr.ms.at[iAtom].group.getHelixData(tokType, + vwr.getQuaternionFrame(), vwr.getInt(T.helixstep))); + } + private boolean evaluateFind(ScriptMathProcessor mp, SV[] args) throws ScriptException { if (args.length == 0) Modified: trunk/Jmol/src/org/jmol/viewer/AnimationManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/AnimationManager.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/viewer/AnimationManager.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -211,19 +211,20 @@ boolean isSameSource = false; if (cmi != modelIndex) { if (modelCount > 0) { - boolean toDataModel = vwr.isJmolDataFrameForModel(modelIndex); - boolean fromDataModel = vwr.isJmolDataFrameForModel(cmi); + ModelSet ms = vwr.ms; + boolean toDataModel = ms.isJmolDataFrameForModel(modelIndex); + boolean fromDataModel = ms.isJmolDataFrameForModel(cmi); if (fromDataModel) - vwr.setJmolDataFrame(null, -1, cmi); + ms.setJmolDataFrame(null, -1, cmi); if (cmi != -1) vwr.saveModelOrientation(); if (fromDataModel || toDataModel) { - ids = vwr.getJmolFrameType(modelIndex) + ids = ms.getJmolFrameType(modelIndex) + " " + modelIndex + " <-- " + " " + cmi + " " - + vwr.getJmolFrameType(cmi); + + ms.getJmolFrameType(cmi); - isSameSource = (vwr.getJmolDataSourceFrame(modelIndex) == vwr + isSameSource = (ms.getJmolDataSourceFrame(modelIndex) == ms .getJmolDataSourceFrame(cmi)); } } @@ -457,14 +458,14 @@ int frameDisplayed = 0; for (int iframe = firstFrameIndex; iframe != lastFrameIndex; iframe += frameStep) { int i = modelIndexForFrame(iframe); - if (!vwr.isJmolDataFrameForModel(i)) { + if (!vwr.ms.isJmolDataFrameForModel(i)) { bsVisibleModels.set(i); nDisplayed++; frameDisplayed = iframe; } } int i = modelIndexForFrame(lastFrameIndex); - if (firstFrameIndex == lastFrameIndex || !vwr.isJmolDataFrameForModel(i) + if (firstFrameIndex == lastFrameIndex || !vwr.ms.isJmolDataFrameForModel(i) || nDisplayed == 0) { bsVisibleModels.set(i); if (nDisplayed == 0) Modified: trunk/Jmol/src/org/jmol/viewer/JC.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/JC.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/viewer/JC.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -1355,7 +1355,8 @@ }; public static String[] databases = { - "dssr", "http://x3dna.bio.columbia.edu/dssr?id=%FILE&opts=--hl%20--more", + "dssr", "http://x3dna.bio.columbia.edu/dssr/?id=%FILE&opts=--hl%20--more", + "dssrModel", "http://x3dna.bio.columbia.edu/dssr/?POST?opts=--hl%20--more&model=", "ligand", "http://www.rcsb.org/pdb/files/ligand/%FILE.cif", "mp", "http://www.materialsproject.org/materials/%FILE/cif", "nci", "http://cactus.nci.nih.gov/chemical/structure/%FILE", Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-04-10 04:32:42 UTC (rev 19630) @@ -11,8 +11,12 @@ # The quotes above look odd for a parameter file, but they are # important for the JavaScript version of Jmol. -___JmolVersion="14.1.14_2014.04.09" +___JmolVersion="14.1.14_2014.04.10" +new feature: calculate structure dssr + -- fetching http://x3dna.bio.columbia.edu/dssr/?POST?opts=--hl%20--more&model=[pdb data] + -- displays summary report + new feature: -a --autoAnimationDelay -- delay time in seconds for press-and-hold operation of toolbar animation buttons (default 0.2; set to 0 to disable) Modified: trunk/Jmol/src/org/jmol/viewer/OutputManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/OutputManager.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/viewer/OutputManager.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -553,9 +553,8 @@ // which will then be posted to a server for a return that allows saving. out.setType(type); String msg = (type.equals("PDB") || type.equals("PQR") ? vwr - .getPdbAtomData(null, out) : type.startsWith("PLOT") ? vwr.ms - .getPdbData(modelIndex, type.substring(5), vwr - .bsA(), parameters, out) : getCurrentFile ? out + .getPdbAtomData(null, out) : type.startsWith("PLOT") ? vwr + .getPdbData(modelIndex, type.substring(5), null, parameters, out, true) : getCurrentFile ? out .append(vwr.getCurrentFileAsString()).toString() : (String) vwr .getFileAsBytes(pathName, out)); out.closeChannel(); Modified: trunk/Jmol/src/org/jmol/viewer/PropertyManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -26,19 +26,23 @@ import javajs.util.Base64; import javajs.util.Lst; import javajs.util.M4; +import javajs.util.OC; import javajs.util.PT; import javajs.util.Quat; import javajs.util.SB; import javajs.util.V3; +import javajs.util.XmlUtil; import java.util.Arrays; import java.util.Calendar; +import java.util.Date; import java.util.Enumeration; import java.util.Hashtable; import java.util.Map; import java.util.Properties; +import org.jmol.api.Interface; import org.jmol.api.JmolPropertyManager; import org.jmol.api.SymmetryInterface; import org.jmol.java.BS; @@ -1605,6 +1609,273 @@ return info; } + /** + * PDB or PQR only + * + * @param bs + * selected atoms + * @param out + * StringXBuilder or BufferedWriter + * @return PDB file data string + */ + @Override + public String getPdbAtomData(BS bs, OC out) { + if (vwr.ms.ac == 0 || bs.nextSetBit(0) < 0) + return ""; + if (out == null) + out = vwr.getOutputChannel(null, null); + Atom[] atoms = vwr.ms.at; + Model[] models = vwr.ms.am; + int iModel = atoms[bs.nextSetBit(0)].mi; + int iModelLast = -1; + boolean isPQR = "PQR".equals(out.getType()); + String occTemp = "%6.2Q%6.2b "; + if (isPQR) { + occTemp = "%8.4P%7.4V "; + float charge = 0; + for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) + charge += atoms[i].getPartialCharge(); + out.append( + "REMARK 1 PQR file generated by Jmol " + Viewer.getJmolVersion()) + .append("\nREMARK 1 " + "created " + (new Date())) + .append("\nREMARK 1 Forcefield Used: unknown\nREMARK 1") + .append("\nREMARK 5") + .append( + "\nREMARK 6 Total charge on this protein: " + charge + + " e\nREMARK 6\n"); + } + int lastAtomIndex = bs.length() - 1; + boolean showModels = (iModel != atoms[lastAtomIndex].mi); + SB sbCONECT = (showModels ? null : new SB()); + boolean isMultipleBondPDB = models[iModel].isPdbWithMultipleBonds; + LabelToken[] tokens; + for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + Atom a = atoms[i]; + if (showModels && a.mi != iModelLast) { + if (iModelLast != -1) + out.append("ENDMDL\n"); + iModelLast = a.mi; + out.append("MODEL " + (iModelLast + 1) + "\n"); + } + String sa = a.getAtomName(); + boolean leftJustify = (a.getElementSymbol().length() == 2 + || sa.length() >= 4 || Character.isDigit(sa.charAt(0))); + boolean isBiomodel = models[a.mi].isBioModel; + boolean isHetero = a.isHetero(); + if (!isBiomodel) + tokens = (leftJustify ? LabelToken.compile(vwr, + "HETATM%5.-5i %-4.4a%1AUNK %1c 1%1E %8.3x%8.3y%8.3z" + occTemp, + '\0', null) : LabelToken + .compile(vwr, + "HETATM%5.-5i %-3.3a%1AUNK %1c 1%1E %8.3x%8.3y%8.3z" + + occTemp, '\0', null) + ); + else if (isHetero) + tokens = (leftJustify ? LabelToken.compile(vwr, + "HETATM%5.-5i %-4.4a%1A%3.-3n %1c%4.-4R%1E %8.3x%8.3y%8.3z" + + occTemp, '\0', null) : LabelToken.compile(vwr, + "HETATM%5.-5i %-3.3a%1A%3.-3n %1c%4.-4R%1E %8.3x%8.3y%8.3z" + + occTemp, '\0', null)); + else + tokens = (leftJustify ? LabelToken.compile(vwr, + "ATOM %5.-5i %-4.4a%1A%3.-3n %1c%4.-4R%1E %8.3x%8.3y%8.3z" + + occTemp, '\0', null) : LabelToken.compile(vwr, + "ATOM %5.-5i %-3.3a%1A%3.-3n %1c%4.-4R%1E %8.3x%8.3y%8.3z" + + occTemp, '\0', null)); + String XX = a.getElementSymbolIso(false).toUpperCase(); + out.append(LabelToken.formatLabelAtomArray(vwr, a, tokens, '\0', null)) + .append(XX.length() == 1 ? " " + XX : XX.substring(0, 2)) + .append(" \n"); + if (!showModels && (!isBiomodel || isHetero || isMultipleBondPDB)) { + Bond[] bonds = a.getBonds(); + if (bonds != null) + for (int j = 0; j < bonds.length; j++) { + int iThis = a.getAtomNumber(); + Atom a2 = bonds[j].getOtherAtom(a); + if (!bs.get(a2.i)) + continue; + int n = bonds[j].getCovalentOrder(); + if (n == 1 && isMultipleBondPDB && !isHetero) + continue; + int iOther = a2.getAtomNumber(); + switch (n) { + case 2: + case 3: + if (iOther < iThis) + continue; // only one entry in this case -- pseudo-PDB style + //$FALL-THROUGH$ + case 1: + sbCONECT.append("CONECT").append( + Txt.formatStringI("%5i", "i", iThis)); + for (int k = 0; k < n; k++) + sbCONECT.append(Txt.formatStringI("%5i", "i", iOther)); + sbCONECT.appendC('\n'); + break; + } + } + } + } + if (showModels) + out.append("ENDMDL\n"); + else + out.append(sbCONECT.toString()); + return out.toString(); + } + /* ********************** + * + * Jmol Data Frame methods + * + *****************************/ + + @Override + @SuppressWarnings("static-access") + public String getPdbData(int modelIndex, String type, BS bsSelected, + Object[] parameters, OC out, boolean addStructure) { + if (vwr.ms.isJmolDataFrameForModel(modelIndex)) + modelIndex = vwr.ms.getJmolDataSourceFrame(modelIndex); + if (modelIndex < 0) + return ""; + Model model = vwr.ms.am[modelIndex]; + boolean isPDB = model.isBioModel; + if (parameters == null && !isPDB) + return null; + if (out == null) + out = vwr.getOutputChannel(null, null); + SB pdbCONECT = new SB(); + boolean isDraw = (type.indexOf("draw") >= 0); + BS bsAtoms = null; + BS bsWritten = new BS(); + char ctype = '\0'; + LabelToken[] tokens = vwr.ms.getLabeler().compile(vwr, + "ATOM %-6i%4a%1A%3n %1c%4R%1E ", '\0', null); + if (parameters == null) { + ctype = (type.length() > 11 && type.indexOf("quaternion ") >= 0 ? type + .charAt(11) : 'R'); + model.getPdbData(vwr, type, ctype, isDraw, bsSelected, out, tokens, + pdbCONECT, bsWritten); + bsAtoms = vwr.getModelUndeletedAtomsBitSet(modelIndex); + } else { + // plot property x y z.... + bsAtoms = (BS) parameters[0]; + float[] dataX = (float[]) parameters[1]; + float[] dataY = (float[]) parameters[2]; + float[] dataZ = (float[]) parameters[3]; + boolean haveZ = (dataZ != null); + P3 minXYZ = (P3) parameters[4]; + P3 maxXYZ = (P3) parameters[5]; + P3 factors = (P3) parameters[6]; + P3 center = (P3) parameters[7]; + out.append("REMARK 6 Jmol PDB-encoded data: ").append(type) + .append(";\n"); + out.append("REMARK 6 Jmol data").append(" min = ") + .append(Escape.eP(minXYZ)).append(" max = ") + .append(Escape.eP(maxXYZ)).append(" unScaledXyz = xyz * ") + .append(Escape.eP(factors)).append(" + ").append(Escape.eP(center)) + .append(";\n"); + String strExtra = ""; + Atom atomLast = null; + Atom[] atoms = vwr.ms.at; + for (int i = bsAtoms.nextSetBit(0), n = 0; i >= 0; i = bsAtoms + .nextSetBit(i + 1), n++) { + float x = dataX[n]; + float y = dataY[n]; + float z = (haveZ ? dataZ[n] : 0f); + if (Float.isNaN(x) || Float.isNaN(y) || Float.isNaN(z)) + continue; + Atom a = atoms[i]; + out.append(LabelToken.formatLabelAtomArray(vwr, a, tokens, '\0', + null)); + if (isPDB) + bsWritten.set(i); + out.append(Txt.sprintf( + "%-8.2f%-8.2f%-10.2f %6.3f %2s %s\n", "ssF", + new Object[] { a.getElementSymbolIso(false).toUpperCase(), + strExtra, new float[] { x, y, z, 0f } })); + if (atomLast != null + && atomLast.getPolymerIndexInModel() == a.getPolymerIndexInModel()) + pdbCONECT.append("CONECT") + .append(Txt.formatStringI("%5i", "i", atomLast.getAtomNumber())) + .append(Txt.formatStringI("%5i", "i", a.getAtomNumber())) + .appendC('\n'); + atomLast = a; + } + } + out.append(pdbCONECT.toString()); + if (isDraw) + return out.toString(); + bsSelected.and(bsAtoms); + if (isPDB && addStructure) + out.append("\n\n" + + vwr.ms.getProteinStructureState(bsWritten, false, ctype == 'R', 1)); + return out.toString(); + } + + /* + * <molecule title="acetic_acid.mol" + * xmlns="http://www.xml-cml.org/schema/cml2/core" + * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + * xsi:schemaLocation="http://www.xml-cml.org/schema/cml2/core cmlAll.xsd"> + * <atomArray> <atom id="a1" elementType="C" x3="0.1853" y3="0.0096" + * z3="0.4587"/> <atom id="a2" elementType="O" x3="0.6324" y3="1.0432" + * z3="0.8951"/> <atom id="a3" elementType="C" x3="-1.0665" y3="-0.1512" + * z3="-0.3758"/> <atom id="a4" elementType="O" x3="0.7893" y3="-1.1734" + * z3="0.6766" formalCharge="-1"/> <atom id="a5" elementType="H" x3="-1.7704" + * y3="-0.8676" z3="0.1055"/> <atom id="a6" elementType="H" x3="-0.8068" + * y3="-0.5215" z3="-1.3935"/> <atom id="a7" elementType="H" x3="-1.5889" + * y3="0.8259" z3="-0.4854"/> </atomArray> <bondArray> <bond atomRefs2="a1 a2" + * order="partial12"/> <bond atomRefs2="a1 a3" order="S"/> <bond + * atomRefs2="a1 a4" order="partial12"/> <bond atomRefs2="a3 a5" order="S"/> + * <bond atomRefs2="a3 a6" order="S"/> <bond atomRefs2="a3 a7" order="S"/> + * </bondArray> </molecule> + */ + @Override + public String getModelCml(BS bs, int atomsMax, boolean addBonds) { + SB sb = new SB(); + int nAtoms = BSUtil.cardinalityOf(bs); + if (nAtoms == 0) + return ""; + // creating an instance prevents pre-loading by JavaScript + Interface.getInterface("javajs.util.XmlUtil"); + XmlUtil.openTag(sb, "molecule"); + XmlUtil.openTag(sb, "atomArray"); + BS bsAtoms = new BS(); + Atom[] atoms = vwr.ms.at; + for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + if (--atomsMax < 0) + break; + Atom atom = atoms[i]; + String name = atom.getAtomName(); + PT.rep(name, "\"", "''"); + bsAtoms.set(atom.i); + XmlUtil.appendTag(sb, "atom/", new String[] { "id", + "a" + (atom.i + 1), "title", atom.getAtomName(), "elementType", + atom.getElementSymbol(), "x3", "" + atom.x, "y3", "" + atom.y, "z3", + "" + atom.z }); + } + XmlUtil.closeTag(sb, "atomArray"); + if (addBonds) { + XmlUtil.openTag(sb, "bondArray"); + int bondCount = vwr.getBondCount(); + Bond[] bonds = vwr.ms.bo; + for (int i = 0; i < bondCount; i++) { + Bond bond = bonds[i]; + Atom a1 = bond.atom1; + Atom a2 = bond.atom2; + if (!bsAtoms.get(a1.i) || !bsAtoms.get(a2.i)) + continue; + String order = Edge.getCmlBondOrder(bond.order); + if (order == null) + continue; + XmlUtil.appendTag(sb, "bond/", new String[] { "atomRefs2", + "a" + (bond.atom1.i + 1) + " a" + (bond.atom2.i + 1), + "order", order, }); + } + XmlUtil.closeTag(sb, "bondArray"); + } + XmlUtil.closeTag(sb, "molecule"); + return sb.toString(); + } + } Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-04-09 14:44:41 UTC (rev 19629) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-04-10 04:32:42 UTC (rev 19630) @@ -7661,33 +7661,17 @@ } public String getModelCml(BS bs, int nAtomsMax, boolean addBonds) { - return ms.getModelCml(bs, nAtomsMax, addBonds); + return getPropertyManager().getModelCml(bs, nAtomsMax, addBonds); } - public Object getHelixData(BS bs, int tokType) { - return ms.getHelixData(bs, tokType); - } - public String getPdbAtomData(BS bs, OC sb) { - return ms.getPdbAtomData(bs == null ? bsA() : bs, sb); + return getPropertyManager().getPdbAtomData(bs == null ? bsA() : bs, sb); } - public boolean isJmolDataFrameForModel(int modelIndex) { - return ms.isJmolDataFrameForModel(modelIndex); - } - public boolean isJmolDataFrame() { return ms.isJmolDataFrameForModel(am.cmi); } - public int getJmolDataFrameIndex(int modelIndex, String type) { - return ms.getJmolDataFrameIndex(modelIndex, type); - } - - public void setJmolDataFrame(String type, int modelIndex, int dataIndex) { - ms.setJmolDataFrame(type, modelIndex, dataIndex); - } - public void setFrameTitle(int modelIndex, String title) { ms.setFrameTitle(BSUtil.newAndSetBit(modelIndex), title); } @@ -7701,14 +7685,6 @@ return ms.getFrameTitle(am.cmi); } - String getJmolFrameType(int modelIndex) { - return ms.getJmolFrameType(modelIndex); - } - - public int getJmolDataSourceFrame(int modelIndex) { - return ms.getJmolDataSourceFrame(modelIndex); - } - public void setAtomProperty(BS bs, int tok, int iValue, float fValue, String sValue, float[] values, String[] list) { if (tok == T.vanderwaals) @@ -8861,9 +8837,10 @@ parameters); } - public String getPdbData(int modelIndex, String type, Object[] parameters) { - return ms.getPdbData(modelIndex, type, bsA(), - parameters, null); + public String getPdbData(int modelIndex, String type, BS bsAtoms, Object[] parameters, OC oc, boolean getStructure) { + // plot command + return getPropertyManager().getPdbData(modelIndex, type, bsAtoms == null ? bsA() : bsAtoms, + parameters, oc, getStructure); } public BS getGroupsWithin(int nResidues, BS bs) { @@ -9466,7 +9443,6 @@ if (atomExpression instanceof BS) return excludeAtoms((BS) atomExpression, false); - getScriptManager(); return getAtomBitSetEval(eval, atomExpression); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-04-11 06:00:54
|
Revision: 19638 http://sourceforge.net/p/jmol/code/19638 Author: hansonr Date: 2014-04-11 06:00:45 +0000 (Fri, 11 Apr 2014) Log Message: ----------- JanaReader work -- still not correct for rigid-body refinement. better backboneSteps with 0.5 x diameter as P-P links. Modified Paths: -------------- trunk/Jmol/src/javajs/util/Matrix.java trunk/Jmol/src/org/jmol/adapter/readers/cif/MSReader.java trunk/Jmol/src/org/jmol/adapter/readers/xtal/JanaReader.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java trunk/Jmol/src/org/jmol/adapter/smarter/MSInterface.java trunk/Jmol/src/org/jmol/modelset/ModelCollection.java trunk/Jmol/src/org/jmol/renderbio/BackboneRenderer.java trunk/Jmol/src/org/jmol/util/ModulationSet.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/javajs/util/Matrix.java =================================================================== --- trunk/Jmol/src/javajs/util/Matrix.java 2014-04-10 19:26:33 UTC (rev 19637) +++ trunk/Jmol/src/javajs/util/Matrix.java 2014-04-11 06:00:45 UTC (rev 19638) @@ -273,7 +273,7 @@ return getSubmatrix(0, n - 1, m - 1, 1); } - public static Matrix newT(P3 r, boolean asColumn) { + public static Matrix newT(T3 r, boolean asColumn) { return (asColumn ? new Matrix(new double[][] { new double[] { r.x }, new double[] { r.y }, new double[] { r.z } }, 3, 1) : new Matrix( new double[][] { new double[] { r.x, r.y, r.z } }, 1, 3)); Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/MSReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/MSReader.java 2014-04-10 19:26:33 UTC (rev 19637) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/MSReader.java 2014-04-11 06:00:45 UTC (rev 19638) @@ -8,7 +8,9 @@ import javajs.util.M3; import javajs.util.Matrix; import javajs.util.P3; +import javajs.util.PT; import javajs.util.SB; +import javajs.util.T3; import org.jmol.adapter.smarter.Atom; import org.jmol.adapter.smarter.AtomSetCollection; @@ -48,9 +50,8 @@ protected int modDim; protected String modAxes; protected boolean modAverage; - protected boolean isCommensurate; - protected int commensurateSection1; // TODO - + protected boolean isCommensurate; + protected int commensurateSection1; // TODO private boolean modPack; private boolean modVib; @@ -60,7 +61,8 @@ private int modSelected = -1; private boolean modLast; - private Matrix sigma; + private Matrix sigma; + Matrix getSigma() { return sigma; } @@ -133,8 +135,8 @@ } /** - * Types include O (occupation) D (displacement) U (anisotropy) _coefs_ indicates - * this is a wave description + * Types include O (occupation) D (displacement) U (anisotropy) _coefs_ + * indicates this is a wave description * * * @param map @@ -168,8 +170,7 @@ return; if (map == null) map = htModulation; - id += "@" - + (iModel >= 0 ? iModel : cr.asc.iSet); + id += "@" + (iModel >= 0 ? iModel : cr.asc.iSet); Logger.info("Adding " + id + " " + Escape.e(pt)); map.put(id, pt); } @@ -191,6 +192,12 @@ Logger.debugging = Logger.debuggingHigh = false; } + private Map<String, T3> groupPts; + @Override + public void setGroupPoints(Map<String, T3> pts) { + groupPts = pts; + } + /** * Create a script that will run to turn modulation on and to display only * atoms with modulated occupancy >= 0.5. @@ -200,7 +207,8 @@ public void finalizeModulation() { if (!finalized && modDim > 0 && !modVib) { cr.asc.setInfo("modulationOn", Boolean.TRUE); - cr.addJmolScript((haveOccupancy && !isCommensurate ? ";display occupancy >= 0.5" : "")); + cr.addJmolScript((haveOccupancy && !isCommensurate ? ";display occupancy >= 0.5" + : "")); } finalized = true; } @@ -235,7 +243,6 @@ return htModulation.get(key + atModel); } - /** * Called when structure creation is complete and all modulation data has been * collected. @@ -288,9 +295,9 @@ sigma = new Matrix(null, modDim, 3); qs = null; - - modMatrices = new Matrix[] { sigma, null } ; + modMatrices = new Matrix[] { sigma, null }; + // we should have W_1, W_2, W_3 up to the modulation dimension for (int i = 0; i < modDim; i++) { @@ -301,13 +308,14 @@ } cr.appendLoadNote("W_" + (i + 1) + " = " + Escape.e(pt)); - sigma.getArray()[i] = new double[] {pt[0], pt[1], pt[2]}; + sigma.getArray()[i] = new double[] { pt[0], pt[1], pt[2] }; } q1 = sigma.getArray()[0]; // q1Norm is used specifically for occupancy modulation, where dim = 1 only - q1Norm = P3.new3(q1[0] == 0 ? 0 : 1, q1[1] == 0 ? 0 : 1, q1[2] == 0 ? 0 : 1); + q1Norm = P3 + .new3(q1[0] == 0 ? 0 : 1, q1[1] == 0 ? 0 : 1, q1[2] == 0 ? 0 : 1); double[] qlist100 = new double[modDim]; qlist100[0] = 1; double[] pt; @@ -371,8 +379,8 @@ if (!htModulation.containsKey(k2 + atModel)) { addModulation(map, k2, ptHarmonic, iModel); if (key.startsWith("F_")) - cr.appendLoadNote("atom wave vector " + key + " = " + Escape.e(pt) - + " fn = " + Escape.e(ptHarmonic)); + cr.appendLoadNote("atom wave vector " + key + " = " + + Escape.e(pt) + " fn = " + Escape.e(ptHarmonic)); } } } @@ -461,7 +469,7 @@ qs = new P3[modDim]; for (int i = 0; i < modDim; i++) { qs[i] = toP3(getMod("W_" + (i + 1))); - } + } } P3 pt = toP3(p); // test n * q @@ -505,7 +513,7 @@ return p; } } - + // test dropped rational component // eg: // q = 0 0.33333 0.166666 @@ -524,15 +532,15 @@ ifn = Math.max(approxInt(pt.z / p3.z), ifn); if (ifn == 0) continue; - if (p3.x != 0 && approxInt(10 + p3.x * ifn - pt.x) == 0 - || p3.y != 0 && approxInt(10 + p3.y * ifn - pt.y) == 0 - || p3.z != 0 && approxInt(10 + p3.z * ifn - pt.z) == 0) + if (p3.x != 0 && approxInt(10 + p3.x * ifn - pt.x) == 0 || p3.y != 0 + && approxInt(10 + p3.y * ifn - pt.y) == 0 || p3.z != 0 + && approxInt(10 + p3.z * ifn - pt.z) == 0) continue; - + p = new double[modDim]; p[i] = ifn; return p; - } + } return null; } @@ -575,13 +583,13 @@ setSubsystem(code, ss); } -// private void setSubsystems() { -// atoms = cr.asc.atoms; -// int n = cr.asc.ac; -// for (int i = cr.asc.getLastAtomSetAtomIndex(); i < n; i++) -// getUnitCell(atoms[i]); -// } - + // private void setSubsystems() { + // atoms = cr.asc.atoms; + // int n = cr.asc.ac; + // for (int i = cr.asc.getLastAtomSetAtomIndex(); i < n; i++) + // getUnitCell(atoms[i]); + // } + private final static String U_LIST = "U11U22U33U12U13U23UISO"; private void addUStr(Atom atom, String id, float val) { @@ -597,7 +605,6 @@ cr.setU(atom, i, val + atom.anisoBorU[i]); } - /** * The displacement will be set as the atom vibration vector; the string * buffer will be appended with the t value for a given unit cell. @@ -615,10 +622,20 @@ // (Special positions should generate the same atom regardless of which operation is employed.) if (modCoord && htSubsystems != null) { + // I think this does nothing..... P3 ptc = P3.newP(a); SymmetryInterface spt = getSymmetry(a); spt.toCartesian(ptc, true); } + + T3 gPt = (groupPts == null ? null : groupPts.get(a.atomName)); + if (gPt != null) { + P3 ptc = P3.newP(gPt); + SymmetryInterface spt = getSymmetry(a); + spt.toCartesian(ptc, true); + gPt = ptc; + } + Lst<Modulation> list = htAtomMods.get(a.atomName); if (list == null && a.altLoc != '\0' && htSubsystems != null) { // force treatment if a subsystem @@ -650,7 +667,7 @@ // The magic happens here. ModulationSet ms = new ModulationSet().set(a.index + " " + a.atomName, - P3.newP(a), modDim, list, gammaE, getMatrices(a), iop, getSymmetry(a)); + a, gPt, modDim, list, gammaE, getMatrices(a), iop, getSymmetry(a)); ms.calculate(null, false); // ms parameter values are used to set occupancies, @@ -719,19 +736,20 @@ /** * When applying symmetry, this method allows us to use a set of symmetry - * operators unique to this particular atom -- or in this case, to its subsystem. + * operators unique to this particular atom -- or in this case, to its + * subsystem. * */ @Override - public SymmetryInterface getAtomSymmetry(Atom a, SymmetryInterface defaultSymmetry) { + public SymmetryInterface getAtomSymmetry(Atom a, + SymmetryInterface defaultSymmetry) { Subsystem ss; - return (htSubsystems == null || (ss = getSubsystem(a)) == null ? - defaultSymmetry : ss.getSymmetry()); + return (htSubsystems == null || (ss = getSubsystem(a)) == null ? defaultSymmetry + : ss.getSymmetry()); } - Map<String, Subsystem> htSubsystems; - + private void setSubsystem(String code, Subsystem system) { if (htSubsystems == null) htSubsystems = new Hashtable<String, Subsystem>(); @@ -754,7 +772,7 @@ } private P3 minXYZ0, maxXYZ0; - + @Override public void setMinMax0(P3 minXYZ, P3 maxXYZ) { if (htSubsystems == null) @@ -814,16 +832,17 @@ pt.add(a.vib); getSymmetry(a).toCartesian(pt, false); sym.toFractional(pt, false); - if (!asc.xtalSymmetry.isWithinCell(3, pt, minXYZ0.x, maxXYZ0.x, minXYZ0.y, maxXYZ0.y, - minXYZ0.z, maxXYZ0.z, 0.001f) || isCommensurate && a.foccupancy < 0.5f) + if (!asc.xtalSymmetry.isWithinCell(3, pt, minXYZ0.x, maxXYZ0.x, + minXYZ0.y, maxXYZ0.y, minXYZ0.z, maxXYZ0.z, 0.001f) + || isCommensurate + && a.foccupancy < 0.5f) bs.clear(i); } } private SymmetryInterface getDefaultUnitCell() { - return (modCell != null - && htSubsystems.containsKey(modCell) ? htSubsystems.get(modCell) - .getSymmetry() : cr.asc.getSymmetry()); + return (modCell != null && htSubsystems.containsKey(modCell) ? htSubsystems + .get(modCell).getSymmetry() : cr.asc.getSymmetry()); } @Override @@ -832,10 +851,11 @@ } @Override - public boolean addLatticeVector(Lst<float[]> lattvecs, String data) throws Exception { + public boolean addLatticeVector(Lst<float[]> lattvecs, String data) + throws Exception { float[] a = null; char c = data.charAt(0); - switch(c) { + switch (c) { case 'P': case 'X': break; @@ -843,10 +863,10 @@ case 'B': case 'C': case 'I': - a = new float[] {0.5f, 0.5f, 0.5f}; + a = new float[] { 0.5f, 0.5f, 0.5f }; if (c != 'I') a[c - 'A'] = 0; - break; + break; case 'F': addLatticeVector(lattvecs, "A"); addLatticeVector(lattvecs, "B"); @@ -864,5 +884,17 @@ return true; } + @Override + public void copyModulations(Map<String, double[]> map, String label, String newLabel){ + if (map == null) + map = htModulation; + Map<String, double[]> mapTemp = new Hashtable<String, double[]>(); + for (Entry<String, double[]> e: map.entrySet()) { + String key = e.getKey(); + if (key.contains(label)) + mapTemp.put(PT.rep(key, label, newLabel), e.getValue()); + } + map.putAll(mapTemp); + } } Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/JanaReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/JanaReader.java 2014-04-10 19:26:33 UTC (rev 19637) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/JanaReader.java 2014-04-11 06:00:45 UTC (rev 19638) @@ -34,10 +34,12 @@ import org.jmol.api.SymmetryInterface; import org.jmol.java.BS; +import javajs.util.P3; import javajs.util.Rdr; import javajs.util.Lst; import javajs.util.Matrix; import javajs.util.PT; +import javajs.util.T3; import org.jmol.util.Logger; @@ -237,14 +239,38 @@ String id = name.substring(0, ipt); ipt = id.lastIndexOf("/"); id = id.substring(ipt + 1); - BufferedReader r = Rdr.getBR((String) vwr.getLigandModel(id, - name, "_file", "----")); + BufferedReader r = Rdr.getBR((String) vwr.getLigandModel(id, name, "_file", + "----")); if (readM40Floats(r).startsWith("command")) readM40WaveVectors(r); BS newSub = getSubSystemList(); int iSub = (newSub == null ? 0 : 1); int nAtoms = -1; + boolean allowAltLoc = (iSub == 0); + // read atom/group list + // 0 5 0 1 + // 8 2 + // 8 2 + // 20 2 + // 3 1 + // 3 1 + int nFree = (int) floats[0]; + int nGroups = (int) floats[1]; + Lst<Atom> molAtoms = null; + Hashtable<String, T3> pts = null; + String molName = null; + P3 pt0 = null; + if (nGroups > 0) { + Logger.info("JanaReader found " + nFree + " free atoms and " + nGroups + + " groups"); + molAtoms = new Lst<Atom>(); + pts = new Hashtable<String, T3>(); + ms.setGroupPoints(pts); + if (allowAltLoc) + asc.setAtomSetAuxiliaryInfo("altLocsAreBondSets", Boolean.TRUE); + } while (readM40Floats(r) != null) { + // skip molecule part; we don't need to know this. while (line != null && (line.length() == 0 || line.charAt(0) == ' ' || line.charAt(0) == '-')) { readM40Floats(r); @@ -254,7 +280,8 @@ nAtoms++; Atom atom = new Atom(); Logger.info(line); - atom.atomName = line.substring(0, 9).trim(); + name = line.substring(0, 9).trim(); + atom.atomName = name; if (!filterAtom(atom, 0)) continue; if (iSub > 0) { @@ -265,13 +292,18 @@ } float o_site = atom.foccupancy = floats[2]; setAtomCoordXYZ(atom, floats[3], floats[4], floats[5]); - System.out.println(floats[3]); - if (Float.isNaN(floats[3])) + if (Float.isNaN(o_site)) { + // new group - note, this does not allow for "C1" as a reference atoms + molAtoms.clear(); + molName = name; + pt0 = atom; continue; - asc.addAtom(atom); - if (modDim == 0 || line.length() < 60) + } + if (modDim == 0) { + asc.addAtom(atom); continue; - String label = ";" + atom.atomName; + } + String label = ";" + name; boolean haveSpecialOcc = (getInt(60, 61) > 0); boolean haveSpecialDisp = (getInt(61, 62) > 0); boolean haveSpecialUij = (getInt(62, 63) > 0); @@ -316,8 +348,8 @@ // However, first we need to adjust o_0 because the value given in m40 is // divided by the number of operators giving this site. if (o_0 != 1) { - ms.addModulation(null, "J_O#0;" + atom.atomName, new double[] { o_site, - o_0, 0 }, -1); + ms.addModulation(null, "J_O#0;" + name, + new double[] { o_site, o_0, 0 }, -1); } atom.foccupancy = o_0 * o_site; int wv = 0; @@ -334,7 +366,7 @@ a1 = floats[1]; // cos (second on line) } id = "O_" + wv + "#0" + label; - pt = new double[] {a1, a2, 0}; + pt = new double[] { a1, a2, 0 }; if (a1 != 0 || a2 != 0) ms.addModulation(null, id, pt, -1); } @@ -348,7 +380,7 @@ for (int k = 0; k < 3; k++) if (floats[k] != 0) ms.addModulation(null, "D_S#" + LABELS.charAt(k) + label, - new double[] {c, w, floats[k]}, -1); + new double[] { c, w, floats[k] }, -1); } else { // Fourier addSinCos(j, "D_", label, r); @@ -370,10 +402,47 @@ for (int k = 0, p = 0; k < 6; k++, p += 3) ms.addModulation(null, "U_" + (j + 1) + "#" + U_LIST.substring(p, p + 3) + label, - new double[] {data[1][k], data[0][k], 0}, -1); + new double[] { data[1][k], data[0][k], 0 }, -1); } } } + if (nGroups > 0 && name.startsWith("pos#")) { + int n = molAtoms.size(); + if (n == 0 || !allowAltLoc) + continue; + Logger.info(name + " Molecule " + molName + " has " + n + " atoms"); + String script = ""; + String ext = "_" + name.substring(4); + char charLoc = name.charAt(4); + P3 pt1 = P3.newP(pt0); + //atom.anisoBorU are the rotation/translation terms. + // TODO -- consider rotation; + pt1.x += atom.anisoBorU[3]; + pt1.y += atom.anisoBorU[4]; + pt1.z += atom.anisoBorU[5]; + for (int i = 0; i < n; i++) { + // process molecule atoms + Atom a = molAtoms.get(i); + String newName = a.atomName; + if (a.altLoc == '\0') { + newName += ext; + } else { + a = asc.newCloneAtom(a); + newName = newName.substring(0, newName.lastIndexOf("_")) + ext; + } + a.altLoc = charLoc; + script += ", " + newName; + ms.copyModulations(null, label, ";" + newName); + pts.put(a.atomName = newName, pt1); + } + if (thisSub != 0) + Logger.info("Don't know what to do if subsystems AND groups!"); + script = "@" + molName + ext + script.substring(1); + addJmolScript(script); + appendLoadNote(script); + } else { + molAtoms.addLast(asc.addAtom(atom)); + } } r.close(); } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java 2014-04-10 19:26:33 UTC (rev 19637) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java 2014-04-11 06:00:45 UTC (rev 19638) @@ -24,7 +24,6 @@ package org.jmol.adapter.smarter; -import javajs.api.GenericLineReader; import javajs.util.AU; import javajs.util.Lst; @@ -35,7 +34,6 @@ import java.util.Properties; import org.jmol.api.Interface; -import org.jmol.api.JmolDSSRParser; import org.jmol.api.SymmetryInterface; import org.jmol.java.BS; @@ -484,7 +482,7 @@ return n; } - Atom newCloneAtom(Atom atom) throws Exception { + public Atom newCloneAtom(Atom atom) throws Exception { Atom clone = atom.getClone(); addAtom(clone); return clone; Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2014-04-10 19:26:33 UTC (rev 19637) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2014-04-11 06:00:45 UTC (rev 19638) @@ -1657,6 +1657,4 @@ } - - } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/MSInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/MSInterface.java 2014-04-10 19:26:33 UTC (rev 19637) +++ trunk/Jmol/src/org/jmol/adapter/smarter/MSInterface.java 2014-04-11 06:00:45 UTC (rev 19638) @@ -7,6 +7,7 @@ import javajs.util.Lst; import javajs.util.Matrix; import javajs.util.P3; +import javajs.util.T3; /** @@ -37,4 +38,8 @@ boolean addLatticeVector(Lst<float[]> lattvecs, String substring) throws Exception; + void copyModulations(Map<String, double[]> map, String label, String newLabel); + + void setGroupPoints(Map<String, T3> pts); + } Modified: trunk/Jmol/src/org/jmol/modelset/ModelCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2014-04-10 19:26:33 UTC (rev 19637) +++ trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2014-04-11 06:00:45 UTC (rev 19638) @@ -2075,6 +2075,7 @@ } AtomIndexIterator iter = getSelectedAtomIterator(null, false, false, true, false); + boolean noAltLocBonding = true; for (int i = i0; i >= 0 && i < ac; i = (isAll ? i + 1 : bsCheck .nextSetBit(i + 1))) { boolean isAtomInSetA = (isAll || bsA.get(i)); @@ -2091,6 +2092,7 @@ - 1; continue; } + noAltLocBonding = getInfoB(modelIndex, "altLocsAreBondSets"); } // Covalent bonds float myBondingRadius = atom.getBondingRadius(); @@ -2109,7 +2111,8 @@ // BOTH must be excluded in order to ignore bonding if (!isNearInSetA && !isNearInSetB || !(isAtomInSetA && isNearInSetB || isAtomInSetB && isNearInSetA) - || isFirstExcluded && bsExclude.get(atomIndexNear)) + || isFirstExcluded && bsExclude.get(atomIndexNear) + || noAltLocBonding && atom.altloc != atomNear.altloc) continue; short order = getBondOrderFull(myBondingRadius, atomNear.getBondingRadius(), iter.foundDistance2(), Modified: trunk/Jmol/src/org/jmol/renderbio/BackboneRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/renderbio/BackboneRenderer.java 2014-04-10 19:26:33 UTC (rev 19637) +++ trunk/Jmol/src/org/jmol/renderbio/BackboneRenderer.java 2014-04-11 06:00:45 UTC (rev 19638) @@ -76,6 +76,9 @@ return; int xA = atomA.sX, yA = atomA.sY, zA = atomA.sZ; int xB = atomB.sX, yB = atomB.sY, zB = atomB.sZ; + int mad = this.mad; + if (max == 1000) + mad = mad >> 1; if (mad < 0) { g3d.drawLine(colixA, colixB, xA, yA, zA, xB, yB, zB); } else { Modified: trunk/Jmol/src/org/jmol/util/ModulationSet.java =================================================================== --- trunk/Jmol/src/org/jmol/util/ModulationSet.java 2014-04-10 19:26:33 UTC (rev 19637) +++ trunk/Jmol/src/org/jmol/util/ModulationSet.java 2014-04-11 06:00:45 UTC (rev 19638) @@ -52,6 +52,7 @@ private String strop; private boolean isSubsystem; private Matrix tFactor; + private P3 ptAtom; @Override public float getScale() { @@ -119,7 +120,8 @@ * GammaIinv and tau. * * @param id - * @param r + * @param ptAtom + * @param r0 TODO * @param modDim * @param mods * @param gammaE @@ -131,10 +133,13 @@ * */ - public ModulationSet set(String id, P3 r, int modDim, Lst<Modulation> mods, - M3 gammaE, Matrix[] factors, int iop, - SymmetryInterface symmetry) { + public ModulationSet set(String id, P3 ptAtom, T3 r0, int modDim, + Lst<Modulation> mods, M3 gammaE, Matrix[] factors, + int iop, SymmetryInterface symmetry) { this.id = id + "_" + symmetry.getSpaceGroupName(); + this.ptAtom = P3.newP(ptAtom); + this.r0 = P3.newP(r0); // could be a group position + Logger.info("ModulationSet atom " + id + " at " + r0); strop = symmetry.getSpaceGroupXyz(iop, false); this.modDim = modDim; this.mods = mods; @@ -157,10 +162,10 @@ Matrix rsvs = symmetry.getOperationRsVs(iop); gammaIinv = rsvs.getSubmatrix(3, 3, modDim, modDim).inverse(); sI = rsvs.getSubmatrix(3, 3 + modDim, modDim, 1); - r0 = P3.newP(r); - tau = gammaIinv.mul(sigma.mul(Matrix.newT(r, true)).sub(sI)); + + tau = gammaIinv.mul(sigma.mul(Matrix.newT(r0, true)).sub(sI)); if (Logger.debuggingHigh) - Logger.debug("MODSET create r=" + Escape.eP(r) + " si=" + Escape.e(sI.getArray()) + Logger.debug("MODSET create r=" + Escape.eP(r0) + " si=" + Escape.e(sI.getArray()) + " ginv=" + gammaIinv.toString().replace('\n', ' ')); t = new Matrix(null, modDim, 1); @@ -314,7 +319,7 @@ public Object getModulation(String type, T3 t456) { getModTemp(); if (type.equals("D")) { - return P3.newP(t456 == null ? r0 : modTemp.calculate(t456, false)); + return P3.newP(t456 == null ? ptAtom : modTemp.calculate(t456, false)); } return null; } @@ -341,6 +346,7 @@ modTemp.modDim = modDim; modTemp.gammaIinv = gammaIinv; modTemp.sigma = sigma; + modTemp.ptAtom = ptAtom; modTemp.r0 = r0; modTemp.symmetry = symmetry; modTemp.t = t; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-04-10 19:26:33 UTC (rev 19637) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-04-11 06:00:45 UTC (rev 19638) @@ -24,6 +24,8 @@ -- displays summary report -- complements calculate structure dssp, except it is done by the x3dna server at Columbia, not Jmol +JmolVersion="14.1.14_2014.04.09" + new feature: -a --autoAnimationDelay -- delay time in seconds for press-and-hold operation of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-04-11 17:42:54
|
Revision: 19639 http://sourceforge.net/p/jmol/code/19639 Author: hansonr Date: 2014-04-11 17:42:48 +0000 (Fri, 11 Apr 2014) Log Message: ----------- working on DSSR and JANA2006 Modified Paths: -------------- trunk/Jmol/src/javajs/util/Quat.java trunk/Jmol/src/org/jmol/adapter/readers/xtal/JanaReader.java trunk/Jmol/src/org/jmol/api/JmolDSSRParser.java trunk/Jmol/src/org/jmol/dssx/DSSRParser.java trunk/Jmol/src/org/jmol/modelset/Group.java trunk/Jmol/src/org/jmol/modelsetbio/NucleicMonomer.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/javajs/util/Quat.java =================================================================== --- trunk/Jmol/src/javajs/util/Quat.java 2014-04-11 06:00:45 UTC (rev 19638) +++ trunk/Jmol/src/javajs/util/Quat.java 2014-04-11 17:42:48 UTC (rev 19639) @@ -56,9 +56,9 @@ return q1; } - public static Quat newVA(T3 pt, float theta) { + public static Quat newVA(T3 v, float theta) { Quat q = new Quat(); - q.setTA(pt, theta); + q.setTA(v, theta); return q; } Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/JanaReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/JanaReader.java 2014-04-11 06:00:45 UTC (rev 19638) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/JanaReader.java 2014-04-11 17:42:48 UTC (rev 19639) @@ -34,12 +34,15 @@ import org.jmol.api.SymmetryInterface; import org.jmol.java.BS; +import javajs.util.A4; import javajs.util.P3; +import javajs.util.Quat; import javajs.util.Rdr; import javajs.util.Lst; import javajs.util.Matrix; import javajs.util.PT; import javajs.util.T3; +import javajs.util.V3; import org.jmol.util.Logger; @@ -243,36 +246,75 @@ "----")); if (readM40Floats(r).startsWith("command")) readM40WaveVectors(r); - BS newSub = getSubSystemList(); - int iSub = (newSub == null ? 0 : 1); + + // ref: manual98.pdf + // Jana98: The Crystallographic Computing System + // Vaclav Petricek and Michal Dusek,Dec. 2000 + // p. 98 + // Header numbers (This is part of table in page 98) + // Nat1 Nmol1 Nat21 Nmol2 Nat32 Nmol3 Itemp Irot + // Natm1 Npos1 + // Natm2 Npos2 Nmol1 lines for the 1st composite subsystem + // ...... + // The header of m40 contains number of atoms in atomic and molecular parts, number + // of molecules and molecular positions. In the case of a composite these numbers are + // listed repeatedly for each composite part. + // The number of composite parts is given in m50 (see the key ncomp, Table 9, page 80) + // and can be defined with PRELIM user interface (see § 2.2.2, page 68). The numbers + // for non-existing composite parts are omitted. + // Meaning of parameters + // Nat1 Number of atoms in the 1st composite part. + // Nmol1 Number of molecules3 in the 1st composite part + // Nat2 Number of atoms in the 2nd composite part. + // Nmol2 Number of molecules in the 2nd composite part + // Nat3 Number of atoms in the 3rd composite part. + // Nmol3 Number of molecules in the 3rd composite part + // Itemp Type of temperature parameters (0 for U, 1 for beta) + // Irot Key of molecular rotation (0 for Eulerian, 1 for axial). See page 143 + // for more information. + // Natm1 Number of atoms in the 1st molecule of the 1st composite part + // Npos1 Number of positions of the 1st molecule of the 1st composite part + // Natm2 Number of atoms in the 2nd molecule of the 1st composite part + // Npos2 Number of positions of the 2nd molecule of the 1st composite part + + int nFree = 0, nGroups = 0; + boolean isAxial = false; + BS newSub = (thisSub == 0 ? null : new BS()); + int iSub = (thisSub == 0 ? 1 : thisSub); + for (int i = 0, n = 0, pt = 0; i < iSub; i++, pt += 10) { + nFree = getInt(pt, pt + 5); + nGroups = getInt(pt + 5, pt + 10); + isAxial = (getInt(pt + 15, pt + 20) == 1); + if (nGroups != 0 && i > 0) + throw new Exception( + "Jmol cannot read rigid body M40 files for composites"); + if (newSub != null) + newSub.set(n = n + nFree); + } + iSub = (newSub == null ? 0 : 1); int nAtoms = -1; boolean allowAltLoc = (iSub == 0); - // read atom/group list - // 0 5 0 1 - // 8 2 - // 8 2 - // 20 2 - // 3 1 - // 3 1 - int nFree = (int) floats[0]; - int nGroups = (int) floats[1]; Lst<Atom> molAtoms = null; + Lst<P3> freePositions = null; Hashtable<String, T3> pts = null; String molName = null; + String refAtomName = null; + int refType = 0; P3 pt0 = null; if (nGroups > 0) { Logger.info("JanaReader found " + nFree + " free atoms and " + nGroups + " groups"); molAtoms = new Lst<Atom>(); pts = new Hashtable<String, T3>(); + freePositions = new Lst<P3>(); ms.setGroupPoints(pts); if (allowAltLoc) asc.setAtomSetAuxiliaryInfo("altLocsAreBondSets", Boolean.TRUE); } while (readM40Floats(r) != null) { - // skip molecule part; we don't need to know this. while (line != null && (line.length() == 0 || line.charAt(0) == ' ' || line.charAt(0) == '-')) { + // skip entry for a filtered atom readM40Floats(r); } if (line == null) @@ -280,8 +322,7 @@ nAtoms++; Atom atom = new Atom(); Logger.info(line); - name = line.substring(0, 9).trim(); - atom.atomName = name; + atom.atomName = name = line.substring(0, 9).trim(); if (!filterAtom(atom, 0)) continue; if (iSub > 0) { @@ -290,179 +331,234 @@ atom.altLoc = ("" + iSub).charAt(0); //mr.addSubsystem("" + iSub, null, atom.atomName); } - float o_site = atom.foccupancy = floats[2]; + atom.foccupancy = floats[2]; setAtomCoordXYZ(atom, floats[3], floats[4], floats[5]); - if (Float.isNaN(o_site)) { - // new group - note, this does not allow for "C1" as a reference atoms + if (Float.isNaN(floats[2])) { + // new "molecule" group + refType = getInt(10, 11); + // IR The type of the reference point + // (0=explicit, 1=gravity centre, 2=geometry centre) + //if (refType != 0) + // throw new Exception( + // "Jmol can only read rigid body groups with explicit references (not point groups)"); + refAtomName = null; + if (Float.isNaN(floats[4])) + refAtomName = line.substring(28, 37).trim(); + else + pt0 = P3.newP(atom); + molName = name; molAtoms.clear(); - molName = name; - pt0 = atom; + freePositions.clear(); continue; } if (modDim == 0) { asc.addAtom(atom); continue; } - String label = ";" + name; - boolean haveSpecialOcc = (getInt(60, 61) > 0); - boolean haveSpecialDisp = (getInt(61, 62) > 0); - boolean haveSpecialUij = (getInt(62, 63) > 0); - int nOcc = getInt(65, 68); - int nDisp = getInt(68, 71); - int nUij = getInt(71, 74); - // read anisotropies - readM40Floats(r); - boolean extended = false; - if (Float.isNaN(floats[0])) { - extended = true; - readM40Floats(r); // second atom line + String posName = null; + if (name.equals(refAtomName)) + pt0 = P3.newP(atom); + else if (name.startsWith("pos#")) + posName = name; + if (posName == null) { + readModulation(r, atom); + molAtoms.addLast(asc.addAtom(atom)); + freePositions.addLast(P3.newP(atom)); + } else { + if (molAtoms.size() == 0 || !allowAltLoc) + continue; + processPosition(r, molName, posName, atom, molAtoms, freePositions, + pt0, pts, isAxial); } - boolean isIso = true; - for (int j = 1; j < 6; j++) - if (floats[j] != 0) { - isIso = false; - break; - } - if (isIso) { - if (floats[0] != 0) - setU(atom, 7, floats[0]); + } + r.close(); + } + + private void processPosition(BufferedReader r, String molName, + String posName, Atom atom, Lst<Atom> molAtoms, Lst<P3> freePositions, + T3 ptRef, Hashtable<String, T3> pts, boolean isAxial) + throws Exception { + char altLoc = (posName.length() == 5 ? posName.charAt(4) + : (char) (55 + parseIntStr(posName.substring(4)))); + // this does not seem to be quite right + // because some files may use "pos#1" for two + // atoms that have different modulations but + // are really different true molecules, not just different groups + // no obvious fix for this + boolean isImproper = (getInt(10, 11) == -1); // "sign" of rotation + int systType = getInt(13, 14); + // Type of the local coordinate system. + // 0 if the basic crystallographic setting is used. + // 1 if the local system for the model molecule is defined + // explicitly + // 2 if an explicit choice is used also for the actual position. + if (systType != 0) + throw new Exception( + "Jmol can only read rigid body groups with explicit references (not point groups)"); + readModulation(r, atom); + String name = atom.atomName; + int n = molAtoms.size(); + Logger.info(name + " Molecule " + molName + " has " + n + " atoms"); + String script = ""; + String ext = "_" + name.substring(4); + //atom.anisoBorU are the rotation/translation terms. + // isAxial: Z Y X (Z first) + // notAxial: Z X Z + Quat phi = Quat.newAA(A4.newVA(V3.new3(0, 0, 1), (float)(atom.anisoBorU[0] / 180* Math.PI))); + Quat chi = Quat.newAA(A4.newVA(isAxial ? V3.new3(0, 1, 0) : V3.new3(1, 0, 0), (float)(atom.anisoBorU[1] / 180* Math.PI))); + Quat psi = Quat.newAA(A4.newVA(isAxial ? V3.new3(1, 0, 0) : V3.new3(0, 0, 1), (float)(atom.anisoBorU[2] / 180* Math.PI))); + V3 vTrans = V3.new3(atom.anisoBorU[3], atom.anisoBorU[4], atom.anisoBorU[5]); + Quat qR =phi.mulQ(chi).mulQ(psi); + System.out.println(qR); + P3 ptMod = new P3(); + ptMod.setT(ptRef); + //getModelPosition(ptRef, qR, vTrans, isImproper, ptMod); + for (int i = 0; i < n; i++) { + // process molecule atoms + Atom a = molAtoms.get(i); + String newName = a.atomName; + if (a.altLoc == '\0') { + newName += ext; } else { - for (int j = 0; j < 6; j++) - setU(atom, j, floats[j]); + a = asc.newCloneAtom(a); + a.setT(freePositions.get(i)); + newName = newName.substring(0, newName.lastIndexOf("_")) + ext; } + pts.put(a.atomName = newName, ptMod); + System.out.println(a.atomName + " 1 " + a); + getModelPosition(ptRef, qR, vTrans, isImproper, a); + System.out.println(a.atomName + " 2 " + a); + a.altLoc = altLoc; + script += ", " + newName; + ms.copyModulations(null, ";" + posName, ";" + newName); + } + script = "@" + molName + ext + script.substring(1); + addJmolScript(script); + appendLoadNote(script); + } - if (extended) { - r.readLine(); - r.readLine(); //??? + private void getModelPosition(T3 ptRef, Quat qR, V3 vTrans, + boolean isImproper, P3 pt) { + P3 rho = P3.newP(ptRef); + getSymmetry().toCartesian(rho, true); + symmetry.toCartesian(pt, true); + pt.sub(rho); + qR.transformP2(pt, pt); + if (isImproper) + pt.scale(-1); + pt.add(rho); + symmetry.toFractional(pt, true); + pt.add(vTrans); + } + + private void readModulation(BufferedReader r, Atom atom) throws Exception { + String label = ";" + atom.atomName; + boolean haveSpecialOcc = (getInt(60, 61) > 0); + boolean haveSpecialDisp = (getInt(61, 62) > 0); + boolean haveSpecialUij = (getInt(62, 63) > 0); + int nOcc = getInt(65, 68); + int nDisp = getInt(68, 71); + int nUij = getInt(71, 74); + // read anisotropies + readM40Floats(r); + boolean extended = false; + if (Float.isNaN(floats[0])) { + extended = true; + readM40Floats(r); // second atom line + } + System.out.println(line); + boolean isIso = true; + for (int j = 1; j < 6; j++) + if (floats[j] != 0) { + isIso = false; + break; } + if (isIso) { + if (floats[0] != 0) + setU(atom, 7, floats[0]); + } else { + for (int j = 0; j < 6; j++) + setU(atom, j, floats[j]); + } - // read occupancy parameters - double[] pt; - float o_0 = (nOcc > 0 && !haveSpecialOcc ? parseFloatStr(r.readLine()) - : 1); - // we add a pt that save the original (unadjusted) o_0 and o_site - // will implement - // - // O = o_site (o_0 + SUM) - // - // However, first we need to adjust o_0 because the value given in m40 is - // divided by the number of operators giving this site. - if (o_0 != 1) { - ms.addModulation(null, "J_O#0;" + name, - new double[] { o_site, o_0, 0 }, -1); + if (extended) { + r.readLine(); + r.readLine(); //??? + } + + // read occupancy parameters + double[] pt; + float o_0 = (nOcc > 0 && !haveSpecialOcc ? parseFloatStr(r.readLine()) + : 1); + // we add a pt that save the original (unadjusted) o_0 and o_site + // will implement + // + // O = o_site (o_0 + SUM) + // + // However, first we need to adjust o_0 because the value given in m40 is + // divided by the number of operators giving this site. + + if (o_0 != 1) + ms.addModulation(null, "J_O#0" + label, + new double[] { atom.foccupancy, o_0, 0 }, -1); + atom.foccupancy *= o_0; + int wv = 0; + float a1, a2; + for (int j = 0; j < nOcc; j++) { + if (haveSpecialOcc) { + float[][] data = readM40FloatLines(2, 1, r); + a2 = data[0][0]; // width (first line) + a1 = data[1][0]; // center (second line) + } else { + wv = j + 1; + readM40Floats(r); + a2 = floats[0]; // sin (first on line) + a1 = floats[1]; // cos (second on line) } - atom.foccupancy = o_0 * o_site; - int wv = 0; - float a1, a2; - for (int j = 0; j < nOcc; j++) { - if (haveSpecialOcc) { - float[][] data = readM40FloatLines(2, 1, r); - a2 = data[0][0]; // width (first line) - a1 = data[1][0]; // center (second line) - } else { - wv = j + 1; - readM40Floats(r); - a2 = floats[0]; // sin (first on line) - a1 = floats[1]; // cos (second on line) - } - id = "O_" + wv + "#0" + label; - pt = new double[] { a1, a2, 0 }; - if (a1 != 0 || a2 != 0) - ms.addModulation(null, id, pt, -1); - } + pt = new double[] { a1, a2, 0 }; + if (a1 != 0 || a2 != 0) + ms.addModulation(null, "O_" + wv + "#0" + label, pt, -1); + } - // read displacement data - for (int j = 0; j < nDisp; j++) { - if (haveSpecialDisp) { - readM40Floats(r); - float c = floats[3]; - float w = floats[4]; - for (int k = 0; k < 3; k++) - if (floats[k] != 0) - ms.addModulation(null, "D_S#" + LABELS.charAt(k) + label, - new double[] { c, w, floats[k] }, -1); - } else { - // Fourier - addSinCos(j, "D_", label, r); - } + // read displacement data + for (int j = 0; j < nDisp; j++) { + if (haveSpecialDisp) { + readM40Floats(r); + float c = floats[3]; + float w = floats[4]; + for (int k = 0; k < 3; k++) + if (floats[k] != 0) + ms.addModulation(null, "D_S#" + LABELS.charAt(k) + label, + new double[] { c, w, floats[k] }, -1); + } else { + // Fourier + addSinCos(j, "D_", label, r); } - // finally read Uij sines and cosines - for (int j = 0; j < nUij; j++) { - checkFourier(j); - if (isIso) { - // fourier? - addSinCos(j, "U_", label, r); + } + // finally read Uij sines and cosines + for (int j = 0; j < nUij; j++) { + checkFourier(j); + if (isIso) { + // fourier? + addSinCos(j, "U_", label, r); + } else { + if (haveSpecialUij) { + //TODO + Logger.error("JanaReader -- not interpreting SpecialUij flag: " + + line); } else { - if (haveSpecialUij) { - //TODO - Logger.error("JanaReader -- not interpreting SpecialUij flag: " - + line); - } else { - float[][] data = readM40FloatLines(2, 6, r); - for (int k = 0, p = 0; k < 6; k++, p += 3) - ms.addModulation(null, - "U_" + (j + 1) + "#" + U_LIST.substring(p, p + 3) + label, - new double[] { data[1][k], data[0][k], 0 }, -1); - } + float[][] data = readM40FloatLines(2, 6, r); + for (int k = 0, p = 0; k < 6; k++, p += 3) + ms.addModulation(null, + "U_" + (j + 1) + "#" + U_LIST.substring(p, p + 3) + label, + new double[] { data[1][k], data[0][k], 0 }, -1); } } - if (nGroups > 0 && name.startsWith("pos#")) { - int n = molAtoms.size(); - if (n == 0 || !allowAltLoc) - continue; - Logger.info(name + " Molecule " + molName + " has " + n + " atoms"); - String script = ""; - String ext = "_" + name.substring(4); - char charLoc = name.charAt(4); - P3 pt1 = P3.newP(pt0); - //atom.anisoBorU are the rotation/translation terms. - // TODO -- consider rotation; - pt1.x += atom.anisoBorU[3]; - pt1.y += atom.anisoBorU[4]; - pt1.z += atom.anisoBorU[5]; - for (int i = 0; i < n; i++) { - // process molecule atoms - Atom a = molAtoms.get(i); - String newName = a.atomName; - if (a.altLoc == '\0') { - newName += ext; - } else { - a = asc.newCloneAtom(a); - newName = newName.substring(0, newName.lastIndexOf("_")) + ext; - } - a.altLoc = charLoc; - script += ", " + newName; - ms.copyModulations(null, label, ";" + newName); - pts.put(a.atomName = newName, pt1); - } - if (thisSub != 0) - Logger.info("Don't know what to do if subsystems AND groups!"); - script = "@" + molName + ext + script.substring(1); - addJmolScript(script); - appendLoadNote(script); - } else { - molAtoms.addLast(asc.addAtom(atom)); - } } - r.close(); } public final static String U_LIST = "U11U22U33U12U13U23UISO"; - private BS getSubSystemList() { - if (thisSub == 0) - return null; - BS bs = new BS(); - String[] tokens = getTokens(); - for (int i = 0, n = 0; i < tokens.length; i+= 2) { - int nAtoms = parseIntStr(tokens[i]); - if (nAtoms == 0) - break; - bs.set(n = n + nAtoms); - } - return bs; - } - private void readM40WaveVectors(BufferedReader r) throws Exception { while (!readM40Floats(r).contains("end")) if (line.startsWith("wave")) { @@ -507,6 +603,13 @@ } } + /** + * safe int parsing of line.substring(col1, col2); + * + * @param col1 + * @param col2 + * @return + */ private int getInt(int col1, int col2) { int n = line.length(); return (n > col1 ? parseIntStr(line.substring(col1, Math.min(n, col2))) : 0); Modified: trunk/Jmol/src/org/jmol/api/JmolDSSRParser.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolDSSRParser.java 2014-04-11 06:00:45 UTC (rev 19638) +++ trunk/Jmol/src/org/jmol/api/JmolDSSRParser.java 2014-04-11 17:42:48 UTC (rev 19639) @@ -4,6 +4,7 @@ import org.jmol.java.BS; import org.jmol.modelset.Bond; +import org.jmol.modelset.Group; import org.jmol.viewer.Viewer; import javajs.api.GenericLineReader; Modified: trunk/Jmol/src/org/jmol/dssx/DSSRParser.java =================================================================== --- trunk/Jmol/src/org/jmol/dssx/DSSRParser.java 2014-04-11 06:00:45 UTC (rev 19638) +++ trunk/Jmol/src/org/jmol/dssx/DSSRParser.java 2014-04-11 17:42:48 UTC (rev 19639) @@ -40,6 +40,7 @@ import org.jmol.modelsetbio.BasePair; import org.jmol.modelsetbio.BioModel; import org.jmol.modelsetbio.BioPolymer; +import org.jmol.modelsetbio.Monomer; import org.jmol.modelsetbio.NucleicMonomer; import org.jmol.modelsetbio.NucleicPolymer; import org.jmol.script.T; @@ -342,7 +343,6 @@ Lst<Map<String, Object>> sets = newList(key); boolean isJunction = (nway == 0); boolean isKissingLoop = (ptnts == -1); - boolean isHairpinLoop = (nway == 1); for (int i = 0; i < n; i++) { Map<String, Object> set = new Hashtable<String, Object>(); String[] tokens = PT.getTokens(rd()); @@ -572,7 +572,10 @@ data.put("nt2", fix(tokens[2], true)); data.put("res1", fix(tokens[1], false)); data.put("res2", fix(tokens[2], false)); - data.put("bp", tokens[3]); + String bp = tokens[3]; + data.put("bp", bp); + data.put("g1", bp.substring(0, 1)); + data.put("g2", bp.substring(2, 3)); // helix can be missing name // 1 0.C2769 0.A2805 C-A 00-n/a t.S c.-m @@ -829,35 +832,58 @@ @SuppressWarnings("unchecked") @Override public void setAllDSSRParametersForModel(Viewer vwr, int modelIndex) { - Object info = vwr.ms.getInfo(modelIndex, "dssr"); - if (info != null) - info = ((Map<String, Object>) info).get("basePairs"); - if (info == null) { + Map<String, Object> dssr = (Map<String, Object>) vwr.ms.getInfo(modelIndex, + "dssr"); + Lst<Map<String, Object>> lst = (dssr == null ? null + : (Lst<Map<String, Object>>) dssr.get("basePairs")); + Lst<Map<String, Object>> lst1 = (dssr == null ? null + : (Lst<Map<String, Object>>) dssr.get("singleStranded")); + + if (lst == null && lst1 == null) { BioModel m = (BioModel) vwr.ms.am[modelIndex]; int n = m.getBioPolymerCount(); for (int i = n; --i >= 0;) { BioPolymer bp = m.getBioPolymer(i); - if (bp.isNucleic()) + if (bp.isNucleic()) { ((NucleicPolymer) bp).isDssrSet = true; + Monomer[] monomers = bp.monomers; + for (int ii = bp.monomerCount; --ii >= 0;) + ((NucleicMonomer) monomers[ii]).setGroup1('?'); + } } return; } - Lst<Map<String, Object>> lst = (Lst<Map<String, Object>>) info; Map<String, BS> htChains = new Hashtable<String, BS>(); BS bs = new BS(); - for (int i = lst.size(); --i >= 0;) { - Map<String, Object> bpInfo = lst.get(i); - new BasePair(bpInfo, setPhos(vwr, 1, bpInfo, bs, htChains), setPhos(vwr, - 2, bpInfo, bs, htChains)); + if (lst != null) { + for (int i = lst.size(); --i >= 0;) { + Map<String, Object> bpInfo = lst.get(i); + new BasePair(bpInfo, setPhos(vwr, 1, bpInfo, bs, htChains), setPhos( + vwr, 2, bpInfo, bs, htChains)); + } } + if (lst1 != null) + for (int i = lst1.size(); --i >= 0;) { + Map<String, Object> bp = lst1.get(i); + String seq = (String) bp.get("seq"); + Lst<Object> resnos = (Lst<Object>) bp.get("resnos"); + for (int j = resnos.size(); --j >= 0;) + setRes(vwr, (String) resnos.get(j), bs, htChains, seq.charAt(j)); + } } private NucleicMonomer setPhos(Viewer vwr, int n, Map<String, Object> bp, BS bs, Map<String, BS> htChains) { + return setRes(vwr, (String) bp.get("res" + n), bs, htChains, ((String)bp.get("g" + n)).charAt(0)); + } + + private NucleicMonomer setRes(Viewer vwr, String res, BS bs, Map<String, BS> htChains, + char g) { bs.clearAll(); - getBsAtoms(vwr, bp.get("res" + n), bs, htChains); + getBsAtoms(vwr, res, bs, htChains); NucleicMonomer group = (NucleicMonomer) vwr.ms.at[bs.nextSetBit(0)].getGroup(); ((NucleicPolymer) group.getBioPolymer()).isDssrSet = true; + group.setGroup1(g); return group; } Modified: trunk/Jmol/src/org/jmol/modelset/Group.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Group.java 2014-04-11 06:00:45 UTC (rev 19638) +++ trunk/Jmol/src/org/jmol/modelset/Group.java 2014-04-11 17:42:48 UTC (rev 19639) @@ -48,6 +48,7 @@ public class Group { protected int groupIndex; + public char group1; // set by DSSR public int getGroupIndex() { return groupIndex; @@ -112,11 +113,18 @@ } public final char getGroup1() { - if (groupID >= JC.predefinedGroup1Names.length) - return '?'; - return JC.predefinedGroup1Names[groupID]; + + return (groupID < JC.predefinedGroup1Names.length + ? JC.predefinedGroup1Names[groupID] : + group1 > 1 ? group1 + : group1 == 1 ? '?' + : (group1 = getGroup1b())); } + protected char getGroup1b() { + return '?'; + } + public final short getGroupID() { return groupID; } Modified: trunk/Jmol/src/org/jmol/modelsetbio/NucleicMonomer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/NucleicMonomer.java 2014-04-11 06:00:45 UTC (rev 19638) +++ trunk/Jmol/src/org/jmol/modelsetbio/NucleicMonomer.java 2014-04-11 17:42:48 UTC (rev 19639) @@ -549,11 +549,21 @@ bps.addLast(bp); } + public void setGroup1(char g) { + group1 = g; + } + public Lst<BasePair> getBasePairs() { if (!((NucleicPolymer) bioPolymer).isDssrSet) bioPolymer.model.ms.vwr.getDSSRParser().setAllDSSRParametersForModel(bioPolymer.model.ms.vwr, bioPolymer.model.modelIndex); return bps; } + @Override + protected char getGroup1b () { + if (!((NucleicPolymer) bioPolymer).isDssrSet) + bioPolymer.model.ms.vwr.getDSSRParser().setAllDSSRParametersForModel(bioPolymer.model.ms.vwr, bioPolymer.model.modelIndex); + return group1; + } } Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-04-11 06:00:45 UTC (rev 19638) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2014-04-11 17:42:48 UTC (rev 19639) @@ -1978,12 +1978,12 @@ ligandModelSet.put(id, Boolean.TRUE); if (ligandModels == null) ligandModels = new Hashtable<String, Object>(); - Object model = ligandModels.get(id); + Object model = (terminator == null ? ligandModels.get(id) : null); String data; String fname = null; if (model instanceof Boolean) return null; - if (model == null) + if (model == null && terminator == null) model = ligandModels.get(id + suffix); boolean isError = false; if (model == null) { @@ -9258,6 +9258,8 @@ public void cacheClear() { // script: reset cache fm.cacheClear(); + ligandModelSet = null; + ligandModels = null; } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |