Revision: 20297 http://sourceforge.net/p/jmol/code/20297 Author: hansonr Date: 2015-02-16 06:27:21 +0000 (Mon, 16 Feb 2015) Log Message: ----------- BioModel efficiencies
Modified Paths: -------------- trunk/Jmol/src/org/jmol/modelset/JmolBioModelSet.java trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/modelsetbio/BioModel.java trunk/Jmol/src/org/jmol/modelsetbio/ProteinStructure.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/viewer/PropertyManager.java trunk/Jmol/src/org/jmol/viewer/StateCreator.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/org/jmol/modelset/JmolBioModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/JmolBioModelSet.java 2015-02-15 18:32:52 UTC (rev 20296) +++ trunk/Jmol/src/org/jmol/modelset/JmolBioModelSet.java 2015-02-16 06:27:21 UTC (rev 20297) @@ -57,8 +57,7 @@ void getConformations(int modelIndex, int conformationIndex, boolean doSet, BS bsAtoms, BS bsRet); - String getFullProteinStructureState(BS bsAtoms, boolean taintedOnly, - boolean needPhiPsi, int mode); + String getFullProteinStructureState(BS bsAtoms, int mode); BS getIdentifierOrNull(String identifier); Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2015-02-15 18:32:52 UTC (rev 20296) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2015-02-16 06:27:21 UTC (rev 20297) @@ -3823,10 +3823,8 @@ return (haveBioModels ? bioModelset.getGroupsWithinAll(nResidues, bs) : new BS()); } - public String getProteinStructureState(BS bsAtoms, boolean taintedOnly, - boolean needPhiPsi, int mode) { - return (haveBioModels ? bioModelset.getFullProteinStructureState(bsAtoms, taintedOnly, - needPhiPsi, mode) : ""); + public String getProteinStructureState(BS bsAtoms, int mode) { + return (haveBioModels ? bioModelset.getFullProteinStructureState(bsAtoms, mode) : ""); } public String calculateStructures(BS bsAtoms, boolean asDSSP, Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioModel.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioModel.java 2015-02-15 18:32:52 UTC (rev 20296) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioModel.java 2015-02-16 06:27:21 UTC (rev 20297) @@ -227,8 +227,7 @@ if (ms.am[i].isBioModel) { BioModel m = (BioModel) ms.am[i]; if (m.defaultStructure == null) - m.defaultStructure = getFullProteinStructureState(m.bsAtoms, false, - false, 0); + m.defaultStructure = getFullProteinStructureState(m.bsAtoms, T.state); } } @@ -377,183 +376,166 @@ ((BioModel) ms.am[modelIndex]).recalculateLeadMidpointsAndWingVectors(); } - @SuppressWarnings("incomplete-switch") @Override - public String getFullProteinStructureState(BS bsAtoms2, - boolean taintedOnly, - boolean needPhiPsi, int mode) { - for (int im = 0, mc = ms.mc; im < mc; im++) { + public String getFullProteinStructureState(BS bsAtoms, int mode) { + boolean taintedOnly = (mode == T.all); + if (taintedOnly && !ms.proteinStructureTainted) + return ""; + boolean scriptMode = (mode == T.state || mode == T.all); + Atom[] atoms = ms.at; + int at0 = (bsAtoms == null ? 0 : bsAtoms.nextSetBit(0)); + if (at0 < 0) + return ""; + if (bsAtoms != null && mode == T.ramachandran) { + bsAtoms = BSUtil.copy(bsAtoms); + for (int i = ms.ac; --i >= 0;) + if (Float.isNaN(atoms[i].group.getGroupParameter(T.phi)) + || Float.isNaN(atoms[i].group.getGroupParameter(T.psi))) + bsAtoms.clear(i); + } + int at1 = (bsAtoms == null ? ms.ac : bsAtoms.length()) - 1; + int im0 = atoms[at0].mi; + int im1 = atoms[at1].mi; + Lst<ProteinStructure> lstStr = new Lst<ProteinStructure>(); + Map<ProteinStructure, Boolean> map = new Hashtable<ProteinStructure, Boolean>(); + SB cmd = new SB(); + for (int im = im0; im <= im1; im++) { if (!ms.am[im].isBioModel) continue; BioModel m = (BioModel) ms.am[im]; - boolean showMode = (mode == 3); - boolean pdbFileMode = (mode == 1); - boolean scriptMode = (mode == 0); - BS bs = null; - SB cmd = new SB(); - SB sbTurn = new SB(); - SB sbHelix = new SB(); - SB sbSheet = new SB(); - STR type = STR.NONE; - STR subtype = STR.NONE; - int id = 0; - int iLastAtom = 0; - int iLastModel = -1; - int lastId = -1; - int res1 = 0; - int res2 = 0; - String sid = ""; - String group1 = ""; - String group2 = ""; - String chain1 = ""; - String chain2 = ""; - int n = 0; - int nHelix = 0; - int nTurn = 0; - int nSheet = 0; - BS bsTainted = null; - Model[] models = ms.am; - Atom[] atoms = ms.at; - int ac = ms.ac; - - if (taintedOnly) { - if (!ms.proteinStructureTainted) - return ""; - bsTainted = new BS(); - for (int i = m.firstAtomIndex; i < ac; i++) - if (models[atoms[i].mi].structureTainted) - bsTainted.set(i); - bsTainted.set(ac); + if (taintedOnly && !m.structureTainted) + continue; + BS bsA = new BS(); + bsA.or(m.bsAtoms); + bsA.andNot(m.bsAtomsDeleted); + int i0 = bsA.nextSetBit(0); + if (i0 < 0) + continue; + if (scriptMode) { + cmd.append(" structure none ") + .append( + Escape.eBS(ms.getModelAtomBitSetIncludingDeleted(im, false))) + .append(" \t# model=" + ms.getModelNumberDotted(im)) + .append(";\n"); } - for (int i = 0; i <= ac; i++) - if (i == ac || bsAtoms == null || bsAtoms.get(i)) { - if (taintedOnly && !bsTainted.get(i)) - continue; - id = 0; - if (i == ac || (id = atoms[i].group.getStrucNo()) != lastId) { - if (bs != null) { - switch (type) { - case HELIX: - case TURN: - case SHEET: - n++; - if (scriptMode) { - int iModel = atoms[iLastAtom].mi; - String comment = " \t# model=" - + ms.getModelNumberDotted(iModel); - if (iLastModel != iModel) { - iLastModel = iModel; - cmd.append(" structure none ") - .append( - Escape.eBS(ms.getModelAtomBitSetIncludingDeleted( - iModel, false))).append(comment).append(";\n"); - } - comment += " & (" + res1 + " - " + res2 + ")"; - String stype = subtype.getBioStructureTypeName(false); - cmd.append(" structure ").append(stype).append(" ") - .append(Escape.eBS(bs)).append(comment).append(";\n"); - } else { - String str; - int nx; - SB sb; - // NNN III GGG C RRRR GGG C RRRR - // HELIX 99 99 LYS F 281 LEU F 293 1 - // NNN III 2 GGG CRRRR GGG CRRRR - // SHEET 1 A 8 ILE A 43 ASP A 45 0 - // NNN III GGG CRRRR GGG CRRRR - // TURN 1 T1 PRO A 41 TYR A 44 - switch (type) { - case HELIX: - nx = ++nHelix; - if (sid == null || pdbFileMode) - sid = PT.formatStringI("%3N %3N", "N", nx); - str = "HELIX %ID %3GROUPA %1CA %4RESA %3GROUPB %1CB %4RESB"; - sb = sbHelix; - String stype = null; - switch (subtype) { - case HELIX: - case HELIXALPHA: - stype = " 1"; - break; - case HELIX310: - stype = " 5"; - break; - case HELIXPI: - stype = " 3"; - break; - } - if (stype != null) - str += stype; - break; - case SHEET: - nx = ++nSheet; - if (sid == null || pdbFileMode) { - sid = PT.formatStringI("%3N %3A 0", "N", nx); - sid = PT.formatStringS(sid, "A", "S" + nx); - } - str = "SHEET %ID %3GROUPA %1CA%4RESA %3GROUPB %1CB%4RESB"; - sb = sbSheet; - break; - case TURN: - default: - nx = ++nTurn; - if (sid == null || pdbFileMode) - sid = PT.formatStringI("%3N %3N", "N", nx); - str = "TURN %ID %3GROUPA %1CA%4RESA %3GROUPB %1CB%4RESB"; - sb = sbTurn; - break; - } - str = PT.formatStringS(str, "ID", sid); - str = PT.formatStringS(str, "GROUPA", group1); - str = PT.formatStringS(str, "CA", chain1); - str = PT.formatStringI(str, "RESA", res1); - str = PT.formatStringS(str, "GROUPB", group2); - str = PT.formatStringS(str, "CB", chain2); - str = PT.formatStringI(str, "RESB", res2); - sb.append(str); - if (showMode) - sb.append(" strucno= ").appendI(lastId); - sb.append("\n"); + ProteinStructure ps; + for (int i = i0; i >= 0; i = bsA.nextSetBit(i + 1)) { + Atom a = atoms[i]; + if (!(a.group instanceof AlphaMonomer) + || (ps = ((AlphaMonomer) a.group).proteinStructure) == null + || map.containsKey(ps)) + continue; + lstStr.addLast(ps); + map.put(ps, Boolean.TRUE); + } + } + getStructureLines(bsAtoms, cmd, lstStr, STR.HELIX, scriptMode, mode); + getStructureLines(bsAtoms, cmd, lstStr, STR.SHEET, scriptMode, mode); + getStructureLines(bsAtoms, cmd, lstStr, STR.TURN, scriptMode, mode); + return cmd.toString(); + } - /* - * HELIX 1 H1 ILE 7 PRO 19 1 3/10 CONFORMATION RES 17,19 1CRN 55 - * HELIX 2 H2 GLU 23 THR 30 1 DISTORTED 3/10 AT RES 30 1CRN 56 - * SHEET 1 S1 2 THR 1 CYS 4 0 1CRNA 4 SHEET 2 S1 2 CYS 32 ILE 35 - */ - } - } - bs = null; + @SuppressWarnings("incomplete-switch") + private int getStructureLines(BS bsAtoms, SB cmd, Lst<ProteinStructure> lstStr, STR type, + boolean scriptMode, int mode) { + //boolean pdbFileMode = (mode == T.pdb || mode == T.ramachandran); + boolean showMode = (mode == T.show); + int nHelix = 0, nSheet = 0, nTurn = 0; + String sid = null; + BS bs = new BS(); + int n = 0; + for (int i = 0, ns = lstStr.size(); i < ns; i++) { + ProteinStructure ps = lstStr.get(i); + if (ps.type != type) + continue; + bs.clearAll(); + // could be a subset of atoms, not just the ends + Monomer m1 = ps.findMonomer(bsAtoms, true); + Monomer m2 = ps.findMonomer(bsAtoms, false); + if (m1 == null || m2 == null) + continue; + int iModel = ps.apolymer.model.modelIndex; + String comment = (scriptMode ? " \t# model=" + + ms.getModelNumberDotted(iModel) : null); + int res1 = m1.getResno(); + int res2 = m2.getResno(); + STR subtype = ps.subtype; + switch (type) { + case HELIX: + case TURN: + case SHEET: + n++; + if (scriptMode) { + String stype = subtype.getBioStructureTypeName(false); + cmd.append(" structure ").append(stype).append(" ") + .append(Escape.eBS(ps.getAtoms(bs))).append(comment) + .append(" & (" + res1 + " - " + res2 + ")").append(";\n"); + } else { + String str; + int nx; + // NNN III GGG C RRRR GGG C RRRR + // HELIX 99 99 LYS F 281 LEU F 293 1 + // NNN III 2 GGG CRRRR GGG CRRRR + // SHEET 1 A 8 ILE A 43 ASP A 45 0 + // NNN III GGG CRRRR GGG CRRRR + // TURN 1 T1 PRO A 41 TYR A 44 + switch (type) { + case HELIX: + nx = ++nHelix; + sid = PT.formatStringI("%3N %3N", "N", nx); + str = "HELIX %ID %3GROUPA %1CA %4RESA %3GROUPB %1CB %4RESB"; + String stype = null; + switch (subtype) { + case HELIX: + case HELIXALPHA: + stype = " 1"; + break; + case HELIX310: + stype = " 5"; + break; + case HELIXPI: + stype = " 3"; + break; } - if (id == 0 - || bsAtoms != null - && needPhiPsi - && (Float.isNaN(atoms[i].group.getGroupParameter(T.phi)) || Float - .isNaN(atoms[i].group.getGroupParameter(T.psi)))) - continue; + if (stype != null) + str += stype; + break; + case SHEET: + nx = ++nSheet; + sid = PT.formatStringI("%3N %3A 0", "N", nx); + sid = PT.formatStringS(sid, "A", "S" + nx); + str = "SHEET %ID %3GROUPA %1CA%4RESA %3GROUPB %1CB%4RESB"; + break; + case TURN: + default: + nx = ++nTurn; + sid = PT.formatStringI("%3N %3N", "N", nx); + str = "TURN %ID %3GROUPA %1CA%4RESA %3GROUPB %1CB%4RESB"; + break; } - String ch = atoms[i].getChainIDStr(); - if (bs == null) { - bs = new BS(); - res1 = atoms[i].getResno(); - group1 = atoms[i].getGroup3(false); - chain1 = ch; - } - type = atoms[i].group.getProteinStructureType(); - subtype = atoms[i].group.getProteinStructureSubType(); - sid = atoms[i].group.getProteinStructureTag(); - bs.set(i); - lastId = id; - res2 = atoms[i].getResno(); - group2 = atoms[i].getGroup3(false); - chain2 = ch; - iLastAtom = i; + str = PT.formatStringS(str, "ID", sid); + str = PT.formatStringS(str, "GROUPA", m1.getGroup3()); + str = PT.formatStringS(str, "CA", m1.getLeadAtom().getChainIDStr()); + str = PT.formatStringI(str, "RESA", res1); + str = PT.formatStringS(str, "GROUPB", m2.getGroup3()); + str = PT.formatStringS(str, "CB", m2.getLeadAtom().getChainIDStr()); + str = PT.formatStringI(str, "RESB", res2); + cmd.append(str); + if (showMode) + cmd.append(" strucno= ").appendI(ps.strucNo); + cmd.append("\n"); + + /* + * HELIX 1 1 ILE 7 PRO 19 1 3/10 CONFORMATION RES 17,19 1CRN 55 + * HELIX 2 2 GLU 23 THR 30 1 DISTORTED 3/10 AT RES 30 1CRN 56 + * SHEET 1 S1 2 THR 1 CYS 4 0 1CRNA 4 SHEET 2 S1 2 CYS 32 ILE 35 + */ } - if (n > 0) - cmd.append("\n"); - return (scriptMode ? cmd.toString() : sbHelix.appendSB(sbSheet) - .appendSB(sbTurn).appendSB(cmd).toString()); + } } - return ""; + if (n > 0) + cmd.append("\n"); + return n; } @Override Modified: trunk/Jmol/src/org/jmol/modelsetbio/ProteinStructure.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/ProteinStructure.java 2015-02-15 18:32:52 UTC (rev 20296) +++ trunk/Jmol/src/org/jmol/modelsetbio/ProteinStructure.java 2015-02-16 06:27:21 UTC (rev 20297) @@ -30,6 +30,7 @@ import javajs.util.V3; import org.jmol.c.STR; +import org.jmol.java.BS; import org.jmol.util.Logger; public abstract class ProteinStructure { @@ -49,7 +50,7 @@ protected V3 vectorProjection; private static int globalStrucNo = 1000; - private int monomerIndexLast; + int monomerIndexLast; private P3[] segments; /** @@ -198,4 +199,25 @@ axisA = null; segments = null; } + + BS getAtoms(BS bs) { + Monomer[] ms = apolymer.monomers; + for (int i = monomerIndexFirst; i <= monomerIndexLast; i++) + ms[i].setAtomBits(bs); + return bs; + } + + public Monomer findMonomer(BS bsAtoms, boolean isFirst) { + Monomer[] ms = apolymer.monomers; + if (isFirst) { + for (int i = monomerIndexFirst; i <= monomerIndexLast; i++) + if (bsAtoms == null || bsAtoms.get(ms[i].leadAtomIndex)) + return ms[i]; + } else { + for (int i = monomerIndexLast; i >= monomerIndexFirst; --i) + if (bsAtoms == null || bsAtoms.get(ms[i].leadAtomIndex)) + return ms[i]; + } + return null; + } } Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2015-02-15 18:32:52 UTC (rev 20296) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2015-02-16 06:27:21 UTC (rev 20297) @@ -3905,7 +3905,7 @@ case T.structure: if ((len = slen) == 2) { if (!chk) - msg = vwr.getProteinStructureState(); + msg = vwr.ms.getProteinStructureState(vwr.bsA(), T.show); break; } String shape = paramAsStr(2); Modified: trunk/Jmol/src/org/jmol/viewer/PropertyManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2015-02-15 18:32:52 UTC (rev 20296) +++ trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2015-02-16 06:27:21 UTC (rev 20297) @@ -2018,7 +2018,7 @@ bsSelected.and(bsAtoms); if (isPDB && addStructure) out.append("\n\n" - + vwr.ms.getProteinStructureState(bsWritten, false, ctype == 'R', 1)); + + vwr.ms.getProteinStructureState(bsWritten, ctype == 'R' ? T.ramachandran : T.pdb)); return out.toString(); } Modified: trunk/Jmol/src/org/jmol/viewer/StateCreator.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StateCreator.java 2015-02-15 18:32:52 UTC (rev 20296) +++ trunk/Jmol/src/org/jmol/viewer/StateCreator.java 2015-02-16 06:27:21 UTC (rev 20297) @@ -305,7 +305,7 @@ // unnecessary. Removed in 11.5.35 -- oops! if (withProteinStructure) - commands.append(ms.getProteinStructureState(null, isAll, false, 0)); + commands.append(ms.getProteinStructureState(null, isAll ? T.all : T.state)); getShapeState(commands, isAll, Integer.MAX_VALUE); Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2015-02-15 18:32:52 UTC (rev 20296) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2015-02-16 06:27:21 UTC (rev 20297) @@ -2838,10 +2838,6 @@ return getStateCreator().getModelState(null, false, true); } - public String getProteinStructureState() { - return ms.getProteinStructureState(bsA(), false, false, 3); - } - public String getCoordinateState(BS bsSelected) { return getStateCreator().getAtomicPropertyState(AtomCollection.TAINT_COORD, bsSelected); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration & more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits