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

Reply via email to