JAL-2009 Codes to enable storing inserted residues as features to their base residue...
authortcofoegbu <tcnofoegbu@dundee.ac.uk>
Fri, 19 Feb 2016 15:57:10 +0000 (15:57 +0000)
committertcofoegbu <tcnofoegbu@dundee.ac.uk>
Fri, 19 Feb 2016 15:57:10 +0000 (15:57 +0000)
src/MCview/PDBChain.java
src/jalview/structure/StructureSelectionManager.java
src/jalview/ws/sifts/SiftsClient.java

index a43626f..e4e619c 100755 (executable)
@@ -295,11 +295,15 @@ public class PDBChain
     Vector<Annotation> resAnnotation = new Vector<Annotation>();
     int i, iSize = atoms.size() - 1;
     int resNumber = -1;
+    char insCode = ' ';
     for (i = 0; i <= iSize; i++)
     {
       Atom tmp = atoms.elementAt(i);
       resNumber = tmp.resNumber;
+      insCode = tmp.insCode;
+
       int res = resNumber;
+      char ins = insCode;
 
       if (i == 0)
       {
@@ -309,7 +313,7 @@ public class PDBChain
       Vector<Atom> resAtoms = new Vector<Atom>();
       // Add atoms to a vector while the residue number
       // remains the same as the first atom's resNumber (res)
-      while ((resNumber == res) && (i < atoms.size()))
+      while ((resNumber == res) && (ins == insCode) && (i < atoms.size()))
       {
         resAtoms.add(atoms.elementAt(i));
         i++;
@@ -317,6 +321,7 @@ public class PDBChain
         if (i < atoms.size())
         {
           resNumber = atoms.elementAt(i).resNumber;
+          insCode = atoms.elementAt(i).insCode;
         }
         else
         {
@@ -327,13 +332,28 @@ public class PDBChain
       // We need this to keep in step with the outer for i = loop
       i--;
 
+      // Add inserted residues as features to the base residue
+      Atom currAtom = resAtoms.get(0);
+      if (currAtom.insCode != ' '
+              && residues.lastElement().atoms.get(0).resNumber == currAtom.resNumber)
+      {
+        SequenceFeature sf = new SequenceFeature("INSERTION",
+                currAtom.resName + ":" + currAtom.resNumIns + " " + pdbid
+                        + id, "", offset + count - 1, offset + count - 1,
+                "PDB_INS");
+        resFeatures.addElement(sf);
+        residues.lastElement().atoms.addAll(resAtoms);
+      }
+      else
+      {
+
       // Make a new Residue object with the new atoms vector
       residues.addElement(new Residue(resAtoms, resNumber - 1, count));
 
       Residue tmpres = residues.lastElement();
       Atom tmpat = tmpres.atoms.get(0);
       // Make A new SequenceFeature for the current residue numbering
-      SequenceFeature sf = new SequenceFeature("RESNUM", tmpat.resName
+        SequenceFeature sf = new SequenceFeature("RES NUM", tmpat.resName
               + ":" + tmpat.resNumIns + " " + pdbid + id, "", offset
               + count, offset + count, pdbid);
       // MCview.PDBChain.PDBFILEFEATURE);
@@ -371,7 +391,8 @@ public class PDBChain
         }
         seq.append(ResidueProperties.aa[((Integer) symbol).intValue()]);
       }
-      count++;
+        count++;
+      }
     }
 
     if (id.length() < 1)
index 6bc8f84..9d06aef 100644 (file)
@@ -607,17 +607,18 @@ public class StructureSelectionManager
     HashMap<Integer, int[]> mapping = new HashMap<Integer, int[]>();
     int resNum = -10000;
     int index = 0;
+    char insCode = ' ';
 
     do
     {
       Atom tmp = maxChain.atoms.elementAt(index);
-      if (resNum != tmp.resNumber && tmp.alignmentMapping != -1)
+      if ((resNum != tmp.resNumber || insCode != tmp.insCode)
+              && tmp.alignmentMapping != -1)
       {
         resNum = tmp.resNumber;
+        insCode = tmp.insCode;
         if (tmp.alignmentMapping >= -1)
         {
-          // TODO (JAL-1836) address root cause: negative residue no in PDB
-          // file
           mapping.put(tmp.alignmentMapping + 1, new int[] { tmp.resNumber,
               tmp.atomIndex });
         }
index 6e7b988..f25c1cf 100644 (file)
@@ -543,6 +543,7 @@ public class SiftsClient implements SiftsClientI
             resNum = (pdbRefDb == null) ? Integer.valueOf(residue
                     .getDbResNum()) : Integer.valueOf(pdbRefDb
                     .getDbResNum().split("[a-zA-Z]")[0]);
+            continue;
           }
 
           if (isResidueObserved(residue)