Revision: 18344 http://sourceforge.net/p/jmol/code/18344 Author: hansonr Date: 2013-06-18 06:26:20 +0000 (Tue, 18 Jun 2013) Log Message: ----------- ___JmolVersion="13.1.17_dev_2013.06.18"
new feature: upgrade to allow multicharacter chain specs. See 1bgl_1bgm.cif Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/CifReader.java trunk/Jmol/src/org/jmol/adapter/readers/more/Mol2Reader.java trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlXsdReader.java trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomIterator.java trunk/Jmol/src/org/jmol/adapter/smarter/Structure.java trunk/Jmol/src/org/jmol/adapter/smarter/StructureIterator.java trunk/Jmol/src/org/jmol/api/JmolAdapter.java trunk/Jmol/src/org/jmol/api/JmolAdapterAtomIterator.java trunk/Jmol/src/org/jmol/api/JmolAdapterStructureIterator.java trunk/Jmol/src/org/jmol/modelset/Atom.java trunk/Jmol/src/org/jmol/modelset/AtomCollection.java trunk/Jmol/src/org/jmol/modelset/Chain.java trunk/Jmol/src/org/jmol/modelset/Group.java trunk/Jmol/src/org/jmol/modelset/Model.java trunk/Jmol/src/org/jmol/modelset/ModelLoader.java trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/modelsetbio/AlphaPolymer.java trunk/Jmol/src/org/jmol/modelsetbio/AminoPolymer.java trunk/Jmol/src/org/jmol/modelsetbio/BioModel.java trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java trunk/Jmol/src/org/jmol/modelsetbio/Monomer.java trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java trunk/Jmol/src/org/jmol/script/ScriptCompiler.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/smiles/SmilesAtom.java trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java trunk/Jmol/src/org/jmol/util/JmolNode.java trunk/Jmol/src/org/jmol/viewer/ColorManager.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties 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/adapter/readers/cifpdb/CifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/CifReader.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/CifReader.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -848,10 +848,7 @@ assemblyId = firstChar; break; case AUTH_ASYM_ID: - if (field.length() > 1) - Logger.warn("Don't know how to deal with chains more than 1 char: " - + field); - atom.chainID = firstChar; + atom.chainID = viewer.getChainID(field); break; case SEQ_ID: atom.sequenceNumber = parseIntStr(field); Modified: trunk/Jmol/src/org/jmol/adapter/readers/more/Mol2Reader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/more/Mol2Reader.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/adapter/readers/more/Mol2Reader.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -103,7 +103,7 @@ } lastSequenceNumber = Integer.MAX_VALUE; - chainID = 'A' - 1; + chainID = 64; // 'A' - 1; readLine(); line += " 0 0 0 0 0 0"; atomCount = parseIntStr(line); @@ -155,7 +155,7 @@ } private int lastSequenceNumber = Integer.MAX_VALUE; - private char chainID = 'A' - 1; + private int chainID = 64; // 'A' - 1 private void readAtoms(int atomCount) throws Exception { // 1 Cs 0.0000 4.1230 0.0000 Cs 1 RES1 0.0000 @@ -179,8 +179,8 @@ if (tokens.length > 6) { atom.sequenceNumber = parseIntStr(tokens[6]); if (atom.sequenceNumber < lastSequenceNumber) { - if (chainID == 'Z') - chainID = 'a' - 1; + if (chainID == 90) //'Z' + chainID = 96;//'a' - 1; chainID++; } lastSequenceNumber = atom.sequenceNumber; Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -1105,13 +1105,13 @@ return; int istart = -1; int iend = -1; - char ichain = '\0'; + int ichain = 0; Atom[] atoms = atomSetCollection.getAtoms(); BS bsSeq = null; BS bsAtom = pymolScene.getSSMapAtom(ssType); int n = atomCount + 1; int seqNo = -1; - char thischain = '\0'; + int thischain = 0; int imodel = -1; int thismodel = -1; for (int i = atomCount0; i < n; i++) { Modified: trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlXsdReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlXsdReader.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlXsdReader.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -89,7 +89,7 @@ atom.atomName = atts.get("ID"); atom.atomSerial = ++iAtom; if (iChain >= 0) - atom.chainID = (char) ((iChain - 1)%26 + 'A'); + atom.chainID = (iChain - 1)%26 + 'A'; atom.group3 = "UNK"; if (iGroup == 0) iGroup = 1; Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -24,12 +24,10 @@ package org.jmol.adapter.smarter; - import org.jmol.util.BS; import org.jmol.util.P3; import org.jmol.util.Quadric; - public class Atom extends P3 implements Cloneable { public int atomSetIndex; public int atomIndex; @@ -48,7 +46,7 @@ public float radius = Float.NaN; public boolean isHetero; public int atomSerial = Integer.MIN_VALUE; - public char chainID = '\0'; + public int chainID; public char alternateLocationID = '\0'; public String group3; public int sequenceNumber = Integer.MIN_VALUE; @@ -307,5 +305,4 @@ vectorY *= vibScale; vectorZ *= vibScale; } - } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomIterator.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomIterator.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomIterator.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -162,8 +162,8 @@ } @Override - public char getChainID() { - return JmolAdapter.canonizeChainID(atom.chainID); + public int getChainID() { + return atom.chainID; } @Override Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Structure.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Structure.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Structure.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -34,9 +34,9 @@ public int strandCount; - public char startChainID = '\0'; + public int startChainID; public char startInsertionCode = '\0'; - public char endChainID = '\0'; + public int endChainID; public char endInsertionCode = '\0'; public int startSequenceNumber; public int endSequenceNumber; @@ -68,8 +68,8 @@ } - public void set(char startChainID, int startSequenceNumber, char startInsertionCode, - char endChainID, int endSequenceNumber, char endInsertionCode, int istart, int iend) { + public void set(int startChainID, int startSequenceNumber, char startInsertionCode, + int endChainID, int endSequenceNumber, char endInsertionCode, int istart, int iend) { this.startChainID = startChainID; this.startSequenceNumber = startSequenceNumber; this.startInsertionCode = startInsertionCode; Modified: trunk/Jmol/src/org/jmol/adapter/smarter/StructureIterator.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/StructureIterator.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/adapter/smarter/StructureIterator.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -77,8 +77,8 @@ } @Override - public char getStartChainID() { - return JmolAdapter.canonizeChainID(structure.startChainID); + public int getStartChainID() { + return structure.startChainID; } @Override @@ -92,8 +92,8 @@ } @Override - public char getEndChainID() { - return JmolAdapter.canonizeChainID(structure.endChainID); + public int getEndChainID() { + return structure.endChainID; } @Override Modified: trunk/Jmol/src/org/jmol/api/JmolAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolAdapter.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/api/JmolAdapter.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -419,17 +419,14 @@ // range-checking routines ///////////////////////////////////////////////////////////////// - public final static char canonizeAlphaDigit(char ch) { - if ((ch >= 'A' && ch <= 'Z') || - (ch >= 'a' && ch <= 'z') || - (ch >= '0' && ch <= '9')) - return ch; - return '\0'; + private final static char canonizeAlphaDigit(char ch) { + return ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') + || (ch >= '0' && ch <= '9') ? ch : '\0'); } - public final static char canonizeChainID(char chainID) { - return canonizeAlphaDigit(chainID); - } +// public final static char canonizeChainID(char chainID) { +// return canonizeAlphaDigit(chainID); +// } public final static char canonizeInsertionCode(char insertionCode) { return canonizeAlphaDigit(insertionCode); Modified: trunk/Jmol/src/org/jmol/api/JmolAdapterAtomIterator.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolAdapterAtomIterator.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/api/JmolAdapterAtomIterator.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -106,8 +106,8 @@ return Integer.MIN_VALUE; } - public char getChainID() { - return '\0'; + public int getChainID() { + return 0; } public char getAlternateLocationID() { Modified: trunk/Jmol/src/org/jmol/api/JmolAdapterStructureIterator.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolAdapterStructureIterator.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/api/JmolAdapterStructureIterator.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -42,13 +42,13 @@ public abstract int getStrandCount(); - public abstract char getStartChainID(); + public abstract int getStartChainID(); public abstract int getStartSequenceNumber(); public abstract char getStartInsertionCode(); - public abstract char getEndChainID(); + public abstract int getEndChainID(); public abstract int getEndSequenceNumber(); Modified: trunk/Jmol/src/org/jmol/modelset/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Atom.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/modelset/Atom.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -25,6 +25,8 @@ package org.jmol.modelset; +import java.util.Map; + import org.jmol.api.SymmetryInterface; import org.jmol.atomdata.RadiusData; import org.jmol.atomdata.RadiusData.EnumType; @@ -875,12 +877,12 @@ // for atom picking if (useChimeFormat) { String group3 = getGroup3(true); - char chainID = getChainID(); + int chainID = getChainID(); P3 pt = getFractionalCoordPt(true); return "Atom: " + (group3 == null ? getElementSymbol() : getAtomName()) + " " + getAtomNumber() + (group3 != null && group3.length() > 0 ? (isHetero() ? " Hetero: " : " Group: ") + group3 + " " + getResno() - + (chainID != 0 && chainID != ' ' ? " Chain: " + chainID : "") + + (chainID != 0 && chainID != 32 ? " Chain: " + group.chain.getIDStr() : "") : "") + " Model: " + getModelNumber() + " Coordinates: " + x + " " + y + " " + z @@ -904,10 +906,10 @@ String seqcodeString = getSeqcodeString(); if (seqcodeString != null) info.append(seqcodeString); - char chainID = getChainID(); - if (chainID != 0 && chainID != ' ') { + int chainID = getChainID(); + if (chainID != 0 && chainID != 32) { info.append(":"); - info.appendC(chainID); + info.append(getChainIDStr()); } if (!allInfo) return info.toString(); @@ -1036,10 +1038,14 @@ return group.getGroupParameter(tok); } - public char getChainID() { + public int getChainID() { return group.chain.chainID; } + public String getChainIDStr() { + return group.chain.getIDStr(); + } + public int getSurfaceDistance100() { return group.chain.model.modelSet.getSurfaceDistance100(index); } @@ -1385,8 +1391,7 @@ case T.atomtype: return atom.getAtomType(); case T.chain: - ch = atom.getChainID(); - return (ch == '\0' ? "" : "" + ch); + return atom.getChainIDStr(); case T.sequence: return atom.getGroup1('?'); case T.group1: Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -241,7 +241,7 @@ } public String getAtomChain(int i) { - return "" + atoms[i].getChainID(); + return atoms[i].getChainIDStr(); } public Quadric[] getEllipsoid(int i) { @@ -2078,7 +2078,7 @@ bs.set(i); break; case T.spec_chain: - return BSUtil.copy(getChainBits((char) ((Integer) specInfo).intValue())); + return BSUtil.copy(getChainBits(((Integer) specInfo).intValue())); case T.spec_seqcode: return BSUtil.copy(getSeqcodeBits(((Integer) specInfo).intValue(), true)); case T.hetero: @@ -2423,15 +2423,15 @@ return (!isEmpty || returnEmpty ? bs : null); } - protected BS getChainBits(char chainId) { + protected BS getChainBits(int chainID) { boolean caseSensitive = viewer.getBoolean(T.chaincasesensitive); - if (!caseSensitive) - chainId = Character.toUpperCase(chainId); + if (!caseSensitive) + chainID = Character.toUpperCase(chainID); BS bs = new BS(); BS bsDone = BSUtil.newBitSet(atomCount); for (int i = bsDone.nextClearBit(0); i < atomCount; i = bsDone.nextClearBit(i + 1)) { Chain chain = atoms[i].getChain(); - if (chainId == (caseSensitive ? chain.chainID : Character.toUpperCase(chain.chainID))) { + if (chainID == (caseSensitive ? chain.chainID : Character.toUpperCase(chain.chainID))) { chain.setAtomBitSet(bs); bsDone.or(bs); } else { Modified: trunk/Jmol/src/org/jmol/modelset/Chain.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Chain.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/modelset/Chain.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -28,7 +28,7 @@ public final class Chain { public Model model; - public char chainID = '\0'; + public int chainID; public boolean isDna, isRna; int groupCount; @@ -39,7 +39,7 @@ return model.modelSet.atoms[index]; } - Chain(Model model, char chainID) { + Chain(Model model, int chainID) { this.model = model; this.chainID = chainID; } @@ -124,4 +124,8 @@ for (int i = 0; i < groupCount; i++) groups[i].selectAtoms(bs); } + + public String getIDStr() { + return (chainID == 0 ? "" : chainID < 256 ? "" + (char) chainID : (String) model.modelSet.viewer.chainMap.get(Integer.valueOf(chainID))); + } } Modified: trunk/Jmol/src/org/jmol/modelset/Group.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Group.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/modelset/Group.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -177,7 +177,7 @@ return groupID; } - public final char getChainID() { + public final int getChainID() { return chain.chainID; } Modified: trunk/Jmol/src/org/jmol/modelset/Model.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Model.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/modelset/Model.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -261,7 +261,7 @@ return (i < chainCount ? chains[i] : null); } - Chain getChain(char chainID) { + Chain getChain(int chainID) { for (int i = chainCount; --i >= 0;) { Chain chain = chains[i]; if (chain.chainID == chainID) @@ -428,9 +428,8 @@ } /** - * create a new structure, being careful to not - * overwrite existing structure. - * + * create a new structure, being careful to not overwrite existing structure. + * * @param type * @param structureID * @param serialID @@ -439,14 +438,18 @@ * @param startSeqcode * @param endChainID * @param endSeqcode - * @param istart starting atom index - * @param iend ending atom index - * @param bsAssigned already assigned + * @param istart + * starting atom index + * @param iend + * ending atom index + * @param bsAssigned + * already assigned */ public void addSecondaryStructure(EnumStructure type, String structureID, int serialID, int strandCount, - char startChainID, int startSeqcode, - char endChainID, int endSeqcode, int istart, int iend, BS bsAssigned) { + int startChainID, int startSeqcode, + int endChainID, int endSeqcode, int istart, + int iend, BS bsAssigned) { } /** @@ -508,7 +511,7 @@ * @param bs * @param caseSensitive */ - public void selectSeqcodeRange(int seqcodeA, int seqcodeB, char chainID, + public void selectSeqcodeRange(int seqcodeA, int seqcodeB, int chainID, BS bs, boolean caseSensitive) { } @@ -544,4 +547,4 @@ return null; } -} + } Modified: trunk/Jmol/src/org/jmol/modelset/ModelLoader.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -239,7 +239,7 @@ private int currentModelIndex; private Model currentModel; - private char currentChainID = '\0'; + private int currentChainID = 0; private Chain currentChain; private int currentGroupSequenceNumber; private char currentGroupInsertionCode = '\0'; @@ -843,7 +843,7 @@ htAtomMap.put(atomUid, atom); } - private void checkNewGroup(JmolAdapter adapter, char chainID, + private void checkNewGroup(JmolAdapter adapter, int chainID, String group3, int groupSequenceNumber, char groupInsertionCode, boolean addH) { String group3i = (group3 == null ? null : group3.intern()); @@ -879,7 +879,7 @@ } } - private Chain getOrAllocateChain(Model model, char chainID) { + private Chain getOrAllocateChain(Model model, int chainID) { //Logger.debug("chainID=" + chainID + " -> " + (chainID + 0)); Chain chain = model.getChain(chainID); if (chain != null) @@ -1023,9 +1023,9 @@ private void defineStructure(int modelIndex, EnumStructure subType, String structureID, int serialID, - int strandCount, char startChainID, + int strandCount, int startChainID, int startSequenceNumber, - char startInsertionCode, char endChainID, + char startInsertionCode, int endChainID, int endSequenceNumber, char endInsertionCode, int istart, int iend, BS bsAssigned) { EnumStructure type = (subType == EnumStructure.NOT ? EnumStructure.NONE : subType); @@ -1240,14 +1240,13 @@ throw new NullPointerException(); int modelIndex = modelSet.atoms[firstAtomIndex].modelIndex; - Group group = null; - if (group3 != null && jbr != null) { - group = jbr.distinguishAndPropagateGroup(chain, group3, seqcode, - firstAtomIndex, maxAtomIndex, modelIndex, specialAtomIndexes, modelSet.atoms); - } + Group group = (group3 == null || jbr == null ? null : jbr + .distinguishAndPropagateGroup(chain, group3, seqcode, firstAtomIndex, + maxAtomIndex, modelIndex, specialAtomIndexes, modelSet.atoms)); String key; if (group == null) { - group = new Group().setGroup(chain, group3, seqcode, firstAtomIndex, lastAtomIndex); + group = new Group().setGroup(chain, group3, seqcode, firstAtomIndex, + lastAtomIndex); key = "o>"; } else { key = (group.isProtein() ? "p>" : group.isNucleic() ? "n>" : group Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -320,14 +320,15 @@ */ public BS getAtomBits(int tokType, Object specInfo) { switch (tokType) { + default: + return BSUtil.andNot(getAtomBitsMaybeDeleted(tokType, specInfo), viewer + .getDeletedAtoms()); case T.spec_model: int modelNumber = ((Integer) specInfo).intValue(); int modelIndex = getModelNumberIndex(modelNumber, true, true); return (modelIndex < 0 && modelNumber > 0 ? new BS() : viewer.getModelUndeletedAtomsBitSet(modelIndex)); } - return BSUtil.andNot(getAtomBitsMaybeDeleted(tokType, specInfo), viewer - .getDeletedAtoms()); } public String getAtomLabel(int i) { Modified: trunk/Jmol/src/org/jmol/modelsetbio/AlphaPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/AlphaPolymer.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/modelsetbio/AlphaPolymer.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -70,8 +70,8 @@ @Override public void addStructure(EnumStructure type, String structureID, - int serialID, int strandCount, char startChainID, - int startSeqcode, char endChainID, int endSeqcode, int istart, int iend, BS bsAssigned) { + int serialID, int strandCount, int startChainID, + int startSeqcode, int endChainID, int endSeqcode, int istart, int iend, BS bsAssigned) { if (istart >= 0 && (monomers[0].firstAtomIndex > iend || monomers[monomerCount - 1].lastAtomIndex < istart)) return; int indexStart, indexEnd; Modified: trunk/Jmol/src/org/jmol/modelsetbio/AminoPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/AminoPolymer.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/modelsetbio/AminoPolymer.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -1167,8 +1167,9 @@ } private String dumpSummary(char[] labels) { - char id = monomers[0].getLeadAtom().getChainID(); - String prefix = (id == '\0' ? "" : String.valueOf(id) + ":"); + Atom a = monomers[0].getLeadAtom(); + int id = a.getChainID(); + String prefix = (id == 0 ? "" : a.getChainIDStr() + ":"); SB sb = new SB(); char lastChar = '\0'; char insCode1 = '\0'; Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioModel.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioModel.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioModel.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -92,8 +92,8 @@ @Override public void addSecondaryStructure(EnumStructure type, String structureID, int serialID, int strandCount, - char startChainID, int startSeqcode, - char endChainID, int endSeqcode, int istart, int iend, BS bsAssigned) { + int startChainID, int startSeqcode, + int endChainID, int endSeqcode, int istart, int iend, BS bsAssigned) { for (int i = bioPolymerCount; --i >= 0; ) bioPolymers[i].addStructure(type, structureID, serialID, strandCount, startChainID, startSeqcode, endChainID, endSeqcode, istart, iend, bsAssigned); @@ -299,12 +299,12 @@ } @Override - public void selectSeqcodeRange(int seqcodeA, int seqcodeB, char chainID, + public void selectSeqcodeRange(int seqcodeA, int seqcodeB, int chainID, BS bs, boolean caseSensitive) { - char ch; + int id; for (int i = chainCount; --i >= 0;) - if (chainID == (ch = chains[i].chainID) || chainID == '\t' || !caseSensitive - && chainID == Character.toUpperCase(ch)) + if (chainID == -1 || chainID == (id = chains[i].chainID) || !caseSensitive + && chainID == Character.toUpperCase(id)) for (int index = 0; index >= 0;) index = chains[i].selectSeqcodeRange(index, seqcodeA, seqcodeB, bs); } @@ -658,14 +658,12 @@ .isNaN(atoms[i].getGroupParameter(T.psi)))) continue; } - char ch = atoms[i].getChainID(); - if (ch == 0) - ch = ' '; + String ch = atoms[i].getChainIDStr(); if (bs == null) { bs = new BS(); res1 = atoms[i].getResno(); group1 = atoms[i].getGroup3(false); - chain1 = "" + ch; + chain1 = ch; } type = atoms[i].getProteinStructureType(); subtype = atoms[i].getProteinStructureSubType(); @@ -674,7 +672,7 @@ lastId = id; res2 = atoms[i].getResno(); group2 = atoms[i].getGroup3(false); - chain2 = "" + ch; + chain2 = ch; iLastAtom = i; } if (n > 0) Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -123,10 +123,10 @@ return leadAtomIndices; } - protected int getIndex(char chainID, int seqcode) { + protected int getIndex(int chainID, int seqcode) { int i; for (i = monomerCount; --i >= 0;) - if (monomers[i].getChainID() == chainID) + if (monomers[i].chain.chainID == chainID) if (monomers[i].getSeqcode() == seqcode) break; return i; @@ -1014,8 +1014,8 @@ */ public void addStructure(EnumStructure type, String structureID, int serialID, int strandCount, - char startChainID, int startSeqcode, - char endChainID, int endSeqcode, int istart, int iend, BS bsAssigned) { + int startChainID, int startSeqcode, + int endChainID, int endSeqcode, int istart, int iend, BS bsAssigned) { // overridden by each subclass } Modified: trunk/Jmol/src/org/jmol/modelsetbio/Monomer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/Monomer.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/modelsetbio/Monomer.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -283,8 +283,7 @@ public Map<String, Object> getMyInfo() { Map<String, Object> info = getGroupInfo(groupIndex); - char chainID = chain.chainID; - info.put("chain", (chainID == '\0' ? "" : "" + chainID)); + info.put("chain", chain.getIDStr()); int seqNum = getSeqNumber(); char insCode = getInsertionCode(); if (seqNum > 0) @@ -430,13 +429,13 @@ } public String getUniqueID() { - char cid = getChainID(); + int cid = getChainID(); Atom a = getLeadAtom(); String id = (a == null ? "" : "_" + a.getModelIndex()) + "_" + getResno() - + (cid == '\0' ? "" : "" + cid); - cid = (a == null ? '\0' : getLeadAtom().getAlternateLocationID()); - if (cid != '\0') - id += cid; + + (cid == 0 ? "" : "_" + cid); + char aid = (a == null ? '\0' : getLeadAtom().getAlternateLocationID()); + if (aid != '\0') + id += "_" + aid; return id; } Modified: trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -1158,32 +1158,39 @@ return T.tv(T.spec_seqcode, seqvalue, Integer.valueOf(seqcode)); } + /** + * [:] [term] + * [:] [*] + * [:] [0-9] + * [:] [?] + * + * @param tok + * @return true if chain + */ private boolean clauseChainSpec(int tok) { if (tok == T.colon) { tokenNext(); tok = tokPeek(); if (isSpecTerminator(tok)) - return generateResidueSpecCode(T.tv(T.spec_chain, '\0', + return generateResidueSpecCode(T.tv(T.spec_chain, 0, "spec_chain")); } - char chain; + int chain; switch (tok) { case T.times: return (getToken() != null); case T.integer: getToken(); int val = theToken.intValue; - if (val < 0 || val > 9) + if (val < 0 || val > 9999) return error(ERROR_invalidChainSpecification); - chain = (char) ('0' + val); + chain = viewer.getChainID("" + val); break; default: String strChain = "" + getToken().value; - if (strChain.length() != 1) - return error(ERROR_invalidChainSpecification); - chain = strChain.charAt(0); - if (chain == '?') + if (strChain.equals("?")) return true; + chain = viewer.getChainID(strChain); break; } return generateResidueSpecCode(T.tv(T.spec_chain, chain, Modified: trunk/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -871,8 +871,10 @@ ident = identLC; theToken = null; - } else if (ident.length() == 1) { + } else if (ident.length() == 1 || lastToken.tok == T.colon) { // hack to support case sensitive alternate locations and chains + // but now with reading of multicharacter chains, how does that + // work? // if an identifier is a single character long, then // allocate a new Token with the original character preserved if ((theToken = T.getTokenFromName(ident)) == null Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -460,13 +460,13 @@ return sc; } - static SB getContextTrace(ScriptContext sc, SB sb, boolean isTop) { + static SB getContextTrace(Viewer viewer, ScriptContext sc, SB sb, boolean isTop) { if (sb == null) sb = new SB(); sb.append(getErrorLineMessage(sc.functionName, sc.scriptFileName, - sc.lineNumbers[sc.pc], sc.pc, ScriptEvaluator.statementAsString(sc.statement, (isTop ? sc.iToken : 9999), false))); + sc.lineNumbers[sc.pc], sc.pc, ScriptEvaluator.statementAsString(viewer, sc.statement, (isTop ? sc.iToken : 9999), false))); if (sc.parentContext != null) - getContextTrace(sc.parentContext, sb, false); + getContextTrace(viewer, sc.parentContext, sb, false); return sb; } @@ -549,7 +549,7 @@ */ public String getNextStatement() { return (pc < aatoken.length ? getErrorLineMessage(functionName, scriptFileName, - getLinenumber(null), pc, statementAsString(aatoken[pc], -9999, + getLinenumber(null), pc, statementAsString(viewer, aatoken[pc], -9999, logMessages)) : ""); } @@ -624,7 +624,7 @@ String s = (ifLevel > 0 ? " ".substring(0, ifLevel * 2) : ""); strbufLog.append(s).append( - statementAsString(st, iToken, logMessages)); + statementAsString(viewer, st, iToken, logMessages)); viewer.scriptStatus(strbufLog.toString()); } else { String cmd = getCommand(pc, false, false); @@ -2851,7 +2851,7 @@ } } else { sb.append(getErrorLineMessage(context.functionName, context.scriptFileName, - getLinenumber(context), context.pc, statementAsString( + getLinenumber(context), context.pc, statementAsString(viewer, context.statement, -9999, logMessages))); } context = context.parentContext; @@ -2864,7 +2864,7 @@ } } else { sb.append(getErrorLineMessage(functionName, scriptFileName, - getLinenumber(null), pc, statementAsString(st, -9999, + getLinenumber(null), pc, statementAsString(viewer, st, -9999, logMessages))); } @@ -2893,7 +2893,7 @@ sx.message = ""; return; } - String s = ScriptEvaluator.getContextTrace(getScriptContext(), null, true).toString(); + String s = ScriptEvaluator.getContextTrace(viewer, getScriptContext(), null, true).toString(); while (thisContext != null && !thisContext.isTryCatch) popContext(false, false); sx.message += s; @@ -3311,7 +3311,7 @@ return str.toString(); } - static String statementAsString(T[] statement, int iTok, + static String statementAsString(Viewer viewer, T[] statement, int iTok, boolean doLogMessages) { if (statement.length == 0) return ""; @@ -3424,7 +3424,7 @@ continue; case T.spec_chain: sb.append("*:"); - sb.appendC((char) token.intValue); + sb.append(viewer.getChainIDStr(token.intValue)); continue; case T.spec_alternate: sb.append("*%"); @@ -3860,10 +3860,10 @@ } int chainID = (pc + 3 < code.length && code[pc + 2].tok == T.opAND && code[pc + 3].tok == T.spec_chain ? code[pc + 3].intValue - : 9); + : -1); rpn.addXBs(getAtomBits(T.spec_seqcode_range, new int[] { getSeqCode(instruction), getSeqCode(code[++pc]), chainID })); - if (chainID != 9) + if (chainID != -1) pc += 2; break; case T.cell: @@ -4363,8 +4363,8 @@ } private static int getSeqCode(T instruction) { - return (instruction.intValue != Integer.MAX_VALUE ? Group.getSeqcodeFor( - instruction.intValue, ' ') : ((Integer) instruction.value).intValue()); + return (instruction.intValue == Integer.MAX_VALUE ? ((Integer) instruction.value).intValue() + : Group.getSeqcodeFor(instruction.intValue, ' ')); } /* @@ -10235,7 +10235,7 @@ String msg = null; if (slen == 1) { if (!chk) - msg = getContextTrace(getScriptContext(), null, true).toString(); + msg = getContextTrace(viewer, getScriptContext(), null, true).toString(); } else { msg = parameterExpressionString(1, 0); } Modified: trunk/Jmol/src/org/jmol/smiles/SmilesAtom.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesAtom.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/smiles/SmilesAtom.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -709,10 +709,14 @@ return 0; } - public char getChainID() { - return '\0'; + public int getChainID() { + return 0; } + public String getChainIDStr() { + return ""; + } + static String getAtomLabel(int atomicNumber, int isotopeNumber, int valence, int charge, int nH, boolean isAromatic, String stereo) { Modified: trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -121,9 +121,9 @@ end = null; len = 0; if (bioStructureName.length() > 0) { - char id = a.getChainID(); - if (id != '\0') { - s = "//* chain " + id + " " + bioStructureName + " " + a.getResno() + " *// "; + int id = a.getChainID(); + if (id != 0) { + s = "//* chain " + a.getChainIDStr() + " " + bioStructureName + " " + a.getResno() + " *// "; len = s.length(); sb.append(s); } @@ -195,14 +195,14 @@ private void addBracketedBioName(SB sb, JmolNode a, String atomName) { sb.append("["); if (atomName != null) { - char chChain = a.getChainID(); + String chain = a.getChainIDStr(); sb.append(a.getGroup3(false)); if (!atomName.equals(".0")) sb.append(atomName).append("#").appendI(a.getElementNumber()); sb.append("//* ").appendI( a.getResno()); - if (chChain != '\0') - sb.append(":").appendC(chChain); + if (chain.length() > 0) + sb.append(":").append(chain); sb.append(" *//"); } else { sb.append(Elements.elementNameFromNumber(a.getElementNumber())); Modified: trunk/Jmol/src/org/jmol/util/JmolNode.java =================================================================== --- trunk/Jmol/src/org/jmol/util/JmolNode.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/util/JmolNode.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -54,7 +54,8 @@ public String getGroup1(char c0); public String getGroup3(boolean allowNull); public int getResno(); - public char getChainID(); + public int getChainID(); + public String getChainIDStr(); public int getOffsetResidueAtom(String name, int offset); public boolean getCrossLinkLeadAtomIndexes(JmolList<Integer> vReturn); public void getGroupBits(BS bs); Modified: trunk/Jmol/src/org/jmol/viewer/ColorManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ColorManager.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/viewer/ColorManager.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -245,11 +245,12 @@ argb = atom.getProteinStructureSubType().getColor(); break; case StaticConstants.PALETTE_CHAIN: - int chain = atom.getChainID() & 0x1F; + int chain = atom.getChainID(); if (chain < 0) chain = 0; - if (chain >= JC.argbsChainAtom.length) - chain = chain % JC.argbsChainAtom.length; + else if (chain >= 256) + chain -= 256; + chain = chain % JC.argbsChainAtom.length; argb = (atom.isHetero() ? JC.argbsChainHetero : JC.argbsChainAtom)[chain]; break; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2013-06-18 06:26:20 UTC (rev 18344) @@ -9,8 +9,10 @@ # The quotes above look odd for a parameter file, but they are # important for the JavaScript version of Jmol. -___JmolVersion="13.1.17_dev_2013.06.17" +___JmolVersion="13.1.17_dev_2013.06.18" +new feature: upgrade to allow multicharacter chain specs. See 1bgl_1bgm.cif + bug fix: invertSelected on trajectory causes nullPointerException bug fix: POLYHEDRA with faceCenterOffset not saved in state properly; EDGES option nonfunctional Modified: trunk/Jmol/src/org/jmol/viewer/PropertyManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -675,7 +675,8 @@ String names = ""; String sep = ""; Group lastGroup = null; - char chainlast = '\0'; + int iChainLast = 0; + String sChainLast = null; String reslist = ""; String model = ""; int resnolast = Integer.MAX_VALUE; @@ -686,25 +687,26 @@ continue; lastGroup = atom.group; int resno = atom.getResno(); - char chain = atom.getChainID(); + int chain = atom.getChainID(); if (resnolast != resno - 1) { if (reslist.length() != 0 && resnolast != resnofirst) reslist += "-" + resnolast; - chain = '\1'; + chain = -1; resnofirst = resno; } model = "/" + ms.getModelNumberDotted(atom.modelIndex); - if (chainlast != '\0' && chain != chainlast) - reslist += ":" + chainlast + model; - if (chain == '\1') + if (iChainLast != 0 && chain != iChainLast) + reslist += ":" + sChainLast + model; + if (chain == -1) reslist += " " + resno; resnolast = resno; - chainlast = atom.getChainID(); + iChainLast = atom.getChainID(); + sChainLast = atom.getChainIDStr(); names += sep + atom.getGroup3(false); sep = "-"; } reslist += (resnofirst == resnolast ? "" : "-" + resnolast) - + (chainlast == '\0' ? "" : ":" + chainlast) + model; + + (iChainLast == 0 ? "" : ":" + sChainLast) + model; ligand.put("groupNames", names); ligand.put("residueList", reslist.substring(1)); } @@ -1060,7 +1062,7 @@ private String getChimeInfoA(Atom[] atoms, int tok, BS bs) { SB info = new SB(); info.append("\n"); - char id; + int id; String s = ""; Chain clast = null; Group glast = null; @@ -1069,7 +1071,7 @@ if (bs != null) for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { id = atoms[i].getChainID(); - s = (id == '\0' ? " " : "" + id); + s = (id == 0 ? " " : atoms[i].getChainIDStr()); switch (tok) { case T.chain: break; @@ -1190,9 +1192,8 @@ info.put("resno", Integer.valueOf(seqNum)); if (insCode != 0) info.put("insertionCode", "" + insCode); - char chainID = atom.getChainID(); info.put("name", ms.getAtomName(i)); - info.put("chain", (chainID == '\0' ? "" : "" + chainID)); + info.put("chain", atom.getChainIDStr()); info.put("atomID", Integer.valueOf(atom.atomID)); info.put("groupID", Integer.valueOf(atom.getGroupID())); if (atom.alternateLocationID != '\0') @@ -1336,8 +1337,8 @@ private static void getAtomResidueInfo(SB info, Atom atom) { info.append("[").append(atom.getGroup3(false)).append("]").append( atom.getSeqcodeString()).append(":"); - char id = atom.getChainID(); - info.append(id == '\0' ? " " : "" + id); + int id = atom.getChainID(); + info.append(id == 0 ? " " : atom.getChainIDStr()); } } Modified: trunk/Jmol/src/org/jmol/viewer/StateCreator.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StateCreator.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/viewer/StateCreator.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -585,8 +585,7 @@ return commands.toString(); } - private String getVariableState(StateManager.GlobalSettings global, - SB sfunc) { + private String getVariableState(StateManager.GlobalSettings global, SB sfunc) { String[] list = new String[global.htBooleanParameterFlags.size() + global.htNonbooleanParameterValues.size()]; SB commands = new SB(); @@ -650,9 +649,9 @@ // label defaults - viewer.loadShape(JC.SHAPE_LABELS); - commands - .append(getDefaultLabelState((Labels) viewer.shapeManager.shapes[JC.SHAPE_LABELS])); + if (viewer.shapeManager.getShape(JC.SHAPE_LABELS) != null) + commands + .append(getDefaultLabelState((Labels) viewer.shapeManager.shapes[JC.SHAPE_LABELS])); // structure defaults Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2013-06-17 22:35:26 UTC (rev 18343) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2013-06-18 06:26:20 UTC (rev 18344) @@ -2786,6 +2786,8 @@ } stateManager.clear(global); tempArray.clear(); + chainMap.clear(); + chainList.clear(); colorManager.clear(); definedAtomSets.clear(); dataManager.clear(); @@ -5662,7 +5664,7 @@ case T.cartoonrockets: return global.cartoonRockets; case T.chaincasesensitive: - return global.chainCaseSensitive; + return global.chainCaseSensitive || chainList.size() > 0; case T.debugscript: return global.debugScript; case T.defaultstructuredssp: @@ -7648,19 +7650,11 @@ return gdata.getColorArgbOrGray(modelSet.getAtomColix(i)); } - String getAtomChain(int i) { - return modelSet.getAtomChain(i); - } - @Override public int getAtomModelIndex(int i) { return modelSet.atoms[i].modelIndex; } - String getAtomSequenceCode(int i) { - return modelSet.atoms[i].getSeqcodeString(); - } - @Override public float getBondRadius(int i) { return modelSet.getBondRadius(i); @@ -10048,4 +10042,36 @@ return modelSet.getBsBranches(dihedralList); } + /** + * Create a unique integer for any chain string. + * Note that if there are any chains that are more than + * a single character, chainCaseSensitive is automatically set TRUE + * + * + * @param id < 256 is just the character of a single-character + * chain id; >= 256 indicates a list pointer into + * chainList. + * @return i + */ + public int getChainID(String id) { + Integer iboxed = (Integer) chainMap.get(id); + if (iboxed != null) + return iboxed.intValue(); + int i = id.charAt(0); + if (id.length() > 1) { + i = 256 + chainList.size(); + chainList.addLast(id); + } + iboxed = Integer.valueOf(i); + chainMap.put(iboxed, id); + chainMap.put(id, iboxed); + return i; + } + + public String getChainIDStr(int id) { + return (String) chainMap.get(Integer.valueOf(id)); + } + + public Map<Object, Object> chainMap = new Hashtable<Object, Object>(); + public JmolList<String> chainList = new JmolList<String>(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ This SF.net email is sponsored by Windows: Build for Windows Store. http://p.sf.net/sfu/windows-dev2dev _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits